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

スクリーンショット 2014-01-26 17.53.54

大量のパッチを繋ぐの面倒くさい!のでjsパッチで書いてみました。[generate 200]を押すと、一気に200個のcounterオブジェクトが生成され、かつrouterオブジェクトに繋ぐ事が可能です。function patch の内容を変えて使ってみてください。ようやくjsパッチのお作法が掴めてきたかなという感じです。JSパッチによる自動生成は、失敗するとパッチが全部見えなくなったり、Maxが落ちたりするので、気をつけてご利用ください。

JSパッチのメモ

  • this は jsthis のインスタンス
  • jsthis は maxobject を継承してる
  • patcher は maxobject を継承している。maxobjectのコンテナな扱い。
  • maxobject は、それを含んでいるpatcherへの参照を保持してるので辿れる。

[javascript]
"use_strict"

autowatch = 1;
inlets = 1;
outlets = 0;

var p = this.patcher;
var generatedObjects = [];
var GENERATE_CLASS_NAME = "counter"
var CONNECT_OBJECT_CLASS_NAME = "route";

function generate(num){

if(num <= 0) return;

var windWidth = p.wind.size[0];
var windHeight = p.wind.size[1];

var rect = this.box.rect;
var width = rect[2] – rect[0];
var height = rect[3] – rect[1];

var x = rect[0];
var y = rect[1];

for(var index = 0 ; index < num ; index++){

var numRow = Math.floor(windWidth / width);
var column = Math.floor(index / numRow);
post("numRow:" + numRow);
var row = index % numRow;
generatedObjects.push(p.newdefault(width * row,y + height * (2 * (1 + column)),GENERATE_CLASS_NAME));
}

patch()
}

function remove(){

for ( var index = generatedObjects.length-1; index >= 0; index–)
{
p.remove(generatedObjects[index]);
}

generatedObjects = [];
}

function patch(){

//find object for outlet
var connectOutletObject = findObjectFromClass(CONNECT_OBJECT_CLASS_NAME);
post("find:" + connectOutletObject.maxclass);
post();

//connecting
for(var index = 0 ; index < generatedObjects.length ; index++){

if(generatedObjects[index].valid == 1){

p.connect(connectOutletObject,0,generatedObjects[index],0);
}
}
}
patch.local = 1;
//varname tsu kau
function findObjectFromClass(className){

post("objectCount:" + p.count);
post();

var object = p.firstobject;

while(object){

post(object.maxclass);
post();

if(object.maxclass == className){

return object;
}

object = object.nextobject;
}

return nil;
}
findObjectFromClass.local = 1;

[/javascript]

JSオブジェクトのエディタで、文字カラーは無視しても大丈夫:Max/MSP, JavaScript

スクリーンショット 2013-12-18 03.34.00

Max6のjsオブジェクトでスラッシュとバックスラッシュの文字列置換を、正規表現で書きました。その時に少し困った事があったのでメモ。

[javascript]

tempStr = tempStr.replace(/\//g,"\\");

[/javascript]

\で、その後に続く特殊文字(例えばスラッシュ)のもつ特別な機能を無効にできるのですが、エディタで見るとスラッシュが2回でてくる所で、コメントアウトの緑色に変わってしまっています。本来ならバックスラッシュの後ろのスラッシュは、コメントアウトする機能は無いはずです。

当然動作させると問題なく スラッシュ → バックスラッシュ と置換されたので、エディタの色付けが間違っているようです。エディタは、jsの文法を解釈して色つけてるわけではないのですね。皆様も惑わされないようにお気をつけて!

Javascript の Array.sort() のデフォルトソート関数の動作を、小文字・大文字を無視するように変更

[javascript]
Array.sort(function (a, b) {
return a.toLowerCase().localeCompare(b.toLowerCase());
});
[/javascript]

Cycling’74 Max の jsオブジェクトは、文字列操作するのに持ってこいです。

Max から Javascript の Date クラスを使ってみる:Cycling’74 Max/MSP, JavaScript

スクリーンショット 2013-10-06 21.59.41

Maxで現在の年・月・日時等の取得の仕方がわからなかったのでjsオブジェクトで作成してみました。

Date.js

[javascript]

"use_strict";
autowatch = 1;

function anything(){
var date = new Date();
outlet(0,messagename,date[messagename]());
}

[/javascript]

Javascriptには元々Dateクラスが容易されているので、それを利用したいです。そこでanythingやmessagenameプロパティを使い、dateクラスのファンクションを動的に呼び出しております。

ひとまずjsのクラスをMaxパッチに公開する事ができました。

JSオブジェクトにて、list関数を呼び出す場合は、引数listの1つ目の要素は数値にする:Cycling’74 Max, JavaScript

スクリーンショット 2013-09-24 23.45.53

jsオブジェクトで1つハマりました。

デフォルトで使えるlist関数を呼びだそうとしても、どうしてもanything関数しか呼んでくれない。どうしてだと調べてみると、jsパッチでlist関数を呼ぶには、引数listの1つ目の要素は数値にする必要があったようです。先頭が文字列のリストは、単なるメッセージ扱いになってしまうみたいです。たぶんmessageによる関数呼び出しと区別つかないから仕方ない事だと思われます。皆様もお気をつけなすって!

jsオブジェクト コード

[javascript]</pre>
autowatch = 1;
inlets = 1;

function list(){

post("list:" + arrayfromargs(messagename,arguments));
post();
}

function anything(){

post("anything:" + arrayfromargs(messagename,arguments));
post();
}
<pre>[/javascript]