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 4 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

from scipy import signal from scipy import signal
import csv import csv
import time 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 In .wav-Dateien wird der Ton in absoluten Werte eingetragen. Die Standart-framerate ist 44100
self.start_idx = 0 # wird für sound_obj benötigt self.start_idx = 0 # wird für sound_obj benötigt
self.music_samplerate = 0 # die samplerate der ausgewählten Musikdatei self.music_samplerate = 0 # die samplerate der ausgewählten Musikdatei
self.music_data = 0 # das Numpy Array 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 def wav_speichern(self): # ezeugt/aktuallisiert die .wav-Datei
wav_obj = wave.open(self.wav_name, "w") wav_obj = wave.open(self.wav_name, "w")


# Die Callback-Funktion aufrufen, um die Audiodaten zu bekommen # 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 status = "" # für den Funktionsaufruf benötigt, sonst keine Funktion
audio = np.ones((frames, 2)) audio = np.ones((frames, 2))
audio = self.callback(audio, frames, self.sound_obj.time, status) audio = self.callback(audio, frames, self.sound_obj.time, status)
self.nframes = len(audio) self.nframes = len(audio)
wav_obj.setparams((self.nchannels, self.sampwidth, self.framerate, self.nframes, self.comptype, self.compname)) 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 #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() wav_obj.close()
print("Speichern beendet.") print("Speichern beendet.")


# Die Audiosamples schreiben # Die Audiosamples schreiben
print("Musikdatei wird erstellt...") 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 # 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_links[tinnitus_data] * 32767.0)))
packedMusic.append(struct.pack('h', int(music_rechts[tinnitus_data] * 32767.0))) packedMusic.append(struct.pack('h', int(music_rechts[tinnitus_data] * 32767.0)))
# 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(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 # wav_obj.writeframes(struct.pack('h', int(musicRechts[x] * 32767.0))) # wav abwechselnd eingetragen
if tinnitus_data % 10000 == 0: 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() end_time = time.time()
print("Zeitaufwand für das packen der einzelnen Samples =", end_time - start_time, "s") print("Zeitaufwand für das packen der einzelnen Samples =", end_time - start_time, "s")

+ 14
- 5
TinnitusAnalyse/TinnitusAnalyse_GUI.py View File

from SoundGenerator import * from SoundGenerator import *
import sounddevice as sd import sounddevice as sd
from scipy.io import wavfile from scipy.io import wavfile
import threading


"""--------------------------FUNKTIONEN DIE DURCH GUI KLICKS AUSGEFÜHRT WERDEN---------------------------------------""" """--------------------------FUNKTIONEN DIE DURCH GUI KLICKS AUSGEFÜHRT WERDEN---------------------------------------"""
"""-------Funktionen links-------------""" """-------Funktionen links-------------"""
else: else:
try: try:
unten_button_stop_press() # Wiedergabe beenden, durch den Rechenaufwand gibt es sonst Wiedergabeprobleme 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.vorname = untenEntryVorname.get()
tinnitus.nachname = untenEntryNachname.get() tinnitus.nachname = untenEntryNachname.get()
tinnitus.kommentar = untenTextKommentar.get("1.0", END) tinnitus.kommentar = untenTextKommentar.get("1.0", END)
right of the GUI) in the text widget. The parameter color is also a string and defines the font color. Same with 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 background. Honestly this function is way too complicated, but Tkinter has no nicer/easier builtin way of doing the
coloring nicely """ coloring nicely """

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


untenTextMusikDatei.insert(INSERT, untererFrame.musikdatei) # insert selected file path to text widget untenTextMusikDatei.insert(INSERT, untererFrame.musikdatei) # insert selected file path to text widget
untenTextMusikDatei.config(state=DISABLED) # activate text field (otherwise it is readonly) 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(): def unten_button_filtere_tinnitus_aus_musik():
print("button filtere tinnitus aus musik pressed") print("button filtere tinnitus aus musik pressed")
try: 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" feedback("Filtervorgang erfolgreich abgeschlossen. \n"
"Audiodatei unter dem Namen MyTinnitusFreeSong.wav erstellt", "white", "green") "Audiodatei unter dem Namen MyTinnitusFreeSong.wav erstellt", "white", "green")
except: except:

Loading…
Cancel
Save