トップ «前の日記(2005-12-18 [日]) 最新 次の日記(2005-12-20 [火])» 編集

SewiGの日記

2004|01|04|05|06|07|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|

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) {
		// なんらかの処理
	}
	// 以下略
}

Copyright © 2004-2008 SewiG All rights reserved.