311 lines
18 KiB
HTML
311 lines
18 KiB
HTML
<!doctype html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
<title>Pionaarr 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=Barlow:wght@400;500;600;700&family=Chakra+Petch:wght@600;700&family=JetBrains+Mono:wght@500;700&display=swap" rel="stylesheet">
|
||
<link rel="stylesheet" href="style.css?v=1.4.1">
|
||
<script src="assets/versions.js?v=1.4.1"></script>
|
||
<script src="script.js?v=1.4.1"></script>
|
||
</head>
|
||
<body>
|
||
|
||
<header class="top">
|
||
<div class="wrap">
|
||
<a class="brand" href="index.html"><span class="disc" aria-hidden="true"></span><span>Pionaarr 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">
|
||
<span class="lcd"><i></i>CDJ-900NXS · firmware 1.31</span>
|
||
<h1>Pionaarr <span class="r">Mods</span></h1>
|
||
<p class="lead">Firmware mods for the Pioneer CDJ-900NXS. We took the player's firmware apart in an emulator and added what newer Pioneer players have: hot cues on the deck, beat jump, colour and 3-band waveforms, keys in Camelot colours and more.</p>
|
||
<p class="lead">Pick the mods you want in the builder. It patches the official 1.31 update in your browser and gives you a normal <code>C900NXS.UPD</code> to install like any update. The boot loader is never touched, so you can always go back to stock.</p>
|
||
<div class="cta">
|
||
<a class="btn primary play" href="builder.html"><span class="play-key" aria-hidden="true"><svg viewBox="0 0 17 10"><path d="M0 0v10l8-5z"/><rect x="10" y="0" width="2.5" height="10"/><rect x="14.5" y="0" width="2.5" height="10"/></svg></span>Open the builder</a>
|
||
<a class="btn" href="#mods">The mods</a>
|
||
<a class="btn" href="docs.html">Docs</a>
|
||
</div>
|
||
|
||
<div class="compare" style="--pos:50%">
|
||
<img src="assets/stock-full.png" alt="Stock CDJ-900NXS screen: blue waveform, red memory cues">
|
||
<img class="after" src="assets/mods-full.png" alt="Modded screen: 3-band waveform, coloured cues and hot cues, HOT KEYS, key in colour, BPM to two decimals">
|
||
<span class="tag l">Stock 1.31</span>
|
||
<span class="tag r">Pionaarr Mods</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 spot, in the emulator. Right: every mod, including the ones still in testing (the 3-band waveform is one of them).</div>
|
||
</div>
|
||
</div>
|
||
|
||
<section>
|
||
<div class="wrap">
|
||
<div class="strip">
|
||
<div class="tile"><div class="n">9</div><div class="t">mods in the builder, plus more in testing</div></div>
|
||
<div class="tile"><div class="n">A–C</div><div class="t">hot cues on the BEAT DIVIDE keys</div></div>
|
||
<div class="tile"><div class="n">0 bytes</div><div class="t">changed in the boot loader</div></div>
|
||
<div class="tile"><div class="n">1 file</div><div class="t">built in your browser, nothing uploaded</div></div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<section id="mods">
|
||
<div class="wrap">
|
||
<h2 class="section-title">The mods</h2>
|
||
<p class="section-sub">Each one next to stock. Two are by <a href="https://github.com/arnoldasr/cdj900nxs">arnoldasr</a>, one is based on his work, the rest are ours.</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 rekordbox's RGB colours, the overview as a red-to-white gradient. Based on arnoldasr's <code>rgb_waveform</code>, now maintained by us (1.0.1 fixes tracks that showed only 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: tenths small above, hundredths below.</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>Two lines instead of four boxes: orange for the master, blue for this deck, a marker sweeping along the bar. UTILITY › PHASE METER switches it.</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 & 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 in their rekordbox colours, and the hot cues on the stick (A–H) as lettered boxes on both waveforms.</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>QUANTIZE pressed short switches the hot key mode: the top three BEAT DIVIDE keys play hot cues A–C, instantly. Hold for a gate, hold on an empty key to set one, DELETE + key to delete. Saved on the stick in colour.</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 on the beat grid, gapless and in phase. Set in UTILITY › BEAT JUMP.</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>While the screen saver dims the display, the button LEDs and the jog rings play a loop. Any key stops it.</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 key in one notation, whatever rekordbox exported: Camelot, Open Key or classic, in its Camelot wheel colour. Also in INFO and BROWSE › KEY.</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 says <em>Pionaarr Mods 1.0</em> instead of <em>Ver 1.31</em>.</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">In testing: quick search, USB auto load, a reversed phase meter and the 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 and adds the mods you tick, on your computer. Only the main application changes; the boot loader and recovery are copied byte for byte and checked.</p>
|
||
<div class="cta"><a class="btn primary play" href="builder.html"><span class="play-key" aria-hidden="true"><svg viewBox="0 0 17 10"><path d="M0 0v10l8-5z"/><rect x="10" y="0" width="2.5" height="10"/><rect x="14.5" y="0" width="2.5" height="10"/></svg></span>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>
|