|
|
|
@ -1,16 +1,26 @@
|
|
|
|
(
|
|
|
|
(
|
|
|
|
name: 'fft_freeze',
|
|
|
|
name: 'fft_freeze',
|
|
|
|
func: {
|
|
|
|
func: {
|
|
|
|
|
|
|
|
var sig = 0;
|
|
|
|
var in = In.ar(\in.kr(0), 1);
|
|
|
|
var in = In.ar(\in.kr(0), 1);
|
|
|
|
var isOn = \freezeGate.kr(0);
|
|
|
|
var gate = \freezeGate.kr(0);
|
|
|
|
|
|
|
|
var amp = Amplitude.kr(in, 0.01, 0.05);
|
|
|
|
|
|
|
|
var above = amp > \ampThresh.kr(0.02);
|
|
|
|
var chain = FFT(
|
|
|
|
var chain = FFT(
|
|
|
|
LocalBuf(2048),
|
|
|
|
LocalBuf(2048),
|
|
|
|
in
|
|
|
|
in
|
|
|
|
);
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
var frozen = PV_Freeze(chain, isOn);
|
|
|
|
// set: фронт «гейт взведён И амплитуда выше порога» (0 -> 1)
|
|
|
|
var jittered = PV_PhaseShift(frozen, \phaseJitter.kr(0) * TRand.kr(0, 2pi) * isOn);
|
|
|
|
var set = HPZ1.kr(gate * above) > 0;
|
|
|
|
var sig = IFFT(jittered);
|
|
|
|
// reset: снятие гейта (1 -> 0)
|
|
|
|
|
|
|
|
var reset = HPZ1.kr(gate) < 0;
|
|
|
|
|
|
|
|
var isOn = SetResetFF.kr(set, reset);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
chain = PV_Freeze(chain, isOn);
|
|
|
|
|
|
|
|
chain = PV_RandComb(chain, \wipe.kr(0.7), \reshuffle.kr(0.5));
|
|
|
|
|
|
|
|
chain = PV_BinShift(chain, \binShift.kr(0), \stretch.kr(1));
|
|
|
|
|
|
|
|
sig = IFFT(chain) * isOn;
|
|
|
|
|
|
|
|
|
|
|
|
sig;
|
|
|
|
sig;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
@ -24,5 +34,6 @@ saturationSteps: 4,
|
|
|
|
specs: (
|
|
|
|
specs: (
|
|
|
|
freezeGate: [0, 1, \step, 1, 0],
|
|
|
|
freezeGate: [0, 1, \step, 1, 0],
|
|
|
|
phaseJitter: [0, 1, \lin, 0.01, 0.1],
|
|
|
|
phaseJitter: [0, 1, \lin, 0.01, 0.1],
|
|
|
|
|
|
|
|
ampThresh: [0, 1, \lin, 0.001, 0.02],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|