«SuperCollider sending data to Processing» by Luigi Tamagnini
on 09 Sep'13 16:57 infirst in SC i analyse audio data with some useful UGens: Onsets, SendTrig and SendPeakRMS; this data is then polled back to de client and dispatched to Processing via NetAddr and OSCFunc classes in Processing i receive the incoming messages and simple trig a draw function with the callback oscEvent (use oscP5 and netP5 libs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
// Tracking audio data
///////////////////////////////////
SynthDef(\pulse,{
var sig, chain, onsets;
sig = SinOsc.ar(Rand(220.0,440.0))
*EnvGen.ar(Env.perc(releaseTime:0.5),Dust.ar(0.5))*0.7;
Out.ar(0,sig !2);
//
chain = FFT({LocalBuf(512, 1)}, sig);
onsets = Onsets.kr(chain,0.1,\power);
SendTrig.kr(onsets);
SendPeakRMS.kr(sig, 20, 3, "/replyAddress");
}).add;
Synth(\pulse)
~host = NetAddr("localhost", 4859); // address de PROCESSING
o = OSCFunc({ arg msg, time;
[time, msg].postln;
~host.sendMsg("/trigger",42,12.34,"hello processing");
},'/tr', s.addr);
p = OSCFunc({ |msg|
"peak: %, rms: %".format(msg[3], msg[4]).postln
}, '/replyAddress');
//////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
// Processing code
// OSC RECEIVE
import oscP5.*;
import netP5.*;
OscP5 oscP5; // objet for OSC send and receive
NetAddress myRemoteLocation; // objet for service address
void setup() {
size(400,400);
oscP5 = new OscP5(this,4859); // start OSC and listen port ...
// set remote location to localhost SuperColider port
myRemoteLocation = new NetAddress("127.0.0.1",4859);
}
void draw() {
}
void oscEvent(OscMessage theOscMessage)
{
// get the first value as an integer
int firstValue = theOscMessage.get(0).intValue();
// get the second value as a float
float secondValue = theOscMessage.get(1).floatValue();
// get the third value as a string
String thirdValue = theOscMessage.get(2).stringValue();
// print out the message
print("OSC Message Recieved: ");
print(theOscMessage.addrPattern() + " ");
println(firstValue + " " + secondValue + " " + thirdValue);
//
rect(random(width),random(height),random(10),random(10));
}
reception
thanks a lot, it helped me to figure out sending messages from scsynth to python client.