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
This commit is contained in:
Heiko Ommert 2020-06-24 20:01:23 +02:00
parent 2f3d0366d1
commit 2650b77806

View File

@ -80,21 +80,27 @@ class Sound:
self.start_idx = 0 # wird für sound_obj benötigt self.start_idx = 0 # wird für sound_obj benötigt
def wav_speichern(self): # ezeugt/aktuallisiert die .wav-Datei 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") 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 # Die Callback-Funktion aufrufen, um die Audiodaten zu bekommen
self.nframes = len(audio) # Anpassen des nframes-Parameters frames = 44100 # entspricht 1 Sekunde
wav_file.setparams((self.nchannels, self.sampwidth, self.framerate, self.nframes, self.comptype, self.compname)) 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 # Rahmenparameter für die .wav-Datei setzen
for sample in audio: wav_obj.setnchannels(1) # mono
wav_file.writeframes(struct.pack('h', int(sample * 32767.0))) 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.") print("Speichern beendet.")
"""Die Objekt-Funktion 'start()' startet die asynchrone Soundwiedergabe. Sie ruft dabei immer wieder die Funktion """Die Objekt-Funktion 'start()' startet die asynchrone Soundwiedergabe. Sie ruft dabei immer wieder die Funktion
@ -117,7 +123,7 @@ class Sound:
# Whitenoise erzeugen # 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 rand = (np.random.rand() - 0.5) # Zufallszahl zwischen -0.5 und 0.5
# links: # links:
outdata[x][0] = rand * self.tinnitus.linksRauschenLautstaerke 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) # Sinus ins Array schreiben: f(t) = A * sin(2 * pi * f * t)
for x in range(frames): for x in range(len(outdata)):
# links: # links:
outdata[x][0] += self.tinnitus.linksLautstaerke * np.sin(2 * np.pi * self.tinnitus.linksFrequenz * outdata[x][0] += self.tinnitus.linksLautstaerke * np.sin(2 * np.pi * self.tinnitus.linksFrequenz *
((x + self.start_idx) / self.framerate)) ((x + self.start_idx) / self.framerate))
@ -156,3 +162,5 @@ class Sound:
((x + self.start_idx) / self.framerate)) ((x + self.start_idx) / self.framerate))
self.start_idx += frames self.start_idx += frames
return outdata