com.nokia.mid.sound.Sound 封裝聲音播放功能。支援格式與並行播放數量因裝置而異,可透過以下方法查詢:
int[] formats = Sound.getSupportedFormats(); // 回傳支援格式常數陣列
int count = Sound.getConcurrentSoundCount(format); // 指定格式的並行播放數
public class SoundTest extends MIDlet {
protected void startApp() {
Form form = new Form("Nokia Sound");
int[] formats = Sound.getSupportedFormats();
if (formats.length == 0) {
form.append("No audio format supported!");
} else {
for (int f : formats) {
form.append(f + " : " + Sound.getConcurrentSoundCount(f));
}
}
Display.getDisplay(this).setCurrent(form);
}
// pauseApp, destroyApp 略
}
於 Nokia 6108 實測:支援單音 (format=1),並行播放數=1。
// 建構子 1:從位元組資料建立(支援特定格式)
Sound(byte[] data, int type)
// 建構子 2:合成音調(頻率 Hz、持續時間毫秒)
Sound(int freq, long duration)
// 初始化/重設音調
void init(int freq, long duration)
// 播放控制
void play(int loopCount) // loopCount=1 播放一次,-1 循環
void stop()
| 音名 | 頻率 | 音名 | 頻率 | 音名 | 頻率 |
|---|---|---|---|---|---|
| C0 | 262 | C1 | 523 | C2 | 1047 |
| D0 | 294 | D1 | 587 | D2 | 1175 |
| E0 | 330 | E1 | 659 | E2 | 1319 |
| F0 | 349 | F1 | 698 | F2 | 1397 |
| G0 | 392 | G1 | 784 | G2 | 1568 |
| A0 | 440 | A1 | 880 | A2 | 1760 |
| B0 | 494 | B1 | 988 | B2 | 1976 |
完整表涵蓋 C0 (262Hz) 至 G5 (12544Hz),含升半音 (如 C0b=277Hz)。
public class TonesCanvas extends FullCanvas {
private static final int[][] FREQ = {
{523, 554}, {587, 622}, {659, 659}, {698, 740},
{784, 831}, {880, 932}, {988, 988}, {1047, 1109},
{1175, 1245}, {1319, 1319}, {1397, 1480}
}; // [按鍵 0-10][自然/升半音]
private TonePlayer player = new TonePlayer();
private int pressNum = -1;
private boolean sharp = false;
protected void keyPressed(int keyCode) {
if (keyCode == Canvas.KEY_POUND) { sharp = !sharp; return; }
int idx = keyCode - Canvas.KEY_NUM0; // 0-9
if (keyCode == Canvas.KEY_STAR) idx = 10;
if (idx >= 0 && idx <= 10) {
pressNum = idx;
player.play(FREQ[idx][sharp ? 1 : 0]);
}
repaint();
}
protected void keyReleased(int keyCode) {
if (keyCode == Canvas.KEY_POUND) return;
int idx = keyCode - Canvas.KEY_NUM0;
if (keyCode == Canvas.KEY_STAR) idx = 10;
if (idx == pressNum) {
pressNum = -1;
player.stop();
}
repaint();
}
protected void paint(Graphics g) {
if (pressNum == -1) return;
g.setColor(0x80FF12);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(0x7C7C00);
g.drawString(pressNum + (sharp ? "#" : ""), getWidth()/2, getHeight()/2,
Graphics.LEFT | Graphics.TOP);
}
}
public class TonePlayer {
private Sound sound = new Sound(0, 2000); // 2 秒預設長度
public void play(int freq) {
sound.init(freq, 2000);
sound.play(1);
}
public void stop() { sound.stop(); }
}
public class TonesMIDlet extends MIDlet {
private TonesCanvas canvas = new TonesCanvas();
protected void startApp() { Display.getDisplay(this).setCurrent(canvas); }
protected void pauseApp() {}
protected void destroyApp(boolean u) { notifyDestroyed(); }
}
getConcurrentSoundCount() 避免超出並行限制