SewiGの日記
2005-12-19 [月] [長年日記]
■ [Java][Programming] JavaでSMF (2)
SMFの読み込みはjavax.sound.midi.Sequenceを使えば楽です。まず、以下のようなメソッドでSequenceを作ります。
public void open(File f) {
	try {
		sequence = MidiSystem.getSequence(f);
		if (sequence == null) {
			throw new MidiUnavailableException("Unavailable sequence.");
		}
		tracks = sequence.getTracks();
		
		init();
	} catch (IOException e) {
		e.printStackTrace();
	} catch (InvalidMidiDataException e) {
		e.printStackTrace();
	} catch (MidiUnavailableException e) {
		e.printStackTrace();
	}
}
それから、シーケンス内部のメッセージを取得していきます。以下は結構いい加減なので適宜データをキャッシュしてください。例では特にメッセージを解析せず内部に格納しています。解析したい場合は、もし独自に再生処理を行いたい場合にはtickとパラメータをまとめたクラスを作ってそれを格納していくといいでしょう。
public void init() {
	for (int j = 0; j < tracks.length; j++) {
		for (int i = 0; i < tracks[j].size(); i++) {
			MidiEvent event = tracks[j].get(i);
			long tick = event.getTick();
			MidiMessage message = event.getMessage();
			// ここでMidiMessageを独自に内部形式に
			data.addElement(message);
		}
	}
}
MIDIメッセージを解析したい場合、例えばShortMessageは以下のようにします。
if (message instanceof ShortMessage) {
	ShortMessage s = (ShortMessage)message;
	if (s.getCommand() == ShortMessage.NOTE_ON) {
		// なんらかの処理
	}
	// 以下略
}