Gravity's Whisper

supercollider
// 1. Define SynthDefs for the piece
SynthDef(\subBassDrones, { |freq = 30, amp = 0.3, gate = 1|
    var env = EnvGen.ar(Env.perc(0.1, 10), gate, doneAction: 2);
    var sig = SinOsc.ar(freq, 0, 0.3) + SinOsc.ar(freq * 1.01, 0, 0.3);
    var filtered = LPF.ar(sig, 50);
    Out.ar(0, filtered * env * amp ! 2);
}).writeDefFile;

SynthDef(\granularTextures, { |freq = 100, amp = 0.2, gate = 1|
    var env = EnvGen.ar(Env.perc(0.1, 5), gate, doneAction: 2);
    var sig = Dust.ar(rand(10), 0.1) * SinOsc.ar(freq, 0, 0.5);
    var filtered = HPF.ar(sig, 200);
    Out.ar(0, filtered * env * amp ! 2);
}).writeDefFile;

SynthDef(\detunedOscillators, { |freq = 200, amp = 0.4, gate = 1|
    var env = EnvGen.ar(Env.perc(0.1, 8), gate, doneAction: 2);
    var sig = SinOsc.ar(freq, 0, 0.3) + SinOsc.ar(freq * 1.02, 0, 0.3);
    var filtered = BPF.ar(sig, 500);
    Out.ar(0, filtered * env * amp ! 2);
}).writeDefFile;

// 2. Build Score with explicit [time, message] pairs
Score([
    // Sub-bass drones
    [0.0, [\s_new, \subBassDrones, 1001, 0, 0, \freq, 30, \amp, 0.3]],
    [20.0, [\n_set, 1001, \freq, 25]],
    [40.0, [\n_set, 1001, \freq, 35]],
    [60.0, [\n_set, 1001, \freq, 40]],
    [80.0, [\n_set, 1001, \freq, 45]],
    [100.0, [\n_set, 1001, \freq, 50]],
    [118.0, [\n_set, 1001, \gate, 0]],

    // Granular textures
    [5.0, [\s_new, \granularTextures, 1002, 0, 0, \freq, 100, \amp, 0.2]],
    [15.0, [\n_set, 1002, \freq, 150]],
    [35.0, [\n_set, 1002, \freq, 200]],
    [55.0, [\n_set, 1002, \freq, 250]],
    [75.0, [\n_set, 1002, \freq, 300]],
    [95.0, [\n_set, 1002, \freq, 350]],
    [118.0, [\n_set, 1002, \gate, 0]],

    // Detuned oscillators
    [10.0, [\s_new, \detunedOscillators, 1003, 0, 0, \freq, 200, \amp, 0.4]],
    [25.0, [\n_set, 1003, \freq, 250]],
    [45.0, [\n_set, 1003, \freq, 300]],
    [65.0, [\n_set, 1003, \freq, 350]],
    [85.0, [\n_set, 1003, \freq, 400]],
    [105.0, [\n_set, 1003, \freq, 450]],
    [118.0, [\n_set, 1003, \gate, 0]],

    // End of the piece
    [120.0, [\c_set, 0, 0]]
]).recordNRT(
    outputFilePath: "~/output.wav".standardizePath,
    headerFormat: "WAV",
    sampleFormat: "int16",
    sampleRate: 44100,
    options: ServerOptions.new.numOutputBusChannels_(2),
    duration: 120,
    action: { 0.exit }
);
dark frequency territory textural density rhythmic pulse from non-rhythmic sources from initial frequency choices to evolved frequencies optimal balance between sub-bass drones and granular textures exploring more complex granular synthesis techniques