Datenablage für Tinnitus Therapie Projektarbeit von Julian Seyffer und Heiko Ommert SS2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SoundGenerator.py 5.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import math
  2. import wave #bearbeiten von .wav-Dateien
  3. import struct
  4. import sounddevice as sd #zum abspielen des audio-arrays
  5. import random as random #für die Rauscherzeugung
  6. import time #nur für die Tests, um Zeit zum Anhören der Sounds einzubauen
  7. #In .wav-Dateien wird der Ton in absoluten Werte eingetragen. Die Standart-framerate ist 44100
  8. #das heißt für jede Sekunde an Ton gibt es 44100 Werte, die die Tonwelle über die Zeit beschreiben
  9. class Tinnitus: #beinhaltet alle Werte, die vom Nutzer eingestellt werden
  10. def __init__(self, l_freq=600, r_freq=600, l_amp=0, r_amp=0, l_rausch=0, r_rausch=0, ear=0):
  11. self.linksFrequenz = l_freq
  12. self.rechtsFrequenz = r_freq
  13. self.linksLautstaerke = l_amp
  14. self.rechtsLautstaerke = r_amp
  15. self.linksRauschenLautstaerke = l_rausch #float von 0-1 (0 ist aus)
  16. self.rechtsRauschenLautstaerke = r_rausch
  17. self.ear = ear # 0:both 1:left 2:right 3:links/rechts unterschiedlich
  18. return
  19. def speichern(self): #speichert die Nutzerdaten in eine .csv-Datei
  20. datei = open("TinnitusDaten.csv", "w")
  21. daten = "linke Frequenz;" + str(self.linksFrequenz) + "\n"
  22. daten += "linke Lautstärke;" + str(self.linksLautstaerke) + "\n"
  23. daten += "linkes Rauschen;" + str(self.linksRauschenLautstaerke) + "\n"
  24. daten += "rechte Frequenz;" + str(self.rechtsFrequenz) + "\n"
  25. daten += "rechte Lautstärke;" + str(self.rechtsLautstaerke) + "\n"
  26. daten += "rechtes Rauschen;" + str(self.rechtsRauschenLautstaerke) + "\n"
  27. datei.write(daten)
  28. datei.close()
  29. return
  30. #Die Klasse beinhaltet alle Werte, die zum Erstellen einer .wav-Datei benötigt werden und ein Tinnitus-Objekt, das beim Initialisieren übergeben werden muss.
  31. #Die Audiodaten werden in das Array "audio" geschrieben
  32. class Sound:
  33. def __init__(self, tinnitus, name="sound.wav", audio=None, nchannels=1, sampwidth=2, framerate=44100, comptype="NONE", compname="not compressed", mute=True):
  34. if audio is None:
  35. audio = []
  36. self.tinnitus = tinnitus
  37. self.name = name
  38. self.audio = audio #ein Array, in das die Sound-Werte geschrieben werden
  39. self.nchannels = nchannels #Zahl der audio channels (1:mono 2:stereo)
  40. self.sampwidth = sampwidth #Größe eines einzelnen Sound-Werts (in bytes)
  41. self.framerate = framerate #Abtastrate
  42. self.nframes = len(audio) #Anzahl der Sound-Werte -> Muss bei jeder audio-Änderung aktuallisiert werden
  43. self.comptype = comptype
  44. self.compname = compname
  45. self.mute = True # wenn der mute boolean auf true gesetzt ist, sollte kein Ton ausgegeben werden
  46. return
  47. def neu_audio(self): #Schreibt Werte in das audio-Array. Soll später abhängig sein von den Tinnitus-Werten(Frequenz, Rauschen, ...)
  48. freq = self.tinnitus.linksFrequenz
  49. dauer_ms = 100.0
  50. amp = self.tinnitus.linksLautstaerke
  51. rauschen = self.tinnitus.linksRauschenLautstaerke
  52. self.audio.clear()
  53. num_samples = dauer_ms * (self.framerate / 1000.0) # framerate -pro Sekunde- umgerechnet in -pro Millisekunde-
  54. # einen einfachen Sinus ins array schreiben
  55. for x in range(int(num_samples)):
  56. self.audio.append(amp * math.sin(2 * math.pi * freq * (x / self.framerate)))
  57. #das Rauschen addieren
  58. if(self.tinnitus.linksRauschenLautstaerke != 0):
  59. for x in range(int(num_samples)):
  60. self.audio[x] += random.random() * rauschen
  61. return
  62. def wav_speichern(self): #ezeugt/aktuallisiert die .wav-Datei
  63. self.neu_audio()
  64. #das 100ms audio-array strecken:
  65. for x in range(50): # entspricht 5 Sekunden
  66. for y in range(int(self.framerate/10)):
  67. self.audio.append(self.audio[y])
  68. wav_file = wave.open(self.name, "w")
  69. #erst werden die Rahmen-Parameter gesetzt
  70. self.nframes = len(self.audio) # Anpassen des nframes-Parameters
  71. wav_file.setparams((self.nchannels, self.sampwidth, self.framerate, self.nframes, self.comptype, self.compname))
  72. #dann wird das audio-Array an die Datei übertragen
  73. for sample in self.audio:
  74. wav_file.writeframes(struct.pack('h', int(sample * 32767.0)))
  75. wav_file.close()
  76. return
  77. def play(self):
  78. self.neu_audio()
  79. if not self.mute: # NEVER play sound when patient mutes GUI
  80. sd.play(self.audio, self.framerate, loop=1)
  81. return
  82. def stop(self):
  83. sd.stop()
  84. return
  85. # tinnitus1 = Tinnitus()
  86. # sound = Sound(tinnitus1)
  87. #
  88. # if(1):
  89. # print("======abnehmende Lautstärke==========")
  90. # for x in range(10):
  91. # print(" Lautstärke = ", tinnitus1.linksLautstaerke)
  92. # sound.play()
  93. # time.sleep(0.6)
  94. # tinnitus1.linksLautstaerke -= 0.1
  95. # print("\n\n")
  96. # time.sleep(1)
  97. # tinnitus1.linksLautstaerke = 1
  98. #
  99. #
  100. #
  101. # if(0):
  102. # print("=========RauschTest============")
  103. # for x in range(10):
  104. # tinnitus1.linksRauschenLautstaerke += 0.01
  105. # print(" Rauschen = ", tinnitus1.linksRauschenLautstaerke)
  106. # sound.play()
  107. # time.sleep(1)
  108. #
  109. # if(0):
  110. # tinnitus1.speichern()
  111. #
  112. # sd.stop()
  113. # print("ENDE")