値の差分を出力するMax6のjsオブジェクト

[javascript]

"use_strict"

autowatch = 1;
inlets = 1;
autowatch = 1;

var _preValue = null;

function msg_int(value){

msg_float(value);
}

function msg_float(value){

if(_preValue != null){

var outValue = value – _preValue;
outlet(0,outValue);
}

_preValue = value;

}

function clear(){

_preValue = null;
}

[/javascript]

どんどん入力される値と値の差分を取得できます。たとえば速度を計算したりする時に有効です。clearで区切れるのもポイントです。

動的に生成したパッチを繋ぐサンプル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の文法を解釈して色つけてるわけではないのですね。皆様も惑わされないようにお気をつけて!

Cycling’74 Max で扱える拡張子を追加する:Max/MSP

jsオブジェクト内で扱えるFolderオブジェクトは、filetypeを指定する事で扱う拡張子を制限できます。例えばMoovと指定すると.mov が含まれているフォルダだけリストアップしたりできます。

ただし.m4v や .avi といった動画でよく使われる拡張子に対して、4桁のfiletypeが対応していない事もあります。これを解決するために、filetypeに対して拡張子を追加してみましょう。

方法(Mac)

/Applications/Max 6.1/Cycling’74/init/max-fileformats.txt

を開いて

max fileformat .m4v MooV 0 Video moviefile;  

の行を追加します。

Maxを再起動して立ち上げれば、filetypeでMoovを指定すれば、.m4vもFolderオブジェクトで指定して扱えるようになりました。

終わりに

このfiletypeの指定はjit.qt.movieなんかでも使えるので、拡張子対応状況が知りたい場合や、拡張子を追加したい場合は、max-fileformats.txt を見てみてください。