チュートリアル 21:
データフローのコントロール

イントロダクション

このチュートリアルでは、gate、switch、router を使ってイベントの送信先を決定し、Max パッチ内でのデータフロー(データの流れ)をコントロールするテクニックを学習します。また、このコントロールの処理に使用できるユーザインターフェイス要素についても学びます。radiogroup オブジェクトや matrixctrlオブジェクトがこれにあたります。この2つのオブジェクトは、インタラクティブな描画ルーチンで使用する描画コマンドを変更するために用いられています。Maxパッチの中の、インタラクティブな処理(パフォーマンスに基づいた処理)を行なっている部分では、いくつかの選択肢が用意されていて、この中から選ぶことができるようになっています。gate オブジェクトや switch オブジェクトは、データの送信元と送信先が1対1になるようなイベント送信をコントロールします。これに対し、router オブジェクトはデータの送信元と送信先が複数対複数になるような、マトリックス状の接続をコントロールします。シンプルでわかりやすいルーティングのコントロール方法があると、ルーティングを行なうオブジェクトはずっと便利で実用的なものになります。そのため、実際のコントロールオブジェクトを「視覚的に」切り替える制御インターフェイスとして radiogroup オブジェクトやmatrixctrl オブジェクトを使っています。

従来からのgate と switch

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

このチュートリアルのパッチを見て下さい。これは2つの描画ルーチンを実装している、大きめのパッチです。最初に、左側の描画システム(1 と表示されています)に注目しましょう。

パッチの最も上にある metro は mousedraw という patcher オブジェクトに bang メッセージを送信します。このサブパッチの内容は見覚えがあるはずです。このサブパッチはスクリーン座標上のマウスの動きを左下の lcd オブジェクトのサイズにスケールし(以前作った WTHTM_scaled というパッチオブジェクトを使っています)、その後、このスケールされた座標位置 +6 ピクセル と座標位置 -6ピクセルの値を使ってリストを作成します。これは、すでの前のチュートリアルで何回か行なっている処理です。このサブパッチの出力は gate オブジェクトの右インレットに送信されます。gate オブジェクトは、4つのprepend オブジェクトのうちのどれか1つにこのリストを送信することができます。これら4つの prepend オブジェクトは描画する図形が矩形か円か、また、枠だけを描くか塗りつぶすかを決定します。

この gate オブジェクトの目的は、受信した座標値のリストを(送信するとすれば)4つの prepend メッセージボックスのどれに送るかを決定することです。gate の右インレットに入力されたイベントは、左インレットへの入力値によって選択されたアウトレットに出力されます。この値を 0 に設定すると、出力は完全にオフになります。最も上の toggle を使って、metro オブジェクトをオンにして下さい。gate オブジェクトの左インレットに接続されているナンバーボックスを使って、1 から 4 の間の値を選び、lcd オブジェクトに表示される結果を見て下さい。

ナンバーボックスに入力するために接続されている4つの小さな円はユーザインターフェイスオブジェクトです。これは radiogroup オブジェクトというもので、組になった個別の選択肢から1つの値を選択するために使います。パッチをアンロックすして、radiogroup オブジェクトのインスペクタを調べると、"Nomber of Items" という項目が 5 に設定されていることがわかります。このアトリビュートは提供される選択肢の数を決めるためのものです。パッチに戻って、パッチをロックすると、radiogroup の選択肢の1つを選んだときに、選ばれた選択肢の値が出力されることがわかると思います。この値は 0 から始まります。このオブジェクトはgate の出力をコントロールする手段として完璧なものです。パッチでルーティングを行なう場合、これを使って選びたい数値をすばやく選択することができます。

gate を中心として作られた描画ルーチンの右側には、switch オブジェクトを中心とした同じようなシステムがあります。マウスによる描画をオフにして下さい(radiogroup オブジェクトの最も上のラジオボタンを選択すると 0 になります。これを選んでください)。そして、lcd オブジェクトを(スペースバーを押して)クリアして下さい。lcd をクリアしたら、switch オブジェクトに接続されている radiogroup の 0 でないオプション(選択肢)のうちの 1 つを選んで下さい。乱数を使った自動描画ルーチンが、lcd オブジェクトに円を描画していきます。オプション 1 では、drunk オブジェクトに基づいた描画ルーチンを使用します。これに対し、オプション 2 では、random オブジェクトに基づいたルーチンを使用します。自動描画を停止したい場合には、オプション 0 を選んで、lcdオブジェクトに何も送信しない状態にして下さい。switch オブジェクトは gate オブジェクトと逆の動作を行ないます。gate オブジェクトが1つの入力を多くのアウトレットに送信するのに対し、switch オブジェクトは多くの入力から1つの出力へ送信するものを選ぶために使用します。このケースでは、両方の patcher オブジェクトで出力メッセージを作っていますが、メッセージが prepend オブジェクトに送信されるのは1つのサブパッチからのものだけです。gate オブジェクトと同様に、switch オブジェクトによる選択も左側の入力に送られた値によってコントロールされます。そして、値 0 の場合、どのメッセージもswitch を通過させません。

router の使用

場合によっては、多くの入力を多くの出力にルーティングし、これらすべてを一斉に行なわなければならないことがあります。右側の描画パッチでは、metro は描画を行なう3つの patcher オブジェクトに接続されています。そして、これは確かに、前に見たパッチと同じ3つのサブパッチです。router オブジェクトには5つの出力があります。最初の4つはそれぞれ同じような prepend オブジェクトに接続されていて、これが描画で使用される図形を決定しています。インレットとアウトレットの数は、router オブジェクトのインスタンス化の際に用いられるアーギュメントによって判断されます。このパッチの処理のキーポイントになっているのは、router の左端のインレットに接続されているグリッド型のユーザインターフェイスオブジェクトです。これは、matrixctrl オブジェクトというもので、このオブジェクトが解釈できるメッセージフォーマットを使うと、2次元の「グリッド」によって接続を指定することができます。

このグリッドには、3本の縦の線(3つの入力に対応します)と4本の横の線(4つの出力に対応します)があることに気がつくと思います。2本の線の交点をクリックすると、小さな「パック」が表示され、接続が行なわれたことを表します。このため、例えば、左端の交点をクリックした場合、左端の入力と左端の出力が「接続」され、mousedraw という patcher オブジェクトが(metro がオンのときに)矩形の枠を描画するようになります。

2 と表示された toggle でmetro をオンにして、matrixctrl オブジェクトの中の様々なボックスをセットしたり、セットを解除したりしてみて下さい。router と gate/switch の1つの大きな相違点は、同時に複数の入力を複数の出力に送信できる能力であるということに注意してください。上段中央の接続を選択して下さい。するとdrunk オブジェクトによって矩形の枠が描画されることがわかるでしょう。今度は、中央の2行目を選択して下さい。矩形が描画され、その中に円が描画されます。これをさらにはっきり見るためには、lcd を(スペースバーを使って)クリアする必要があるかもしれません。入力と出力の接続のいろいろな組み合わせを試してみて、マトリックスによる選択が描画処理にどのような影響を与えるかを見て下さい。

Max ウィンドウを見ると、matrixctrl が router にメッセージを渡しているようすを見ることができます。このオブジェクトは 「インレット アウトレット ステート(状態)」という形式で通信を行なっています。この形式では、ステート 1 で接続が行なわれ、ステート 0 で接続が解除されます。gate や switch と異なり、入力と出力の値は 1 ではなく、0 から始まります。したがって、この例では、左インレットと最後(右端)のアウトレットの間の接続は、router に 0 3 1 というメッセージを送信することによって行なわれます。

結び

このチュートリアルでは、パッチのロジックの一部分でメッセージのルーティングを行なうために役立つオブジェクトをいくつか見てきました。switch オブジェクトは、左インレットに送信された値によって、複数の入力から1つを選択します。gate は switch の逆のことを行ないます。このオブジェクトは、1つの入力を受け取り、それを複数のアウトレットの中の1つに送ります。より複雑な「マトリックス状」のルーティングを行なう必要がある場合には、router オブジェクトを使用します。このオブジェクトは、複数のインレットで受け取ったメッセージを一連のアウトレットの中の任意の箇所(またはすべて)に渡すことができます。radiogroup オブジェクトは、gate や switch のようなオブジェクトに対するビジュアルなインターフェイスとして使用することができます。matrixctrl オブジェクトはマトリックス型のルーティングに対するビジュアルなインターフェイスを提供します。router と matrixctrl の組み合わせは、Maxで利用することができる、最もフレキシブルな(そして便利な)メッセージルーティングシステムの1つを提供します。

参照

gate トラフィック・コントロール
switch 複数の入力から1つを選びます。
router matrixctrlと相性の良いMax のメッセージルータ
radiogroup ダイアログ選択のための、ラジオボタン、あるいはチェックボックスのグループ
matrixctrl マトリックス状のコントロールを切り替えます。