How to song bpm calculator — tempo, confidence & candidates
- Step 1Drop a song into the calculator — Drag any audio file onto the drop zone — MP3, WAV, FLAC, M4A, OGG, Opus. There are no settings; the calculation parameters are fixed.
- Step 2The browser decodes and analyses it — Decode, downmix, downsample to 11.025 kHz, 10 ms energy windows, then autocorrelation across 60-180 BPM — all in your tab.
- Step 3Read the top BPM — The
bpmfield is the highest-scoring tempo, rounded to one decimal. This is the calculator's primary answer. - Step 4Check the confidence score —
confidencenear 1 = the top tempo clearly won; near 0 = a tie. Below ~0.2, plan to verify by ear or pick from candidates. - Step 5Read the five candidates — Each
{ bpm, score }is a competing tempo. Compare scores: a close second usually means a half/double fold of the top result. - Step 6Copy or download the breakdown — Save the full JSON as
<name>-bpm.jsonto keep the candidate breakdown alongside your track notes.
What actually runs in the browser
BPM Finder does NOT use FFmpeg. The whole pipeline is Web Audio decode plus a numeric onset-autocorrelation pass — that is why the result is a JSON report, not a re-encoded audio file. WebGPU is tried first for the autocorrelation loop; if WebGPU is unavailable the identical math runs on the CPU.
| Stage | What happens | Why |
|---|---|---|
| Decode | AudioContext.decodeAudioData decodes the file to PCM in the browser | Reuses the browser's own codec — MP3/WAV/M4A/OGG everywhere; FLAC/Opus depend on the browser |
| Downmix | All channels are averaged to mono | Tempo lives in the rhythm, not the stereo image — mono halves the work |
| Downsample | Resampled to 11.025 kHz via an OfflineAudioContext | A kick drum sits below 200 Hz, so high frequencies are irrelevant and dropping them bounds CPU cost regardless of source quality |
| Energy + onset | Energy is summed per 10 ms window; the onset signal is the positive frame-to-frame energy increase (an HFC-lite novelty function) | Beats show up as sudden energy jumps — this isolates them |
| Autocorrelation | The onset signal is autocorrelated across lags equivalent to 60-180 BPM; the top 5 scoring lags are converted to BPM | A repeating beat produces a periodic onset signal; the strongest correlation lag is the tempo period |
| Confidence | confidence = 1 - (second-best score / best score), rounded to 2 decimals | A clear winner over the runner-up means high confidence; two near-tied candidates means low confidence |
Fields in the JSON report
BPM Finder writes a small JSON object. It is shown in a scrollable panel with Copy and Download buttons; Download saves it as <name>-bpm.json. There are no options to set — the tool needs no configuration.
| Field | Type | Meaning |
|---|---|---|
bpm | number | The top-scoring tempo, rounded to one decimal (e.g. 128, 92.5) |
confidence | number 0-1 | How far the top candidate beat the runner-up; 1 - second/best, 2 decimals |
candidates | array of 5 | The five highest-scoring tempos, each { bpm, score }. score is the raw autocorrelation sum (unitless — only useful for comparing candidates within one run) |
gpuAccelerated | boolean | true when the autocorrelation ran on the GPU via WebGPU; false when it fell back to the CPU. The result is identical either way |
How to read the result
A decision guide for interpreting the report fields. Confidence is a relative separation measure, not a probability.
| What you see | What it means | What to do |
|---|---|---|
| High confidence (~0.6+) | Top tempo clearly beat the runner-up | Trust the bpm value |
| Low confidence (<0.2) | Two or more candidates nearly tied | Pick the candidate that fits the genre; verify by ear |
| Top two candidates are 2x/0.5x | Classic half-time / double-time fold | Choose the octave that matches the style |
| BPM near a window edge (60 or 180) | Real tempo may be folded into the 60-180 search range | Consider that the true tempo is half or double the reading |
| All scores low and flat | No strong periodic beat (speech, ambient, rubato) | BPM detection isn't suitable for this material |
Cookbook
Reading-the-results recipes. JSON shows the real report shape (numbers illustrative).
A confident, unambiguous reading
When the top score towers over the rest, confidence is high and you can take the number at face value.
{
"bpm": 128,
"confidence": 0.74,
"candidates": [
{ "bpm": 128, "score": 11200 },
{ "bpm": 64, "score": 2912 },
{ "bpm": 96, "score": 1410 }
]
}
0.74 confidence, top score ~4x the next -> 128 is solid.A near-tie that signals half/double-time
Two close scores and a low confidence is the textbook octave fold. The list hands you both options.
{
"bpm": 75,
"confidence": 0.09,
"candidates": [
{ "bpm": 75, "score": 8050 },
{ "bpm": 150, "score": 7320 }
]
}
Confidence 0.09 + a 150 right behind 75 -> it's a 2:1 fold.
Pick 150 if the track feels like a 150 BPM tune.Reading the raw score field
Scores are unitless autocorrelation sums — only meaningful relative to each other within the same run, not across files.
candidates:
{ bpm: 100, score: 6400 } <- best
{ bpm: 50, score: 6100 } <- 95% of best -> near tie
{ bpm: 133, score: 980 } <- far behind, ignore
The 50 at 95% of the best is the half-time relative.
Don't compare 6400 here to a score in another file's report.Confidence collapses on non-rhythmic audio
A spoken-word clip has no periodic beat, so no candidate stands out and confidence falls toward zero.
{
"bpm": 142,
"confidence": 0.03,
"candidates": [
{ "bpm": 142, "score": 410 },
{ "bpm": 138, "score": 405 },
{ "bpm": 145, "score": 399 }
]
}
Three near-identical scores, confidence ~0 -> no real tempo.
This is speech/ambient, not a song; the bpm is noise.An edge-of-range tempo
A 55 BPM ballad can't sit below the 60 BPM floor, so it folds to ~110 — the candidates and a manual halving reveal the truth.
Real tempo: ~55 BPM (slow ballad)
Report: { "bpm": 110, "confidence": 0.5, ... }
110 is the double-time fold of 55 (the search floor is 60).
Halve it: 55 BPM matches the song. Confirm by tapping along.Edge cases and what actually happens
Tempo sits outside the 60-180 BPM search window
Octave-foldedThe autocorrelation only searches lags equivalent to 60-180 BPM. A 50 BPM ballad or a 190 BPM drum-and-bass track can't land outside that window, so the reported value is the half- or double-time fold that falls inside it (a 190 BPM track reads ~95). Inspect the candidates list — the true tempo is usually present as a halved or doubled relative of the top result.
Half-time / double-time ambiguity on a steady track
By designAutocorrelation cannot distinguish a backbeat from the main pulse: 140 and 70 are mathematically both valid periods of the same beat grid. The detector picks the strongest correlation, which is sometimes the half or double. Both values appear in candidates; pick the one that matches the genre you expect.
Speech, podcast, or ambient audio with no beat
UnreliableThe algorithm needs a periodic onset pattern. Dialogue, field recordings, and pad-only ambient have no repeating energy spikes, so the autocorrelation finds no clear peak — confidence collapses toward 0 and the bpm is effectively noise. For voice work you want the silence-stripper or speech-leveler, not a tempo reading.
Rubato, live, or tempo-drifting performance
Dominant tempo onlyOrchestral rallentando, a live band speeding up, or free-time jazz have no single tempo. The detector returns the dominant period across the whole file and silently misses the drift. Trim to one steady section with the audio-trimmer and re-run if you need a per-section reading.
Browser can't decode the format (FLAC/Opus on older Safari)
Decode errorDecode uses the browser's own decodeAudioData. Safari historically refused FLAC and pre-17 Safari refused Opus. If decode throws, the analysis can't start. Convert to WAV or MP3 first with wav-to-mp3 or flac-to-mp3, then run BPM Finder on the result.
Free-tier file is over 50 MB or 30 minutes
LimitFree tier caps each file at 50 MB and 30 minutes of duration — the duration cap is separate from size, so a long low-bitrate MP3 can hit it under the byte limit. Pro raises this to 200 MB / 120 min, Pro-media to 100 GB / unlimited. A single 3-4 minute song is never near the free cap.
Very short clip (a loop of a few seconds)
Low confidenceAutocorrelation needs enough repetitions of the beat to build a strong peak. A 2-3 second loop may produce a reasonable bpm but a thin confidence. Feed at least one full musical phrase (8-16 bars) for a stable reading.
Click track or metronome
SupportedA bare metronome is the ideal input — each click is a clean onset, the autocorrelation peak is sharp, and confidence runs high. This is a good way to sanity-check the tool against a known tempo.
Polyrhythmic or layered-tempo material
Dominant layer winsIf two rhythmic layers run at related tempos, the autocorrelation reports whichever produces the stronger periodic onset energy. Competing candidates show up in the candidates array with close scores and a low confidence — that closeness is your signal that the track is ambiguous.
Frequently asked questions
Does my audio get uploaded?
No. Decoding and the autocorrelation pass both run in your browser tab — the file's bytes never leave your device. Unlike many online BPM sites, there is no server round-trip, so there is nothing to upload and nothing to delete afterward.
Does this use FFmpeg like the other JAD audio tools?
No — and this is a common misconception. The converters and editors use FFmpeg compiled to WebAssembly, but BPM Finder is pure Web Audio: decodeAudioData plus a numeric onset-autocorrelation pass. That is why it outputs a JSON report instead of re-encoded audio, and why the metrics badge shows only GPU (when WebGPU ran), never the MT/SIMD flags the FFmpeg tools show.
What does the confidence number mean?
Confidence is 1 - (second-best candidate score / best candidate score). A value near 1 means the top tempo dominated every rival; a value near 0 means two or more tempos scored almost the same (usually a half/double-time tie). It is a relative separation measure, not a probability — treat anything under ~0.2 as 'verify by ear'.
Why are there five candidates instead of one answer?
The detector keeps the top five autocorrelation peaks so you can resolve the half-time / double-time ambiguity yourself. The true tempo is almost always either the top result or a 2x / 0.5x relative of it sitting lower in the list. The score field lets you see how close the runners-up were.
What's the supported BPM range?
The autocorrelation searches lags equivalent to 60-180 BPM. Tempos outside that window get folded into it: a 50 BPM track reads near 100, a 190 BPM track reads near 95. That covers the vast majority of pop, rock, electronic, and hip-hop. For extreme tempos, read the value as a half/double of the candidate that matches your genre.
What file formats can I analyse?
Whatever your browser can decode: MP3, WAV, FLAC, M4A, OGG, Opus, and the audio track inside common video files. Decoding relies on the browser's built-in codecs, so FLAC and Opus support depends on the browser (Chrome and recent Safari handle both; very old Safari does not). If a format won't decode, convert it to WAV or MP3 first.
How fast is it?
A 3-4 minute song typically resolves in under two seconds on a modern laptop. The pipeline downmixes to mono and downsamples to 11.025 kHz before any heavy math, so analysis time barely changes whether the source is a 128 kbps MP3 or a 24-bit/96 kHz WAV.
Does WebGPU change the answer?
No. WebGPU only moves the autocorrelation loop onto the graphics card for speed; the math is bit-for-bit the same as the CPU path. The gpuAccelerated flag in the report (and the GPU badge in the UI) just tells you which path ran. On machines without WebGPU it silently uses the CPU and you get the identical BPM.
Can I change the analysis settings?
No — BPM Finder has no options. The window size, downsample rate, and search range are fixed for reliable, repeatable results, so there are no sliders or presets to get wrong. You drop a file and read the report.
It reported half (or double) the tempo I expected — is it broken?
No, that's the half-time / double-time ambiguity inherent to autocorrelation: a beat at 140 BPM is also perfectly periodic at 70 BPM. Look at the candidates array — the value you expected is almost certainly listed there as a 2x or 0.5x of the reported bpm. Pick the one that fits the genre.
Can I re-time a track once I know its BPM?
Yes. Take the detected BPM, then use the tempo-changer to nudge the track to a target tempo (expressed as a percentage), or the time-stretcher to stretch by a factor without shifting pitch. To see the rhythm you measured, render it with the waveform-generator.
Do I need an account?
No. BPM Finder is a free-tier tool with no sign-in required. Signing in only raises the file-size and duration caps (Pro and above) and records a private processed-file counter for dashboard stats — never the audio itself.
What's the difference between confidence and the score field?
score is the raw autocorrelation strength of each individual candidate — a unitless sum that's only meaningful when comparing candidates within the same run. confidence is derived from the top two scores (1 - second/best) and summarises how decisive the winner was. Use score to compare candidates against each other, and confidence to judge the result overall.
Can I compare scores between two different songs?
No. The raw score depends on the loudness, length, and beat sharpness of each file, so a score of 8000 in one report isn't comparable to 8000 in another. Use the confidence field for a normalised, file-to-file sense of how reliable each reading is.
Privacy first
Every JAD Audio tool runs entirely in your browser via FFmpeg (WebAssembly) and RNNoise. Your audio files never leave your device — verified by zero outbound network requests during processing.