An NES as if it were designed by Bob Moog. A voltage-controlled Nintendo Entertainment System emulator for VCV Rack 2, by Arhythmetic Units. Play the controllers with gates, reshape game time with CV, and turn saved moments into musical patterns. Add CV Genie to put game memory under voltage control.
Get it on VCV Library | RackNES manual (PDF) | CV Genie manual (PDF) | Changelog
Read the technical report (PDF) for the architecture and implementation details. BibTeX citation.
The game supplies the music, sound effects, and visuals. Your patch controls how it plays: slow down a sequence, revisit a sound, or send each NES voice through its own effects chain.
- Control game time. Change emulation speed with the clock knob and CV attenuverter. Use the frame-clock output to drive downstream modules.
- Play with gates. Automate both NES controllers, reset the game, or hold execution with Hang.
- Revisit a moment. SAVE captures one emulator snapshot; LOAD returns to it. Repeated triggers can retrace a phrase or sound effect while you change the controls around it.
- Exchange cartridge saves. Import or export raw 8 KiB SRAM for reviewed battery-RAM layouts on mappers 0--3. Match the game and ROM revision; SRAM files are separate from SAVE/LOAD snapshots. See the manual for header and layout restrictions.
- Split the soundtrack. Mix the two pulse voices, triangle, noise, and DMC sample channel, or patch their five individual outputs for separate processing. Audio follows Rack's host sample rate.
- Watch the game. The built-in display uses an NES NTSC filter; light and dark panels follow Rack's View > Use dark panels if available setting.
Go beyond the controllers. CV Genie is a Game Genie-inspired input expander, developed by @anlexmatos, that writes CV into game memory. Its eight rows expose named game elements from ten built-in maps, including Super Mario Bros., The Legend of Zelda, Mega Man, Castlevania, Contra, Metroid, Ninja Gaiden, and Tetris. See the CV Genie manual for the full game list and cartridge limitations.
- Choose what to control. Select the running game, then assign a game element to each row, such as player position or an inventory value.
- Modulate or toggle. Use 0-10 V for continuous entries and rising triggers for entries marked as toggles. Each element has its own range.
- Connect by placement. Put CV Genie (Input) immediately to the right of RackNES, touching it in the same row.
The game selector chooses a memory map; it does not load or detect a ROM. CV Genie provides named assignments rather than typed Game Genie codes or an arbitrary-address editor. The available expander writes memory; it has no game-memory CV outputs.
- With VCV Rack 2.4 or newer installed, sign in to your VCV account and add the modules from the VCV Library. In Rack's Library menu, sign in, choose Update all, and restart after the download.
- Add RackNES from the module browser. Connect MIX to your audio output through a mixer or attenuator, starting at a low listening level. Leave the clock and channel controls at their defaults.
- Right-click RackNES and choose Load ROM, or drop a
.nesfile onto the panel. Supply your own compatible ROM; the module starts empty. - Use Player 1 Start, Select, directions, and A/B to reach a part of the game that makes sound. Panel buttons and input gates act as the NES controllers.
- Press SAVE at an interesting moment, let the game continue, then press LOAD to return to it.
This README describes the current checkout. VCV Library builds and the latest-release PDF manuals can lag behind it; see the changelog for unreleased changes and the manual guide for matching local documentation.
RackNES supports iNES ROMs using cartridge mapper IDs 0 (NROM), 1 (MMC1), 2 (UNROM), 3 (CNROM), 4 (MMC3 / TxROM), 7 (AxROM / AOROM), and 9 (MMC2 / PxROM). Mappers 4, 7, and 9 accept validated standard layouts and a subset of NES 2.0; see the manual for board and format limits. Mapper support does not ensure every game or modified ROM works. Extract archives before loading, and keep the original ROM at its saved path when reopening a Rack patch. CV Genie's curated game maps are separate from RackNES's broader ROM support.
| Try This | Patch It Like This |
|---|---|
| Give percussion its own effects | Keep MIX connected and route NOI through a filter or delay. Connecting NOI removes that voice from MIX. |
| Automate a controller | Send a repeating gate to Player 1 A. High holds the button; low releases it. |
| Repeat a game moment | Press SAVE, then send slow triggers to LOAD. Each trigger restores the one stored machine state. |
| Drive a sequencer from the game | Route CLK through a clock divider. Changing emulation speed changes the frame-clock output too. |
| Move a game element with CV | Load Super Mario Bros., attach CV Genie, select the matching map, and assign Player Horizontal Screen Position to a row. Sweep a 0-10 V source slowly. |
The clock CV input changes execution speed; it does not synchronize to incoming tempo pulses or provide calibrated pitch tracking. SAVE/LOAD recalls machine state, so it does not produce sample-accurate audio loops. The manuals explain timing, routing, and game-map behavior in detail.
See SUPPORT.md for troubleshooting, questions, bug reports, and feature requests. Include your Rack and plugin versions, operating system, and steps to reproduce a problem; identify the ROM revision when relevant.
See CONTRIBUTING.md for environment setup, architecture, builds, regression checks, and pull request guidance. The C++ and Markdown style guides cover coding and documentation conventions. Coding agents should also follow AGENTS.md.
The manual guide covers prerequisites, the shared LaTeX
build, PDF review, and release workflow. With Make, latexmk, pdflatex,
and the guide's TeX packages installed, run from the repository root:
make -C manualThe PDFs are written to manual/RackNES/.build/manual.pdf and
manual/CVGenie/.build/manual.pdf. Ordinary builds use committed screenshots
and need no Rack SDK or graphical session. The manuals cover the current
controls and limitations, including the supported CV Genie games. Assignment
details live in the module menus and hover help.
Panel Figures And Production Captures
Panel guides use LaTeX wireframes; covers and the images above share captures of the production widgets. The capture guide explains how to regenerate them with the original Arhythmetic Units demo ROM. That silent title-card fixture supplies the branded display shown above.
The technical report, RackNES: A Voltage-Controlled NES Emulator as a Musical Instrument, describes the project's foundations, related work, architecture, and implementation. Its standalone LaTeX source includes the bibliography and architecture diagram. Download the latest-release PDF or follow the local build instructions.
To cite the project and its implementation account, use the report entry below. GitHub's Cite this repository button uses the preferred citation in CITATION.cff; CITATION.bib provides the same BibTeX entry.
@techreport{kauten2026racknes,
author = {Kauten, Christian},
title = {{RackNES}: A Voltage-Controlled {NES} Emulator as a Musical Instrument},
institution = {Arhythmetic Units},
year = {2026},
month = sep,
type = {Technical report},
note = {Manuscript version 1, dated September 30, 2026; repository manuscript},
url = {https://github.com/Kautenja/RackNES/tree/master/whitepaper},
}When referencing the software, link to this repository and identify the version
or commit used. The report documents RackNES 2.1.0 at source revision
e8c99bf86295318724ef62ad40a17ba6897be696.
It is currently a repository manuscript without an assigned DOI or conference
publication status.
RackNES builds on the work of these projects:
- SimpleNES, by Amish Naidu and contributors: the emulator core.
- Nes_Snd_Emu and Blip_Buffer, by Shay Green (blargg): NES audio emulation and band-limited sound synthesis.
- nes_ntsc, by Shay Green (blargg): the NTSC video filter.
- cpp-base64, by René Nyffenegger: Base64 encoding and decoding.
The technical report cites these sources and records the emulator's nes-py lineage. See the bundled notices for component licenses and attribution.
Many thanks to @anlexmatos for developing the CV Genie expander module.
RackNES source code is licensed under GPL-3.0-or-later.
The module graphics and branding in res/ and manual/ are separately licensed under
CC BY-NC-ND 4.0. Bundled dependencies retain
their own license notices.
See LICENSING.md for the scope of each license and third-party notices for bundled components. The software license does not grant the same permissions for the artwork.

