From 58f1927f4537b150c8ea16e7b7d3e25ef559f70e Mon Sep 17 00:00:00 2001 From: seyffejn <55194230+seyffejn@users.noreply.github.com> Date: Wed, 3 Jun 2020 20:41:08 +0200 Subject: [PATCH] Erste Versuche mit Frequenzen und .wav Dateien in Python zu arbeiten MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Erste Version Heikos Script. Keine Beschreibung verfügbar, da ich nicht genau weiß was er alles eingebaut hat. Push von Julian gemacht, da Heikos GitHub noch rumzickt --- TinnitusAnalyse/SoundGenerator.py | 79 +++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 TinnitusAnalyse/SoundGenerator.py diff --git a/TinnitusAnalyse/SoundGenerator.py b/TinnitusAnalyse/SoundGenerator.py new file mode 100644 index 0000000..543ae86 --- /dev/null +++ b/TinnitusAnalyse/SoundGenerator.py @@ -0,0 +1,79 @@ +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 Sound: + def __init__(self, name="sound.wav", audio=[], nchannels=1, sampwidth=2, framerate=44100, comptype="NONE", compname="not compressed"): + 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 = 440.0 + duration_milliseconds = 1000.0 + volume = 1.0 + + 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) + + +class Tinnitus: #beinhaltet alle Werte, die vom Nutzer eingestellt werden und ein Sound-Objekt + def __init__(self, freq=440, amp=1, ear=0, sound=Sound()): + self.freq = freq + self.amp = amp + self.ear = ear # 0:both 1:left 2:right + self.sound = sound #beinhaltet Variablen und Funktionen für die Bearbeitung von .wav-Dateien + return + +tinnitus = Tinnitus() +print("Objekt initialisiert") +tinnitus.sound.renew() +print("Datei aktuallisiert") +tinnitus.sound.play() +print("Sound gestartet") +time.sleep(3) \ No newline at end of file