A message is sent to all notified clients. See Server.
trig |
a non-positive to positive transition triggers a message. |
cmdName |
a string or symbol, as a message name. |
values |
array of ugens, or valid ugen inputs. |
replyID |
integer id (similar to SendTrig). |
(
{
SendReply.kr(Impulse.kr(3), '/the_answer', [40, 41, 42, 43] + MouseX.kr, 1905);
}.play(s);
)
o = OSCFunc({ |msg| msg.postln }, '/the_answer');
// multichannel expansion
(
{
SendReply.kr(Impulse.kr(3),
'/the_answer',
values: [[40, 80], [41, 56], 42, [43, 100, 200]],
replyID: [1905, 1906, 1907, 1908]
);
}.play(s);
)
o.free;
// Sending audio parameters over a network via OSC
// Since SendReply can only respond to the host, this shows how
// to send data to a separate target through sclang.
(
SynthDef(\amplitudeAnalysis, {|in=0, rate=60|
var input = SoundIn.ar(in);
var amp = Amplitude.kr(input);
var freq = Pitch.kr(input);
var trig = Impulse.kr(rate);
SendReply.kr(trig, '/analysis', [amp, freq[0], freq[1]]);
}).add;
)
// example target address - insert your target host & port here
~testNetAddr = NetAddr("127.0.0.1", 5000);
~mySynth = Synth(\amplitudeAnalysis);
(
OSCdef(\listener, {|msg|
var data = msg[3..];
data.postln;
~testNetAddr.sendMsg("data", data);
}, '/analysis');
)
~mySynth.set(\rate, 10); // slow it down...
Sometimes, we need to know when a message was sent. Because SendReply
can send only messages (which have no timestamp) and no bundles (which have), we can't use the time
argument of the OSCdef's function. Instead, you can send a time stamp with the data, by using the Sweep UGen.
xxxxxxxxxx
(
{ SendReply.ar(Impulse.ar(4), "/reply", [Sweep.ar, SinOsc.ar(0.3)]); 0 }.play;
OSCdef(\x, { |msg|
var time, value;
time = msg[3];
value = msg[4];
"value % occurred at time %".format(value, time).postln;
}, "/reply");
)