Online-Metronom (Klopftempo)
Ein kostenloses Online-Metronom mit sample-genauer Zeitmessung, einstellbaren Schlägen pro Takt, akzentuiertem visuellem Puls und einer Klopftempo-Taste, um jedes BPM nach Gehör zu finden.
222 Aufrufe
Tippen Sie im Rhythmus — mindestens 2 Antippungen nötig
Verwendet den Look-Ahead-Scheduler der Web Audio API (AudioContext.currentTime) für sample-genaues Timing — kein einfaches setInterval, daher keine Drift, selbst bei hoher Seitenlast.
Warum die meisten Browser-Metronome aus dem Takt geraten
Der naheliegende Weg, ein Metronom in JavaScript zu bauen, ist setInterval(playClick, 60000 / bpm). Das funktioniert ein paar Sekunden lang — dann nicht mehr. setInterval garantiert lediglich, dass ein Callback nicht früher als die angeforderte Verzögerung ausgelöst wird, niemals wie viel später er tatsächlich läuft. Der JS-Hauptthread wird mit allem geteilt, was die Seite sonst tut — DOM-Updates, Layoutberechnungen, Garbage Collection — und jedes davon kann einen wartenden Timer um Dutzende Millisekunden verzögern. Für die meisten UI-Abläufe ist das unsichtbar; für ein Metronom ist es fatal, denn ein Klick, der diesen Schlag 40ms zu spät kommt und den nächsten 10ms zu spät, wandert hörbar, statt bloß leicht daneben zu klingen, und führt einen Musiker, der danach übt, aktiv in die Irre.
Musiker verlassen sich auf ein Metronom genau deshalb, weil die menschliche Wahrnehmung von gleichmäßiger Zeit ohne externe Referenz unzuverlässig ist — der eigentliche Sinn des Geräts, seit Johann Maelzel 1815 die Aufziehversion patentieren ließ. Ein Software-Metronom, das selbst aus dem Takt gerät, unterläuft genau diesen Zweck, und die Lösung ist kein cleverer Timer: Jeder JS-Timer, einschließlich requestAnimationFrame, teilt sich denselben Engpass am Hauptthread. Die eigentliche Lösung besteht darin, JavaScript gar nicht erst zu bitten, den Klang im richtigen Moment selbst zu erzeugen.
Look-Ahead-Scheduling: Wie dieses Metronom präzise bleibt
Dieses Tool verwendet das Muster, das Chris Wilson, ehemals im Web-Audio-Team von Google Chrome, in seinem vielzitierten Artikel „A Tale of Two Clocks" populär gemacht hat: Scheduling-Logik und Klangzeitpunkt vollständig voneinander zu trennen. Der AudioContext der Web Audio API läuft auf seinem eigenen Audio-Thread mit einer sample-genauen Uhr, die JavaScript als AudioContext.currentTime zur Verfügung steht. Ruft man osc.start(t) mit einem zukünftigen Zeitstempel dieser Uhr auf, spielt die Audio-Engine den Ton exakt zum Zeitpunkt t ab — unabhängig davon, was der Hauptthread in diesem Moment gerade tut; er musste nie präzise auf den Schlag genau „aufwachen", damit es funktioniert.
Die einzige Aufgabe des Hauptthreads ist Buchhaltung: Etwa alle 25ms prüft ein Scheduler, welche Schläge innerhalb der nächsten 100ms fällig sind, und ruft für jeden osc.start() mit dessen exaktem zukünftigem currentTime-Wert auf. Da diese Schleife nur ungefähr pünktlich sein muss, verursacht gewöhnliches Jitter kein hörbares Problem — der Klang ist trotzdem mit sample-genauer Präzision geplant. Jeder Klick ist ein rund 30ms kurzer Oszillator-Impuls, der auf dem ersten Schlag jedes Takts höher klingt, um einen hörbaren Akzent zu setzen, synchron mit einem passenden visuellen Puls.
Klopftempo löst ein anderes Problem: das BPM eines Musikstücks zu finden, ohne Noten zum Nachlesen zu haben. Tippen Sie im Takt des Schlags; das Tool misst das Intervall zwischen den Klicks und rechnet es mit 60000 / durchschnittlichesIntervallMs um. Es sind mindestens zwei Klicks nötig, und die Mittelung der letzten Klicks gleicht kleine Timing-Fehler aus. Eine Pause von mehr als zwei Sekunden setzt die Folge zurück, da das meist bedeutet, dass der Takt verloren wurde, statt sich nur stark zu verlangsamen.
Häufig gestellte Fragen
Warum klingt ein einfaches setInterval-Metronom mit der Zeit unregelmäßig?
setInterval verspricht lediglich, dass ein Callback nicht früher als die angeforderte Verzögerung ausgelöst wird — er kann später feuern, sobald der Hauptthread mit Layout, Garbage Collection oder anderer Tab-Aktivität beschäftigt ist. Diese kleinen, unregelmäßigen Verzögerungen summieren sich Schlag für Schlag, sodass der Klick hörbar aus dem Takt gerät, statt fest im Tempo verankert zu bleiben. Dieses Tool umgeht das, indem es die tatsächliche Klangzeitmessung der eigenen Audio-Thread-Uhr der Web Audio API überlässt, statt sich darauf zu verlassen, dass der JS-Timer im richtigen Moment feuert.
Was ist „Look-Ahead-Scheduling" und warum behebt es die Verzögerung?
Es ist ein Muster, bei dem JavaScript nie versucht, einen Klang genau im fälligen Moment abzuspielen. Eine Schleife prüft etwa alle 25ms, ob Schläge in den nächsten 100ms fallen, und plant für jeden vorab einen Oszillator mit AudioContext.currentTime plus dem exakten Versatz über osc.start(präziseZukunftszeit). Die Audio-Engine löst diesen Oszillator mit sample-genauer Präzision auf ihrem eigenen Thread aus, unabhängig vom Hauptthread — die Scheduling-Schleife darf also ungenau sein, während der tatsächliche Schlag exakt bleibt.
Wie berechnet Klopftempo das BPM?
Jeder Klick auf die Klopftempo-Taste zeichnet einen Zeitstempel auf. Ab dem zweiten Klick misst das Tool das Intervall seit dem vorherigen Klick, führt eine kurze fortlaufende Liste der letzten Intervalle und rechnet deren Durchschnitt in ein Tempo um, indem es 60000 durch das durchschnittliche Intervall in Millisekunden teilt. Es sind mindestens zwei Klicks nötig, und eine Pause von mehr als zwei Sekunden setzt die Folge zurück, da das fast immer bedeutet, dass das Klopfen aufgehört hat, statt in einem extrem langsamen Tempo fortgesetzt zu werden.
Warum hat der erste Schlag jedes Takts eine andere Tonhöhe?
Das ist ein Akzent, wie er sowohl bei mechanischen als auch bei digitalen Metronomen üblich ist: Der Taktschlag eins spielt in einer höheren Frequenz als die übrigen, gepaart mit einem visuellen Puls in einer anderen Farbe. Dadurch lässt sich auf einen Blick oder nach Gehör erkennen, wo die „Eins" in einem 3/4- oder 6/8-Muster liegt — wichtig, um Takte korrekt zu zählen, besonders bei Taktarten, in denen sonst jeder Schlag identisch klingen würde.
Welchen BPM-Bereich deckt dieses Metronom ab, und was bedeutet BPM?
BPM steht für Beats per Minute — wie viele Schläge in sechzig Sekunden auftreten. Dieses Tool unterstützt 30 bis 300 BPM und deckt damit den gesamten in Noten verwendeten Bereich ab: Eine Grave-Bezeichnung liegt bei etwa 25–45 BPM, Andante-Gehtempo bei etwa 76–108, und Presto-Passagen können 200 BPM übersteigen. 120 BPM ist die Voreinstellung, weil es ein gängiges, angenehmes Übungstempo und die klassische Moderato-Bezeichnung ist.
Ähnliche Tools
Problem melden
Online-Metronom (Klopftempo)
Kommentare
Noch keine Kommentare — schreiben Sie den ersten!