PureDataとOpenframeworks間をOSCでデータをやり取りする方法

投稿日:2015-05-11

_puredata_OSC
 
おはようございます^ – ^

ナカジ(@cp_nakajun)です。

 

ゴールデンウィーク期間に友人達が開催している

Openframeworksの勉強会に参加してみました。

 

僕も含めて皆初心者ばかりなので、勉強会というより

妄想会となり「やってみたいこと」を言い合うことが中心でしたが

 

僕も彼らと面白いことをやりたいので、自分の範疇を考えて

まずはPuredataとOFを連携する為のOSC通信をテストしてみました。

 

 

OFが送信、Puredataで受信

 

まずはこれ

Openframeworksでマウスの座標を取得し、それをPuredataに送ります。

ついでにドレミを鳴らせるようにしました。

 

  • X軸が音階
  • Y軸がボリューム

 

です。

 

 

PureDataのソースはこれ

pd_osc_2

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が受信

 

次は先ほどの逆です。
 

 

pd_osc_1

 

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){}

 

 

サポート募集中

この記事はお役に立てましたか。
よかったら、コーヒー ☕ をご馳走いただけたら励みになります。



PureDataの貴重な書籍



おすすめのクリエイティブ・コーディング関連カテゴリー

ウェブツール

機能はシンプルなものですが、p5.jsやTone.jsで描画したり音が出たりするので遊んでみてください。
・【Midi Number Tools】:MIDIナンバーから音名と周波数を判定します
・【Delay Time Calculator】:テンポに応じた音符の長さを判定します