//One fork appears inside the other:

(

{


4.do{arg j; 

//nested sequence, create another fork

{

8.do{arg i;

Synth(\event, [\freq,(48+(i*3.3)+j).midicps,\amp, (1.0-(i/8))]);

0.5.wait;

}

}.fork;

4.0.wait; //outer fork must wait for inner fork to do its work

}

}.fork;

)





(

//two quickly created sounds; they click because of the line generators being quite crude

SynthDef(\sound1,{arg freq=440,amp=0.1; 

var sound; 


sound= LPF.ar(Saw.ar(freq),2000)*Line.kr(1,0,0.1, doneAction:2)*amp;

Out.ar(0,Pan2.ar(sound,0.0))

}).add;


SynthDef(\sound2,{arg freq=440,amp=0.1; 

var sound; 


sound= HPF.ar(LFPar.ar(freq),1000)*Line.kr(0,1,0.5, doneAction:2)*amp;

Out.ar(0,Pan2.ar(sound,0.0))

}).add;

)


//test SynthDefs

Synth(\sound1)


Synth(\sound2)


//nested scheduling; each bar has a different length, and uses one of two sounds

( 

var barlengths= [4.0,3.5,5.0];  

 var t= TempoClock(2.5);

{ 

 

inf.do{|i|  

 

var barnow= barlengths.wrapAt(i); 

 

"new bar".postln;

 

{ 

var whichsound; 

whichsound= [\sound1,\sound2].choose;

 

((barnow/0.25)-2).floor.do{|j| 

 

Synth(whichsound,[\freq, 300+(100*j),\amp,0.3]);  

 

0.25.wait; 

 

};  

 

}.fork(t); 

 

barnow.wait; 

} 

 

}.fork(t) 

 

)








//another example

( 

var t= TempoClock(2); 

 

{ 

 

4.do{ 

"bar".postln; 

{ 

 

[1.0,1.0,0.5,0.5,0.5,0.25,0.25].do{|val| Synth(\event, [\freq,rrand(48,84).midicps,\amp, rrand(0.0,0.3)]); "event".postln; val.wait;};  

}.fork(t); 

 

4.0.wait; 

} 

 

}.fork(t) 

 

)








//demonstration of a simple structure for a piece where different sections appear in a desired order 

//note if you were extending this to some large-scale form with sectional repeats, that repeated materials could be put into functions, to avoid repetition through encapsulation. 

 

( 

 

{ 

 

SynthDef(\bleep,{ arg out=0, note=60, amp=0.5, pan=0.0; 

var freq, env;  

freq = note.midicps; 

env = EnvGen.ar( 

Env([0,1,1,0],[0.01, 0.1, 0.2]), 

levelScale:amp,  

doneAction:2 

); 

Out.ar(out, 

Pan2.ar(Blip.ar(freq) * env, pan) 

) 

}).add; 

 

 

SynthDef(\bleep2,{ arg out=0, note=60, amp=0.5, pan=0.0; 

var freq, env;  

freq = note.midicps; 

env = EnvGen.ar( 

Env([0,1,1,0],[0.1, 0.1, 0.02]), 

levelScale:amp,  

doneAction:2 

); 

Out.ar(out, 

Pan2.ar(Blip.ar(freq, Line.kr(10,1,1)) * env, pan) 

) 

}).add; 

 

SynthDef(\mlpitch,{ 

var soundin, amp, freq, hasFreq;  

 

soundin= SoundIn.ar;  

 

amp= Amplitude.kr(soundin); 

#freq, hasFreq= Pitch.kr(soundin);  

 

Out.ar(0,amp*SinOsc.ar(freq)) 

}).add;  

 

s.sync;  //won't proceed until server confirms it has the SynthDefs ready

 

//make buffers; 

//s.sync; 

 

//three sections 

 

 

//1. 

 

10.do{|i| 

 

Synth([\bleep, \bleep2].choose); 

 

0.15.wait; 

}; 

 

1.0.wait; 

//2. 

 

a= Synth(\mlpitch); 

 

1.0.wait;  

 

a.free;  

 

1.0.wait;  

//3. two sequences of actions happen simultaneously (note no gap between the two)

 

{ 

100.do{|i| 

 

Synth([\bleep, \bleep2].choose,[\note, ([60,62,64,66,67,69,71]-12).choose]); 

 

rrand(0.05,0.15).wait; 

}; 

 

}.fork;  

//though process has just been forked off, straight to do further things in this thread too!

 

100.do{|i| 

 

Synth([\bleep, \bleep2].choose,[\note, [60,62,64,66,67,69,71].choose]); 

 

0.1.wait; 

}; 

 

 

}.fork;  

)