//SLUGens released under the GNU GPL as extensions for SuperCollider 3, by Nick Collins, http://composerprogrammer.com/index.html


Instruction instruction synthesis (breakpoint set interpreter)


Instruction.ar(bufnum, mul, add)


Converts a buffer of virtual machine instructions into synthesis. Based on breakpoint manipulation with linear interpolation. 


bufnum- Number of buffer holding instructions on the server in the form of successive COMMAND/PARAM PAIRS


The limited command set: 


0 interpolate from last to new breakpoint over PARAM *5000 samples (ie down to about 10 Hz, sampling rate dependent) 

1 new random breakpoint from PARAM.rand2

2 new breakpoint by perturbing last breakpoint amp by PARAM

3 new breakpoint by interpolating from last breakpoint amp to its inversion

4 new beakpoint by interpolating (t=PARAM) last two breakpoints (zero amp breakpoint by instruction (3,1) then (4,0.5))

5 new breakpoint by damping last breakpoint amp (multiply by damping), damping= PARAM

6 new breakpoint at amplitude +PARAM


8 do next command if probability PARAM

9 goto instruction PARAM within the buffer


In most cases, sensible values for PARAM are from 0.0 to 1.0!  But instruction 9 will need much larger address values. 



//Examples


//random instruction sets

(

a=Array.fill(50,{arg i; if(i.even,{7.rand},{1.0.rand})});

b=Buffer.sendCollection(s, a, 1);

)

//could be very loud! CAREFUL

{Out.ar(0,Pan2.ar(0.5*Instruction.ar(b.bufnum),0.0))}.play


(

a=Array.fill(50,{arg i; if(i.even,{7.rand},{1.0.rand})});

Post << a << nl;  //in case you like one

b.sendCollection(a);

)



(

t=Task({


inf.do {


a=Array.fill(50,{arg i; if(i.even,{7.rand},{1.0.rand})});

b.sendCollection(a);


exprand(0.05,1).wait;

}


}

).play;

)


t.stop;



//more considerate construction of instruction sets


(

a= Array.fill(40,{arg i; if(i.odd,{if(0.6.coin,{[0,exprand(0.005,0.05)]}, {[8,rrand(0.1,1.0),9,2*rrand(0,12)]})},{[rrand(1,6),[exprand(0.1,1.0),rrand(0.1,1.0),exprand(0.01,0.2)].choose]}); }).flatten;

Post << a << nl;

b=Buffer.sendCollection(s, a, 1);

)


//could be very loud! CAREFUL

{Out.ar(0,Pan2.ar(0.5*Instruction.ar(b.bufnum),0.0))}.play


(

a= Array.fill(30,{arg i; if(i.odd,{if(0.6.coin,{[0,exprand(0.005,0.05)]}, {[8,rrand(0.1,1.0),9,2*rrand(0,12)]})},{[rrand(1,6),[exprand(0.1,1.0),rrand(0.1,1.0),exprand(0.01,0.2)].choose]}); }).flatten.postln;

Post << a << nl;

b.sendCollection(a);

)



{Out.ar(0,Pan2.ar(0.5*FreeVerb.ar(Resonz.ar(Instruction.ar(b.bufnum),MouseX.kr(1000,5000,'exponential'),MouseY.kr(0.01,1.0,'exponential'))),0.0))}.play



//discovered sounds

(

a=[ 2, 0.98085289001465, 0, 0.0098705891385231, 3, 0.045249921951092, 8, 0.426873087883, 9, 12, 6, 0.042719216229536, 8, 0.38374520540237, 9, 22, 6, 0.040797999461159, 8, 0.71095678806305, 9, 8, 2, 0.18426358043098, 8, 0.96414197683334, 9, 10, 2, 0.064978396873361, 0, 0.014289879691635, 5, 0.015798983078423, 0, 0.038866613949307, 6, 0.030472403359923, 0, 0.036071279863708, 1, 0.046212260612025, 8, 0.610464823246, 9, 0, 1, 0.96948568820953, 0, 0.014026194255798, 3, 0.12740938462649, 0, 0.010742629527544, 1, 0.3477209756392, 8, 0.82419589757919, 9, 18, 6, 0.97822250127792, 0, 0.0073386436293812, 4, 0.1197158617971, 8, 0.37467901706696, 9, 20, 6, 0.023095168080617, 0, 0.0077425603088712 ];

b.sendCollection(a);

)



(

a=[ 3, 0.40293287038803, 0, 0.0099009671713598, 2, 0.1265909910202, 0, 0.013731463839874, 3, 0.23790548574176, 0, 0.0077773798350805, 3, 0.15899796225456, 8, 0.88809416294098, 9, 14, 2, 0.16874264604912, 0, 0.0054302242992324, 2, 0.065863798551897, 8, 0.31685080528259, 9, 6, 1, 0.025768143119174, 0, 0.022224710655753, 1, 0.021351216507072, 8, 0.45115448236465, 9, 24, 2, 0.91734998226166, 0, 0.0085382244719742, 1, 0.1098612352863, 0, 0.005935074104977, 5, 0.40578903363382, 8, 0.11921266317368, 9, 2, 6, 0.11252887270072, 0, 0.0066305213330409, 4, 0.51733835087186, 8, 0.78307151794434, 9, 14, 3, 0.86774248188551, 8, 0.54493169784546, 9, 4, 4, 0.46118148424678, 8, 0.21504091024399, 9, 4];

b.sendCollection(a);

)