Gen の概要

なぜ Gen を使うのでしょう?

一般的な理由

  • 通常の Max/MSP/Jitter オブジェクトでは効果的に実現できない処理を行いたい。
  • コンパイルされた C や GLSL コードがが持つ処理速度を実現できるような、低レベルでのプログラミングをビジュアルな環境で行いたい。
  • ビジュアルプログラミングやGLSLコードより、簡潔なテキストベースの数式表現による言語を使いたい。
  • Windows バージョンと Macintosh バージョン(さらに、将来的には 64ビットアプリケーションバイナリ)を個別にコンパイルすることを回避したい。
  • 新しいアルゴリズムを設計し、それらを直ちに見たり聞いたりしたい。
  • Windows や Mac において、CPU や GPU 上で可能になるようなアルゴリズムを設計したい。

実際の例

  • gen~ による、サンプル単位でののフィードバックを使用するような任意のオシレータやフィルタの設計。
  • gen~ による、短いフィードバックディレイを使用したリバーブや物理モデルの作成。
  • gen~ による、ウェーブセット・ディストーションのような、明確にサンプル単位で行う buffer~の処理。
  • pfft~ の中で gen~ を用いることによる、スペクトル・ディレイのような周波数領域での効果的な処理。
  • jit.gl.pix を使用した、C でコンパイルしたエクスターナルと同様な速度を持つ独自のビデオ処理フィルタ。
  • jit.gen による、ジオメトリの操作や生成。
  • jit.gen を使ったパーティクルシステムの設計。
  • jit.gen の distance フィールドを用いた、iso-サーフェス・ジェネレーション。

パフォーマンスの向上

  • チェイン接続されたMSPオペレータや、1つのメタオブジェクトとして結合された jit.ops と他のMSP/Jitter オブジェクトの処理の強化。
  • jit.expr を、より進歩したインターフェイスとバフォーマンスを持つものに置き換えます。
  • ヴィジュアルなプログラミングやテキストベースのプログラミングの両方で、イメージ処理のためにGPUを簡単に利用できる方法を提供します。

Gen は Max の中の新しいテクノロジを参照します。これは、パッチとコードの関係の新しいアプローチを示すものです。パッチは以前からの Max 環境で、そこでは1つ1つの小さな機能を連結するためのグラフィカルなインターフェイスを用います。js オブジェクトのテキストベースのコードのような埋め込みスクリプティングはMax で処理を行う場合の重要な部分になっていて、もはや単にMaxエクスターナルをC言語で書くというだけに留まりません。しかし、スクリプティングは抜本的に Max パッチのロジックを変更することはできません。これは、パッチとコードの「境界」がオブジェクトボックスの中に存在するためです。Gen はこの関係の抜本的な変更を示すものです。Gen パッチは新しい種類の Max パッチです。Gen パッチでは Gen テクノロジにアクセスします。Gen パッチは、オーディオ(MSP)やマトリックス、テクスチャプロセッシング(Jitter)のような特定の領域に特化されたものです。MSP のGenオブジェクトは gen~ と呼ばれます。Jitter の Gen オブジェクトには jit.gen、jit.pix、jit.gl.pix があります。それぞれのGen オブジェクトは、その中に Gen パッチを持っています。Gen パッチは多くの同じ機能を共有しますが、個々の Gen オブジェクトは、それが属する領域に特化した機能を持っています。例えば、gen~ の中の Gen パッチはディレイラインを処理しますが、jit.gen の中の Gen パッチはベクタ型を処理します。

  • 全ての Gen オブジェクトに共通するオペレータのリスト。
  • 全ての gen~ オブジェクトに共通するオペレータのリスト。
  • 全ての Gen Jitter オブジェクトに共通するオペレータのリスト。

Gen パッチはGen オブジェクトが実行する演算を記述します。Gen パッチを編集する場合、Gen オブジェクト内部の演算を編集します。Gen パッチで記述された演算処理を利用するために、Gen オブジェクトはGen パッチを GenExpr と呼ばれる言語にコンパイルします。GenExpr は共通の表現によってパッチの世界とコードの世界の橋渡しを行い、Gen オブジェクトは演算の実行に必要なターゲットコードに変換します。gen~、jit.gen~、jit.pix はネイティブな CPUのマシンコードを、即時に、透過的に生成し、コンパイルしますが、jit.gl.pix は 同様なことを GPU コード(GLSL) に対して行います。Gen オブジェクトを使用して処理を行うという場合、あなたは、Max から離れることなしに、カスタムなコンパイル済みMSPオブジェクトやJitter オブジェクトを書いていることになります。

Gen パッチの作成

  • ロックされていないパッチャーウィンドウの空白の部分をクリックし、"n" とタイプして新しいオブジェクトボックスを作成して下さい。このとき、カーソルはボックス内にあります。作成したいGen オブジェクトの名前(gen~、jit.gen、jit.pix、jit.gl.pix)をタイプして下さい。オブジェクトが表示されるはずです。
  • 作成したオブジェクト上でダブルクリックすると、Gen パッチャーウィンドウが開きます。パッチにはデフォルトで2つのインレットと1つのアウトレットが作成されていると思います。

Gen パッチャーウィンドウ

通常の Max パッチャーウィンドウのように、Gen パッチャーウィンドウにもツールバーがあり、いくつかボタンが配置されています。これらのボタンを使って、通常のパッチング処理と同様のことができます。ロック/アンロックボタンでは、パッチャーウィンドウのロック状態を設定、解除できます(トグルボタンとして機能します)。

Patcher Windows ボタンを使うと、パッチャーウィンドウの新しいビューが開きます。

New Object ボタンを使は、"n"をタイプすることと同じです。これにより、新しい空白のオブジェクトボックスが作成され、オブジェクト名を入力するためのカーソルが準備されます。

Show Grid / Hide ボタンはグリッドを表示/非表示にします。

Reset ボタンは現在のGen のコードコンパイルをデフォルト値にリセットします。

Compile ボタンは、Gen ウィンドウのパッチを手動でコンパイルする場合に使用します。このボタンは、Auto-compilation ( 自動的にコンパイルする ) を使用しない設定で、かつパッチに新しいオペレータを追加したりパッチコードの接続を追加した場合以外には、使用できない状態(グレーアウト)になっています。

Disable Auto-Compile / Enable Auto-Compile ボタンは、Gen パッチャーウィンドウのパッチを自動的にコンパイルするかどうかの設定を行うために使用します。デフォルトでは、自動コンパイルはオン(使用する)になっているため、パッチの編集を行いながら、その結果を見たり、聞いたりすることができます。

Show Status Bar / Hide Status Bar ボタンはステータスバーの表示/非表示を切り替えます。

Gen でのパッチング

Gen パッチャーはMaxパッチャーと同じように見えますが、いくつか重要な相違点があります。

  • Gen オブジェクトは共通のオペレータ(common operators) を共有しますが、gen~(Gen オーディオ)とGen Jitter領域でのオブジェクト(あるいは「オペレータ」)のセットは異なります。これは GenExpr でも同様です。
  • 「メッセージ」は存在しません。すべての操作は同期されます。これはむしろMSPのパッチングに近いと言えるでしょう。そのため、(slider、buttonのような)UIオブジェクトはありません。しかし、param オペレータを使うことによって「メッセージ」と同じレート(速さ)で通常のMaxの領域からコントロールすることができます。すべてのオブジェクトやそのアウトレットは同時に出力(fire)しているため、インレットのホット(hot)、コールド(cold)を区別したり、アウトレットが出力(fire)する順番を考慮する必要はありません。
  • Gen パッチャーには send や receive オペレータは存在しません。Gen パッチャーと外部との接続は in、out、param オペレータによって行われます。gen~ には、さらに history、data、buffer といったオブジェクトが存在し、これらを gen~オブジェクトへのメッセージによってコントロールすることができます。詳細は gen~ セクションをご覧下さい。
  • 通常行われるような整数(int)と浮動小数点数(float)の区別はGenパッチャーには適用されません。Gen パッチャーレベルでは、全ての値は64ビットの浮動小数点数として扱われます。
  • codebox は Gen パッチャーのための特別なオペレータです。GenExpr 言語によって、この中により複雑な式を書くことができます。

Gen パッチャーは、gen~、jit.gen~ などのオブジェクトに埋め込むこともできますが、gen~やjitl.gen~ などのオブジェクトの @gen アトリビュートを設定することにで外部ファイルから読み込むこともできます(それぞれ、gendsp、genjit というファイル拡張子がつきます)。

自動コンパイル

デフォルトでは、コンパイル処理はパッチの編集時にバックグラウンドで行われます。そのため、編集した結果は直ちに見たり、聞いたりすることができます。この自動コンパイル処理は、Gen パッチャーのツールバーにある 'Auto-Compile' というトグルボタンによって無効にすることができます。コンパイルはGen パッチャーのツールバーや codebox のツールバーにあるハンマーアイコンを使って実行することができます。

Gen パッチャーの自動コンパイル機能を有効/無効 にする。

  • Gen パッチャーウィンドウの Auto-Complile ボタンをクリックすると、自動コンパイルが無効になります。このときボタン内の円が白に変化し、Enable Auto-Compile ボタンに変わります。
  • パッチに新しいオペレータを追加したり、新たな接続を行ったりしたとき、Gen パッチャーのツールバーにあるCompile ボタンがアクティブになります。
  • 現在のパッチの状態をコンパイルするには Compile ボタンをクリックします。すると、結果を見たり、聞いたりすることができ、さらに他のオペレータや接続を追加するまで Complile ボタンがグレーアウトされます。

Gen オペレータ

Gen オペレータは Gen パッチャーの中にある機能を表すものです。これらはパッチャーの中のオブジェクトボックスの形で、あるいは、GenExprコードの関数として存在するもので、パッチャーの世界とコードの世界をつなぐものです。Gen オペレータはMaxオブジェクトのようにアーギュメントとアトリビュートを取りますが、これらは単なる宣言です。Gen パッチにはメッセージ処理がないため、オペレータが作られたときにセットされるアトリビュートは変更されません。アトリビュートはほとんどの場合、オペレータが表している処理の実装方法を指定するために用いられます(param の最大値を @max アトリビュートで指定するような場合がこの例にあたります)。多くの場合、オブジェクトのアーギュメントの指定を行うと、対応するインレットが置き換えられます。Gen ではメッセージ処理がなく、全てのプロセスが同期されるためこのようなことが可能です。例えば、+ オペレータは2つの入力を取りますが、アーギュメントが与えられた場合1つの入力だけがインレットとして作られます。

何も接続されていないインレットは、入力の代わりにデフォルトの値(0 に設定されていることがしばしばですが、オペレータ毎にインレットのアシスト文字列をチェックして下さい)を使用します。複数の接続が行われているインレットでは、MSPでのシグナルと同じように入力が加算されます。

標準のオペレータ

多くの標準的なオブジェクトは、対応するMax や MSP オブジェクトと同じような動作を行います。数値演算オペレータ(逆の処理を行う !- !/ などを含みます)、三角関数オペレータ(sin、cosh、atan2、など)、標準的な数学オペレータ(abs、floor、pow、log、など)、ブール演算オペレータ(>、==、&&(and )、など)、その他 min、max、clip(clamp)、scale、fold、wrap、cartopol、poltocar、などのオペレータがこれにあたります。加えて、GLSLで普通に用いられるいくつかのペレータ(fract、mix、smoothstep、degrees、radians、など)や、jit.op オペレータリストから引用されたいくつかのオペレータ(>p、==p、absdiff など)があります。 いくつかの定義済み定数(pi、twopi、halfpi、invpi、degtorad、radtodeg、e、ln2、ln10、log10e、log2e、sqrt2、sqrt1_2、および同様の大文字による定数 PI、TWOPI、など)も使用することができます。これらは任意のオペーレータで、数値アーギュメントを置く代わりに使うことができます。

gen~ オブジェクト

gen オブジェクトは、MSPオーディオシグナルの処理を行うためのオブジェクトです。MSPのパッチングとは異なり、Gen パッチャー内での操作は、マシンコードのシグナルチャンクと結合されます。そのため、複雑な処理をより効率的に実行できる多くの最適化が可能です。また、これにより1サンプルレベルでの操作が必要となるような処理を設計することができます。フィードバックループを伴う処理でさえ可能です。gen〜の中での処理は、より低レベルでのシグナル処理(1サンプル毎の処理も可能です)の設計への道を開くものです。そのため、多くのオペレータではデュレーション(持続時間)のアーギュメントを「サンプル数」で指定します(MSP オブジェクトでは同様なアーギュメントには「ミリ秒」を使って指定します。)。

gen~ オペレータ

MSPオブジェクトの機能と同様な働きを持つ標準的な Gen オペレータ(例えば、clip、scale、minimum、maximum など)に加え、gen~ への移行がより容易になるように、既存のMSP オブジェクトと同じような動作を行う gen~ の領域に特化された多くのオペレータが存在します。おなじみのコンバータ ( dbtoa、atodb、mtof、ftom、mstosamps)、オシレータ(phasor、train、cycle、noise)、そしてモディファイア(delta、change、ash、triangle)などがあります。加えて、無効な出力や聴こえない出力を避けるための、いくつかの低レベルのオペレータ(isnan、fixnan、isdenorm、fixdenorm、dcblock)が存在します。samplerate のグローバルな値は、オブジェクトとして使用することも、また任意のオブジェクトにアーギュメントとして与える有効な値として使用することもできます。

History

一般に、Gen パッチフィードバックループを許可しません(なぜならば、同期処理を行うためです)。gen~ では、history オペレータを使ってフィードバックループを作ることができます。これにより1サンプルのディレイ(Z-1操作)を表します。このように、history オペレータのインレットに対し、次のサンプルのためにアウトレットの値をセットすることができます(言い換えれば、history オペレータの出力値は前のサンプルのインレット値になるということです)。 複数の history オペレータをチェイン接続することができ、これによって Z-2、Z-3 ディレイを作ることができます。しかし、より長く、そしてより自由なディレイ操作を行う場合には、delay オペレータを使用します。

history オペレータは名前をつけることもできるため、param パラメータのような外部からのコントロールが可能です。

Delay

delay オペレータはシグナルをサンプル数で指定された一定の時間だけディレイさせます。ディレイの最大時間はdelay オブジェクトのアーギュメントとして指定します。第2アーギュメントとしてタップ数を指定することにより、マルチタップディレイを行うこともできます。個々のタップはディレイタイムを設定するインレットを持つようになり、対応するアウトレットからディレイされたシグナルが出力されます。

delay オペレータは、今の所 GenExprではサポートされていない点に注意して下さい。 @feedback アトリビュートが1にセットされている場合(デフォルト値)、delay オペレータは、history オペレータ同様フィードバックループに使用することができます。@interp アトリビュートではどのような補間を行うかを設定します。

  • none または step: 補間を行いません。
  • linear: 線形補間
  • cosine: コサイン補間
  • cubic: キュービック補間
  • spline: Catmull-Rom スプライン補間

Data と Buffer

より複雑な、オーディオ(あるいは数値)の固定領域にあるデータを扱うために、gen~ では data と buffer という2つのオブジェクトが提供されています。これらは、ある意味では MSP の buffer~ オブジェクトと同様なものと言えます。 data や buffer オブジェクトはローカルな名前を持ち、Gen パッチの中の様々なオペレータはこの名前を使って data や buffer の内容の読み出し、書き込み、あるいはそれらのプロパティの取得を行います。 data オブジェクトと buffer オブジェクト、およびこれらに関連するすべてのオペレータは、今の所 GenExpr ではサポートされていない点に注意して下さい。

data や buffer の内容の読み出しは、peek、lookup、wave、sample、nearest オペレータによって行うことができます。これらのオペレータの第1アーギュメントは、data や buffer のローカル名です。これらのオペレータはすべて、シングルチャンネル、およびマルチチャンネルの読み出しをサポートします(第2アーギュメントではチャンネル数を指定し、最後のインレットはチャンネルオフセットを指定します。この値はデフォルトでは 0 です)。

@index 第1インレットの持つ意味を指定します。

  • samples: 最初のインレットはdata あるいは buffer のサンプルインデックスになります。
  • phase: data あるいは buffer の内容全体を、範囲 0. から 1. にマッピングします。
  • lookup あるいは signal: data あるいは buffer の内容全体を、範囲 -1. から 1. にマッピングします。MSP の lookup~ オブジェクトと同様です。
  • wave: サンプル単位で表される start/end のためのインレットを新たに追加し、これらの境界 (0. 〜 1.、MSP の wave~ オブジェクトと同様です)の間を位相シグナルによって移動します。

@boundmode インデックスが範囲外の値を取った場合の振る舞いを指定します。

  • ignore: 範囲を超えたインデックスは無視します(0 を返します)
  • wrap: 範囲を超えたインデックスは、範囲の反対側の端から繰り返されます。
  • fold or mirror: 範囲を超えたインデックスは逆行させる形で折り返されます(回文のような振る舞い)。
  • clip or clamp: 範囲を超えたインデックスは境界の値を使用します。

@channelmode チャンネルが範囲を超えた場合の振る舞いを指定します。 @boundmode アトリビュートと同様なオプションがあります。

@interp どのような補間を行うかを指定します。

  • none or step: 補間なし
  • linear: 線形補間
  • cosine: コサイン補間
  • cubic: キュービック補間
  • spline: Catmull-Rom スプライン補間

nearest オペレータのデフォルトは @index phase @interp none @boundmode ignore @channelmode ignore です。

sample オペレータのデフォルトは @index phase @interp linear @boundmode ignore @channelmode ignore です。

peek オペレータのデフォルトは @index samples @interp none @boundmode ignore @channelmode ignore です。

lookup オペレータのデフォルトは @index lookup @interp linear @boundmode clamp @channelmode clamp です。

wave オペレータのデフォルトは @index wave @interp linear @boundmode wrap @channelmode clamp です。

data や buffer の空間に関するプロパティへのアクセスは、dim オペレータと channels オペレータで行います(あるいは、 data オブジェクトや buffer オブジェクト自身のアウトレットを使用します)。また、データの書き込みは poke (補間を行わずに書き込みます) 、あるいは splat (補間をおこなうオーバーダブ) で行います。

簡単に言うと、data は gen~ パッチャーの内部にある 64ビットのバッファであり、コピーが可能なものと考えると良いでしょう。そして、buffer は外部の buffer~ のデータを読み書きすることができるオブジェクトと考えると良いでしょうdata と buffer の違いを全て挙げると次のようになります。

  • data オブジェクトはGen パッチャーに対してローカルであり、外部から読み出すことはできません。一方、buffer オブジェクトは外部の MSP エクスターナルである buffer~ オブジェクトへの参照を共有するものです。Gen の buffer の内容を変更することは、参照している MSP のbuffer~ オブジェクトを直接変更することです。
  • data オブジェクトは3つのアーギュメントを取り、ローカル名、長さ(サンプル数)、チャンネル数を設定します。buffer オブジェクトは1つのアーギュメントを取り、ローカル名をセットします。さらに 参照するMSPの buffer オブジェクトの名前を指定するオプションのアーギュメントを取ることができます(ローカル名の代わりに使用します)。
  • data オブジェクトはサイズを変更できません、しかし、buffer オブジェクトは常に 参照する buffer~ オブジェクトと同じサイズになります(buffer~ オブジェクトのサイズは変更されることもあります)。
  • gen~ のアトリビュートを名前付きの data オブジェクトに対して設定すると、アトリビュートで示された MSP の buffer~ から値をコピーします。それに対して、名前付きのbuffer オブジェクトに対して設定すると、参照するMSP buffer~ を変更します。このように、data のサイズやチャンネルの数は変更することができません(設定値を超えるサンプルやチャンネルは無視されます)が、buffer オブジェクトのデータサイズやチャンネルの数は参照する buffer~ によって変わります。
  • data オブジェクトは常に 64ビットの double型を用いますが、buffer オブジェクトは、すべての書き込み、読み出し処理で MSPの buffer~オブジェクト(今の所、32ビットfloatです)のビット解像度を変換するため、やや効率で劣ると思われます。

テクニカルノート

gen~ の全ての処理では 64 ビットの double が使用されます。gen~ や Gen パッチャー、GenExpr のコンパイル処理には最適化が含まれます。この最適化では、効率化のために、サンプルレートで行う必要がない演算(param オペレータの出力の計算のような処理)が(ホストパッチャーのベクタサイズによって決定される)より遅いレートの処理に代替されるように、個々のオペレータの更新レートに配慮します。

Jitter の Gen オブジェクト

jitter には jit.gen、jit.pix、 jit.gl.pix という3つのGen オブジェクトがあります。 jit.gen と jit.pix オブジェクトは jit.expr と同じように Jitter マトリックスの処理を行います。 jit.gl.pix オブジェクトは jit.gl.slab のように テクスチャとマトリックスを処理します。jit.gen オブジェクトは、一般的なマトリックス処理オブジェクトで、任意のプレーンカウント、型、ディメンションのマトリックスを扱うことができます。一方、jit.pix と jit.gl.pix はピクセルデータの処理に特化された設計になっています。これらが扱うマトリックスは、任意の型のデータを扱うことができますが、ディメンション数が2以下で、最大4プレーンまでとなっています。

Jitter オペレータ

座標

Jitter の Gen パッチャーはマトリックスやテクスチャの個々のセルのための処理カーネルを記述します。この処理カーネルが入力マトリックスを処理する場合、処理が行われるカレントのセルの一を示す1組の座標が生成されます。これを扱うオブジェクトは jit.expr のオペレータと同様で、norm、snorm、入力マトリックスのディメンションを与える dim オペレータを伴った cell があります。norm は [0, 1]の範囲でマトリックスのディメンション全体を表し、norm = cell/dim で定義されます。snorm は [-1, 1] という範囲でマトリックスのディメンションを表し、snorm = cell/dim * 2-1 で定義されます。cell はカレントセルのインデックスを表します。

ベクタ

Jitter マトリックスはベクタ(複数のプレーンを持つ場合)の配列を表すことから、Jitter におけるすべての Gen オペレータは任意のサイズのベクタを処理することができます。そのため、作成された Gen パッチャーは任意のベクタサイズで同じように動作します。基本的な2項演算子である、+、-、*、/、% は [ + 0.5 0.25 0.15] のようにベクタをアーギュメントとして取ることができます。これらは入力される3つの要素からなるベクタを加算するために追加のオペレータを生成します。param オペレータも [param 1 2 3 4] というようにデフォルトの値(初期値)としてベクタを取ることができます。パラメータは jit.genでは32個まで、jit.pix と jit.gl.pix では4個までの値を持つことができます。

vec オペレータはベクタ定数を作り、複数の値を集めてベクタを形成することができます。このオペレータはそれぞれの要素としてデフォルトの値をアーギュメントとして取ります。また、値を集めてベクタとして形成する前に、入力された全ての値をスカラ値にキャストします。

swiz オペレータはベクタに対し swizzle 処理を行います。GLSLや同様なシェーディング言語では、ベクタの要素はベクタとインデックス、またはプレーン名でアクセスされます。例えば、GLSLでは

red = color.r

redalpha=color.ra

あるいは

val = color.rbbg.

といった表現を見ることができるでしょう。

この種の処理は swzzling と呼ばれます。swiz オペレータは文字 r、g、b、a、や x、y、z、w 、あるいは0から始まる数値インデックスをアーギュメントとして取ることができます。文字は4個以下のプレーンを持つベクタの場合には便利ですが、より大きなベクタでは数値インデックスを使う必要があります。コンパイル処理では、どのような swiz 処理でも自動的にチェックします。そのため、ベクタの要素の数より多いインデックスがアーギュメントにある場合、ベクタの大きさに制限されます。

さらに、 length、normalize、cross、dot 、reflect、といった空間の計算のための基本的なベクタ演算オペレータが存在します。

サンプリング

サンプリング・オペレータはJitter Gen パッチャーの最もパワフルな機能の1つです。サンプリング・オペレータは1つの入力と、 [0、1]の範囲の座標をアーギュメント(引数)として取り、マトリックスまたはテクスチャの該当する座標の位置にあるデータを返します。第1のアーギュメントはGenパッチャーの入力でなければならず、第2のアーギュメントは入力され、処理されるデータの次元と同じサイズのN次元ベクタになります。座標を表すアーギュメントが [0, 1] の範囲を超えた場合、boundmode の方法で [0, 1] の範囲内の値に変換されます。可能な boundmode は、wrap、mirror、clamp で、 wrap がデフォルトです。

Jitter Gen パッチャーには、sample と nearest という2つのサンプリング・オペレータがあります。sample オペレータはN次元線形補間を用いて、マトリックスから値を取り出します。nearest オペレータは単に最も近いセルの値を取り出します。

ジオメトリ

Jitter Gen パッチャーには サーフェスを生成するための1組のオブジェクトがあります。これらには、jit.gl.gridshape オブジェクトで利用できるシェイプ(形状)のほとんどが含まれます。それぞれのサーフェス関数は、頂点位置と頂点の法線という2つの値を返します。sphere、torus、circle、plane、cone、cylinder というジオメトリ・オペレータがあります。

カラー

Jitter Gen パッチャーには、rgb2hsl とhsl2rgb という2つのカラー用のオペレータがあります。これらは、赤、緑、青による 色空間(RGB色空間)と 色相、再度、輝度による色空間(HSL 色空間)の相互変換を行います。入力にアルファ要素が含まれている場合、アルファは何も処理されずにそのまま渡されます。

jit.gen

jit.gen オブジェクトは汎用のマトリックスを処理するオブジェクトです。このオブジェクトは、Gen パッチャーをN次元マトリックス処理を実行するルーチンのカーネルを表現するC++コードにコンパイルします。オブジェクトは、Jitter マトリックスが持つピクセルデータのプレーンマッピング表現を理解します。これは、プレーン [0 - 4] を ARGBチャンネルとして解釈するものです。 jit.gen は任意の数のインレットとアウトレットを持つことができますが、それぞれの入力や出力に使用されるマトリックスのフォーマットは常にリンクしています。大きなマトリックスで最大のパフォーマンスを引き出すために並行処理を行うJitter のオブジェクトと同様に、jit.gen は並行処理を利用します。jit.gen によってどのようにマトリックスが処理されるかは、入力されるマトリックスのプレーン数、型、ディメンションによって決まります。さらに、カーネルが処理するデータ型をセットするための precision アトリビュートがあります。(訳注:precision は値の精度を設定します)precision のデフォルトの値は auto です。この設定では、入力マトリックスの型によってカーネルの型を自動的に適応させます。auto モードでは、入力マトリックスの型とカーネルが処理する型の間で次のようなマッピングを行います。

  • char は fixed にマップされます。
  • long は float64 にマップされます。
  • float32 は float32 にマップされます。
  • float64 は float64 にマップされます。

precision アトリビュートで設定可能な他の値には fixed、float32、flota64 があります。fixed は、単にJitter のマトリックス型への適応を行わないというものです。fixed は浮動小数点演算を行うカーネルの型を、固定小数点演算と呼ばれる方法を使う整数に指定します。これは非常に処理が早く、実際の浮動小数点型に変換するコストをかけることなしに 8 ビット整数以上の精度で演算を行います。しかし、固定小数点演算はエラーを起こしやすい面があり、sampling オペレータを使用した場合に、それが表示に現れてしまうことがあります。このようなエラーが目についてしまう場合には、単純に内部的な精度(precision)を float32 に上げて下さい。

jit.pix

jit.pix オブジェクトはピクセルデータに特化されたマトリックス処理オブジェクトです。ビデオやイメージを表すマトリックスを処理する場合、jit.pix は最も優れたオブジェクトです。内部的には、データは常に RGBAフォーマットになっています。入力マトリックスのプレーン数が 4 以下の場合、jit.pix はこれを次のルールに従ってRGBAフォーマットに変換します。

  • 1プレーン、ルミナンスのみのフォーマット, L -> LLL1 (ルミナンスをRGBに、アルファを1に変換します)
  • 2プレーン、ルミナンス+アルファ(Lumalpha)のフォーマット, LA -> LLLA (ルミナンスをRGBに変換し、アルファはそのままアルファとして保持します)
  • 3プレーン RGB のフォーマット、RGB -> RGB1 (RGB はそれぞれ RGBとして保持し、アルファを1に変換します)
  • 4プレーン, ARGBのフォーマット, ARGB -> RGBA (内部的にチャンネルの順序を変更します)

jit.pix の出力は常に 4プレーンで ARGBフォーマットのマトリックスになります。これは Jitter のピクセルのプレーンマップの標準形です。jit.gen と同様、jit.pix は Gen パッチャーC++コードにコンパイルし、Jitter の並行処理システムを利用します。jit.pix にも precision アトリビュートがあり、jit.gen と全く同じ動作を行います。

jit.gl.pix

jit.gl.pix オブジェクトは、マトリックスとテクスチャを処理するオブジェクトで、ピクセルデータに特化されたものです。これは、jit.gl.slab のような処理を行います。jit.gl.pix とjit.gl.slab が唯一異なるのは、jit.gl.pix がパッチャーをGLSLにコンパイルするのに対し、jit.gl.slab ではこれをシェーダファイルから読み込むという点です。jit.pix と同様、jit.gl.pix は内部的には RGBA ピクセルフォーマットを使用します。

テクニカルノート

カーネル内での数値

Jitter の Gen パッチの中の数値はすべて浮動小数点数として扱われます。固定小数点のカーネルの場合でも同様です。char型 のマトリックスを扱う場合にはこのことを理解しておくことが重要です。char型のマトリックスは全て内部的に [0., 1.]の範囲の値に変換されます。char型では、出力時にこの範囲が再度 [0, 255] にマップされます。char型の 1は、浮動小数点数で表される 1/255 と等しくなります。

比較演算子(==, !=, <, <=, >, >=)を使う場合、Gen パッチの内部の値が浮動小数点数の性質を持っていることを覚えておくことは特に重要です。それは、この値が正確なものではないからです。例えば、値が等しいかどうかを直接比較するのではなく、ある小さな範囲(ε:イプシロン)の中にあるかどうかを検証するほうがより効果的です。上の例では、absdiff オペレータは値が 1/255 からどのくらい離れているかを計算し、その後に < オペレータによってその値がエラーとみなされる範囲の中にあるかどうかが判断されます。

jit.pix vs. jit.gl.pix

jit.pix と jit.gl.pix は、CPU指向かGPU指向かという違いがあるにもかかわらず、ほとんどの部分で同じように機能します。この相違点のために、jit.pix がどのように入力マトリックスを扱うか、および jit.gl.pix がどのように入力テクスチャを扱うかについての振る舞いの違いを処理する必要があります。jit.pix に入力される全てのマトリックスのサイズ、型、ディメンションは、左端に入力されるマトリックスに合わせられます。結果として、jit.pix の処理カーネル内の入力マトリックスの cell オペレータと dim オペレータはすべて同じ値を持つことになります。jit.gl.pix では様々なサイズの入力が可能です。jit.gl.pix の場合、cell オペレータと dim オペレータの値は、左端の入力(in1)のプロパティから計算されます。将来のバージョンでは、入力ごとに cell オペレータと dim オペレータを持つことができるかもしれませんが、現在のところそうなってはいません。

サンプリング・オペレータは [0, 1] の範囲に正規化された座標を取るため、入力テクスチャのサイズが様々であっても、 それぞれの入力サイズとは独立した関係にある norm オペレータを用いて適切にサンプリングされます。しかし、jit.gl.pix では、sample オペレータとnearest オペレータは jit.pix とは異なった振る舞いをします。テクスチャをどのようにサンプリングするかは、texture プロパティによって決定されます。結果として、jit.gl.pix ではsample と nearest の振る舞いは同じものになります。nearest の方式でサンプリングを行うためには、@filter アトリビュートを nearest にセットします。線形補間を行う場合には、@filter を linear にセットします(デフォルトの値は linear です)。