はじめに
雑用アルバイトの片山です。ようやく完全に就職活動を終えることができました。
さて、これまで「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;
};
とってもテキトーなコードですが動かしてみます。
うーん🤔予想通りではありますが非常につまらないものが出来てしまいました。
ちなみに、うちの枕の模様ってこんな感じなんですよね。どうでもいいですけど。
私自身のアイデアとか諸々が貧相過ぎて憂鬱になってきましたので今回はここまでとします。
終わりに
折角なので次回もなんとなくこの路線(OSCで色々やったりする方向)でいこうと思います。
今度はPython --> Puredata
とかPython --> openFrameworks
から少し応用してPython --> openFrameworks --> Puredata
と言う感じでOSCを使ってみたいと思います。
関連記事
- python-oscを使ってみる:後編
- python-oscを使ってみる:前編
- 未経験大学生によるPython入門日誌-第1話
- 未経験大学生によるPython入門日誌-第2話
- 未経験大学生によるPython入門日誌-第3話
- 未経験大学生によるpython入門日誌-第4話 OpenCV篇
- 用務員バイトの日記:Pygameで遊んでみる