/**/
前の章では、割合を変えながら2つのマトリックスをミックスするために、jit.xfadeオブジェクトがどのようにスケーリング(乗算)と加算を行っているかについてご説明しました。このチュートリアルでは jit.scalebias と jit.op オブジェクトを使って、私たち自身でこれらの数値演算を行ってみましょう。
これにはいくつかの利点があります。第1に、ミキシングとクロスフェードに関する数学演算を明確に示してくれる点、第2に、jit.opが、入力された2つのマトリックスを使ってどのように演算を実行できるかを示してくれる点(チュートリアル3では、jit.opがスカラ値を使って1つのマトリックスに対しどのように動作するのかを見ました。)、第3に、2つのマトリックスのバランス設定(スケーリング係数)をそれぞれ独立に指定できることによって、jit.xfade オブジェクトに比べてより高い柔軟性が得られる点、そして最後に、jit.op は非常に多種に渡る数学演算処理を実装しているため、2つのマトリックスを結びつけるために別の方法を試し、また違った視覚効果を調べることができるという点です。
・Jitter Tutorialフォルダの09jMoreMixingというチュートリアルパッチを開いて下さい。
ミックス/クロスフェードを行うための乗算と加算(jit.xfadeの模倣)
ここでは、0〜1の間の係数を jit.scalebias に与えることによって、2つの異なるビデオがスケールダウン(暗く)されているのがわかるでしょう。その下の所では、jit.op が少し新しい、うまい使い方(両方のインレットへの入力がマトリックスになっています)をされているのに気がつくと思います。このような使い方をした場合、 jit.op は左の入力マトリックスの個々の値と、対応する右の入力マトリックスの値とをペアにして、指定された数値演算をすべての値(ペア)に対して個別に行います。こうして、2つのマトリックスの全ての値が加算され、効果的なイメージのミキシングが可能になります。
注:2つのマトリックスのディメンジョン(訳注:各次元の大きさの意味も含む)、プレーン数、データ型が異なる場合、jit.opは左インレットへ入力されるマトリックスのアトリビュートを使用します。右インレットへ入力されるマトリックスが左インレットへ入力されるマトリックスより小さい場合(ディメンジョンやプレーン数、あるいはディメンジョン内のセル数が少ない場合)、対応する場所のデータがない部分は0 であると仮定されます。右インレットのマトリックスのデータ型が、左インレットのものと異なる場合は、右インレットのマトリックスの持つ値は演算が行われる前にコンバート(型変換)されます。(例えば、右のマトリックスのデータ型がfloat32で左のマトリックスのデータ型がlongの場合、右のマトリックスの値は、計算を行う前に小数部分での切り捨てが行われます。
もう1つの注:MSPでは、単に同じインレットにオーディオシグナルを送ることによって加算が行えます。これは、すべてのオーディオシグナルインレットでは、複数のシグナルパッチコードがインレットに接続された場合、自動的にシグナルベクタの内部的な加算を行うためです。これは、Jitterのマトリックスインレットには当てはまりません。したがって、2つのマトリックスをセルごとに加算しようとする場合、この例のように、opアトリビュートに + を設定したjit.opオブジェクトを使用しなければなりません。
ここでの乗算と加算の結果は、jit.xfad eオブジェクトが内部的に行うものに相当します。パッチの右上のにある、クロスフェードのためのコントロール(前の章のものとほとんど同一)を使ってこれを確認することができます。
・metro オブジェクトをスタートさせ、Mixser というスライダを使ってビデオAからビデオBへのクロスフェードを行ってみて下さい。
ここでは、クロスフェードの値を直接ビデオBへ scale アトリビュートとして送信すると同時に、!- 1 オブジェクトを使って計算した「1からその値を引いた値」によって、ビデオAをスケールしている点に注意して下さい。これによって、jit.xfadeと同じように2つの係数の合計は常に1になります。
加算は、2つのマトリックスを使って行われる演算のうちで、たぶん最も解りやすいものでしょう。しかし、実行できる演算はこれだけではありません。jit.op オブジェクトの op アトリビュートを変更することで、他の多くの演算によってどんな視覚効果(エフェクト)を作り出すことができるかを試してみることができます。
・Transition Time ナンバーボックスで、非常にゆっくりとしたクロスフェードの時間(例えば、10000ミリ秒)を設定し、ポップアップメニューから + 以外の演算子を選んで下さい。Go To スイッチをクリックするとクロスフェードが開始されます。特定の演算を2つのビデオマトリックス間で実行した場合、どのように見えるのかを確かめることができます。
ポップアップメニューにはjit.opが提供する多くの演算のごく一部が紹介されています。メニューにあるそれぞれの演算子について、ここで簡単に触れておきます。
+ | AにBの値を加算します。 |
-m | AからBの値を減算し、モジュロ演算によって結果の値を要求された範囲にたたみます 。 |
max | AまたはBの大きい方の値を使用します。 |
absdiff | AからBの値を引き、差の絶対値を使います。 |
| | 「ビットごとの論理和(Or)」:バイナリ数値(2進数)を用います。AまたはBのどちらかのビットが1である場合、結果として1をセットします。 |
^ | 「ビットごとの排他的論理和(XOr):バイナリ数値(2進数)を用います。AとBのビットが同じでない場合、そのビットは1になり、その他の場合は0になります。 |
> | Aの値がBの値より大きいとき、結果として1(またはchar255)がセットされます。他の場合は0がセットされます。 |
< | Aの値がBの値より小さいとき、結果として1(またはchar255)がセットされます。他の場合は0がセットされます。 |
>p | Aの値がBの値より大きいとき、結果としてAの値がセットされます。他の場合は0がセットされます。 |
<p | Aの値がBの値より小さいとき、結果としてAの値がセットされます。他の場合は0がセットされます。 |
・必要であれば、jit.scalebias オブジェクトの上にあるナンバーボックスを直接ドラッグして個別にバランスレベルを設定することもできるようになっているため(これは、私たちが設定したクロスフェード方式とは異なるものです)、0 〜 1の範囲を超える値を試してみることもできます。
このパッチでは、スケーリングのための乗算を jit.opの * 演算子ではなく、jit.scalebiasオブジェクトを使って行う方法を選びました。これはいったいなぜでしょうか?jit.op では、char データの計算(このパッチで行っているものがそれです)を行う場合、val アトリビュートは0.〜1.(floatとして指定されている場合)、または 0〜255(intとして指定されている場合)の範囲に限定されます。char データに0.〜1. までの値を掛けようとする場合、jit.op は全く問題ありません。しかし、char データにそれ以外の値を掛けたい場合には、scale 係数として0〜1の範囲を超える値を使用できる jit.scalebiasオブジェクトが正しい選択です。 jit.scalebiasは、4 プレーンのcharマトリックスしか扱うことができませんが、この例では、それ以外の値でも大丈夫です。このパッチでは、4 プレーンの char マトリックスを使用して、0から1の範囲を超えるスケーリング係数を試すことができるようにしたいと考えたため、jit.scalebiasを用いました。
jit.op を使って、2つの異なるマトリックスからのデータに対して様々な数学演算を行うことができます。 jit.op は、左のマトリックスのそれぞれの値と、それに対応する右のマトリックスの値をペアにして、指定された数学演算を全ての値(ペア)に対して個別に行います。2つのマトリックスの dim、planecount、type アトリビュートが異なる場合、jit.opは左インレットに入力されるマトリックスのアトリビュートを用います。様々な数値演算によって2つのビデオイメージを結合すると、色々な視覚効果を作り出すことができます。