diff --git a/TinnitusAnalyse/SoundGenerator.py b/TinnitusAnalyse/SoundGenerator.py index eb41ce3..b3ab41d 100644 --- a/TinnitusAnalyse/SoundGenerator.py +++ b/TinnitusAnalyse/SoundGenerator.py @@ -1,23 +1,30 @@ import math -import wave +import wave #bearbeiten von .wav-Dateien import struct -from playsound import playsound -import time #nur für die Letzte Zeile, damit sich das Programm nicht direkt beendet, nachdem der Sound startet +import sounddevice as sd #zum abspielen des audio-arrays +import random as random #für die Rauscherzeugung +import time #nur für die Tests, um Zeit zum Anhören der Sounds einzubauen #In .wav-Dateien wird der Ton in absoluten Werte eingetragen. Die Standart-framerate ist 44100 #das heißt für jede Sekunde an Ton gibt es 44100 Werte, die die Tonwelle über die Zeit beschreiben class Tinnitus: #beinhaltet alle Werte, die vom Nutzer eingestellt werden - def __init__(self, freq=440, amp=1, ear=0): - self.freq = freq - self.amp = amp - self.ear = ear # 0:both 1:left 2:right + def __init__(self, l_freq=600, r_freq=600, l_amp=1, r_amp=1, l_rausch=0, r_rausch=0, ear=0): + self.linksFrequenz = l_freq + self.rechtsFrequenz = r_freq + self.linksLautstaerke = l_amp + self.rechtsLautstaerke = r_amp + self.linksRauschenLautstaerke = l_rausch #float von 0-1 (0 ist aus) + self.rechtsRauschenLautstaerke = r_rausch + self.ear = ear # 0:both 1:left 2:right 3:links/rechts unterschiedlich return #Die Klasse beinhaltet alle Werte, die zum Erstellen einer .wav-Datei benötigt werden und ein Tinnitus-Objekt, das beim Initialisieren übergeben werden muss. #Die Audiodaten werden in das Array "audio" geschrieben class Sound: - def __init__(self, tinnitus=Tinnitus(), name="sound.wav", audio=[], nchannels=1, sampwidth=2, framerate=44100, comptype="NONE", compname="not compressed"): + def __init__(self, tinnitus, name="sound.wav", audio=None, nchannels=1, sampwidth=2, framerate=44100, comptype="NONE", compname="not compressed"): + if audio is None: + audio = [] self.tinnitus = tinnitus self.name = name self.audio = audio #ein Array, in das die Sound-Werte geschrieben werden @@ -29,36 +36,37 @@ class Sound: self.compname = compname return - def new_audio(self): #Schreibt Werte in das audio-Array. Soll später abhängig sein von den Tinnitus-Werten(Frequenz, Rauschen, ...) - freq = self.tinnitus.freq - duration_milliseconds = 1000.0 - volume = self.tinnitus.amp + def neu_audio(self): #Schreibt Werte in das audio-Array. Soll später abhängig sein von den Tinnitus-Werten(Frequenz, Rauschen, ...) + freq = self.tinnitus.linksFrequenz + dauer_ms = 100.0 + amp = self.tinnitus.linksLautstaerke + rauschen = self.tinnitus.linksRauschenLautstaerke - num_samples = duration_milliseconds * (self.framerate / 1000.0) #framerate -pro Sekunde- umgerechnet in -pro Millisekunde- + self.audio.clear() + num_samples = dauer_ms * (self.framerate / 1000.0) # framerate -pro Sekunde- umgerechnet in -pro Millisekunde- - #Die Schleife zählt, bis die passende Anzahl an Werten erreicht ist - #Im Inhalt der Schleife werden die Audio-Werte berechnet + # einen einfachen Sinus ins array schreiben for x in range(int(num_samples)): - self.audio.append(volume * math.sin(2 * math.pi * freq * (x / self.framerate))) #Erzeugt Werte für einen einfachen Sinus + self.audio.append(amp * math.sin(2 * math.pi * freq * (x / self.framerate))) - """ --------------- angefügter Sägezahn -------------------- """ - j = 0 - for x in range(int(num_samples)): - if(j == 80): - j = 0 - j += 1 - self.audio.append(j / 80) - """ --------------- Ende Sägezahn -------------------- """ - - self.nframes = len(self.audio) #Anpassen des nframes-Parameters + #das Rauschen addieren + if(self.tinnitus.linksRauschenLautstaerke != 0): + for x in range(int(num_samples)): + self.audio[x] += random.random() * rauschen return - def renew(self): #ezeugt/aktuallisiert die .wav-Datei - self.new_audio() - print("audio aktuallisiert") + def wav_speichern(self): #ezeugt/aktuallisiert die .wav-Datei + self.neu_audio() + #das 100ms audio-array strecken: + for x in range(50): # entspricht 5 Sekunden + for y in range(int(self.framerate/10)): + self.audio.append(self.audio[y]) + wav_file = wave.open(self.name, "w") #erst werden die Rahmen-Parameter gesetzt + self.nframes = len(self.audio) # Anpassen des nframes-Parameters wav_file.setparams((self.nchannels, self.sampwidth, self.framerate, self.nframes, self.comptype, self.compname)) + #dann wird das audio-Array an die Datei übertragen for sample in self.audio: wav_file.writeframes(struct.pack('h', int(sample * 32767.0))) @@ -67,16 +75,36 @@ class Sound: return def play(self): - # Der zweite Parameter legt fest, wie die Datei abgespielt wird (False:asynchron True:synchron) - #synchron bedeutet das Programm läuft erst nach Ende des Abspielens weiter - playsound('sound.wav', False) + self.neu_audio() + sd.play(self.audio, self.framerate, loop=1) + return -tinnitus1 = Tinnitus(freq=600) -sound = Sound(tinnitus = tinnitus1) -print("Objekt initialisiert") -sound.renew() -print("Datei aktuallisiert") -sound.play() -print("Sound gestartet") -time.sleep(3) \ No newline at end of file + +tinnitus1 = Tinnitus() +sound = Sound(tinnitus1) + +if(0): + print("======abnehmende Lautstärke==========") + for x in range(10): + print(" Lautstärke = ", tinnitus1.linksLautstaerke) + sound.play() + time.sleep(0.6) + tinnitus1.linksLautstaerke -= 0.1 + print("\n\n") + time.sleep(1) + tinnitus1.linksLautstaerke = 1 + + + +if(0): + print("=========RauschTest============") + for x in range(10): + tinnitus1.linksRauschenLautstaerke += 0.01 + print(" Rauschen = ", tinnitus1.linksRauschenLautstaerke) + sound.play() + time.sleep(1) + +sd.stop() +print("ENDE") +