← Back to blog

BPM, Beat Offset, and Tempo Changes — What They Actually Mean

If you've ever opened a rhythm-game editor and seen fields named tempo, beat offset, and tempo sections, this post is for you. They look intimidating but they're really just three ways of describing the same thing — when the beats happen — at three different levels of detail.

BPM: the speed of the pulse

BPM stands for beats per minute. A song at 120 BPM has two beats every second. The beat is whichever pulse you'd naturally tap your foot to — usually the kick drum on a 4-on-the-floor beat, or the snare on a backbeat-driven track.

Some rough reference points:

  • House and disco — 120-128 BPM
  • Hip-hop — 70-100 BPM (or 140-200 on the half-time pulse)
  • Drum & bass — 170-180 BPM
  • Pop — 90-130 BPM
  • Trap — 130-150 BPM

Most produced music sticks to whole numbers. Live or acoustic recordings drift, which is why automatic detectors often produce non-integer estimates and why an integer fallback like 120 instead of 119.7 is usually the right call.

Beat offset: where the grid starts

BPM tells you the period (60000 ÷ BPM in milliseconds), but it doesn't tell you where the beat grid starts. The first beat in your audio file might be 3 seconds in, or 84 milliseconds in, or 1 millisecond in. The number that tells you which one is beat offset.

Beat offset is usually expressed in milliseconds and normalized into a single beat period. For 120 BPM the period is 500 ms, so offset stays in 0 ≤ offset < 500. The reason offset is normalized that way is that an offset of 750 ms at 120 BPM is identical to an offset of 250 ms — it just represents the same grid one beat later.

A wrong offset is the easiest error to spot: every beat line is shifted by the same constant amount, all the way through the song.

Tempo changes: when the grid shifts

Lots of pop, electronic, and rock songs aren't actually one tempo end-to-end. The intro is sometimes slower than the verse; the chorus might be a half-time breakdown. To represent this you use tempo sections: a list of (start time, new BPM) points where the beat grid changes pace.

A song with one tempo throughout has a list of one section starting at 0:00. A song with a tempo change at 1:32 has two sections. The boundaries between sections are where you'll see yellow handles in the waveform editor.

Identifying tempo changes by ear is harder than identifying BPM because the change can be subtle (say, going from 124 to 132). The visual grid catches them quickly: when the beat lines drift away from the drum hits at one specific point in the song, you've found a tempo change.

How to spot all three on a waveform

Open TempoFlow with any song. The waveform you see has three things you can read directly:

  • Spacing of the pink lines tells you the BPM. Lines that are far apart = slow song; lines packed together = fast song.
  • Distance from the start of audio to the first pink line tells you the beat offset.
  • Yellow vertical lines (boundary handles) mark where the algorithm thinks tempo sections start. If you see one at 1:30 and the line spacing changes after it, you're looking at a tempo shift.

Why every rhythm-game tool needs them

Rhythm games schedule prompts on beats. To do that they need to know when each beat happens, to the millisecond. The cleanest way to encode that is exactly the three values above: a tempo, an offset, and optionally a list of sections. Get them right and prompts feel snapped to the music. Get them wrong by 30 ms and the song feels off even though the player can't always say why.

If you're new to this, the practical workflow is: use a tool to detect the values, verify visually, listen to a click track to confirm, then export. The step-by-step tutorial walks through exactly that.