SounGenerator.py Update.\nWechsel zu sounddevice zum direkten abspielen\nErweiterung der Tinnitus-Variablen\nDynamische Sound, abhängig von den Nutzervariablen
This commit is contained in:
parent
b73ae42745
commit
83c6bed479
@ -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)
|
||||
|
||||
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")
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user