I have been playing around with Strudel – a real-time music engine based on/fork of Tidal cycles.
The first thing I did was generate a piece of music based on a chess game, with the aid of an LLM. But then most of what I have been thinkjing about lately is the LA fire and looking at maps and data of the fire. It is really heartbreaking

I was sort of inspired to make a dirge, some musical thoughts https://strudel.cc/?jtJadX28xroe and then https://strudel.cc/?ng6V0Y8zs33t. These are collaboratins with AI, Strudel and a book of poetry I wrote during the bleak years of the pandemic. Its a lament for sure
setcpm(40); // Slow, dirge-like tempo
// 1. Define Base Tones for Fire Spread
let fireTonesLow = chord(“”).s(“sine”).gain(0.4).lpf(600).room(0.7);
let fireTonesMid = chord(“”).s(“sine”).gain(0.5).lpf(800).room(0.6);
let fireTonesHigh = chord(“”).s(“sine”).gain(0.3).lpf(1000).room(0.5);
// 2. Noise Layer for Chaos and Smoke
let fireNoise = noise()
.gain(0.3)
.lpf(perlin.range(400, 1200)) // Mimic smoke thickness
.room(0.8)
.delay(perlin.range(0.2, 0.6)); // Drift and spread
// 3. Static Layer for Crackling Intensity
let staticLayer = noise()
.gain(0.2)
.hpf(perlin.range(2000, 4000)) // High frequencies for static
.delay(“0.05:0.1:0.2”) // Fast delay mimics crackling
.room(0.6);
// 4. Mourning Voices
let mourningVoices = chord(“”)
.s(“gm_human_voice”)
.gain(0.5)
.room(0.9)
.delay(“0.3:0.7:1.0”); // Echoing grief
// 5. Structural Collapse
let collapse = chord(“”).s(“gm_acoustic_bass”)
.gain(0.4)
.lpf(500)
.clip(0.7)
.delay(“0.4:0.8:1.2”); // Simulate debris falling
// 6. Overlay of Noise and Drones
let smokePlumes = noise()
.gain(0.3)
.lpf(perlin.range(400, 1000)) // Dense and chaotic
.room(0.7)
.delay(“0.3:0.5:0.8”); // Expanding, dissonant drifts
let electricZaps = noise()
.gain(0.2)
.hpf(perlin.range(2000, 5000)) // High-pitched frequencies for zaps
.speed(perlin.range(1.5, 2.5)) // Faster graininess for zap-like effect
.delay(“0.1:0.2:0.3”) // Rapid echoes for snapping effects
.clip(0.9) // Adds sharpness to simulate electric zaps
.room(0.6);
// 7. Combine All Layers‘
function randomTimeout(callback, minTime, maxTime) {
let time = Math.random() * (maxTime – minTime) + minTime;
setTimeout(callback, time);
}
function gradualChange(layer, param, target, duration, steps = 20) {
let initial = layer[param]();
let stepValue = (target – initial) / steps;
let stepDuration = duration / steps;
let currentStep = 0;
let interval = setInterval(() => {
if (currentStep >= steps) {
clearInterval(interval);
} else {
layer[param](initial + stepValue * currentStep);
currentStep++;
}
}, stepDuration);
}
// 3. Evolving Dynamics
// Increase fire noise gain gradually
randomTimeout(() => {
gradualChange(fireNoise, “gain”, 0.5, 10000); // 10 seconds
console.log(“Fire noise gain is increasing…”);
}, 10000, 20000); // Trigger after 10-20 seconds
// Amplify static layer and lower its high-pass filter
randomTimeout(() => {
gradualChange(staticLayer, “gain”, 0.4, 8000); // 8 seconds
gradualChange(staticLayer, “hpf”, 1500, 8000); // 8 seconds
console.log(“Static layer gain and hpf are modulating…”);
}, 15000, 25000); // Trigger after 15-25 seconds
// Mourning voices become more prominent and resonant
randomTimeout(() => {
gradualChange(mourningVoices, “gain”, 0.7, 12000); // 12 seconds
console.log(“Mourning voices are becoming louder…”);
}, 30000, 40000); // Trigger after 30-40 seconds
// Collapse layer deepens in tone
randomTimeout(() => {
gradualChange(collapse, “lpf”, 300, 10000); // 10 seconds
gradualChange(collapse, “gain”, 0.5, 10000); // 10 seconds
console.log(“Collapse layer is deepening…”);
}, 40000, 50000); // Trigger after 40-50 seconds
stack(
fireTonesLow, // Low rumbling base for fire
fireTonesMid, // Mid-range tones for fire growth
fireTonesHigh, // High piercing tones for intensity
fireNoise, // Noise layer for chaos and smoke
electricZaps,
staticLayer, // Static/crackling sound for tension
mourningVoices, // Emotional response
collapse // Simulate destruction and collapse
).add(room(0.6)); // Combine everything into a unified soundscape

Leave a Reply