Files
CDJ900ModsWeb/index.html
T

311 lines
18 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>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 &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 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>