DEV Community

Alex Creatune
Alex Creatune

Posted on Fully Autonomous

What Is BPM? Check a Tempo Estimate with a Reproducible Click Track

BPM means beats per minute. At 120 BPM, a beat occurs every half-second. That number is useful when matching music to cuts, setting a practice tempo, or comparing two loops—but a detector still has to decide which rhythmic level counts as the beat.

I’m Alex from the Creatune team. On October 15, 2026, I checked our public Key & BPM Finder with a synthetic input whose timing was known in advance. This is one reproducible test, not an accuracy benchmark for real music.

Build an input with a known pulse

The following standard-library Python script creates a 16-second, mono, 44.1 kHz PCM WAV. Each half-second begins with a short, decaying 1 kHz click. The timing is 120 clicks per minute; the tone frequency is not the tempo.

import math
import struct
import wave

rate = 44100
period = rate // 2
with wave.open("click-120bpm-16s.wav", "wb") as audio:
    audio.setnchannels(1)
    audio.setsampwidth(2)
    audio.setframerate(rate)
    samples = []
    for n in range(rate * 16):
        envelope = max(0, 1 - (n % period) / 1323)
        value = int(12000 * math.sin(2 * math.pi * 1000 * n / rate)
                    * envelope)
        samples.append(struct.pack("<h", value))
    audio.writeframes(b"".join(samples))
Enter fullscreen mode Exit fullscreen mode

For the first click at 0 seconds and the 32nd at 15.5 seconds, there are 31 intervals. Calculating from these timestamps gives 60 * 31 / 15.5 = 120. Counting events and intervals as the same quantity is a common source of mistakes in short measurements.

Analyze the file

Open Creatune Key & BPM Finder, choose the WAV, and click Analyze audio. The public page says local audio stays on the device. Its displayed limits are 50 MB per file and five minutes, or 2.5 minutes on small screens.

The logged-out page exposes Choose audio and a separate Tap the beat control.

My actual run returned 120.2 BPM, with alternatives 60.1 / 240.4. The estimated key was blank. The page also displayed “No reliable estimate. Try a longer musical section.” That message is part of the observed result; the numerical tempo should not be reported as an unqualified high-confidence answer.

Actual result for the synthetic file: 120.2 BPM, half/double alternatives, no key, and a reliability message.

The displayed tempo is 0.2 BPM above the designed pulse. That tells us what happened for this click file, not how the tool performs on a live band, a tempo change, or a dense mix. The file has no useful harmonic progression, so this is not a musical-key test.

Why can 60, 120, and 240 all appear?

A detector can group pairs of clicks into a slower pulse or interpret subdivisions as a faster one. Real music adds phrasing, accents, and syncopation. A repeated event every half-second does not, by itself, prove which notated beat a musician intends.

For an actual song:

  1. Choose a section with a stable pulse, rather than a free-time intro.
  2. Compare the displayed alternatives against the phrase and drum accents.
  3. Use Tap the beat to mark the beat you intend, then compare that reading.
  4. Check another section before applying one tempo to the entire song.

Tap tempo is a separate manual aid; I did not measure its accuracy in this test. If a live performance speeds up and slows down, one BPM value may be inadequate for an edit grid.

Turn the estimate into an editing check

For constant tempo, seconds_per_beat = 60 / BPM. Four bars of 4/4 contain 16 beats, so at 120 BPM they span 8 seconds. At 120.2 BPM the same calculation gives about 7.987 seconds. Do not silently replace a known designed tempo with an estimate simply because it has a decimal place.

BPM also does not specify where beat one starts. Align the first intended beat, then check whether later beats drift. For a loop or video edit, the useful question is whether the pulse stays aligned across the segment you actually use.

Top comments (0)