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

import sounddevice as sd import sounddevice as sd
import numpy as np import numpy as np
import sys # für Fehlermeldungen import sys # für Fehlermeldungen
import time as tm


"""--------------------------------------------------------------------------------------------------------------------- """---------------------------------------------------------------------------------------------------------------------
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
sound.callback() auf. Daher können die dort genutzten Variablen dynamisch geändert werden. """ sound.callback() auf. Daher können die dort genutzten Variablen dynamisch geändert werden. """


def play(self): 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() self.sound_obj.start()


def stop(self): def stop(self):
# Sinus ins Array schreiben: f(t) = A * sin(2 * pi * f * t) # Sinus ins Array schreiben: f(t) = A * sin(2 * pi * f * t)
for x in range(frames): for x in range(frames):
# links: # 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: # 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 # Rauschen addieren
for x in range(frames): for x in range(frames):
rand = (np.random.rand() - 0.5) # Zufallszahl zwischen -0.5 und 0.5 rand = (np.random.rand() - 0.5) # Zufallszahl zwischen -0.5 und 0.5
#links:
# links:
if self.tinnitus.linksRauschenLautstaerke: if self.tinnitus.linksRauschenLautstaerke:
outdata[x][0] += rand * self.tinnitus.linksRauschenLautstaerke outdata[x][0] += rand * self.tinnitus.linksRauschenLautstaerke
#rechts:
# rechts:
if self.tinnitus.rechtsRauschenLautstaerke: if self.tinnitus.rechtsRauschenLautstaerke:
outdata[x][1] += rand * self.tinnitus.rechtsRauschenLautstaerke outdata[x][1] += rand * self.tinnitus.rechtsRauschenLautstaerke



+ 15
- 17
TinnitusAnalyse/TinnitusAnalyse_GUI.py View File

auswahl = untenComboOhrenSynchro.get() # holt die momentane Auswahl aus combobox auswahl = untenComboOhrenSynchro.get() # holt die momentane Auswahl aus combobox
print("Einstellungen von:" + auswahl + " das auf das jeweils andere Ohr setzen") 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 if auswahl == "Linkes Ohr": # linkes --> rechts
rechtsScaleLautstärke.set(linksScaleLautstärke.get()) rechtsScaleLautstärke.set(linksScaleLautstärke.get())
rechtsScaleFrequenz.set(linksScaleFrequenz.get()) rechtsScaleFrequenz.set(linksScaleFrequenz.get())
rechtsScaleRauschenLautstärke.set(linksScaleRauschenLautstärke.get()) rechtsScaleRauschenLautstärke.set(linksScaleRauschenLautstärke.get())
rechtsScaleRauschenMittelFrequenz.set(linksScaleRauschenMittelFrequenz.get()) rechtsScaleRauschenMittelFrequenz.set(linksScaleRauschenMittelFrequenz.get())
rechtsScaleRauschenBandbreite.set(linksScaleRauschenBandbreite.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 if auswahl == "Rechtes Ohr": # rechts --> links
linksScaleLautstärke.set(rechtsScaleLautstärke.get()) linksScaleLautstärke.set(rechtsScaleLautstärke.get())
linksScaleRauschenLautstärke.set(rechtsScaleRauschenLautstärke.get()) linksScaleRauschenLautstärke.set(rechtsScaleRauschenLautstärke.get())
linksScaleRauschenMittelFrequenz.set(rechtsScaleRauschenMittelFrequenz.get()) linksScaleRauschenMittelFrequenz.set(rechtsScaleRauschenMittelFrequenz.get())
linksScaleRauschenBandbreite.set(rechtsScaleRauschenBandbreite.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(): def unten_button_speichern_press():
print("button speichern pressed") print("button speichern pressed")
# Wenn man Speichern will bevor ein Name eingegeben wurde kann man nicht speichern # 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") 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: else:
try: 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.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)
tinnitus.speichern() tinnitus.speichern()
sound.wav_speichern() sound.wav_speichern()
feedback("Daten erfolgreich gespeichert. Siehe: 'MeinTinnitus.wav' ", "white", "blue")
feedback("Daten erfolgreich gespeichert. Siehe: 'MeinTinnitus.wav' ")
except: 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(): def unten_button_play_press():
print("button play pressed") 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.mute = False # when this boolean is set to false no audio can ever play (it`s like a savety switch)
sound.play() sound.play()




def unten_button_stop_press(): def unten_button_stop_press():
print("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.mute = True
sound.stop() 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 """ 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 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
untenFeedbackText.tag_config("Line"+str(feedback.lineCounter), foreground=fontcolor, background=backgroundcolor) untenFeedbackText.tag_config("Line"+str(feedback.lineCounter), foreground=fontcolor, background=backgroundcolor)


untenFeedbackText.config(state=DISABLED) # set the text field back to readonly 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 """ """ Initialisierungen """




# ------------ PROGRAMM OUTPUT ------------ # ------------ 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.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 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 # lets me place the widget in the middle of the frame

Loading…
Cancel
Save