JavaでMIDIファイルを再生する
環境
- Macbook pro
- OS X Yosemite
- java version "1.8.0_77"
MIDIファイル (SMF) を鳴らしたい
学校の課題でアラームを作った時、その音をどうしてもMIDIで鳴らしたかった。そこで色々調べたので、そのメモ。
色々と情報を探してみたりはしたけど、どうも自分の思うような情報に辿り着けなかったので(自分の情報詮索能力が低いだけ・・・)、Javadocとにらめっこした結果、いろいろ見えてきた。
使いそうなクラスは次の3つ!
- Sequencer : 再生や停止など
- Sequence : トラックの生成や作成など
- MidiSystem : MIDIに関する様々な機能を提供
MidiSystemクラスは様々なメソッドがStaticで宣言されているので、インスタンスを作る必要はない。主な手続きは・・・
- Sequencerを宣言して
MidiSystem.getSequencer()
でシーケンサを取得 - Sequenceを宣言して
MidiSystem.getSequence(ファイル)
でシーケンサを取得 - このファイルは、
File file
、InputStream stream
またはURL url
のどれか - 取得したSequenceをSequencerにセットする
- Sequencerを
oepn()
し、start()
で再生。 - 止めたいタイミングで
stop()
し、Sequencerをstop()
する。
サンプル
以下のサンプルコードは、何かキーボードから入力があるまで再生、入力があったら停止するプログラム。
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(); } }