MIDI チュートリアル 3:
MIDI の解析

イントロダクション

このチュートリアルでは、MIDI プログラミングのために拡張機能を提供するMIDI 処理オブジェクトの世界に分け入ります。midiparse オブジェクトを使って、生のMIDIストリームを構成する要素を調べることができます。これに対し、midiformat オブジェクトは、一般的にサポートされるMIDIメッセージのほとんどをこれ1つで生成する「スーパーストア」のような使い方ができます。また、xbendin オブジェクトを使って、ピッチベンド値を生成する多くのMIDIコントローラによって出力される、拡張精度の値を見ることができます。

このようなオブジェクトの性質から、このチュートリアルは「作ってみる」チュートリアルではなく、「説明を見る」チュートリアルになっています。しかし、ここで紹介するパッチで流れているデータフローはじっくり時間をかけて理解して下さい。これは、多くの複雑なMIDI設定を取り扱うための基礎になります。

MIDIコントロールを扱う有意義なパッチを作る場合には、常にノート、コントローラの変化、そしてMIDI デバイスによって生成されるそれ以外のメッセージのすべてにアクセスする必要があるでしょう。入力されるMIDIストリームの解析を行なうためには、多くの特化されたオブジェクト(notein、ctlin、pgminなど)ではなく、midiparse オブジェクトを使うことができます。また、midiformat オブジェクトを使って、様々な、広範囲にわたるMIDIメッセージを含むMIDIストリームを生成することができます。この2つのオブジェクトは、複雑なMIDIコントロールパッチを作る上で非常に役に立ちます。

さらに、特定のメッセージ型によって与えられる拡張精度を持った値、具体的にはほとんどのMIDIキーボードのピッチベンドホイールによって提供される拡張精度(14ビット)の値について見ていきます。また、このようなメッセージは非常に速く作られるため、speedlim オブジェクトを使って値の表示を遅くして、高速なメッセージ生成を行なっている間にオーバーフローが起きないようにしています。

midiparse の動作を見る

チュートリアルを開いて下さい。

このチュートリアルのパッチの中では、midiin オブジェクトを使って、MIDI入力デバイスから送られる生のMIDI入力ストリームを取得しています。そして、midiparse を使って、このmidiinからのデータを、サポートされている様々なメッセージタイプに切り分けています。midiparseのアウトレットは、MIDI 入力のタイプに基づいた様々なタイプのメッセージを送り出しています。プログラムチェンジ、アフタータッチ、ピッチベンドのアウトレットが単独の整数を出力するのに対し、MIDIノート、ポリキープレッシャー、コントロールチェンジはリストで出力します。ここでは、これらの出力を slider オブジェクトに送って、様々なメッセージが到着したときに表示できるようになっています。これらのメッセージを生成できるMIDIコントローラを持っていたら、(midiin オブジェクトをダブルクリックして)MIDIポートを選択し、演奏して下さい。slider オブジェクトが入力されるメッセージに反応するようすを見ることができるはずです。個々のメッセージにMIDIチャンネル情報が付加されていない点に注意して下さい。MIDIチャンネルは共有アウトレットから送信されます。ここでは、最も最後に受け取ったメッセージのチャンネルが、常に表示されています。

MIDIで動作するパッチを作成する場合、そのパッチが多くのメッセージタイプに対応しなければならないようなときには、常に midiparse オブジェクトが使用されます。様々なメッセージに特化したオブジェクト(noteinなど)を使わずに、この1つのオブジェクトによって様々なメッセージをトラッキングできます。例えば、外部のハードウェアやソフトウェアシーケンサからのMIDIシーケンスを Max で演奏する場合、そのシーケンスの中にはノート情報だけでなく、それ以外のメッセージも数多く含まれています。midiparse オブジェクトによって、シーケンスに存在するあらゆる情報を見ることができます。

midiformatの動作を見る

midiformat はmidiparse と相補的な関係にあるオブジェクトです。このオブジェクトを使うと、数多くの様々なタイプのMIDIメッセージを作り、MIDIストリームに変換することができます。このMIDIストリームはmidiout オブジェクトで受け取ることができます。このテストパッチの下半分では、作成できるメッセージがすべて示され、sliderを使ってメッセージを生成することができるようになっています。メッセージの作成をテストするために、まず midiout オブジェクトをダブルクリックして適切なMIDI出力デバイスを選んで下さい。その後、midiformat オブジェクトに接続された slider を動かしてみて下さい。MIDIデバイスからその結果が(聴くことのできるものであれば)聞こえるはずです。

midiformat でメッセージを生成する場合、いくつか注意すべき点があります。他のノート情報を使用するデバイスと同様に、MIDIノートオンメッセージとMIDIノートオフメッセージは必ずペアで使用しなければなりません。また、デバイスの能力に合わせて、送信するコントローラメッセージの数を制限しておかなければなりません。短時間で非常に多くのコントローラメッセージが送信されると、MIDIシンセサイザが処理しきれなくなる可能性があります。最後に、使用しているMIDIチャンネルが、コントロールしようとするデバイスにとって適切なものであること(さらに、複数のシンセサイザを扱うような場合には、アクティブなチャンネルであること)を確認しなければなりません。

xbendinを使った拡張MIDIコントローラのトラッキング

MIDI コントローラと送受信する値は、ほとんどの場合7ビット(0から128)の解像度を持っています。これはシンセサイザやサンプラを扱う場合には十分なものであると言えます。しかし、微妙なニュアンスを情報としてやり取りする場合、7ビットでは不十分なケースがいくつかあります。その最も一般的な例はピッチベンドコントロールです。シンセサイザのベンド幅が±1オクターブに設定されている場合、ピッチベンドの1つ1つのステップは、粗く、耳障りなピッチ幅になってしまうでしょう。MIDI の仕様では、ピッチベンドは14ビットの値を使用することができるため、0 から 16383 までの値が利用できます。これにより、非常に繊細なピッチコントロールを行なうことができ、音楽的によりよい結果をもたらす可能性が与えられます。

xbendin オブジェクトを使うと、この拡張されたピッチベンド情報をトラッキングすることができます。このオブジェクトは生の MIDI入力を受信し、拡張された精度でピッチベンドメッセージを出力します。MIDI コントローラが14 ビットのメッセージを送信しない場合でも、メッセージは14 ビットの値が得られたものとして解析されます。残念なことに、最も安定したMIDIコントローラでさえ、拡張された値をトラッキングする場合に、生成するMIDI ピッチベンドメッセージの数が多すぎてしまう可能性があります。それは、ハードウェアが一定の値に保たれることができず、わずかな変化にともなって、を、許容量を超えるような数多くの値を生成してしまう可能性があるためです。このことは、接続されているハードウェアには影響を及ぼさないかもしれませんが、Maxパッチの動作を不規則にしてしまう可能性があり、少なくとも複雑なパッチのデバッグを的確に行なうことが難しくなってしまうでしょう。

これを解決するオブジェクトが speedlim オブジェクトです。このオブジェクトは任意のオブジェクト(ここでは、xbendin オブジェクト)の出力を受け取り、指定された時間フレームの間にメッセージを1つだけ出力するように制限します。チュートリアルパッチでは、250 というアーギュメントを与えることによって、最大でも250ミリ秒(1/4秒)ごとにメッセージを出力するようspeedlim に命じています。speedlim はこの時間フレームの中で受信した最後のメッセージ以外を破棄し、より密度の低いメッセージの流れを作ることによってパッチを管理します。チュートリアルパッチにピッチベンド情報を送信した場合、xbendin に接続された button やナンバーボックスが、speedlim の出力よりも頻繁に更新されることがわかるでしょう。speedlim の出力に接続されたナンバーボックスは、最後に渡された値を表示するために、常に1/4 秒以内で更新されます。

結び

複雑なMIDIコントロールを行なうパッチを作るとき、利用できるMIDIメッセージすべてを使いたいと考えることがよくあります。メッセージに特化されたオブジェクトを数多く使用するのではなく、midiparse と midiformat オブジェクトを使って、すべてのタイプのメッセージにアクセスしながら、デバイスからのMIDIデータをメッセージとして受け取ったり、メッセージをMIDIデータとしてデバイスに送ることができます。MIDIに基づいた、大きく複雑なパッチシステムの中心となる部分では、midiparse と midiformat を使用します。

拡張解像度によるコントロール情報にアクセスすることによって、より音楽的で繊細なパッチを作ることができます。より安定したサウンドを持つシンセサイザをMaxの中で作る場合、xbendin オブジェクトを使った拡張ピッチベンド情報の受信が役に立ちます。しかし、このような情報は受信が追いつかなくなるようなスピードで送信される可能性があります。speedlimを使って受信するメッセージの流れを遅くすることは、パッチに生じるオーバーヘッドの量をコントロールする手助けとなります。

参照

midiparse midiparse 生のMIDIバイトをメッセージタイプによって分割します。
midiformat データをMIDIメッセージにフォーマットします。
xbendin 14ビットのピッチベンド値のフィルタ/プロセッサ。
speedlim メッセージが通過するスピードを制限します。