気ままなタンス*プログラミングなどのノートブック

プログラミングやRPGツクール、DTM、VOCALOIDについてのんびり書きます。

【Javaメモ】MIDIの再生方法

Javaを用いてMIDIを再生するには2つの方法がある


  • レシーバ(Receiver)を利用する

  • シーケンサ(Sequencer)を利用する

Receiverの場合


MidiSystemクラスからReceiverオブジェクトを受け取り、
ShortMessageオブジェクトをレシーバに渡す

import javax.sound.midi.MidiSystem;
import javax.sound.midi.Receiver;
import javax.sound.midi.ShortMessage;

class ReceiverMain {
  public static void main(String[] args) {
    Receiver rec = null;
    try {
      rec = MidiSystem.getReceiver();
      ShortMessage note = new ShortMessage();
      
      // sendMessage(イベント種類, 音程, 音量)
      note.setMessage(ShortMessage.NOTE_ON, 60, 60);
      
      // send(ShortMessageイベント, タイミング)
      rec.send(note, 1);
      Thread.sleep(1000);
    } catch(Exception e) {
    } finally {
      if(rec != null) {
        rec.close();
      }
    }
  }
}

Sequencerの場合


MidiSystemクラスからSequencer(シーケンスを編集するもの)を受け取る。
Sequenceオブジェクトを生成し、メソッドcreateTrackでTrackオブジェクトを生成する。
MidiEventでラップしたShortMessageをTrackオブジェクトにaddする。

import javax.sound.midi.Sequence;
import javax.sound.midi.ShortMessage;
import javax.sound.midi.MetaMessage;
import javax.sound.midi.MidiEvent;

class SequencerMain {
  public static void main(String[] args) throws Exception{
    Sequencer seqr = null;
    try {
      seqr = MidiSystem.getSequencer();
      seqr.open();

      // PPQ - Pulse Per Quarter 四分音譜を240tickで再生
      Sequence seq = new Sequence(Sequence.PPQ, 240);
      Track track = seq.createTrack();

      // テンポの設定
      MetaMessage tempo = new MetaMessage();
      tempo.setMessage(0x51, new byte[] {0x07, (byte)0xa1, 0x20}, 3);
      track.add(new MidiEvent(tempo, 0));

      ShortMessage note = new ShortMessage();
      note.setMessage(ShortMessage.NOTE_ON, 60, 60);
      track.add(new MidiEvent(note, 1));

      seqr.setSequence(seq);
      seqr.start();
      while(seqr.isRunning()) {
        Thread.sleep(100);
      }

    } finally {
      if(seqr != null && seqr.isOpen()) {
        seqr.close();
      }
    }
  }
}

参考資料