首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

Nokia UI API 聲音處理實戰:Sound 類別與音頻播放完整指南

     編輯:J2ME

Nokia Sound API 基礎

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。

Sound 建構子與播放控制

// 建構子 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()

音樂頻率對照表(部分)

音名頻率音名頻率音名頻率
C0262C1523C21047
D0294D1587D21175
E0330E1659E21319
F0349F1698F21397
G0392G1784G21568
A0440A1880A21760
B0494B1988B21976

完整表涵蓋 C0 (262Hz) 至 G5 (12544Hz),含升半音 (如 C0b=277Hz)。

互動鋼琴範例:按鍵觸發音調

ToneCanvas:處理按鍵事件與顯示

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);
    }
}

TonePlayer:封裝 Sound 播放邏輯

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(); }
}

主 MIDlet

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(); }
}

實務提醒

  • Sound 資源有限,播放前檢查 getConcurrentSoundCount() 避免超出並行限制
  • 合成音調適用於按鍵音、簡單遊戲音效;複雜音樂建議使用 MMAPI (JSR 135) 播放 MIDI/WAV
  • Nokia S40 系列喇叭音質較差,音量大時易破音,遊戲中可考慮提供靜音選項
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved