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:
seyffejn 2020-06-03 20:41:08 +02:00
parent 38b91490a3
commit 58f1927f45

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)