MIDIの環境がわかったところでまずは音を鳴らして見たいと思います。今回はJavaに付属しているシンセサイザーにMIDIのメッセージを送ります。
Javaでのシンセサイザーの位置付け
前回システム情報として取得したMidiDeveiceオブジェクトですがこのMidiDeviceはインタフェースとして定義されています。デバイスの情報としてInfoというネストクラスをフィールドにもつ他に受信や送信用のオブジェクトそれぞれReceiverとTransmitterというインタフェースを管理しています。
シンセサイザーはこのMidiDeviceを継承したSynthesizerインタフェースとして扱われます。もともとのMidiDeviceの機能に加え音色を管理する機能が付いています。MIDIの演奏情報を送るにはこのシンセサイザーの受信オブジェクトにデータを渡します。
Receiverに送信する演奏情報
ReceiverはMIDIの情報を受け取ります。受け取る情報はMidiMessageのサブクラスです。演奏情報は以下のように作ります。
このShortMessageは3byteで構成されています。一つのステータスバイトと二つのデータbyteです。MIDIの規格でステータスバイトは128から255までの値、データバイトは0から127の値と決められています。
種類 | 10進 | 16進 | 2進 |
---|---|---|---|
ステータスバイト | 128-255 | 0x80-0xFF | 1000 0000 – 1111 1111 |
データバイト | 0-127 | 0x00-0x7F | 0000 0000 – 0111 1111 |
16進数はJavaで使えるように頭に0xを足してあります。
2進数でみると最初のビットがステータスバイトでは1、データバイトでは0になっていることがわかります。
演奏情報
ステータスバイトについて以下一覧にしました。
コマンド | フィールド名 | 10進 | 16進 |
---|---|---|---|
ノートオフ | NOTE_OFF | 128-143 | 0x80-0x8F |
ノートオン | NOTE_ON | 144-159 | 0x90-0x9F |
アフタータッチ(鍵盤単位) | POLY_PRESSURE | 160-175 | 0xA0-0xAF |
コントロールチェンジ | CONTROL_CHANGE | 176-191 | 0xB0-0xBF |
プログラムチェンジ | PROGRAM_CHANGE | 192-207 | 0xC0-0xCF |
アフタータッチ(チャンネル単位) | CHANNEL_PRESSURE | 208-223 | 0xD0-0xDF |
ピッチベンド | PITCH_BEND | 224-239 | 0xE0-0xEF |
0xF0-0xFFはシステム用のコマンドなのでこれはまた別にまとめます。
今回このコマンドのうちノートオンとノートオフを使います。音を開始するコマンドと音を終了するコマンドです。一つのコマンドになぜ16も幅があるかというとこの16個がチャンネルに割り当てられているからです。チャンネルは通常1ベースで1-16のように表現されますがここでは値をそのまま扱うので0ベースで0-15チャンネルとします。
例えばステータスバイト0x80の値はチャンネル0に対してのノートオン、0x8Fであればチャンネル15に対してのノートオンのコマンドになります。
MIDIの規格では一度に扱えるチャンネルの数は16までと決まっています。これはこのようなステータスバイトの使い方からくる仕様です。
次回実装をします。