/**/

チュートリアル 13:
はさみと糊 (Scissors and Glue)

このチュートリアルでは、2次元のJittetマトリックスの矩形の領域を分割したり、結合させたりする2つのシンプルなオブジェクトの使い方を学びます。

・Jitter Tutorial フォルダの13jScissorAndGlue.patというチュートリアルパッチを開いて下さい。

このチュートリアルパッチでは、お互いにうまく補完し合う jit.scissorsjit.glue という2つのオブジェクトを紹介しています。jit.scissors は、マトリックスを等しいサイズの小さなマトリックスに分割し、 jit.glue は 複数のマトリックスを1つのマトリックスに結合します。さらに、複数のソースを複数のデスティネーション(行き先)に簡単にルーティングすることができる router というMax オブジェクトについても簡単に見ておきたいと思います。


ムービーの読み込み

パッチの左上は簡単なものです。loadbang オブジェクトは、自動的にread traffic.movメッセージを jit.qt.movie に送り、道路の場面を撮影したムービーを読み込みます。

・パッチの上部にある toggle ボックスをクリックして、metro オブジェクトをスタートさせて下さい。パッチの下部にある大きな jit.pwindow に道路の映像が現れるのがわかると思います。さらに面白いことには、4つに分割された道路の映像が、右側にある離れた jit.pwindow オブジェクトにそれぞれ映し出されています。

切り出し

jit.scissors オブジェクトは、道路の場面の Jitter マトリックスを4つの小さなマトリックスに分割する役割を果しています。


jit.scissors オブジェクト

jit.scissors オブジェクトは、あらゆるサイズ、型、プレーン数の Jitter マトリックスを小さな Jitter マトリックスに分割し、それぞれを独立したアウトレットから送りだします。rows colums というアトリビュートは、オブジェクトがインレットで新しいマトリックスを受け取った場合それを何個の小さなマトリックスに分割するかを指定します。このチュートリアルパッチでは、jit.scissors オブジェクトはイメージを4つの小さなマトリックス (2列(columns) × 2行(rows)) に分割しています。この分割されたマトリックスは、列優先(column-major)の順序で、オブジェクトの個別のアウトレットから送信されます(言い換えると、オブジェクトは小さなマトリックスへのアウトレットの割り当てを、左から右、上から下という順序で行います)

訳注:実際にパッチを見てみるとわかりますが、jit.scissors のアウトレットは、左から順に、映像の左上、右上、左下、右下に割り当てられています。

jit.scissorsに関して知っておく必要がある2つの重要な事項:

1) jit.scissorsの持つアウトレットの数はオブジェクトが生成される時点で決定します。したがって、rows および colums アトリビュートはオブジェクトボックスで指定されている場合にのみアウトレットを作ります。
例えば、jit.scissors @rows 10 @columns 2 と書き込まれている場合、jit.scissors のインスタンスは20個のマトリックスアウトレット(そして、アトリビュートの問合せに使われる通常の右アウトレット1個)を持ちます。しかし、アーギュメントを指定しない、シンプルな形で作られた jit.scissors オブジェクトは1個のマトリックスアウトレットしか持っていません。rows および columns アトリビュートはオブジェクトに Max メッセージを送ることによって変更することが可能ですが、オブジェクトによって最初に作られた数を超えてアウトレットを追加することはできません。

2) jit.scissorsによって出力される個々のマトリックスのサイズ(dim)は、元のマトリックス全体と同じではなく、分割されたサイズと等しくなります。例えば、このチュートリアルパッチで作られる4つの小さなマトリックスはそれぞれ160×120セルになり、320×240にはなりません。

マトリックスのルーティング

このパッチでは、jit.scissors から出力される4つの小さなマトリックスはそれぞれ2つの違った場所に送られます。1つはどんな映像かを見るための jit.pwindow、そしてもう1つはパッチの中程にある router というMaxオブジェクトです。色付きのパッチコードによって、各々の小さなマトリックスが送りだされる場所を示しています。


Maxの router オブジェクト

router オブジェクトは、Maxの gateswitch というオブジェクトを組合わせたような働きを持っています。このオブジェクトは2つのアーギュメント(ルーティング可能なインレットの数、およびアウトレットの数)を取り、左インレットにメッセージを受け取ることによってコントロールされます。routerが解釈できるほとんどのメッセージはMSPオブジェクトである matrix~ と同じです。そのため、容易に matrixctrl オブジェクトを router と組合わせて使用することができます。

この router オブジェクトの右から4つのインレットは、jit.scissors オブジェクトの4つのマトリックス用アウトレットからの入力を受けます。routeit というシンボルを持った receive オブジェクトは、チュートリアルパッチの右下の部分からメッセージを受け取り、routerオブジェクトをコントロールします。 routerオブジェクトの左から4つのアウトレットはjit.glueオブジェクトに接続されています。 jit.glueについてはこのすぐ後で説明します。


router のコントロール

routerオブジェクトへ patch の後にインレットナンバーとアウトレットナンバーを続けたメッセージを送ると、 router オブジェクトはそのインレットとアウトレットの間に仮想的な接続を行います。インレットにどんなメッセージが届いても、それは即座に該当のアウトレットに転送されます。そのアウトレットにすでにインレットとの接続がなされている場合、patch メッセージはその接続を切断し、新しい接続を優先させます。

このパッチの radiogroup オブジェクトは、(routerのインレットに届いた)4つの小さなマトリックスを router のどのアウトレットに送るかをコントロールします。インレットおよびアウトレットのナンバーは0から始まるため、patch 2 1 というメッセージは router オブジェクトの3番目のルーティング可能なインレットと2番目のアウトレットを接続します。

radiogroup コントロールの何か所かをクリックして、下側の jit.pwindow に出力されるイメージがどのようになるかを観察して下さい。router オブジェクトを使うことによって、道路の映像から切り出されたマトリックスを、下にある合成されたイメージの4つのどの部分にでも表示させることができる点に注意して下さい。

結合するためのの「糊」

パッチの下部にある jit.glue オブジェクトは、事実上 jit.scissors と反対の働きをします。rows および columnsアトリビュートは、アウトレットではなくインレットを指定します。そして、入力されたマトリックスはグリッド上に配置され、合成されたマトリックスが出力されます。


jit.glue の4つのインレットに同じマトリックスを送った場合

重要な注:jit.scissors と同様、jit.glue もオブジェクトが生成される場合にのみ新しいインレットとアウトレットを作ることができます。そのため、オブジェクトボックスに書き込まれた rows および columns アトリビュートによってインレットとアウトレットの数が決定されます。さらに、jit.glueによって生成され、出力されるマトリックスのサイズ(dim)も小さいマトリックスを寄せ集めた大きさと等しくなります(例えば、このパッチで使われている4つの160×120のマトリックスの場合、320×240のマトリックスが1つ生成されます)。

jit.glue に関して覚えておく必要がある最後の注意点は、jit.glue のデフォルトの動作では、いちばん左のインレットにマトリックスが送られた場合にのみ合成されたマトリックスを出力するということです。jit.glue オブジェクトのいちばん左のインレットに何も接続しない場合、もはやこのオブジェクトから新しい出力マトリックスを得ることはできません。syncinlet アトリビュートを使うと、jit.glue が他のインレットでマトリックスを受信した場合でも、それに対応してマトリックスを出力させることができます。syncinletの値が -1 の場合、 jit.glueはどのインレットにマトリックスを受け取った場合でも新しく合成されたマトリックスを出力します。これは、理論的には良いアイデアのように感じられるかも知れませんが、多くの冗長な作業をともなうJitter処理のフレームレート(速さ)の泥沼に容易にはまってしまう恐れがあります。

まとめ

jit.scissors オブジェクトはマトリックスを小さな、等しいサイズの矩形のマトリックスに分割します。 jit.glue オブジェクトは等しいサイズの矩形のマトリックスを受け取り、それらを寄せ集めて合成されたマトリックスに貼り付け直します。2つのオブジェクトの rows および columns アトリビュートは、オブジェクトが生成される際のそれぞれのアウトレットまたはインレットの数を決定し、同時に分割、あるいは合成するマトリックスの数を決定します。 router オブジェクトを使うことによって、MSPの matrix~ オブジェクトと同じような方法で、複数のインレットで受け取ったMaxメッセージを複数のアウトレットへ任意に送ることができます。