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対応しようかな。
iPad、iPhoneから制御。
有料アプリになりますが、例えば、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仕様書日本語版]が参考になります。こういう訳はありがたい!