Files
CDJ900ModsWeb/index.html
T
Thiemo TizianiandClaude Opus 5.5 e6351de711 Site 1.3.0: advanced waveforms published by us, 1.0.1
Advanced waveforms is based on arnoldasr's rgb_waveform and now updated
and published by us (cards, docs, builder, credits). 1.0.1 takes rekordbox's
colours also when they are a little short. The generator masks only the
asset blob itself, so code of ours after it goes as data.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 10:07:56 +02:00

315 lines
20 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!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, extended BPM, phase meter, cue colours, hot cues on the beat divide keys and more — compared with stock, built in your browser.">
<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?v=1.3.0">
<script src="assets/versions.js?v=1.3.0"></script>
<script src="script.js?v=1.3.0"></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="builder.html">Builder</a>
<a href="upcoming.html">Upcoming</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, a BPM to two decimals, a phase meter, rekordbox cue colours,
beat jump and <strong>hot cues you can play from the deck itself</strong>. Build your own update file
right here in the browser — the boot loader stays untouched.
</p>
<div class="cta">
<a class="btn primary" href="builder.html">Build your update</a>
<a class="btn" href="#mods">See the mods</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">7</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, loaded in the background</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>, built in your browser</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. Two are by <a href="https://github.com/arnoldasr/cdj900nxs">arnoldasr</a>, one is based on his work and now ours, the rest are ours. Choose any combination in the <a href="builder.html">builder</a>.</p>
<div class="legend">
<span class="state stable">stable</span>
<span class="state experimental">experimental</span>
<span class="player">ran on a player</span>
</div>
<div class="grid">
<!-- advanced_waveforms -->
<article class="card">
<div class="card-head">
<div class="icon" aria-hidden="true">🌈</div>
<div>
<h3>Advanced waveforms <code>advanced_waveforms</code></h3>
<div class="by">ours · based on arnoldasr's rgb_waveform, updated and published by us</div>
</div>
<div class="meta"><span class="player">ran on a player</span><span class="state stable">stable</span></div>
</div>
<p>The big waveform in RGB colours, as on newer Pioneer players, instead of plain blue — and the whole-track overview at the bottom as a warm red-to-white gradient, so drops and breaks stand out. It started as arnoldasr's <code>rgb_waveform</code>; we took it over and keep it up to date (1.0.1: rekordbox's colours now also on tracks whose colour data is a little shorter than the waveform — before, those fell back to plain gradient colours).</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>RGB</figcaption></figure>
</div>
<div class="vs stack">
<figure><img src="assets/overview-stock.png" alt="Stock blue overview waveform"><figcaption>Overview · stock</figcaption></figure>
<figure class="mod"><img src="assets/overview-mods.png" alt="Gradient overview waveform"><figcaption>Overview · gradient (with cue colours and hot cues)</figcaption></figure>
</div>
<ul class="diff">
<li><span class="k">Stock</span><span>Blue waveform, flat blue overview.</span></li>
<li><span class="k new">Modded</span><span>RGB waveform, red-to-white overview.</span></li>
</ul>
</article>
<!-- extended_bpm -->
<article class="card">
<div class="card-head">
<div class="icon" aria-hidden="true">🔢</div>
<div>
<h3>Extended BPM <code>extended_bpm</code></h3>
<div class="by">by arnoldasr</div>
</div>
<div class="meta"><span class="player">ran on a player</span><span class="state stable">stable</span></div>
</div>
<p>The BPM to two decimals: the tenths move into a small digit above, the hundredths take the place below — handy for matching tempos by ear and by eye.</p>
<div class="vs">
<figure><img src="assets/bpm-stock.png" alt="Stock BPM 145.0"><figcaption>Stock</figcaption></figure>
<figure class="mod"><img src="assets/bpm-mods.png" alt="BPM with two decimals"><figcaption>Two decimals</figcaption></figure>
</div>
<ul class="diff">
<li><span class="k">Stock</span><span>BPM to one decimal.</span></li>
<li><span class="k new">Modded</span><span>BPM to two decimals, stacked.</span></li>
</ul>
</article>
<!-- phasemeter -->
<article class="card">
<div class="card-head">
<div class="icon" aria-hidden="true">🎚️</div>
<div>
<h3>Phase meter <code>phasemeter</code></h3>
<div class="by">by arnoldasr</div>
</div>
<div class="meta"><span class="player">ran on a player</span><span class="state stable">stable</span></div>
</div>
<p>A two-line phase meter instead of the four boxes: orange for the master, blue for this deck, each with a marker that sweeps along the bar. Switched in UTILITY, where 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>Stock</figcaption></figure>
<figure class="mod"><img src="assets/phase-mods.png" alt="Two-line phase meter"><figcaption>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>Four boxes; UTILITY › SLIP FLASHING.</span></li>
<li><span class="k new">Modded</span><span>Two lines with markers; UTILITY › PHASE METER picks the meter.</span></li>
</ul>
</article>
<!-- cuecolours -->
<article class="card">
<div class="card-head">
<div class="icon" aria-hidden="true">🎯</div>
<div>
<h3>Cue colours &amp; hot cues shown <code>cuecolours</code></h3>
<div class="by">ours · made with Claude Code</div>
</div>
<div class="meta"><span class="player">ran on a player</span><span class="state stable">stable</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 big 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="meta"><span class="player">ran on a player</span><span class="state experimental">experimental</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. After a track loads they are buffered in the background, so each starts at once — also from a pause, in CDJ and VINYL mode. Hold for a gate, set new ones while paused, delete them with DELETE; changes are saved on the USB with colours (A green, B orange, C blue).</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 the HOT CUE KEYS item"><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 · needs <code>hotcuekeys</code></div>
</div>
<div class="meta"><span class="player">ran on a player</span><span class="state experimental">experimental</span></div>
</div>
<p>TRACK SEARCH ◀◀ / ▶▶ jumps 1, 2, 4 or 8 beats along the rekordbox beat grid instead of changing the track — at once, without a gap and in phase with the other deck, as on the newest players. Chosen in UTILITY › BEAT JUMP (default 4 beats, kept when the player is off). Works playing, paused and at the cue. The jump is made in the audio the player has already decoded; a press it cannot jump yet (clicked very fast with 8 beats) is simply ignored instead of running the player dry.</p>
<ul class="diff">
<li><span class="k">Stock</span><span>TRACK SEARCH goes to the previous / next track.</span></li>
<li><span class="k new">Modded</span><span>Whole bars (4, 8) or beats (1, 2) forward and back, the phase meter stays where it was.</span></li>
</ul>
<a class="more" href="docs.html#beatjump">Read more →</a>
</article>
<!-- ledsaver -->
<article class="card">
<div class="card-head">
<div class="icon" aria-hidden="true">✨</div>
<div>
<h3>LED animation <code>ledsaver</code></h3>
<div class="by">ours · made with Claude Code</div>
</div>
<div class="meta"><span class="player">ran on a player</span><span class="state stable">stable</span></div>
</div>
<p>When the screen saver dims the display, the deck comes alive: the BEAT DIVIDE keys fade in a wave, SYNC and MASTER pulse against each other, the transport keys light one after another and the jog's three rings run inner, middle, outer and back — a loop of about four and a half seconds. Any key ends it. UTILITY › LED ANIMATION, on from the first start.</p>
<ul class="diff">
<li><span class="k">Stock</span><span>The screen saver only dims the display.</span></li>
<li><span class="k new">Modded</span><span>Button LEDs and jog rings animate while it is dimmed.</span></li>
</ul>
<a class="more" href="docs.html#ledsaver">Read more →</a>
</article>
<!-- keynotation -->
<article class="card">
<div class="card-head">
<div class="icon" aria-hidden="true">🎼</div>
<div>
<h3>Key notation <code>keynotation</code></h3>
<div class="by">ours · made with Claude Code</div>
</div>
<div class="meta"><span class="state experimental">experimental</span></div>
</div>
<p>Every track's key in one notation, whatever rekordbox exported: Camelot (8A), Open Key (1m) or classic (Am), chosen in UTILITY › KEY NOTATION. The player converts on its own with a table of all spellings, sharps and flats included — on the main screen, in INFO and in BROWSE › KEY. The key shows in the colour of its place on the Camelot wheel.</p>
<div class="vs stack">
<figure><img src="assets/key-stock.png" alt="Key as exported: 4A"><figcaption>As exported (Camelot): 4A</figcaption></figure>
<figure class="mod"><img src="assets/key-mods.png" alt="Key in Open Key: 9m"><figcaption>KEY NOTATION › OPEN KEY: 9m</figcaption></figure>
<figure class="mod"><img src="assets/key-colour.png" alt="Key 5A in its Camelot wheel colour, orange"><figcaption>Wheel colour: 5A in orange</figcaption></figure>
<figure class="mod"><img src="assets/utility-key.png" alt="UTILITY menu with the KEY NOTATION item"><figcaption>UTILITY › KEY NOTATION</figcaption></figure>
</div>
<ul class="diff">
<li><span class="k">Stock</span><span>The key as rekordbox's export setting wrote it.</span></li>
<li><span class="k new">Modded</span><span>OFF, CAMELOT (default), OPEN KEY or CLASSIC — the same notation on every stick, in its wheel colour.</span></li>
</ul>
<a class="more" href="docs.html#keynotation">Read more →</a>
</article>
<!-- credit -->
<article class="card">
<div class="card-head">
<div class="icon" aria-hidden="true">☠️</div>
<div>
<h3>Boot text <code>credit</code></h3>
<div class="by">ours · made with Claude Code</div>
</div>
<div class="meta"><span class="player">ran on a player</span><span class="state stable">stable</span></div>
</div>
<p>The boot screen tells you what you are running: <em>Pionaarr Mods 1.0</em> instead of <em>Ver 1.31</em>. Leave it out to keep the stock text.</p>
<div class="vs">
<figure><img src="assets/boot-stock.png" alt="Stock boot screen: Ver 1.31"><figcaption>Stock</figcaption></figure>
<figure class="mod"><img src="assets/boot-mods.png" alt="Boot screen: Pionaarr Mods 1.0"><figcaption>Pionaarr Mods 1.0</figcaption></figure>
</div>
</article>
</div>
<p class="caption">More in the works — beat jump, coloured Camelot keys, stems and a 3-band waveform: see <a href="upcoming.html">Upcoming</a>.</p>
</div>
</section>
<section id="build">
<div class="wrap">
<h2 class="section-title">Build it in your browser</h2>
<p class="section-sub">The <a href="builder.html">builder</a> takes the official 1.31 update, adds the mods you tick and gives you a new <code>C900NXS.UPD</code> — all on your computer, nothing is uploaded. Only the main application changes; the boot loader, the recovery loader and the other sections are copied byte for byte and checked again before you can download the file.</p>
<div class="cta"><a class="btn primary" href="builder.html">Open the builder</a></div>
<p class="section-sub" style="margin-top:28px">Prefer the command line? The Python patcher builds the same file, byte for byte:</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 advanced_waveforms,extended_bpm,phasemeter,cuecolours,hotcuekeys
<span class="c"># back to stock</span>
<span class="p">$</span> python cdj900nxs_patcher.py C900NXS.UPD --stock</div>
<p class="caption">Both ask you to accept a disclaimer first. <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 builder, the mods <code>cuecolours</code>, <code>hotcuekeys</code>, <code>ledsaver</code>, <code>keynotation</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>extended_bpm</code> and <code>phasemeter</code> are by <a href="https://github.com/arnoldasr/cdj900nxs">arnoldasr</a>; <code>advanced_waveforms</code> is based on his <code>rgb_waveform</code> and is now updated and published by us.</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>