// 1. Define SynthDefs for the piece
SynthDef(\baseOsc, { |freq = 440, detune = 0, amp = 0.5, gate = 1|
var env = EnvGen.ar(Env.asr(0.01, 1, 0.3), gate, doneAction: 2);
var sig1 = SinOsc.ar(freq + detune, 0, 0.5);
var sig2 = SinOsc.ar(freq - detune, 0, 0.5);
var sig = (sig1 + sig2) * 0.5;
var filtered = LPF.ar(sig, 4000);
Out.ar(0, filtered ! 2);
}).writeDefFile;
SynthDef(\granular, { |freq = 440, amp = 0.3, gate = 1|
var env = EnvGen.ar(Env.asr(0.01, 1, 0.3), gate, doneAction: 2);
var sig = GrainBuf.ar(2, Buffer.read("~/path/to/buffer.wav"), Impulse.ar(10), 0.1, 0.1, 1, pan: 0);
var filtered = HPF.ar(sig, 200);
Out.ar(0, filtered ! 2);
}).writeDefFile;
// 2. Build Score with explicit [time, message] pairs
Score([
// Base oscillators with detuning
[0.0, [\s_new, \baseOsc, 1001, 0, 0, \freq, 261.63, \detune, 5, \amp, 0.4]],
[0.0, [\s_new, \baseOsc, 1002, 0, 0, \freq, 293.66, \detune, 3, \amp, 0.3]],
[0.0, [\s_new, \baseOsc, 1003, 0, 0, \freq, 329.63, \detune, 7, \amp, 0.35]],
// Granular layer
[2.0, [\s_new, \granular, 1004, 0, 0, \freq, 349.23, \amp, 0.2]],
// Amplitude modulation for rhythmic feel
[4.0, [\n_set, 1001, \amp, 0.3]],
[4.2, [\n_set, 1001, \amp, 0.4]],
[4.4, [\n_set, 1001, \amp, 0.3]],
[4.6, [\n_set, 1001, \amp, 0.4]],
// Filter modulation
[6.0, [\n_set, 1002, \freq, 349.23]],
[6.0, [\n_set, 1003, \freq, 392.00]],
// Note-offs
[10.0, [\n_set, 1001, \gate, 0]],
[10.0, [\n_set, 1002, \gate, 0]],
[10.0, [\n_set, 1003, \gate, 0]],
[10.0, [\n_set, 1004, \gate, 0]],
// End of score
[12.0, [\c_set, 0, 0]]
]).recordNRT(
outputFilePath: "~/output.wav".standardizePath,
headerFormat: "WAV",
sampleFormat: "int16",
sampleRate: 44100,
options: ServerOptions.new.numOutputBusChannels_(2),
duration: 12,
action: { 0.exit }
);