import math import wave 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 #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 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"): self.tinnitus = tinnitus self.name = name self.audio = audio #ein Array, in das die Sound-Werte geschrieben werden self.nchannels = nchannels #Zahl der audio channels (1:mono 2:stereo) self.sampwidth = sampwidth #Größe eines einzelnen Sound-Werts (in bytes) self.framerate = framerate #Abtastrate self.nframes = len(audio) #Anzahl der Sound-Werte -> Muss bei jeder audio-Änderung aktuallisiert werden self.comptype = comptype 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 num_samples = duration_milliseconds * (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 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 """ --------------- 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 return def renew(self): #ezeugt/aktuallisiert die .wav-Datei self.new_audio() print("audio aktuallisiert") wav_file = wave.open(self.name, "w") #erst werden die Rahmen-Parameter gesetzt 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))) wav_file.close() 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) tinnitus1 = Tinnitus(freq=600) sound = Sound(tinnitus = tinnitus1) print("Objekt initialisiert") sound.renew() print("Datei aktuallisiert") sound.play() print("Sound gestartet") time.sleep(3)