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.