|
|
@@ -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 |