|
|
作者:微型爪哇人
?次?榇蠹医榻BMMAPI?鹊?我粜蛄胁シ殴δ堋?我?tone)是每一?手?C最基本的音效能力,因此MIDP 2.0就?定支援MIDP 2.0的手?C都必?提供?我舨シ诺哪芰Α_B?的?我??成了?我粜蛄校?梢杂?碜龀龊??蔚囊?贰
javax.microedition.midelt.control.ToneControl是一??特殊的Control介面,???介面?K不是提供??贸淌教厥獾拿襟w控制能力,而是用?碇付ㄒ?シ诺?我粜蛄?热荩??付?我粜蛄?热菘梢允褂?oneControl介面?任ㄒ坏姆椒ǎ
public void setSequence(byte[] sequence)
?定?我粜蛄械?热??equence位元??列
因??我粜蛄械?layer物件?K?o法利用在createPlayer()方法?戎付?襟w的?源位址?懋a生,因此在Manager??e中定?了一??特殊的媒?定位子TONE_DEVICE_LOCATOR?懋a生?我粜蛄械?layer物件,使用的方式如下:
Player player = Manager.createPlayer(Manager.TONE_DEVICE_LOCATOR);
一但?我粜蛄械?layer?入REALIZED??B,就可以呼叫ToneControl介面提供的setSequence ()方法?定?我粜蛄械?热菀怨┽崂m播放。MIDP 媒?套件/MMAPI定?了?我粜蛄械母袷??剩?我粜蛄匈Y料必?依照???格式?定才能正?的播放出?恚?绻?我粜蛄惺?Υ嬖谖淖?n?龋???n案的附?n名???ts(Java Tone Sequence),而????IME?型???udio/x-tone-seq。?我粜蛄械母袷蕉?x如下:
?我粜蛄 = 版本?? + ?奏控制 + 音符?度解析度定? + 不定?的康?我粜蛄匈Y料?^?K + 不定?的康牟シ攀录
首先是?祟^?^的部分,?祟^?^由三??部分?成,分?e是版本??、?奏控制以及音符?度的解析度。版本??利用??e常??ERSION指定,?接著一??表示版本??的?底郑还?奏控制利用??e常??EMPO?碇付ǎ?崦娼又??奏的定?,以4bpm(beat per minute)??挝唬?????到127之?,亦即如果?奏控制指定??0,表示每分?80拍,如果?奏控制指定??0,表示每分?200拍;音符?度解析度定?利用??e常??ESOLUTION?碇付ǎ?崦娼又?舴?L度解析度的定?。在?我粜蛄兄校?舴?L度的?定是以tick??挝唬??ick???的?度就是利用RESOLUTION?矶?x,如果解析度指定??表示一??tick的?度是1/1音符的?度,解析度指定??表示一??tick的?度是1/8音符的?度,以此?推。音符?度解析度????到127之?。
接著是?我粜蛄匈Y料部分,?我粜蛄匈Y料由不定?盗康牟シ攀录??我粜蛄匈Y料?^?K?成,播放事件包括?我羰录?筒シ趴刂剖录?R???我羰录?梢舴?笮〖伴L度?成,ToneControl介面定?了一????e常??4(中?C)作?榛?手担?渌?囊舴?笮】梢愿??cC4的半音?挡钪?砣〉茫???4和C4差???全音(四??半音),所以E4 = C4 + 4,而F4和C4差五??半音,所以F4 = C4 +5,另一??相?的??e常?凳?ILENCE,代表休止符。音符?度?t是以一??tick?r???挝坏恼?当丁2シ趴刂瓢?ㄒ袅吭O定、反覆控制??^?K播放,音量?定利用??e常??ET_VOLUME指定,後面接著音量百分比,????%(?o?)到100%(最大?)之?;反覆控制?t是利用??e常??EPEAT指定,後面?t跟著反覆的次?导耙??要反覆的?我羰录??^?K播放?t是??e常??LAY_BLOCK後面跟著一???我粜蛄匈Y料?^?K??就能播放??^?K的?我粜蛄小
?榱撕?化?料?热荩??斗锤渤霈F的?我粜蛄匈Y料可以放在?我粜蛄匈Y料?^?K?龋?我粜蛄匈Y料?^?K的起始位置由??e常??LOCK_START?碇付ǎ?o接著一???底直硎驹??料?^?K的??e??(0~127),?束位置由??e常??LOCK_END?碇付ǎ??泳o接著?料?^?K的??e??。如果要播放????^?K的?热荩?梢栽诓シ攀录?扔妙??e常??LOCK_START加上??^?K的??e??即可。
下面我??利用一???例?聿シ判∶鄯涞?我粜蛄校
?例9-4
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.media.*;
import javax.microedition.media.control.*;
public class TonePlayer extends MIDlet implements CommandListener{
Player player;
Display display;
Form form;
Command exitCmd, closeCmd, stopCmd, startCmd;
ToneControl tControl;
byte tempo = (byte)15;
byte resolution = (byte)32;
byte C4 = (byte)ToneControl.C4;
byte D4 = (byte)(C4 + 2);
byte E4 = (byte)(C4 + 4);
byte F4 = (byte)(C4 + 5);
byte G4 = (byte)(C4 + 7);
byte[] toneData = {
ToneControl.VERSION, 1, ToneControl.TEMPO, tempo,
ToneControl.RESOLUTION, resolution,
G4, 4, E4, 4, E4, 8, F4, 4, D4, 4, D4, 8,
C4, 4, D4, 4, E4, 4, F4, 4, G4, 4, G4, 4, G4, 8,
G4, 4, E4, 4, E4, 8, F4, 4, D4, 4, D4, 8,
C4, 4, E4, 4, G4, 4, G4, 4, E4, 16,
D4, 4, D4, 4, D4, 4, D4, 4, D4, 4, E4, 4, F4, 8,
E4, 4, E4, 4, E4, 4, E4, 4, E4, 4, F4, 4, G4, 8,
G4, 4, E4, 4, E4, 8, F4, 4, D4, 4, D4, 8,
C4, 4, E4, 4, G4, 4, G4, 4, C4, 16
};
public TonePlayer(){
display = Display.getDisplay(this);
form = new Form("MediaQuery");
try{
player = Manager.createPlayer(Manager.TONE_DEVICE_LOCATOR);
}
catch(Exception ex){}
exitCmd = new Command("??", Command.EXIT, 1);
closeCmd = new Command("??", Command.SCREEN, 1);
startCmd = new Command("播放", Command.SCREEN, 2);
stopCmd = new Command("停止", Command.SCREEN, 3);
form.addCommand(exitCmd);
form.addCommand(stopCmd);
form.addCommand(startCmd);
form.addCommand(closeCmd);
form.setCommandListener(this);
}
public void startApp(){
display.setCurrent(form);
try{
player.realize();
tControl = (ToneControl)player.getControl("ToneControl");
if(tControl != null){
tControl.setSequence(toneData);
player.start();
}
}
catch(Exception ex){}
}
public void pauseApp(){}
public void destroyApp(boolean unconditional){}
public void commandAction(Command c, Displayable d){
if(c == exitCmd){
destroyApp(true);
notifyDestroyed();
}
else if(c == stopCmd){
try{
player.stop();
}
catch(Exception ex){}
}
else if(c == startCmd){
try{
player.start();
}
catch(Exception ex){}
}
else if(c == closeCmd){
try{
player.close();
}
catch(Exception ex){}
}
}
}
小蜜蜂的??是:
│5 3 3 -│4 2 2 -│1 2 3 4│5 5 5 -│
│5 3 3 -│4 2 2 -│1 3 5 5│3 - - -│
│2 2 2 2│2 3 4 -│3 3 3 3│3 4 5 -│
│5 3 3 -│4 2 2 -│1 3 5 5│1 - - -│
有?]有?到熟悉的小蜜蜂音?纺?假??者都看的懂??,我??利用Do也就是中?C(ToneControl.C4,也就是??中的1)?碜骰?识?x其他音符。音符的?抵得坎钜???挝痪褪遣钜??半音,所以Do和Re差???半音所以Re(D4)=C4+2,而Fa和Do差5??半音,所以Fa(F4)=C4+5。?拍的部分我??可以自己定?,例如????例定?的就是15,亦即每分?60拍,解析度?t是1/32。值得注意的是,在?我粜蛄胁シ牌髦胁荒苁褂?refetch()方法,否?t??G出MediaException例外,?是一??很特殊的特例。
|
|