Browse Source

3 Aenderungen:

-Erstellte Musik hat jetzt dynamische Laenge
-Funktion sound.wav_speichern() funktioniert jetzt mit der schnelleren Technik
-Filterfunktion in einen Thread ausgelagert und einen "Ladebalken" im Feedback eingefuegt
master
Heiko Ommert 3 years ago
parent
commit
14394db487
2 changed files with 30 additions and 14 deletions
  1. 16
    9
      TinnitusAnalyse/SoundGenerator.py
  2. 14
    5
      TinnitusAnalyse/TinnitusAnalyse_GUI.py

+ 16
- 9
TinnitusAnalyse/SoundGenerator.py View File

@@ -6,7 +6,7 @@ import sys # für Fehlermeldungen
from scipy import signal
import csv
import time
import matplotlib.pyplot as plt
#import matplotlib.pyplot as plt

"""---------------------------------------------------------------------------------------------------------------------
In .wav-Dateien wird der Ton in absoluten Werte eingetragen. Die Standart-framerate ist 44100
@@ -81,6 +81,7 @@ class Sound:
self.start_idx = 0 # wird für sound_obj benötigt
self.music_samplerate = 0 # die samplerate der ausgewählten Musikdatei
self.music_data = 0 # das Numpy Array der ausgewählten Musikdatei
self.filterfortschritt = 0 # siehe musik_filtern(), zwischen 0 und 100, wird für die feedback-fkt gebraucht


def wav_speichern(self): # ezeugt/aktuallisiert die .wav-Datei
@@ -89,7 +90,7 @@ class Sound:
wav_obj = wave.open(self.wav_name, "w")

# Die Callback-Funktion aufrufen, um die Audiodaten zu bekommen
frames = self.framerate * 3 # entspricht 3 Sekunden
frames = self.framerate * 10 # entspricht 10 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)
@@ -98,11 +99,16 @@ class Sound:
self.nframes = len(audio)
wav_obj.setparams((self.nchannels, self.sampwidth, self.framerate, self.nframes, self.comptype, self.compname))

packedMusic = [] # Liste an die wir die einzelnen frames bereits in binär umgewandelt aneinanderreihen

#Die Audiosamples schreiben
for x in range(frames):
#Die Audiodaten müssen von float in einen passenden int-Wert umgerechnet werden
wav_obj.writeframes(struct.pack('h', int(audio[x][0] * 32767.0))) # Werte für links und rechts werden bei
wav_obj.writeframes(struct.pack('h', int(audio[x][1] * 32767.0))) # wav abwechselnd eingetragen
for x in range(self.nframes): # geht jeden Sample-Wert der Musikdatei einzeln durch
# Die Audiodaten müssen von float in einen passenden int-Wert umgerechnet werden
packedMusic.append(struct.pack('h', int(audio[x][0] * 32767.0)))
packedMusic.append(struct.pack('h', int(audio[x][0] * 32767.0)))

value_str = b"".join(packedMusic)
wav_obj.writeframes(value_str)

wav_obj.close()
print("Speichern beendet.")
@@ -266,7 +272,7 @@ class Sound:

# Die Audiosamples schreiben
print("Musikdatei wird erstellt...")
for tinnitus_data in range(self.music_samplerate * 60): #Kann mit nframes ersetzt werden, für den ganzen Song
for tinnitus_data in range(nframes): #geht jeden Sample-Wert der Musikdatei einzeln durch
# Die Audiodaten müssen von float in einen passenden int-Wert umgerechnet werden
packedMusic.append(struct.pack('h', int(music_links[tinnitus_data] * 32767.0)))
packedMusic.append(struct.pack('h', int(music_rechts[tinnitus_data] * 32767.0)))
@@ -274,8 +280,9 @@ class Sound:
# wav_obj.writeframes(struct.pack('h', int(music_links[x] * 32767.0))) # Werte für links und rechts werden bei
# wav_obj.writeframes(struct.pack('h', int(musicRechts[x] * 32767.0))) # wav abwechselnd eingetragen
if tinnitus_data % 10000 == 0:
fortschritt = tinnitus_data/(self.music_samplerate*20)*100
print(" ", round(fortschritt, 1), "%")
fortschritt = tinnitus_data/nframes*100
self.filterfortschritt = round(fortschritt, 1)
print(" ", self.filterfortschritt, "%")

end_time = time.time()
print("Zeitaufwand für das packen der einzelnen Samples =", end_time - start_time, "s")

+ 14
- 5
TinnitusAnalyse/TinnitusAnalyse_GUI.py View File

@@ -4,7 +4,7 @@ from tkinter import *
from SoundGenerator import *
import sounddevice as sd
from scipy.io import wavfile
import threading

"""--------------------------FUNKTIONEN DIE DURCH GUI KLICKS AUSGEFÜHRT WERDEN---------------------------------------"""
"""-------Funktionen links-------------"""
@@ -126,7 +126,7 @@ def unten_button_speichern_press():
else:
try:
unten_button_stop_press() # Wiedergabe beenden, durch den Rechenaufwand gibt es sonst Wiedergabeprobleme
feedback("Speichere Sound als '.wav'-Datei. Das kann ca. 10 Sekunden dauern. Bitte warten...")
feedback("Speichere Sound als '.wav'-Datei. Bitte warten...")
tinnitus.vorname = untenEntryVorname.get()
tinnitus.nachname = untenEntryNachname.get()
tinnitus.kommentar = untenTextKommentar.get("1.0", END)
@@ -156,6 +156,7 @@ def feedback(text, fontcolor="black", backgroundcolor="lightsteelblue"):
right of the GUI) in the text widget. The parameter color is also a string and defines the font color. Same with
background. Honestly this function is way too complicated, but Tkinter has no nicer/easier builtin way of doing the
coloring nicely """

feedback.lineCounter += 1 # in order to color the texts nicely we need to count the lines of text we add
untenFeedbackText.config(state=NORMAL) # activate text field (otherwise it is readonly)

@@ -193,14 +194,22 @@ def unten_button_musikdatei_laden_press():
untenTextMusikDatei.insert(INSERT, untererFrame.musikdatei) # insert selected file path to text widget
untenTextMusikDatei.config(state=DISABLED) # activate text field (otherwise it is readonly)

feedback("Musikdatei ausgewählt", fontcolor="black") # place text in feedback field, fontcololor, backgroundcolor
feedback("Musikdatei ausgewählt") # place text in feedback field, fontcololor, backgroundcolor


def unten_button_filtere_tinnitus_aus_musik():
print("button filtere tinnitus aus musik pressed")
try:
feedback("Starte Filtervorgang (dies kann einige Minuten dauern)...", "blue")
sound.musik_filtern()
feedback("Starte Filtervorgang (dies kann etwas dauern)...", "blue")
# Filtern in extra thread, damit sich die GUI nicht aufhängt: (daemon beendet den Thread, wenn das Hauptprogramm beendet wird)
filter_thread = threading.Thread(target=sound.musik_filtern, daemon=True)
filter_thread.start()

while filter_thread.is_alive() == True:
fb = "Status: " + str(sound.filterfortschritt) + "%"
feedback(fb)
time.sleep(0.2)
print("-- filtern beendet --")
feedback("Filtervorgang erfolgreich abgeschlossen. \n"
"Audiodatei unter dem Namen MyTinnitusFreeSong.wav erstellt", "white", "green")
except:

Loading…
Cancel
Save