Browse Source

sound.wav_speichern() angepasst

  Holt die Audio-Daten jetzt aus der callback-Funktion
  Bisher nur Monosound (nutzt Daten des linken Ohrs)
  CDafer waren kleine Aenderungen an der callback-Funktion noetig
master
Heiko Ommert 3 years ago
parent
commit
2650b77806
1 changed files with 20 additions and 12 deletions
  1. 20
    12
      TinnitusAnalyse/SoundGenerator.py

+ 20
- 12
TinnitusAnalyse/SoundGenerator.py View File

@@ -80,21 +80,27 @@ class Sound:
self.start_idx = 0 # wird für sound_obj benötigt

def wav_speichern(self): # ezeugt/aktuallisiert die .wav-Datei
wav_file = wave.open(self.name, "w")
# MOMENTAN NUR MONO
print("Sound wird als .wav-Datei gespeichert. Bitte warten...\nDer Vorgang kann ca. 30 Sekunden dauern")
# zuerst muss ein Array mit Audiodaten gefüllt werden

audio = self.outdata
wav_obj = wave.open("MeinTinnitus.wav", "w")

# erst werden die Rahmen-Parameter gesetzt
self.nframes = len(audio) # Anpassen des nframes-Parameters
wav_file.setparams((self.nchannels, self.sampwidth, self.framerate, self.nframes, self.comptype, self.compname))
# Die Callback-Funktion aufrufen, um die Audiodaten zu bekommen
frames = 44100 # entspricht 1 Sekunde
status = "" # für den Funktionsaufruf benötigt, sonst keine Funktion
audio = np.ones((frames, 2))
audio = self.callback(audio, frames, self.sound_obj.time, status)

# dann wird das audio-Array an die Datei übertragen
for sample in audio:
wav_file.writeframes(struct.pack('h', int(sample * 32767.0)))
# Rahmenparameter für die .wav-Datei setzen
wav_obj.setnchannels(1) # mono
wav_obj.setsampwidth(self.sampwidth)
wav_obj.setframerate(self.framerate)

wav_file.close()
for sample in audio[:, 0]: # geht gerade nur die Werte des linken Ohrs (0) durch
#Die Audiodaten müssen von float in einen passenden int-Wert umgerechnet werden
wav_obj.writeframes(struct.pack('h', int(sample * 32767.0))) #beschreibt die Datei mit diesen Werten

wav_obj.close()
print("Speichern beendet.")

"""Die Objekt-Funktion 'start()' startet die asynchrone Soundwiedergabe. Sie ruft dabei immer wieder die Funktion
@@ -117,7 +123,7 @@ class Sound:


# Whitenoise erzeugen
for x in range(frames):
for x in range(len(outdata)):
rand = (np.random.rand() - 0.5) # Zufallszahl zwischen -0.5 und 0.5
# links:
outdata[x][0] = rand * self.tinnitus.linksRauschenLautstaerke
@@ -147,7 +153,7 @@ class Sound:


# Sinus ins Array schreiben: f(t) = A * sin(2 * pi * f * t)
for x in range(frames):
for x in range(len(outdata)):
# links:
outdata[x][0] += self.tinnitus.linksLautstaerke * np.sin(2 * np.pi * self.tinnitus.linksFrequenz *
((x + self.start_idx) / self.framerate))
@@ -156,3 +162,5 @@ class Sound:
((x + self.start_idx) / self.framerate))

self.start_idx += frames

return outdata

Loading…
Cancel
Save