チュートリアル13

Scissors(鋏)とGlue(糊)


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

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

このチュートリアルパッチには、お互いにうまく補完し合う2つのオブジェクト、jit.scissorsjit.glueがあります。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.sissorsの持つアウトレットの数はオブジェクトが生成される時点で決定します。従って、rows及びcolumsアトリビュートはオブジェクトボックスで指定されている場合にのみアウトレットを作ります。例えば、jit.scissors @rows 10 @columns 2と書き込まれている場合、jit.sissorsのインスタンスは20個のマトリクスアウトレット(そして、アトリビュートの問合せに使われる通常の右アウトレット1個)を持ちます。しかし、アーギュメントを指定しない、シンプルな形で作られたjit.sissorsオブジェクトは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はどのインレットにマトリクスを受け取った場合でも新しく合成されたマトリクスを出力します。これは、理論的には良いアイデアのように感じられるかも知れませんが、多くの冗長な作業をともなうJiiter処理のフレームレート(速さ)の泥沼に、容易にはまってしまう恐れがあります。


まとめ

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