Mit einem Multicore Propeller Controller lassen sich Musikdateien sehr komfortabel abspielen. Er ist mit seinem Multicore-Chip in der Lage Daten von der SD Karte zu lesen, die D/A Wandlung vorzunehmen, Dateien zu wechseln und/oder Programme mit angeschlossenen Sensoren auszuführen.
Das Prop-Activity Board und das Prop-Board of Education verfügen beide über eingebaute D/A Verstärker und einen microSD Kartenhalter. Der Propeller Controller holt die Musikdaten von der microSD Karte und lässt sie über den D/A Verstärker abspielen.
Material |
|
Aufgaben |
|
In dieser Übung arbeiten wir mit der Bibliotheksdatei wavplayer, die entsprechende Funktionen bereitstellt, mit denen das Laden und Abspielen von Musikdateien besonders einfach wird. Sie ist konzipiert für 16-bit PCM, 32kHz, mono WAV Dateien. Mit Audacity lassen sich zum Beispiel andere Musikformate leicht und schnell in das WAV-Format konvertieren oder direkt aufnehmen.
Aufgaben |
|
Die Funktionen der Bibliothek wavplayer.h
void wav_player(const char *wavDateiname)
Spielt eine *.wav Datei ab.
int wav_playing()
Überprüft, ob aktuell eine wav-Datei abgespielt wird.
void wav_volume(int vol)
Stellt die Lautstärke ein. int vol nimmt Werte zwischen 0 (sehr leise) bis 10 (sehr laut) an.
void wav_stop(void)
Beendet den Lesevorgang bei einer wav-Datei (cog1), lässt aber den Ausgang offen (cog2) für das Abspielen eines weiterer Tracks.
void wav_close(void)
Beendet den Lesevorgang bei einer wav-Datei und schließt den Audioausgang. Dieser Befehl wird nur verwendet, wenn zwei cogs für andere Aufgaben benötigt werden.
Die Anwendung WAVLautstaerke spielt das kurze Musikstück mit der voreingestellten Lautstärke (5 von 10) ab.
Die Firma Parallax bietet in ihrer SoundLibrary vorformatierte kleine Audiodateien zum downloaden an.
Das Programm WAVTest.c
Wie arbeitet das Programm WAVTest.c?
Zu Beginn des Programms werden die beiden Bibliotheken simpletools und wavplayer eingebunden. Die neuen Funktionen aus der Bibliothek wavplayer wurden weiter oben vorgestellt.
Zeile 6
Initialisierung der SD-Card pads mit den Propeller Pin.
Zeile 7
Der SD-Kartenhalter wird in das Dateisystem eingebunden; damit ist der Zugriff auf die SD-Card möglich. Statt Zahlenwerte einzusetzen, wurde hier mit Variablennamen gearbeitet. Dadurch ist es zu einem späteren Zeitpunkt leicht möglich, das Programm auch auf Boards mit anderen Pinverbindungen zu übertragen, indem man nur die Verbindungsleitungen in Zeile 6 anpasst.
Zeile 8
Der Konstanten musik[] , ein Array vom Typ char, wird der Dateiname guitar.wav zugewiesen.
Zeile 9
Die Funktion wav_play hat als Argument den Namen der abzuspielenden WAV-Datei (hier: guitar.wav), den sie an den WAV-Player weiterleitet, der nach einer Datei gleichen Namens im root-Verzeichnis der SD-Card sucht. Die Datei wird geöffnet, die Headerinformation über Datenrate, bits per sample und weitere Details wird gelesen und anschließend nehmen zwei cogs im Propeller ihre Arbeit auf.
cogA ist zuständig für die D/A Werte aus der WAV-DAtei , die er in einem Array ablegt.
cogB liest die Daten aus dem Array mit einer Wiederholrate von 32.000 pro Sekunde und gibt sie an den D/A Konverter weiter.
Zeile 10
Während die Musik abspielt, wird über die Funktion wav_volume die Lautstärke eingestellt. Der vorgegebene Einstellbereich liegt zwischen 0 und 10.
Zeile 11
Die Spielzeit wird durch einen pause-Befehl festgelegt. Beachte, dass jeder Aufruf von wav_play auch einen wav_volume Befehl verlangt (entweder vorher oder nachher). Jedem wav_play-Befehl muss auch ein pause-Befehl folgen, der festlegt, wie lange eine wav-Datei abgespielt wird. Um eine vollständige wav-Datei zu hören, muss das Argument des pause-Befehls ca. 900ms größer sein als die eigentliche Abspiellänge der Datei.
Während für das Abspielen einer WAV-Datei zwei cogs verantwortlich sind, gibt es eine Reihe weiterer, nicht ausgelasteter cogs in einem Propeller, die weitere Aufgaben übernehmen können, wie zum Beispiel Sensoren abfragen.
Im folgenden Programmbeispiel wird gezeigt, dass die Lautstärkeeinstellung von einem Ping))) Ultraschallsensor übernommen wird. Dazu wird die ping-Bibliothek ping.h in den Programmcode eingebunden.
Aufgaben |
|
Jetzt kommst du!