// 1. Define SynthDefs
SynthDef(\subPulse, { |freq = 55, amp = 0.3, detune = 0.01, rate = 0.1, gate = 1|
var env = EnvGen.ar(Env.linen(0.1, 2, 0.1), gate, doneAction: 2);
var detuned = SinOsc.ar(freq, 0) + SinOsc.ar(freq * (1 + detune), 0) + SinOsc.ar(freq * (1 - detune), 0);
var mod = LFNoise0.kr(rate).range(0.9, 1.1);
var sig = detuned * mod * env * amp;
sig = sig * 0.3; // Reduce amplitude to prevent clipping
Out.ar(0, sig ! 2);
}).writeDefFile;
SynthDef(\midCluster, { |freq = 220, amp = 0.2, rate = 0.2, gate = 1|
var env = EnvGen.ar(Env.linen(0.1, 2, 0.1), gate, doneAction: 2);
var cluster = SinOsc.ar(freq) + SinOsc.ar(freq * 1.01) + SinOsc.ar(freq * 0.99);
var mod = LFNoise0.kr(rate).range(0.9, 1.1);
var sig = cluster * mod * env * amp;
sig = sig * 0.3; // Reduce amplitude to prevent clipping
Out.ar(0, sig ! 2);
}).writeDefFile;
// 2. Build Score with explicit [time, message] pairs
Score([
// Intro: sparse sub-bass pulses
[0.0, [\s_new, \subPulse, 1001, 0, 0, \freq, 55, \amp, 0.3, \detune, 0.01, \rate, 0.1]],
[4.0, [\n_set, 1001, \gate, 0]],
[6.0, [\s_new, \subPulse, 1002, 0, 0, \freq, 44, \amp, 0.3, \detune, 0.02, \rate, 0.08]],
[10.0, [\n_set, 1002, \gate, 0]],
[12.0, [\s_new, \subPulse, 1003, 0, 0, \freq, 60, \amp, 0.3, \detune, 0.015, \rate, 0.12]],
[16.0, [\n_set, 1003, \gate, 0]],
// Development: adding mid-range clusters
[18.0, [\s_new, \midCluster, 1004, 0, 0, \freq, 220, \amp, 0.2, \rate, 0.2]],
[22.0, [\n_set, 1004, \gate, 0]],
[24.0, [\s_new, \midCluster, 1005, 0, 0, \freq, 240, \amp, 0.2, \rate, 0.18]],
[28.0, [\n_set, 1005, \gate, 0]],
[30.0, [\s_new, \midCluster, 1006, 0, 0, \freq, 200, \amp, 0.2, \rate, 0.22]],
[34.0, [\n_set, 1006, \gate, 0]],
// Climax: dense layering of both
[36.0, [\s_new, \subPulse, 1007, 0, 0, \freq, 50, \amp, 0.3, \detune, 0.03, \rate, 0.15]],
[36.0, [\s_new, \midCluster, 1008, 0, 0, \freq, 230, \amp, 0.2, \rate, 0.25]],
[40.0, [\n_set, 1007, \gate, 0]],
[40.0, [\n_set, 1008, \gate, 0]],
[42.0, [\s_new, \subPulse, 1009, 0, 0, \freq, 47, \amp, 0.3, \detune, 0.025, \rate, 0.13]],
[42.0, [\s_new, \midCluster, 1010, 0, 0, \freq, 210, \amp, 0.2, \rate, 0.23]],
[46.0, [\n_set, 1009, \gate, 0]],
[46.0, [\n_set, 1010, \gate, 0]],
// Resolution: sparse sub-bass returns
[48.0, [\s_new, \subPulse, 1011, 0, 0, \freq, 52, \amp, 0.3, \detune, 0.01, \rate, 0.1]],
[52.0, [\n_set, 1011, \gate, 0]],
[54.0, [\s_new, \subPulse, 1012, 0, 0, \freq, 49, \amp, 0.3, \detune, 0.015, \rate, 0.09]],
[58.0, [\n_set, 1012, \gate, 0]],
[60.0, [\s_new, \subPulse, 1013, 0, 0, \freq, 57, \amp, 0.3, \detune, 0.01, \rate, 0.11]],
[64.0, [\n_set, 1013, \gate, 0]],
[118.0, [\c_set, 0, 0]]
]).recordNRT(
outputFilePath: "~/subharmonic_pulse.wav".standardizePath,
headerFormat: "WAV",
sampleFormat: "int16",
sampleRate: 44100,
options: ServerOptions.new.numOutputBusChannels_(2),
duration: 120,
action: { 0.exit }
);
toward low-end frequency beating as rhythmic source
for layered detuned oscillators in sub-bass range
toward textural density as primary parameter
for gradual layering of sound sources
from sparse sub-bass pulses to dense mid-range clusters
toward rhythmic implications of frequency modulation
whether the density-to-mud threshold is optimally controlled
toward exploring more complex modulation schemes in next session