diff --git a/TinnitusAnalyse/SoundGenerator.py b/TinnitusAnalyse/SoundGenerator.py index ec3ad52..0a50aa8 100644 --- a/TinnitusAnalyse/SoundGenerator.py +++ b/TinnitusAnalyse/SoundGenerator.py @@ -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") diff --git a/TinnitusAnalyse/TinnitusAnalyse_GUI.py b/TinnitusAnalyse/TinnitusAnalyse_GUI.py index 39904fa..5286d1a 100644 --- a/TinnitusAnalyse/TinnitusAnalyse_GUI.py +++ b/TinnitusAnalyse/TinnitusAnalyse_GUI.py @@ -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: