SC3 + Proce55ing on Linux


Linuxでprocessingを使う方法を2回ほど記載しましたが、ようやくスパコとの連携について記載したいと思います。(このためにP5の導入方法を記載したのです)


スパコとP5間でやりとりするためにOpenSoundControl(OSC)を使用します。スパコはOSCの塊みたいなものですから馴染み深いと思います
スパコの方は別途なにかを入れる必要はありませんが、P5の方はoscP5というライブラリを入れる必要があります
オフィシャルサイトより最新版をDLし、P5のインストール先のlibrariesフォルダ以下に置きます
ex) ~/processing/libraries/oscP5/
(eclipseでP5のコードを書いている場合は、プロジェクトのプロパティの、Java Build Path>Libraries>Add External JARsよりoscP5.jarを追加しておきましょう)
以上で準備完了です、では実際にコードを書いてみましょう

スパコ側コード

(
SynthDef("P5-kick",{
arg amp, pan = 0, outBus = 0;
var env, signal;

env = Env.perc(0.001, 0.01, 1, 4);
signal = SinOsc.ar(40.midicps, 0, amp);

Out.ar(outBus,
Pan2.ar(EnvGen.ar(env, doneAction: 2)*signal, pan)
);

}).store;
)

(
var kick;
~source = Group.tail(s);
kick = Task({
var pt,per1,per2,per3,per4;
pt = [1.0,0.5,1.0,0.2];
per1 = Pseq(pt, inf).asStream;
per2 = Pseq(pt, inf).asStream;
per3 = Pseq(pt, inf).asStream;
per4 = Pseq(pt, inf).asStream;
loop({

Synth.tail(~source, "P5-kick",
[\amp, per1.next]
);
NetAddr("localhost",12000).sendMsg("/t1",per2.next);
NetAddr("localhost",12000).sendMsg("/t2",per3.next);
NetAddr("localhost",12000).sendMsg("/t3",per4.next);
(0.5).wait;
});
}
);
SystemClock.sched([kick.start]);
)

適当に定義したキックのampに送っている配列と同様のものを
NetAddr("localhost",12000).sendMsgの各行でメッセージをローカルホストにポート番号12000で送っています。ここで送られてきたメッセージをP5側で受信してやります。もちろんP5の受信ポートも同じにしてください


P5側コード

import processing.core.*;
import netP5.*;
import oscP5.*;

public class OSCTest extends PApplet{

OscP5 oscP5;
float arg1=0,arg2=0,arg3=0,te = 3,te2 = 5,te3 = 10;
public void setup(){

size(200,200);
fill(200,153);
frameRate(30);
rectMode(CENTER);

oscP5 = new OscP5(this,12000);
}
public void oscEvent(OscMessage theOscMessage){
if(theOscMessage.checkAddrPattern("/t1")){
arg1 = theOscMessage.get(0).floatValue();
}
if(theOscMessage.checkAddrPattern("/t2")){
arg2 = theOscMessage.get(0).floatValue();
}
if(theOscMessage.checkAddrPattern("/t3")){
arg3 = theOscMessage.get(0).floatValue();
}
}

public void draw(){
background(0);

translate(width/2,height/2);
rect(0,0,20+te,20+te);
te = 10*arg1;

translate(width/4,height/4);
rect(0,0,5*te2,5*te2);
te2 = 20*arg2;

translate(-100,-100);
rect(0,0,10*te3,20*te3);
te3 = 15 - 10*arg3;
}
}

eclipseで記述しているためprocessing.core.*をインポートしております。さらにoscP5を使用するので、netP5.*とoscP5.*の二つをインポートします
P5側でメッセージを受信する際に
if(theOscMessage.checkAddrPattern("/t1"))
などという行を用いて各メッセージから送られてくる値を各変数に振り分けています、多少面倒ですがこうしないとダメなようです
if(theOscMessage.checkTypetag("f")
などと型の判別をしておくとより確実です
スパコ側のNetAddr("localhost",12000).sendMsg("/t1",per2.next); が
P5側のarg1 = theOscMessage.get(0).floatValue();に対応するわけです
ここでP5側の変数であるarg1をそのまま使用しても良いのですが、ちょいと弄ってやるためにte1などの変数を定義してやり、draw()内で値を更新しています。
この値をrectなどに入れてやることで、非常に簡単に音を映像の同期が出来るのです


音と映像の同期作品を作ろうとしたときに、通信などの複雑なことを考えずに作るツールとしてスパコとP5が恐らく一番簡単なのではないでしょうか。僕自身P5はさわりくらいしか使ったことがなかったのですが、簡単にスパコと連携が出来ましたよ