// 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