JavaでMIDI Fileをつくる

戻る

MIDI ファイルを作るにはSequenceに音の情報を書きこみ 最後にMidiSystemwriteメソッドを使います。 手順としては以下の通りです。

  1. Sequenceを作成し、さらにその中にTrackを作成する
  2. MetaMessageを用いテンポの設定を行う。 タイプは0x51c、テンポの値は 四分音符の長さをμsecで指定し3バイトに分解し、 設定します。よってデータ長は3です。
  3. ShortMessageを用い音色の指定を行います。 音色の指定はプログラムチェンジと呼ばれるメッセージで行われます。
  4. 音を鳴らす。音のon, offの情報を送ります。 音の高さはpicth, 音の大きさはNOTE_ONvelocityで決まります。 長さはMidiEventtickで指定されるイベントの間隔で決まりますが、 ここにはTrackの始りからの絶対的な値を入れます。
  5. MidiSystem.write()で書き出します。
  6. "Java HelloFile"を実行して、できた"hello.mid" を適当なソフトで再生します。
以下ソースとコメントの形で説明します。
import javax.sound.midi.spi.*;
import javax.sound.midi.*;
public class HelloFile {
  public static void main(String[] args){
    try {

/*
 * SequenceとTrackの作成
 * 24tick=四分音符
 * 戻る
 */ 
  Sequence sequence = new Sequence(Sequence.PPQ, 24);
  Track track = sequence.createTrack();
/*
 * チャンネル:0, 音の高さ:48 音の強さ:127 音色番号:6
 */
      int channel = 0;
      int pitch = 48;
      int velocity = 127;
      int instrument = 6;

/*
 * テンポの設定 四分音符の長さをμsecで指定し3バイトに分解する
 * ここでは20 四分音符/分
 * 戻る
 */
      MetaMessage mmessage = new MetaMessage();
      int tempo = 20;
      int l = 60*1000000/tempo;
      mmessage.setMessage(0x51, 
                          new byte[]{(byte)(l/65536), (byte)(l%65536/256), (byte)(l%256)}, 
                          3);
      track.add(new MidiEvent(mmessage, 0));

/*
 * 音色の指定 音色番号:6
 * 戻る
 */
      //set instrument
      ShortMessage message = new ShortMessage();
      message.setMessage(ShortMessage.PROGRAM_CHANGE, channel, instrument, 0);
      track.add(new MidiEvent(message, 0));

/*
 * 音を鳴らす
 * 戻る
 */
      // Note on
      message = new ShortMessage();
      message.setMessage(ShortMessage.NOTE_ON, channel, pitch, velocity);
      track.add(new MidiEvent(message, 0));
      // Note off after quater (24tick)
      message = new ShortMessage();
      message.setMessage(ShortMessage.NOTE_OFF, channel, pitch, velocity);
      track.add(new MidiEvent(message, 24));
/*
 * ファイルに書き出す。
 * 戻る
 */

      //write to file
      MidiSystem.write(sequence, 0,new java.io.File("hello.mid"));
     } catch(Exception e){
      e.printStackTrace();
    }
  }
}