Flashで使えるOSCライブラリ、tuio-as3

FlashでOSCをつかってローカルネットワークで連携することになったのでTIPS載せます。

OSC とは、

OpenSound Control - Wikipedia
様々なソフトウェア間、ローカルネットワーク内の端末間で、通信するためのプロトコルです。
名前に、Soundとありますが、別に音以外もなんでも使えます。
wifiネットワークでつながった、iPhoneを楽器にしたりなどもできます。

c++, c, ruby, java, と大抵の言語でライブラリが揃っているので、ソフト間の連携でも使えます。
僕の場合、今回は、SuperColliderとFlashの連携で使っています。

ライブラリをさがす

まず、兎にも角にもライブラリの選定です。自分で一から開発する気など皆無です。*1

さっそく、グーグル先生で検索すると…
google:flash osc
…ほぼほぼflosc一択の様な印象。

しかししかし、
floscはあまりお勧めしません。実は、floscはFlashPlayer 9の遺産。
floscはJavaがoscクライアントを立てて、javaとXMLSocketで、通信してます。
javaを通して変換している。立ち上げが面倒なのもそうですが、XMLSocketで通信しているので、重いのです。
通信が少量なら良いのですが、多くのデータを通信すると重くなっていきます。

flashplayer10からは、xmlを使わない、バイナリsocket通信がサポートされて、
ただのsocket通信プロトコルである、oscもjavaを通さず出来るようになりました。


というわけで、

tuio-as3ライブラリ

実は、oscではなく、tuioで捜すとありました。
http://code.google.com/p/tuio-as3-lib/


tuioライブラリの中に、oscライブラリが隠れています。
tuioとは、マルチタッチ用のOSCを使ったプロトコル規格。

このライブラリでは、OSCの通信方法をUDP,TCPのどちらかを選べます。
TCPの場合、ブラウザのFlashPlayerで実行可能。ネット越しのOSC通信も可能になります。
UDPの場合、ActionScriptの関係で、Airアプリでしか再生出来ません。
しかし、OSCを使う場面は大抵、ローカルネットワーク環境なので、Airで作ったほうが、セキュリティ制限もなく、好都合だったりします。



以下、ActionScriptで、OSC送受信のサンプルコード。

package 
{
import org.tuio.connectors.UDPConnector;
import org.tuio.osc.IOSCListener;
import org.tuio.osc.OSCBundle;
import org.tuio.osc.OSCManager;
import org.tuio.osc.OSCMessage;

/**
 * OSC送受信サンプル。<br/>
 * (注)このサンプルは、UDP通信をつかっているので、Airアプリでしかコンパイル出来ません。
 */
public class TestOSC implements IOSCListener
{
	// OSCマネージャー
	private var _oscManager:OSCManager;
	
	public function TestOSC()
	{
		// ポート3333で、OSCを受信
		var connectorIn:UDPConnector = new UDPConnector("127.0.0.1", 3333, true);
		// ポート3334から、OSC送信
		var connectorOut:UDPConnector = new UDPConnector("127.0.0.1", 3334, true);
		var autoStart:Boolean = true;
		
		// マネージャー作成
		_oscManager = new OSCManager(connectorIn, connectorOut, autoStart);
		// OSCのリスナーを設定
		_oscManager.addMsgListener(this);
	}
	
	/**
	 * OSCメッセージを受信するとこのメソッドがOscManagerより呼ばれる。
	 */	
	public function acceptOSCMessage(oscmsg:OSCMessage):void {
		if(oscmsg.address == "/hoge") {
			// なにか処理
			var i:int = oscmsg.arguments[0];
		}
	}
	
	
	/**
	 * OSC送信 
	 * 
	 */	
	public function sendOSCMessage():void {
		var m:OSCMessage = new OSCMessage();
		m.address = "/hoge";
		m.addArgument("i", 2); // 整数を追加
		m.addArgument("s", "boo"); // 文字列を追加。
		m.addArgument("f", 0.3); // 少数を追加
		_oscManager.sendOSCPacket(m);
	}
	
	
	/**
	 * OSCバンドルを送信 
	 */	
	public function sendOSCBundle():void {
		// メッセージ1つめ追加
		var b:OSCBundle = new OSCBundle();
		var m:OSCMessage = new OSCMessage;
		m.address = "/hoge";
		b.addPacket(m);
		
		// メッセージ2つめ追加
		m = new OSCMessage();
		m.address = "/boo";
		m.addArgument("i", 5);
		b.addPacket(m);
		
		_oscManager.sendOSCPacket(b);
	}
}
}

OSCで出来る事

ただ、OSCの使い方を紹介しただけでパッとしないかも知れませんので、活用例。

自作アプリケーション間の連携

僕が以前作った、マルチプロジェクション用の映像同期アプリ
http://d.hatena.ne.jp/asus4/20090215/1234730264
も、PC間の通信をOSCでやっています。
制御部分をFlashで、映像投影を他のプログラムで。なども可能。
音や映像なんかの、重い処理をc++なんかでやって、GUI部分をFlashでやる方法が現実的な案かと思います。
SimpeVJもOSC対応しようかな。

iPadiPhoneから制御。

有料アプリになりますが、例えば、TouchOSCなどのアプリを使えば、
http://hexler.net/software/touchosc
iPadからPCのFlashをマルチタッチで制御なんてことも可能。
ライブなんかにお勧め。


Reactable

ここらへんは、OSCというより、派生プロトコルのTuio活用例ですが。
ビョークのライブで、一躍有名になったReactable。
http://www.reactable.com/

画像認識部分は、reactivisionという名前で、公開されています。
http://reactivision.sourceforge.net/
TUIOプロトコルに沿っているので、Tuio-as3ライブラリで活用可能。

マルチタッチディスプレイ自作


例えば、CCVというTUIOプロトコルを出すアプリケーションと連携すれば、巨大iPad (iTable)的なものも作れたり。



などなど、アイディア次第で、いろいろ夢が広がりますな。
現在、SuperCollider_AS3ライブラリを作成中。


      • -

追記 2012/12/03
どのipからもOSCメッセージを受け取る
http://asus4.hatenablog.com/entry/2012/12/03/174130

*1:うそです。少し挑戦しましたが、諦めました。開発するときは、[http://veritas-vos-liberabit.com/trans/OSC/OSC-spec-1_0.html:title=OSC仕様書日本語版]が参考になります。こういう訳はありがたい!