第8回の今回は、サウンドの再生について解説します。前回作成した弾幕避けゲームにBGMとSEを追加します。
[サンプルプログラムのダウンロード]
プログラムは、次の2つのクラスで構成されています。
- DanmakuGameクラス(DanmakuGameEx.java)
- DanmakuCanvasクラス(DanmakuCanvas.java)
プロジェクト名「DanmakuGame3」とクラス名「DanmakuGame」でプロジェクトを作成してください。
▼サウンドファイルの準備
今回使用するサウンドファイルは次の2つです。プロジェクトのresフォルダに置いてください。
オープンアプリ(Java)で利用できるサウンドのファイル形式は「MIDI(audio/midi)」と「WAVE(audio/x-wav)」と「Tone
Sequence (audio/x-tone-seq)」です。また、同時再生可能な数は、MIDIとWAVEは4つまで、Tone
Sequenceは同時に1つまで、同時生成数は最大64個となっています。
▼サウンドファイルの読み込み
DanmakuCanvasクラスに追加したサウンドファイルの読み込み部分は次の通りです。
DanmakuCanvas.javaの一部
InputStream in;
try {
//MIDI
in=getClass().getResourceAsStream("/bgm.mid");
player[0]=Manager.createPlayer(in,"audio/midi");
player[0].setLoopCount(-1);
player[0].prefetch();
//WAVE
in=getClass().getResourceAsStream("/se.wav");
player[1]=Manager.createPlayer(in,"audio/x-wav");
player[1].prefetch();
} catch (Exception e) {
System.out.println(e.toString());
}
|
JARファイルに含まれているファイルを読み込むには、入力ストリームを使います。入力ストリームを開くには、ClassクラスのgetResourceAsStream()メソッドを使います。
[Classクラス] |
InputStream getResourceAsStream(name)
source 読み込み先:String型
戻り値 InputStreamオブジェクト:InputStream型 |
リソースを読み込む。 |
読み込み先は「/ファイル名」の書式で指定します。
次に「javax.microedition.media.Player」クラスを使います。createPlayer()メソッドでPlayerオブジェクトを生成して下さい。
[Playerクラス] |
static Player createPlayer(stream,type)
in 入力ストリーム:InputStream型
type コンテントタイプ:String型 |
Playerオブジェクトを生成する。 |
引数のコンテントタイプにはMIDIファイルを再生するには"audio/midi"、WAVEファイルを再生するには"audio/x-wav"を指定します。
Playerオブジェクトには
- UNREALIZED - 初期状態
- REALIZED - サウンドデータ取得に必要な情報保持
- PREFETCHED - 再生準備完了
- STARTED - 再生中
- CLOSED - 破棄状態
の5つの状態があります。

「UNREALIZED状態」を「REALIZED状態」に遷移させるにはrealize()メソッド、「REALIZED状態」を「PREFETCHED状態」に遷移させるにはprefetch()メソッドを使います。
入力ストリームを渡したPlayerオブジェクトは、サウンドデータ取得に必要な情報を持っているので「REALIZED状態」です。そこで、prefetch()メソッドを呼んで「PREFETCHED状態」に遷移させます。
[Playerクラス] |
void prefetch() |
PREFETCHED状態へ遷移。 |
サウンドのループ回数を指定するにはsetLoopCount()メソッドを使います。
[Playerクラス] |
void setLoopCount(count)
count ループ回数:int型 |
ループ回数を指定する。 |
ループ回数に-1を指定すると無限ループします。0は指定できません。「STARTED状態」「CLOSED状態」の時に呼ぶと例外を投げます。
▼サウンドの再生
DanmakuCanvasクラスに追加したサウンドを再生する部分は次の通りです。
DanmakuCanvas.javaの一部
//サウンドの再生【追加】
private void playSound(int idx) {
try {
player[idx].setMediaTime(0);
player[idx].start();
} catch (Exception e) {
}
}
|
サウンドの再生開始位置を指定するにはsetMediaTime()メソッドを使います。
[Playerクラス] |
long setMediaTime(now)
now 再生開始位置(ミリ秒):long型
戻り値 実際の再生位置(ミリ秒):long型 |
サウンド停止。 |
サウンドファイルを再生させるにはstart()メソッドを呼びます。
[Playerクラス] |
void start() |
サウンド再生。 |
今回は使ってませんが、プレイヤーを破棄してメモリ解放するにはclose()メソッドを呼びます。
[Playerクラス] |
void close() |
メモリ解放する。 |
▼サウンドの停止
サウンドファイルを再生させるにはstart()メソッド、停止させるにはstop()メソッドを呼びます。
[Playerクラス] |
void stop() |
サウンド停止。 |
DanmakuCanvasクラスに追加したサウンドを停止する部分は次の通りです。
DanmakuCanvas.javaの一部
//サウンドの停止【追加】
private void stopSound(int idx) {
try {
player[idx].stop();
} catch (Exception e) {
}
}
|
▼おわりに
今回はこれでおしまいです。次回は「バイブレーションとブラウザ起動」について解説します。
|