How accurate is a live BPM detector listening through the microphone?
Short answer: a live BPM detector is about as good as the same detector on a file, as long as the music is at least as loud as everything else the microphone hears. We played 35 test songs at tempos we set ourselves into the live microphone reading of this site's BPM finder, with noise, room echo and talking mixed in:
- Clean: the right tempo was on screen (as the big number or as the half or double time line under it) in 91.4% of readings.
- Noise as loud as the music: 95.5%. Noise 5 dB louder than the music: 70.2%, and the label switched to Moderate or Weak.
- Strong room echo (the music heard mostly as reflections): still 94.5%, but the big number flipped to half or double time more often.
- One person talking as loud as the music: 90.5%. Talking 10 dB louder: 84.3%.
- The first number appeared 8.2 to 8.3 seconds after Start listening, then updated every 2 seconds. After a song change it took 6 to 10 seconds to show the new tempo.
So: hold the device where the music is louder than the room, wait for three or four readings that agree, and check the half or double time line before you trust the big number.
What the live reading does
When you press Start listening on the BPM finder, the page keeps the last 10 seconds of microphone sound in memory and, every 2 seconds, runs the same tempo code it uses for dropped-in files on that stretch. It waits until it has at least 6.5 seconds, which is why nothing shows before the 8-second update. It asks the browser to switch off echo cancellation, noise suppression and automatic gain, because those are made for voices and can flatten drum hits. If the sound is very quiet (below 0.003 of full scale on average, about -50.5 dBFS) it shows Too quiet instead of a number. All of this is in the page's own code.
Because it only ever looks at 10 seconds, the live reading has the same habits as the file reading, which our guide to half and double BPM readings measured: a beat can be counted at more than one speed, so the right tempo is often the second line, not the big number. Noise and echo do not create a new kind of mistake so much as change how often each of those readings wins.
How we tested
- Songs: the same 35 test songs as our file test (44.1 kHz mono, 30 s each): five drum patterns with sustained chords, at 70, 85, 100, 120, 140, 160 and 174 BPM. We know each true tempo because we built it.
- Noise: pink noise (more bass than hiss, closer to room rumble and crowd than white noise) mixed at 20, 10, 5, 0 and -5 dB below or above the music, measured as average level over the whole song. 0 dB means noise and music equally loud; -5 dB means the noise is 5 dB louder.
- Room echo: a made-up reverberation tail that dies away by 60 dB in 0.5 s or 1.5 s, mixed so the echo is as loud as the direct sound, 6 dB louder, or 12 dB louder. Moving away from a speaker in a room does this: the direct sound gets quieter while the echo stays about the same. We did not measure real rooms, so we cannot say how many metres each step is.
- Talking: English sentences we wrote, spoken by the open-source Flite speech synthesizer built into FFmpeg (a male and a female voice), mixed 10 dB quieter than the music, as loud, and 10 dB louder; plus both voices at once at music level. A synthetic voice is not a real conversation, but it has the same syllable rhythm problem: hits that are not on the beat.
- Mixed: 0.5 s echo as loud as the direct sound, plus noise 10 dB quieter than the music, plus one voice 10 dB quieter.
- Readings: we replayed exactly what the live reading does: the last 8 seconds at the first update, then the last 10 seconds every 2 seconds, up to 30 s, through the page's own tempo code (the same file the page loads), in Node. That is 12 readings per song, 420 per condition, 17 conditions. A reading counts as right if it is within 1.5% of the true tempo.
- Real page check: 8 of these mixes played into the actual page in Chromium 153 (Playwright, headless) through Chromium's built-in fake microphone, which feeds a sound file to the page as if it were a microphone. In 7 of 8 the page showed the same numbers as our replay; in the eighth (noise 5 dB louder than the music) the page also showed one 170.0 reading, double the 85 BPM tempo, that our replay did not. A fake microphone skips the speaker, the air and the real microphone, so treat these results as the best case for each kind of interference.
What noise, echo and talking did to the reading
| What else the microphone heard | Right tempo on screen | Big number exactly right | Songs right in all 12 readings | Label on the readings |
|---|---|---|---|---|
| Nothing (clean) | 91.4% | 53.8% | 32 of 35 | all Strong beat |
| Noise 20 dB quieter than the music | 91.4% | 51.4% | 32 | all Strong beat |
| Noise 10 dB quieter | 94.3% | 54.3% | 32 | all Strong beat |
| Noise 5 dB quieter | 96.4% | 55.2% | 32 | 410 Strong, 10 Moderate |
| Noise as loud as the music | 95.5% | 55.2% | 32 | 208 Strong, 212 Moderate |
| Noise 5 dB louder than the music | 70.2% | 49.3% | 15 | 142 Moderate, 278 Weak |
| Echo 0.5 s, as loud as the direct sound | 91.4% | 51.4% | 32 | all Strong beat |
| Echo 0.5 s, 6 dB louder | 92.4% | 51.2% | 32 | all Strong beat |
| Echo 0.5 s, 12 dB louder | 91.4% | 50.2% | 32 | all Strong beat |
| Echo 1.5 s, as loud as the direct sound | 92.1% | 49.3% | 32 | all Strong beat |
| Echo 1.5 s, 6 dB louder | 94.3% | 48.3% | 33 | 408 Strong, 12 Moderate |
| Echo 1.5 s, 12 dB louder | 94.5% | 45.7% | 33 | 373 Strong, 47 Moderate |
| One voice 10 dB quieter than the music | 91.0% | 53.8% | 31 | all Strong beat |
| One voice as loud as the music | 90.5% | 52.9% | 31 | 386 Strong, 34 Moderate |
| One voice 10 dB louder than the music | 84.3% | 52.1% | 23 | 28 Strong, 340 Moderate, 52 Weak |
| Two voices, as loud as the music | 90.0% | 51.2% | 29 | 380 Strong, 40 Moderate |
| Echo + noise + voice (mixed) | 92.9% | 52.1% | 32 | 405 Strong, 15 Moderate |
Noise did almost nothing until it was louder than the music. Light noise even helped a little (91.4% clean, 96.4% with noise 5 dB quieter), and all of that gain came from the three songs that read 2/3 or 4/3 of the tempo when clean: with noise, some of their readings landed on the right tempo instead. With noise 5 dB louder than the music, the right tempo was on screen in 70.2% of readings and only 15 of the 35 songs read right every time. The label did its job here: no reading said Strong beat, and of the 125 wrong readings, 123 said Weak.
Echo barely changed whether the right tempo was on screen, but it changed which line it was on. The number of readings where the big number was half or double the tempo rose from 158 clean to 205 with 1.5 s of echo 12 dB louder than the direct sound. On the real page, the 120 BPM four-on-the-floor song read 60.0 that way in every update, with 120 on the line underneath.
Talking at the level of the music cost about one point. A voice 10 dB louder than the music, which is someone talking close to the phone, dropped it to 84.3% and left only 23 songs steady across all 12 readings. Most of those readings were labelled Moderate (340 of 420), and none of the wrong ones said Strong beat.
Strong beat is not proof. In the clean run, 36 readings were wrong and all 36 said Strong beat: three of our songs read 2/3 or 4/3 of the tempo, the same files that did it as dropped-in files. The label tells you the pattern repeats clearly, not that you count it that way.
How long it takes, and what happens when the song changes
On the real page the first number appeared between 8.17 and 8.34 seconds after pressing Start listening, in all 8 runs. In the replay, the first reading (8 seconds of sound) already had the right tempo on screen for 32 of 35 clean songs, the same 32 that were right later.
| Song change (built tempos) | Before | 2 s after | 4 s after | 6 s after | 8 s after | 10 s after |
|---|---|---|---|---|---|---|
| 120 → 100 | 120.2 | 120.2 | 120.2 | 100.0 | 100.0 | 100.0 |
| 100 → 120 | 100.0 | 100.0 | 100.0 | 120.2 | 120.2 | 120.2 |
| 85 → 140 | 85.0 | 170.0 | 169.8 | 140.1 | 140.0 | 140.0 |
| 140 → 85 | 140.0 | 140.0 | 140.1 | 169.9 | 170.0 | 85.0 |
| 120 → 100, same drum pattern | 120.2 | 120.2 | 120.2 | 100.0 | 100.0 | 100.0 |
The reading followed the new song after 6 seconds in four of the five changes and after 10 seconds in the fifth. In between, two changes showed 170, a number neither song has: it is double the 85 BPM song, picked while the 10-second memory held part of each. A DJ mix that blends two tracks for longer will hold that in-between state for as long as both are audible.
How to get a reading you can trust
- Make the music the loudest thing the phone hears. In our test the reading held up until other sound was louder than the music. Point the microphone at the speaker and move closer, rather than turning the music up in a room full of echo.
- Wait for three or four updates that agree. The first number comes after about 8 seconds; give it until 14 to 16 seconds and see whether the number stays put. If it jumps between two values, one is usually half or double the other.
- Read the second line. If the big number feels like half or double what you tap your foot to, the half time or double time line under it is the one to use. In a room with echo this happened more often.
- Watch the label, but do not lean on Strong beat. Moderate or Weak under heavy noise or talking means the number may be off. Strong beat does not mean it is the count you want.
- Keep quiet near the phone. One voice as loud as the music cost about one point in our test; a voice 10 dB louder cost seven.
- Wait 10 seconds after the song changes before reading the new tempo, and ignore numbers in the middle of a long blend.
- Cross-check. Use Tap tempo on the same page, or, if you have the song as a file, drop it in for a reading of the whole track (see why readings come out half or double).
Questions
How close to the speaker do I need to be?
We cannot give metres: we did not test real rooms or real microphones. What we can say is that in our test the reading was fine with the echo up to 12 dB louder than the direct sound, but the big number then flipped to half or double time more often (205 of 420 readings, against 158 clean). Closer means more direct sound, so closer is better.
Does the live reading record or upload what it hears?
No file is made and nothing from the microphone is sent anywhere: the page keeps only the last 10 seconds in memory in the tab and drops them when you press Stop listening. The site does load Google Analytics, which counts page visits; it does not get the sound.
Why does it show nothing for the first 8 seconds?
The page needs at least 6.5 seconds of sound and only updates every 2 seconds, so the first update with enough sound is at 8 seconds. On the real page the first number appeared at 8.17 to 8.34 seconds in all 8 of our runs.