{
   "author" : "Santiago Vilanova",
   "name" : "stutter",
   "description" : "micro-beat repeat, based on delay",
   "ancestor_list" : [],
   "labels" : [
      "flutter",
      "beatrepeat",
      "microlooping"
   ],
   "code" : "(\r\nSynthDef(\\stutter,{\r\n\targ in=0, out=0;\r\n    var sig, delayTime, increment, trigger;\r\n\tvar reset=\\reset.kr(0);\r\n\tvar delayPitch=\\pitch.kr(12);\r\n\tvar offsetms=\\offsetms.kr(0)/1000;\r\n\tvar strobe=\\strobe.kr(1);\r\n\tvar on=\\onoff.kr(0);\r\n\tvar envGen, sustainTime;\r\n\tvar atkTime=0.002, relTime=0.002;\r\n\r\n\treset=reset*on;\r\n    // Convert pitch to delay time in seconds\r\n    delayTime = delayPitch.midicps.reciprocal;\r\n\r\n    // Trigger for incrementing delay time\r\n    trigger = Impulse.ar(delayTime.reciprocal);\r\n\r\n\t// Calculate sustain time to ensure envelope stays high for the chunk duration minus attack and release\r\n    sustainTime = delayTime - (atkTime + relTime);\r\n\r\n    // Ensure sustainTime is not negative\r\n    sustainTime = max(sustainTime, 0)*strobe;\r\n\r\n    // Increment delay time\r\n    increment = Dseries(0, delayTime, inf)*on;\r\n    increment = Demand.ar(trigger, reset, increment);\r\n\r\n\t// Generate an envelope to soften clicks\r\n    envGen = EnvGen.ar(Env([0, 1, 1, 0], [atkTime, sustainTime, relTime], 'lin'), trigger);\r\n\r\n\r\n    // Get input signal\r\n    sig = In.ar(in, 1); // Assuming stereo input\r\n\r\n    // Apply delay\r\n    sig = DelayC.ar(sig, 24, increment+offsetms);\r\n\r\n\t// Apply envGen\r\n\tsig=sig*envGen;\r\n\r\n    // Output\r\n    Out.ar(out, sig);\r\n}).add();\r\n)",
   "id" : "1-5hN",
   "is_private" : null
}
