SuperCollider + OSCeleton
ちょい前にhttp://www.kinecthacks.com/kinect-with-supercollider/がTL上に流れてきまして、ああそろそろ試すか。ってことで、OSCeletonです。たまにはkinectも使ってあげないとね!
準備
以前紹介しました、Unity3d+kinect参照に
- libtool,libusb-devel
- OpenNI
- NITE
- SensorKinect
これらをインストールします。最新版であれば、lion環境でも動作します。
OSCeleton
メインのOSCeletonですが、https://github.com/Sensebloom/OSCeletonからosceleton-v1.2.1_OSX.zipがDLできますので、そのままこいつ使ってしまいましょう。解凍するだけでおkです。
使う
SC側コード
とりあえず、シンセの作成とfreqを変化させるだけ。
/* * osceleton test */ /* * osc setting */ ( //receive osc messages from osceleton ~oscReceive = NetAddr("127.0.0.1", 57120); //アドレスはこいつら, /new_user, /new_skel, /lost_user, /joint //新規ユーザ発見時 OSCresponder(nil, '/new_user',{ arg t, r, msg; "create a new synth".speak; s.sendMsg("/s_new", \osceleton_sinosc, x = s.nextNodeID,0,0 ); [t,msg].postln; }).add; //ユーザ見失った。。。 OSCresponder(nil, '/lost_user', { arg t, r, msg; "delete a synth".speak; s.sendMsg("/n_free", x); [t,msg].postln; }).add; //ここから各種ジョイントのx,y,z取得して、諸々のシンセにパラメータを振っていく、など好きな処理を記述していく。[/joint, 体の部位, ユーザ番号, x, y, z]のメッセージを受信するため、体の部位ごとにswitch文とかで挙動を分ければ良いかと。ぼっちなのでユーザは分けません! a = OSCresponder(nil, '/joint', { arg t, r, msg; switch(msg[1], //head, neck, torso, r_shoulder, r_elbow, r_hand, l_shoulder, l_elbow, l_hand, r_hip, r_knee, r_ankle, r_foot, l_hip, l_knee, l_ankle, l_foot //head \head, { ( "joint:" + msg[1] + "| user:" + msg[2] ).post; msg[3..].postln; s.sendMsg( "/n_set", x, "freq", msg[3]*1000 ); }, //neck \neck, { ( "joint: " + msg[1] + "| user : " + msg[2] ).post; msg[3..].postln; } //とまあ面倒っちゃ面倒っす ); //[t,msg].postln; }).add; //check NetAddr.localAddr; ) /* * synth def */ ( SynthDef("osceleton_sinosc",{ arg pan = 0, outBus = 0, freq = 440; var signal; signal = SinOsc.ar(freq,0,0.4); Out.ar(outBus, Pan2.ar(signal,pan); ); }).store; ) /* * osc clear ? */ OSCresponder.initClass;
いじょう
OSCeletonだけだと映像出力がないので、位置とかがよくわかりませんw
受信するメッセージが多いのでちょっと面倒かもです。別に全部使わずに、絞って使えば良いだけですが。
OSCeletonは結構CPU喰いますので注意を!