Skip to content

Instantly share code, notes, and snippets.

@catfact
Created November 16, 2018 22:53
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save catfact/87581f132eeeb8c2938beea10153a618 to your computer and use it in GitHub Desktop.
Save catfact/87581f132eeeb8c2938beea10153a618 to your computer and use it in GitHub Desktop.
Gerasene {
classvar fft_bufsize;
var <buf;
var <out_bus;
var <syn;
var <out_syn;
*initClass {
fft_bufsize = 2048;
StartUp.add {
var def = SynthDef.new(\gerasene, {
//--- arguments
// inputs, outputs
arg in_1, in_2,
out_mf_1a, out_mf_1b, out_mf_2a, out_mf_2b,
out_voc_12, out_voc_21,
// buffers
buf_in_1, buf_in_2,
buf_mf_1a, buf_mf_1b, buf_mf_2a, buf_mf_2b,
buf_voc_12, buf_voc_21,
// parameters
freeze_mf_1a= 0, scale_mf_1a= 1, shift_mf_1a= 0,
freeze_mf_1b= 0, scale_mf_1b= 1, shift_mf_1b= 0,
freeze_mf_2a= 0, scale_mf_2a= 1, shift_mf_2a= 0,
freeze_mf_2b= 0, scale_mf_2b= 1, shift_mf_2b= 0,
freeze_voc_12= 0, floor_voc_12= 0, mode_voc_12= 1,
freeze_voc_21= 0, floor_voc_21= 0, mode_voc_21= 1;
var chain_in_1, chain_in_2;
var chain_mf_1a, chain_mf_1b, chain_mf_2a, chain_mf_2b;
var chain_voc_12, chain_voc_21;
// outputs
var mf_1a, mf_1b, mf_2a, mf_2b;
var voc_12, voc_21;
chain_in_1 = FFT(buf_in_1, In.ar(in_1));
chain_in_2 = FFT(buf_in_2, In.ar(in_2));
// freeze / shift / scale
chain_mf_1a = PV_Copy(chain_in_1, buf_mf_1a);
chain_mf_1a = PV_MagFreeze(chain_mf_1a, freeze_mf_1a);
chain_mf_1a = PV_MagShift(chain_mf_1a, scale_mf_1a, shift_mf_1a);
mf_1a = IFFT.ar(chain_mf_1a);
chain_mf_1b = PV_Copy(chain_in_1, buf_mf_1b);
chain_mf_1b = PV_MagFreeze(chain_mf_1b, freeze_mf_1b);
chain_mf_1b = PV_MagShift(chain_mf_1b, scale_mf_1b, shift_mf_1b);
mf_1b = IFFT.ar(chain_mf_1b);
chain_mf_2a = PV_Copy(chain_in_2, buf_mf_2a);
chain_mf_2a = PV_MagFreeze(chain_mf_2a, freeze_mf_2a);
chain_mf_2a = PV_MagShift(chain_mf_2a, scale_mf_2a, shift_mf_2a);
mf_2a = IFFT.ar(chain_mf_2a);
chain_mf_2b = PV_Copy(chain_in_2, buf_mf_2b);
chain_mf_2b = PV_MagFreeze(chain_mf_2b, freeze_mf_2b);
chain_mf_2b = PV_MagShift(chain_mf_2b, scale_mf_2b, shift_mf_2b);
mf_2b = IFFT.ar(chain_mf_2b);
// vocode
chain_voc_21 = PV_Copy(chain_in_1, buf_voc_21);
chain_voc_21 = PV_SpectralMap(chain_voc_21, chain_in_2,
floor_voc_21, freeze_voc_21, mode_voc_21, 1);
voc_21 = IFFT.ar(chain_voc_21);
chain_voc_12 = PV_Copy(chain_in_2, buf_voc_12);
chain_voc_12 = PV_SpectralMap(chain_voc_12, chain_in_1,
floor_voc_12, freeze_voc_12, mode_voc_21, 1);
voc_12 = IFFT.ar(chain_voc_12);
Out.ar(out_mf_1a, mf_1a);
Out.ar(out_mf_1b, mf_1b);
Out.ar(out_mf_2a, mf_2a);
Out.ar(out_mf_2b, mf_2b);
Out.ar(out_voc_12, voc_12);
Out.ar(out_voc_21, voc_21);
});
CroneDefs.add(def);
}
}
*new { arg server, context;
^super.new.init(server, context);
}
init { arg context;
var server = context.server;
Routine {
buf = (
in_1: Buffer.alloc(server, fft_bufsize, 1),
in_2: Buffer.alloc(server, fft_bufsize, 1),
mf_1a: Buffer.alloc(server, fft_bufsize, 1),
mf_1b: Buffer.alloc(server, fft_bufsize, 1),
mf_2a: Buffer.alloc(server, fft_bufsize, 1),
mf_2b: Buffer.alloc(server, fft_bufsize, 1),
voc_12: Buffer.alloc(server, fft_bufsize, 1),
voc_21: Buffer.alloc(server, fft_bufsize, 1)
);
out_bus = (
mf_1a: Bus.audio(server, 1),
mf_1b: Bus.audio(server, 1),
mf_2a: Bus.audio(server, 1),
mf_2b: Bus.audio(server, 1),
voc_12: Bus.audio(server, 1),
voc_21: Bus.audio(server, 1),
);
server.sync;
syn = Synth.new(\gerasene, [
\buf_in_1, buf.in_1.bufnum,
\buf_in_2, buf.in_2.bufnum,
\out_mf_1a, out_bus.mf_1a,
\buf_mf_1a, buf.mf_1a.bufnum,
\out_mf_1b, out_bus.mf_1b,
\buf_mf_1b, buf.mf_1b.bufnum,
\out_mf_2a, out_bus.mf_2a,
\buf_mf_2a, buf.mf_2a.bufnum,
\out_mf_2b, out_bus.mf_2b,
\buf_mf_2b, buf.mf_2b.bufnum,
\out_voc_12, out_bus.voc_12,
\buf_voc_12, buf.voc_12.bufnum,
\out_voc_21, out_bus.voc_21,
\buf_voc_21, buf.voc_21.bufnum,
], context.xg);
out_syn = out_bus.collect({ |bus|
Synth.new(\patch_pan,
[\in, bus, \out, context.out_b, \level, 0],
context.og, \addBefore);
});
}.play;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment