{
   "ancestor_list" : [],
   "description" : "The stutter tutorial really has it all. Just not with live audio :)",
   "author" : "blueprint",
   "name" : "Stutter live looping buffer",
   "code" : "(\r\n~stutter = { |snd, reset, fragmentlength, rate = 1.0, maxdelay = 10|\r\n    var phase, fragment, del;\r\n    phase = Sweep.ar(reset);\r\n    fragment = { |ph| (ph - Delay1.ar(ph)) < 0 + Impulse.ar(0) }.value(phase / fragmentlength % 1);\r\n    del = Latch.ar(phase, fragment) + ((fragmentlength - Sweep.ar(fragment)) * (rate - 1));\r\n    DelayC.ar(snd, maxdelay, del);\r\n};\r\n)\r\n\r\n// This is just an example of doing it live which was missing in the stutter tutorial :)\r\n(\r\n{\tvar snd, reset;\r\n\tsnd = AudioIn.ar([1,2]);\r\n        reset = Onsets.kr(FFT(LocalBuf(512), snd), 0.7);\r\n        snd = ~stutter.(snd, reset, 0.09);\r\n        snd = DelayC.ar(snd, 0.2, 0.2);\r\n        snd!2 * 0.3;\r\n}.play;\r\n)\r\n\r\n// Of course you can also:\r\n// sequencing with Pmono\r\n(\r\nSynthDef(\\stuttertest, {\r\n    |out = 0, buf, t_reset = 0, fragmentlength = 0.1, amp = 0.1|\r\n    var snd, reset;\r\n    snd = AudioIn.ar([1,2]);\r\n    reset = Onsets.kr(FFT(LocalBuf(512), snd), t_reset);\r\n    snd = ~stutter.(snd, reset, fragmentlength);\r\n    Out.ar(out, snd * amp!2);\r\n}).add;\r\n)\r\n(\r\nPmono(\\stuttertest,\r\n    \\buf, b,\r\n    \\amp, 0.3,\r\n    \\reset, 0.7,\r\n    \\dur, 0.1,\r\n    \\fragmentlength, Pseq([0.01, 0.03, 0.07, 0.05, 0.06], inf)\r\n).play;\r\n)",
   "is_private" : null,
   "id" : "1-58W",
   "labels" : [
      "glitch",
      "stutter"
   ]
}
