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