作成 2004/9/30
Javaでサウンドを扱うAPIはJavaサウンドAPIです。JavaサウンドAPIはjavax.soundからはじまるパッケージで、JDK(バージョン?)にデフォルトで組み込まれており、他のJARなどを組み込むことなく利用することができます。
JavaサウンドAPIには扱うデータにより、大きく2つのAPIに分かれます。一つはサンプリングデータを扱うAPIで、javax.sound.sampledパッケージのクラス群です。もう1つはMIDIを扱うAPIで、javax.sound.midiパッケージのクラス群です。
とりあえず、wavファイルを読み込んで再生する簡単なサンプルがコレ。
サンプリング系のクラスの窓口となるクラスです。ファイルを読み込んだり、その他もろもろに利用します。
サンプリングデータでは、実装(SPI)によって、いくつかのフォーマットの音声ファイルを読み込み、再生することができます。Sunの実装では、AU、AIFF、WAVE形式がデフォルトで利用できます。利用できるフォーマットを調べるには次のようにします。
AudioFileFormat.Type[] types = AudioSystem.getAudioFileTypes(); for (int i = 0; i < types.length; i++) { AudioFileFormat.Type type = types[i]; System.out.println(type); }
音声入出力を行うインターフェイスはDataLineです。DataLineには、次の3つの種類(サブインターフェイス)があります。
DataLine | 説明 |
---|---|
SourceDataLine | 出力用データライン |
TargetDataLine | 入力用データライン(録音するときとか) |
Clip | もう1つの出力用データライン |
これらのデータラインは、クラス名を指定してDataLine.Infoを取得し、AudioSystemから取得します(一般にAudioSystemとDataLineの間にミキサーが入りますが、簡単な場面では直接DataLineを取得できます)。
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info);
SourceDataLineとClipは用途が似ていますが若干違います。Clipはデータをメモリ上に読み込んでおいてから再生します。SourceDataLineはバッファを読み込みながら再生します。Clipは短い音声に適しており、利用もやや簡単です。SourceDataLineでは、長い音声や、音声にリアルタイムで変換をかける場合に利用します。
前の例は、Clipを利用していました。SourceDataLineを使うと次のようになります。
バイトデータの書き込み操作が必要になっているのがわかります。なおバッファサイズは、短い方が遅れなく音声が再生できますが、CPUリソースを消費するのと、書き込みが間に合わない場合、音が飛んだり雑音になったりします。アプリケーションによって適当なサイズを設定します。
TODO
TODO
TODO
TODO
Javaで扱えるもう1つのサウンド形式がMIDI(Musical Instruments Digital Interface)です。サンプリングデータが実際の音の波形を再生するのに対し、MIDIは、既に用意されている楽器の音色に対してデータを送ることで再生を行います。サンプリングデータのように何でもありの音声は再生できませんが、データサイズがかなり小さくなります。
TODO
MIDIを利用した簡単なサンプルがコレ。
サンプリング系のクラスの窓口は、AudioSystemでしたが、MIDIの場合はMidiSystemです。ファイルを読み込んだり、その他もろもろに利用します。
TODO
TODO
TODO
TODO ゲームで利用するサウンドマネージャクラスを作る。
Java Sound プログラマーズガイド
http://java.sun.com/j2se/1.4/ja/docs/ja/guide/sound/programmer_guide/contents.html
Developing Games in Java
http://www.brackeen.com/javagamebook/
JavaでHello World サウンド編
http://www.hellohiro.com/sound.htm