MIDIの工夫 ランニングステータス

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と短くなります。

ランニングステータスはあくまでもステータスバイトが同じ、という条件でステータスバイトを省くことができます。 次のように、途中で違うステータスを持つメッセージが挿入されると、それ以降は省くことができなくなります。

  90H 3CH 7FH  90H 40H 7FH  80H 40H 7FH  90H 43H 7FH

例えば、上のように80Hというステータスバイトがはさまると、次のステータスバイトは省略できません。

  90H 3CH 7FH  40H 7FH  80H 40H 7FH  90H 43H 7FH