redline-v1
AI timing for osu! โ a 45M-parameter frame-level model that turns raw audio into osu! timing (redlines: BPM / offset / meter), built for the songs that are hard to time by hand: live drummers, metal, rubato, accelerandos. Output is a starting point to verify by ear.
Code and solver: https://github.com/Tiger14n/Redline
Model
Encoder-only transformer (rotary attention, conv frontend over log-mel + onset flux), per-frame outputs at 50 fps:
| head | output |
|---|---|
| beat | beat-here logit |
| down | downbeat (measure start) logit |
| off | sub-frame offset (recovers ~2-5 ms precision from 20 ms frames) |
| tempo | BPM-bin logits (per-frame tempo curve) |
| change | major (audible) tempo/meter change logit |
| red | notation logit โ where a human mapper writes a redline, including convention re-anchors |
d_model 512, depth 14, 8 heads, FFN 2048. Trained on ranked osu! beatmaps (three-stage lineage; configs in the repo) on a single RTX 3080.
Results (held-out data)
Model heads, 400 held-out mapsets: beat F1 0.955, downbeat F1 0.892 (frame-level, ยฑ40 ms), offset MAE 4.7 ms.
End-to-end (audio โ redlines, 366 held-out ranked mapsets, ~50+ per genre, scored against the ranked map's human timing):
| genre | beats within 10 ms (avg) | typical (median) map |
|---|---|---|
| Pop (55) | 88.6 % | 96.5 % |
| Metal (48) | 88.1 % | 95.7 % |
| Rock (51) | 86.7 % | 94.4 % |
| Electronic (49) | 84.2 % | 97.1 % |
| Video game (54) | 82.8 % | 97.0 % |
| Anime (55) | 79.7 % | 95.0 % |
| other (54) | 80.2 % | 93.2 % |
| all (366) | 84.2 % | 96.0 % |
The typical song comes out essentially on-grid (median 93โ97 % in every genre); a hard minority (live/rubato, quiet audio) needs hand-finishing. Songs whose human timing is a single redline get a median of exactly 1 redline. Full tables, redline-placement metrics and methodology in the repo README.
Usage
pip install -r requirements.txt # from the repo
hf download Tiger14n/redline-v1 redline-v1.pt --local-dir models/
python -m redline.generate_timing song.mp3 --osz
The checkpoint contains model (state dict) and args (data representation + architecture),
which redline.infer.Model2Beats uses to reconstruct the exact training-time pipeline.