日本語を 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構造になるギプスみたいな感じで、楽しく使えています。

AIR SDK 3.4 → 3.6 のアップグレードでつまずく:AIR, Flash Builder 4.7

fbicon

AIR SDKを3.6にアップグレードしようとしたが・・・

Flash Builderでアプリを作ろうと思い、とりあえず現状のAIR SDK 3.4から最新のAIR SDK 3.6にあげようとしました。が、つまずきました。結果的に3.5にしたら動いたメモ。

SDKのダウンロード

Download Adobe AIR SDK with ActionScript Compiler 2.0

上記サイトでSDK 3.6をダウンロード。

※結果的にはAIR SDK3.5だったら問題がありませんでした。

SDKのアップグレードの仕方

Flash Builder 4.7からSDKのアップグレードの仕方が変わったようです。英語を読み読みAIR SDK 3.6へアップグレードをしてみる。

問題発生

スクリーンショット 2013-02-02 4.24.19 1

モバイルプロジェクトを作って、AIRでデバッグする事は出来たのですが、iOSのエミュレーターや実機でデバッグしようとすると、このようなエラーが出ました。 Error | Run, debug, deploy | iOS app | Flash Builder 4.5 のサイトのやり方で修正しろと言われますが、Flash Builder 4.5の方法しか書いてないため修正方法がわからなかったです。またStarlingのFlash Builder 4.7 – How to update AIR SDK  でも同様の問題が議論されています。「2回やったらできた」「SDKをアップグレードするときに、フォルダ事上書きするといいよ」等のアドバイスが書いてありますが、私の環境で上手くいきませんでした。

AIR SDK 3.5 はうまくいく

じゃあ3.5はどうだろう?とやってみるとAIR SDK 3.5では上記問題が発生しませんでした。今回の検証は、ここで辞めました。