2010/09/04: Quartz Composerのjavascriptパッチ内での Structureの扱い方

Quartz Composer で、Audio Spectrumの部分の値を取り出すのに、structure Key Memberをいちいち使うのは面倒なので、上記のように、Audio Spectrumを突っ込めば、一発で値を取り出せるjavascriptパッチを作りました。
作る過程でStructureの扱いでつまずいたので、
その点についてもメモっておきます。
■ Structure を使おうとして遭遇したエラーと対処法
Structure型のデータを、任意の変数に代入しようとすると、
TypeError: Result of expression 'Structure' [null] is not an object
というエラーが出る。
※'Structure'は自分で決めた引数の名前
どうもjavascriptパッチは、パッチが立ち上がるときに、
そのパッチに不具合がないかチェックが入るようなのですが、
チェックの時点では、引数の__structure型の値が null なので、
var hoge = Structure[0];
のようなことをすると、
Structureが null だから、そんなことできないっす、と上記のエラーが出るようです。
なので、
if( Structure != null){
var hoge = Structure[0];
}
とすれば、エラーも出ず正常に動くようです。
ちなみに、この「javascriptの事前チェック(TestMode という言うらしい)」ですが、
事前チェックのときは、_testModeという名の隠し変数(?)の値が true で、
普通に動いているときは false になっているようなので、
上記の部分を
if(! _testMode){
var hoge = Structure[0];
}
としても正常に動くようです。
TestModeなんて知るかよ!という感じですが、まあ一件落着ですね。
情報ソース
http://www.cybero.co.uk/QuartzComposer/examples/jelly2.html
http://web.archiveorange.com/archive/v/jFOq6bIjYcp88vRFKV2d
以下は、ソースコード
■ Pattern 1 : 出力に配列を使う場合
function (__number eq[16]) main (__structure Structure)
{
var result = new Object();
result.eq = new Array(16);
result.eq[0] = 0;//これがないとエラーがでます。
for( var i = 0; i < 16; i++){
if(Structure != null){
result.eq[i] = Structure[i];
}
}
return result;
}
■ Pattern 2 : 出力用変数を文字でやる場合
(こっちの方がパッチの見た目がスッキリしてます)
function (__number eq0,__number eq1,__number eq2,__number eq3,__number eq4,__number eq5,__number eq6,__number eq7,__number eq8,__number eq9,__number eq10,__number eq11,__number eq12,__number eq13,__number eq14,__number eq15)
main (__structure Structure)
{
var result = new Object();
for( var i = 0; i < 16; i++){
if( Structure != null){
result["eq" + i] = Structure[i];
}
}
return result;
}
見た目はこんな感じ。

2010/09/04: Quartz Composerのjavascriptパッチ内で、出力に配列を利用する
InputNumberについては、Quartz Composerのjavascriptのデフォルトのプログラムを見れば、使い方が分かりますが、outputの方は載っていない。
しかも、
result.outputNumber[0] = hogehoge;
なんてしても、動かない。。。
なんで??
ということで、その解決方法です。
ソースコードを見るのが一番手っ取り早いと思うので、以下の通り。
注意点は、とにかく、 new Array(2); のようにして、
先に result に配列を代入しておくということです。
情報ソースはこちら
しかも、
result.outputNumber[0] = hogehoge;
なんてしても、動かない。。。
なんで??
ということで、その解決方法です。
ソースコードを見るのが一番手っ取り早いと思うので、以下の通り。
注意点は、とにかく、 new Array(2); のようにして、
先に result に配列を代入しておくということです。
function (__number outputNumber[2]) main (__number inputNumber[2])
{
var result = new Object();
result.outputNumber = new Array(2);
result.outputNumber[0] = inputNumber[0] + inputNumber[1];
return result;
}
情報ソースはこちら