SOUNDGENERATOR.APP
50% - - idle

Music & tuning · 20 – 300 BPM

Online Metronome

A steady, sample-accurate metronome from 20 to 300 BPM. Set the tempo by number, slider or tap, choose a time signature and subdivision, and switch on one bar of count-in before you play. The beat is scheduled on the Web Audio clock, not on a JavaScript timer, so it does not drift.

Don’t practise with the click loud for long sessions. Set the header level so the click is clearly audible but quieter than your instrument, and stop with Esc at any time. Headphones at high volume are the fastest way to damage your hearing.

Metronome Look-ahead scheduler
44.1 kHz clock
120 BPM

Allegro

Fast and bright

-
2090160230300
80%
Subdivision

Space play / stop · Esc stop · tap tempo averages the last four taps.

Ready. Press play to start.

Oscilloscope · click output

The dots flash on each beat of the bar and the counter shows how many bars have passed. Both are decorative - nothing here is announced to screen readers.

Reference Tempo terms and their ranges
TermBPM rangeCharacter
Larghissimo 20 – 24 Extremely slow
Grave 25 – 45 Slow and solemn
Largo 46 – 59 Broad, very slow
Larghetto 60 – 65 Slightly faster than largo
Adagio 66 – 75 Slow, at ease
Andante 76 – 107 Walking pace
Moderato 108 – 119 Moderate
Allegro 120 – 155 Fast and bright
Vivace 156 – 175 Lively and fast
Presto 176 – 199 Very fast
Prestissimo 200 – 300 As fast as possible

The ranges are the ones in common use; they overlap in places between different editors, so a tempo near a boundary can honestly carry either name.

FAQ Questions people actually ask
Why does a look-ahead scheduler sound steadier than setInterval?

setInterval only promises that a callback runs somewhere in a timer window, and each callback lands a fraction late. If you play the click inside that callback, the errors pile up and the beat wanders. The fix is to separate timing from playback: a timer wakes up every 25 ms, but it only schedules clicks that are due in the next 100 ms and hands the exact start time to the Web Audio API. The audio clock is driven by the sound card and is sample-accurate, so the clicks land on the grid no matter how late the JavaScript is.

What is tap tempo measuring?

The average of the last four intervals between your taps, converted to BPM with 60000 ÷ interval. It uses the individual intervals rather than first-to-last so a single hesitant tap does not drag the average. Taps more than two seconds apart reset the window, so starting again after a pause does not mix old and new tempi.

What does the click level do that the header level does not?

The header slider sets the volume of everything leaving the site. Click level is a separate gain stage inside the metronome, so you can drop the metronome under a backing track or a recording you are practising with, without touching the master output. The click still obeys the header mute.

Does the accent land on the first beat of the bar?

Yes. Beat one of every bar is accented with a higher, slightly louder click; the other beats use a lower one. With a subdivision selected, the in-between clicks sit below the beats on their own pitch, so you can feel the pulse even at slow tempi where the subdivisions carry the motion.

Guide Why the metronome uses a look-ahead scheduler

The problem with setInterval

A JavaScript timer does not fire on time. setInterval(click, 500) schedules the callback for roughly 500 ms in the future, but the main thread may be busy with layout, garbage collection or an audio buffer refill when the timer expires, so the callback runs a little late - and then the next interval is scheduled from that late moment. The error accumulates, the beat drifts, and a metronome that wanders is worse than none.

Separating timing from playback

The scheduler here looks ahead. A setTimeout loop wakes every 25 ms, and each time it looks at the AudioContext clock and schedules every click that falls within the next 100 ms - handing the Web Audio API the exact start time with osc.start(when). The API plays each click at the sample it was told to, on the sound card’s own clock, so the audible grid is exact even though the JavaScript that planned it was not. Scheduling only 100 ms ahead keeps the clicks responsive to changes while leaving the main thread free for the display.

What is scheduled

Each beat is divided by the subdivision - one click per beat for quarters, two for eighths, three for triplets, four for sixteenths. Beat one of the bar is accented (a higher, slightly louder click), the other beats use a lower click, and the subdivision clicks sit below both on their own pitch. The count-in schedules four clicks of one bar before the pattern begins.