Deep dive
Every track,
its true
tempo.
Run2Beat measures the tempo (BPM) of every imported track entirely on your device — no cloud upload, no analysis queue. This page is the long version of what happens between “file picked” and a BPM appearing next to a track in your library.
What you need to know
Run2Beat automatically detects BPM when you import music. If a track’s tempo ends up obviously wrong you can correct it manually from the Library or a playlist, or trigger a full library re-analysis from Settings.
Beat tracking on real music is genuinely hard — slow jazz ballads, polyrhythmic remixes and sparse singer-songwriter tracks can occasionally land at half, double or triple the true tempo. The app is honest about that: every track gets a confidence reading, and the ones the detector wasn’t sure about are flagged in the library for you to review.
How the detection works
Run2Beat uses a learned beat-tracker (Core ML) as the primary detection path. The model is BeatNet (Heydari et al., ISMIR 2021), bundled with the app at roughly 1.5 MB and converted to Core ML so inference runs locally on iPhone’s CPU and GPU. No data leaves your device.
When the learned model is unavailable, or when its own confidence is too low, a classical DSP pipeline kicks in as a fallback. That fallback computes a spectral-flux onset envelope band-limited to 80 Hz–5 kHz, autocorrelates it with a subharmonic penalty so a real fundamental dominates its half-tempo cousin, and aggregates the result across overlapping 12-second windows so the chosen tempo is the one most windows actually agree on.
Every track that needed the DSP fallback is automatically marked as low-confidence in the UI — even when the fallback happened to land on the right number. The reasoning: the DSP’s own confidence isn’t a reliable predictor of when it’s right, so we treat “the model didn’t commit” as a hard “please review” signal.
Confidence and the low-confidence badge
Every analysed track stores a 0–1 confidence value alongside its BPM. The number is the fraction of the tempogram’s analysis windows that agreed with the winning tempo cluster. In practice:
- Clear pop or electronic with a single dominant kick: typically 0.65–0.95.
- Mixed-feel pop where half-time and main-time both score well: 0.35–0.55.
- Slow jazz with dense triplet subdivisions, where the algorithm’s choice is essentially a coin flip between octaves: 0.20–0.40.
Run2Beat draws the line at 0.42. Below that, the track gets an orange “low-confidence” badge in the library so you know the analyser wasn’t sure. The default Exclude low-confidence tracks setting also keeps those tracks out of BPM-list shuffles, so a wrong BPM never quietly sneaks into your workout.
What gets re-analysed, what stays put
Run2Beat never silently overwrites a tempo you set yourself. As soon as you commit a value through the manual BPM editor — whether you typed it in or used Tap to Tempo — the track is marked as manual.
The library-wide “Re-analyse all BPM” button in Settings has two distinct buttons:
- Re-analyse all (default) — processes every track that isn’t manual.
- Re-analyse all (overwrite manual) — explicit, destructive variant, only available behind a confirmation dialog. The only way to overwrite a value you committed yourself.
The principle: the algorithm is never allowed to overwrite a user-committed value as a side effect of any action other than your own explicit choice.
Tap to Tempo
If a track is wrong and you know the right tempo by feel, the manual editor has a Tap to Tempo pad. Each tap pulses the pad and gives a haptic kick; after four steady taps Run2Beat computes a trimmed mean of the inter-tap intervals and offers the result. Press Save and the value is committed exactly the same way as a typed-in number.
Standard DJ-tool behaviour: the trimmed mean discards a single mis-tap, and a pause longer than 2.5 seconds resets the sequence so you can simply start over.
BPM-list integrity after re-analysis
BPM-lists with manual track selection are kept in sync automatically. After every per-track or library-wide re-analysis, Run2Beat walks every manual BPM-list and removes any pinned track whose new tempo no longer fits the list’s recipe — so a “175 BPM playlist” can never silently contain tracks at 163 BPM.
Smart-auto BPM-lists don’t need cleanup: their membership is recomputed live from each track’s current BPM, so a re-analysis instantly reshapes them.
Performance and battery
Per-track analysis is fast — a couple of seconds on modern iPhones. A library-wide re-analysis still takes time on a big library, simply because there’s a lot to analyse. The run keeps going with the screen locked or the app in the background, kept alive by silent audio playback combined with the app’s audio background mode. iOS suspends Apple’s Neural Engine workloads when the app leaves the foreground, so Run2Beat deliberately pins inference to CPU and GPU only — that’s how a multi-track re-analysis can keep running on the lock screen without getting stuck.
Known limits
The honest list:
- Slow jazz ballads with dense triplet ride cymbals (e.g. Misty at 53 BPM) often land in the 110–160 band because the triplet subdivision is genuinely louder than the quarter-note pulse.
- Mid-tempo songs whose snare carries the half-note (some cumbia, some singer-songwriter material) can land at half tempo even when the model is confident.
- Tracks with real tempo changes (a ballad that doubles up into swing, a ritardando ending) are reported as the tempo that dominates a 90–120-second analysis window. Run2Beat doesn’t segment tempo.
- DRM-protected files (Apple Music store downloads, Spotify offline cache) cannot be analysed because they can’t be decoded. Run2Beat works with music you own as files.
In every one of those cases the manual editor with Tap to Tempo is the remedy — and the track will keep its corrected value through every future re-analysis you trigger.
→ Back to the overview