給遊戲添加音樂

 J2me通過Mobile Media API 支持手機音頻,這是在特定類型的設備上支持不同程度的多媒體的類和接口的一個集合。更具體地說,Mobile Media API劃分爲兩個不同的API集合:
    一個是Mobile Media API,主要針對高級聲音和多媒體能力;另一個是MIDP2.0 Media API,主要針對支持唯一音頻的受限制的設備。很明顯,我們主要是討論後一部分。
    MIDP2.0 Media API 圍繞着2個主要的部分進行設計:管理器,播放器,和控制器。MIDP2.0 Media API都位於javax.microedition.media 和javax.microedition.media.control包中。其中管理器Manager位於media包中,它通過爲各種媒體類型創建播放器,從而使我們能夠查詢一個手機的媒體能力。播放器Player接口位於同一個包中,提供了一組通用的方法來控制音頻的回放。控制器Control接口位於media.control包中,用來進行特定類型的媒體控制,例如,VolumeControl用來控制音量,ToneControl用來控制樂音。

如果要想知道我們的手機對語音支持的能力,我們可以使用下面的代碼(只提供Canvas類):
import javax.microedition.lcdui.*;
import javax.microedition.media.*;
import javax.microedition.media.control.*;

public class SCCanvas extends Canvas {
  private Display  display;
  
  public SCCanvas(Display d) {
    super();
    display = d;
  }

  void start() {
    display.setCurrent(this);
    repaint();
  }

  public void paint(Graphics g) {
    // 清除畫布
    g.setColor(0, 0, 0);        
    g.fillRect(0, 0, getWidth(), getHeight());
    g.setColor(255, 255, 255);  

    // 得到手機支持的聲音的類型
    String[] contentTypes = Manager.getSupportedContentTypes(null);

    // 顯示所支持的聲音的類型
    int y = 0;
    for (int i = 0; i < contentTypes.length; i++) {
      // 顯示類型
      g.drawString(contentTypes[i], 0, y, Graphics.TOP | Graphics.LEFT);
      y += Font.getDefaultFont().getHeight();

      // 如果支持樂音生成器,播放樂音
      if (contentTypes[i] == "audio/x-tone-seq") {
        try {
          
          Manager.playTone(ToneControl.C4, 2000, 100);
        }
        catch(MediaException me) {
        }
      }
    }
  }
}

下面是MIDP2.0手機所支持的常見的音頻MIME類型:
audio/x-tone-seq  表示樂音和樂音序列;audio/x-wav表示聲波聲音;audio/midi表示midi音樂;audio/mpeg表示MP3音頻。

使用MIDP2.0 Media API的步驟:
(1)    使用Manager類獲得一個針對特定媒體類型的播放器。
(2)    使用Player接口在特定的播放器上播放媒體。
(3)    如果需要的話,使用Control接口來改變媒體的回放。

下面是一個播放樂音的例子:
byte tempo=50; // 設定聲音播放速度
      byte d=8; // 音調值

      byte C4=ToneControl.C4; //基準音調
      byte D4=(byte)(C4+2); //音調值
      byte E4=(byte)(C4+4);
      byte G4=(byte)(C4+7); 
      byte rest=ToneControl.SILENCE; //無聲

      byte[] mySequence=
      {
        ToneControl.VERSION,1,             //設置版本號,當前必須設爲1
        ToneControl.TEMPO,tempo,            //設置聲音播放速度,值越大,播放越快
        ToneControl.SET_VOLUME,100,        //設置音量,值越大,音量越大
        ToneControl.BLOCK_START,0,        //預定義播放塊,當前塊號爲0
        E4,d,D4,d,C4,d,E4,d,
        E4,d,E4,d,E4,d,rest,d,                //塊的內容
        ToneControl.BLOCK_END,0,         //塊定義結束符
        ToneControl.PLAY_BLOCK,0,         //播放當前塊號爲0的塊,塊號必須提前定義
        D4,d,D4,d,D4,d,rest,d,                //不使用塊號方式播放的內容,必須位於塊定義後面
      };

      //創建播放器
      Player p=Manager.createPlayer(Manager.TONE_DEVICE_LOCATOR);
      //準備播放信息
      p.realize();
      //獲取音調控制
      ToneControl c=(ToneControl)p.getControl("ToneControl");
      //設置音調序列
c.setSequence(mySequence);
//設置播放資源,獲取設備
      p.prefetch();
      //開始播放
      p.start();
    }
    catch(Exception e)
    {
    }


下面是一個播放音樂文件的例子:
try
{
      //從資源中獲取聲音
      InputStream is=getClass().getResourceAsStream("/"+"Testsound.mid");
      //創建播放MIDI聲音的播放器
      Player player=Manager.createPlayer(is,"audio/midi");
      //獲取播放信息
      player.realize();
      //獲取設備
      player.prefetch();
      //開始播放聲音
      player.start();

      VolumeControl control=(VolumeControl)player.getControl("VolumeControl"); //獲得控制接口,此接口的獲得必須在獲取播放信息或者獲取播放設備後面,如果在它們前面,將會出現無法播放聲音的情況
      if(control!=null) //必須檢查是否爲null,因爲有些聲音格式可能不支持音量控制
      {
        control.setLevel(5); //設置音量級別爲50
//control.setMute(true);                            //設置靜音
      }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章