チュートリアル5

ARGBカラー


Jitterでの「色」

この章では、Jitterにおいて「色」がどのように取り扱われるかについて考えます。ここでは、色の数値表現、また逆に、数値の色としての視覚化(ビジュアライゼーション)に焦点を絞ってみたいと思います。色彩理論の詳細な論議−光と物質が、どのようにして私たちに「色」の感覚を呼び起こすのかに関する知識−は、すでにこのチュートリアルの範囲を超えています。色情報をデジタル化して表すための多くの方法についての説明も同様です。色彩理論や色のデジタル表現についてより深く学びたいとお考えなら、Bibliographyに掲載した他の情報源をご覧下さい。

ここでは、色のデジタル表現方法の1つの方法を取り上げて、この表現方法がJitterでどのように取り扱われるかについて説明します。


カラーコンポーネント:RGB

それぞれが個別の強さを持つ3色の光−赤・緑・青−を混ぜ合わせることによって、どんなお望みの色でも作り出すことが可能です。これは加算合成(訳注:色彩の場合、「加法混色」という呼ばれ方をすることが多いようです。)として知られ、光の「3原色」を個別の量として加算することで色を作り出します。(この反対が、減算合成(訳注:減法混色)で、これは、ペイントなど、ある一定の色を吸収し、残りを反射するような有色顔料を混ぜ合わせる場合です。)このように、赤・緑・青という特定の色に相当する3つの周波数の強さによって、あらゆる色を表すことができます。

Jitterでは、この赤・緑・青の正確な強さの組み合わせとして色を表す方法が最も一般的です。画像(ビデオ、静止画、あるいは他の2次元マトリクス)の1つ1つのピクセルには、3つの基本となる色に対応する3つの値が最低限必要です。従って、スクリーン上のカラー画像には、通常3つ以上のプレーンを持つ2次元マトリクスを用います。


アルファチャンネル

4つめのプレーンはアルファチャンネル(他の画像に重ね合わせたときに、どのピクセルを透過させるかという情報を保存するチャンネル)として知られる方法にとって便利です。チュートリアルのこの章では、特にアルファチャンネルについては扱いません。しかし、ここで触れておく理由は、明確に色の表現を扱うほとんどのJitterオブジェクトでは、これを含むことが一般的だからです。ほとんどの場合、アルファチャンネルは最初のプレーン(マトリクスのプレーンナンバは0 から始まるのでこれはプレーン0になります)に置かれ、RGB(Red, Green, Blue)の値はそれぞれプレーン1、2、3に置かれます。


カラーデータ:char、long、またはfloat

コンピュータのアプリケーションでは、基本色の値ごとに8ビットの情報を使用することがほとんど標準となっています。8ビットの場合256(2の8乗)の異なる値を表現することができます。このことから、赤に8ビット、緑に8ビット、青に8ビットを使うと、16,777,216(2の24乗)の違った色を表現することができます。これは、私たちが識別できる全てのグラデーション(階調)をほとんど完全にカバーするのに十分な色のバラエティです。

このため、各基本色の値を表現するための解像度として8ビットが必要なだけなら、カラー情報の4つのプレーンを持つマトリクスの1つ1つのプレーンの値を表すためには、8-ビットの charデータ型で十分であると言えます。long、float32、float64といったデータ型を使用することもできます(確かにJitterでそれを行うことができます)が、これは実際に必要とするデータ型より非常に大きなデータ型を使っていることになります。フルフレームのビデオ画像は非常に多くの数のピクセル(640×480の画像1枚では307,200ピクセルになります)を含んでいるので、多くの場合、メモリの節約と処理のスピードアップのためにcharデータ型を使うことは非常に理にかなっています。

マトリクスが8ビットのcharデータを持っている場合、その8ビットを0〜255を表すものとして考える、あるいは0と1の間(すなわち、固定小数点による小数値)のグラデーションを表すものとして考えることができます。charデータを持つJitterオブジェクトが他のMaxオブジェクトから値を受け取る場合、多くは、その値は0〜1の範囲にある浮動小数点の形で受け取られることが予想されます。これによって、Maxのfloat から対応するcharの値へ変換するための内部的な計算の必要が生じます。(これには、2、3の例外があります。例えば、チュートリアル3でご紹介したようにjit.opオブジェクトは、0-1の範囲のfloatでも、0-255の範囲のintでも、右インレットで受け取ることができます。)Jitterマトリクスでのcharデータ型の使用に関するより詳しい内容については、マニュアルの「マトリクスとは?」という章をご覧下さい。


マトリクスのプレーンの分離

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

パッチのいちばん上には、異なったカラフルな素材が2つあります。1つはアーケードゲームのビデオ、もう1つはビデオキャリブレーション(補正)に用いられるカラーバーの標準セットです。2つのmetroオブジェクト(見ようとするマトリクスを持続させるために、繰り返しbangメッセージを送信するためのもの)を切り替えて使うことによって、どちらかを見るか選択できます。


ビデオ、または静止画を見る


metro 30 オブジェクトの上の"Show movie"と書かれたトグルをクリックして、ビデオを見て下さい。

このパッチ例では、4つのプレーンを持ったカラー情報用の1つのマトリクスを、1つのプレーンを持ったマトリクス4つに分け、各々のプレーンを個別に見る(あるいは加工する)ことができるようになっています。これは、jit.unpackというオブジェクトを使って行うことができます。Maxオブジェクトのunpackオブジェクトがリストを個別の数値に分けるのと同様に、jit.unpackは複数のプレーンを持ったマトリクス(マルチプレーンマトリクス)を別々の1プレーンマトリクスに分割します。初期設定アーギュメントで jit.unpackに対して入力されるマトリクスの予測されるプレーン数を指定することができますが、デフォルトでは、4つのプレーンが想定されています。これがカラーデータの標準だからです。赤、緑、青の各プレーンの内容を見てみたいと思っているので、プレーン1、2、3を別々のjit.pwindowオブジェクトに送っています。このケースでは、アルファチャンネルには関心がないので、プレーン0 を表示する手間は省いてあります。


マルチプレーンのマトリクスをシングルプレーンのマトリクスとして取り出します


このように、各カラープレーンの中身を3つのモノクローム画像の形で見ることができます。明るいピクセルほど、その色の値がより大きいことを示しています。それぞれのマトリクスをjit.opオブジェクトに送ることによって、各色それぞれの強さと、それによる全体のカラーバランスをコントロールすることが可能になっています。さらに、個々の(加工された)マトリクスをjit.packオブジェクトに送って再び4プレーンのマトリクスに結合し、jit.pwindowで表示しています。


・例えば、緑と青の強さを0.12に弱めて、より赤い画像を作ってみて下さい。


特定の色の強さを減少させてカラーバランスを変更します

 

カラーローテーション

別の色のトリックをお見せしましょう。そのために、各々のカラープレーンをgateオブジェクトを経由させることによって、各々のマトリクスをjit.packの様々なインレット(カラープレーン)に導くことができるようになっています。この方法によって、個々のプレーンの意味するものを割当て直すことができます。そして、パッチの左側にあるcollオブジェクトのセッティングを選ぶことによって、可能な色割当ての置き換えをすべて試すことができます。

・"Rotate RGB Planes" と書かれたナンバーボックスをドラッグして3つのカラープレーンの様々な再配置を試してみて下さい(プレーン0がjit.unpackからjit.packへ直接送られていることに注意して下さい。これはjit.packの左インレットで受け取られるjit.matrixメッセージが、jit.pwindowへマトリクスを出力するためのトリガとなるからです)。collのアイテム3を選んだ場合には下に示すような結果になります。


それぞれのカラープレーンは再配置されます;ここでは赤と緑のプレーンが交換されています。


上の例では、オリジナルの緑と青のプレーンは係数0.12によって減じられ、一連のgateによってjit.pack に送られる際に赤と緑のプレーンが入れ替えられているのがわかります。結果として、画像はより緑がかったものになっています。collオブジェクトは、RGBプレーンの再配置として可能なすべての順列を持っています。


・collオブジェクトをダブルクリックして、内容を見て下さい。


0, 0 0 0;
1, 1 2 3;
2, 1 3 2;
3, 2 1 3;
4, 2 3 1;
5, 3 1 2;
6, 3 2 1;

RGBプレーン再配置の順列


collから出力されたリストの要素は個別に取り出され、3つのgateオブジェクトのアウトレット割当てのためにへ送られます。collに送られた数値は、同時にumenu(ラベルモード)にも送られ、カラーローテーションを言葉で表示します。このケースでは"Green-Red-Blue"になっています。

自動的な色の変化

色の加工に関するもう1つの課題として、自動的に色のスケーリングとローテーションを常に変化させ続けるプロセスを作ってみました。

・"Automate color changes" と書かれたtoggleをクリックして下さい。3つのカラープレーンに対する係数が継続的に変化します。patcher colorgames オブジェクトをダブルクリックして、サブパッチの内容を見て下さい。


[colorgames] サブパッチ


サブパッチは、lineオブジェクトを用いて、0.5から1まで変化する値を各色のスケーリング係数として送りだしています。赤に対する係数は3秒間かけて変化し、緑は4秒間、青は5秒間ごとに変化します(この結果、3つのlineオブジェクトは60秒ごとに同期します)。60秒ごとに、metrocounterのコンビネーションによって新しいカラーローテーションが選択されます。

・[colorgames] サブパッチウィンドウを閉じて下さい。ここで見たと同様なすべての色の加工を、他の素材に対して行うことができます。"Show movie"と書かれたtoggleをクリックして、metroオブジェクトを停止させて下さい(このトグルを、jit.qt.movieオブジェクトのムービー再生のストップとスタートのためにも利用していることに注意して下さい。ムービーを見ていない間は、再生を続けても何の意味もないからです)。"Show colorbars" と書かれたトグルをクリックして、カラーバーを表示させて下さい。この画像で、スケーリング係数とローテーションの変化を実験してみて下さい。


まとめ

jit.windowjit.pwindowはシングルプレーンの2D(二次元)マトリクスを受け取ると、その値をモノクローム(グレースケール)の画像として表示します。4プレーンの2Dマトリクスを受け取ると、各プレーンをアルファ、赤、緑、青の値と解釈し、その値による色を表示します。この、4プレーンマトリクスでのARGBによる表現は、Jitterで色を表す場合の最も一般的な表現方法です。

各基本色は値全体の範囲を表現するために8ビットの精度しか必要としないため、Jitterでは、カラーデータを表すためにcharデータ型を使用することが一般的です。従って、ほとんどのQuickTime関連のオブジェクト(例として、jit.qt.movie)や、特に色の取り扱いのために設計されている多くのオブジェクト(例として、jit.brcosa jit.colorspace:これらについてはチュートリアルの後の章で説明します)は、charデータ型による4プレーンの2D(2次元)マトリクスを受け取ることを想定しています。(けれども、他の多くのオブジェクトは、容易に他のデータ型に適応することができます。どちらか迷うような時には、問題のオブジェクトに関するリファレンスドキュメントを調べて下さい。)charデータ型は0から255までの値を表現していると考えることも、0から1までの小数値をを表していると考えることもできます。ほとんどの場合、charデータを持つオブジェクトは、他のMaxオブジェクトから0〜1の範囲の小数として指定された数値を受け取ることを予測しています。

jit.unpackオブジェクトは複数のプレーンを持つ1つのマトリクス(マルチプレーンマトリクス)を1つのプレーンを持つマトリクス(シングルプレーンマトリクス)複数個に分割します。jit.packオブジェクトは複数のシングルプレーンマトリクスを1つのマルチプレーンマトリクスに結合させます。個々のプレーンを別々に取り扱うことによって、画像のカラーバランスのコントロールを行ったり、個々のプレーンの意味するものを他の色に再配置したりすることができます。