A tiny Windows hotkey utility for Serato DJ Pro that automates the tedious button-clicking sequence when you're fixing a misaligned beatgrid.
SoundCloud and other streaming tracks often load with misaligned beatgrids in Serato — sometimes off by a beat, sometimes off by a full bar, sometimes just plain wrong. The manual workflow is mind-numbing:
- Find the first kick (by ear or eye)
- Seek/play to that position
- Edit Grid → Clear → Set → Save
- Set Hot Cue 1
- Load the next track
- Repeat for 50+ tracks 😫
You handle the hard part — finding the kick. This tool handles the click-soup.
Problem solved: ripped through 250+ tracks before I finished a beer 🍺
Press ~ (the backtick/tilde key) at the position where you want the grid set, and the tool runs:
Edit Grid → Clear → Set → Save → Hot Cue 1 → load next track
That's the entire app. One key, one shot.
Still image: Screenshot
# 1. Install dependencies
pip install -r requirements.txt
# 2. Calibrate the four grid-edit button positions in your Serato layout
python calibrate_buttons.py
# 3. Run it
python grid_fixer.pyOr just double-click launch_grid_fixer.cmd (and launch_calibrator.cmd for recalibration).
- Open Serato DJ Pro and load a track on the left deck.
- Run
grid_fixer.py. - Seek or play to the exact point where you want the grid anchored (typically the first kick).
- Press ~. The tool clicks Edit Grid → Clear → Set → Save, sets Hot Cue 1, then loads the next track in your library.
- Repeat for the next track.
- Press F12 to exit.
Mouse failsafe: slam your mouse into the top-left corner of the screen to abort whatever pyautogui is doing.
Sort your library/crate by track number in descending order before you start. New tracks land at the top, so as the tool auto-advances with each ~ press you're always working on tracks that haven't been gridded yet. Otherwise you'll start clobbering tracks you've already set up.
Most tracks are already basically correct. For those, you can still press ~ at the right spot and let the tool run anyway. The beatgrid stays correct, but you still get the useful side effects: Hot Cue 1 gets dropped at the anchor point, the next track loads, and the library cursor advances.
That turns the whole process into a beatgrid conveyor belt: listen, confirm, tap ~, move on.
config.json stores the on-screen pixel coordinates of four buttons in the Serato Beatgrid Edit panel:
"grid_edit": {
"edit_grid": [x, y],
"clear": [x, y],
"set": [x, y],
"save": [x, y]
}Run python calibrate_buttons.py (or double-click launch_calibrator.cmd) and click each button when prompted. Coordinates are saved to config.json immediately after each click, so you can ctrl-C out partway through without losing what you've already done.
You'll need to recalibrate any time the Serato layout changes — for example, if you resize/move the window, switch monitors or DPI scaling, or plug in (or unplug) a DJ controller, since Serato shifts the layout to add deck/mixer panels when a controller is connected. Calibrate against the layout you actually use day-to-day (most likely: controller plugged in).
keyboardlistens for the global ~ hotkey.pyautoguiclicks the four button coordinates fromconfig.jsonin sequence.- A few
keyboard.sendcalls fire Ctrl+1 (Hot Cue 1) and Alt+W (Serato's "load next track" shortcut), then ↓ to advance the library cursor so the next press works on the right track.
The hot cue is set at the exact same position as the grid anchor — useful as a "go back to where I started this track" reference if you don't beat-jump back to bar 1.
- Windows (the
keyboardlibrary needs admin-style hooks; macOS isn't supported here) - Python 3.10+
- Serato DJ Pro
- A standard left-deck layout (the Hot Cue 1 hotkey assumes left deck)
- Left deck only. Hot Cue 1 binds to Ctrl+1 on the left deck; the right deck would need Ctrl+6.
- Layout-dependent. Calibrated coordinates break if you resize the Serato window or move the Beatgrid Edit panel. Recalibrate when that happens.
- No undo. If the wrong grid gets set, fix it in Serato manually.
MIT — see LICENSE.
