▼MIDP2.0メモ▼
サウンドファイル(mid/wav)を同時再生する


サウンドファイルを再生するプログラム。



サウンドファイルの準備

プレイヤーの状態


「REALIZED」はサウンドデータをメモリに読み込んで置く時に利用。
メモリの許す限り生成可能。

「PREFETCHED」と「STARTED」の和は同時発音数以下でなければならない。
別の音を再生したい時は、CLOSEするかREALIZEに戻す。
ボリュームの指定は「PREFETCHED」で行う。

メモリフラグメンテーションが発生しやすい端末(T)では、
CLOSEせずに「REALIZE←→PREFETCHED←→STARTED」を遷移させて
メモリの読み込みと解放を抑えるとよい。


プログラム
PlayerEx.java
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

//サウンドを同時再生する(本体)
public class PlayerEx extends MIDlet {
    static PlayerCanvas c;

    //コンストラクタ
    public PlayerEx() {
        c=new PlayerCanvas();
        Display.getDisplay(this).setCurrent(c);
    }

    //アプリの開始
    public void startApp() {
    }

    //アプリの一時停止
    public void pauseApp() {
    }

    //アプリの終了
    public void destroyApp(boolean flag) {
    }
}


PlayerCanvas.java
import javax.microedition.media.*;
import javax.microedition.media.control.*;
import javax.microedition.lcdui.*;
import java.io.*;

//サウンドを同時再生する(キャンバス)
class PlayerCanvas extends Canvas {
    //プレイヤー
    private Player[] sound =new Player[5];//サウンド
    private int      volume=100;          //ボリューム

    //コンストラクタ
    PlayerCanvas() {
        try {
            sound[0]=readSound("audio/midi","bgm0.mid");
            for (int i=0;i<4;i++) {
                sound[i+1]=readSound("audio/x-wav","se"+i+".wav");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    //サウンド読み込み
    private Player readSound(String type,String name) 
        throws Exception {
        Player      sound=null;
        InputStream in   =null;
        try {
            in=getClass().getResourceAsStream(name);
            sound=Manager.createPlayer(in,type);
            sound.prefetch();
            return sound;
        } catch (Exception e) {
            System.out.println(e.toString());
            try {
                if (in!=null) in.close();
            } catch (Exception e2) {
            }
            throw e;
        }
    }
    
    //サウンド再生
    private void playSound(int idx) {
        stopSound(idx);
        try {
            //ボリューム指定
            VolumeControl vc=(VolumeControl)
                sound[idx].getControl("VolumeControl");
            vc.setLevel(volume);

            //再生
            sound[idx].setLoopCount(2);
            sound[idx].setMediaTime(0);
            sound[idx].start();
        } catch (Exception e) {
        }
    }

    //サウンド停止
    private void stopSound(int idx) {
        try {
            sound[idx].stop();
        } catch (Exception e) {
        }
    }

    //描画
    public void paint(Graphics g) {
        g.setColor(255,255,255);
        g.fillRect(0,0,getWidth(),getHeight());
        g.setColor(0,0,0);
        g.drawString("PlayerEx",   0,0,   g.LEFT|g.TOP);
        g.drawString("0キー:bgm0.mid",0,24*1,g.LEFT|g.TOP);
        g.drawString("1キー:se0.wav", 0,24*2,g.LEFT|g.TOP);
        g.drawString("2キー:se1.wav", 0,24*3,g.LEFT|g.TOP);
        g.drawString("3キー:se2.wav", 0,24*4,g.LEFT|g.TOP);
        g.drawString("4キー:se3.wav", 0,24*5,g.LEFT|g.TOP);
        g.drawString("5キー:se4.wav", 0,24*6,g.LEFT|g.TOP);
    }

    //キープレスイベント
    public void keyPressed(int keyCode) {
        if (keyCode==0) return;
        switch(keyCode) {
        case KEY_NUM0: playSound(0);break;
        case KEY_NUM1: playSound(1);break;
        case KEY_NUM2: playSound(2);break;
        case KEY_NUM3: playSound(3);break;
        case KEY_NUM4: playSound(4);break;
        }
    }
}

S!アプリ(3GC)のJADファイル
PlayerEx.jad
MIDlet-1: PlayerEx, , PlayerEx
MIDlet-Jar-Size: 25147
MIDlet-Jar-URL: PlayerEx.jar
MIDlet-Name: PlayerEx
MIDlet-Vendor: My Vendor
MIDlet-Version: 1.0
MicroEdition-Profile: MIDP-2.0
MicroEdition-Configuration: CLDC-1.1
MIDxlet-ScreenSize: 240,260



−戻る−