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
./osceleton-v1.2.1_OSX -p 57120

デフォだとポートが7110なのでSCデフォの57120にしてやると余計なことを考えずに済む。

いじょう

OSCeletonだけだと映像出力がないので、位置とかがよくわかりませんw
受信するメッセージが多いのでちょっと面倒かもです。別に全部使わずに、絞って使えば良いだけですが。
OSCeletonは結構CPU喰いますので注意を!