Updated October 2026. Written by the Algosyntax team.
Quick answer: a rhythm game is five parts working together:
- A song you have the rights to use.
- A chart: which lane each note is in and when it lands. A MIDI file is the easiest way to make one.
- A clock that follows the audio, not the frame rate, so notes never drift from the song.
- Judging: compare each press with the nearest note’s time and score it.
- A timing offset players can adjust, so hits feel right on their speakers or headphones.
Build them in that order and you have a playable prototype.
Part 1: The song
Use music you made, commissioned, or licensed for a game you sell. Our music and sound on a budget guide covers where to get it. For your first level, pick a song with a steady tempo: tempo changes are harder to chart and to keep in sync.
Part 2: The chart
| Format | Good for | Watch out for |
|---|---|---|
| MIDI file | Writing charts in any music app, one track per difficulty | Unreal needs a plugin to turn it into gameplay notes |
| Data Table or JSON | Full control, easy to read in Blueprint | You type times by hand or build an editor |
| Recording presses while the song plays | A fast first draft | Human timing is loose, so you’ll clean it up |
MIDI suits most teams: musicians already work in it, and fixing a late note is a drag on a piano roll.
Part 3: Keep notes in time with the music
This is where most first attempts go wrong. If you move notes by adding up Delta Seconds, they slowly drift from the song, and a hitch or pause knocks them out completely.
Instead, read the song’s current playback time every frame and place each note from it:
- Note position = hit line − (note time − song time) × scroll speed.
- Spawn each note a fixed time before it’s due (say 2 seconds) so it can travel down the lane.
- Pause the audio and the notes stop with it, because they read the same clock.
In Unreal, the built-in Harmonix plugin’s Music Clock component gives you that time, and Quartz schedules sounds on the beat.
Part 4: Judge each press
When the player presses a lane, find the nearest unhit note in that lane and measure how far off the press was:
| How far off | Result |
|---|---|
| Up to 45 ms | Perfect |
| Up to 90 ms | Great |
| Up to 135 ms | Good |
| More | Miss, or ignore the press |
These are a good starting point (they’re MIDI Engine’s defaults). Widen them for a casual game. Measure in time, not distance, so they feel the same at every scroll speed. For hold notes, judge the start and check the key is still down at the end.
Part 5: Let players fix latency
Every setup has a delay between the game playing a sound and the player hearing it, and Bluetooth headphones are the worst. Add a timing offset setting in milliseconds that shifts every judgement. For calibration, play a steady beat, have the player tap along, and use their average error.
Build it or use a plugin?
A one-lane prototype is a good weekend project, and you’ll learn a lot. The time goes into what comes after: drift-free sync, hold notes, difficulty levels, tools for fixing charts, and packaged builds on every platform you ship.
If building the system is the fun part, build it. If you’d rather spend those months on levels and feel, a plugin pays off. Our build or buy guide has a two-minute cost check.
This is what we did in our MIDI Engine 4 PRO plugin.
FAQ
Can I make a rhythm game with Blueprints only?
Yes. The timing maths is simple and Blueprint handles it fine. Reading MIDI files is the part that needs a plugin or C++.
Can players import their own songs?
Only if your game can read song files at runtime. Plan for it early, because it changes how you store charts.