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