/* iアプリ, MIDP でのサウンド Time-stamp: "2006/01/25 Wed 20:04 hig" Saburo Higuchi 2003-2005 http://www.math.ryukoku.ac.jp/~hig/ プログラム解説等 http://www.a.math.ryukoku.ac.jp/~hig/course/juniors_2005/07/ */ #if DOJA import com.nttdocomo.ui.*; #elif MIDP import javax.microedition.midlet.*; import javax.microedition.lcdui.*; #endif #if DOJA #elif VF import com.jblend.media.smaf.phrase.*; // SMAF/Phrase サウンドを使う #elif EZ import com.kddi.media.*; // SMAF などを使う #endif #if DOJA #elif MIDP #else // DoJa/MIDP Builder を使われる方へ: // まず, プログラムの先頭で, #define DOJA // などと定義する必要があります. // 以下の define 文は, #if - #endif の中に書かれていますので, // DoJa/MIDP Builder のプリプロセッサでは処理できません. // そこで, #if - #endif はやめて, // いらない方をJava の意味でコメント文にしてください. #endif #if DOJA #define MYALIGN +0 #define MYAP IApplication #define MYSTART start #define MYBLACK Graphics.getColorOfName(Graphics.BLACK) #define MYWHITE Graphics.getColorOfName(Graphics.WHITE) #define MYBLUE Graphics.getColorOfName(Graphics.BLUE) #define MYRED Graphics.getColorOfName(Graphics.RED) #define MYGREEN Graphics.getColorOfName(Graphics.GREEN) #define MYYELLOW Graphics.getColorOfName(Graphics.YELLOW) #define MYMAGENTA Graphics.getColorOfName(Graphics.MAROON) #define MYCYAN Graphics.getColorOfName(Graphics.AQUA) #define MYDIALOG Dialog #define MYLABEL Label #define MYADD add #define MYTEXT Text #elif MIDP #define MYALIGN ,Graphics.LEFT|Graphics.BOTTOM #define MYAP MIDlet #define MYSTART startApp #define MYBLACK 0,0,0 #define MYWHITE 255,255,255 #define MYBLUE 0,0,255 #define MYRED 255,0,0 #define MYGREEN 0,255,0 #define MYYELLOW 255,255,0 #define MYMAGENTA 255,0,255 #define MYCYAN 0,255,255 #define MYDIALOG Alert #define MYLABEL StringItem #define MYADD append #define MYTEXT String #endif /** IApplication または MIDlet を継承するクラス */ public class SoundSample extends MYAP { /** 起動するときに呼ばれる メソッド. 必須. */ #if DOJA public void start(){ SoundCanvas cc=new SoundCanvas(this); Display.setCurrent(cc); } #elif MIDP public void startApp(){ SoundCanvas cc = new SoundCanvas(this); Display.getDisplay(this).setCurrent(cc); } public void pauseApp(){} public void destroyApp(boolean unconditional){} #endif } class SoundCanvas extends Canvas #if DOJA #elif VF implements PhraseTrackListener #elif EZ implements MediaEventListener #endif { SoundSample parent; String message="123を押してね"; final int nfile=3; String [] filename; int initial=1; int melody; #if DOJA MediaSound [] ms; AudioPresenter ap; boolean onEmulator=true; #elif VF Phrase [] ms; PhraseTrack [] tr; PhrasePlayer ap; #elif EZ MediaPlayerBox ap; MediaResource [] tr; #endif SoundCanvas(SoundSample parent){ this.parent=parent; #if DOJA ap=AudioPresenter.getAudioPresenter(); ms = new MediaSound[nfile]; #elif VF ap= PhrasePlayer.getPlayer(); ms = new Phrase[nfile]; tr = new PhraseTrack[nfile]; #elif EZ tr = new MediaResource[nfile]; #endif // サウンドファイルの読み込み filename = new String [nfile]; #if DOJA if ( onEmulator ){ // DoJa 3.5(FOMA 900i)以降ではここをtrueにしてよい. // MIDI ファイル filename[0]="nozomi.mid"; filename[1]="hikari.mid"; filename[2]="hikaritotyu.mid"; } else { // iメロディ filename[0]="nozomi.mld"; filename[1]="hikari.mld"; filename[2]="hikaritotyu.mld"; } for(int i=0; i< nfile ; i++){ ms[i]=MediaManager.getSound("resource:///" + filename[i] ); } try{ for(int i=0; i< nfile ; i++){ ms[i].use(); } } catch (Exception e){ // e.printStackTrace(); } #elif VF // SMAF/Phrase のファイルを vodafone のサイト // http://developers.vodafone.jp/dp/tool_dl/soundlib/ // から download して res に入れよう filename[0]="jb2001.spf"; filename[1]="jse103.spf"; filename[2]="jse2102.spf"; try { for(int i=0; i=0 && initial < nfile ){ melody=initial; #if DOJA ap.setSound(ms[initial]); ap.play(); #elif VF tr[initial].play(); #elif EZ ap.setResource(tr[initial]); ap.play(); #endif } } public void paint(Graphics g){ g.setColor(MYWHITE); g.fillRect(0,0,getWidth(),getHeight()); // 画面を消す g.setColor(MYBLACK); g.drawString(message,0,getHeight() MYALIGN); } #if DOJA #elif VF // implements PhaseTrackListener ならこれが必要 public void eventOccurred(int event){ // 演奏終了などのイベント処理 } #elif EZ // implements MediaEventListener ならこれが必要 public void stateChanged(MediaPlayerBox source, int type, int option){ // 演奏終了などのイベント処理 } #endif #ifdef DOJA public void processEvent(int type, int param){ if( type==Display.KEY_PRESSED_EVENT && param==Display.KEY_1 ){ ap.stop(); ap.setSound(ms[0]); ap.play(); melody=0; message = "1キーが押された"; } else if ( type==Display.KEY_PRESSED_EVENT && param==Display.KEY_2 ){ ap.stop(); ap.setSound(ms[1]); ap.play(); melody=1; message = "2キーが押された"; } else if ( type==Display.KEY_PRESSED_EVENT && param==Display.KEY_3 ){ ap.stop(); ap.setSound(ms[2]); ap.play(); melody=2; message = "3キーが押された"; } repaint(); // paint メソッドを呼ぶ. } #elif VF /** ゲームアクション, キー が押されたとき */ protected synchronized void keyPressed(int keyCode){ if ( keyCode==KEY_NUM1 ){ // .stop() することもできるが, しないと重ねて鳴る tr[0].play(); message = "1キーが押された"; } else if ( keyCode==KEY_NUM2 ){ tr[1].play(); message = "2キーが押された"; } else if ( keyCode==KEY_NUM3 ){ tr[2].play(); message = "3キーが押された"; } repaint(); // paint メソッドを呼ぶ. } #elif EZ /** ゲームアクション, キー が押されたとき */ protected synchronized void keyPressed(int keyCode){ if ( keyCode==KEY_NUM1 ){ // .stop() することもできるが, しないと重ねて鳴る ap.stop(); ap.unsetResource(tr[melody]); ap.setResource(tr[0]); ap.play(); melody=0; message = "1キーが押された"; } else if ( keyCode==KEY_NUM2 ){ ap.stop(); ap.unsetResource(tr[melody]); ap.setResource(tr[1]); ap.play(); melody=1; message = "2キーが押された"; } else if ( keyCode==KEY_NUM3 ){ ap.stop(); ap.unsetResource(tr[melody]); ap.setResource(tr[2]); ap.play(); melody=2; message = "3キーが押された"; } repaint(); // paint メソッドを呼ぶ. } #endif #if DOJA #elif MIDP /** ゲームアクション, キー が離されたとき */ protected synchronized void keyReleased(int keyCode){ // これは検出しない. } /** ゲームアクション, キー が押されたままのとき */ protected synchronized void keyRepeated(int keyCode){ // これは検出しない. } #endif } /* Local Variables: mode: java End: */