PureDataとOpenframeworks間をOSCでデータをやり取りする方法
投稿日:2015-05-11

おはようございます^ – ^
ナカジ(@cp_nakajun)です。
ゴールデンウィーク期間に友人達が開催している
Openframeworksの勉強会に参加してみました。
僕も含めて皆初心者ばかりなので、勉強会というより
妄想会となり「やってみたいこと」を言い合うことが中心でしたが
僕も彼らと面白いことをやりたいので、自分の範疇を考えて
まずはPuredataとOFを連携する為のOSC通信をテストしてみました。
OFが送信、Puredataで受信
まずはこれ
Openframeworksでマウスの座標を取得し、それをPuredataに送ります。
ついでにドレミを鳴らせるようにしました。
- X軸が音階
- Y軸がボリューム
です。
PureDataのソースはこれ

Openframeworksのプログラムはこちらのサイトからお借りしました。
ofApp.h
#pragma once
#include "ofMain.h"
#include "ofxOsc.h"
#define HOST "localhost" //送信先ホストのIPを設定
#define PORT 8000 //送信先のポート番号を設定
//--------------------------------------------------------
class ofApp : public ofBaseApp{
public:
void setup();
void update();
void draw();
void keyPressed (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);
private:
//OSCメッセージの送信者
ofxOscSender sender;
};
ofApp.cpp
#include "ofApp.h"
void ofApp::setup(){
ofBackground(0, 0, 0);
//指定したIPアドレスとポート番号でサーバーに接続
sender.setup( HOST, PORT );
}
void ofApp::update(){
}
void ofApp::draw(){
//現在のマウスの場所に円を描画
ofSetColor(255, 255, 255);
ofCircle(mouseX, mouseY, 10);
}
void ofApp::keyPressed (int key){}
void ofApp::mouseMoved(int x, int y ){
//OSCメッセージの準備
ofxOscMessage m;
//OSCアドレスの指定
m.setAddress( "/mouse/position" );
//OSC引数として、現在のマウスの座標(x, y)を送信
m.addIntArg( x );
m.addIntArg( y );
//メッセージを送信
sender.sendMessage( m );
}
void ofApp::mouseDragged(int x, int y, int button){}
void ofApp::mousePressed(int x, int y, int button){
//OSCメッセージの準備
ofxOscMessage m;
//OSCアドレスの指定
m.setAddress( "/mouse/button" );
//OSC引数として、マウス状態"down"を送信
m.addStringArg( "down" );
//OSC引数として、現在のマウスの座標(x, y)を送信
m.addIntArg( x );
m.addIntArg( y );
sender.sendMessage( m );
}
void ofApp::mouseReleased(int x, int y, int button){
//OSCメッセージの準備
ofxOscMessage m;
//OSCアドレスの指定
m.setAddress( "/mouse/button" );
//OSC引数として、マウス状態"up"を送信
m.addStringArg( "up" );
//OSC引数として、現在のマウスの座標(x, y)を送信
m.addIntArg( x );
m.addIntArg( y );
sender.sendMessage( m );
}
void ofApp::windowResized(int w, int h){}
Puredataが送信、OFが受信
次は先ほどの逆です。

ofApp.h
#pragma once
#include "ofMain.h"
#include "ofxOsc.h"
//ポート番号を設定
#define PORT 8000
//--------------------------------------------------------
class ofApp : public ofBaseApp{
public:
void setup();
void update();
void draw();
void keyPressed (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 dumpOSC(ofxOscMessage m); //OSCメッセージを出力
private:
//OSCメッセージを受信するインスタンス
ofxOscReceiver receiver;
//マウス座標
int remoteMouseX, remoteMouseY;
//マウスボタンの状態 ("up", "down")
string mouseButtonState;
//string oscString;
};
ofApp.cpp
#include "ofApp.h"
void ofApp::setup(){
//指定したポートで接続
receiver.setup( PORT );
//値を初期化
mouseX = 0;
mouseY = 0;
mouseButtonState = "";
ofBackground(0, 0, 0);
}
void ofApp::update(){
//現在順番待ちのOSCメッセージがあるか確認
while( receiver.hasWaitingMessages() )
{
//次のメッセージを取得
ofxOscMessage m;
receiver.getNextMessage( &m );
//マウスの位置を取得
if ( m.getAddress() == "/mouse/position" ){
remoteMouseX = m.getArgAsInt32( 0 );
remoteMouseY = m.getArgAsInt32( 1 );
}
//マウスボタンの状態を取得
else if ( m.getAddress() == "/mouse/button" ) {
mouseButtonState = m.getArgAsString( 0 ) ;
}
//OSCメッセージをそのままコンソールに出力
dumpOSC(m);
}
}
//OSCメッセージをコンソールに出力する関数
void ofApp::dumpOSC(ofxOscMessage m) {
string msg_string;
msg_string = m.getAddress();
for (int i=0; i<m.getNumArgs(); i++ ) {
msg_string += " ";
if(m.getArgType(i) == OFXOSC_TYPE_INT32)
msg_string += ofToString( m.getArgAsInt32(i));
else if(m.getArgType(i) == OFXOSC_TYPE_FLOAT)
msg_string += ofToString( m.getArgAsFloat(i));
else if(m.getArgType(i) == OFXOSC_TYPE_STRING)
msg_string += m.getArgAsString(i);
}
cout << msg_string << endl;
}
void ofApp::draw(){
int radius;
if (mouseButtonState == "down") {
//マウスボタンが押されていたら、赤い円を描画
radius = 20;
ofSetColor(255, 127, 0);
} else {
//マウスボタンが押されていなければ、青い円を描画
radius = 10;
ofSetColor(0, 127, 255);
}
ofCircle(remoteMouseX, remoteMouseY, radius);
}
void ofApp::keyPressed (int key){}
void ofApp::mouseMoved(int x, int y ){}
void ofApp::mouseDragged(int x, int y, int button){}
void ofApp::mousePressed(int x, int y, int button){}
void ofApp::mouseReleased(int x, int y, int button){}
void ofApp::windowResized(int w, int h){}
Pd Recipe Book -Pure Dataではじめるサウンドプログラミング(単行本)
posted with ヨメレバ
松村 誠一郎 ビー・エヌ・エヌ新社 2012-02-23






