チュートリアル9

さらにミキシングについて


ミキシングとクロスフェードを明確にする

前の章では、割合を変えながら2つのマトリクスをミックスするために、jit.xfadeオブジェクトがどのようにスケーリング(乗算)と加算を行っているかについてご説明しました。このチュートリアルでは jit.scalebiasjit.opオブジェクトを使って、私たち自身でこれらの数値演算を行ってみましょう。

このことにはいくつかの利点があります。第一に、ミキシングとクロスフェードに関する数学演算を明確に示してくれる点、第二に、jit.opが入力される2つのマトリクスを使った演算をどのように行うことができるかを示してくれる点(チュートリアル3では、jit.opがスカラ値を使って1つのマトリクスに対しどのように動作するのかを見ました。)、第三に、2つのマトリクスのバランス設定(スケーリング係数)をそれぞれ独立に指定できることによって、jit.xfadeオブジェクトに比べてより高い柔軟性が得られる点、そして最後に、jit.opは非常に多種に渡る数学演算処理を実装しているので、様々な視覚効果を得るために、2つのマトリクスを結び付ける他の方法を試してみることができるという点です。


再び、ミキシングについて

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



ミックス/クロスフェードを行うための乗算と加算(jit.xfadeの模倣)

ここでは、2つの異なるビデオが、0〜1の間の係数をjit.opに与えることによってスケールダウン(暗く)されているのがおわかりでしょう。その下の所では、jit.opのちょっと新しい、うまい使い方(2つのインレットにマトリクスを入力)をしているのに気が付くと思います。このような使い方をした場合、 jit.opは左の入力マトリクスの個々の値と、対応する右の入力マトリクスの値とをペアにして、指定された数値演算をすべての値(ペア)に対して個別に行います。こうして、2つのマトリクスの全ての値が加算され、効果的なイメージのミキシングが可能になります。

注記:2つのマトリクスの次元(ディメンション−訳注:各次元の大きさの意味も含む)、プレーン数、データ型が異なる場合、jit.opは左インレットへ入力されるマトリクスのアトリビュートを使用します。右インレットへ入力されるマトリクスが左インレットへのものより大きい、または小さい場合(次元、プレーン数、特定の次元のセル数が多い、または少ない場合)、自動的に左インレットからのマトリクスのサイズでサンプリングし直されます。右インレットのマトリクスのデータ型が、左インレットのものと異なる場合は、右インレットのマトリクスの持つ値は演算が行われる前にコンバート(型変換)されます。(例えば、右のマトリクスのデータ型がfloat32で左のマトリクスのデータ型がlongの場合、右のマトリクスの値は、計算を行う前に小数部分での切り捨てが行われます。

こういったことは、jit.opをはじめ、Jitterにおいて複数のインレットを持つオブジェクトの一般的な動作であるといえます。しかし、少数のオブジェクトでは、左インレットとそれ以外のインレットの連係を行わない場合があることも覚えておいて下さい。この点については、それらのオブジェクトのオブジェクトリファレンスエントリ(Object Reference entry)で言及しています。

もう1つの注記:MSPでは、単に同じインレットにオーディオシグナルを送ることによって加算が行えます。これは、すべてのオーディオシグナルインレットでは、複数のシグナルパッチコードがインレットに接続された場合、自動的にシグナルベクタの内部的な加算を行うためです。これは、Jitterのマトリクスインレットには当てはまりません。従って、2つのマトリクスをセルごとに加算しようとする場合、この例のように、opアトリビュートに + を設定したjit.opオブジェクトを使用しなければなりません。

ここでの乗算と加算の結果は、jit.xfadeオブジェクトが内部的に行うものに相当します。パッチの右上のにある、クロスフェードのためのコントロール(前の章のものとほとんど同一)を使ってこれを確認することができます。

metroオブジェクトをスタートさせ、ミキサスライダ(Mixser Slider)を使って、ビデオ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.scalebias」 vs. 「jit.opの * 演算子」

このパッチでは、スケーリングのための乗算を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つのビデオイメージを結合すると、色々な視覚効果を作り出すことができます。