Additive Dream

(
SynthDef(\additiveDream, {
    |out = 0, amp = 0.3, baseFreq = 100,
     reverbMix = 0.4, delayMix = 0.2|

    var trig = Impulse.kr(Line.kr(1, 12, 60)); // evolving rate
    var sig, freqs, envs, layers, panPos;

    var numHarm = 8; // FIXED size for array ops!

    // Generate harmonic partials with slight detune
    freqs = Array.fill(numHarm, { |i|
        baseFreq * (i + 1 + TRand.kr(-0.05, 0.05, trig))
    });

    // Create envelopes per layer
    envs = Array.fill(numHarm, {
        Linen.kr(trig, 0.01, 0.2, 1 / Line.kr(1, 10, 60)) * TRand.kr(0.05, 0.2, trig)
    });

    // Create layered oscillators using multiple waveforms
    layers = Array.fill(numHarm, { |i|
        var f = freqs[i];
        var e = envs[i];
        var wave = Mix.new([
            SinOsc.ar(f),
            Saw.ar(f * 0.99),
            Pulse.ar(f * 1.01, 0.5 + LFNoise1.kr(0.1).range(-0.2, 0.2)),
            Blip.ar(f, (i + 2).clip(2, 12))
        ]) * e;

        wave = AllpassC.ar(wave, 0.03, LFNoise1.kr(0.2).range(0.001, 0.01), 1);
        wave;
    });

    // Mix and filter
    sig = Mix(layers);
    sig = BLowPass4.ar(tanh(sig), baseFreq * 4, 0.6);

    // Pan animation
    panPos = SinOsc.kr(0.05).range(-1, 1);
    sig = Pan2.ar(sig, panPos);

    // Add delay
    sig = sig + CombC.ar(sig, 0.4, 0.2, 2) * delayMix;

    // Reverb
    sig = FreeVerb.ar(sig, mix: reverbMix, room: 0.9, damp: 0.5);

    // Output
    Out.ar(out, sig * amp * 24);
}).add;
)

x=Synth(\additiveDream);