251 lines
14 KiB
HTML
251 lines
14 KiB
HTML
<!doctype html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
<title>CDJ-900NXS Mods</title>
|
||
<meta name="description" content="Firmware mods for the Pioneer CDJ-900NXS (firmware 1.31): RGB waveform, cue colours, hot cues on the beat divide keys and more — compared with stock.">
|
||
<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">
|
||
<link rel="stylesheet" href="style.css">
|
||
<script src="script.js"></script>
|
||
</head>
|
||
<body>
|
||
|
||
<header class="top">
|
||
<div class="wrap">
|
||
<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" aria-current="page">Mods</a>
|
||
<a href="docs.html">Docs</a>
|
||
</nav>
|
||
<button class="theme-btn" type="button" aria-label="Switch light / dark">☀</button>
|
||
</div>
|
||
</header>
|
||
|
||
<main>
|
||
<div class="hero">
|
||
<div class="wrap">
|
||
<div class="eyebrow">Pioneer CDJ-900NXS · firmware 1.31</div>
|
||
<h1>New tricks for an <span class="grad">old favourite</span>.</h1>
|
||
<p class="lead">
|
||
A set of firmware mods that bring features of newer players to the CDJ-900NXS:
|
||
an RGB waveform, rekordbox cue colours, visible hot cues and
|
||
<strong>hot cues you can play from the deck itself</strong>. Built into the player's own
|
||
update file by a patcher that leaves the boot loader untouched.
|
||
</p>
|
||
<div class="cta">
|
||
<a class="btn primary" href="#mods">See the mods</a>
|
||
<a class="btn" href="docs.html#install">How to install</a>
|
||
<a class="btn" href="docs.html#hotcuekeys">Hot cue guide</a>
|
||
</div>
|
||
|
||
<div class="compare" style="--pos:50%">
|
||
<img src="assets/stock-full.png" alt="Stock CDJ-900NXS screen: blue waveform, red memory cues, no hot cues">
|
||
<img class="after" src="assets/mods-full.png" alt="Modded screen: RGB waveform, coloured cues, hot cues A to F, HOT KEYS box">
|
||
<span class="tag l">Stock 1.31</span>
|
||
<span class="tag r">Modded</span>
|
||
<span class="handle" aria-hidden="true"></span>
|
||
<input type="range" min="0" max="100" value="50" aria-label="Drag to compare stock and modded screen">
|
||
</div>
|
||
<div class="caption">Same track, same position (2:13 into “Webra – Jumbled”). Drag to compare. Screens taken in the CDJ-900NXS emulator the mods were developed in.</div>
|
||
</div>
|
||
</div>
|
||
|
||
<section>
|
||
<div class="wrap">
|
||
<div class="strip">
|
||
<div class="tile"><div class="n">6</div><div class="t">mods, pick the ones you want</div></div>
|
||
<div class="tile"><div class="n">A–C</div><div class="t">hot cues on the BEAT DIVIDE keys, at once</div></div>
|
||
<div class="tile"><div class="n">0 bytes</div><div class="t">changed in the boot loader and recovery</div></div>
|
||
<div class="tile"><div class="n">1 file</div><div class="t">a normal <code>C900NXS.UPD</code> for the player's USB update</div></div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<section id="mods">
|
||
<div class="wrap">
|
||
<h2 class="section-title">The mods</h2>
|
||
<p class="section-sub">Each one compared with stock. Three are by <a href="https://github.com/arnoldasr/cdj900nxs">arnoldasr</a>, three are ours. Choose any combination in the patcher.</p>
|
||
<div class="legend">
|
||
<span class="badge ok">ran on a player</span>
|
||
<span class="badge emu">emulator only</span>
|
||
<span class="badge warn">partly tested</span>
|
||
<span class="badge bad">known faults</span>
|
||
</div>
|
||
|
||
<div class="grid">
|
||
|
||
<!-- code -->
|
||
<article class="card">
|
||
<div class="card-head">
|
||
<div class="icon" aria-hidden="true">🌈</div>
|
||
<div>
|
||
<h3>RGB waveform, BPM & phase meter <code>code</code></h3>
|
||
<div class="by">by arnoldasr</div>
|
||
</div>
|
||
<div class="badges"><span class="badge ok">ran on a player</span></div>
|
||
</div>
|
||
<p>The detail waveform in RGB colours, as on newer Pioneer players, instead of plain blue. Plus the BPM with two decimals and a two-line phase meter.</p>
|
||
<div class="vs">
|
||
<figure><img src="assets/detail-stock.png" alt="Stock blue detail waveform"><figcaption>Stock</figcaption></figure>
|
||
<figure class="mod"><img src="assets/detail-mods.png" alt="RGB detail waveform"><figcaption>Modded</figcaption></figure>
|
||
</div>
|
||
<div class="vs">
|
||
<figure><img src="assets/bpm-stock.png" alt="Stock BPM 145.0"><figcaption>BPM · stock</figcaption></figure>
|
||
<figure class="mod"><img src="assets/bpm-mods.png" alt="BPM with two decimals"><figcaption>BPM · two decimals</figcaption></figure>
|
||
</div>
|
||
<ul class="diff">
|
||
<li><span class="k">Stock</span><span>Blue waveform, BPM to one decimal, phase meter as four boxes.</span></li>
|
||
<li><span class="k new">Modded</span><span>RGB waveform, BPM to two decimals (stacked), phase meter on two lines.</span></li>
|
||
</ul>
|
||
</article>
|
||
|
||
<!-- utility -->
|
||
<article class="card">
|
||
<div class="card-head">
|
||
<div class="icon" aria-hidden="true">🎚️</div>
|
||
<div>
|
||
<h3>Phase meter switch <code>utility</code></h3>
|
||
<div class="by">by arnoldasr · needs <code>code</code></div>
|
||
</div>
|
||
<div class="badges"><span class="badge ok">ran on a player</span></div>
|
||
</div>
|
||
<p>Choose the phase meter in UTILITY. The rarely used SLIP FLASHING item becomes PHASE METER.</p>
|
||
<div class="vs">
|
||
<figure><img src="assets/phase-stock.png" alt="Stock phase meter: four boxes"><figcaption>Phase meter · stock</figcaption></figure>
|
||
<figure class="mod"><img src="assets/phase-mods.png" alt="Two-line phase meter"><figcaption>Phase meter · two lines</figcaption></figure>
|
||
</div>
|
||
<div class="vs stack">
|
||
<figure class="mod"><img src="assets/utility-phase.png" alt="UTILITY menu with PHASE METER item"><figcaption>UTILITY › PHASE METER</figcaption></figure>
|
||
</div>
|
||
<ul class="diff">
|
||
<li><span class="k">Stock</span><span>UTILITY › SLIP FLASHING.</span></li>
|
||
<li><span class="k new">Modded</span><span>UTILITY › PHASE METER picks the meter.</span></li>
|
||
</ul>
|
||
</article>
|
||
|
||
<!-- overview -->
|
||
<article class="card">
|
||
<div class="card-head">
|
||
<div class="icon" aria-hidden="true">🔥</div>
|
||
<div>
|
||
<h3>Overview colour gradient <code>overview</code></h3>
|
||
<div class="by">by arnoldasr</div>
|
||
</div>
|
||
<div class="badges"><span class="badge ok">ran on a player</span></div>
|
||
</div>
|
||
<p>The whole-track overview at the bottom of the screen gets a warm red-to-white colour gradient instead of flat blue, so drops and breaks stand out.</p>
|
||
<div class="vs stack">
|
||
<figure><img src="assets/overview-stock.png" alt="Stock blue overview waveform"><figcaption>Stock</figcaption></figure>
|
||
<figure class="mod"><img src="assets/overview-mods.png" alt="Gradient overview waveform with coloured cues and hot cues"><figcaption>Modded (with cue colours and hot cues)</figcaption></figure>
|
||
</div>
|
||
<ul class="diff">
|
||
<li><span class="k">Stock</span><span>Flat blue overview.</span></li>
|
||
<li><span class="k new">Modded</span><span>Red-to-white gradient.</span></li>
|
||
</ul>
|
||
</article>
|
||
|
||
<!-- cuecolours -->
|
||
<article class="card">
|
||
<div class="card-head">
|
||
<div class="icon" aria-hidden="true">🎯</div>
|
||
<div>
|
||
<h3>Cue colours & hot cues shown <code>cuecolours</code></h3>
|
||
<div class="by">ours · made with Claude Code</div>
|
||
</div>
|
||
<div class="badges"><span class="badge ok">ran on a player</span></div>
|
||
</div>
|
||
<p>Memory cues take the colour you gave them in rekordbox. The hot cues stored on the USB (A–H) appear as lettered boxes in their rekordbox colour on the overview and the detail waveform — the stock 900NXS ignores them completely.</p>
|
||
<div class="vs">
|
||
<figure><img src="assets/detail-stock.png" alt="Stock: red memory triangles only"><figcaption>Stock</figcaption></figure>
|
||
<figure class="mod"><img src="assets/hotcue-detail.png" alt="Hot cue A box on the detail waveform"><figcaption>Hot cue A on the waveform</figcaption></figure>
|
||
</div>
|
||
<ul class="diff">
|
||
<li><span class="k">Stock</span><span>Every memory cue a red triangle; hot cues not shown.</span></li>
|
||
<li><span class="k new">Modded</span><span>Memory cues in rekordbox colours; hot cues as coloured A–H boxes.</span></li>
|
||
</ul>
|
||
<a class="more" href="docs.html#cuecolours">Read more →</a>
|
||
</article>
|
||
|
||
<!-- hotcuekeys -->
|
||
<article class="card">
|
||
<div class="card-head">
|
||
<div class="icon" aria-hidden="true">⚡</div>
|
||
<div>
|
||
<h3>Hot cue keys <code>hotcuekeys</code></h3>
|
||
<div class="by">ours · made with Claude Code · needs <code>cuecolours</code></div>
|
||
</div>
|
||
<div class="badges"><span class="badge warn">partly tested</span></div>
|
||
</div>
|
||
<p>Play your rekordbox hot cues on the deck. A short press of QUANTIZE switches the hot key mode; the top three BEAT DIVIDE keys become hot cues A–C, ready to start at once. Press to jump and play, hold for a gate, set new ones while paused and delete them with DELETE. The key LEDs show which hot cues exist.</p>
|
||
<div class="vs">
|
||
<figure><img src="assets/display-stock.png" alt="Stock: QUANTIZE label only"><figcaption>Stock</figcaption></figure>
|
||
<figure class="mod"><img src="assets/display-mods.png" alt="HOT KEYS box beside QUANTIZE"><figcaption>HOT KEYS mode on</figcaption></figure>
|
||
</div>
|
||
<div class="vs stack">
|
||
<figure class="mod"><img src="assets/utility-hotcue.png" alt="UTILITY menu with BEAT JUMP and HOT CUE KEYS items"><figcaption>UTILITY › HOT CUE KEYS</figcaption></figure>
|
||
</div>
|
||
<ul class="diff">
|
||
<li><span class="k">Stock</span><span>No hot cues on the 900NXS; BEAT DIVIDE keys only for loops.</span></li>
|
||
<li><span class="k new">Modded</span><span>Hot cue mode: play, gate, set, delete on the BEAT DIVIDE keys; QUANTIZE still works when held.</span></li>
|
||
</ul>
|
||
<a class="more" href="docs.html#hotcuekeys">Hot cue guide →</a>
|
||
</article>
|
||
|
||
<!-- beatjump -->
|
||
<article class="card">
|
||
<div class="card-head">
|
||
<div class="icon" aria-hidden="true">⏭️</div>
|
||
<div>
|
||
<h3>Beat jump <code>beatjump</code></h3>
|
||
<div class="by">ours · made with Claude Code</div>
|
||
</div>
|
||
<div class="badges"><span class="badge emu">emulator only</span></div>
|
||
</div>
|
||
<p>TRACK SEARCH jumps 1, 2, 4 or 8 beats along the beat grid instead of changing the track, set in UTILITY › BEAT JUMP (which replaces SCREEN SAVER).</p>
|
||
<ul class="diff">
|
||
<li><span class="k">Stock</span><span>TRACK SEARCH changes the track; UTILITY › SCREEN SAVER.</span></li>
|
||
<li><span class="k new">Modded</span><span>TRACK SEARCH jumps beats; UTILITY › BEAT JUMP OFF / 1 / 2 / 4 / 8.</span></li>
|
||
</ul>
|
||
<div class="callout" style="margin:0"><strong>Rebuilt.</strong> Jumps while playing go through a buffer of their own and come back in phase; the CUE point and hot cues A–C stay. Needs <code>hotcuekeys</code>. Tested in the emulator only.</div>
|
||
</article>
|
||
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<section id="patcher">
|
||
<div class="wrap">
|
||
<h2 class="section-title">One patcher, your choice</h2>
|
||
<p class="section-sub">The patcher takes the official 1.31 update, adds the mods you tick and writes a new <code>C900NXS.UPD</code>. Only the main application changes; the boot loader, the recovery loader and the other sections are copied byte for byte and checked again before the file is written.</p>
|
||
<div class="term"><span class="c"># pick the mods in a list</span>
|
||
<span class="p">$</span> python cdj900nxs_patcher.py C900NXS.UPD
|
||
|
||
<span class="c"># or name them</span>
|
||
<span class="p">$</span> python cdj900nxs_patcher.py C900NXS.UPD --mods code,utility,overview,cuecolours,hotcuekeys
|
||
|
||
<span class="c"># back to stock</span>
|
||
<span class="p">$</span> python cdj900nxs_patcher.py C900NXS.UPD --stock</div>
|
||
<p class="caption">Before it builds, the patcher shows a disclaimer that you must accept. <a href="docs.html#install">Full install guide →</a></p>
|
||
</div>
|
||
</section>
|
||
</main>
|
||
|
||
<footer>
|
||
<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>
|
||
</div>
|
||
<div>
|
||
<h4>Disclaimer</h4>
|
||
<p>Unofficial. Not affiliated with or endorsed by Pioneer DJ or AlphaTheta; CDJ and rekordbox are their trademarks. Flashing modified firmware can leave your player unusable. Everything here is provided as is, without warranty, and used at your own risk.</p>
|
||
</div>
|
||
</div>
|
||
</footer>
|
||
|
||
</body>
|
||
</html>
|