{
   "author" : "olaf",
   "name" : "Compander coded with ugens",
   "description" : "I am not sure if anybody else is interested in such a thing but i think it is cool be able to look inside the working of compander inside of SuperCollider.\r\n\r\nleftchannel=different UGens\r\nrightchannel=Compander.ar",
   "ancestor_list" : [],
   "labels" : [],
   "code" : "(//compander -> amplitude\r\nn=Ndef(\\ct,{\r\n\t//var sig=SinOsc.ar*(1-LFSaw.ar(1,0,0.5,0.5));\r\n\tvar sig=SinOsc.ar*(1-LFPulse.ar(1));\r\n\tvar inputspecs=[\r\n\t\t\t\tSpec.add(\\clampTime, [0.00001, 10,\\exp,0,0.05]);\r\n\t\t\t\tSpec.add(\\clampTime2, [0, 1,\\lin,0,0.05]);\r\n\t\t\t\tSpec.add(\\relaxTime, [0.00001, 60,\\exp,0,1]);\r\n\t\t\t\tSpec.add(\\compression, [0.01, 1,\\lin,0,0.1]);\r\n\t\t\t\tSpec.add(\\slopeBelow, [0.01, 10,\\lin,0,0.1]);\r\n\t\t\t\tSpec.add(\\slopeAbove, [0.0001, 1,\\lin,0,0.25]);\r\n\t\t\t];\r\n\tvar t=\\thresh.kr(0.75);\r\n\tvar ct=\\clampTime.kr(0.05);\r\n\tvar rt=\\relaxTime.kr(1);\r\n\tvar slopeBelow= \\slopeBelow.kr(1);\r\n\tvar slopeAbove= \\slopeAbove.kr(0.9);\r\n\r\n\tvar a=Amplitude.ar(sig,ct,rt);\r\n\tvar prevmaxval=a.abs;\r\n\tvar lg1=pow(prevmaxval / t, slopeBelow - 1);\r\n\tvar absx = lg1.abs;\r\n\tvar lg=if((absx < 1e-15),0,if((absx > 1e15),1,lg1));\r\n\tvar ag=pow(prevmaxval / t, slopeAbove - 1);\r\n\tvar next_gain=if (prevmaxval < t,lg,ag);\r\n\t\r\n\tvar cp=Compander.ar(sig,sig,t,slopeBelow,slopeAbove,ct,rt);\r\n\tOut.ar(0,[sig * next_gain,cp]);\r\n});\r\nn.gui;\r\n\r\n)\r\n\r\ns.scope(bufsize:2**14)",
   "id" : "1-50J",
   "is_private" : null
}
