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
This commit is contained in:
parent
5278521046
commit
14394db487
@ -6,7 +6,7 @@ import sys # für Fehlermeldungen
|
|||||||
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
|
||||||
@ -81,6 +81,7 @@ class Sound:
|
|||||||
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
|
||||||
@ -89,7 +90,7 @@ class Sound:
|
|||||||
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)
|
||||||
@ -98,11 +99,16 @@ class Sound:
|
|||||||
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):
|
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
|
# 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
|
packedMusic.append(struct.pack('h', int(audio[x][0] * 32767.0)))
|
||||||
wav_obj.writeframes(struct.pack('h', int(audio[x][1] * 32767.0))) # wav abwechselnd eingetragen
|
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.")
|
||||||
@ -266,7 +272,7 @@ class Sound:
|
|||||||
|
|
||||||
# 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)))
|
||||||
@ -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(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
|
fortschritt = tinnitus_data/nframes*100
|
||||||
print(" ", round(fortschritt, 1), "%")
|
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")
|
||||||
|
@ -4,7 +4,7 @@ from tkinter import *
|
|||||||
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-------------"""
|
||||||
@ -126,7 +126,7 @@ def unten_button_speichern_press():
|
|||||||
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)
|
||||||
@ -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
|
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)
|
||||||
|
|
||||||
@ -193,14 +194,22 @@ def unten_button_musikdatei_laden_press():
|
|||||||
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")
|
feedback("Starte Filtervorgang (dies kann etwas dauern)...", "blue")
|
||||||
sound.musik_filtern()
|
# 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…
x
Reference in New Issue
Block a user