MIDI 1.0の仕様書は、こちらのサイト からpdfをダウンロードすることができます。1983年に規格が作成され、1998年に規格書として第1版が発行された とのことです。ちなみにpdf版は、2019年に配布が始まりました。
MIDIの昔話です。その昔どんな工夫をしていたかというお話。今回はランニングステータスについて書いて見ます。 MIDIは遅い、と言われることがあります。元々、MIDIはシリアル通信が基本でボーレート(Baud Rate)は31.25kbpsと仕様で決まっています。 ボーレートは1秒間に送信できるビットの数で、31.25kbpsは1秒間に31,250ビットを送ることを意味しています。 1981年の仕様です。その当時のパソコンやマイコンではこのスピードが限界だったのだと思います。
MIDIのメッセージ、例えば鍵盤(真ん中のド)を押したというメッセージは8ビット3バイトのメッセージです。
90H 3CH 7FH
このメッセージを送信するためにかかる時間は約1msecです。測定した記録、MIDIを観測 がこちらにあります。もし、3和音、ドミソを同時に押したとします。押したという3つのMIDIメッセージは以下のような9バイトの メッセージになります。
90H 3CH 7FH 90H 40H 7FH 90H 43H 7FH
それぞれのメッセージが送信されるタイミングを時間軸に乗せて見ます。
このメッセージを鍵盤が送信し、音源が受信したとします。 音源側は、1つのメッセージ(3バイト)を受け取った時から音を鳴らすプログラムが起動し、その後に音が鳴ります。 この準備に何msecかかるかわかりませんが、例えば5msecとします。あくまでも例です。 音源側で音の出るタイピングを上の図に書き加えて見ます。 赤丸の位置がドが鳴る時間、青丸の位置がミが鳴る時間、緑丸の位置がソが鳴る時間になります。
最初のメッセージが送信され始めてから、ドが鳴るまでに6msec、ソがなるまでに8msecかかります。 すなわち、ドとソの鳴時間に約2msecの差がある。この2msecの差をもっと短くする工夫は無いものか? そこで考えられた工夫がランニングステータスです。 (プログラムの音を鳴らすための準備時間5msecは楽器メーカの努力でしか解決することができません。)
ランニングステータスは、今回送るメッセージが手前で送ったメッセージと、最初のバイトデータ(ステータスバイトと言います。) が同じ場合、ステータスバイトを送らなくて良い。という送信方法です。この場合、ミのメッセージのステータスバイトは 90Hで、ドのメッセージのステータスバイト90Hと同じなので省くことができます。また、ソのメッセージのステータスバイトも 90Hなので省くことができます。そこでドミソを押した、というMIDIメッセージは 次のようなメッセージとなります。
90H 3CH 7FH 40H 7FH 43H 7FH
これを上と同じように時間軸に並べてみると、ドが鳴るタイミングは変わりませんが、ミとソは少しずつ早く鳴ことがわかります。 ドとソの時間差は約1.2msecと短くなります。
ランニングステータスはあくまでもステータスバイトが同じ、という条件でステータスバイトを省くことができます。 次のように、途中で違うステータスを持つメッセージが挿入されると、それ以降は省くことができなくなります。 このメッセージを(1)とします。
90H 3CH 7FH 90H 40H 7FH 80H 40H 7FH 90H 43H 7FH ---(1)
例えば、上のように80Hというステータスバイトがはさまると、次のステータスバイトは省略できません。
90H 3CH 7FH 40H 7FH 80H 40H 7FH 90H 43H 7FH ---(2)
(2)は(1)に対して1バイトしか減らすことができません。
上の説明で違うステータスバイトがはさまると省略できない。と書きました。 ピアノの演奏のように、鍵盤を押した、離したを連続して送信したい場合、データを短くして タイミングをなるべく揃えたくなります。(2)で言えば、80H 40H 7FH の80Hも送らなく済むようにしたいのです。
そこで、鍵盤を離したという情報は、鍵盤を押した、でもベロシティはゼロでとして送信することとします。とすると、上の(2)の中で、 80H 40H 7FHというメッセージは、90H 40H 00Hとすることができます。したがって、
90H 3CH 7FH 40H 7FH 90H 40H 00H 90H 43H 7FH ---(3)
となりす。(3) はステータスがすべて90Hになりましたので、これをランニングステータスで端折ることができます。
90H 3CH 7FH 40H 7FH 40H 00H 43H 7FH ---(4)
もともとのメッセージは(1)は12バイトでした。それがベロシティゼロのノートオンとランニングステータスを使うことで (4)のように9バイトになりました。3バイト、MIDIの転送時間にすると約1msrcを短くすることができました。
MIDI 1.0の仕様書では、MIDIはこのハードウェアを使いなさい、という規定がなされています。曰く
さらにこのドキュメントには標準の回路図が掲載されています。
この回路図のDINコネクタの接続は、メスコネクタのハンダ付けするピンの側から見ています。
5pin DINには3種類の形状があるそうです。こちらは 秋月電子通商さんのカタログからコピーしています。MIDIは180°とカッコの中に記載があるように、半円の中にピンが収められている -5A の形状です。
System Exclusive Messageは、その名の通り楽器やシーケンサーのシステムで専用に使われるメッセージです。 楽器のパネルの制御、音色やエフェクトのパラメータ、PCM音源のサンプルデータ、音源のモード切り替えなどに使われます。
コントロールチェンジメッセージもパラメータを送受信することができます。しかし、こちらは1つのメッセージで 1つの7ビットのデータを送れるに過ぎません。システム・エクスクルーシブ・メッセージは0xF0で始まり、0xF7で終わる メッセージで、その間には理論上何バイトでもデータを挟んで送ることができます。 ただし、データの最上位ビットはゼロでなければなりません。 (ただし一部、0xF0と0xF7の間に割り込むことができるメッセージがあります。後述します。)
F0H Data1 Data2 Data3 ... DataN F7H
エレクトーンELB-01の操作パネルをシステム・エクスクルーシブ・メッセージで制御する例を こちらのページに記載しています。
例として、以下に音源システムの制御(オン・オフ)に使うシステム・エクスクルーシブ・メッセージを記載しておきます。
GMシステム・オン
F0 7E ノンリアルタイム・ユニバーサル・システム・エクスクルーシブ・ヘッダー <device ID> 対象とするデバイスのID(推奨7F :ブロードキャスト) 09 サブ ID番号# 1=GMメッセージ 01 サブ ID番号# 2=GMオン F7 EOX
GMシステム・オフ
F0 7E ノンリアルタイム・ユニバーサル・システム・エクスクルーシブ・ヘッダー <device ID> 対象とするデバイスの ID (推奨 7F:ブロードキャスト) 09 サブ ID番号# 1=GMメッセージ 02 サブ ID番号# 2=GMオフ F7 EOX
GM2システム・オン
F0 7E ノンリアルタイム・ユニバーサル・システム・エクスクルーシブ・ヘッダー <device ID> 対象とするデバイスの ID (推奨 7F:ブロードキャスト) 09 サブ ID番号# 1=GM2メッセージ 03 サブ ID番号# 3=GM2オン F7 EOX
XGシステム・リセット 音源のメモリーの 00 00 7Eにゼロを書き込む、という意味になります。
F0 ノンリアルタイム・ユニバーサル・システム・エクスクルーシブ・ヘッダー 43 ヤマハID 1n デバイスナンバー 4C モデルID 00 アドレス・ハイ 00 アドレス・ミッド 7E アドレス・ロー 00 データ/XGリセット F7 EOX
GSシステム・リセット 音源のメモリーの 40 00 7Fにゼロを書き込む、という意味になります。
F0 ノンリアルタイム・ユニバーサル・システム・エクスクルーシブ・ヘッダー 41 ローランドID 10 デバイスナンバー 42 モデルID 12 コマンドID 40 アドレス・ハイ 00 アドレス・ミッド 7F アドレス・ロー 00 データー/GSリセット 41 チェックサム F7 EOX
通常、MIDIはPCから送信し、楽器が受信するという単方向の通信がほとんどです。 ただし、バルクダンプとバルクダンプリクエストはPCと楽器の双方向の通信に使います。 PCが楽器に対してバルクダンプリクエストを投げる、それに応えて楽器がバルクダンプをPCに対して返します。
それではバルクダンプとは何か?直訳するなら「大量に(中身を)放出する」ということでしょうか。 楽器が持っているパラメータを一度に送信することを意味しています。PCにとっては、楽器の中身を まとめて、獲得するためにバルクダンプリクエストを送信し、楽器からバルクダンプを受け取ります。 PCで楽器のエディタを作りたい時などに使います。
もう一つ、似たメッセージとして、パラメータとパラメータリクエスト があります。こちらは楽器の中身の1つのパラメータを知りたい時に使います。