I work on FightNome. This post is about a feature of our own app.
FightNome calls strikes out loud while you shadowbox or work pads. You hear "jab", you throw a jab. For that to feel right, the word has to land on the beat itself. Here's how we think about that problem, in plain terms.
The beat grid
Everything hangs off the tempo. One beat lasts 60000 / BPM milliseconds. Our workouts run from 74 to 128 BPM, so the spacing between beats changes a lot:
BPM Beat length
74 about 811 ms
90 about 667 ms
128 about 469 ms
The music bed is a single track recorded at 90 BPM. It gets time-stretched to whatever tempo a section uses, so the grid and the music always agree.
One word, one file
Every callout is a separate recording of a person saying one word: jab, cross, hook, upper, body, teep, slip, roll and so on. There are 42 of them in the iOS project at the moment. It's a real voice, not text to speech.
One word per file keeps the model simple.…