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 3.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import math
  2. import wave
  3. import struct
  4. from playsound import playsound
  5. import time #nur für die Letzte Zeile, damit sich das Programm nicht direkt beendet, nachdem der Sound startet
  6. #In .wav-Dateien wird der Ton in absoluten Werte eingetragen. Die Standart-framerate ist 44100
  7. #das heißt für jede Sekunde an Ton gibt es 44100 Werte, die die Tonwelle über die Zeit beschreiben
  8. class Sound:
  9. def __init__(self, name="sound.wav", audio=[], nchannels=1, sampwidth=2, framerate=44100, comptype="NONE", compname="not compressed"):
  10. self.name = name
  11. self.audio = audio #ein Array, in das die Sound-Werte geschrieben werden
  12. self.nchannels = nchannels #Zahl der audio channels (1:mono 2:stereo)
  13. self.sampwidth = sampwidth #Größe eines einzelnen Sound-Werts (in bytes)
  14. self.framerate = framerate #Abtastrate
  15. self.nframes = len(audio) #Anzahl der Sound-Werte -> Muss bei jeder audio-Änderung aktuallisiert werden
  16. self.comptype = comptype
  17. self.compname = compname
  18. return
  19. def new_audio(self): #Schreibt Werte in das audio-Array. Soll später abhängig sein von den Tinnitus-Werten(Frequenz, Rauschen, ...)
  20. freq = 440.0
  21. duration_milliseconds = 1000.0
  22. volume = 1.0
  23. num_samples = duration_milliseconds * (self.framerate / 1000.0) #framerate -pro Sekunde- umgerechnet in -pro Millisekunde-
  24. #Die Schleife zählt, bis die passende Anzahl an Werten erreicht ist
  25. #Im Inhalt der Schleife werden die Audio-Werte berechnet
  26. for x in range(int(num_samples)):
  27. self.audio.append(volume * math.sin(2 * math.pi * freq * (x / self.framerate))) #Erzeugt Werte für einen einfachen Sinus
  28. """ --------------- angefügter Sägezahn -------------------- """
  29. j = 0
  30. for x in range(int(num_samples)):
  31. if(j == 80):
  32. j = 0
  33. j += 1
  34. self.audio.append(j / 80)
  35. """ --------------- Ende Sägezahn -------------------- """
  36. self.nframes = len(self.audio) #Anpassen des nframes-Parameters
  37. return
  38. def renew(self): #ezeugt/aktuallisiert die .wav-Datei
  39. self.new_audio()
  40. print("audio aktuallisiert")
  41. wav_file = wave.open(self.name, "w")
  42. #erst werden die Rahmen-Parameter gesetzt
  43. wav_file.setparams((self.nchannels, self.sampwidth, self.framerate, self.nframes, self.comptype, self.compname))
  44. #dann wird das audio-Array an die Datei übertragen
  45. for sample in self.audio:
  46. wav_file.writeframes(struct.pack('h', int(sample * 32767.0)))
  47. wav_file.close()
  48. return
  49. def play(self):
  50. # Der zweite Parameter legt fest, wie die Datei abgespielt wird (False:asynchron True:synchron)
  51. #synchron bedeutet das Programm läuft erst nach Ende des Abspielens weiter
  52. playsound('sound.wav', False)
  53. class Tinnitus: #beinhaltet alle Werte, die vom Nutzer eingestellt werden und ein Sound-Objekt
  54. def __init__(self, freq=440, amp=1, ear=0, sound=Sound()):
  55. self.freq = freq
  56. self.amp = amp
  57. self.ear = ear # 0:both 1:left 2:right
  58. self.sound = sound #beinhaltet Variablen und Funktionen für die Bearbeitung von .wav-Dateien
  59. return
  60. tinnitus = Tinnitus()
  61. print("Objekt initialisiert")
  62. tinnitus.sound.renew()
  63. print("Datei aktuallisiert")
  64. tinnitus.sound.play()
  65. print("Sound gestartet")
  66. time.sleep(3)