/**/

マトリックスとは?

マトリックスはグリッド(格子)です。そのグリッドの中のそれぞれの場所にはいくつかの情報があります。例えば、チェス盤は、すべての四角形が「特定の駒があるか、駒がない」という固有の情報を持ったマトリックスであると言えます。


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

検討を進めるために、マトリックスのそれぞれの場所にある「情報」が数値データ(数)であると考えてみましょう。次の例は、グリッドのそれぞれの場所に数値が置かれているマトリックスです。


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

データの横軸の1つ1つを行(row)と呼び、縦軸を列(column)と呼びます。道路地図、チェス盤、表計算ソフトウェアでは、たいていの場合、列に文字、行に数字による名前をつけます。その列と行を指定することによって、私たちは地図上の任意のグリッド位置を参照することが可能になります。表計算ソフトにおいては、グリッド位置はセルと呼ばれています。そのため、上記の例では、セルC3の数値は0.319ということになります。

上の2つの図は、(水平方向の)幅と(垂直方向の)高さをという2つの次元(ディメンション)を持ったマトリックスの例です。Jitterではマトリックスは1から32までの任意のディメンションを持つことができます (1次元のマトリックスはプログラマが配列と呼ぶものと類似しています。Maxにはすでに table multislider のような数値の配列を格納するために役立つオブジェクトがあります。しかし、Jitterの1次元のマトリックスのほうが役立つケースもあるでしょう。) 。紙の上での表現は少し難しいのですが、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パッチ内でのスペースを節約するためです。


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

訳注:「ディメンションーdimension」 という語は、一般的な「次元」という意味で使用される場合と、「(各次元の)サイズ」という意味で用いられる場合があります。ここでは画面のピクセル数によるサイズを「ディメンション」と読んでいます。jitter の解説では、このような使われ方をする場合も多いようです。

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

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

これに関してはJitterも例外ではありません。マトリックスの個々のセルで1つのカラーピクセルを表現するために、1つのセルには、1つの数値ではなく、実際には4つの数値(アルファ、赤、緑、青)が格納されています。このため、ビデオフレームのデータを格納するマトリックスは、個々のセルに実際に4つの値を持っています。


マトリックスの各セルには複数の数値を持たせることができます

jitter ではビデオのフレームをこのような2次元のマトリックスとして表現します。そして、マトリックスの個々のセルはフレームのピクセルを表し、各セルにはアルファ、赤、緑、青を表す4つの値が、0から255の値で格納されています。1つのセルに複数の数値を格納するという考え方(これはデジタルビデオにとって本質的なものです)を、マトリックスにおける次元(ディメンション)の考え方から切り離して扱うことができるように、Jitterでは、「プレーン」という概念を導入しています。

プレーンとは?

マトリックス内の数値にメモリを割り当てる場合、Jitterは320×240といったような各次元(ディメンション)の範囲を知る必要があります。そして、同様に、個々のセルが持っている値の数を知る必要もあります。セル内の様々な値の経過を追っていくために、Jitterは、それぞれの値が別々のプレーン上に存在するという考え方を使います。セルの中のそれぞれの値は特定のプレーン上に存在するため、ビデオデータが、データのプレーンを4枚並べた2次元マトリックスであると考えることができます。


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

このような考え方を骨組みとして利用することによって、必要に応じてそれぞれのプレーン(色情報の各チャンネル)を個別に扱うことができるようになります。例えば、画像の赤味を増したい場合には、マトリックスの赤プレーンのすべての値を増加させ、他のプレーンはそのままにしておけばよいのです。

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

マトリックスの中のデータ

コンピュータには、数値を格納するための様々な内部的なフォーマットがあります。特定のプレーンに格納したい数値の種類がわかっている場合、その数値が実際に必要とするメモリ空間のみを割り当てることによって、メモリを節約することができます。例えば、ASCII規格によるアルファベット文字を格納したい場合、必要な値の範囲は0から255までであり、1文字を格納するために必要な記憶領域は8ビットだけです (28  = 256の異なった値を取ることが可能です)。さらに大きい範囲の数を格納したい場合には、32ビットを使えば良いでしょう。その場合 -2,147,483,648から2,147,483,647の整数値を用いることができます。3.1416のような小数の部分がある数の表現には、浮動小数点2進数と呼ばれるものを使います。これは、32ビットや64ビットの数値の中の一部のビットで仮数を表し、残りのビットで指数を表すようにしたものです。

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

Jitterマトリックスは、64ビットの浮動小数点数(プログラマは倍精度float または double と呼びます)、32ビットの浮動小数点数(単に float と呼びます)、32ビット整数(long int または int と呼びます)、8ビット整数(キャラクタ:charと呼びます)として数値を格納できます。いくつかのJitterオブジェクトは、これらの可能なフォーマットのうちの一つの型の数値のみを格納するため、その型を指定する必要はありません。しかし、それ以外の Jitter オブジェクトでは様々な方法で値を格納することができるため、char、long、float32、float64 という語を使って、オブジェクトの中にアーギュメントとしてデータ型を書き込んでおかなければなりません。

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