12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- 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)
|