您当前的位置:五五电子网电子知识单片机-工控设备嵌入式系统-技术如何制作JAVA手机的N800的音乐播放功能 正文
如何制作JAVA手机的N800的音乐播放功能

如何制作JAVA手机的N800的音乐播放功能

点击数:7584 次   录入时间:03-04 11:43:15   整理:http://www.55dianzi.com   嵌入式系统-技术

    ■引 言

    在上一讲中我们讲述的是如何制作JAVA手机多媒体功能中的动画,本讲中我们将介绍如何制作JAVA手机的另一个多媒体功能——声音,即N800的音乐播放功能。若是在动画上再配以音乐播放功能,就能制作出具有丰富表现力的应用程序了。

    ■音乐播放

    现在我们利用MIDP应用程序播放音乐。但是,MIDP标准API不支持声音播放功能。机种不同,则声音播放方法也不同,所以每个厂商都会使用他们各自扩展的API。N800使用NEC扩展的API,所以能用MIDP应用程序播放声音。

    ■N800的音乐播放功能

    N800只能播放SMF(format0)格式的音乐数据,最大文件尺寸为10Kbyte。SMF格式即StandardMIDIFile的缩略语,就是为了能实现互换性而设定的文件形式,互换性是指在不同的应用程序中也具有能处理数据的特性。SMF分为format0和format1两种格式。N800所采用的是format0格式。这两种格式具有以下不同特点。(表1)

    format0Midi的16频声音收录在1个磁道上的形式

    format1不限制磁道数量的形式

    表1

    ■播放音乐

    接下来我们实际操作读取文件播放音乐的功能。

    ●音乐数据的读取

    利用扩展API上的Media类的statIC方法读取音乐数据。自变量中记述了音乐数据文件的通过。AudioClipaudio=Media.getAudioClip(“/test.mid”);

    另外,能够从web上获得音乐数,并且能够从RMS中得到音乐数据。但,由于形式相同,这里就不特别讲述了。详细情况请参考扩展API文档。

    ●播放

    播放读取的音乐数据。使用AudioClip例子(在这称为audio)play方法播放。

    audio.play();

    而且也能同时播放两个以上的音乐数据。此时,使用AudioClip例子(在这称为audio1、audio2)play方法播放。

    audio1.play();

    audio2.play();

    上述情况下能够同时播放audio1,audio2。

    ●停止

    能够暂停音乐的播放。使用AudioClip例子的stop方法能够停止。

    audio.stop();

    ●其他功能

    AudioClip定义了读取其他音乐数据信息的方法和决定反复播放次数的方法。(表2)

    getChannel()取得音乐数据的频数

    getLapsedTime()以MS为单位取得所演奏的音乐数据的播放时间

    getTempo()取得音乐数据的速度

    getTime()取得音乐数据的播放时间

    setLoopCount(iNTCount)设定演奏的音乐数据的反复播放次数

    表2

    ■音频事件

    音频演奏过程中,演奏开始时、停止时、结束时都会发生音频事件,能定义此时的处理。要定义音频事件发生时的处理,有必要安装AudioListener接口和记述audioAction方法内的处理。

    然后,使用AudioClip对象的addAudioListener方法进入AudioListener。

    publiCClassAudioTestimplementsAudioListener{

    /**

    *构造函数

    **/

    publicAudioTest(){

    AudioClipaudio=Media.getAudioClip("/test.mid");//读取音乐数据

    audio.addAudioListener(this);//注册audio事务监听器

    }

    /**

    *音频事件的处理

    **/

    publicvoidaudioAction(AudioClipsound,intevent,intparam){

    //记述处理

    •

    •

    }

    }

    ex.1

    记述处理的audioAction方法的自变量如下所示。

    AudioClipsound传递事件发生来源的对象

    intevent传递事件的种类

    intparam传递事件的参数。由于事件不同,则参数的意思也不同。不包含参数的事件的情况下,只传递0

    表3

    此外,事件的种类(audioAction方法的自变量、事件)在AudioListener接口文件夹中定义如下。(表4)

    staticintAUDIO_COMPLETE表示音乐播放结束

    staticintAUDIO_STARTED表示音乐播放开始

    staticintAUDIO_COMPLETE表示音乐播放停止

    表4

    以下展示的是只播放音频数据的简单范例。

    importjavax.microedition.LCDui.Display;

    importjavax.microedition.midlet.MIDlet;

    importjavax.microedition.midlet.MIDletStateChangeException;

    /**

    *音乐播放的简单范例

    */

    publicclassAudioextendsMIDlet{

    Displaydisplay;

    AudioCANvascanvas;

    /**

    *构造函数

    */

    publicAudio(){

    canvas=newAudioCanvas();

    display=Display.getDisplay(this);

    }

    protectedvoidstartApp()throwsMIDletStateChangeException{

    display.setCurrent(canvas);

    }

    protectedvoidpauseApp(){}

    protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{}

    }

    importjavax.microedition.lcdui.*;

    importcom.nec.media.*;

    /**

    *音频canvas

    **/

    publicclassAudioCanvas

    extendsCanvas

    implementsRunnable,CommandListener,AudioListener{

    CommandSTART=newCommand("play",Command.OK,0);

    CommandSTOP=newCommand("stop",Command.OK,0);

    AudioClipa;//音乐数据

    Threadth;

    /**

    *构造函数

    **/

    publicAudioCanvas(){

    a=Media.getAudioClip("/_test.mid");//读取音乐数据

    a.addAudioListener(this);//注册AudioListener

    this.addCommand(START);

    this.addCommand(STOP);

    this.setCommandListener(this);

    th=newThread(this);

    th.start();

    }

    /**

    *音频事件的处理

    */

    publicvoidaudioAction(AudioClipsound,intevent,intparam){

    if(sound==a){

    if(event==AudioListener.AUDIO_COMPLETE){

    sound.play();

    }

    }

    }

    /**

    *描绘处理



www.55dianzi.com

    */

    protectedvoidpaint(GraphICsg){

    g.setColor(255,255,255);

    g.fillRect(0,0,getHeight(),getWidth());

    g.setColor(0,0,0);

    g.drawString("MusicPlay?",50,52,Graphics.TOP|Graphics.LEFT);

    g.drawString(

    "channel="+a.getChannel(),

    30,

    64,

    Graphics.TOP|Graphics.LEFT);

    g.drawString(

    "lapsedtime="+a.getLapsedTime(),

    30,

    76,

    Graphics.TOP|Graphics.LEFT);

    g.drawString(

    "tempo="+a.getTempo(),

    30,

    88,

    Graphics.TOP|Graphics.LEFT);

    g.drawString(

    "time="+a.getTime(),

    30,

    100,

    Graphics.TOP|Graphics.LEFT);

    }

    /**

    *命令事件的处理

    */

    publicvoidcommanDACtion(Commandc,DisplayabLED){

    System.out.println("test");

    if(c.equals(START)){

    a.play();

    }elseif(c.equals(STOP)){

    a.stop();

[1] [2] [3] [4]  下一页


本文关键字:如何  制作  手机  音乐播放  Java  嵌入式系统-技术单片机-工控设备 - 嵌入式系统-技术