(
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);