Nokia 早期機型對 MMAPI (JSR 135) 支援不一,需針對不同平台採用專有 API 或標準 javax.microedition.media.Player。本文匯總三大機型族群的播放代碼與工程配置技巧。
使用 Nokia 專有 com.nokia.mid.sound.Sound,播放單音/和弦序列(十六進制字節陣列)。
import com.nokia.mid.sound.Sound;
private Sound sound;
private byte[] tone = {0x02,0x4a,0x3a,0x40,0x04,0x00,0x0b,0x28,0x83,0x28,0x28,0xd2,0x28,0x00};
void play() {
if (sound != null) { sound.stop(); sound = null; }
sound = new Sound(tone, Sound.FORMAT_TONE);
sound.setGain(255); // 音量 0-255
sound.play(1); // 循環 1 次
}
獲取音序字節碼:MIDI → Nokia Audio Converter (Nokia Developers Suite) → 輸出字節陣列。
WTK 整合:將 Nokia SDK lib/class.zip 中 com/nokia/mid/sound/Sound.class 解壓置入專案 lib/,打包時從 JAR 刪除該包並修正 JAD MIDlet-Jar-Size。
標準 Manager.createPlayer(InputStream, "audio/midi") 播放 MIDI 文件(置於 res/)。
import javax.microedition.media.*;
private Player player;
void playSound(String name) {
try {
if (player != null) { player.close(); player = null; }
player = Manager.createPlayer(getClass().getResourceAsStream("/"+name), "audio/midi");
player.addPlayerListener(this);
player.setLoopCount(1);
player.realize(); player.start();
} catch (Exception e) { e.printStackTrace(); }
}
public void playerUpdate(Player p, String event, Object data) {
if (PlayerListener.END_OF_MEDIA.equals(event)) { p.close(); }
else if (PlayerListener.CLOSED.equals(event)) { player = null; }
}
MIDlet pauseApp() 呼叫 Canvas stopTone():
// Canvas
void stopTone() { if (sound != null) sound.stop(); }
// MIDlet
public void pauseApp() {
if (canvas != null && soundEnabled) canvas.stopTone();
}
Sound.setGain() (0-255) vs Player.getVolumeControl()。