«Compar» by LFSaw
on 21 Oct'13 12:01 inCompar is a feed-forward resonator network featuring three ComplexRes nodes (available from https://github.com/supercollider/sc3-plugins ). This code example accompanies the paper "Dynamic FM synthesis using a network of complex resonator filters" by Julian Parker and Till Bovermann.
see http://tai-studio.org/index.php/projects/complexres/ for details.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
( Ndef(\compar, {|in = 0| var ctlLag = \ctlLag.kr(0.1); var src, dst, filterIn, mods, env, tmpIter; var ampEnvs; // number of FM neurons var numNodes = 3; // controls var preAmp = \preAmp.kr(0.1, ctlLag); var postAmp = \postAmp.kr(0.1, ctlLag); var dryAmp = \dryAmp.kr(1, ctlLag); var filterWet = \filterWet.kr(0.9, ctlLag); var reverbWet = \reverbWet.kr(0.9, ctlLag); var freqs = numNodes.collect{|i| ("freq"++i).asSymbol.kr((500 + (i * 100)), ctlLag) }.flat; var amps = numNodes.collect{|i| ("amp"++i).asSymbol.kr(1, ctlLag) }.flat; var fms = numNodes.collect{|i| ("fm"++i).asSymbol.kr(1, ctlLag) }.flat; var decays = numNodes.collect{|i| ("decay" ++i).asSymbol.kr(0.1, ctlLag) }.flat; // signal preparation src = LeakDC.ar(SoundIn.ar(in)); filterIn = preAmp * src; // FM network dst = freqs.inject([filterIn, 0], {|in, freq, i| tmpIter = ComplexRes.ar( filterIn, freq + (fms[i] * in[0]), decays[i] ); [ tmpIter * amps[i], in[1] + tmpIter ] }); dst = Mix.ar(dst * [1, amps.sum * numNodes.reciprocal]); // dryWet dst = SelectX.ar(filterWet, [ OnePole.ar(dryAmp * src, \lpCoeff.kr(0.3, 0.1)), postAmp * LeakDC.ar(dst) ]); // compressor dst = Compander.ar(dst,dst, thresh: \compThresh.kr(0.5,0.1), slopeBelow: 1 , slopeAbove: \compRatio.kr(0.3, 0.1), clampTime: 0.0001, relaxTime: 0.1 ); // reverb + gp limiting Limiter.ar( SelectX.ar(reverbWet, [dst, AdCVerb.ar(0.1 * dst, 10)]) ); }); ) ( // control range specifications Spec.add(\freq0, [1, 20000, \exp]); Spec.add(\freq1, \freq0); Spec.add(\freq2, \freq0); Spec.add(\in, [0, 2, \lin, 1, 1]); Spec.add(\amp0, [0, 1]); Spec.add(\amp1, \amp0); Spec.add(\amp2, \amp0); Spec.add(\fm0, [0, 10000]); Spec.add(\fm1, \fm0); Spec.add(\fm2, \fm0); Spec.add(\decay0, [0.01, 5, \exp]); Spec.add(\decay1, \decay0); Spec.add(\decay2, \decay0); Spec.add(\filterWet, [0, 1]); Spec.add(\reverbWet, [0, 1]); Spec.add(\preAmp, [0.5, 5, \exp]); Spec.add(\dryAmp, [0.5, 5, \exp]); Spec.add(\postAmp, [0.5, 50, \exp]); Spec.add(\lpCoeff, [0, 1]); ) ( // GUI Ndef(\compar).gui; )
reception
comments