Erste Versuche mit Frequenzen und .wav Dateien in Python zu arbeiten
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
This commit is contained in:
parent
38b91490a3
commit
58f1927f45
79
TinnitusAnalyse/SoundGenerator.py
Normal file
79
TinnitusAnalyse/SoundGenerator.py
Normal file
@ -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)
|
Loading…
x
Reference in New Issue
Block a user