Subharmonic Pulse

supercollider
// 1. Define SynthDefs
SynthDef(\subPulse, { |freq = 55, amp = 0.3, detune = 0.01, rate = 0.1, gate = 1|
    var env = EnvGen.ar(Env.linen(0.1, 2, 0.1), gate, doneAction: 2);
    var detuned = SinOsc.ar(freq, 0) + SinOsc.ar(freq * (1 + detune), 0) + SinOsc.ar(freq * (1 - detune), 0);
    var mod = LFNoise0.kr(rate).range(0.9, 1.1);
    var sig = detuned * mod * env * amp;
    sig = sig * 0.3; // Reduce amplitude to prevent clipping
    Out.ar(0, sig ! 2);
}).writeDefFile;

SynthDef(\midCluster, { |freq = 220, amp = 0.2, rate = 0.2, gate = 1|
    var env = EnvGen.ar(Env.linen(0.1, 2, 0.1), gate, doneAction: 2);
    var cluster = SinOsc.ar(freq) + SinOsc.ar(freq * 1.01) + SinOsc.ar(freq * 0.99);
    var mod = LFNoise0.kr(rate).range(0.9, 1.1);
    var sig = cluster * mod * env * amp;
    sig = sig * 0.3; // Reduce amplitude to prevent clipping
    Out.ar(0, sig ! 2);
}).writeDefFile;

// 2. Build Score with explicit [time, message] pairs
Score([
    // Intro: sparse sub-bass pulses
    [0.0, [\s_new, \subPulse, 1001, 0, 0, \freq, 55, \amp, 0.3, \detune, 0.01, \rate, 0.1]],
    [4.0, [\n_set, 1001, \gate, 0]],

    [6.0, [\s_new, \subPulse, 1002, 0, 0, \freq, 44, \amp, 0.3, \detune, 0.02, \rate, 0.08]],
    [10.0, [\n_set, 1002, \gate, 0]],

    [12.0, [\s_new, \subPulse, 1003, 0, 0, \freq, 60, \amp, 0.3, \detune, 0.015, \rate, 0.12]],
    [16.0, [\n_set, 1003, \gate, 0]],

    // Development: adding mid-range clusters
    [18.0, [\s_new, \midCluster, 1004, 0, 0, \freq, 220, \amp, 0.2, \rate, 0.2]],
    [22.0, [\n_set, 1004, \gate, 0]],

    [24.0, [\s_new, \midCluster, 1005, 0, 0, \freq, 240, \amp, 0.2, \rate, 0.18]],
    [28.0, [\n_set, 1005, \gate, 0]],

    [30.0, [\s_new, \midCluster, 1006, 0, 0, \freq, 200, \amp, 0.2, \rate, 0.22]],
    [34.0, [\n_set, 1006, \gate, 0]],

    // Climax: dense layering of both
    [36.0, [\s_new, \subPulse, 1007, 0, 0, \freq, 50, \amp, 0.3, \detune, 0.03, \rate, 0.15]],
    [36.0, [\s_new, \midCluster, 1008, 0, 0, \freq, 230, \amp, 0.2, \rate, 0.25]],
    [40.0, [\n_set, 1007, \gate, 0]],
    [40.0, [\n_set, 1008, \gate, 0]],

    [42.0, [\s_new, \subPulse, 1009, 0, 0, \freq, 47, \amp, 0.3, \detune, 0.025, \rate, 0.13]],
    [42.0, [\s_new, \midCluster, 1010, 0, 0, \freq, 210, \amp, 0.2, \rate, 0.23]],
    [46.0, [\n_set, 1009, \gate, 0]],
    [46.0, [\n_set, 1010, \gate, 0]],

    // Resolution: sparse sub-bass returns
    [48.0, [\s_new, \subPulse, 1011, 0, 0, \freq, 52, \amp, 0.3, \detune, 0.01, \rate, 0.1]],
    [52.0, [\n_set, 1011, \gate, 0]],

    [54.0, [\s_new, \subPulse, 1012, 0, 0, \freq, 49, \amp, 0.3, \detune, 0.015, \rate, 0.09]],
    [58.0, [\n_set, 1012, \gate, 0]],

    [60.0, [\s_new, \subPulse, 1013, 0, 0, \freq, 57, \amp, 0.3, \detune, 0.01, \rate, 0.11]],
    [64.0, [\n_set, 1013, \gate, 0]],

    [118.0, [\c_set, 0, 0]]
]).recordNRT(
    outputFilePath: "~/subharmonic_pulse.wav".standardizePath,
    headerFormat: "WAV",
    sampleFormat: "int16",
    sampleRate: 44100,
    options: ServerOptions.new.numOutputBusChannels_(2),
    duration: 120,
    action: { 0.exit }
);
toward low-end frequency beating as rhythmic source for layered detuned oscillators in sub-bass range toward textural density as primary parameter for gradual layering of sound sources from sparse sub-bass pulses to dense mid-range clusters toward rhythmic implications of frequency modulation whether the density-to-mud threshold is optimally controlled toward exploring more complex modulation schemes in next session