blog - Max/MSPのJavascriptへ引数リスト渡し
Max5になって、JavaScriptへの引数をリストで渡す際の個数が大幅にアップした。
従来のMax4.6までは、引数をリストで渡せるのは最大256個までだったので、たとえばマトリックスの全セルの要素の値をforループで計算するときも、16*16=256までのマトリックスが限界だった。それより大きいマトリックスはoffsetなどを指定して、セルを複数に分けてリスト渡しするしかなかった。
ところが、Max5で、リスト渡しできる最大個数が128*128=16384個にまで増えた。これで、128*128のマトリックスの全セルの計算がJavaScriptで一気に行える。
たとえば、matrixの全セルの値をjit.spillでリストに吐き出し、jsパッチでJavaScriptに渡して、セルの値の最大値とそのセル番号をリスト出力するのは、こんな感じ
従来のMax4.6までは、引数をリストで渡せるのは最大256個までだったので、たとえばマトリックスの全セルの要素の値をforループで計算するときも、16*16=256までのマトリックスが限界だった。それより大きいマトリックスはoffsetなどを指定して、セルを複数に分けてリスト渡しするしかなかった。
ところが、Max5で、リスト渡しできる最大個数が128*128=16384個にまで増えた。これで、128*128のマトリックスの全セルの計算がJavaScriptで一気に行える。
たとえば、matrixの全セルの値をjit.spillでリストに吐き出し、jsパッチでJavaScriptに渡して、セルの値の最大値とそのセル番号をリスト出力するのは、こんな感じ
inlets = 2;
outlets = 1;
var in01_; //input values of all cell as list(array)
var in02_; //input matrix dimmension x,y
function list()
{
if ( inlet == 0 ) { in01_ = arguments; }
if ( inlet == 1 ) { in02_ = arguments; }
if ( inlet == 0 )
{
var n;
var max_i; //最大値セルの番号
var max_data = 0; //セルの最大値
n = in02_[0] * in02_[1]; //マトリックスの全セル数
var data00_ = new Array( n );
var data01_ = new Array( 2 );
for( var i = 0; i < n; i++){
data00_[i] = in01_[i]; //入力リストを配列に格納
if( max_data <= data00_[i] ){ //最大値とセル番号の格納
max_data = data00_[i];
max_i = i;
}
}
data01_[0] = max_i; //出力結果(セル番号)を入れる
data01_[1] = max_data; //出力結果(セル最大値)を入れる
outlet( 0, data01_ ); //結果の入った配列をoutletからリスト出力
delete data00_;
delete data01_;
}