import("stdfaust.lib"); import("src/util.dsp"); UIGroupOscA(x) = vgroup("Oscillator A", x); UIFreqA = UIGroupOscA(hslider("Frequency", 440.0, 20.0, 10000.0, 1)); UIMorphA = UIGroupOscA(hslider("Morph", 0.5, 0.0, 1.0, 0.001)); UIGroupOscB(x) = vgroup("Oscillator B", x); UIFreqB = UIGroupOscB(hslider("Frequency", 440.0, 20.0, 10000.0, 1)); UIMorphB = UIGroupOscB(hslider("Morph", 0.5, 0.0, 1.0, 0.001)); UIFoldGain = hslider("Fold", 1.0, 0.0, 5.0, 0.01); UIMod = hslider("Modulation", 0.0, 0.0, 1.0, 0.001); UIDamp = hslider("Damp", 0.0, 0.0, 1.0, 0.001); process(pitchA, pitchB, morphA, morphB, foldgain, mod, damp) = (oscA - a*oscC)/(1.0 + a^2 - 2*a*oscB) : *(UIFoldGain + foldgain) : fold with { a = UIDamp; sinemorph(morph) = knee(morph) : sin(_*2.0*ma.PI); tA = pitchA : phase + oscB*(UIMod + mod) : fmod(_, 1.0); tB = pitchB : phase + 0.25 : fmod(_, 1.0); tC = tB - tA : fmod(_, 1.0); oscA = tA : sinemorph(morphA + UIMorphA); oscB = tB : sinemorph(morphB + UIMorphB); oscC = tA - tB : sin(_*2.0+ma.PI); };