{
   "description" : "",
   "ancestor_list" : [],
   "author" : "prko",
   "name" : "A Multichannel Convolution Reverb",
   "id" : "1-5ap",
   "is_private" : null,
   "code" : "(\r\n~numIRs = 4;\r\n~fftsize = 2048;\r\ns.waitForBoot {\r\n\tvar irs, irbuffs, bufsizes, nextmod, numSamples;\r\n\tnextmod = 100;\r\n\tnumSamples = 40000 ;\r\n\t\r\n\t/* an array of multiple IRs */\r\n\tirs = ~numIRs.collect{ arg nth;\r\n\t\t// nth is here not used, but can be useful to scale decay time.\r\n\t\t[0] ++ 0.dup(100) ++ Array.fill(\r\n\t\t\tnumSamples, { arg i;\r\n\t\t\t\t(i%nextmod==0).if\r\n\t\t\t\t{\r\n\t\t\t\t\tnextmod= rrand(80, 120);\r\n\t\t\t\t\t(i.asFloat/numSamples).squared * 0.3\r\n\t\t\t\t} {\r\n\t\t\t\t\t0\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t)\r\n\t};\r\n\t{ irs.plot }.defer; // to show irs.\r\n\t\r\n\t/* an array of buffers. */\r\n\tirbuffs = ~numIRs.collect{ arg i; Buffer.loadCollection(s, irs[i]) };\r\n\tirbuffs.postln; // to show irbuffs info.\r\n\ts.sync;\r\n\t\r\n\tbufsizes= irbuffs.collect{ |nth|PartConv.calcBufSize(~fftsize, nth) };\r\n\t~irSpctrms = bufsizes.collect{ arg size, i;\r\n\t\tBuffer\r\n\t\t.alloc(s, size, 1)\r\n\t\t.preparePartConv(irbuffs[i], ~fftsize)\r\n\t};\r\n\ts.sync; \r\n\t\r\n\t~numIRs.do{|i| irbuffs[i].free}\r\n}\r\n)\r\n\r\n(\r\nfork{\r\n\t~target= Buffer.read(s, Platform.resourceDir +/+ \"sounds/a11wlk01.wav\");\r\n\ts.sync;\r\n\t{\r\n\t\tvar in, krnl;\r\n\t\tin= PlayBuf.ar(1, ~target, loop:1);\r\n\t\t\r\n\t\t/* an array of multiple instances of PartConv */\r\n\t\tkrnl= ~numIRs.collect{ arg i;\r\n\t\t\tPartConv.ar(in, ~fftsize, ~irSpctrms[i].bufnum, 0.2)};\r\n\t\t// By iterating, each PartConv processes a mono-channel buffer in the array ~irSpctrms.\r\n\t\t\r\n\t\tOut.ar(0, krnl);\r\n\t}.play\r\n}\r\n)",
   "labels" : [
      "reverb",
      "multichannel",
      "convolution"
   ]
}
