4.1 SOUND ABSPIELEN

 

 

EINFÜHRUNG

 

Um ein Soundsignal im Computer zu verarbeiten, muss es zuerst digitalisiert werden. Dazu tastet man es in äquidistanten Zeitschritten ab und wandelt den Wert des Signals mit einem Analog-Digital-Wandler in jedem Abtastzeitpunkt in eine Zahl um. Aus dem Soundsignal ergibt sich danach eine Zahlenfolge, die im Computer gespeichert und verarbeitet werden kann. Unter der Abtastfrequenz (oder Abtastrate) versteht man die Anzahl Abtastwerte pro Sekunde. Sie ist für das WAV Audioformat standardisiert und kann folgende Werte annehmen: 8000, 11025, 16000, 22050 and 44100 Hertz. Je höher die Abtastfrequenz, je genauer kann nach einer Digital-Analog-Wandlung der Sound wiederhergestellt werden. Für die Qualität ist ebenfalls der Wertebereich der Abtastwerte wichtig. In der TigerJython Soundbibliothek werden die Werte immer  als Integer-Zahlen im 16-bit Bereich (-32768 und 32767) in einer Liste abgespeichert.

Wir müssen unterscheiden, ob es sich um einen monauralen oder binauralen Sound handelt. Je nach dem, werden ein oder zwei Kanäle verwenden. Bei zwei Kanälen (Stereo) sind die Werte für den linken und rechte Kanal als aufeinanderfolgende Zahlen abgespeichert.

In diesem Kapitel benötigst du einen Computer mit einer Soundkarte und der Möglichkeit, Sound über einen Lautsprecher oder einen Kopfhörer anzuhören und mit einem Mikrofon aufzunehmen.

PROGRAMMIERKONZEPTE: Sounddigitalisierung, Audiosignal, Sample, Abtastrate

 

 

SOUND ANHÖREN

 

Beschaffe dir einen lustigen Soundclip im WAV Format von kurzer Dauer (ungefähr 2 bis 5 Sekunden lang). Du findest solche auf dem Internet. Kopiere die Sounddatei unter dem Namen mysound.wav ins gleiche Verzeichnis, in dem sich dein Programm befindet.

Zuerst importierst du alle Funktionen der Soundbibliothek. Nun kopierst du die Soundsamples in die Liste samples und schreibst die Information der Sounddatei in das Konsolenfenster, denn du benötigst die Abtastrate. In hier gezeigten Beispiel beträgt ihr Wert 22050 Hz. Mit openMonoPlayer hast du die Möglichkeit den Sound abzuspielen. Übergibst du eine falsche Abtastrate, so wird der Sound mit anderer Geschwindigkeit und daher mit anderen Frequenzen abgespielt.

from soundsystem import *

samples = getWavMono("mysound.wav")
print(getWavInfo("mysound.wav"))

openMonoPlayer(samples, 22050)
play()
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

 

MEMO

 

Die Funktion getWavMono() liefert die Soundsamples in einer Python Liste. Jeder Wert ist ein Integer im Bereich -32768 und 32767. Mit openMonoPlayer() wird ein Soundplayer zur Verfügung gestellt, um den Sound mit play() abzuspielen.

Da Listen nur eine bestimmte maximale Grösse haben dürfen, die von der Speicherfähigkeit deines Computer abhängt, können nur relativ kurze Soundclips mit getWavMono() eingelesen werden.

 

 

SOUNDKURVE

 

Es ist interessant, die Soundsamples auch grafisch darzustellen. Dazu verwendest du am einfachsten ein GPanel-Fenster und durchläufst in einer for-Schleife die Liste.

 


from soundsystem import *

samples = getWavMono("mysound.wav")
print(getWavInfo("mysound.wav"))
openMonoPlayer(samples, 44100)
play()

from gpanel import *

makeGPanel(0, len(samples), -33000, 33000)
for i in range(len(samples)):
    draw(i, samples[i])
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

MEMO

 

Wir müssen das Koordinatensystem des GPanels günstig wählen. In der x-Richtung liegen die Werte zwischen 0 und der Anzahl der Abtastwerte, die gleich der Länge der Samples-Liste ist. In der y-Richtung liegen die Werte zwischen -32768 und 32767. Darum verwenden wird einen Bereich von +-33000.

 

 

ES GEHT NOCH EINFACHER

 

Falls du eine Sounddatei nur abspielen willst, so benötigst du nur drei Zeilen Code. Damit kannst du sogar auch lange Sounds, z.B. deine Lieblingssongs abspielen.

from soundsystem import *

openSoundPlayer("myfavoritesong.wav")
play()
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

 

MEMO

 

Du kannst auch einige Soundclips verwenden, die sich in der Distribution von TigerJython befinden. Dazu wählst du einen der folgenden Dateinamen:

Sounddatei Beschreibung
wav/bird.wav Vogelzwitschern
wav/boing.wav Aufschlag
wav/cat.wav Katzenmiauen
wav/click.wav Klick
wav/dummy.wav Leerer Sound
wav/explode.wav Explosion
wav/frog.wav Froschquaken
wav/mmm.wav Esslaut
wav/notify.wav Notifikationsclip
wav/ping.wav Ping-Laut

(Die Liste wird laufend ergänzt. Falls sich in deinem eigenen Unterverzeichnis wav eine Sounddatei mit gleichem Namen befindet, wird diese verwendet.)

Der SoundPlayer kennt wie ein professioneller Musik-Player viele Steuerungsbefehle. Man kann beispielsweise den Song mit pause() anhalten und mit play() an derselben Stelle weiterspielen lassen.

Die Dauer des Sounds ist bei diesen Funktionen nicht begrenzt, da der Sound nur in kleinen Paketen eingelesen und abgespielt wird (Streaming Player).

play() Spielt Sound von der aktuellen Position ab und kehrt sofort zurück
blockingPlay() Spielt Sound von der aktuellen Position und wartet, bis er fertig gespielt ist
advanceFrames(n) Verschiebt die aktuelle Position um die Anzahl Abtastwerte nach vorne
advanceTime(t) Verschiebt die aktuelle Position um die angegebene Zeit (in ms) nach vorne
getCurrentPos() Gibt die aktuelle Position zurück
getCurrentTime() Gibt die aktuelle Spielzeit zurück
pause() Hält das Abspielen an. Mit play() wird weitergespielt
rewindFrames(n) Schiebt die aktuelle Position um die Anzahl Abtastwerte zurück
rewindTime(t) Schiebt die aktuelle Position um die angegebene Zeit zurück
stop() Hält das Abspielen an. Die Abspielposition wird an den Anfang gesetzt
setVolume(v) Stellt die Lautstärke ein (Werte zwischen 0 und 1000)

 

 

MP3 SOUNDDATEIEN ABSPIELEN

 

Zum Abspielen von Sounds im MP3 Format, werden zusätzliche Bibliotheksdateien benötigt, die du separat von hier herunterlädst und auspackst. Im Verzeichnis, in dem sich tigerjython2.jar befindet, erstellst du dann das Unterverzeichnis Lib (falls es noch nicht vorhanden ist) und kopierst die ausgepackten Dateien hinein.

Statt openSoundPlayer(), openMonoPlayer() und openStereoPlayer() verwendest du für MP3-Dateien dann openSoundPlayerMP3(), openMonoPlayerMP3() und openStereoPlayerMP3() und gibst den Pfad zur Sounddatei an. Zum Abspielen stehen dir die gleichen oben angegebenen Funktionen zur Verfügung.

from soundsystem import *

openSoundPlayerMP3("song.mp3")
play()
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

 

MEMO

 

Um MP3-Dateien abzuspielen, benötigst du zusätzliche JAR-Bibliotheksdateien, die sich im  Unterverzeichnis Lib des Homeverzeichnisses von tigerjython2.jar befinden müssen.

 

 

AUFGABEN

 

1.


Erkläre, warum die Tonfrequenzen verändert werden, falls man die Abtastrate beim Abspielen verändert.


2.


Zeige im GPanel nur den kurzen Bereich von 0.1 Sekunden beginnend bei 1 s Spielzeit an. Erkläre das Bild.


3.


Erstelle einen Soundplayer mit einem GPanel, wo mit der Tastatur die folgenden Befehle ausgeführt werden können:

Taste Aktion
Cursor up play
Cursor down pause
Cursor left rewind um 10 s
Cursor right adwance um 10 s
Buchstabe s stop

Schreibe die Befehlsliste als Text in das Fenster. Bei jedem Tastendruck soll die Aktion in der Titelzeile ausgeschrieben werden.