Deep dive
Find
the groove.
Line up.
Beat matching is an optional assist on top of BPM-list Crossfade. It tries to enter the next song where the music locks in, wait a beat so phases meet, and leave a thin outro a little earlier when energy clearly dies. This page is the long technical version.
What it is trying to do
On a BPM list with Crossfade, song changes should feel closer to a DJ-style mix than a plain volume blend:
- A — After the quiet intro. Many tracks open with pads, breakdowns or spoken intros. Starting the fade at file 0:00 blends into the wrong section. Prefer seeking to where the groove locks in.
- B — Beats find each other. Outgoing and incoming material at the same effective tempo should overlap on a shared beat phase, not mid-bar against each other.
- C — Leave before the thin outro. When the outgoing track clearly dies into a soft ending, pull the fade window forward so the next high-energy track does not wait behind silence — without chopping every song via an unconditional early cut.
Ordinary Crossfade (fixed six-second equal-power blend) stays available and unchanged when Beat matching is off. See the Transitions deep dive for the engine Beat matching layers on.
Hard product constraints
- BPM lists only — Library and standard playlists are out of scope (tempos vary; no single list BPM).
- Same effective tempo — a warm-up stepping into a higher target BPM does not force phase-align; matching applies between same-tempo steps.
- Crossfade only — Gapless has no overlap to align. Selecting Gapless clears the Beat matching toggle.
- Opt-in — off by default; Settings toggle; syncs to Apple Watch.
- Soft-outro pull, no stacked early-cut — a clear die-out can pull the fade window forward; there is no unconditional early cut on every song.
Why this is hard
Club DJ tools usually have a per-track beat grid, tempo sync and phase lock. Run2Beat already solves tempo for BPM lists by pitching tracks toward a shared target. What remains is where to enter the next file and phase at overlap — on-device, without a heavyweight DJ engine or hand-corrected grids.
Personal libraries are messy: long EDM builds, acoustic openings, half-time feel, spoken intros, ambient pads that never “drop”. Any automatic cue will be wrong some of the time. When cues are missing or weak, Run2Beat degrades to plain Crossfade rather than inventing a bad seek.
Three cues, not one feature
- A — Intro skip (arrangement / energy). Failure: next song starts in a quiet pad.
- B — Phase align (timing / beat period). Failure: feels like ordinary Crossfade, or a tiny delay without true lock.
- C — Soft-outro pull (arrangement / energy). Failure: thin outro plays at full level before the next high-energy track.
A and B are measured once and stored on the track. C is measured live when the song plays, because Watch time-stretched variants need the processed file and soft outros are not packaged for AirDrop.
Stored cues
Each library track can carry:
- Groove start — A: seconds into the file for intro skip.
- Beat zero — B: phase anchor near the start.
- Cue schema version — heuristic stamp; when it bumps, prep re-fills stale cues.
A missing value means not analysed; a stored zero means analysed and the cue is at the file beginning (valid). The same three fields travel in AirDrop playlist / BPM-list packages and in the Watch sync catalog. Soft-outro pull is never stored.
How A and B are measured
Analysis scans only the opening window of the file (lookahead up to roughly 90 s, capped by duration) — not a full-file decode.
Groove start (A) is an energy / RMS heuristic: compare an intro floor to a later peak, prefer a sustained high level, else a large jump, else a soft rise, then optionally snap toward the nearest beat of the list BPM hint. Already-loud openings, no rise, or unreadable files return a cue at the file start, with a reason recorded for logs. It is not arrangement-aware; soft pads and spoken intros can still mis-cue.
Beat zero (B) is not a full beat grid. The analyser takes RMS peaks in the first ~24 s, uses period = 60 / BPM, scores candidate phase offsets across one beat period, and stores the best phase. Usable BPM for this step is 60–220, matching the BPM-list editor. Without a usable BPM hint, beat zero falls back to the file start. Tempo detection elsewhere still uses BeatNet; its per-frame beat channel is not persisted as a Crossfade grid.
Prep gate
The first time you play a BPM list (or start a Watch sync) with Beat matching and Crossfade on, Run2Beat may show a progress sheet that scans only songs still missing cues. Cancel is safe: that play or sync continues with ordinary Crossfade for the session — no A/B seek/phase and no soft-outro pull.
Prep runs from the BPM-list hub and from Watch sync for enabled recipe tracks. It does not force a full-library re-analyse; large libraries stay on-demand. Cancelled prep sets a session flag so Beat matching stays off for that run only.
What happens at fade time
Eligibility requires Beat matching enabled, Crossfade mode, a BPM-list session, matching outgoing / next effective BPM, and (on iPhone) no cancelled-prep session flag. Then, once per pending fade:
- Soft-outro (C) — if the outgoing file has a clear die-out, shorten the transition anchor (capped around 16 s / 15 % of duration; ignore pulls under ~2.5 s). The analyser looks back up to about 70 s so a long EDM outro is visible. Progress UI still shows full file length. Fade length stays six seconds; only when the blend starts can move earlier.
- Phase delay (B) — compute a wait of up to almost one beat so outgoing phase at elapsed time meets incoming phase at the seek position. On iPhone the delay uses TimePitch-aware timing so cues match the audible timeline when the rate is not 1. Walking-cadence lists (down to 60 BPM) are included. Near-boundary → no wait. The incoming shuffle track is pinned across that wait so look-ahead cannot pick a different song after the delay.
- Incoming seek (A) — if groove start is above ~0.02 s, schedule the next track from that frame. The ramp uses a slightly slower incoming rise onto already-loud material.
Beat matching does not add an unconditional early cut on every fade, and does not time-stretch to match different BPMs (the list already shares tempo). Phase delay uses stored beat-zero cues and TimePitch-aware timing, not wall-clock elapsed time alone.
iPhone and Apple Watch
Behaviour aims for parity; the surfaces differ:
- The phone owns the Settings toggle and pushes the Beat matching flag in the transitions payload.
- Cues live on library tracks on iPhone and as catalog fields on Watch playlist tracks / variants.
- Watch HE-AAC tempo variants inherit phone A/B cues scaled by variant pitch (1 / rate). Live remeasure on the watch only if catalog cues are missing. Soft-outro always measures the file that is actually playing.
- Prep UI is on the phone (list play + sync); the watch has no dedicated prep sheet.
Limits
There is no full beat grid, no phrase awareness (8/16/32-bar structure), and no hand-editable cues. Half-time / double-time feel and ambient openings can still miss. Results vary track to track. When in doubt, turn it off and you are back to the same fixed Crossfade documented on the Transitions page.
The short version
Beat matching stores where the groove starts and a phase anchor, optionally pulls the fade earlier on a clear soft outro, then seeks and nudges at Crossfade time — only on BPM lists, only when tempos match, only when you opt in. Cancel prep or flip the toggle and Crossfade behaves exactly as before.
→ Back to Transitions