max processing osc 連携


oscP5公式マニュアル

http://www.sojamo.de/libraries/oscp5/reference/

方法

MaxとProcessingを連携する一番簡単な方法は「OSC」というプロトコル(通信規格)を使用することです。そのためにMax側ではudpsendとudpreceiveというオブジェクトを、Processing側ではoscP5というライブラリとそれに関するオブジェクトを使用します。

OSCは何のために必要か

「OSC」というプロトコル(通信規格)は例えていうなら、MaxからOSCという「血管」にデータを流して、ProcessingはOSCの「血管」からデータを受け取ります。その逆、ProcessingからMaxへも同様にも同様の方式でデータの送信を行います。OSCは「血管」のように情報をやり取りするための「通路」だと考えることができます。そして血管に情報を流したり受け取るためのMaxのオブジェクトがudpsendとudpreceiveで、ProcessingのオブジェクトがoscP5関連のものです。

OSCには何が流れているか

OSCには基本的に単なる文字列を流します。加えて、データをフィルタリングするために「メッセージ」とよばれるラベルの役割を果たす機能を付け加えることができます。具体的には「/mouse 4」というデータは、mouseというメッセージが付加されていて、実際の内容は「4」です。このデータを受け取ったときに「mouse」というメッセージでフィルタリングして、mouseがついている情報だけ受け取る、mouseがついている情報は受け取らない、といった選択のためにメッセージは活用できます。

OSCをMaxとProcessingで使うには何が必要か

MAX

さしあたって特に必要なし。送信にはudpsend,受信にはudpreceiveというオブジェクトが標準で用意されているのでこれを使えば良い。

Processing

oscP5というライブラリーを追加すること。

スクリーンショット 2016-03-13 3.35.28

スクリーンショット 2016-03-18 2.43.03

Maxから送信し、Processingで受ける

Maxから送信するパッチ

スクリーンショット 2016-03-18 7.38.25

「udpsend」というオブジェクトを作り「IPアドレス ポート番号」という引数を与える。ここでは同じパソコンなのでIPアドレスの代わりに「localhost」でOK。ポートは任意の番号で良い。ここでは12000とした。

これに対して「/test 600」と「/test 400」というメッセージを送る。「/test」は単なる分類上のラベル(メッセージ)であって、実際の値(アーギュメント)は400もしくは600。

Processingで受けるスケッチ

exampleにある、oscP5plugをベースにしています。

oscP5 = new OscP5(this,12000);

processingの受信ポートの設定。12000の位置がポート番号を入れる場所。Maxで12000のポートに送っているなら、受ける側であるProcessingでも12000にする。

oscP5.plug(this,”test”,”/test”);

/testがデータにラベルとしてついてる場合だけをフィルタリングする。/testがついたデータがきた場合のみ「test」の名前が付いたファンクションを起動する。

public void test(int theA) {
println(” 2 ints received: “+theA);
}

testというファンクション。これが起動する。以下のコードで変数名Xが表示される。

public void 関数名(型  変数名X){
println(変数名X);
}

その他の方法

oscP5oscArgument参照

「/test 4 5 6」のようなデータが送られてきた場合はget(1)で5が取れる。get(0)で4が取れる。ここでget(3)をすると存在しないのでエラーが出る。どうやら配列のような状態で送られてくる模様。

Maxでのパッチ補足

次のようにすると、入力された値に/testを前方につけて出力することが可能。

スクリーンショット 2016-03-18 8.33.21

UDPテスター

OSCは基本的にUDPという仕組みを使っているらしく、UDPテスターで送受信のチェックが可能です。スクリーンショット 2016-03-18 8.42.57

Senderの方では、データを送れる。1ddddと入れてエンターを押すと、送信できる。Receiverの方では受信をチェックできる。受信したデータが表示される。

スクリーンショット 2016-03-18 8.42.06

Max側での受信

oscP5massageを参照。

問題は以下のコード。バイトクラスのメッセージは、どうやらMaxで受信ができない、もしくは設定が必要なようだ。他のコードは単に文字列が送信される。

スクリーンショット 2016-03-18 19.24.05

Oscの送受信の仕様に関する仮説

どうやら、同じIPアドレスで同じポートに受信のために接続できるのは「1つ」のみのようだ。同じIPアドレスで同じポートに「送信」は何個でもOK。できる方法あったら教えてください。

なのでMax側とProcessing側では受信するポートを変える必要がある。具体的には以下のように設定する。

  • Maxの受信ポートは12000
  • Processingの受信ポートは12001
  • Maxに送りたいときは12000のポートに送る
  • Processingに送りたいときは12001のポートに送る

OSC-routeの活用

http://cnmat.berkeley.edu/downloads

CNMAT Max/MSP Externals for Macをダウンロードすると中に入っているオブジェクト、OSc-routeを活用すると受信したOSCデータを扱いやすくなる。

スクリーンショット 2016-03-18 20.04.24

この投稿は役に立ちましたか? 役に立った 役に立たなかった 2 人中 2 人がこの 投稿 は役に立ったと言っています。

3 comments

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

以下の数式は「スパム対策」です。空欄に正しい数字をいれてください。お手数をおかけします。 * Time limit is exhausted. Please reload the CAPTCHA.