Files
CDJ900NXS-Patcher/README.md
T
Thiemo TizianiandClaude Opus 5.5 cfa0e85854 Added the CDJ-900NXS firmware patcher.
Takes the official C900NXS.UPD (1.31, checked by SHA-256), lets you choose
mods in a list (arrows, space, enter; numbers where the terminal cannot pass
keys), patches the application with the emulator checkout's
mods/patch_cdj900nxs.py, packs it and writes a new C900NXS.UPD labelled 1.32.

Only the application is replaced: the boot loader and recovery records,
MAIN's S0/S7 records, DRIV and PANL are copied byte for byte and checked again
on the finished file, which is also unpacked the boot loader's way and
compared with the patched application. --stock differs from the official file
in the version label and its CRC only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 19:05:49 +02:00

3.3 KiB

CDJ-900NXS firmware patcher

Builds a new C900NXS.UPD from the official CDJ-900NXS firmware 1.31 with the mods you choose, for the player's own USB update.

python cdj900nxs_patcher.py C900NXS.UPD                  # choose in a list
python cdj900nxs_patcher.py C900NXS.UPD --mods beatjump,cuecolours,hotcuekeys
python cdj900nxs_patcher.py C900NXS.UPD --stock          # the original, to go back
python cdj900nxs_patcher.py --list

In the list: arrow keys move, space ticks or unticks, a ticks all or none, enter builds, q quits. Terminals that cannot pass single keys (Git Bash's mintty, a pipe) get a numbered list instead. The result goes to out/<date>-<mods>/C900NXS.UPD with a report.txt of every check.

What it guarantees

  • Only the original file is accepted: SHA-256 e96bca7d1ac983985992a8e5fa7813e1ebf04bef514e0c6cfd0a8375f667f7f9, and the 1.31 application inside it is checked too.
  • Only the main application is replaced. The boot loader and recovery loader (MAIN's records below flash 0x40000), MAIN's S0 header and S7 entry records, and the DRIV and PANL sections are copied from the original byte for byte. Before anything is written the finished file is read back and checked: every section CRC and S-record checksum; DRIV and PANL equal to the original; MAIN's header equal but for its version label, application-only mode kept; every boot loader and recovery record and byte equal; no record past 0x7E0000; the packed application's checksum; and the application, unpacked the way the boot loader does it, equal to the patched one.
  • Labelled 1.32, so that the player's updater does not skip the update as the version it already has. The application still reports 1.31 (as arnoldasr's builds do). --stock gives the original firmware with only that label changed: three bytes differ from the official file (the digit and the section CRC), exactly as arnoldasr's back-to-stock file, which installed on his test player.

Checked in the emulator: both the --stock file and one with every mod were written into an emulated flash and booted through Pioneer's own boot loader, which unpacked and started them.

Mods

From the emulator checkout ../CDJ900NXSVirtual (--repo for another place): mods/patch_cdj900nxs.py and the mods next to it.

mod what it does
code arnoldasr: BPM with two decimals, two-line phase meter, RGB waveform
utility arnoldasr: UTILITY > PHASE METER switch (needs code)
overview arnoldasr: overview waveform colour gradient
beatjump TRACK SEARCH jumps 1/2/4/8 beats, UTILITY > BEAT JUMP
cuecolours memory cues in their rekordbox colours, hot cues shown
hotcuekeys UTILITY > HOT CUE KEYS; QUANTIZE short = hot key mode

arnoldasr's mods need his repository checked out in ../CDJ900NXSVirtual/mods/cdj900nxs/upstream (it has no licence, so it is not copied here); without it they are greyed out.

Risk

Nothing here talks to a player; you copy the file to a FAT32 USB stick and run the update yourself. Our mods have only run in the emulator. Recovery from an application that crashes at start-up has not been tested by anyone. Keep the --stock file at hand.

Tests

CDJ900NXS_UPD=/path/to/C900NXS.UPD python -m pytest test_patcher.py