{
   "description" : "Reverb reverb by Click Nilson based on impulse response convolution. Posted on the mailing list.",
   "ancestor_list" : [],
   "name" : "Reverse reverb",
   "author" : "zecraum",
   "code" : "// Reverse reverb\r\n\r\n// by Click Nilson\r\nhttps://sc-users.bham.ac.narkive.com/hA9sdN11/reverse-reverb\r\n\r\n/* preparation; essentially, allocate an impulse response buffer, then\r\nfollow a special buffer preparation step to set up the data the plugin\r\nneeds. Different options are provided commented out for loading\r\nimpulse responses from soundfiles. */\r\n\r\n(\r\nvar lengthinsamples= 40000;\r\n~fftsize=2048; // also 4096 works on my machine; 1024 too often and amortisation too pushed, 8192 more high load FFT\r\n\r\ns.waitForBoot {\r\n\r\n{\r\nvar ir, irbuffer, bufsize;\r\nvar nextmod=100;\r\n\r\nir = [0] ++0.dup(100) ++ (Array.fill(lengthinsamples,{|i| if(i%\r\n(nextmod)==0,{nextmod= rrand(80,120); 0.3*((i.asFloat/\r\nlengthinsamples).squared)},{0.0}) }));\r\n\r\nirbuffer = Buffer.loadCollection(s, ir);\r\n\r\ns.sync;\r\n\r\nbufsize= PartConv.calcBufSize(~fftsize, irbuffer);\r\n\r\n~irspectrum= Buffer.alloc(s, bufsize, 1);\r\n\r\n~irspectrum.preparePartConv(irbuffer, ~fftsize);\r\n\r\ns.sync;\r\n\r\nirbuffer.free; // don't need time domain data anymore, just needed spectral version\r\n}.fork;\r\n\r\n};\r\n\r\n)\r\n\r\n\r\n\r\n~target= Buffer.read(s, Platform.resourceDir +/+ \"sounds/a11wlk01.wav\");\r\n\r\n(\r\n\r\n{ var input, kernel, mix = 0.5;\r\n\r\n\t\r\ninput= PlayBuf.ar(1, ~target, loop:1);\r\n// snare\r\n//input= WhiteNoise.ar(0.125) + SinOsc.ar(200, mul:0.125) * Decay.ar(Impulse.ar(1/4),1);\r\n\r\n\r\nOut.ar(0, input * mix + (1-mix * PartConv.ar(input, ~fftsize, ~irspectrum.bufnum, 0.25)) );\r\n}.play;\r\n)",
   "is_private" : null,
   "id" : "1-5he",
   "labels" : [
      "reverb",
      "convolution",
      "reverse",
      "fft"
   ]
}
