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