25
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

node.jsとProcessingをOSCでやりとり

Last updated at Posted at 2016-07-20

前回(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

oscServer.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を実行したほうがいいかもしれませんが、とりあえずで。。。

クライアント側

oscClient.pde
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は階層構造も対応していたはず(/で区切るパスみたいな形式)
速度はサンプル程度じゃわからないですね

25
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?