«Simple FM template with additive mixing of modulators» by LFSaw
on 02 Mar'20 15:05 inTemplate to create a 2x3 FM Synth. There are two independent FM synths, of type car(mod1(mod2))
.
all carriers and modulators are collected together and are mixed to the output according to adLevels
.
This is intended to be a starting point for further exploration.
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
( Ndef(\a, { var fundFreqs, ratios, fmLevels, adLevels, partials, snd; fundFreqs = [730, 150]; ratios = [ [1, 3, 5], // three vals [2, 3, 9] ]; fmLevels = [ [0.5, 0.3], // interrelation between two modulators, hence 2 vals [0.7, 0.3] ]; adLevels = [ [1, 0.2, 0.6], [0.9, 0.3, 0.3] ]; snd = [fundFreqs, ratios, fmLevels, adLevels].flop.collect{|v| var fundFreq, ratios, fmLevels, adLevels, partials, prevFMLevels; #fundFreq, ratios, fmLevels, adLevels = v; // create stacked modulators // start with innermost modulator ratios = ratios.reverse; prevFMLevels = (fmLevels ++ [1]).reverse; partials = [ratios, prevFMLevels, adLevels].flop.inject([0], {|prev, vals| var ratio, prevFMLevel; #ratio, prevFMLevel = vals; // "r: % \t l: % \t %".format(ratio, fmLevel, prev).postln; [SinOsc.ar((fundFreq * ratio) + (prev.first * fundFreq * prevFMLevel))] ++ prev }); partials = partials[0..(partials.size-2)]; // now should have [car, mod1, mod2, ...] partials = partials * adLevels; }; snd = Mix(snd.flat); snd!2 }) ) Ndef(\a).edit
reception
comments