Beating Frequencies

supercollider
// 1. Define SynthDefs
SynthDef(\subBass, { |freq = 55, amp = 0.3|
    var env = EnvGen.ar(Env.perc(0.01, 1, 0.2), doneAction: 2);
    var sig = SinOsc.ar(freq) * env * amp;
    Out.ar(0, sig ! 2);
}).writeDefFile;

SynthDef(\detunedSine, { |freq1 = 440, freq2 = 444, modFreq = 0.5, modDepth = 0.2, amp = 0.5|
    var mod = LFSaw.ar(modFreq) * modDepth;
    var sig1 = SinOsc.ar(freq1 + mod);
    var sig2 = SinOsc.ar(freq2 + mod);
    var beat = sig1 * sig2;
    var filtered = LPF.ar(beat, 2000);
    var env = EnvGen.ar(Env.asr(0.01, 1, 0.3), doneAction: 2);
    Out.ar(0, filtered * env * amp ! 2);
}).writeDefFile;

// 2. Build Score
Score([
    // Sub-bass drone
    [0.0, [\s_new, \subBass, 1001, 0, 0, \freq, 55, \amp, 0.3]],

    // Layered detuned sine waves with modulation
    [2.0, [\s_new, \detunedSine, 1002, 0, 0, \freq1, 440, \freq2, 444, \modFreq, 0.5, \modDepth, 0.2, \amp, 0.4]],
    [4.0, [\n_set, 1002, \freq1, 444, \freq2, 440, \modFreq, 0.7]],
    [6.0, [\n_set, 1002, \freq1, 440, \freq2, 444, \modFreq, 0.3]],
    [8.0, [\n_set, 1002, \freq1, 430, \freq2, 434, \modFreq, 0.9]],
    [10.0, [\n_set, 1002, \freq1, 434, \freq2, 430, \modFreq, 0.2]],
    [12.0, [\n_set, 1002, \freq1, 440, \freq2, 444, \modFreq, 0.5]],

    // Filter evolution
    [14.0, [\n_set, 1002, \modDepth, 0.3]],
    [16.0, [\n_set, 1002, \modDepth, 0.1]],
    [18.0, [\n_set, 1002, \modDepth, 0.4]],

    // End notes
    [43.0, [\n_set, 1001, \gate, 0]],
    [43.5, [\n_set, 1002, \gate, 0]],
    [45.0, [\c_set, 0, 0]]
]).recordNRT(
    outputFilePath: "~/output.wav".standardizePath,
    headerFormat: "WAV",
    sampleFormat: "int16",
    sampleRate: 44100,
    options: ServerOptions.new.numOutputBusChannels_(2),
    duration: 45,
    action: { 0.exit }
);
toward rhythmic pulse from beating frequencies for layered synthesis with slow modulation from initial detuning to evolving filter parameters about optimal modulation depth for rhythmic clarity toward more complex modulation patterns