| 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