From 2650b77806ad9d374d54d97e5838e23464210e92 Mon Sep 17 00:00:00 2001 From: ommerthe69431 Date: Wed, 24 Jun 2020 20:01:23 +0200 Subject: [PATCH] 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 --- TinnitusAnalyse/SoundGenerator.py | 32 +++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/TinnitusAnalyse/SoundGenerator.py b/TinnitusAnalyse/SoundGenerator.py index 0f12f96..3b5c5c9 100644 --- a/TinnitusAnalyse/SoundGenerator.py +++ b/TinnitusAnalyse/SoundGenerator.py @@ -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