seyffejn 3 years ago
parent
commit
e72a61c0c2
2 changed files with 23 additions and 25 deletions
  1. 8
    8
      TinnitusAnalyse/SoundGenerator.py
  2. 15
    17
      TinnitusAnalyse/TinnitusAnalyse_GUI.py

+ 8
- 8
TinnitusAnalyse/SoundGenerator.py View File

@@ -4,6 +4,7 @@ import struct
import sounddevice as sd
import numpy as np
import sys # für Fehlermeldungen
import time as tm

"""---------------------------------------------------------------------------------------------------------------------
In .wav-Dateien wird der Ton in absoluten Werte eingetragen. Die Standart-framerate ist 44100
@@ -101,7 +102,7 @@ class Sound:
sound.callback() auf. Daher können die dort genutzten Variablen dynamisch geändert werden. """

def play(self):
if not self.mute: # NEVER play sound when patient mutes GUI
if not self.mute: # Nie abspielen, wenn die GUI auf stumm geschaltet ist
self.sound_obj.start()

def stop(self):
@@ -117,19 +118,18 @@ class Sound:
# Sinus ins Array schreiben: f(t) = A * sin(2 * pi * f * t)
for x in range(frames):
# links:
outdata[x][0] = self.tinnitus.linksLautstaerke * np.sin(2 * np.pi * self.tinnitus.linksFrequenz *
((x + self.start_idx) / self.framerate))
outdata[x][0] = self.tinnitus.linksLautstaerke * np.sin(2 * np.pi * self.tinnitus.linksFrequenz *
((x + self.start_idx) / self.framerate))
# rechts:
outdata[x][1] = self.tinnitus.rechtsLautstaerke * np.sin(2 * np.pi * self.tinnitus.rechtsFrequenz *
((x + self.start_idx) / self.framerate))

outdata[x][1] = self.tinnitus.rechtsLautstaerke * np.sin(2 * np.pi * self.tinnitus.rechtsFrequenz *
((x + self.start_idx) / self.framerate))
# Rauschen addieren
for x in range(frames):
rand = (np.random.rand() - 0.5) # Zufallszahl zwischen -0.5 und 0.5
#links:
# links:
if self.tinnitus.linksRauschenLautstaerke:
outdata[x][0] += rand * self.tinnitus.linksRauschenLautstaerke
#rechts:
# rechts:
if self.tinnitus.rechtsRauschenLautstaerke:
outdata[x][1] += rand * self.tinnitus.rechtsRauschenLautstaerke


+ 15
- 17
TinnitusAnalyse/TinnitusAnalyse_GUI.py View File

@@ -78,13 +78,16 @@ def unten_button_ohren_synchro():
auswahl = untenComboOhrenSynchro.get() # holt die momentane Auswahl aus combobox
print("Einstellungen von:" + auswahl + " das auf das jeweils andere Ohr setzen")

if auswahl == "":
feedback("Bitte wähle ein Ohr", "white", "red")

if auswahl == "Linkes Ohr": # linkes --> rechts
rechtsScaleLautstärke.set(linksScaleLautstärke.get())
rechtsScaleFrequenz.set(linksScaleFrequenz.get())
rechtsScaleRauschenLautstärke.set(linksScaleRauschenLautstärke.get())
rechtsScaleRauschenMittelFrequenz.set(linksScaleRauschenMittelFrequenz.get())
rechtsScaleRauschenBandbreite.set(linksScaleRauschenBandbreite.get())
feedback("Einstellungen vom linken Ohr auf beide Ohren übertragen", "white", "blue")
feedback("Einstellungen vom linken Ohr auf beide Ohren übertragen")

if auswahl == "Rechtes Ohr": # rechts --> links
linksScaleLautstärke.set(rechtsScaleLautstärke.get())
@@ -92,49 +95,43 @@ def unten_button_ohren_synchro():
linksScaleRauschenLautstärke.set(rechtsScaleRauschenLautstärke.get())
linksScaleRauschenMittelFrequenz.set(rechtsScaleRauschenMittelFrequenz.get())
linksScaleRauschenBandbreite.set(rechtsScaleRauschenBandbreite.get())
feedback("Einstellungen vom rechten Ohr auf beide Ohren übertragen", "white", "blue")
feedback("Einstellungen vom rechten Ohr auf beide Ohren übertragen")


def unten_button_speichern_press():
print("button speichern pressed")
# Wenn man Speichern will bevor ein Name eingegeben wurde kann man nicht speichern
if (not untenEntryVorname.get()) or (not untenEntryNachname.get()) or \
(untenEntryNachname == "Erst Namen..") or (untenEntryVorname == "..eintragen bitte"):
nachname.set("Erst Namen..")
vorname.set("..eintragen bitte")
if (not untenEntryVorname.get()) or (not untenEntryNachname.get()):
print("fehlgeschlagener Speicherversuch - Keine Eingaben gemacht")
feedback("Fehlgeschlagener Speicherversuch! Mögliche Gründe: Erst Namen links eintragen.", "yellow", "red")
feedback("Falls es danach immer noch nicht geht, bitte Microsoft Excel schließen.", "yellow", "red")
feedback("Fehlgeschlagener Speicherversuch! Erst Namen links eintragen.", "white", "red")
else:
try:
feedback("Speichere Sound als .wav Datei . Kann bis zu 30 Sekunden dauern. Bitte warten...", "white", "blue")
# todo: warum auch immer, aber irgendwie wird feedback nach wav_speichern ausgeführt
feedback("Speichere Sound als '.wav'-Datei. Das kann bis zu 30 Sekunden dauern. Bitte warten...")
tinnitus.vorname = untenEntryVorname.get()
tinnitus.nachname = untenEntryNachname.get()
tinnitus.kommentar = untenTextKommentar.get("1.0", END)
tinnitus.speichern()
sound.wav_speichern()
feedback("Daten erfolgreich gespeichert. Siehe: 'MeinTinnitus.wav' ", "white", "blue")
feedback("Daten erfolgreich gespeichert. Siehe: 'MeinTinnitus.wav' ")
except:
feedback("Fehlgeschlagener Speicherversuch! Mögliche Gründe: Erst Namen links eintragen.", "yellow", "red")
feedback("Falls es danach immer noch nicht geht, bitte Microsoft Excel schließen.", "yellow", "red")
feedback("Fehlgeschlagener Speicherversuch! Bitte schließe Microsoft Excel.", "white", "red")


def unten_button_play_press():
print("button play pressed")
feedback("Starte Audioausgabe...", "white", "green")
feedback("Starte Audioausgabe...", fontcolor="green")
sound.mute = False # when this boolean is set to false no audio can ever play (it`s like a savety switch)
sound.play()


def unten_button_stop_press():
print("button stop press")
feedback("Stoppe Audioausgabe", "white", "red") # place text in feedback field, fontcololor, backgroundcolor
feedback("Stoppe Audioausgabe", fontcolor="red") # place text in feedback field, fontcololor, backgroundcolor
sound.mute = True
sound.stop()


def feedback(text, fontcolor, backgroundcolor):
def feedback(text, fontcolor = "black", backgroundcolor = "lightsteelblue"):
""" This is a helper function. You can give it a string text and it will display it in the feedback frame (bottom
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
@@ -153,6 +150,7 @@ def feedback(text, fontcolor, backgroundcolor):
untenFeedbackText.tag_config("Line"+str(feedback.lineCounter), foreground=fontcolor, background=backgroundcolor)

untenFeedbackText.config(state=DISABLED) # set the text field back to readonly
root.update() #Damit der Text sofort ausgegeben wird, auch wenn das Programm erst noch was anderes macht


""" Initialisierungen """
@@ -330,7 +328,7 @@ untererRechterFrame.grid(row=1, column=1, sticky=(N+S+E+W))


# ------------ PROGRAMM OUTPUT ------------
untenFeedbackText = Text(untererRechterFrame, height=13, width=85, bg="lightblue") # write feedback to patient here
untenFeedbackText = Text(untererRechterFrame, height=13, width=85, bg="lightsteelblue") # write feedback to patient here
#untenFeedbackText.config(state=DISABLED) # make the text widget readonly
untenFeedbackText.place(relx=.5, rely=.5, anchor="center") # the only time I used .place instead of grid, because it
# lets me place the widget in the middle of the frame

Loading…
Cancel
Save