ファイル冒頭で宣言したプロパティのスコープ:Max/MSP, JavaScript

スクリーンショット 2012-12-26 11.45.35

JavaScriptに関する本を読んでいると、”プロパティや関数の宣言は関数で閉じ込めないとグローバルのスコープになっちゃうよ”という注意がいたるところに書いてあります。Max6のJavaScriptを書く時に、ファイルの冒頭で変数宣言してたので、それってパッチを複数使う場合に変数が共有されて問題になりそうだなと思ったので、同じ簡単に調べてみました。

コード

GlobalTest.js

[javascript]

var value; //var 付きでプロパティを宣言しているので、スコープはファイル内

function set(num){

value = num;
outlet(0,value);
}

[/javascript]

GlobalTest2.js

[javascript]

value;
//var 無しでプロパティ宣言をしているので、スコープはグローバル

function bang(){

outlet(0,value);
}

function set(num){

value = num;
outlet(0,value);

}

[/javascript]

テスト

まず左側のNumber Box に909 → Bang としても 右下のメッセージには 909 は入りませんでした。これで var 宣言した GlobalTest.js の value プロパティはファイル間で共有されて無い事がわかります。

加えて GlobalTest.js パッチを復数使っても、それぞれ別の値が出力されたので、var 宣言したプロパティのスコープはファイル内である事が確認できました。

続いて左側のNumber Boxに909 右側のNumber Boxに303と入れた後に、右側のBangを押しました。上記画像が結果です。GlobalTest2.js の出力は、二つとも 303 と同じ出力を行なっており、プロパティ value が共有されている事がわかります。これは var 無しで宣言した value プロパティが二つのファイル間で共有されている、つまりグローバルオブジェクトのプロパティになっている事が理解できます。

※JavaScriptに慣れて無いこともあり、確認漏れなどあったら、教えて頂けると幸いです。

結論

ファイルの冒頭で

  • var を付けて宣言すれば、スコープはファイル内になる。
  • var を付けないで宣言すれば、スコープはグローバルオブジェクトになる。

参考図書

JavaScriptパターン――優れたアプリケーションのための作法

message を送る時の注意点:Max/MSP,JavaScript

スクリーンショット 2012-12-24 22.17.40

メリークリスマス!JavaScriptからmessageを送る時に、微妙にハマった事をメモしておきます。

あるパッチオブジェクトにメッセージを送っていたんですが、どうも反応しない。調べてみると、Listで送らなきゃいけない所、Stringで送っていました。Stringでmessageを送った場合は、messageの始点と終点に引用符が付きます。注意したいポイントです。

加えて、JavaScriptでListを作る場合は、Arrayを利用すればOKでした。

[javascript]

inlets = 1;
outlets = 2;
autowatch = 1;

function sendMessage(){

var messageList = [1,2,3];
outlet(0,messageList);

var messageString = "1 " + "2 " + "3";
outlet(1,messageString);
}

[/javascript]

JavaScript でパッチまでのフォルダパスを取得:Max/MSP,JavaScript

スクリーンショット 2012-12-22 3.02.55

特にどうって事は無いプログラムですが、JavaScriptの勉強にどうぞ。文字列の処理がMaxよりも得意そうです。

サンプルコード

[javascript]
inlets = 1;
outlets = 1;
autowatch = 1;

function patchPath()
{
var patchPath = this.patcher.filepath;
var lastSeparatorIndex = patchPath.lastIndexOf(this.patcher.name);

//Patch’s Absolute Path
var folderPath = patchPath.slice(0,lastSeparatorIndex);

outlet(0,folderPath);

}
[/javascript]

参考文献

JavaScriptリファレンス 第6版 – 検証してないですが1章 コアJavaScriptリファレンスまでは JavaScript in Max で利用できると思われます。

Max MSP Jitter JavaScript Reference を見つけまんた

スクリーンショット 2012-12-21 7.50.43

Max MSP Jitter JavaScript Reference (非公式)

JavaScript in Max Doc (公式)

Max/MSPでDVJネタの管理にSQLiteを使おうと思って、こちらのサンプルを見ていると突然の new SQLite が書いてある。しかしMaxのPatchObjectの中にSQLiteは居ない。まさかJavaScriptってSQLite用意してるのかとオライリーのサイリファレンス本を見てみるも載ってなくて謎。

そういえばJavaScript in MaxのReferenceって見たこと無いと思ってフォーラム探してみるも、全く無い。数年前から何人かそういう質問していたり、ブチ切れしている人がおった所に、「不完全だが・・・俺がつくりはじめたぜ!」というドイツ神(timtationさん)がおりました。

Max6の環境設定をいじってパフォーマンスをあげる:Max/MSP

パフォーマンス問題

現在開発中のコバルト爆弾αΩ用のDVJパッチは、複数の動画と音を同時に扱うため今までになく重く、フレームレート5fpsくらいしかでてなくて泣きそうでした。一応、Max上で見られるMSPのCPU仕様率は10%もいってないし、jit.qt.movie には loadram メッセージを送る事で動画はメモリに直接おいて、ボトルネックになりそうな部分は回避してるつもりなんですが、上手くいっていませんでした。

Max6をMacのアクティビティモニタでみると1つのコアしか使ってないみたいです。CPU使用率は130%前後。ハイパースレッディングが効いてるはずなので、1コア最大200%だとしても70%くらいCPU使えてないように思えます。メモリも8GB空いてる!なにが原因だろうと、まずはマルチコア使うように変更できないかな?とCycling74のフォーラムを漁ってはみたものの、マルチスレッドに関する話題はあるけど、マルチコアは無理みたいな話がありました。お前の実力は、こんなものなのか!?と疑問を持ちつつ探っていると、見つけました!!

解決策

スクリーンショット 2012-12-20 5.24.08

Maxの環境設定(Command + , )の中にあるThrottle関連の設定を変更します。なんとfpsが5~10もUPしました。特にQueue Throttle の値を 10 → 32000 へ上げたのが効いてるみたいです。jit.qt.movie や jit.matrix 重いようだったのですが、qmetro等のロープライオリティな処理をやり切れないまま、スケジュールが回ってたのかと推測できます。とりあえず、これでライブ出来そうです。以下、各パラメーターの適当な意訳。

  • Poll Throttle :CPUのスケジューラーがハイプライオリティイベントにおいて処理するイベントの数
  • Queue Throttle : ロープライオリティで処理するイベントの数
  • Redraw Queue Throttle :UI関連で処理するイベントの数?
  • Refresh Rate:UIの描画レート
  • Scheduler Rate:スケジューラーが呼ばれるインターバル
  • Scheduler Slop:ロープライオリティのスケジューラーが休止してる時間

スケジュールやらスレッドやらVMに関しては、あまり理解してないのですが動いてるので取り敢えず良いかな・・・たぶんPCの種類によってセッティングも変わってくるので、色々試して貰えればと思います!

参考サイト