JControl und Sound: Töne und Melodien wiedergeben

II. Melodien wiedergeben

In diesem Kapitel wird gezeigt, wie mit Hilfe der Klasse iMelody Melodien auf JControl-Geräten abgespielt werden können. Des Weiteren wird der Melodie-Editor der JControl/IDE vorgestellt, mit dem Melodien einfach erzeugt und editiert werden können.

Voraussetzungen: Für dieses Tutorial wird eine Installation der JControl/IDE sowie ein JControl-basiertes System mit Buzzer (z.B. JControl/Sticker, JControl/PLUI, etc.) benötigt.

Download: http://www.jcontrol.org/examples/MelodyExample.zip Dieses Tutorial mit allen Quelltexten und Ressourcen als JControl/IDE-Projekt (ZIP-Archiv).




iMelody-Dateien erzeugen und bearbeiten

Der in die JControl/IDE integrierte Melodie-Editor MelodyEdit ermöglicht die Bearbeitung und Konvertierung von Melodien im iMelody-Format (Endung .imy), das von der Infrared Data Association festgelegt wurde und u.a. auch bei Klingelmelodien für Mobiltelefone Verwendung findet. Die mit MelodyEdit erstellten Melodien lassen sich mit der JControl/IDE in ein Projekt einbinden. In einer JControl-Anwendung kann die Melodie dann mit Hilfe der Klasse iMelody ohne großen Programmieraufwand abgespielt werden. Außerdem lassen sich mit MelodyEdit auch ganze Tonspuren aus Midi-Dateien importieren und in das iMelody-Format umwandeln (ab JControl/IDE Version 3.0.1 und höher).

Zu Beginn wird zunächst in der JControl/IDE ein neues Projekt namens "Musik" angelegt. Laden Sie dann die Datei Entertainer.imy und speichern sie sie in dem Projektverzeichnis. Starten Sie nun den Melodie-Editor durch Doppelklick auf den Eintrag Entertainer.imy im Quellen-Navigator.

Der Melodie-Editor zeigt die Noten des bekannten Ragtimes "The Entertainer" von Scott Joplin (siehe Bild 1). Drücken Sie auf den Play-Button (in Bild 1 rot umrahmt), um den Song über Ihre Soundkarte abzuspielen.

Bild 1: Der Melodie-Editor mit geöffneter Musikdatei

Machen Sie sich nun mit den Möglichkeiten des Melodie-Editors vertraut. Fügen Sie z.B. zusätzliche Noten in den Entertainer ein oder komponieren Sie eine eigene musikalische Kreation. Probieren Sie die Import-Funktion aus, in dem Sie eine mid-Datei von Ihrer Festplatte importieren (Windows hält z.B. einige Midi-Dateien im Verzeichnis c:\Windows\media bereit).

Dateien im iMelody-Format basieren auf einem einfachen Textformat, welches zunächst mit der Identifikation BEGIN:IMELODY beginnt. Als nächstes folgen Versionskennungen sowie allgemeine Informationen über die Melodie (z.B. Titel, Komponist, Anzahl der Schläge pro Minute etc). Die eigentliche Melodie wird als eine Zeichenkette dargestellt, die für jede einzelne Note die Tonhöhe, Oktave, Dauer und ggf. weitere Attribute in Form von Zahlen und Buchstaben definiert (z.B. "6" bedeutet 6. Oktave, "d" die Note "d" und "4" 1/4 Schlag). Das folgende Listing 1 zeigt dazu einen Auszug aus der iMelody-Darstellung für den "Entertainer".

    BEGIN:IMELODY
    VERSION:1.2
    FORMAT:CLASS1.0
    BEAT:110
    NAME:The Entertainer
    COMPOSER:Scott Joplin
    MELODY:*6d4*6e4*6c4*5a3*5b4*5g3*5d4*5e4*5c4a3b4g3d4e4c4*3a3*3b4*3a4*3#g4*3g2*5g3...
    END:IMELODY



Die Klasse iMelody

In dem in Listing 2 gezeigten Beispiel wird die Klasse jcontrol.toolkit.iMelody http://www.jcontrol.org/current/docs/api/jcontrol/toolkit/iMelody.html verwendet, um den Entertainer auf Ihrem JControl-Gerät abzuspielen. Fügen Sie Ihrem JControl/IDE-Projekt dazu den folgenden Quelltext sowie die Datei Entertainer.imy hinzu.

1    import java.io.IOException;
2    
3    import jcontrol.io.Display;
4    import jcontrol.io.Resource;
5    import jcontrol.toolkit.iMelody;
6    
7    /**
8     * This example loads a melody from the flash memory
9     * and plays it using the <code>class iMelody</code>.
10     */
11    public class MelodyExample {
12      Display lcd;
13     
14      public MelodyExample() {
15        lcd = new Display();
16        lcd.drawString("Now playing:",40,10);
17        lcd.drawString("The Entertainer",30,30);
18       
19        try {
20          // load song from flash memory
21          Resource r = new Resource("Entertainer.imy");
22    
23          // create iMelody instance
24          iMelody im = new iMelody(r);
25         
26          // start playing
27          new Thread(im).start();
28                   
29        } catch (IOException e) {}
30      }
31    
32      public static void main(String[] args) {
33        new MelodyExample();
34      }
35    }
Listing 2: MelodyExample.java

Im obigen Beispiel MelodyExample ist zu sehen, dass für das Abspielen der imy-Datei nur sehr wenig Quelltext benötigt wird. Da es sich bei der Melodie um eine sog. Flash-Ressource handelt, muss zunächst ein Resource-Objekt erzeugt werden, damit darauf zugegriffen werden kann. Dieses wird dann lediglich an eine Instanz der Klasse iMelody übergeben, die die Datei dann über den angeschlossenen Buzzer abspielt. Der Abspielvorgang selbst wird gestartet, indem ein Thread-Objekt von der iMelody-Instanz erzeugt und aufgerufen wird (Methode start()).

Im folgenden Bild 2 wird zeigt, wie das Projekt schließlich im Quellen-Navigator Ihrer JControl/IDE angezeigt wird.

Bild 2: Das MelodyExample im Quellen-Navigator der JControl/IDE

Programmier-Tipp: Die Verwendung eines eigenen Threads (Programmfaden) zum Abspielen der Melodie birgt viele Vorteile. Der wichtigste ist, dass das aufrufende Programm (hier MelodyExample) während der Wiedergabe der Melodie schon andere Aufgaben erledigen kann, wie z.B. auf eine Benutzereingabe warten oder eine Grafik generieren. Wenn jedoch, wie in unserem Beispiel, keine weiteren Befehle nach dem Thread-Aufruf folgen, wird das Programm dennoch von der virtuellen Java-Maschine des JControl-Geräts erst beendet, wenn das Abspielen der Melodie abgeschlossen ist.

Abschließend bleibt lediglich das Starten des Programms. Dazu wird das JControl/IDE-Projekt auf Ihr JControl-basiertes Gerät hochgeladen. Nach dem Upload wird Scott Joplins wundervolle Komposition über den Buzzer wiedergegeben.



© 2000-2006 DOMOLOGIC Home Automation GmbH. All Rights Reserved.