#はじめに
この記事では、Java Sound APIを使用してMIDIファイルを再生する方法を備忘録的にまとめます。
とりあえず再生・停止ができる程度な初歩的な記事です。
#サンプルコード
こちらがサンプルのソースコードです。
コンソール入力でMIDIファイルのパスを入力すると、MIDIが再生されるというシンプルなプログラムです。
めちゃくちゃ適用な例外処理を行っているので、そこらへんは勘弁してください。m(__)m
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
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 SamplePlayer {
public static void main(String[] args) {
// MIDIデータを再生するハードウェア/ソフトウェア・デバイスのインスタンス。
Sequencer sequencer = null;
try {
// デバイスに接続されたデフォルトのSequencerを取得する。
sequencer = MidiSystem.getSequencer();
// デバイスを開き、リソースを獲得する。
sequencer.open();
}
catch (MidiUnavailableException e) {
e.printStackTrace();
}
// コンソール入力からMIDIファイルのパスを取得する。
Scanner scanner = new Scanner(System.in);
System.out.print("MIDIファイルのパス >> ");
String path = scanner.next();
try {
// MIDIファイルからMIDIデータ(Sequenceオブジェクト)を取得。
File file = new File(path);
Sequence sequence = MidiSystem.getSequence(file);
// 取得したMIDIデータをシーケンサに設定する。
sequencer.setSequence(sequence);
}
catch (InvalidMidiDataException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
// シーケンサー再生
sequencer.start();
// キー入力待ち
System.out.println("適当に文字列を入力すると終了します。");
System.out.print(">>");
scanner.next();
scanner.close();
// シーケンサー停止
sequencer.stop();
// シーケンサーを閉じ、使用していたリソース解放する。
sequencer.close();
}
}
#解説
###シーケンサーを用意
MIDI再生に必要なオブジェクトを取得します。
以下のコードでは、APIが用意しているデフォルトのデバイスを自動で取得してくれます。
(再生するだけならデフォルトで十分です。)
※[1],[2]は"MidiUnavailableException"をスローするので、必ず例外処理を行ってください。
Sequencer sequencer = null;
try {
// [1] デバイスに接続されたデフォルトのSequencerを取得する。
sequencer = MidiSystem.getSequencer();
// [2] デバイスを開き、リソースを獲得する。
sequencer.open();
}
catch (MidiUnavailableException e) {
e.printStackTrace();
}
###MIDIファイルを読み込む
MIDIファイルからMIDIデータを取得します。
取得したMIDIデータは"Sequence"というオブジェクトで管理されます。
シーケンサーに取得したオブジェクトを設定します。
※先程と同様に[1],[2]は"MidiUnavailableException"をスローするので、必ず例外処理を行ってください。
try {
// [1] MIDIファイルからMIDIデータ(Sequenceオブジェクト)を取得。
File file = new File(path);
Sequence sequence = MidiSystem.getSequence(file);
// [2] 取得したMIDIデータをシーケンサに設定する。
sequencer.setSequence(sequence);
}
catch (InvalidMidiDataException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
###MIDI再生/停止
あとはシーケンサーの再生(start)、停止(stop)をコールすることで、再生/停止を制御できます。
// シーケンサー再生
sequencer.start();
// シーケンサー停止
sequencer.stop();
###システムリソースの解放
プログラム終了時は、close()を実行することを忘れないように注意してください。
sequencer.close();