Der Aufbau einer Sound-Engine von Grund auf ist ein Übergangsritus. Sie wollen die Uhr verstehen. Der Zeitpunkt. Die rohe Logik, die Stille in Rhythmus verwandelt. Ein Sequenzer ist diese Logik. Es ist ein Gitter. Sie platzieren Notizen. Du gehst voran.
Die meisten Tutorials überspringen den schwierigen Teil. Sie zeigen Ihnen eine Bibliothek. Sie zeigen Ihnen eine GUI. Sie zeigen einem nicht, wie man mit der Drift umgeht. Die Zeitfehler, die sich einschleichen, wenn Sie die Zeit manuell erfassen.
Lasst uns das beheben.
Wir bauen einen einfachen Step-Sequenzer. Es wird in einer einfachen Schleife ausgeführt. Es werden Geräusche ausgelöst. Es wird die Zeit halten, ohne nach vorne zu schauen. Dieser Ansatz verhindert das „abgehackte“ Gefühl, das Sie bekommen, wenn Sie „setTimeout“ für lange Schleifen verwenden.
Das Kernkonzept: Schrittbasiertes Timing
Ein Sequenzer arbeitet mit Schritten. Keine Sekunden. Schritte.
Wenn Ihr Tempo 120 BPM beträgt, dauert jeder Schlag 0,5 Sekunden. Wenn Sie 16 Schritte haben, beträgt jeder Schritt 0,125 Sekunden. Die Magie entsteht, wenn Sie sich an diese Intervalle halten.
„Zeit ist kein kontinuierlicher Fluss in einem Sequenzer. Sie ist eine Reihe diskreter Ereignisse. Die Synchronisierung mit diesen Ereignissen ist alles.“
Wir brauchen eine Möglichkeit zu berechnen, wann jeder Schritt ausgeführt wird. Nicht durch Raten. Durch Mathematik.
Einrichten der Uhr
Sie benötigen einen Bezugspunkt. Die Startzeit.
In JavaScript erhalten Sie mit „Date.now()“ oder „performance.now()“ Millisekunden. Damit berechnen Sie die Drift.
- Definieren Sie das Tempo.
- Berechnen Sie die Schrittdauer.
- Starten Sie eine Schleife.
Hier ist das Skelett. Es ist nicht schön. Es funktioniert.
„Javascript
konstantes Tempo = 120; // BPM
const Schritte = 16;
const stepDuration = 60000 / Tempo / Schritte; // ms pro Schritt
let currentStep = 0;
let nextStepTime = Date.now();
Funktionsplaner() {
// Gehe zum nächsten Schritt
currentStep++;
if (currentStep >= Schritte) {
currentStep = 0;
}
// Planen Sie den nächsten Schritt
nextStepTime += stepDuration;
// Überprüfen Sie, ob wir zu spät kommen
if (nextStepTime < Date.now()) {
// Wir sind im Rückstand. Aufholen.
nextStepTime = Date.now();
}
// Triggersound für currentStep
playNote(currentStep);
// Nächste Ausführung planen
setTimeout(scheduler, stepDuration – (Date.now() – nextStepTime));
}
setTimeout(scheduler, stepDuration);
„
Dieser Code ist grundlegend. Es verwendet „setTimeout“. Es ist nicht perfekt. Aber es ist ein Anfang.
Warum das wichtig ist
Warum selbst bauen?
Bibliotheken wie Tone.js oder Web Audio API-Wrapper sind großartig. Sie kümmern sich um die komplexe Terminplanung. Sie kompensieren die Latenz.
Aber man lernt nicht, wie sie funktionieren, indem man sie nutzt. Sie lernen, indem Sie sehen, wo sie versagen.
Wenn „setTimeout“ driftet, wackelt Ihr Beat. Es klingt menschlich. Es klingt falsch.
Umgang mit der Drift
Die Prüfung „if (nextStepTime < Date.now())“ ist von entscheidender Bedeutung.
Es
























