|
|
@@ -1,11 +1,9 @@ |
|
|
|
import math |
|
|
|
import wave # bearbeiten von .wav-Dateien |
|
|
|
import struct |
|
|
|
import sounddevice as sd |
|
|
|
import numpy as np |
|
|
|
import sys # für Fehlermeldungen |
|
|
|
from scipy import signal |
|
|
|
import time as tm |
|
|
|
|
|
|
|
"""--------------------------------------------------------------------------------------------------------------------- |
|
|
|
In .wav-Dateien wird der Ton in absoluten Werte eingetragen. Die Standart-framerate ist 44100 |
|
|
@@ -23,13 +21,12 @@ class Tinnitus: # beinhaltet alle Werte, die vom Nutzer eingestellt werden |
|
|
|
self.rechtsFrequenz = r_freq |
|
|
|
self.linksLautstaerke = l_amp |
|
|
|
self.rechtsLautstaerke = r_amp |
|
|
|
self.linksRauschenLautstaerke = l_rausch # float von 0-1 (0 ist aus) |
|
|
|
self.linksRauschenLautstaerke = l_rausch |
|
|
|
self.rechtsRauschenLautstaerke = r_rausch |
|
|
|
self.linksRauschenUntereGrenzfrequenz = l_rausch_ug |
|
|
|
self.rechtsRauschenUntereGrenzfrequenz = r_rausch_ug |
|
|
|
self.linksRauschenObereGrenzfrequenz = l_rausch_og |
|
|
|
self.rechtsRauschenObereGrenzfrequenz = r_rausch_og |
|
|
|
self.ohr = ohr # 0:both 1:left 2:right 3:links/rechts unterschiedlich |
|
|
|
|
|
|
|
def speichern(self): # speichert die Nutzerdaten in eine .csv-Datei |
|
|
|
datei = open("TinnitusDaten.csv", "w") |
|
|
@@ -57,17 +54,17 @@ class Tinnitus: # beinhaltet alle Werte, die vom Nutzer eingestellt werden |
|
|
|
"""---------------------------------KLASSE: SOUND----------------------------------------------------------------------- |
|
|
|
Sound beinhaltet alle Variablen, die zum erstellen einer .wav-Datei benötigt werden (siehe soun.wav_speichern()) |
|
|
|
Das 'sound_obj' ist für das dynamische abspielen zuständig (siehe sound.play()) |
|
|
|
Beim Initialisieren muss eine Tinnitus-Objekt übergeben werden |
|
|
|
Beim Initialisieren muss ein Tinnitus-Objekt übergeben werden |
|
|
|
---------------------------------------------------------------------------------------------------------------------""" |
|
|
|
|
|
|
|
|
|
|
|
class Sound: |
|
|
|
def __init__(self, tinnitus, name="MeinTinnitus.wav", audio=None, nchannels=1, sampwidth=2, framerate=44100, |
|
|
|
def __init__(self, tinnitus, wav_name="MeinTinnitus.wav", audio=None, nchannels=2, sampwidth=2, framerate=44100, |
|
|
|
comptype="NONE", compname="not compressed", mute=True): |
|
|
|
if audio is None: |
|
|
|
audio = [] |
|
|
|
self.tinnitus = tinnitus |
|
|
|
self.name = name |
|
|
|
self.wav_name = wav_name #Der Dateiname |
|
|
|
self.audio = audio # ein Array, in das die Sound-Werte geschrieben werden (von -1, bis +1) |
|
|
|
self.nchannels = nchannels # Zahl der audio channels (1:mono 2:stereo) |
|
|
|
self.sampwidth = sampwidth # Größe eines einzelnen Sound-Werts (in bytes) |
|
|
@@ -81,20 +78,19 @@ class Sound: |
|
|
|
self.start_idx = 0 # wird für sound_obj benötigt |
|
|
|
|
|
|
|
def wav_speichern(self): # ezeugt/aktuallisiert die .wav-Datei |
|
|
|
print("Sound wird als .wav-Datei gespeichert. Bitte warten...\nDer Vorgang kann ca. 30 Sekunden dauern") |
|
|
|
print("Sound wird als .wav-Datei gespeichert. Bitte warten...\nDer Vorgang kann ca. 10 Sekunden dauern") |
|
|
|
|
|
|
|
wav_obj = wave.open("MeinTinnitus.wav", "w") |
|
|
|
wav_obj = wave.open(self.wav_name, "w") |
|
|
|
|
|
|
|
# Die Callback-Funktion aufrufen, um die Audiodaten zu bekommen |
|
|
|
frames = 44100 * 3 # entspricht 1 Sekunde |
|
|
|
frames = self.framerate * 3 # entspricht 3 Sekunden |
|
|
|
status = "" # für den Funktionsaufruf benötigt, sonst keine Funktion |
|
|
|
audio = np.ones((frames, 2)) |
|
|
|
audio = self.callback(audio, frames, self.sound_obj.time, status) |
|
|
|
|
|
|
|
# Rahmenparameter für die .wav-Datei setzen |
|
|
|
wav_obj.setnchannels(2) # mono |
|
|
|
wav_obj.setsampwidth(self.sampwidth) |
|
|
|
wav_obj.setframerate(self.framerate) |
|
|
|
self.nframes = len(audio) |
|
|
|
wav_obj.setparams((self.nchannels, self.sampwidth, self.framerate, self.nframes, self.comptype, self.compname)) |
|
|
|
|
|
|
|
#Die Audiosamples schreiben |
|
|
|
for x in range(frames): |
|
|
@@ -154,7 +150,7 @@ class Sound: |
|
|
|
outdata[:, 1] = signal.sosfilt(sos, outdata[:, 1]) |
|
|
|
|
|
|
|
|
|
|
|
# Sinus ins Array schreiben: f(t) = A * sin(2 * pi * f * t) |
|
|
|
# Sinus addieren: f(t) = A * sin(2 * pi * f * t) |
|
|
|
for x in range(len(outdata)): |
|
|
|
# links: |
|
|
|
outdata[x][0] += self.tinnitus.linksLautstaerke * np.sin(2 * np.pi * self.tinnitus.linksFrequenz * |