Browse Source

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
master
seyffejn 3 years ago
parent
commit
58f1927f45
1 changed files with 79 additions and 0 deletions
  1. 79
    0
      TinnitusAnalyse/SoundGenerator.py

+ 79
- 0
TinnitusAnalyse/SoundGenerator.py View 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…
Cancel
Save