Tech Racho エンジニアの「?」を「!」に。
  • 開発

応用編1: pythonとopenFrameworksをOSCで接続する

はじめに

雑用アルバイトの片山です。ようやく完全に就職活動を終えることができました。

さて、これまで「python-oscを使ってみる」シリーズを前編・後編とやってきましたが、音を出す以外にも映像を作れたら良くない?ということで今回はopenFrameworksをpythonと繋いでみたいと思います。

本編

とりあえず書いてみる

python-oscの導入とかについては「python-oscを使ってみる」シリーズに掲載しているので省きます。

pythonのスクリプトは前回のコードをそのまま使います。入力した数字に含まれる0~9の数をそれぞれカウントしてくれるやつです。
使いまわしですが貼っておきます。


import argparse from pythonosc import osc_message_builder from pythonosc import udp_client port_num = 8002 # セットアップ parser = argparse.ArgumentParser() parser.add_argument("--ip", default="127.0.0.1", help="The ip of th OSC Server") parser.add_argument("--port", type=int, default=port_num, help="The port the OSC server is listening on") args = parser.parse_args() client = udp_client.UDPClient(args.ip, args.port) print("ip:127.0.0.1, port:" + str(port_num) + ", address:/filter") def main(): print("type int:") input_str = input() li = [] msg = osc_message_builder.OscMessageBuilder(address="/filter") for i in range (10): li.append(int(input_str.count(str(i)))) msg.add_arg(li[i]) print(li) msg = msg.build() client.send(msg) if __name__ == "__main__": while True: main()

さて、結局こいつを使って一回に送信できるデータは10コの数値だけです。
この時点でどう頑張っても面白くしようがなさそうな感じですが、一度始めてしまったものは仕方がありませんのでとりあえず進めていきます。

次はopenFrameworksのコードを書いていきます。先に言ってしまうととってもつまらない出来なのですが、oF側でOSCを受け取って処理するところくらいはいつか誰かの参考になるかもしれませんので掲載します。

openFrameworksの導入とか入門についても巷にゴロゴロと転がっているのでここでは省きます。

ofApp.cpp


#include "ofApp.h" //-------------------------------------------------------------- void ofApp::setup(){ ofBackground(0); ofSetFrameRate(30); ofSetCircleResolution(32); ofSetBackgroundAuto(false); ofEnableAlphaBlending(); receiver.setup(SERVER_PORT); for (int i = 0; i < 10; i++ ) { list[i] = 0; } } //-------------------------------------------------------------- void ofApp::update(){ while (receiver.hasWaitingMessages()) { ofxOscMessage m; receiver.getNextMessage(m); if (m.getAddress() == "/filter") { for (int i = 0; i < 10; i++) { list[i] = m.getArgAsInt(i); } } dumpOSC(m); } } //-------------------------------------------------------------- void ofApp::draw(){ ofSetColor(0); ofDrawRectangle(0, 0, ofGetWidth(), ofGetHeight()); for (int i = 0; i < 10; i++) { if (list[i] != 0) { ofSetColor(list[i] * 40); ofDrawRectangle(ofGetWidth()/10*i, 0, ofGetWidth()/10, ofGetHeight()); } } } //-------------------------------------------------------------- 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; }

ofApp.h


#pragma once #include "ofMain.h" #include "ofxOsc.h" #define SERVER_PORT 8002 // 受信ポート #define HOST "localhost" class ofApp : 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 mouseEntered(int x, int y); void mouseExited(int x, int y); void windowResized(int w, int h); void dragEvent(ofDragInfo dragInfo); void gotMessage(ofMessage msg); void dumpOSC(ofxOscMessage m); int list[10]; private: ofxOscReceiver receiver; };

とってもテキトーなコードですが動かしてみます。

python
openframeworks

うーん🤔予想通りではありますが非常につまらないものが出来てしまいました。
ちなみに、うちの枕の模様ってこんな感じなんですよね。どうでもいいですけど。

私自身のアイデアとか諸々が貧相過ぎて憂鬱になってきましたので今回はここまでとします。

終わりに

折角なので次回もなんとなくこの路線(OSCで色々やったりする方向)でいこうと思います。

今度はPython --> PuredataとかPython --> openFrameworksから少し応用してPython --> openFrameworks --> Puredataと言う感じでOSCを使ってみたいと思います。

関連記事


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。