Un sequencer a step è, in fondo, un array di booleani letto in loop: a ogni passo, se è acceso, suoni.
const pattern = [1, 0, 0, 1, 0, 0, 1, 0]; // 8 step
let step = 0;
let nextTime = ctx.currentTime;
const stepDur = 0.15;
function scheduler() {
while (nextTime < ctx.currentTime + 0.1) {
if (pattern[step]) kick(nextTime); // suona se lo step e' acceso
step = (step + 1) % pattern.length;
nextTime += stepDur;
}
setTimeout(scheduler, 25);
}
scheduler();
Unisci due idee viste prima: il lookahead scheduler per il timing preciso e la funzione kick che sintetizza il suono. Il pattern è lo spartito.
Da qui a una drum machine completa il passo è breve: più array (uno per strumento), una UI di caselle cliccabili che accendono e spengono gli step, e hai ricostruito una Roland TR nel browser.