( SynthDef(\layer0_struct0, { arg bufnum, fftSize = 1024, amp = 0.3, wipeFreq = 0.1, wipeDepth = 0.4, trigFreq = 2.0, threshold = 0.3, smoothAmt = 0.2, mix = 1.0; var in, dry, sig, chain; var wipe, trig; in = PlayBuf.ar(1, bufnum, BufRateScale.kr(bufnum), loop: 1); dry = in; // FFT chain = FFT(LocalBuf(fftSize), in); // Modulated parameters wipe = SinOsc.kr(wipeFreq).range(wipeDepth, 0.9); trig = Impulse.kr(trigFreq); // Processing chain chain = PV_RandComb(chain, wipe, trig); chain = PV_MagAbove(chain, threshold); chain = PV_MagSmooth(chain, smoothAmt); chain = PV_BrickWall(chain); sig = IFFT(chain); // Mix dry/wet sig = XFade2.ar(dry, sig, mix.linlin(0, 1, -1, 1)); Out.ar(0, sig.dup * amp); }).add; ) ( ~midiControlMap = ( 16: \wipeFreq, // CC16 17: \wipeDepth, // CC17 18: \trigFreq, // CC18 19: \threshold, // CC19 20: \smoothAmt, // CC20 21: \mix // CC21 ); // Replace this with your actual Synth instance ~layer0 = Synth(\layer0_struct0, [\bufnum, b]); // Connect MIDI CCs on channel 2 ~midiControlMap.keysValuesDo { |cc, param| MIDIFunc.cc({ |val, num, chan, src| if (chan == 2) { // Channel 2 (zero-indexed) var mappedVal = val.linlin(0, 127, 0.0, 1.0); ~layer0.set(param, mappedVal); ("CC" ++ cc ++ " (" ++ param ++ ") → " ++ mappedVal).postln; } }, cc); }; )