JavaとMIDI:音を鳴らす(1)

スポンサーリンク

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を足してあります。

16進法について

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チャンネルとします。

数の数え方:0ベースと1ベース

例えばステータスバイト0x80の値はチャンネル0に対してのノートオン、0x8Fであればチャンネル15に対してのノートオンのコマンドになります。

MIDIの規格では一度に扱えるチャンネルの数は16までと決まっています。これはこのようなステータスバイトの使い方からくる仕様です。

次回実装をします。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

%d人のブロガーが「いいね」をつけました。