JavaScriptsVerschiedenes

Metronom

Ein Taktgeber von 30 bis 250 Schlägen je Minute, mit betonter Eins, Taktartwahl und Tempo-Antippen — der Klick kommt aus dem Browser.

Ein Metronom gibt den Takt vor, damit man nicht schneller wird, wenn es einfach ist, und nicht langsamer, wenn es schwer wird. Dieses hier läuft im Browser, von 30 bis 250 Schlägen je Minute, mit betonter Eins und wählbarer Taktart.

Ihr könnt das Tempo mit dem Schieber einstellen, direkt eintippen oder — am bequemsten — mit dem Knopf „Tempo antippen" im gewünschten Takt mitklopfen; das Script errechnet daraus die Schläge je Minute. Die italienischen Tempobezeichnungen unter der Zahl sind die üblichen Richtwerte: Largo ist breit und langsam, Andante ist Schrittgeschwindigkeit, Allegro ist munter, Presto ist schnell.

Die Taktart bestimmt, auf welchen Schlag die Betonung fällt: Im Viervierteltakt ist es jeder vierte, im Dreivierteltakt — dem Walzertakt — jeder dritte. Der betonte Schlag klingt heller, damit man sich im Takt zurechtfindet, ohne mitzuzählen.

Der Klick wird vom Browser erzeugt und nicht aus einer Datei geladen. Das ist bei einem Metronom besonders wichtig, denn hier kommt es auf die Genauigkeit an: Schon wenige Millisekunden Schwankung hört man als Schleppen. Wie man das hinbekommt, obwohl JavaScript eigentlich gar nicht pünktlich sein kann, steht unten in der Erklärung — es ist die interessanteste Stelle dieses Scripts.

Verwandtes im Archiv: die Eieruhr benutzt dieselbe Tonerzeugung, Reaktionstest misst, wie genau ihr auf einen Reiz reagiert, und Stoppuhr zeigt die andere Art präziser Zeitmessung.

Verschiedenes Baujahr 2026 läuft in deinem Browser
100
Andante

Lasst den Reiter im Vordergrund — im Hintergrund drosseln Browser die Taktgebung.

Script von kostenlose-javascripts.de

So funktioniert das Script

Das Herzstück ist der Taktgeber — und er löst ein Problem, an dem naive Metronome scheitern: JavaScript kann keine Töne pünktlich auslösen.

planer = setInterval(planen, 25);

Der naheliegende Bauplan wäre setInterval(klickGeben, 60000 / tempo) — alle 600 Millisekunden ein Klick bei Tempo 100. Das klingt schrecklich. Ein Intervall ist nur eine Bitte an den Browser, und je nachdem, was er gerade sonst tut, kommt der Aufruf 5, 20 oder 50 Millisekunden zu spät. Beim Ton hört man das sofort als Schleppen, weil das Gehör Abweichungen ab etwa zwei Millisekunden wahrnimmt.

while (naechsterSchlag < tonkanal.currentTime + 0.1) {
  klick(naechsterSchlag, betont);
  naechsterSchlag += 60 / tempo;
  schlagNummer++;
}

Die Lösung heißt Vorausplanung. Der Wecker läuft sehr häufig — alle 25 Millisekunden — und tut selbst gar nichts Hörbares. Er schaut nur nach, welche Schläge in den nächsten 100 Millisekunden fällig sind, und trägt sie mit ihrem genauen Zeitpunkt in die Tonuhr ein. Die Tonverarbeitung des Browsers läuft in einem eigenen Strang mit eigener, sehr genauer Uhr und spielt die Töne auf die Millisekunde pünktlich ab.

Der Wecker darf also ruhig unpünktlich sein: Solange er irgendwann innerhalb der 100 Millisekunden zum Zug kommt, sind die Töne längst eingeplant. Diese Aufteilung — ungenauer Planer, genaue Tonuhr — ist das Standardverfahren für jede Art von Musikprogrammierung im Browser.

naechsterSchlag += 60 / tempo;

Der Abstand zwischen zwei Schlägen in Sekunden ist 60 geteilt durch die Schläge je Minute — bei Tempo 100 also 0,6 Sekunden. Wichtig ist, dass hier addiert und nicht bei jedem Schlag neu gerechnet wird: So summieren sich keine Rundungsfehler auf, und der hundertste Schlag liegt exakt so weit vom ersten entfernt, wie er soll.

regler.gain.exponentialRampToValueAtTime(0.0001, zeitpunkt + 0.05);

Der Klick ist ein sehr kurzer Ton mit schnellem Abfall. Der Abfall verläuft exponentiell statt linear, weil das Gehör Lautstärke logarithmisch wahrnimmt — exponentiell klingt natürlicher. Der Zielwert ist 0,0001 und nicht 0, denn ein exponentieller Verlauf kann die Null nie erreichen; ein Versuch damit führt zu einem Fehler.

const spanne = tippzeiten[tippzeiten.length - 1] - tippzeiten[0];
const abstand = spanne / (tippzeiten.length - 1);
tempoSetzen(60000 / abstand);

Das Tempo-Antippen mittelt über die letzten Klicks: Gesamtspanne geteilt durch die Anzahl der Zwischenräume. Wichtig ist die Zahl der Zwischenräume, nicht der Klicks — bei fünf Klicks sind es vier. Aus dem mittleren Abstand in Millisekunden werden mit 60000 / abstand die Schläge je Minute. Und weil nur die letzten sechs Klicks behalten werden, folgt die Anzeige einer Tempoänderung schnell, statt ewig am alten Mittelwert zu hängen.

Zum Anpassen: Für Achtel- oder Triolenunterteilung plant ihr zwischen den Hauptschlägen zusätzliche, leisere Klicks ein. Für einen anderen Klang genügt es, Wellenform und Frequenz zu ändern — square klingt nach Digitaluhr, sine weicher, und mit einem sehr kurzen Rauschen käme man einem Holzblock nahe.

Script für die eigene Homepage

Kopiert euch den kompletten Code und fügt ihn an der Stelle eurer Seite ein, an der das Script erscheinen soll. Er läuft ohne weitere Dateien und ohne fremde Server.

Mehr aus der Kategorie Verschiedenes