MIDP 1.0 時代雖有廠商自行實現的 MPEG 播放器,但缺乏統一 API 導致開發者難以整合。MMAPI(JSR 135)雖功能強大,但針對高階裝置。MIDP 2.0 內建的 javax.microedition.media 套件,專為資源受限裝置設計,提供音調合成、基礎播放控制、音量調節、內容查詢四大核心能力,成為行動遊戲音效開發的標準基石。

// 從網路 URL 播放
try {
Player p = Manager.createPlayer("https://example.com/bgm.mid");
p.realize(); p.prefetch(); p.start();
} catch (IOException | MediaException e) { e.printStackTrace(); }
// 從 JAR 內部資源播放
try {
InputStream is = getClass().getResourceAsStream("/sfx/jump.wav");
Player p = Manager.createPlayer(is, "audio/x-wav");
p.start();
} catch (IOException | MediaException e) { e.printStackTrace(); }
最佳實踐:遊戲啟動時預載常用音效 prefetch(),減少首次播放延遲;關卡切換時 close() 釋放資源。
// 參數:音高(C4=中音Do)、持續時間(ms)、音量(0-100)
Manager.playTone(ToneControl.C4, 200, 80);
音高常數定義於 ToneControl:C4~B5 涵蓋兩個八度,SILENCE 代表靜音。適合簡單 UI 回饋,無需額外音檔體積。
byte[] sequence = {
ToneControl.VERSION, 1,
ToneControl.TEMPO, 60, // 60 BPM
ToneControl.BLOCK_START, 0, // A 段落
ToneControl.C4, 8, ToneControl.D4, 8, ToneControl.E4, 8, ToneControl.C4, 8,
ToneControl.BLOCK_END, 0,
ToneControl.BLOCK_START, 1, // B 段落
ToneControl.E4, 8, ToneControl.F4, 8, ToneControl.G4, 8, ToneControl.E4, 8,
ToneControl.BLOCK_END, 1,
ToneControl.PLAY_BLOCK, 0, // 播放 A
ToneControl.PLAY_BLOCK, 1, // 播放 B
ToneControl.PLAY_BLOCK, 0 // 重複 A
};
Player p = Manager.createPlayer(Manager.TONE_DEVICE_LOCATOR);
p.realize();
ToneControl tc = (ToneControl) p.getControl("ToneControl");
tc.setSequence(sequence);
p.start();
序列格式解析:版本、速度、區塊定義(音符+時值成對)、播放指令。音符以半音為單位偏移 C4,時值單位由 TEMPO 定義。支援區塊巢狀、重複、靜音,可構建完整樂曲。
| 場景 | 推薦模式 | 理由 |
|---|---|---|
| 背景音樂(BGM) | 模式一(MIDI/AMR)或模式三 | 體積小、支援循環、模式三零資源檔 |
| 音效(SFX):跳躍、射擊、爆炸 | 模式一(WAV/PCM) | 低延遲、可疊加多聲道 |
| UI 回饋:按鍵、選單切換 | 模式二 | 零體積、即時響應 |
| 動態配樂:戰鬥強度分層 | 模式三 + 區塊切換 | 無縫切換音樂段落 |
Manager.getSupportedContentTypes(null)、Manager.getSupportedProtocols("audio/midi") 部署前必查。close(),避免原生資源洩漏導致 OOM。MIDP 2.0 Media API 雖不支援視頻,但為行動遊戲提供了「零資源合成、輕量串流播放、程式化樂曲排序」三位一體的音效工具箱。善用 ToneControl 序列機制,開發者能在極小 JAR 體積內內建豐富配樂;搭配少量採樣音效,即可構建沉浸式聽覺體驗。這正是資源受限平台上「以技巧換空間」的經典範例。