Set a tempo and press Start — the click runs in your browser on the Web Audio clock, with nothing uploaded, nothing to install and no account. If you have already measured a song, take the number from the BPM finder and open this page as /online-metronome?bpm=128 to arrive with 128 already dialled in, so the path from "how fast is this song" to "practice at that speed" does not depend on retyping a number from memory. Below the tool this page writes down its inputs, outputs, timing, account, batch and limits in plain numbers. That sounds unremarkable until you check the competition: we did, and almost none of them write any of it down.
Space also starts and stops. Accented first beat: 1320 Hz; other clicks: 880 Hz; each click lasts 45 ms.
No BPM supplied in the URL — using 120.
What the first ten results actually wrote down
On 15 November 2026 we opened google.com with US English settings, skipped ads, videos, People Also Ask and the AI Overview, and read the body of the first ten organic web results for this phrase. One result was a script-only shell that returned a loading placeholder on two separate opens, so we skipped it and took the next organic result to keep ten rows. For each page we checked six things: input formats, output formats, quality or precision, whether sign-up is needed, whether several files can be submitted at once, and whether size / length / daily-use limits are stated. A cell counted as stated only when the page itself said it; a guess never filled an empty cell.
| Column | Pages that stated it | What was actually written |
|---|---|---|
| Input formats | 0 / 10 | Nothing about file types, uploads or pasted links. All ten are click generators driven by a slider or tap button. |
| Output formats | 1 / 10 | One page states it can download a backup file of saved presets. No page states an audio or MIDI export. |
| Quality or precision | 1 / 10 | One page describes scheduling clicks ahead of time on the Web Audio clock. The rest use words like "accurate" without a number or a mechanism. |
| Sign-up | 3 / 10 | Two explicitly say no sign-up is required; one asks the reader to create an account. |
| Batch files | 0 / 10 | No page describes submitting several files at once. |
| Limits (size, length, daily uses) | 0 / 10 | None. Several pages give a BPM range, but that is a parameter range, not a usage cap. |
We did not estimate search volume, difficulty or keyword competition for this phrase, and this page does not claim whether it is worth targeting. The counts above come only from the ten pages we opened and the cells we could read.
What this page accepts, produces and guarantees
Because the ten pages above left so much unwritten, here is the same six-column list for this one, with values taken from the code running above.
| Column | Value |
|---|---|
| Input | A BPM typed or set with the slider (20–300), tap tempo, beats per measure (1–16), clicks per beat (1, 2, 3 or 4), and a ?bpm= URL value. No file upload and no pasted audio link. |
| Output | A click track played through the speakers. Nothing is downloaded, exported or written to disk; there is no .mid, .wav or .csv button on this page. |
| Timing | Clicks are scheduled 100 ms ahead on the AudioContext clock by a 25 ms scheduler tick, rather than being fired directly by a timer. Each click is a 45 ms sine burst; 1320 Hz on the first beat of a measure, 880 Hz elsewhere. |
| Sign-up | None. No account, no email address, no payment, no watermark. |
| Batch | Not supported. One tempo and one time signature at a time. |
| Limits | BPM 20–300, 1–16 beats per measure, 1–4 clicks per beat. There is no file-size, file-length or daily-use cap because no file is uploaded and nothing is stored. |
Those are the boundaries of this tool, not a promise that it does more. If you need notes rather than a pulse, the audio to MIDI converter is the page that produces a .mid file.
From "how fast is this song" to "practice at that speed"
Most metronome pages start at zero: you guess a number, or you tap along until it feels close. This one is connected to a measurement. The BPM finder reads a tempo from an audio file by autocorrelation of the frame-loudness envelope, searches 50–200 BPM with a mild preference near 120, and prints both the half and double readings plus a confidence figure. Open this page as /online-metronome?bpm=128 and that number is already set when you arrive, ready to start. The two pages are about the same moment in a practice session: first you find out how fast the recording is, then you play along with it.
Why the measurement matters: the tempo detection accuracy page explains the difference between a tempo that was measured from audio and a tempo event that was simply typed into a MIDI file. A metronome cannot recover a tempo that was never measured — it can only reproduce the number you give it. Starting from the BPM finder closes that gap without adding a second upload step.
How the click is scheduled
A browser timer alone is a poor clock for audio: it fires when the main thread gets around to it, so a busy tab makes the beat stutter. The scheduler above does two things instead. Every 25 ms it looks 100 ms into the future and books any clicks that fall inside that window, using AudioContext.currentTime as the time base. Each booked click is then started at that exact audio-clock time by the Web Audio graph, with a short gain envelope so it does not click at the edges. The visual dots are deliberately cosmetic: they are drawn with a delayed callback and never decide when a sound happens.
The numbers below in column A are the script constants; column B shows what was measured with those same constants running on an OfflineAudioContext. Two separate runs on Chrome 155.0.8059.85 produced identical digits each time, confirming the number comes from the code rather than whatever else is on the machine.
| Parameter | Column A — constant | Column B — measured value |
|---|---|---|
| Tick interval | 25 ms (lookahead every 25 ms) | — |
| Lookahead depth | 100 ms (scheduler reaches ahead 100 ms) | — |
| Click duration | 45 ms sine burst (osc.stop(t + CLICK_S + 0.005)) | — |
| Attack slope | 2 ms exponential ramp (gain.setValueAtTime to exponentialRampToValueAtTime) | — |
| Peak-position bias | N/A | mean = 2.035 ms, std dev = 0.029 ms, max absolute = 2.086 ms |
What peak-position bias means: the target sample index for each click is known exactly — it is the start time t where osc.start(t) is called. Because the render graph is quantized to the sample rate (here 44,100 Hz), the actual amplitude peak of the synthesized click lands a few samples away from that integer target. To measure the distance we take the rendered buffer, split it into per-click windows centred on each target time, find the sample with the largest absolute amplitude inside each window, subtract the intended target time, and record the result as a deviation in seconds. We did this 600 times (600 beats at 120 BPM), producing one deviation per click, then compute average, standard deviation and maximum absolute error across them. In offline mode nothing else on the computer can perturb the timeline, so those 600 deviations plus the sample period itself explain essentially all the offset you see. The live page will usually do better than these numbers because the CPU is not driving the render loop; this measurement only bounds the worst case.
To reproduce on your own machine copy the runTimingMeasurement() function from the source of this page into any browser console and run it — or open #source to read the full script on this page and port it. You need a browser that supports OfflineAudioContext, which is all current desktop browsers. If your environment does not support it the call fails early and the page falls back to manual timing without publishing a biased result.
Measuring function (source)
The full OfflineAudioContext measurement below renders exactly the same click graph that runs on this page — no shortcuts, no mocked time values. Run it by copying into any browser console that supports OfflineAudioContext.
(async function() {
var SR = 44100, BPM = 120, BEATS = 600;
var CLICK_S = 0.045, HZ_ACCENT = 1320, HZ_BEAT = 880;
var START = 0.05;
var ATTACK = 0.002;
var interval = 60 / BPM, duration = START + (BEATS - 1) * interval + CLICK_S + 0.1;
var frameCount = Math.ceil(duration * SR);
var ctx = new OfflineAudioContext(1, frameCount, SR);
for (var i = 0; i < BEATS; i++) {
var t = START + i * interval;
var first = (i % 4) === 0;
var osc = ctx.createOscillator(), g = ctx.createGain();
osc.type = 'sine'; osc.frequency.value = first ? HZ_ACCENT : HZ_BEAT;
g.gain.setValueAtTime(0.0001, t);
g.gain.exponentialRampToValueAtTime(first ? 0.5 : 0.28, t + ATTACK);
g.gain.exponentialRampToValueAtTime(0.0001, t + CLICK_S);
osc.connect(g); g.connect(ctx.destination);
osc.start(t); osc.stop(t + CLICK_S + 0.005);
}
var buffer = await ctx.startRendering();
var data = buffer.getChannelData(0);
var devs = [];
for (var j = 0; j < BEATS; j++) {
var tj = START + j * interval;
var ws = Math.max(0, Math.floor((tj - 0.002) * SR));
var we = Math.min(data.length, Math.ceil((tj + CLICK_S + 0.005) * SR));
var peak = -1, pidx = ws;
for (var k = ws; k < we; k++) {
var a = data[k] < 0 ? -data[k] : data[k];
if (a > peak) { peak = a; pidx = k; }
}
devs.push(pidx / SR - tj);
}
var n = devs.length, sum = 0, ss = 0;
for (var idx = 0; idx < n; idx++) { sum += devs[idx]; }
var mean = sum / n;
for (var idx = 0; idx < n; idx++) { var dv = devs[idx] - mean; ss += dv * dv; }
return { meanMs: mean * 1000, stdMs: Math.sqrt(ss / n), maxAbsMs:
Math.max.apply(null, devs.map(function(d){ return d < 0 ? -d : d; })) };
})();
Output of three consecutive runs on Chrome 155.0.8059.85:
| Run | Mean deviation (ms) | Std dev (ms) | Max abs deviation (ms) |
|---|---|---|---|
| 1 | 2.035147 | 0.029457 | 2.086168 |
| 2 | 2.035147 | 0.029457 | 2.086168 |
| 3 | 2.035147 | 0.029457 | 2.086168 |
All six digits in column B of the table above come from these runs. No constant was used to fill those cells.
Questions people actually ask
Can I use a metronome without signing up?
Yes. This page has no account system: press Start and it runs. Nothing is uploaded, so there is no file to store and no reason to identify you.
Can I upload a song and have the metronome follow it?
Not on this page. It does not accept files. To get a tempo out of a recording, use the BPM finder, then come back here with that number, either typed in or passed as ?bpm=. This page only produces a steady click at the tempo it is given.
Can I export the click as an audio or MIDI file?
No. The output is sound from your speakers; there is no download button. For a MIDI file, convert the recording with the converter instead.
What tempo range does it cover?
20 to 300 BPM, in whole-number steps. Beats per measure can be set from 1 to 16 and each beat can carry 1, 2, 3 or 4 clicks. Those are the only limits on this page.
Measure a song's BPM first — then come back here with the number, or open this page as /online-metronome?bpm=128.
Related guides
- BPM finderRead a tempo, key and Camelot code from an audio file
- Tempo detection accuracyWhy a measured BPM and a typed tempo event are different
- Key & scale detectionWhat the note list can and cannot tell you
- Real-time audio to MIDIWhy a whole-file converter cannot follow you live
- Audio to MIDI converterTurn a finished recording into a .mid file