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    






