19.8 Musik in einem Applet und in Applikationen
 
Die Applet-Klasse verfügt über die Objektmethode getAudioClip() und über die statische Methode newAudioClip(), die eine Audio-Datei als AudioClip-Objekt liefert. Die Quelle ist als URL gegeben. Die play()-Methode auf dem AudioClip spielt das Stück ab.
interface java.applet. AppletContext
|
|
AudioClip getAudioClip( URL url )
Liefert ein AudioClip-Objekt, welches durch die URL gegeben ist. |
|
AudioClip getAudioClip( URL url, String name )
Aufruf von getAudioClip(new URL(url, name)). |
|
static AudioClip newAudioClip( URL url )
Liefert ein AudioClip-Objekt, welches durch die URL angegeben ist. |
Hinweis Mit der statischen Funktion newAudioClip() lässt sich ein AudioClip-Objekt auch ohne ein AppletContext erzeugen. Damit bietet sich diese Methode für Applikationen an.
|
Beispiel Spiele die Datei uups.wav in einer Applikation ab.
File f = new File( "uups.wav" );
AudioClip sound = Applet.newAudioClip( f.toURL() );
theSound.play();
Thread.currentThread().sleep( 100000 );
|
Weitere Informationen gibt es bei Sun unter http://developer.java.sun.com/developer/technicalArticles/Media/JavaSoundAPI/.
19.8.1 Fest verdrahtete Musikdatei in einem Applet
 
Wir platzieren die Audio-Datei in unserem Codeverzeichnis, so dass über die Methode getCodeBase() keine weiteren Angaben zum Host zu machen sind. Das Applet bekommt eine Minimalausführung. In der init()-Funktion lesen wir die Datei, und die start()-Methode spielt den AudioClip mit seiner ureigensten Methode play() ab.
Listing 19.10
AudioPlayer.java
import java.applet.Applet;
import java.awt.*;
public class AudioPlayer extends Applet
{
String file = "lala.au";
AudioClip ac;
public void init()
{
ac = getAudioClip( getCodeBase(), file );
start();
}
public void start()
{
ac.play();
}
public void stop()
{
ac.stop();
}
}
Da das Applet lediglich beim Starten Musik abspielen muss, benötigt es auf dem Bildschirm auch keine Ausmaße – wir können somit Höhe und Breite bedenkenlos auf null setzen. Das Applet-Tag ist herzlich kurz.
Listing 19.11
index.html
<applet code="AudioPlayer.class" width="0" height="0"></applet>
Variable Musikdatei über einen Parameter
Soll die Musik-Datei von außen als Parameter übergeben werden, vereinbaren wir eine Variable musiFileName, über die wir die Musikdatei austauschen. Somit ist unser Programm wesentlich flexibler. Die init()-Methode ändert sich dann:
public void init()
{
String file = getParameter( "musiFileName" );
ac = getAudioClip( getCodeBase(), file );
start();
}
Zum Einbinden dieses Applets können wir etwa folgenden HTML-Code verwenden:
Listing 19.12
index.html
<applet code="AudioPlayer.class" width="0" height="0">
<param name="musiFileName" value="lala.au">
</applet>
19.8.2 WAV- und MIDI-Dateien abspielen
 
Die Sound-Engine kann seit Java 1.2 Dateien im Format AIFF, AU und WAV abspielen. Ebenso ist ein MIDI-Renderer enthalten, der die Dateiformate TYPE 0 MIDI, TYPE 1 MIDI und RMF unterstützt. Dieser erzeugt softwaremäßig mit einem Wave-RAM General Midi. Die Sound-Maschine kann 8- oder 16-Bit-Audio-Daten rendern, entweder mono oder stereo. Dabei werden Sampling-Raten von 8 bis zu 48 KHz unterstützt.
Im Allgemeinen funktioniert das Abspielen auf Anhieb. Die Java Sound API nutzt für die Instrumente das Angebot des Betriebssystems, doch lassen sich von Sun unter http://java.sun.com/products/java-media/sound/soundbanks.html einheitliche Instrumentendateien, so genannte Soundbanks, laden. Unter C:\Programme\Java\j2re1.5.0\lib\audio – das Verzeichnis gilt für die Standardinstallation unter C:\Programme – findet sich schon die kleinste Soundbank soundbank.gm. In das Verzeichnis lässt sich auch die Deluxe-Version soundbank-deluxe.gm mit über 5 MB entpacken, welches Instrumente höchster Qualität bietet.
Die Sound-API im Paket javax.sound erlaubt Erweiterungen um eigene Audio-Spieler. So gibt es einen Winamp-ähnlichen MP3-Spieler mit dem Namen jlGui (http://www.javazoom.net/jlgui/jlgui.html), dem der Unterschied zu einem nativen Player nicht anzusehen ist.1
Er unterstützt Drag&Drop, Webstart, M3U, WinAmp Skins, OGG Vobis und vieles mehr. jlGui nutzt hierzu einen eigenen AudioLayer (http://javalayer.sourceforge.net/) zum Abspielen von MP3-Dateien. Die zusätzliche Bibliothek basiert auf der Möglichkeit, eigene SPIs einzuhängen.
MIDI-Dateien abspielen
Die Klassen zum Abspielen von MIDI-Dateien liegen unter javax.sound.midi. Die Hardware (oder Software), die MIDI-Daten abspielt, nennt sich Sequencer. Um an die Instanz zu kommen, wird die Fabrik-Funktion MidiSystem.getSequencer() bemüht. Anschließend muss die Abspieleinheit initialisiert werden – das geschieht mit open().
Sequencer sequencer = MidiSystem.getSequencer();
sequencer.open();
Der nächste Schritt besteht darin, die Musik-Informationen bereitzustellen und dem Sequencer zu übergeben. Diese Daten liegen als Sequence-Objekte vor. Sie lassen sich mit MidiSystem.getSequence() vorbereiten. Die getSequence()-Funktion erlaubt als Parameter File-, InputStream- und URL-Objekte.
InputStream midiFile = MidiDemo.class.getResourceAsStream( "media/beginn.mid" );
sequencer.setSequence( MidiSystem.getSequence(midiFile) );
So geschehen lässt sich mit start() der Sequencer zur Arbeit bewegen und mit stop() das Abspielen beenden. Bei start() wird automatisch ein Hintergrundprozess gestartet, so dass das Abspielen auch dann fortfährt, wenn die main()-Funktion und der main-Thread schon beendet sind.
sequencer.start();
sequencer.stop();
1 Er lässt sich per Webstart sofort ausprobieren: http://www.javazoom.net/jlgui/jws/jlgui_jnlp.jsp. Unter http://www.javazoom.net/jlgui/jnlp_configurator.jsp lassen sich einige Parameter einstellen und dann gleich ausprobieren. Cool!
|