前回(http://qiita.com/tkyko13/items/869652e956e0cd463b60)
はwebsocketでやりとりしましたが、今回はOSCでやってみます。
OSCとは
https://ja.wikipedia.org/wiki/OpenSound_Control
#環境
mac osx 10.10 yosemite
node.js v6.2.0
node-osc v2.1(node.jsのモジュール)
processing3.1.1
oscP5(processingライブラリ)
##環境設定
node.js
インストール方法は色々なサイトで紹介されています
nvmやnpmも入れると便利です
node-osc
npm install node-osc
2017-06-22
[コマンドの変更]
npm install ws
↓
npm install node-osc
長い間単純なミスを記載してしまっていました...
すみません...
npmを使ってインストールしました
参考公式ページ
https://github.com/termie/node-osc
https://www.npmjs.com/package/node-osc
oscP5
Processing内の[Add Library]から検索したらありました
Github https://github.com/sojamo/oscp5
リファレンス等 http://www.sojamo.de/libraries/oscp5/
#サンプルコード
前回のwebsocketでのサンプルコードとだいたい同じにしています。
サーバ側のnode.js
var osc = require('node-osc');
var sendCount = 0;
var oscClient = new osc.Client('127.0.0.1', 6000);
var oscServer = new osc.Server(5000);
oscServer.on("message", function (msg, rinfo) {
console.log(msg);
for(var i=0; i<msg.length; i++) {
console.log(msg[i]);
}
var sendMsg = new osc.Message('/address');
sendMsg.append("test");
sendMsg.append(sendCount);
oscClient.send(sendMsg);
sendCount++;
});
公式のサンプルではクライアントへ一回だけ送信のコードがあって、そこでは送信後、oscClient.killer();を実行しています
本当はプログラム終了時killerを実行したほうがいいかもしれませんが、とりあえずで。。。
クライアント側
import oscP5.*;
import netP5.*;
OscP5 oscP5;
NetAddress myRemoteLocation;
String message = "";
int sendCount = 0;
void setup() {
size(400, 400);
oscP5 = new OscP5(this, 6000);
myRemoteLocation = new NetAddress("127.0.0.1", 5000);
}
void draw() {
background(255);
fill(0);
text(message, 20, 20);
if (frameCount % 120 == 0) {
OscMessage myMessage = new OscMessage("Hello from P5");
myMessage.add(sendCount);
oscP5.send(myMessage, myRemoteLocation);
sendCount++;
}
}
void keyPressed() {
OscMessage myMessage = new OscMessage("Press key");
myMessage.add(""+key);//char型をString型に
oscP5.send(myMessage, myRemoteLocation);
}
void oscEvent(OscMessage msg) {
msg.print();
message += msg.addrPattern();
for(int i=0; i<msg.arguments().length; i++) {
message += ", "+msg.arguments()[i];
}
message += "\n";
}
こっちは受け取り方がちょっと違う
nodeの方は全部配列で入っているが、配列0番目をaddrPatternで受け取るようです。(タグ的な意味があると思います)
#実行
だいたい前回と同じですが、
まず、ターミナルからoscServer.jsがあるところまで移動し、nodeで実行
$node oscServer.js
5000番ポートで待ち受け、6000番ポートに向けて返信しています
(ちなみに同じポート番号ではだめでした)
次に、Processingのクライアント側サンプルを実行します
Processingは6000番で受け取り、5000番へ送っています
今回はどちらから起動しても大丈夫です(今回のnodeの方はサーバとは言えないのかな?)
無事Processingのスケッチもしくわコンソールとターミナルから各ログが出力されていれば成功です
Processing側でキーボードを押すとターミナルでその文字が出るかと思います
#発展
ほぼほぼ前回と同じでしょうか
oscなのでPureDataなんかと簡単にできそうなのかな
他クリエイティブコーディングをやる人はoscのほうが馴染みやすいのかも
扱いやすいし…
#WebSocketとの違い
ソースコードから気づくまず大きな違いはoscはポートを2つ使用することでしょうか
oscの場合は1ポートにつき一方通行な仕様なのかも
データ形式はwsはjsonなど独自で実装するのに対し、oscは階層構造も対応していたはず(/で区切るパスみたいな形式)
速度はサンプル程度じゃわからないですね