Costruire un motore sonoro da zero è un rito di passaggio. Vuoi capire l’orologio. I tempi. La logica cruda che trasforma il silenzio in ritmo. Un sequenziatore è quella logica. È una griglia. Metti le note. Tu vai avanti.
La maggior parte dei tutorial salta la parte difficile. Ti mostrano una biblioteca. Ti mostrano una GUI. Non ti mostrano come gestire la deriva. Gli errori di temporizzazione che si insinuano quando si monitora manualmente il tempo.
Risolviamolo.
Stiamo costruendo un sequenziatore di passi di base. Verrà eseguito su un ciclo semplice. Si attiveranno i suoni. Manterrà il tempo senza guardare avanti. Questo approccio previene la sensazione di “instabilità” che si prova quando si utilizza “setTimeout” per cicli lunghi.
Il concetto fondamentale: cronometraggio basato sui passaggi
Un sequenziatore funziona per passi. Non secondi. Passi.
Se il tuo tempo è 120 BPM, ogni battuta dura 0,5 secondi. Se hai 16 passaggi, ogni passaggio dura 0,125 secondi. La magia avviene quando ti blocchi a questi intervalli.
“Il tempo non è un flusso continuo in un sequenziatore. È una serie di eventi discreti. La sincronizzazione con questi eventi è tutto.”
Abbiamo bisogno di un modo per calcolare quando avviene ogni passaggio. Non indovinando. Per matematica.
Impostazione dell’orologio
Hai bisogno di un punto di riferimento. L’ora di inizio.
In JavaScript, Date.now() o performance.now() ti danno millisecondi. Lo usi per calcolare la deriva.
- Definire il tempo.
- Calcola la durata del passaggio.
- Inizia un ciclo.
Ecco lo scheletro. Non è carino. Funziona.
Questo codice è basilare. Utilizza “setTimeout”. Non è perfetto. Ma è un inizio.
Perché è importante
Perché costruirlo da solo?
Le librerie come Tone.js o i wrapper API Web Audio sono fantastiche. Gestiscono la pianificazione complessa. Compensano la latenza.
Ma non impari come funzionano usandoli. Impari vedendo dove falliscono.
Quando “setTimeout” va alla deriva, il tuo ritmo traballa. Sembra umano. Sembra sbagliato.
Gestire la deriva
Il controllo if (nextStepTime < Date.now()) è fondamentale.
Esso
























