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を短くすることができました。