2013年08月24日

卓プロジェクトを進めていく中でいろんなプログラミング環境間のデータのやりとり
が必要な場面が多く、大体osc(Open Sound Control)を使っていろいろやったのでメモ。

processing<--->processing
openFrameworks<--->openFrameworks
processing<--->openFrameworks
processing—>Puredata
についての記事



今回はすべて送信側がマウスのクリックするとマウスの位置を送り、
受信側がその位置を受け取り、その位置に○を書くというシンプルなものを
oF,p5でテスト用に作った。以後ここから用途に合わせて作り込んでいけば便利かなと思う。


まずはprocessing
processingでoscを扱うためにはoscP5というライブラリが必要。

送信側のプログラム

import oscP5.*;
import netP5.*;
 
OscP5 oscP5;
NetAddress myRemoteLocation;
 
void setup(){
  size(500, 500);
 
  oscP5 = new OscP5(this,1234);//自分のポート番号
  myRemoteLocation = new NetAddress("127.0.0.1", 5555);//IPaddress,相手のポート番号
}
 
void draw(){
  background(255);
}
 
void mousePressed(){
  OscMessage myMessage = new OscMessage("/test");
  myMessage.add(mouseX);//add message
  myMessage.add(mouseY);
  oscP5.send(myMessage, myRemoteLocation); 
}


マウスの位置をaddして受信側におくる


受信側

import oscP5.*;
import netP5.*;
 
OscP5 oscP5;
 
int posx, posy;
 
void setup(){
  size(500, 500);
  oscP5 = new OscP5(this, 4321);//自分のポート番号
  oscP5.plug(this,"getData","/test");//getDta:受け取る関数
}
 
public void getData(int x, int y) {
  posx = x;
  posy = y;
}
 
void draw(){
  background(255);
  noStroke();
  fill(255, 0, 0);
  ellipse(posx, posy, 20, 20);
}


oscP5.plugで受け取る関数の名前を決めてデータを受け取る。
データ型はintでもstringでもcolorいいし、配列も受け取れました。


次にopenFrameworks
oFでoscを使うにはofxOSCというaddonが必要ofxOSCを追加している前提で

送信側
testApp.h

#pragma once
 
#include "ofMain.h"
#include "ofxOsc.h"
 
#define HOST "127.0.0.1"
#define PORT 4321//相手のポート番号
 
class testApp : public ofBaseApp{
 
public:
    void setup();
    void update();
		void draw();
 
		void keyPressed  (int key);
		void keyReleased(int key);
		void mouseMoved(int x, int y );
		void mouseDragged(int x, int y, int button);
		void mousePressed(int x, int y, int button);
		void mouseReleased(int x, int y, int button);
		void windowResized(int w, int h);
		void dragEvent(ofDragInfo dragInfo);
		void gotMessage(ofMessage msg);
 
private:
    ofxOscSender sender;
 
};



testApp.cpp

#include "testApp.h"
 
//--------------------------------------------------------------
void testApp::setup(){
    ofBackground(255, 255, 255);
    sender.setup(HOST, PORT);
 
}
 
//--------------------------------------------------------------
void testApp::update(){
 
}
 
//--------------------------------------------------------------
void testApp::draw(){
 
}
 
//--------------------------------------------------------------
void testApp::mousePressed(int x, int y, int button){
    ofxOscMessage m;
    m.setAddress( "/test" );
    m.addIntArg(x);
    m.addIntArg(y);
    sender.sendMessage(m);
}



受信側
testApp.h

#pragma once
 
#include "ofMain.h"
#include "ofxOsc.h"
 
#define PORT 8000//自分のポート番号
 
class testApp : public ofBaseApp{
 
	public:
		void setup();
		void update();
		void draw();
 
		void keyPressed  (int key);
		void keyReleased(int key);
		void mouseMoved(int x, int y );
		void mouseDragged(int x, int y, int button);
		void mousePressed(int x, int y, int button);
		void mouseReleased(int x, int y, int button);
		void windowResized(int w, int h);
		void dragEvent(ofDragInfo dragInfo);
		void gotMessage(ofMessage msg);
 
        void dumpOSC(ofxOscMessage m);
 
 
    ofxOscReceiver receiver;
 
    int mX, mY;
 
};



testApp.cpp

#include "testApp.h"
 
 
//--------------------------------------------------------------
void testApp::setup(){
    receiver.setup(PORT);
    mX = 0;
    mY = 0;
}
 
//--------------------------------------------------------------
void testApp::update(){
    while (receiver.hasWaitingMessages()) {
        ofxOscMessage m;
        receiver.getNextMessage(&m);
 
        if (m.getAddress() == "/test") {
            mX =  m.getArgAsInt32(0);
            mY =  m.getArgAsInt32(1);
        }
    }
}
 
//--------------------------------------------------------------
void testApp::draw(){
    ofBackground(255, 255, 255);
    ofSetColor(255, 0, 0);
    ofEllipse(mX, mY, 50, 50);
}



基本的にこの4つのコードで送信側で設定するポート番号を受信側にあわせて
書き換えてあげれば全部動くと思う。



最後にpuredataでの受信について。

puredata

puredataでoscを使うにも専用のライブラリ的なものが必要でそのライブラリが以前DLして
自分のPCに入っていたのでそれを使ったosc-patchesって名前のフォルダだったので
それで検索すれば見つかったりするのだろうか。

上の画像のudpreceiveというものがポート番号になっていて送信側で5555に合わせれば
puredataが受信する。あまり詳しくないがoscメッセージには最初の/testの暗号的なやつと
何かいろいろ含まれているみたいで受け取った最初の方は/testの文字の番号とかだろう。
下の段の一番右と右から3つ目が実質のマウスの値で、255以上を超えると1が上にでて
1(255)+番号でマウスの値になるっぽい。



送信はまだやったことないのでいつかやるべき時が来たら…

環境
processing 2.0
openFrameworks v0074
Predata-extended 0.42.5



そういえば卓プロジェクトの最終目標である卓展が無事終わりました。
卓についての記事はひとつしか書けなかったけれどいろいろ新しく勉強したので
それについてしばらく更新できたらいいなと思います。


コメントを残す

© Sako.log All Rights Reserved.