たまに、jsから直接MaxのナンバーボックスやマルチスライダーなどのUI系のオブジェクトの値を取りたいと思うことがあります。
ドキュメントやExampleパッチを調べたり、ググったりしてもなかなか見つからなかったので、案外知らない人もいるんじゃないかと思ったので書きます。
Maxobj#getvaluof()
を使えばいけるようです。
こんなパッチのとき、
各UIオブジェクトにはインスペクタからScriptingNameを設定しておき、jsにてgetnamedメソッドでMaxobjを取得して使います。
autowatch = 1;
//flonum
var num = null;
//function
var func = null;
//matrix
var mat = null;
//multislider
var mult = null;
function loadbang () {
num = patcher.getnamed("testnum");
func = patcher.getnamed("testfunc");
mat = patcher.getnamed("testmatrix");
mult = patcher.getnamed("testmult");
}
function getnum () {
var f = num.getvalueof();
post(f, "\n");
}
function getfunc() {
post("function value---------\n");
var v = func.getvalueof();
v.forEach(function (el) { post(el, "\n"); });
post("end-------------------\n");
}
function getmult() {
post("multislider value---------\n");
var v = mult.getvalueof();
post(v, "\n");
v.forEach(function(el){ post(el, "\n") });
post("end-------------------\n");
}
function getmatrix() {
post("matrix value---------\n");
var v = mat.getvalueof();
post(v, "\n");
v.forEach(function(el){ post(el, "\n") });
post("end-------------------\n");
}
全部のUIオブジェクトで試してないのでなんとも言えませんが、live系も含め主要なUI系のオブジェクトはできると思います。
ただ、やはりブラウザのUIのように、イベントリスナーを登録してUIをいじったタイミングでの値を取得したくなるのですが、そのような方法が今のところ見つからないので、使い勝手的には微妙で、それなら普通に直接インレットに繋げてつかうわ・・という感じです。
一応GitHubにもExampleをアップしておきました。
https://github.com/okupara/AdventCalendar1211Example
os10.10.1 Max7.0.1 64bit
os10.10.1 Max6.1.7 32bit
で確認してますが、
自分の環境でしか試したことがないので、何か問題などあればお知らせいただけると・・