音を出す

MIDIメッセージの種類は、チャンネルメッセージとシステムメッセージに分類されます。チャンネルメッセージは、個々の楽器パートを識別するチャンネル情報を持つメッセージのことで、音源に対して演奏を指示できます。MIDIは、チャンネルによって複数のパートを管理することができます。たとえば、チャンネル1番はピアノ、2番はヴァイオリンといった形で管理できます。チャンネルメッセージは、ステータスバイトの上位4ビットでメッセージの種類を表し、チャンネル番号を下位4ビットを用いて指定します。よって、必然的にMIDIデバイスのチャンネルは最大で16チャンネルまでとなります。

システムメッセージは、音源固有のシステムエクスクルーシブメッセージのようなMIDIデバイスの制御に用いられるメッセージです。システムメッセージのステータスバイトは、必ず上位4ビットが全て1で下位4ビットでメッセージの種類を表します。つまり16進数でF0~FFまでがシステムメッセージとなり、それ以外であればチャンネルメッセージになります。

音源に音を再生させるには、ノートオンと呼ばれるチャンネルメッセージを使います。ノートオンは、鍵盤を押したことを音源に伝えるもので、ステータスバイト0x90~0x9Fまでの値で表せます。このとき、下位4バイトはチャンネル番号であることを忘れないでください。ShortMessageクラスのNOTE_ONフィールドを使うこともできます。

ShortMessage クラス NOTE_ON フィールド

public static final int NOTE_ON

NOTE_ONフィールドは0x90を表します。1 番以外のチャンネルを指定したい場合は、バイト単位の論理和演算子 | で結合していください。ノートオンの第1データバイトには音の高さを表すノートナンバーを、第2データバイトには強さを表すベロシティを指定します。ノートナンバーは、ピアノの中心のC(音名は米式)を60とし、インクリメントするごとに半音上がり、デクリメントするごとに半音下がります。61であればC#、59であればBとなります。チューニングなどで基準となる440HzのAは69です。ベロシティは0が消音、127が最も強い音を表します。

サンプル01は、デフォルトのReceiverを取得してMIDIメッセージのノートオンを送信しています。Receiverが適切な音源であればノートナンバー60に対応しているCを再生するでしょう。プログラムの最後では、標準入力から行を読み込んでいますが、これはプログラムが即座に終了するとReceiverが割り当てているシステムリソースも解放されて再生が停止されるのを防ぐためです。

サンプル01(ノートナンバー60に対応しているCを再生)

import java.io.*;
import javax.sound.midi.*;

class Test {
    public static void main(String[] args) throws Exception {
        Receiver receiver = MidiSystem.getReceiver();
        ShortMessage message = new ShortMessage();

        message.setMessage(ShortMessage.NOTE_ON, 60, 127);
        receiver.send(message, -1);

        System.out.println("Enter キーを押してプログラムを終了します>");
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        reader.readLine();
    }
}