//Quick network music introduction (adapted from code by Julian Rohrhuber)


//This sets up connections to the various IP addresses around the network: you will need to update this code to reflect your local setup


//We will need to collect IPs of the computers in the Lab 



(

a = [190, 30, 198, 200,196, 227].collect({ arg el;

Server("test"++el, NetAddr("139.184.50." ++ el, 57110))

});

)


(


a = ["10.0.10.25","10.0.9.172",""].collect({ arg ip,i;

Server("test"++i, NetAddr(ip, 57110))

});

)



//makes a Server GUI that represents a particular network target

a[0].makeWindow;


//function to encapsulate sending a SynthDef to all Servers 

f = { arg synthDef; a.do({ arg el; synthDef.send(el) }) };


//send to a specific Server

(

SynthDef("finesine", { arg out, freq=440, amp=0.1, pan, sustain=0.01, x=0.5;

var e, u;

e = EnvGen.ar(Env.perc(0.001, sustain, amp), doneAction:2);

u = SinOsc.ar(freq * [1.0, 5/6, 17/8] * XLine.ar(1 + x, 1, sustain)).sum * amp;

Out.ar(out, u)

}).send(a[0]);

)


//use function f to send to all

(

f.value(

SynthDef("finesine", { arg out, freq=440, amp=0.1, pan, sustain=0.01, x=0.5;

var e, u;

e = EnvGen.ar(Env.perc(0.001, sustain, amp), doneAction:2);

u = SinOsc.ar(freq * [1.0, 5/6, 17/8] * XLine.ar(1 + x, 1, sustain)).sum * amp;

Out.ar(out, u)

})

)

)


//automate Synth grain firing once around the Servers in random order

(

{

10.do { arg el, i;

Synth.grain(\finesine, [\freq, 1000 +(i*200)], a.choose);

0.1.wait;

}

}.fork;

)


//Using a pattern to target particular Servers in the array a

(

{

var pat;

pat = Pseq([0,1,2,3,2,1,4,5]);

pat.asStream.do { arg serverIndex, i;

Synth.grain(\finesine, [\freq, rrand(500,2000)], a[serverIndex]);

0.1.wait;

}

}.fork;

)