La stessa idea generativa di Sonic Pi vive anche nella Web Audio API: poche regole più casualità uguale musica infinita.
const scala = [220, 261.6, 293.7, 329.6, 392]; // La minore pentatonica
function nota(time) {
const osc = ctx.createOscillator();
const gain = ctx.createGain();
osc.type = "triangle";
osc.frequency.value = scala[Math.floor(Math.random() * scala.length)];
gain.gain.setValueAtTime(0.3, time);
gain.gain.exponentialRampToValueAtTime(0.001, time + 1.5);
osc.connect(gain).connect(ctx.destination);
osc.start(time);
osc.stop(time + 1.5);
}
let t = ctx.currentTime;
setInterval(() => {
if (Math.random() > 0.3) nota(t); // a volte silenzio
t += 0.5;
}, 400);
L'ingrediente segreto è vincolare il caso: pescando solo da una scala pentatonica, ogni nota casuale suona comunque "giusta". Il silenzio occasionale (Math.random() > 0.3) dà respiro e rende il flusso meno meccanico.
Aggiungi un secondo strato più lento per i bassi, un riverbero, e hai un generatore ambient che non si ripete mai. Zero file, musica perpetua.