2020-06-03 20:41:08 +02:00
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
2020-06-05 20:20:32 +02:00
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
2020-06-03 20:41:08 +02:00
class Sound :
2020-06-05 20:20:32 +02:00
def __init__ ( self , tinnitus = Tinnitus ( ) , name = " sound.wav " , audio = [ ] , nchannels = 1 , sampwidth = 2 , framerate = 44100 , comptype = " NONE " , compname = " not compressed " ) :
self . tinnitus = tinnitus
2020-06-03 20:41:08 +02:00
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, ...)
2020-06-05 20:20:32 +02:00
freq = self . tinnitus . freq
2020-06-03 20:41:08 +02:00
duration_milliseconds = 1000.0
2020-06-05 20:20:32 +02:00
volume = self . tinnitus . amp
2020-06-03 20:41:08 +02:00
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 )
2020-06-05 20:20:32 +02:00
tinnitus1 = Tinnitus ( freq = 600 )
sound = Sound ( tinnitus = tinnitus1 )
2020-06-03 20:41:08 +02:00
print ( " Objekt initialisiert " )
2020-06-05 20:20:32 +02:00
sound . renew ( )
2020-06-03 20:41:08 +02:00
print ( " Datei aktuallisiert " )
2020-06-05 20:20:32 +02:00
sound . play ( )
2020-06-03 20:41:08 +02:00
print ( " Sound gestartet " )
time . sleep ( 3 )