Builder, upcoming page, mods page for the current mods

- builder.html: build C900NXS.UPD in the browser (official 1.31 update in,
  mods ticked with their dependencies, no-liability and Claude Code
  confirmations, download). Ports of upd.py, the LZSS packer and the mods'
  application; the result is checked against the SHA-256 the Python
  patcher gives and is byte for byte the patcher's file.
- builder/data.js from tools/make_builder_data.py: the mods' bytes per
  combination; firmware parts (UTILITY table, HOT KEYS box, the asset
  blob's resource table) are made from the user's own update.
- index.html: rgb_waveform, extended_bpm, phasemeter, cuecolours,
  hotcuekeys (experimental), ledsaver, credit; stable/experimental and a
  green "ran on a player" dot.
- upcoming.html: beat jump, stems, uniform Camelot / Open Key, 3-band
  waveform.
- docs.html: the builder, the new mod names, hot cue loading and locks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Thiemo TizianiandClaude Opus 5.5 committed 2026-10-19 00:21:47 +02:00
1 parent f931ca0423
commit e4728b16ea
12 files changed
+1347 -145

No files matched your search

+78 -72
View File
@@ -4,7 +4,7 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>CDJ-900NXS Mods Docs</title>
<meta name="description" content="How to install the CDJ-900NXS mods and how each one works, including the hot cue keys: play, gate, set and delete.">
<meta name="description" content="How to build and install the CDJ-900NXS mods and how each one works, including the hot cue keys: play, gate, set and delete.">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;800&family=JetBrains+Mono:wght@500;700&display=swap" rel="stylesheet">
@@ -18,6 +18,8 @@
<a class="brand" href="index.html"><span class="disc" aria-hidden="true"></span><span>CDJ-900NXS Mods</span></a>
<nav class="tabs" aria-label="Sections">
<a href="index.html">Mods</a>
<a href="builder.html">Builder</a>
<a href="upcoming.html">Upcoming</a>
<a href="docs.html" aria-current="page">Docs</a>
</nav>
<button class="theme-btn" type="button" aria-label="Switch light / dark">☀</button>
@@ -28,16 +30,19 @@
<nav class="toc" aria-label="On this page">
<div class="h">Start</div>
<a href="#install">Install</a>
<a href="#cli">Command line</a>
<a href="#stock">Back to stock</a>
<div class="h">Mods</div>
<a href="#code">code</a>
<a href="#utility">utility</a>
<a href="#overview">overview</a>
<a href="#rgb_waveform">rgb_waveform</a>
<a href="#extended_bpm">extended_bpm</a>
<a href="#phasemeter">phasemeter</a>
<a href="#cuecolours">cuecolours</a>
<a href="#hotcuekeys">hotcuekeys</a>
<a href="#beatjump">beatjump</a>
<a href="#ledsaver">ledsaver</a>
<a href="#credit">credit</a>
<div class="h">Hot cue keys</div>
<a href="#hk-mode">The hot key mode</a>
<a href="#hk-load">Loading</a>
<a href="#hk-play">Play a hot cue</a>
<a href="#hk-gate">Gate</a>
<a href="#hk-set">Set a hot cue</a>
@@ -45,60 +50,59 @@
<a href="#hk-leds">The LEDs</a>
<a href="#hk-limits">Good to know</a>
<div class="h">More</div>
<a href="#status">Test status</a>
<a href="#status">Status</a>
<a href="#faq">FAQ</a>
</nav>
<article class="prose">
<div class="eyebrow">Documentation</div>
<h1>Using the mods</h1>
<p>Everything you need to build the update, put it on your CDJ-900NXS and use each mod. The player must run the official firmware <strong>1.31</strong>; the patcher only accepts that update.</p>
<p>Everything you need to build the update, put it on your CDJ-900NXS and use each mod. The player must run the official firmware <strong>1.31</strong>; the builder only accepts that update.</p>
<!-- ===================== install ===================== -->
<h2 id="install">Install</h2>
<ol>
<li>Get the official <code>C900NXS.UPD</code> for firmware 1.31 from Pioneer DJ. The patcher checks its SHA-256 and refuses any other file.</li>
<li>Run the patcher with Python 3. Tick the mods with the arrow keys and <kbd>Space</kbd>, build with <kbd>Enter</kbd>.
<div class="term"><span class="p">$</span> python cdj900nxs_patcher.py C900NXS.UPD</div>
Ticking a mod also ticks what it needs (<code>utility</code> needs <code>code</code>, <code>hotcuekeys</code> needs <code>cuecolours</code>); unticking one unticks what depends on it (<code>beatjump</code> needs <code>hotcuekeys</code>). <code>credit</code> (ticked at the start) makes the boot screen say <em>Pionope Mods by Givou</em> where it said <em>Ver 1.31</em>; untick it to keep the stock text.
</li>
<li>Read the disclaimer and type <code>yes</code> to accept it. Nothing is built without it.</li>
<li>The new file is written to <code>out/&lt;date&gt;-&lt;mods&gt;/C900NXS.UPD</code>, with a <code>report.txt</code> listing every check.</li>
<li>Copy <code>C900NXS.UPD</code> to the root of a FAT32 USB stick and run the update from the player as you would for an official update.</li>
<li>Get the official <code>C900NXS.UPD</code> for firmware 1.31 from Pioneer DJ.</li>
<li>Open the <a href="builder.html">builder</a> and choose the file. It checks its SHA-256 and refuses any other file.</li>
<li>Tick the mods. Ticking a mod also ticks what it needs (<code>hotcuekeys</code> needs <code>cuecolours</code>); unticking one unticks what needs it.</li>
<li>Confirm the two points (no liability, code written with Claude Code) and build. Everything happens in your browser: nothing is uploaded, nothing is downloaded.</li>
<li>Download <code>C900NXS.UPD</code>, copy it to the root of a FAT32 USB stick and run the update from the player as you would for an official update.</li>
</ol>
<div class="callout"><strong>What the patcher guarantees.</strong> Only the main application is replaced. The boot loader and recovery loader (flash 0x0–0x3FFFF), the S-record header and entry record, and the DRIV and PANL sections are copied from the original byte for byte and checked again on the finished file. The file is labelled 1.32 so that the player does not skip it as the version it already has; the player still reports 1.31.</div>
<p>Without a terminal that can read single keys, name the mods instead and accept the disclaimer with <code>--accept</code>:</p>
<div class="term"><span class="p">$</span> python cdj900nxs_patcher.py C900NXS.UPD --mods code,utility,overview,cuecolours,hotcuekeys --accept</div>
<div class="callout"><strong>What the builder guarantees.</strong> Only the main application is replaced. The boot loader and recovery loader (flash 0x0–0x3FFFF), the S-record header and entry record, and the DRIV and PANL sections are copied from the original byte for byte and checked again on the finished file, which is also unpacked again and compared with the patched application. The patched application is checked against the SHA-256 of the one the Python patcher makes for the same mods, so the file is the same byte for byte. The file is labelled 1.32 so that the player does not skip it as the version it already has; the player still reports 1.31.</div>
<h2 id="cli">Command line</h2>
<p>The Python patcher builds exactly the same file, byte for byte. Tick the mods with the arrow keys and <kbd>Space</kbd>, build with <kbd>Enter</kbd>, accept the disclaimer by typing <code>yes</code>:</p>
<div class="term"><span class="p">$</span> python cdj900nxs_patcher.py C900NXS.UPD</div>
<p>Or name the mods and accept with <code>--accept</code>:</p>
<div class="term"><span class="p">$</span> python cdj900nxs_patcher.py C900NXS.UPD --mods rgb_waveform,extended_bpm,phasemeter,cuecolours,hotcuekeys,ledsaver,credit --accept</div>
<h2 id="stock">Back to stock</h2>
<p>Build the original application, relabelled so the player accepts it, and update as above:</p>
<div class="term"><span class="p">$</span> python cdj900nxs_patcher.py C900NXS.UPD --stock</div>
<p>Keep this file on a stick before you try any mod.</p>
<p>Build with no mod ticked in the builder (or <code>--stock</code> with the patcher): the original application, relabelled so the player accepts it. Update as above. Keep this file on a stick before you try any mod.</p>
<!-- ===================== mods ===================== -->
<h2 id="code">code <span class="badge author">arnoldasr</span></h2>
<p>Three display changes tested together as one build: the detail waveform in RGB colours, the BPM shown with two decimals (stacked beside the tempo) and a two-line phase meter.</p>
<h2 id="rgb_waveform">rgb_waveform <span class="badge author">arnoldasr</span></h2>
<p>The big waveform in RGB colours from the track's colour waveform data, and the overview's colour table as a red-to-white gradient.</p>
<figure class="shot"><img src="assets/detail-mods.png" alt="RGB detail waveform"><figcaption>RGB detail waveform.</figcaption></figure>
<h2 id="utility">utility <span class="badge author">arnoldasr</span></h2>
<p>UTILITY › SLIP FLASHING becomes <strong>PHASE METER</strong>; its value chooses which phase meter is shown. Needs <code>code</code>.</p>
<figure class="shot"><img src="assets/utility-phase.png" alt="UTILITY with PHASE METER"><figcaption>UTILITY › PHASE METER.</figcaption></figure>
<h2 id="extended_bpm">extended_bpm <span class="badge author">arnoldasr</span></h2>
<p>The BPM to two decimals: the tenths as a small digit above, the hundredths in the place of the stock decimal.</p>
<h2 id="overview">overview <span class="badge author">arnoldasr</span></h2>
<p>The overview waveform's colour table becomes a red-to-white gradient. Data only, no code.</p>
<h2 id="phasemeter">phasemeter <span class="badge author">arnoldasr</span></h2>
<p>A two-line phase meter instead of the four boxes: orange for the master, blue for this deck, each with a marker. UTILITY › SLIP FLASHING becomes <strong>PHASE METER</strong>: ON shows the lines, OFF the stock boxes. The orange marker needs another player as tempo master.</p>
<figure class="shot"><img src="assets/utility-phase.png" alt="UTILITY with PHASE METER"><figcaption>UTILITY › PHASE METER.</figcaption></figure>
<h2 id="cuecolours">cuecolours <span class="badge author">ours</span></h2>
<p>When a track is loaded the player asks its database for the cues. This mod also asks for the extended cue list (the one newer players read from rekordbox's export), which carries the colours and the hot cues.</p>
<ul>
<li><strong>Memory cues</strong> are drawn in the colour set in rekordbox, on the overview and on the detail waveform. A memory cue without a colour, or one stored on the player, stays red.</li>
<li><strong>Hot cues A–H</strong> are drawn as small boxes with their letter, in their rekordbox colour (green when none was set).</li>
<li><strong>Memory cues</strong> are drawn in the colour set in rekordbox, on the overview and on the big waveform. A memory cue without a colour, or one stored on the player, stays red.</li>
<li><strong>Hot cues A–H</strong> are drawn as small boxes with their letter, in their rekordbox colour.</li>
</ul>
<figure class="shot"><img src="assets/hotcue-overview.png" alt="Overview with coloured memory cues and hot cues A to F"><figcaption>Coloured memory cues and hot cues A–F on the overview.</figcaption></figure>
<!-- ===================== hot cue keys ===================== -->
<h2 id="hotcuekeys">hotcuekeys <span class="badge author">ours</span></h2>
<h2 id="hotcuekeys">hotcuekeys <span class="badge author">ours</span> <span class="state experimental">experimental</span></h2>
<p>The CDJ-900NXS has no hot cue pads. This mod lends it three: the top three <strong>BEAT DIVIDE</strong> keys left of the jog. It needs <code>cuecolours</code>, which reads the hot cues from your USB.</p>
<figure class="shot"><img src="assets/utility-hotcue.png" alt="UTILITY with HOT CUE KEYS"><figcaption>UTILITY › HOT CUE KEYS, the new last item.</figcaption></figure>
<figure class="shot"><img src="assets/utility-hotcue.png" alt="UTILITY with HOT CUE KEYS"><figcaption>UTILITY › HOT CUE KEYS.</figcaption></figure>
<h3 id="hk-mode">The hot key mode</h3>
<ol>
@@ -115,14 +119,22 @@
<div><div class="b">–</div><div class="f">1/4</div></div>
<div><div class="b">–</div><div class="f">1/8</div></div>
</div>
<p>1/4 and 1/8 do nothing in the mode and stay dark: the player has three hot cue buffers, and A–C keep them, so each of the three starts at once.</p>
<p>With the mode off, or HOT CUE KEYS set to OFF, the keys do what they always did.</p>
<p>1/4 and 1/8 do nothing in the mode and stay dark: the player has three hot cue buffers, and A–C keep them. With the mode off, or HOT CUE KEYS set to OFF, the keys do what they always did.</p>
<h3 id="hk-load">Loading</h3>
<p>After a track is loaded and the deck stands at its CUE point, hot cues A, B and C are buffered one after another, about a second each, like the CDJ-2000NXS does. Meanwhile:</p>
<ul>
<li>the big waveform stays black and appears once all are ready;</li>
<li><kbd>PLAY</kbd>, <kbd>CUE</kbd> and the hot cue keys are locked, so nothing interrupts the loading;</li>
<li>the key of the hot cue being loaded blinks.</li>
</ul>
<p>Then the deck stands at its CUE point again, as before, and each of the three starts at once. This happens whether the hot key mode is on or not, as long as HOT CUE KEYS is ON.</p>
<h3 id="hk-play">Play a hot cue</h3>
<p>Press the key <strong>briefly</strong>. The deck jumps to the hot cue and plays — also when it was paused.</p>
<p>Press the key <strong>briefly</strong>. The deck jumps to the hot cue and plays — also from a pause, in CDJ and in VINYL mode.</p>
<h3 id="hk-gate">Gate</h3>
<p>Press the key and <strong>keep holding it</strong>. The deck jumps and starts playing at once, exactly as with a short press; nothing waits. When you let go:</p>
<p>Press the key and <strong>keep holding it</strong>. The deck jumps and starts playing at once, exactly as with a short press. When you let go:</p>
<ul>
<li>held <strong>less than 0.5 s</strong>: it simply plays on (a normal hot cue);</li>
<li>held <strong>0.5 s or longer</strong>: it jumps back to the hot cue and stands there, ready to go again.</li>
@@ -132,7 +144,8 @@
<p>On a key <strong>without</strong> a hot cue (LED off):</p>
<ol>
<li>Pause the deck at the place you want.</li>
<li>Hold the key for <strong>0.8 s</strong>. The hot cue is set there in green, its LED blinks twice and then stays dim, and the box appears on the waveforms.</li>
<li>Hold the key for <strong>0.8 s</strong>. The hot cue is set there — A in green, B in orange, C in blue — its LED blinks twice and then stays dim, and the box appears on the waveforms.</li>
<li>It is buffered at once, so it starts instantly from the first press. The deck then stands at the new hot cue; PLAY plays from there.</li>
</ol>
<p>Keys that already have a hot cue are not overwritten — delete the old one first.</p>
@@ -149,68 +162,61 @@
<div class="leds">
<span class="led"><i></i> off — no hot cue</span>
<span class="led"><i class="dim"></i> dim — hot cue there</span>
<span class="led"><i class="blink"></i> two bright blinks — pressed, set or deleted</span>
<span class="led"><i class="blink"></i> blinking — pressed, set, deleted or being loaded</span>
</div>
<h3 id="hk-limits">Good to know</h3>
<ul>
<li><strong>Set and deleted hot cues are saved on the USB stick</strong>, in the track's rekordbox analysis files, the same way MEMORY and DELETE keep memory cues. Like MEMORY, this works once the track has settled, a few seconds after loading.</li>
<li><strong>A–C start at once.</strong> After a track is loaded, once the deck stands at its CUE point for a second in the hot key mode, hot cues A, B and C are loaded silently into the player's three hot cue buffers (about three seconds) and the deck goes back to its CUE point. If you press PLAY or CUE meanwhile, it waits for that (PLAY then plays); a hot cue key pressed meanwhile cuts it short and plays.</li>
<li>A hot cue you set later loads into its own buffer on its first press (about a second) and starts at once after that.</li>
<li>Hot cues D–H from rekordbox are shown on the waveforms but have no key.</li>
<li><strong>Set and deleted hot cues are saved on the USB stick</strong>, in the track's rekordbox analysis files with their colours, the same way MEMORY and DELETE keep memory cues; the player shows <em>MEMORY</em> for each. Like MEMORY, this works once the track has settled. Let the last one finish before you load the next track.</li>
<li>A hot cue played from a buffer leaves the <strong>CUE point</strong> where it is. A gate's release stands at the hot cue; PLAY then plays from there.</li>
<li>A key pressed while a hot cue is still loading waits for it (the last key pressed wins).</li>
<li>Hot cues D–H from rekordbox are shown on the waveforms but have no key.</li>
<li>No slip hot cues yet: with SLIP on, a hot cue plays as without SLIP.</li>
</ul>
<h2 id="beatjump">beatjump <span class="badge emu">emulator only</span></h2>
<p>With UTILITY › BEAT JUMP set to 1, 2, 4 or 8 (the item replaces SCREEN SAVER; the screen saver stays on), TRACK SEARCH <kbd>⏮</kbd> <kbd>⏭</kbd> jumps that many beats back or forward along the beat grid, keeping the position within the beat. OFF restores TRACK SEARCH.</p>
<ul>
<li><strong>While playing</strong>, the jump target is loaded into a buffer of the player that only beat jumps use, so hot cues A–C stay ready. There is a short silence while it loads, but the deck comes back <strong>in phase</strong>, as if it had played on through the jump: the load time is measured on every jump and allowed for, at the deck's tempo. The CUE point stays.</li>
<li><strong>Paused</strong>, the jump is a CALL: the deck and its CUE point move by that many beats.</li>
<li>A press while a jump or a hot cue is still loading is ignored, so loads never overlap.</li>
<li>A jump while a loop plays ends the loop; LOOP IN / OUT work again right after a jump.</li>
<li>Needs <code>hotcuekeys</code> (its engine makes the jumps); the HOT CUE KEYS item may stay OFF.</li>
</ul>
<div class="callout">Rebuilt: the first version jumped off the grid on a player and, after quick presses, reported a corrupted file. The new one has only run in the emulator so far; please report how it behaves on a player.</div>
<!-- ===================== status ===================== -->
<h2 id="ledsaver">ledsaver <span class="badge emu">emulator only</span></h2>
<p>UTILITY › <strong>LED ANIMATION</strong> (the last item) is <strong>ON</strong> from the first start; set it to OFF to switch it off (the player keeps the choice). When the player's own screen saver dims the display (5 minutes without a track loaded, or 100 minutes paused or at the cue), the LEDs play a loop of about three seconds:</p>
<h2 id="ledsaver">ledsaver <span class="badge author">ours</span></h2>
<p>UTILITY › <strong>LED ANIMATION</strong> (the last item) is <strong>ON</strong> from the first start; set it to OFF to switch it off (the player keeps the choice). When the player's own screen saver dims the display (5 minutes without a track loaded, or 100 minutes paused or at the cue), the LEDs play a loop of about four and a half seconds:</p>
<ul>
<li>the BEAT DIVIDE keys fade in a wave from top to bottom and back up,</li>
<li>SYNC and MASTER, MASTER TEMPO and DISC EJECT fade in and out against each other,</li>
<li>CUE, PLAY, REV, SLIP, the SLIP LOOP bar and RELOOP/EXIT light one after another,</li>
<li>the jog's three rings light in turn: inner, middle, outer, middle, inner …</li>
</ul>
<p>Any key ends it, as it ends the screen saver. The keys without levels (CUE, PLAY …) can only switch on and off; the rings too.</p>
<p>Any key ends it, as it ends the screen saver.</p>
<h2 id="status">Test status</h2>
<h2 id="credit">credit <span class="badge author">ours</span></h2>
<p>The boot screen says <em>Pionaarr Mods 1.0</em> where it said <em>Ver 1.31</em>. Ticked at the start; untick it to keep the stock text. UTILITY and the LINK screen still show the real version, 1.31.</p>
<figure class="shot"><img src="assets/boot-mods.png" alt="Boot screen with Pionaarr Mods 1.0"><figcaption>The boot screen.</figcaption></figure>
<p>Beat jump, stems, a uniform key notation and a 3-band waveform are in the works: see <a href="upcoming.html">Upcoming</a>.</p>
<!-- ===================== status ===================== -->
<h2 id="status">Status</h2>
<div class="table-wrap">
<table>
<thead><tr><th>Mod</th><th>By</th><th>Status</th></tr></thead>
<thead><tr><th>Mod</th><th>By</th><th>Status</th><th>Player</th></tr></thead>
<tbody>
<tr><td><code>code</code></td><td>arnoldasr</td><td><span class="badge ok">ran on a player</span></td></tr>
<tr><td><code>utility</code></td><td>arnoldasr</td><td><span class="badge ok">ran on a player</span></td></tr>
<tr><td><code>overview</code></td><td>arnoldasr</td><td><span class="badge ok">ran on a player</span></td></tr>
<tr><td><code>cuecolours</code></td><td>ours</td><td><span class="badge ok">ran on a player</span></td></tr>
<tr><td><code>hotcuekeys</code></td><td>ours</td><td><span class="badge warn">partly tested</span> mode, HOT KEYS box and LEDs on a player; the hot cue buffers (A–C at once), gate, set and delete in the emulator</td></tr>
<tr><td><code>beatjump</code></td><td>ours</td><td><span class="badge emu">emulator only</span> rebuilt on the hot cue engine</td></tr>
<tr><td><code>ledsaver</code></td><td>ours</td><td><span class="badge emu">emulator only</span> LED map from the LED tests on a player</td></tr>
<tr><td><code>credit</code></td><td>ours</td><td><span class="badge emu">emulator only</span> boot screen text (ticked at the start, can be unticked)</td></tr>
<tr><td><code>rgb_waveform</code></td><td>arnoldasr</td><td><span class="state stable">stable</span></td><td><span class="player">ran on a player</span></td></tr>
<tr><td><code>extended_bpm</code></td><td>arnoldasr</td><td><span class="state stable">stable</span></td><td><span class="player">ran on a player</span></td></tr>
<tr><td><code>phasemeter</code></td><td>arnoldasr</td><td><span class="state stable">stable</span></td><td><span class="player">ran on a player</span></td></tr>
<tr><td><code>cuecolours</code></td><td>ours</td><td><span class="state stable">stable</span></td><td><span class="player">ran on a player</span></td></tr>
<tr><td><code>hotcuekeys</code></td><td>ours</td><td><span class="state experimental">experimental</span></td><td><span class="player">ran on a player</span></td></tr>
<tr><td><code>ledsaver</code></td><td>ours</td><td><span class="state stable">stable</span></td><td><span class="player">ran on a player</span></td></tr>
<tr><td><code>credit</code></td><td>ours</td><td><span class="state stable">stable</span></td><td><span class="player">ran on a player</span></td></tr>
</tbody>
</table>
</div>
<h2 id="faq">FAQ</h2>
<h3>Does this touch the boot loader?</h3>
<p>No. The patcher copies the boot loader and recovery loader from the official file byte for byte and checks them again before writing. Only the main application changes.</p>
<p>No. The builder copies the boot loader and recovery loader from the official file byte for byte and checks them again before you can download it. Only the main application changes.</p>
<h3>Is my firmware uploaded anywhere?</h3>
<p>No. The builder runs entirely in your browser; everything it needs comes with the page.</p>
<h3>Can I go back?</h3>
<p>Yes, build <code>--stock</code> and run the update. Keep that file ready before flashing mods.</p>
<p>Yes, build with no mod ticked (or <code>--stock</code>) and run the update. Keep that file ready before flashing mods.</p>
<h3>Do I need rekordbox?</h3>
<p>Cue colours and hot cues come from a USB stick exported with rekordbox. Without them the mods show what the stock player shows.</p>
<h3>Why is the version still 1.31?</h3>
<p>The update file says 1.32 so the player installs it; the application inside still reports 1.31 (in UTILITY and on the LINK screen). Only the boot screen says <em>Pionope Mods by Givou</em> instead of <em>Ver 1.31</em>.</p>
<p>The update file says 1.32 so the player installs it; the application inside still reports 1.31 (in UTILITY and on the LINK screen). Only the boot screen says <em>Pionaarr Mods 1.0</em> instead of <em>Ver 1.31</em>.</p>
</article>
</main>
@@ -218,7 +224,7 @@
<div class="wrap cols">
<div>
<div class="ai"><span class="dot"></span>Made with Claude Code · Claude Opus 5.5</div>
<p>This website, the mods <code>beatjump</code>, <code>cuecolours</code> and <code>hotcuekeys</code>, and the patcher were developed with Claude Code (Anthropic's AI coding assistant, model Claude Opus 5.5), by reverse engineering the firmware in an emulator. The mods <code>code</code>, <code>utility</code> and <code>overview</code> are by <a href="https://github.com/arnoldasr/cdj900nxs">arnoldasr</a>.</p>
<p>This website, the builder, the mods <code>cuecolours</code>, <code>hotcuekeys</code>, <code>ledsaver</code> and <code>credit</code>, and the patcher were developed with Claude Code (Anthropic's AI coding assistant, model Claude Opus 5.5), by reverse engineering the firmware in an emulator. The mods <code>rgb_waveform</code>, <code>extended_bpm</code> and <code>phasemeter</code> are by <a href="https://github.com/arnoldasr/cdj900nxs">arnoldasr</a>.</p>
</div>
<div>
<h4>Disclaimer</h4>