Archives

You are currently viewing archive for September 2010
カテゴリ: Quartz Composer
投稿者: mio
Audio Spectrum splitter

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;
}

見た目はこんな感じ。

Structure splitter 2
カテゴリ: Quartz Composer
投稿者: mio
InputNumberについては、Quartz Composerのjavascriptのデフォルトのプログラムを見れば、使い方が分かりますが、outputの方は載っていない。

しかも、
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;
}


情報ソースはこちら