JavaScript in Max の Templete : Max/MSP, JavaScript

[javascript]
"use_strict";
inlets = 2;
outlets = 1;
autowatch = 1;

var foo = 100;
declareattribute("foo",null,null,1);

function loadbang(){

out(messagename);
}

function bang(){

if(inlet == 0){

out(messagename);
}

foo++;
post("foo: " + foo);
post();
}

function msg_int(num){

out(num);
}

function msg_float(num){

out(num);
}

function message(){

var a = arrayfromargs(messagename,arguments);

out(a);

}

function list(){

var a = arrayfromargs(messagename,arguments);

out(a);
};

function anything()
{
var a = arrayfromargs(messagename,arguments);

out(a);
}

//////////////////////////////////////////////////////////////////////////////////////////

function init(){

post("jsarguments:");
for(var i = 0 ; i < jsarguments.length ; i++){

post(jsarguments[i]);
post();
}
}

function out(){

post(messagename + " :");

for(var i = 0 ; i < arguments.length ; i++){

post(arguments[i] + " ");
outlet(0,arguments[i]);
}

post();
}

//////////////////////////////////////////////////////////////////////////////////////////

function save(){

post("save");
post();

//When the js object containing this script is recreated, the function numchairs will be called
embedmessage("init");
}

//Assistance for Inlet
function describe_inlet(num){

assist("this is inlet number : " + num,num);
}
setinletassist(-1,describe_inlet);

//Assistance for Outlet
function describe_outlet(num){
assist("this is outlet number : " + num,num);
}
setoutletassist(-1,describe_outlet);

[/javascript]

jsオブジェクト内で記述する JavaScript in Max の書き方を忘れがちなので、自分用にTempleteをつくりました。jsオブジェクトをダブルクリックで開くエディタにコピペして、ご利用ください。

日本語を Max6 から Processing に OSC 経由で送る際の文字化けについて

oscP5-1

Max6 は文字コードのエンコーディングに UTF-8 を、Processing は内部的には Java なので UTF-16 を用いているのではと推測されます。そのため Processing 向けのoscP5は、Max6から受け取った UTF-8 の日本語バイト列を toString() すると、UTF-16 として解釈して文字化けしてしまいます(たぶん)。OscMessage や OscArgument のクラスなどひと通りみたのですが、エンコーディングに関するメソッドが見当たりませんでした。

そこで対策ですが、Max6 から受け取った OscMessage の Byte 列を一旦 UTF-8 として String に変換すれば問題が無くなりました。そんなに検証してないので問題あったら教えて欲しいっす!

[java]
void oscEvent(OscMessage theOscMessage) {

//このprintでは日本語の文字化けが確認される。
theOscMessage.print();

//OSCをByte列として取得
byte[] bytes = theOscMessage.getBytes();

try {

//Byte列をUTF-8として解釈
String str = new String(bytes, "UTF-8");

//Addrpatternとtypetagを削除する
String typeTagStr = theOscMessage.typetag();
str = str.substring(str.indexOf(typeTagStr) + typeTagStr.length());

//コンソールにMax6から送った日本語のメッセージが表示される
println("String:"+str);

}
catch(UnsupportedEncodingException e) {

e.printStackTrace();

};

}
}
[/java]

Syphon Server に Processing から簡単に映像を送る方法:Processing

syphon

映像をアプリ間でシェアできるライブラリ Syphon 。Processing では、FullScreen Library が使えなくて困っていたので、 Max6 に映像送って全画面化して使ってます。

Processing から Syphon Server へ映像を送る時に、Example には createGraphics した PGraphics にオフスクリーンで描画しておいて、PGraphics を Sypohon サーバーに送るという方法が書かれています。ただし、途中まで作ってSyphon化したい時なんかに、描画命令全部を拾って PGraphicsするのは面倒くさいです・・・。実は、もっと簡単な方法があります。

[javascript]

import processing.opengl.*;
import codeanticode.syphon.*;

SyphonServer server;

void setup(){

// Create syhpon server to send frames out.
server = new SyphonServer(this, "Processing Syphon");
}

void draw(){

//いつもの通りアプリを書く

//syphon server へ映像を送る
server.sendImage(g);

}
[/javascript]

以上でできました。Processing の PApplet のドキュメントを読むと g というPGraphics型の変数が定義されています。Processing の内部的には、gに対して色々と描画をしていたようです。

LiveAPIを使い、自分のトラックナンバーを得るパッチ:Javascript in Max, Max for Live

スクリーンショット 2013-04-09 1.14.11

[javascript]
//init
"use_strict";
inlets = 1;
outlets = 1;
autowatch = 1;

var api;// = new LiveAPI();

function loadbang(){

api = new LiveAPI();
}

//bangを受け取ると、このデバイスが刺さっているトラックナンバーを出力
function bang(){

//Loadbangの中で代入できない場合があった。
//LiveAPIの初期化は、非同期処理なのかな?
api.path = "this_device";

var pathStr = api.path;
var paths = pathStr.split(" ");
outlet(0,parseInt(paths[2]));
}

[/javascript]
LiveAPIを勉強してます。文字列処理は、Javascriptでやると簡単だと思う。

Robotlegs の使用上のポイントメモ:Robotlegs, Starling, ActionScript

スクリーンショット 2013-02-17 1.39.50

Robotlegs 使用上のポイント

ActionScript3.0 のMVCフレームワーク robotlegs を利用する上でのメモです。

  • Actor を継承していない Model で Event Dispatch をしても Context に伝達しない。
  • Actor を継承していなくても、Inject する事は可能。
  • Actor を継承しているModelで Event Dispatchをする場合に、[Inject]を利用してインスタンス化されていない場合は、エラーがでる。
  • 初期化は[Post Construct]で行う。[Post Construct]はInjectionが終わった後に呼ばれるため。
  • コンストラクタの時点でinjectされていない事があった。Actorで確認。(contextの記述順が関係してる?)
  • Starling を一緒に使うプラグイン robotlegs-starling-plugin 利用時には、Model → View Mediator への Event 伝達は flash.events.Event を継承したクラス利用する。Mediator内で starling.events.Event と混在する事になる。
  • Command 内でmappingされているEventを取得する場合に、Eventの型が一致していないとエラーがでる。インターフェイスや親クラスで受けようとしてもエラーが出る。

強制的にMVC構造になるギプスみたいな感じで、楽しく使えています。