チュートリアル 2

マトリクスを作る


マトリクスとは?

この章では、マトリクスで数値データを取り扱うためのいくつかの方法について御紹介します。

もし、マトリクスについての理解が十分でないと思われる場合は、トピックスの部分にある「マトリクスとは?」という章をまず御覧になって下さい。ここで簡単にまとめると、マトリクスとは仮想のグリッド(格子)上に数値を置くことによって、大量の数値データを格納したり、処理したりするための方法であると言えます。マトリクスにデータを格納すると、個々の値は、それが格納されているグリッドの場所によって簡単に識別でき、マトリクスの全部、または一部を参照することによって一度に多くの値を加工することができます。

チュートリアルの前の章では、ウィンドウをオープンし、マトリクスの中身をカラーピクセルとして表示するためにjit.windowオブジェクトを使いました。表示されたマトリクスはjit.qt.movieオブジェクトからのものでしたが、このオブジェクトは、絶えず自分自身のマトリクスをQuickTimeビデオのカレントの(その時点での)フレームで満たすものでした。事実、jit.windowが表示していたビデオは、それがたまたまマトリクスの中身であったに過ぎず、それがディスプレイに送られた結果であると言えます。しかし、実際にはマトリクスのどのような数値でも同様にビジュアライズ(視覚化)することができます。このチュートリアルのパッチ例では、Jitterの中心的な概念である「マトリクス」の理解を深めることができるようなシンプルな例をお見せしようと思います。


jit.matrixオブジェクト

・Jitter Tutorialフォルダにある02CreateAMatrix.patというチュートリアルパッチを開いて下さい。

8ビットの値1つずつを格納できる、12X16の記憶領域を生成します。


jit.matrixオブジェクトは単に、メモリ上の記憶領域であるマトリクスを生成します。これによって、数値を格納したり、読み出したりすることができます。また他のオブジェクトを使って値を出力したり、視覚的に表示したりすることも可能です。jit.matrixのアーギュメントは、オプションである[name](この例では、含まれていません)、[planecount](マトリクスの個々のセルに値がいくつ格納されるか)、データの[type](個々の数値を表すためにどのくらいのバイト数を使うか)、そして[dim]("dimensions"の省略形で、マトリクスがどのくらいの大きさかを示す)です。これらがアーギュメントであるということを表す意味で括弧[]を使いますが、これは実際にアーギュメントとしてタイプするわけではありません。
この例のオブジェクトは1プレーン(マトリクス各々の場所に1つの数値を格納)で、charデータ型(1バイトの値)を用い、16×12の大きさ(これは192個のセルを持ちます)になります。このことから、このマトリクスは、192個の個別な数値を持つことができ、それらは各々0から255までの範囲(1バイトで表せる範囲)にある値を持つと推定できます。

ノート:ここでは常に2次元のマトリクスをx,y(幅、高さ)という順序(フォーマット)で記述しています。これは、最初に水平方向の大きさを書き、次に垂直方向の大きさを書くということを意味します。この「列(column)」を先する書き方は、これらの大きさが、通常、ビデオやコンピュータのスクリーンのレイアウトとして論じられる場合の方式とうまく一致しています。逆の考え方で、最初にデータの(縦方向の)行数(row)を書き、次に(横方向の)列数(column)を書くというものもあります。この方法で書いて欲しいという方もいらっしゃるかも知れませんが、もしJitterで、マトリクスに対して線形代数のテクニックを用いるのであれば、この行を先にする書き方は、線形代数で通常記述される、「列が先で、次に行(row major)」という書き方とは違ってしまいます。

ここでは、buttonオブジェクトをjit.matrixオブジェクトのインレットに接続してあります。Jitterオブジェクトは、bangメッセージを左インレットに受け取るとマトリクスの名前を出力するということを思い出して下さい。そのため、このbuttonオブジェクトによって、jit.matrixオブジェクトにマトリックスの名前を(jit_matrixメッセージの形で)出力させる(jit.matrixをトリガする)ことができます。


The jit.printオブジェクト


各々1つの8ビットの値(シングル8ビット値)のための、16×12の記憶領域を生成します。


jit_matrixオブジェクトの下に、別の新しいJitterオブジェクトjit.printがあります。このオブジェクトはマトリクスの名前(すなわち、jit_matrixメッセージ)をインレットに受け取り、マトリクスの値−非常に扱いにくい場合もあるような純粋な値−をフォーマットして(書式を整えて)Maxウィンドウに出力します。Maxのprintオブジェクトとほとんど同様にフォーマットされた値を直接Maxウィンドウに出力し、左アウトレットからjit_matrixメッセージとして(通常、Jitterオブジェクトが行う方法で)マトリクス名を出力します。

・"output"と書かれたbuttonオブジェクトをクリックして下さい。すると、jit.matrixオブジェクトはそのマトリクス名をjit.printオブジェクトに伝え、jit.printは数値の書式を整えてMaxウィンドウに出力します。

Maxウィンドウにleft:jit_matrix [適当な名前] という表示があるのに気付かれるでしょう。"left" という語は、これがprint leftオブジェクトによって表示されたものであることを示しているので、これが jit.matrixオブジェクトから出力されたものであることがわかります。マトリクスの名前を決めていなかったため、(jit.matrixオブジェクトの第1アーギュメントとして名前を書き込んでおかなかったため) jit.matrixは自分で名前を選んで割当てます。このとき、他では用いられないようなユニークな名前をつけようとするので、通常"u330000007"のようないささか奇妙な名前になります。ここでは、実際にどんな名前がつけられたかはあまり重要ではありませんが、この名前は、jit.printにどのマトリクスのデータをフォーマットして表示するかを伝えます。

その下には、指定されたマトリクスの値が、16列(colomn)、12行(row)の形にきちんと書式化されて表示されます。これはjit.printオブジェクトから出力されたものです。まだマトリクスには何もデータを格納していないので、この時点では実際に値はに0になります。


マトリクスの値の設定と問合せ

前の章では、どのようにしたらマトリクス全体をQuickTimeムービーから送られてくるカラーデータのフレームによって自動的に満たすことができるのかを見てきました。マトリクスには、指定した個別のセルに数値をおくことも可能ですし、指定した場所から値を取り出すこともできます。この例で、jit.matrixのすぐ上にあるいくつかのオブジェクトは、マトリクスに値をセットしたり、取り出したりするために使用できるメッセージを表しています。

setcell、getcellというメッセージによって、マトリクスの特定の値にアクセスすることができます

setcellというメッセージを使って、マトリクスの特定の場所に値を書き込むことができます。この場合の書式は setcell [セルの座標] val [書き込む値] という形になります。(訳注:書き込む値のところは、複数のプレーンを持つマトリクスの場合、複数の数値を指定することもあります。このため原文ではvalue(s)という表記になっています。)例えば、jit.matrixに、setcell 0 0 val 127 というメッセージを送ると、マトリクスのいちばん最初のセル(すなわち、左上隅のセル)に127という値がセットされます。それぞれの次元のセル座標には、0からその次元のマトリクスの大きさより1少ない数までが割り当てられます。そのため、このマトリクスでは、x次元の位置には0〜15までの値が、y次元の位置には0〜11までの値が割当てられることになります。このようにして、右下隅のセルは15 11という座標で表されることになります。

pack 0 0 0 オブジェクトとメッセージボックスの組み合わせはjit.matrixオブジェクトに適したsetsellメッセージを形成する手助けとなります。最初に、値を書き込みたいx,yの位置をセットし、次ぎに書き込む値を指定します。x,yの位置が0 0 の場合は、"value"というラベルのあるナンバーボックスを使って127という数値をpack0 0 0 の左インレットに送ります。このようにするとメッセージ setcell 0 0 val 127 がメッセージボックスからjit.matrixへ送られます。


setcell 0 0 val 127 というメッセージによって、セル位置 0 0 に 127 がセットされます

(マトリクスが2つ以上のプレーンを持っている場合、セルの特定のプレーンに値をセットしたり、セルの全てのプレーンに値をセットしたりすることができます。しかし、ここでのマトリクスは1つのプレーンしか持っていないので、その点に関しては別の所で御説明したいと思います。)

・セル位置の番号付けについてご説明したことを確認するために、jit.matrixにsetcell 15 11 val 255 というメッセージを送ってみましょう。最初に"x position"と表示されたナンバーボックスに15を、
"y position" と表示されたナンバーボックスに11を入力します。次に、"value"と書かれたナンバーボックスに255を入力します。そこで、"output"と書かれたボタンをクリックして、マトリクスがどのように変化したかを見ましょう。Maxウィンドウには、マトリクス全体の値が、jit.printを経由して再度表示されます。セル位置 0, 0 と 15. 11 の値がそれぞれ127 と 255 に変化している点に注目しましょう。


setcell 15 11 val 255 というメッセージは、セル位置15, 11 に255 をセットします


jit.pwindow オブジェクト ―

パッチャーウィンドウの黒い長方形の領域が変化したことにお気付きになったでしょうか。左上隅と右下隅が変化しています。(Maxウィンドウによって隠されてしまっていた場合は、この変化を確認するためにもう一度"output"ボタンをクリックして下さい。)


jit.pwinodow オブジェクトは、数値を色(またはグレースケールの値)として表示します。

ここでは、jit.pwinodowというユーザインタフェースオブジェクトを御紹介しましょう。 jit.pwindowは、オブジェクトパレットでこのように表示されます。


オブジェクトパレットのjit.pwinodowカーソル

このオブジェクトをパレットで選択し、パッチャーウィンドウの中でクリックをすると、小さな長方形のオブジェクトが生成されます。(大きさを調整するためには、オブジェクトの右下隅のグロウバーをクリックします。)このオブジェクトは、jit.windowオブジェクトとほとんど同様の機能を持っていますが、マトリクスのデータを、別のウィンドウではなくパッチャーウィンドウの中に表示します。

そのため、ここでは文字どおり数値(このケースでは、0〜255の範囲にあるcharデータ)が色として表示されています。このマトリクスには1つのプレーンしかないため、ここではモノクローム−すなわちグレイスケールで表示されています。値0では完全な黒になり、他の値は、値255で完全な白になるまでのグレーの段階で表示されます。ですから、セル 15, 11 の値 255 は白で、0, 0 の 値 127 は黒と白の中間の50%のグレーで表示されます。

「よくわかりました。でも、この方法で大きなマトリクスを作っていたらとても長々として退屈ですね。」という御意見が聞こえて来そうです。ごもっともです。
しかし、当然ながらMaxではこのような処理を自動化するプログラムを別の部分として書くことができます。


アルゴリズムによってマトリクスを満たす

・patcher fillmatrix オブジェクトをダブルクリックして、fillmatrixというサブパッチャーウィンドウをオープンして下さい。このサブパッチャーは、数式に異なった数を与えて、マトリクスのそれぞれの場所に対する192個の異なった値を生成します。


マトリクスのセルを満たすために、アルゴリズムによって数値を生成することができます

Uzi 12 オブジェクトは(メインパッチャーウィンドウの "fill"と書かれたbuttonオブジェクトから)bangメッセージを受け取ると、すばやく1から12までの数を順に右アウトレットから出力し、その1つの数ごとに左アウトレットからbangメッセージを送りだします。このbangメッセージがUzi 16 オブジェクトのトリガ(引き金)となって、その都度、1から16までの数が Uzi 16 オブジェクトの左アウトレットから出力されます。実際には、0〜11、および0〜15となるように、これらの数から1を引き、これをマトリクスのy、xの位置として使います。12のy位置の1つ1つに対してUzi 16 オブジェクトが全てのx位置を指定し、さらに、この数値を(exprにある)数式に与えて、その位置に格納する値を計算させています。これらの数値はアウトレットから出力され、メインパッチで適切なsetcellメッセージを作るために使われます。このやり方は、前に手作業で行ったのと同じものです。

ここでは、数式自体はあまり重要ではありません。単に面白いデータパターンを生成する式ならばどんなものでもよかったのです。このケースでは、列ごとにサインカーブを描く明るさのグラデーションを生成し、列全体の明るさが左から右に向かって(つまり、xが大きくなるに従って)増していくような式を選びました。

・fillmatix サブパッチを閉じて、"fill"と書かれたbuttonをクリックして下さい。マトリクスはMaxの1スケジューラの間に、(サブパッチのUzi オブジェクトによって生成された)数値によって満たされます。さらに、"output"と書かれたbuttonをクリックして、マトリクスの中身を見てみましょう。数値がMaxウィンドウに出力され、jit.pwindowに表示されます。

このような16×12といった小さなマトリクスでも、Maxウィンドウに現れた数値を見ただけでその傾向を知ることは困難です。しかし、jit.pwindowの表示によって、マトリクスの中の値がどのように変化しているかを明確に、直感的に把握することができます。このことは、数値データの視覚化(ビジュアライゼーション)による恩恵の1つの例を示しています。

Maxの中でアルゴリズムにょってマトリクスを満たす他の方法があることは想像できるでしょう。それについては、先のチュートリアルの中で実際に御紹介しようと思います。


jit.matrixへの他のメッセージ

jit.matrixは他にも、とてもここでは説明しきれないくらい多くのメッセージを理解します。パッチャーの右側では、jit.matrixを即座にすべて同じ値で満たす、便利な2つのメッセージを紹介しています。jit.matrixにclearメッセージを送ると、全ての値は0になります。また、setallメッセージ(後ろに数値を伴ったsetallという語)はマトリクスの全ての位置をその値で満たします。

もう1つ、getcellメッセージについて説明します。getcellという語の後にマトリクスの位置(x位置、y位置)を続けたメッセージによって、jit.matrixはセル座標とその位置にある値を右アウトレットから出力します。

・getcell $1 $2 というメッセージボックスの上のナンバーボックスにy値、x値を入力して、Maxウィンドウに注目して下さい。マトリクスのその位置にある値がjit.matrixの右アウトレットから報告されているのを確認しましょう。


マトリクス位置8.6 の値を参照すると;cell 8 6 val [数値] が報告されます。

チュートリアルの後の章では、マトリクスから取り出された値を使用するための様々な方法について説明します。


まとめ

jit.matrixオブジェクトは、指定されたマトリクスの大きさ、プレーン数、データタイプによって、名前をつけられたデータのマトリクスのための記憶領域を生成します。このマトリクスは他のJitterオブジェクト(例えばjit.qt.movie)からのデータで満たすことができます、また、setall[数値] というメッセージによって、全てのセルをその数値にセットしたり、setcell [セル位置] val [数値] というメッセージによって、指定したセルに値をセットすることができます。アルゴリズムを使って、マトリクスを数式やルールの組み合わせによって満たすために、それをパッチ内の別の所に書くこともできます。

getcell[セル位置] というメッセージを使って、特定のセルのデータを取り出すことができます。Maxウィンドウにすべての数値データを表示したい場合は、jit.printオブジェクトを使ってマトリクスのデータを整形し、出力させます。マトリクスのデータを色としてみる場合はjit.pwoindowオブジェクトを使用します。これは、チュートリアル1で説明したjit.windowと同じように使用できます。

このチュートリアルでは、前の章のようなデジタルビデオではなく、自分自身で生成した数値データを見ました。どちらの場合でも、記憶の原理は全く同じです。マトリクスの使用が、がデジタルビデオのフレームによるピクセルの色情報を保存するためであるか、色として見ようとする抽象的な数値を保存するためであるかにかかわらず、どちらの章で扱った数値も2次元のマトリクスとして保存され、jit.winodowまたは jit.pwindowで容易に表示することができます。