ソースコードと日記帳

日々の出来事をちょこちょこと。

JavaでMIDIファイルを再生する

環境

MIDIファイル (SMF) を鳴らしたい

学校の課題でアラームを作った時、その音をどうしてもMIDIで鳴らしたかった。そこで色々調べたので、そのメモ。

色々と情報を探してみたりはしたけど、どうも自分の思うような情報に辿り着けなかったので(自分の情報詮索能力が低いだけ・・・)Javadocとにらめっこした結果、いろいろ見えてきた。
使いそうなクラスは次の3つ!

  • Sequencer : 再生や停止など
  • Sequence : トラックの生成や作成など
  • MidiSystem : MIDIに関する様々な機能を提供

MidiSystemクラスは様々なメソッドがStaticで宣言されているので、インスタンスを作る必要はない。主な手続きは・・・

  • Sequencerを宣言してMidiSystem.getSequencer()シーケンサを取得
  • Sequenceを宣言してMidiSystem.getSequence(ファイル)シーケンサを取得
  • このファイルは、File fileInputStream streamまたはURL urlのどれか
  • 取得したSequenceSequencerにセットする
  • Sequencerをoepn()し、start()で再生。
  • 止めたいタイミングでstop()し、Sequencerstop()する。

サンプル

以下のサンプルコードは、何かキーボードから入力があるまで再生、入力があったら停止するプログラム。

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;

public class MidiTest {
    public static void main(String[] args) 
            throws MidiUnavailableException, InvalidMidiDataException, IOException {
        //シーケンサを宣言
        Sequencer myMidi;
        myMidi = MidiSystem.getSequencer();
        //シーケンスを宣言
        Sequence mySequence ;
        mySequence = MidiSystem.getSequence(new File("hoge.mid"));
        //シーケンサにシーケンスをセットする
        myMidi.setSequence(mySequence);
        //シーケンサを開き再生する
        myMidi.open();
        myMidi.start();
        
        //何か入力があるまで再生。
        System.out.println("入力があるまで再生します。");
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        br.read();
        //再生の停止
        System.out.println("入力を検知しました。再生を終了します。");
        myMidi.stop();
        myMidi.close();
    }
}