“use strict” が有効であるかを確認:Max/MSP, JavaScript

スクリーンショット 2012-12-27 4.38.18

ECMAScript 5 で導入されている “use strict” / strict モードは、JavaScript の機能を制限する代わりにエラーチェック機能やらセキュリティが提供されるモードとの事です。機能の1例としては、var を付けないで変数を宣言するとエラーがでます。というわけで早速 Max6 で “use strict” が使えるか調べてみました。

コード


"use strict"
autowatch = 1;

//strictモードが有効である場合
//関数内ではthisがundefinedになる。

//以下の関数は即時関数であり、宣言時に一度実行され
//結果がhasStrictModeに代入される

var hasStrictMode = (function () {
    "use strict";
    return this === undefined
}());

function bang() {

//trueが出力され"use strict"が有効である事が確認できる
    post("hasStrictMode:" + hasStrictMode);
    value = hasStrictMode; //JavaScript Referenceエラーが発生
    outlet(0, value); //出力はされない
};

結果 – Max6で”use strict” は利用可能

実行結果の画像を見ると hasStrictMode : true が出力されており、”use strict” が利用可能である事が確認できます。 var を付けてない value を利用しようとした所で、ちゃんとエラーがでてプログラムが止まっています。加えて、strict モードでない場合も試したのですが、1が出力される事を確認しました。

参考資料

  • JavaScript 第6版 – hasStrictMode のコードは p.117 5.7.3 “use strict” 文より利用させて頂きました。

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

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

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

コード

GlobalTest.js


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

function set(num){

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

GlobalTest2.js


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

function bang(){

outlet(0,value);
}

function set(num){

value = num;
outlet(0,value);

}

テスト

まず左側の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でした。


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 でパッチまでのフォルダパスを取得:Max/MSP,JavaScript

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

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

サンプルコード

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リファレンス 第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さん)がおりました。

JSオブジェクSignal入力に対する信号処理は不可:Max/MSP,JavaScript

スクリーンショット 2012-12-19 0.32.34

SignalをJavaScriptで信号処理したいぞー!というわけで調べてみたのですが、jsオブジェクトでSignalをスルーするコードしかわからなかったです。

追記

Cycling 74のフォーラムで質問してみたところ、信号処理はGen~かSDKを使ったC,Javaの開発でないと無理だったようです(T_T)

JavaScript


//signalをただスルーするパッチです。

inlets = 1;</pre>
outlets = 1;
autowatch = 1;

function signal() {

    post(messagename + "\n");
    post(arguments + "\n");
    post(arrayfromargs(messagename, arguments) + "\n");

    outlet(0, arrayfromargs(messagename, arguments));
}

Max6のJavaScriptのバージョンは1.8.5:Max/MSP , JavaScript

スクリーンショット 2012-12-15 11.24.31

Max6のJavaScriptのバージョンはJavascript 1.8.5との事です → Announcing Max6JavaScriptのwikiを見てみると比較的新しいバージョンのようですね。

forEach文を使ってみたかったんですが、javascript1.6以降なら利用可能という事で、使ってみたところ動きました。


var nums = [0,122,122,113];

function bang(){
	nums.forEach(function(i){post(i)}); //MaxWindowに0 122 122 113が表示される。	
}

動的に生成したパッチを繋ぐサンプル:Max/MSP , JavaScript

スクリーンショット 2012-12-15 4.03.31スクリーンショット 2012-12-15 4.04.42

スクリーンショット 2012-12-15 3.54.47

動的に(プログラム実行時に)生成したtoggleを繋いじゃいましょう!左上の数値を変更すると、makeToggleが呼ばれて、数値の数だけ繋がったtoggleが生成されます。clearToggleでtoggleを全部消すことが可能です。特に意味は無い、そこにMax6とJavaScriptがあったのと、夜眠れなくなったからやりました。

メタプログラミングという世界に突入だとコバルト爆弾αΩのΔが言ってました。夢が広がりそうな予感が!!!

余談ですが、ECMAscript5でArrayクラスに追加されたと噂のメソッドforEach使おうと思ったんですが、呼べなかったです。使えました!まさかMax6のJavaScriptは ECMAscript5 じゃない?3なのかな?調べたけれどわからなかったです。さらなる余談ですが4はActionScript3.0の原型らしいですね。どうりで似てるわけだ。

inlets = 1;
outlets = 0;

var p = this.patcher;
var toggles = new Array();	

post(p);

function makeToggle(numPatch){
	
	for(var i = 0 ; i < numPatch ; i++)
	{
		toggles.push( p.newdefault(Math.random() * p.wind.size[0],Math.random() * p.wind.size[1],"toggle") );
		
		if(toggles[toggles.length-2] != null)
		{
				p.connect(toggles[toggles.length-1],0,toggles[toggles.length-2],0); //今生成したtoggleのoutletと一つ前に生成したtoggleのinletを繋ぐ
		}
	}
}

function clearToggle(){
	
	
	for(var i = 0,length = toggles.length ; i <  length;i++)
	{ 
		p.remove(toggles[i]);
	}
}

パッチ内にToggleを作成するJavaScriptパッチ:MaxMSP

makeToggleメッセージを送れば送るほど、toggleがパッチ内にランダムに生成されるパッチです。toggleがランダムに生成されるんですよ!!!!!!!’`,、(‘∀`) ‘`,、

以下のコードをjsオブジェクトをダブルクリックして開くエディターに記入して、試して見てください。


function makeToggle(){

//jsパッチが置いてあるパッチへの参照を取得
var p = this.patcher; 

//position
//wind.size[0] は パッチの width , wind.size[1]は パッチのheight の取得
//Mathクラスのランダム関数によって、パッチウインド内の座標を適当に決定。
var x = Math.random() * p.wind.size[0];
var y = Math.random() * p.wind.size[1];

//Make Toggle
//上記で決めたx,yの位置にtoggleを作成
var t = p.newdefault(x,y,"toggle");

//toggleへbangを送る。= チェックが入る
t.bang();

}

パッチをフルスクリーン化するJavaScriptパッチ:MaxMSP

フルスクリーン化前

フルスクリーン化後

JavaScript in Max の勉強中です。オライリーのサイ本も読んでるんですけど、クラス以外は型指定の無いActionScript3.0だと思えば、ほとんど同じようですね。ネットで見てきたJavaScriptのコードは、$マークのついた文法が多くて、「この言語、なんか読みづらいなぁ」くらいに思っていたのですが、それはjQueryのせいだったようです。

今日は、Patchをフルスクリーン化するJavaScriptパッチのサンプルです。以下のコードをjsパッチをダブルクリックして出てくるエディターに入力します。

これでtoggleをONにすると、パッチがフルスクリーンになります。this.patherで、このjsパッチを呼び出しているパッチオブジェクトへのインスタンスへ参照ができて、パッチオブジェクトで保持しているfullscreenメソッドを呼び出しているという事だと理解しました。


inlets = 1;

function fullscreen(onOff)
{
	post("fullscreen:"+onOff);
	post();
	this.patcher.fullscreen(onOff);
}