Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

tkyko13
クリエイティブコーディングや電子工作が趣味としていきたい
http://tkyk.net
protoout-studio
ProtoOut Studioは日本初のプロトタイピング専門スクールです。プログラミングとプランニング(企画)の両方のスキルを兼ね備えた人材輩出を行います。作って発信して、がんがんプロトアウトしていきましょう。
https://protoout.studio
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした