チュートリアル34:
MIDI データの管理

midiin と midiout

noteinnoteoutbendinbendoutのような MIDI オブジェクトは、特定のタイプの MIDI データを送受信します。すべてのタイプの MIDI データを個々のバイト(ステータス・バイトを含みます)単位で送受信する必要がある場合には midiinmidioutを使います。

midiin オブジェクトは、入力される MIDI バイトを毎回その都度調べるという場合に役に立ちます。チュートリアル35 でも紹介しますが、midiin は、機材から seq というシーケンサオブジェクトの中へ MIDI データのレコーディングを行なう場合にも使用できます。midiout オブジェクトは、システム・エクスクルーシブ・メッセージを含むすべてのタイプの MIDI メッセージをシンセサイザに送信する場合に使用されます。midioutは、また、seq オブジェクトによってプレイバックされた MIDI データを送信するためにも使用できます。

最も単純な場合、Max はただ midiin のアウトレットと midiout のインレットを接続するだけでコンピューターをとても高価な MIDI スルーボックスに変えることができます。これら2つのオブジェクト(実際には、すべての MIDI オブジェクト)には送受信を行うポートを指定するために、文字によるアーギュメントを与えることができます。このため、アーギュメントを使って、あるポートからもう1つのポートへ、MIDI データをルーティングすることができます。

また、インレットにポート名を送信することによって、任意のMIDI オブジェクトの入力ポート、あるいは出力ポートを変更することもできます。演奏中にポートを変更する場合には、演奏されたノートがオンのままになってしまう可能性があることに注意して下さい。

midiin または midiout オブジェクトが、アーギュメント、あるいはインレットへの port メッセージのいずれかによってポートを指定されていない場合、ポート a がデフォルトと見なされます。ポート割り当てに関する、より詳しい情報は、このマニュアルの「ポート (Ports)」セクションを参照して下さい。(訳注:Max 基礎マニュアルの「ポート」セクションを参照して下さい。)

capture

MIDI 機器が送信している MIDI バイトを調べたいだけであれば、このチュートリアルパッチで行なっているように midiinのアウトレットを capture オブジェクトに接続するだけで可能です。

capture オブジェクトは優れた万能デバッグツールです。capture は受信した数値を保存していて、ダブルクリックすると、テキストウィンドウを開いてその数値を表示します。captureの中に格納されている数値はパッチを閉じた場合には保存されませんが、そのテキストウィンドウを別のファイルとして保存したり、数値をコピーして、別の場所にペーストすることができます。グラフィックテーブル ウィンドウへペーストすることも可能です。アウトレットから送信された数値が何であるかを知りたい場合には、そのアウトレットを captureオブジェクトに接続してパッチを動作させ、captureの内容を見て下さい。

・MIDI キーボードから、ピッチベンド、モジュレーション、ノート、プログラムチェンジなどの、様々なタイプの MIDI メッセージを送信して下さい。すべてのバイトは個々に midiin で受信され、captureに格納されます。capture オブジェクトをダブルクリックして、MIDI データを確認して下さい。

midiparse と midiformat

midiparse オブジェクトは、midiinseq オブジェクトから受信した MIDI データを分類し、分類済みの重要なデータをアウトレットから送信します。midiinmidiparse の組み合わせは、特化された MIDI受信オブジェクトすべてを持ち合わせているようなものです。

midiformat オブジェクトは、midiparse のちょうど反対の機能を実行します。midiformat は、適切なステータス・バイトを持ち、正しくフォーマットされた MIDI メッセージとしてデータを用意し、シンセサイザへの送信を行なう midiout に対して個々のバイトを送信します。

MIDI データの分析とフォーマット

サンプルパッチでは、midiparse からの様々な MIDI データを利用する2つの方法を示しました。それは、データによってMax のオブジェクトをコントロールする方法、および、データに他の意味を与えて midiformatmidiout によって送信する方法です。

midiparse オブジェクトの第 3アウトレットからのコントローラ・データは routeに送信され、routeはコントローラ 1 の モジュレーションホイールから送られるデータだけを選択します。0から127までのモジュレーションホイールのデータは64から0までの範囲にマップされ、midiformat オブジェクトによってピッチベンド・データとして再割り当てをされ、シンセサイザに送信されます。この結果、キーボードのモジュレーションホイールはピッチベンドのコントロールも行なうようになります。モジュレーションが 0 から127まで増加するにつれて、ピッチは64から0まで低い方にベンドされます。このタイプの再割り当ては、2つの異なった種類のコントロール・データを関連づける場合に便利です。

パッチのその他の部分では、どのようにしたらMIDI チャンネルのグループからデータを選択することができるかを示しています。チャンネルナンバーはノートデータ用の gate オブジェクトの開閉に使用されています。チャンネル1 〜 8 のノートデータのみが送信され、ピッチデータが tableの中の数値をトリガしています。

・MIDI キーボードでノートを演奏して下さい。それぞれのノートオンのピッチがアドレスとしてtable の中の値をトリガするために使用されているのを聴くことができるでしょう。MIDI キーボードを、チャンネル 9 〜 16で送信するように設定した場合、ノートは gate オブジェクトを通過しません。

キャプチャした値を table へコピーする

入力されたピッチベンド・データは midiparse オブジェクトから capture 128 オブジェクトに送られます。capture オブジェクトのアーギュメントは、格納する数値の個数を設定するものです。これは、table オブジェクトのための数値を素早く簡単に生成する1つの方法です。これは、気に入ったピッチベンドなどのような演奏動作を記録し、後で使用できるように table オブジェクト内に保存しておくための良い方法となります。

キャプチャしたピッチベンド値を table オブジェクトにコピーする方法は次のようになります。

  1. clear メッセージをクリックして capture オブジェクトをクリアします。
  2. 少なくとも3.2秒以上の間ピッチベンド・ホイールを動かします( speedlim オブジェクトは入力されるピッチベンド値を 毎秒 40 個に制限します)。3.2秒後、capture オブジェクトによって一番先に受信された値は、新しい値が受信されることによって失われます。
  3. capture 128 オブジェクトをダブルクリックして、テキストウィンドウを開きます。
  4. キャプチャーウィンドウの中のすべての数値を選択します。
  5. Edit メニューから Copy を選びます。
  6. キャプチャー・ウィンドウを閉じます。
  7. table オブジェクトをダブルクリックして、グラフィックエディタウィンドウを開きます。
  8. テーブルウィンドウのパレットから選択ツールを選びます。
  9. Edit メニューから Select All を選びます。
  10. Edit メニューから Paste を選びます。
  11. 必要ならば、テーブルウィンドウを別のファイルとして保存し、別の機会にパッチの中で使用することができます。

table 内部での移動

パッチャーウィンドウ の左側では、table 内部の値の間を移動するための、別の方法を紹介しています。table オブジェクトはポインタ(アドレスを格納するメモリー内の場所)を持っています。tableの左インレットにアドレスナンバーを後に続けた goto を送ることによって、ポインタが任意のアドレスを指すように設定することができます。例えば、goto 0 というメッセージでは、ポインタを table オブジェクト内のアドレス 0(最初のアドレス)に設定します。


next メッセージはポインタが指し示すアドレスの値を送信します。 その後、ポインタを次のアドレスに設定します

tableは、左インレットで next メッセージを受信すると、ポインタの指すアドレスに格納している値を送信し、次のアドレスへポインタをインクリメントします。ポインタが tableの最後のアドレスに達した場合、next メッセージによって、ポインタは一巡し、再び最初のアドレスを指します。このため、next メッセージを使用して table を 継続的に循環することができます(また、このパッチでは示していませんが、prev を用いて、tableを逆方向に進むこともできます)。

このようにして、サンプルパッチでは、MIDI キーボードで(チャンネル1 〜 8 で)ピッチが演奏されるごとに、値が table オブジェクトから送信されます。また、metroをオンにして next メッセージを table オブジェクトに繰り返し送信する方法によって、値を自動的に送信することもできます。

システム・エクスクルーシブ・メッセージ

MIDI システム・エクスクルーシブ(sysex)メッセージはMIDI 規格によって標準規格として定義されたもの以外の情報を送信するために使用されます。sysex コマンドはMIDI 経由で機器の設定を変更する方法として、メーカーによって実装されています。

Maxには、システム・エクスクルーシブ・メッセージを受信する sysexin オブジェクトがあります。しかし sysex メッセージを送信する場合、自分自身でデータをフォーマットして、midiout を使って送信する必要があります。

Max には、sysexメッセージのフォーマットを手助けする sxformat というオブジェクトがあります。sxformat オブジェクトでは MIDI メッセージのいくつかのバイトをアーギュメントとして指定し、他のバイトは可変アーギュメントとして、インレットで受信した数値で置き換えることができます。

sxformat オブジェクトの可変アーギュメントのフォーマットは、message オブジェクトの可変アーギュメントの場合とは異なります。sxformat オブジェクト内の可変アーギュメントは次のように指定します。

・整数のアーギュメントであることを示す i の文字を含みます( $i1 のように書きます )。

・is という語によって先行されています。

・スラッシュ( / )によって両側を区切られています。

例えば、可変アーギュメント / is $i2 / は第2インレットで受信された数値(あるいは左インレットで受信した リストの2番目の数値)によって置き換えられます。

可変アーギュメントによって入力される数値を使った演算を行なうこともできます。例えば、可変アーギュメント / is $i1 + 1 / では、左インレットで受信した数値を送信する前に1を加えます。

sxformatは左インレットで数値、あるいリストを受信すると、数値で可変アーギュメントを置き換え、各アーギュメントを順番に、連続してアウトレットから送信します。

多くの場合、プログラマーはsysyex メッセージのバイトを10進法ではなく16進法で表します。16進数を書き込みたい場合、Max では、16進数の前に 0x ( ゼロ-x ) をつけることによって可能になります。

次は、16進数で書いた同じシステム・エクスクルーシブ・メッセージの例です:

sysex メッセージの例

sysex メッセージのステータスバイト(メッセージはこのバイトで始まります)は常に240です。2番目のバイトはマニュファクチャラー ID (メーカーID)です。主だったシンセサイザのメーカーはブランド名に割り当てられた独自のナンバーを持っています。その次からのバイトは、メーカーによって定義されたもので、表されるものによって必要なだけのバイト数があります。sysex メッセージは、常に、sysex メッセージの終わりを表すバイト(“end-of-sysex-messsage” )で終わり、その値は247 です。

シンセサイザは、sysex ステータスバイト (240) を受信すると、2番目のバイトに注目します。2番目のバイトが他のメーカーの ID である場合、シンセサイザは、それに続くすべてのバイトを無視します。これは、247 を受信するまで続き、その後、再び入力される MIDI メッセージに注意を払い始めます。

パッチャーウィンドウの右下隅には sxformat オブジェクトの使用例があります。これは、Yamaha DX7 シンセサイザ(あるいは TX 音源)のピッチベンドレンジを変更する働きを持つように設計されています。第1アーギュメントは sysex ステータスバイトの 240です。そして第2アーギュメントは Yamaha のマニュファクチャラー ID の67です。Yamaha は、その次のバイトを、シンセサイザに対してどのようなメッセージが受信されるかを説明するものであると定義しています。このケースで、16 は”チャンネル 1 のパラメータチェンジ”を意味しています。

4番目のバイトは、このsysex メッセージが パフォーマンス・パラメータチェンジであることを指定しています。その次のバイトはパラメータナンバーで、 3 はピッチベンドレンジを表します。

次のバイトでは、ピッチベンドレンジの設定(ピッチを半音単位でどれだけ上下させるか)を指定しています。この値を変更できるようにする必要があるため、sxformat オブジェクト内では、このバイトを可変アーギュメントで作成しました。ピッチベンドレンジの値は 0 から12半音までにしなければならないため、入力される数値が0 ? 12 に制限されるように、% 13 の計算を含め、 / is $i1 % 13 / としています。これでメッセージのデータ部分は終わりなので、次に終了を表すバイト 247 が置かれています。

インレットで数値を受信すると、その数値をピッチベンドレンジの値として1回につき1つ使い、メッセージのすべてを送信します。

・Yamaha DX7 を持っている場合、ナンバーボックスをドラッグしてピッチベンドレンジを変更することができます。持っていない場合には、シンセサイザはこのメッセージを無視します。

エキストラプレジション(高精度)・ピッチベンド・データ

ほとんどの MIDI キーボードは128段階のピッチベンド値を送受信し、Max の MIDI オブジェクトでも同様です。しかし、実際には MIDI ピッチベンド・メッセージはピッチベンド量の表現においてより精度を高めるためにもう1つのバイトを持っています。そして、いくつかのシンセサイザではこの機能を利用しています。シンセサイザがエキストラプレジション機能を持っていない場合、シンセサイザは、常にエキストラプレジション・バイトに値 0 を送信し、ピッチベンド・メッセージを受信する際には、エキストラバイトを無視します。

エキストラプレジションの機能を持つ MIDI キーボードのために、Max には midiin オブジェクトで受信したエキストラ・ピッチベンド・データを解釈するオブジェクトがあり、また midiout オブジェクトによって送信するエキストラ・ピッチベンド・メッセージをフォーマットするオブジェクトがあります。

この機能を持っている MIDI 楽器は比較的少ないため、このチュートリアルでは詳細については述べていません。より詳しい情報は Max リファレンスマニュアルの xbendinxbendout を参照して下さい。

リリース・ベロシティを伴うノートオフ・メッセージ

MIDI の世界にはノートオフを表現する2つの方法があります。その1つはリリース(キーアップ)・ベロシティを伴ったノートオフ・メッセージで、もう1つは、のキーダウン・ベロシティ 0 のノートオン・メッセージです。ほとんどのシンセサイザはキーアップ・ベロシティを感知しないため、noteoutはノートオフの方法として後者の方法を使用しています。

しかしキーアップ・ベロシティを感知するシンセサイザのために、Max にはリリース・ベロシティを伴うノートオフ・メッセージを解釈しフォーマットするオブジェクトがあります。これらのオブジェクトの詳細については、Max リファレンスマニュアルの xnoteinxnoteout を見て下さい。

まとめ

midiin オブジェクトは受信した MIDI データを各バイトごとに出力します。midiout オブジェクトはインレットで受信した数値を送信します。これらのオブジェクトに対し、文字アーギュメント、デバイス名を書き込むか、インレットに port メッセージを送信することによって、特定のポートと送受信を行なうように設定することができます。

midiparse オブジェクトは midiinから受け取った生のMIDI データを解釈し、それぞれのアウトレットからそれぞれのタイプのデータを送信します。midiparase の逆を行なうオブジェクトが midiformat です。これは、それぞれのインレットからデータを受信し、様々なタイプの完全な MIDI メッセージを準備します。このMIDI メッセージは midioutによって送り出されます。

midiout オブジェクトによって送信されるシステム・エクスクルーシブ・メッセージのフォーマットを手助けするために、sxformat オブジェクトでは、アーギュメントを書き込むことによって、これを個々のバイトとして1つずつ送信することができます。sxformat オブジェクトの中には、送信される前に、入力された数値によって置き換えられる可変アーギュメントを含めることができます。

capture オブジェクトは受信したすべての数値のリストを格納します。capture オブジェクトをダブルクリックすると、テキストウィンドウでそのリストを見ることができ、そのテキストウィンドウの内容をテーブルウィンドウにコピーすることができます。capture オブジェクトは、アウトレットから出力される数値を正確に理解しようとする場合に、その数値の流れを見るのに適しています。

参照

Librarians パッチのエディタ?とライブラリを作成。
MIDI MIDI ソフトウェアのプロトコル。
midiformat MIDI メッセージ形式のデータをフォーマットします。
midiin 入力される MIDI データを送信。
midiout MIDI データを出力します。
Ports MIDI ポートの指定。
sxformat MIDI システム・エクスクルーシブ・メッセージをフォーマットする。
xbendin エキストラ・プレジション・MIDI・ピッチ・ベンド・メッセージをフォーマットする。
xnotein

リリース・べロシティを伴う MIDI ノート・メッセージを解釈する。

xnoteout リリース・べロシティを伴う MIDI ノート・メッセージをフォーマットする。