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.