February 10, 2006

OpenSoundControlについて

 OpenSoundControl(以下OSC)は、アプリケーション間、ハードウェア間をUDP/IP通信でコミュニケーションするためのプロトコルです。
.
..
 最近では、いろんなケースで見かけるようになり、Lemurというマルチタッチ可能なタッチパネルを備えたコントローラデバイスが、ソフトウェアとの通信にOSCを採用したり、デファクトスタンダードと言えるほど浸透してきています。

 自分自身も、よく使う場面があります。音マシンと映像マシンとの同期をとるためであったり、Flash8以前(Flashでビットマップ処理できないとき)に、jitterでの画像解析の結果をFlashコンテンツに反映させたり、などなど。様々なアプリケーションに実装済みなので、使い何処も様々あるでしょうし、オープンソースなので、自分のソフトウェアにも実装可能です。

 他に変わった使い方としては、mmonoplayer(jit.atari2600オブジェクトの作者)は、オープンソースのNESエミュレータにOSCを実装して、実行中のゲームのカラーパレットをMaxから動的に変更を加えてグラフィックを改ざんするため、エミュレータとMaxの通信にOSCを使用している。
http://mmonoplayer.com/nesvis.html
http://mmonoplayer.com/mmmanip.html

 この例も含め、いろいろなOSCを扱った記事や実例のテーマは、何かが何かをコントロールするような主従関係ものが多いようです。関連するドキュメントがすでに多く存在する上で、改めて、ここでOpenSoundControlについて書くのですから、なにか新しいことでないと意味がないような気になるので、ここで新しいかもしれないことを提案すると、並列処理的なアイデアを加味すると、より幅広い応用ができるのではと思うのです。

processingでこいで Maxでおどる


 例えば、自分の使用頻度高いMax/MSP+Jitterは、大量のオブジェクト同士を物理法則に沿わせて計算させるのが非常に苦手です。Maxでオブジェクト書くのは労力がいりますし、手軽にJavaScriptで書いたとしても満足のできる実行速度が出るとは限りません。
 こういうのはProcessingだとやりやすいです。パフォーマンスも悪くないし、最近ではtraer.physicsという物理エンジンライブラリも登場したので、より迅速に書けます。
http://www.cs.princeton.edu/~traer/physics/

 このライブラリ、ちょっといいなぁと思ったので、MaxとProcessingを同時に走らせ、MaxからのOSC経由でのProcessingへの命令を受けて、計算結果をまたMaxに返すことで、Processingをバックエンドで動く計算マシンのようにして、最小限の労でMax上で、物理法則に基づいた動きを実現してみようと考えた。
 さっそくこのライブラリをダウンロードして、サンプルの"bouncyballs"に、OSC送受信部分を加えて、Max側では、マウスの位置の送信部分と、受信した座標から円を描画する部分を書いた。

右図:Maxからのマウス座標の送信を受けて、Processing側でボールの位置を計算し描画するとともに、Maxに座標データをわたしているので、MaxとProcessingでボールが全く同じに動いている


 3個だけでは効果を実感できないので、任意の個数にMax側から変更できるようにるるために、Processingのコードを書き換え、Max側は速度に応じてボールが明るくなるように変更を加えた。

 Processingのコードはアプリとして書き出した。右上にあるのがそのウィンドウ。描画する必要がないので、最小サイズに。アプリ化は、最近のリビジョンからの機能だが、これはとてもありがたい。例えば、ライブ中にある時間だけこの処理をさせたいとなったとする、アプリ化しておけば、その間だけApplescriptでアプリを自動で立ち上げることができる。

 Maxでは、リストは256までしか保持できないので、最高128個のパーティクルまででしかテストできなかったが、パーティクルそれぞれが訴求力と反発力の伴った運動、安定して30fpsの速度で動作した(PowerBookG4 867Hz メモリ1GB)。他の処理系がまったくないので、激しく処理を切り替えるライブなどでの実用に耐えるかどうかまでは不明だが、シンプルなことであれば、この即効性はとても魅力じゃないでしょうか。

 余談ですが、OSCは2バイト文字に対応してないので、日本語は送受信できません、自分も以前にFlashからMaxに日本語を送ろうとしてはまったのですが、これは、1バイトづつに変換して送ることで解決します。変換時の文字コードがお互いに違うと、化けるので、文字コードの変換も必要になります。

関連記事




次の記事

Mar 04, 06
Written by noriko matsumoto | Flash , Max+Others
Flash+Maxについて、以前のワークショップのメモ程度にしか書いていなかったので久々にflashserverオブジェクトについてまとめてみました。 flashserverとはMaxパッチとFlashコンテンツ(swf)間でXMLソケット通信を行う...

前の記事

Jan 31, 06
Written by yosuke hayashi | Max/MSP+Jitter , Synthesis
mixiにコミュニティもできたところで、僕の第二回です。 第二回目、ということで何をしましょうか。...