マトリクス

マトリクスとは?


マトリクスはグリッド(格子)であり、そのグリッドの中での各位置はいくつかの情報を持っています。例えば、チェス盤におけるすべての四角形は特定の駒があるとか駒がないという情報を含むマトリクスです。

白がポーン(訳注:チェスの駒の一つ)をマトリクス上の位置e2からe4に動かしたところ

検討を進めていくために、マトリクス上の各位置での「情報」を数値データ(数)と考えてみましょう。
ここに各グリッドの位置に数を伴ったマトリクスがあります

表計算ソフトは2次元マトリクスの一例です

データのそれぞれの横軸を行(row)と呼び、縦軸を列(column)と呼びます。道路地図やチェス盤、または表計算ソフト上において、たいていは列に文字、行には数字を付けます。その列と行を指定することにより、私達は地図上のどんなグリッド位置に対しても参照することが可能になります。表計算ソフトにおいて、グリッド位置はセルと呼ばれています。そして上記の例では、セルC3の数値は0.319です。


この上に示した2つの図は、幅と高さを持つ2次元のマトリクスの例です。Jitterにおいてはマトリクスは1から32までの任意の次元を持つことができます。(1次元のマトリクスはプログラマが配列と呼ぶものと類似しています。Maxにはすでにtablemultisliderのように数値配列を格納するのに役立ついくつかのオブジェクトがあります。しかし、Jitterにおける1次元のマトリクスがさらに有効な場合があるかもしれません)紙上の表現は少し難しいのですが、幅、高さ、奥行きを持った立方体のような3次元のマトリクスをイメージしてみて下さい。(例えば、3つのセルの幅、3つのセルの高さ、3つのセルの奥行きを持った全部で3×3×3=27個のセルを持つマトリクス)


3×3×3のマトリクスは27のセルを持ちます


また、私達のビジュアルな想像力と説明するためのボキャブラリではなかなか難しいのですが、理論上は(Jitterにおいても)、4次元以上のマトリクスが存在することもできます。しかし、このチュートリアルでは2次元のマトリクスに限定しようと思います。


ビデオスクリーンはマトリクスの一種


ビデオスクリーンは小さな独立したピクセル(画素)から構成され、その各々のピクセルは指定された色を表示します。コンピュータのモニタでの解像度は、通常1024ピクセルの幅で768ピクセルの高さや、もしくは800×600であったり、640×480というようなものでしょう。テレビ画面(また一般的なビデオ画像)での解像度はおよそ640×480で、コンピュータ上で一般的にその程度で処理されます。これらすべての場合において、幅と高さの比であるいわゆるアスペクト比が4:3ということに注意してください。ワイドなDVフォーマットにおいては、アスペクト比は3:2です。そしてその画像は一般に720×480ピクセルです。ハイビジョン(HDTV)では、さらに別のアスペクト比の16:9とされています。
このチュートリアルで、私達は主に4:3のアスペクト比を使い、普通の大きさよりも小さい320×240や、さらに小さい160×120のピクセルを使っていきます。これは、単にMaxパッチ上の空間を節約するためです。

様々な一般的ピクセル領域のサイズ比較


標準的なビデオの単独フレーム(例えば任意の瞬間での単独のビデオ画像)は、640×480=307,200ピクセルで構成されています。そして、各ピクセルは色を表示しています。各ピクセルの色は数値によって表現されますが、私達の視覚に対して充分な種類の数であることが要求され、とても広範囲で多くの色の値を必要とします。


デジタル的に色を表現するには様々な方法があります。コンピュータ上で各ピクセルの色を表すための標準的な方法は、赤、青、緑(これらはRGBと呼ばれる)の3つの異なった色の要素に分解し、それに透明度・不透明度の要素(これはアルファチャネルと呼ばれる)を加えて表すものです。したがって、たいていのコンピュータプログラムでは、アルファ、赤、緑、青という要素(もしくはチャネル)という4つの値を一つのピクセルの色として格納します。この4つのチャネルの色表現方法は、一般的にメモリ上にピクセルがどのように配置されるかによって、ARGBとかRGBAと呼ばれます。


これに関してJitterも例外はありません。1つの色ピクセルを表現するために、マトリクスの各セルに対して順番に4つの数値(アルファ、赤、緑、青)を持たせており、1つの数値ではありません。そしてビデオフレームのデータを格納するマトリクスも、各セルに4つの値を実際に含んでいます。

マトリクスの各セルが1つ以上の数値を含むことができます

ビデオのフレームは、そのフレームのピクセルを表現するそれぞれのセルを伴い、このような2次元マトリクスとしてJitter上で表現されます。そして各セルは0から255の範囲でアルファ、赤、緑、青を表現する4つの値を含みます。単一セルに対して複数の数値というこの考え方(これはデジタルビデオにとって本質的要素です)をマトリクスにおける次元の概念から分離しておくため、Jitterでは、プレーンという考えを導入します。


プレーンとは何か


マトリクス上の数にメモリを割り当てるとき、Jitterは320×240というように各次元の範囲を知る必要があります。また、各セルが持つ値の数についても同様です。セル内の異なった値を見る順序を保つために、Jitterは分離されたプレーン上に存在する各セルという発想を用います。セル内のそれぞれの値は特定のプレーン上に存在します。そのためビデオデータは、並んだ4つのプレーンのデータの2次元マトリクスであるものと考えます。

このマトリクスの各セルの値は、4つの仮想プレーン上に存在するものと考えます


この概念の骨組みを利用することによって、私達は必要なときに個別に各プレーン(つまり色情報の各チャネル)を扱うことができます。例えば、もし画像の赤味を増したいならば、単純にマトリクスの赤プレーンのすべての値を増やし、他のプレーンはそのままにしておけばよいのです。

普通、Jitterでビデオを表現するとき、アルファ、赤、緑、青という4つのデータのプレーンを持った2次元マトリクスを使います。それらのプレーンは0から3という番号が付けられており、アルファチャネルはプレーン0、RGBチャネルはそれぞれ1、2、3になっています。


マトリクス内のデータ


コンピュータが数を格納する場合、様々な内部形式があります。もし特定のプレーン上に格納したい数の種類を知っているのなら、各々の数が必要とする充分なメモリ空間のみを割り当てることができるでしょう。例えば、ASCII規格に従ってアルファベット文字を格納したいのなら、0から255までの範囲を必要とするだけなので、各文字を格納するためには8bitsの空間を必要とするだけです(2の8乗=256の異なった値をとることができる)。もしさらに大きい範囲の数を格納したいのなら、32bitsを使えば良いでしょう。それによって -2,147,483,648から2,147,483,647の整数値を用いることができるようになります。3.1416のような小数の部分がある数の表現については、浮動小数点と呼ばれるものを使います。32-bitや64-bitのビットの一部で値の仮数を表現する部分と、指数を表現する他のビットによって表現されるものです。

Maxにおいてプログラミングをする多くの場合(例えばMIDIデータを扱っているだけのとき)、
Maxがどのように数を格納するか知る必要はありません。しかし、MSPにおいてディジタルオーディオをプログラミングするとき、MSPが浮動小数点の数値を使っていることを知っていると役に立ちます。(小数の端数を格納するのに誤って整数の格納場所を使ってしまうと数学エラーになるでしょう)Jitterにおいても同様で、コンピュータが格納する数値の様々な型に注意することは、起こり得る数学エラーを回避するためにたいへん役に立ちます。


Jitterマトリクスは、8-bit整数(char)、32-bit整数(long)、32-bit浮動小数点(float32)、64-bit浮動小数点(float64)として数値を格納できます。いくつかのJitterオブジェクトは、これらの可能なフォーマットのうちの一つの型の数値のみを格納します。他のオブジェクトは、それらの型のいくつか、もしくはすべての型を格納できます。


デフォルトでは、ほぼすべてのJitterオブジェクトがそのフォーマットをサポートしているものと想定して、左インレットから入力された任意のマトリクスのフォーマット(大きさや型)に合わせて内部のマトリクスを自動的に適応させます。例えば、jit.opオブジェクトはどんなフォーマットのマトリクスでも受け付けるので、4×3でfloat32のマトリクスをjit.opオブジェクトに送ったとすると、そのオブジェクトの内部マトリクスは送られてきたマトリクスに合わせて順応します。このデフォルトの振る舞いを適応モード(adapt mode)と呼びます。

オブジェクトの左インレットで受け取ったマトリクスにのみ基づいて、適応するということに注意して下さい。

もし、あるオブジェクトが送られてきたマトリクスのフォーマットをサポートしていない場合、エラーを返します。jit.scalebiasオブジェクトは4プレーンのcharマトリクスのみを受け入れます。そのため、4×3でfloat32のマトリクスを送った場合には、float32のマトリクスは受け入れられないためにエラーを返すでしょう。しかし適応モードでは、jit.scalebiasオブジェクトは、送られてきた4プレーンでcharのマトリクスのサイズに内部マトリクスを適応させるでしょう。

技術的注意:jit.matrixオブジェクトは、あるマトリクスフォーマットから別のものへ簡単にデータ変換するために使うことができます。上記で解説したケースで、jit.matrix 4 char 4 3オブジェクトを通る4×3でfloat32のマトリクスは、jit.scalebiasオブジェクトに合ったマトリクスフォーマットに変換されるでしょう。この点については、チュートリアルでさらに詳細に取り上げていきます。

適応モードは、型、プレーン数、次元に依存しないので、Jitterパッチの構造を簡単にします。同じ回路のJitterオブジェクトで、すべてのフォーマットのデータを処理できます。しかし、パッチを一つのデータフォーマットに限定したいときもあると思います。


適応モードを無効にするために、次の2つのうちの1つを実行することができます。


1. 特定の入力フォーマットを指定したアーギュメントを伴ったオブジェクトを作成することで、適応モードを無効にします。例えば、jit.op 2 float32 3 3のオブジェクトは、2次元、2プレーンのfloat32マトリクスのみを受け入れ、別のものを送った場合にはエラーを返します。


2. adapt 0メッセージを適応可能なオブジェクトに送ることができます。これによって、そのオブジェクトを現在の内部マトリクスのままにし、適応を無効にします。


オブジェクトが非適応になれば、次元の大きさが違っていても、同じフォーマットのマトリクスとして処理を続けます。
(例:jit.op 2 float32 3 3 のオブジェクトでも、2プレーンでfloat32の5×5のマトリクスを処理します)。ただし、この場合、入力マトリクスに対して次のように対応します。もし、入力マトリクスがそのオブジェクトの内部マトリクスよりも大きければ、内部マトリクスと重複する部分のみを処理します。入力マトリクスが小さければ、入力マトリクスの領域の外のセルには0を設定します。下図でこの点を明確にします。


非適応の結果


適応モードがオフのときには、手動でそのオブジェクトにplanecount、type、dimメッセージを送ることにによって、そのオブジェクトの内部マトリクスのプレーン数、型、次元を調整することができます。これらのメッセージに関する補足情報としては、"group-mop"に対するオブジェクトリファレンスを参照してください。適応を(再度)可能にするためには、非適応オブジェクトに対して単純にadapt 1のメッセージを送ります。

重要なコンセプト:ビデオを扱うためにJitterを使う場合、Jitterマトリクスのデータ格納について知るためにもっとも重要なことはおそらく次の通りです。上記の例のように、マトリクスがビデオデータを保持しているとき、そのデータはARGBフォーマットで表現されていると考えます。したがって、その各セルでは、おそらく(たいてい4つのプレーン内で)0から255の範囲の値を含んでいます。それは、もっとも一般的なデータ格納の型がcharだからです。さらに、格納されている値は一般的に数値です(アルファベット文字ではありません)。各々の値のために256の異なった値を取り得ることが必要なだけなので、1つのcharの8bitsで充分なのです。ビデオフレームはたいへん多くのピクセルを含み、各々のセルは4つの値を含むことができるます。そのため、とても多くの値を処理するときに格納領域を節約することは、Jitterにとって意味のあることです。ビデオデータの扱いは、多くのJitterオブジェクトにとって主要な働きであり、多くのマトリクスオブジェクトはデフォルトのchar格納型を使います。モノクロ(グレイスケール)の画像やビデオにとっては、charデータの単独プレーンで充分です。