6 Midiファイルを再生する     

ゲームなどでは音声が必要です。そこで、音声を再生する方法として
わりと扱いが楽な、Midiファイルを再生する方法を説明します。

Midiファアイルを再生する
Midiファイルを再生するのは、CDを聞くのに似て言います。その対比を以下の表に示します。

No CDの再生 Midiの再生 ソースの例
プレーヤを用意する シーケンサーを用意する sequencer = MidiSystem.getSequencer();
プレーヤを設定する シーケンサーを設定する sequencer.setLoopCount
(Sequencer.LOOP_CONTINUOUSLY);
プレーヤのフタをあける シーケンサーをオープンする sequencer.open();//操作を可能にする
CDを取り出す シーケンスを取得する Sequence sequence=MidiSystem.getSequence(in);
CDをプレーヤにセットする シーケンスをシーケンサーに
セットする。
sequencer.setSequence(sequence);
プレーヤのスタートボタンを押す シーケンサーをスタートさせる sequencer.start();
演奏中 演奏中
演奏中であることを確認し、
プレーヤ停止させる
演奏中であることを確認し、
シーケンサを停止させる。
if (sequencer.isRunning())
   sequencer.stop();
CDプレーヤーをシーケンサー、CDをシーケンスと考えるとほぼ同じ手順です。あとは実際に行うか、ソースファイルに手順
を書かいてパソコンで実行してもらうかだけです。以下詳しく説明します。
@ import文
import javax.sound.midi.*;
が必要です。
A シーケンサーの用意
 シーケンサーはMidiファイルを再生する機能があります。シーケンサは
  Sequencer型変数=MidiSystem.getSequencer();
でSequencer型変数に取得できます。以下の例はSequencer型変数sequencerに、シーケンサーを取得します。
 sequencer = MidiSystem.getSequencer();
なおMidiUnavailableException例外処理が必要です。
B シーケンサーを設定する
必要に応じシーケンサーの再生回数などを設定します。
 Sequencer型変数..setLoopCount(再生回数);
で再生回数をセットします。なお、再生回数を
 Sequencer.LOOP_CONTINUOUSLY
にすると停止の指令があるまで、演奏を続けます。ゲームなどには便利な機能です。
C シーケンサーをオープンする
 Sequencer型変数.open();
でシーケンサーをオープンします。以下の例はSequencer型変数sequencerをオープンします。
 sequencer.open();
なおMidiUnavailableExceptionの例外処理が必要です。A〜Cを例外処理も含め記述するとこんな感じになりました。
    try{
       sequencer = MidiSystem.getSequencer();//Sequencerを取得
       sequencer.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);//無限ループを設定
       sequencer.open();//操作を可能にする
    }catch(MidiUnavailableException e){
      //例外処理
    }
D シーケンス(音源)を取得する
 Sequencer型変数=MidiSystem.getSequence(InputStream型変数);
で、InputStreamで、アプリと結ばれたファイルからシーケンス(音源)を取得します。以下の例はSequence型変数
sequenceを宣言し、InputStream型変数inを使いシーケンスを取得します。
 Sequence sequence=MidiSystem.getSequence(in);
なお、この処理には「InvalidMidiDataException」と「IOException」の例外処理が必要ですが、これをまとめて単に
「Exception」の例外処理で処理することができます。
E シーケンス(音源)をシーケンサーにセットする
 Sequencer型変数.setSequence(Sequencer型の値);
でSequencer型変数セットされたシーケンサーにSequencer型の値を音源としてセットできます。以下の例は
Sequencer型変数sequencerに、Sequence型変数 sequenceを「音源」としてセットします。
 sequencer.setSequence(sequence);
この処理には「InvalidMidiDataException」の例外処理が必要ですが[Exception」例外処理で代用できます(殆どの
例外処理はExceptionで代用できます)。
F 再生の開始
 Sequencer型変数start();
で再生を開始します。以下の例は、Sequencer型変数sequencerの再生を開始します。
 sequencer.start();
またD〜Fをまとめた例を以下に示します。この例ではnameでmidiファイルを指定しています。
  try{
    FileInputStream in=new FileInputStream(name);//midfileとシーケンサーを繋ぐ
    Sequence sequence=MidiSystem.getSequence(in);//音源の取り込み
    in.close();//ファイルをクローズ
    sequencer.setSequence(sequence);//音源セット
    sequencer.start();//再生開始
  }catch(Exception e){
    //例外処理
  }
G 再生の有無を確認し再生を停止する
 if (Sequencer型変数.isRunning()){
   //再生をしているときの処理
 }
で「//再生をしているときの処理」の部分を実行します。
また
 Sequencer型変数.stop();
で再生を停止します。以下の例は、Sequencer型変数sequenceが再生中なら演奏を停止します。
if (sequencer.isRunning()){
   sequencer.stop(); //再生中なら停止する。
}
H 不要になったシケーンサーをクローズする
 Sequencer型変数.close();
で不用になったシーケンサーはクローズします。以下の例はSequencer型変数sequencerをclose()します。
 sequencer.close();

時間待ち
ただ単に音声をだしたいなどの場合、アプリは音声を再生してから終了までの間は動作を止める必要があります。
  Thread,sleep(long型の値);
で、long型の値で指定された時間だけ、アプリの動作を停止させ時間待ちをさせることできます。この処理には
InterruptedExceptionの例外処理が必要です。もし、たびたび時間待ちをするようであれり、例外処理をいちいちかくのが
面倒であれば例外処理の以下のようなメソッドを作り、必要に応じ実行(呼び出す)のも手だと思います。
  static void sleep(long t){
    try{//InterruptedException 例外処理が必要
      Thread.sleep(t);//時間待ち
    }catch(InterruptedException e){
      //例外が発生しら、表示をする
      System.out.println("Err="+e);
    }
  }


サンプルソース
以下にサンプルソースを示します。なお、midiを再生するだけなので、実行結果はありません。
//
//  Midiファイルのデモの例です。
//
import java.io.*;//外部からデータを取り込みに必要
import javax.sound.midi.*;//Midiの扱いに必要

public class MidiDemo {
  public static void main(String args[]){
    MidiFilePlayer player=new MidiFilePlayer();//プレイヤーを準備
    player.play("ceremo.mid");//「ceremo.mid」を再生
    sleep(2000);//2秒待ち
    player.stop();//再生停止
    player.play("cooking.mid");//「cooking.mid」を再生
    sleep(2000);//2秒待ち
    player.bye();//終了処理
    System.exit(0);//アプリの終了
  }

  //
  // 時間待ち(t mSec)
  //
  static void sleep(long t){
    try{//InterruptedException 例外処理が必要
      Thread.sleep(t);//時間待ち
    }catch(InterruptedException e){
      //例外が発生しら、表示をする
      System.out.println("Err="+e);
    }
  }
}

//
//  midiファイルを再生するためのクラス MidiFilePlayer
//
class MidiFilePlayer{
  Sequencer sequencer;//実際にMidiを再生するプレイヤーです。

  //コンストラクタ(実際に音を演奏するSequencerを取得・設定する。
  MidiFilePlayer(){
    try{
       sequencer = MidiSystem.getSequencer();//Sequencerを取得
       sequencer.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);//無限ループを設定
       sequencer.open();//操作を可能にする
    }catch(MidiUnavailableException e){
      //例外処理(エラーを表示するだけ)
      System.out.println("Err="+e);
    }
  }

  //nameで指定したmidiファイルを再生する
  void play(String name){
    try{
      FileInputStream in=new FileInputStream(name);//midfileとアプリを繋ぐ
      Sequence sequence=MidiSystem.getSequence(in);//音源の取り込み
      in.close();//ファイルをクローズ
      sequencer.setSequence(sequence);//音源セット
      sequencer.start();//再生開始
    }catch(Exception e){//複数の例外処理が必要なので、Exceptionでまとめた
      //例外処理(表示するけ)
      System.out.println("Err ="+e);
    }
  }

  //再生を停止する。
  void stop(){
      if (sequencer.isRunning()){
        sequencer.stop();
      }
  }

  //シーケンサーを解放する。
  void bye(){
    stop();//停止
    sequencer.close();//クローズ
  }
}



メールをくださいね!