SuperOS-606
Open firmware for the Roland TR-606 Drumatix, running on an AT90USB1286 CPU replacement (Teensy++ 2.0 class, or a dedicated CPU board) in the µPD650C socket.
It adds an extended sequencer layer, MIDI in/out with clock sync, a SysEx web editor and
firmware updates over MIDI, while leaving the machine's own operating model intact. A
combined build also carries an emulator of the stock µPD650C, so one board can boot
either the original behaviour or the extended one.
Status: runs on hardware. Sequencer, tools, MIDI sync, the emulator, firmware switching, MIDI firmware updates and flash persistence have all been exercised on a real machine.
The 606's model, kept
- 32 patterns in two groups of 16, selected on the step buttons; 8 tracks (songs) of chained patterns, selected with the INSTRUMENT dial.
- The MODE dial's four positions — pattern write, pattern play, track write, track play — behave as the manual describes them.
- Transport and timing come from the 606's own circuits: START/STOP is the panel's toggle flip-flop, the 24 PPQN tempo clock follows the TEMPO knob or the rear DIN-sync jack.
- The SCALE switch, PATTERN GROUP, WRITE/NEXT tap write and chase-delete with PATTERN CLEAR all keep their factory behaviour.
What SuperOS adds
FUNCTION is the tool gateway: hold it for a tool map on the step LEDs, press a step to latch a tool, tap FUNCTION to leave.
- Patterns extended to 64 steps (four 16-step sections; stock-length patterns behave identically).
- Per-step probability and ratchet (2×/3×/4×), per-instrument loop length and polymeter, swing (tempo-safe: edits latch at the beat pair, so toggling swing can never pull the bar off the clock), play direction, live reslice, drum arp, pattern generate, copy/paste, transform, mute.
- Tool map: 1 Length, 2 Scale+Swing, 3 Copy, 4 Transform, 5 Probability, 6 Ratchet, 7 Poly, 8 Mute, 9 Reslice, 10 Arp, 11 Direction, 12 Generate, 13 Save. The global accent track is edited like any voice, on INSTRUMENT dial position 0.
- MIDI in/out: drum notes (velocity ≥ 100 asserts accent), program change + bank select for pattern selection, clock sync as slave or master, soft thru. Incoming clock is jitter-smoothed by a phase-locked timebase (uClock model, 96 PPQN): the sequencer steps at predicted tick times instead of raw byte arrival, and the tick count can never drift against the host. A received MIDI Stop always stops the box, even if it was started from the panel.
- Config menu (FUNCTION + PATTERN CLEAR), paged: step 1 opens a MIDI channel submenu (default channel 1, omni selectable), step 2 switches the SysEx link on/off entirely, step 3 OUT/THRU, step 8 clock source, step 10 save. CLEAR backs out one level, FUNCTION exits; edits persist automatically.
- A web pattern editor over SysEx (
tools/web-pattern-edit/index.html).
Patterns, tracks and settings persist in an internal-flash block store, written through an SPM service in the top of the boot section; both release images carry the service, so there is no separate install step.
Emulator
combined builds carry both firmwares in one image; a byte in internal EEPROM picks one
per boot. The emulator runs the machine's own µPD650C program against the real hardware —
port latches mirrored straight onto the socket pins — with its pattern memory kept in
internal EEPROM, separate from SuperOS's patterns. It follows MIDI clock and Start/Stop
like SuperOS does, and carries the same config menu with the same shared settings: a
MIDI channel or clock source set in one firmware holds in both.
No mask ROM is distributed with this project. The µPD650C program is copyrighted; supply your own, read from a chip you are legally entitled to read. Upload it once from the web editor (it persists in EEPROM), or compile it into a personal build:
python3 tools/d650/make_rom_embed.py <your-rom-dump>
pio run -e combined-rom
The generated header is gitignored and must not be committed or redistributed.
Switch firmware from the config menu (step 9 — solid LED means SuperOS is running,
blinking means the stock side is), over SysEx with F0 7D 4D <0|1> F7, or from the web
editor. Holding PATTERN CLEAR + FUNCTION + PATTERN GROUP at power-on always boots
SuperOS.
Firmware updates over MIDI
F0 7D 4A F7 drops the running firmware — either one — into the resident MIDI
bootloader with no hand on the panel; then send the release .syx
(tools/send_syx.py, or any throttled SysEx utility). A MIDI update rewrites only the
firmware: patterns and settings survive. F0 7D 02 F7 exits the bootloader without
flashing; any power cycle boots the intact app. Holding WRITE/NEXT at power-on still
enters the bootloader the manual way. Note the config menu's SysEx switch gates this
too: a disabled SysEx link ignores the bootloader command until re-enabled from the
panel.
Building
Needs PlatformIO and a git checkout (the build stamps the commit into the filename).
pio run -e bootloader -e flash-service -e combined
| env | what it is |
|---|---|
combined | SuperOS + emulator (mask ROM uploadable over MIDI) |
combined-rom | as above with a personal ROM compiled in — local builds only |
app | SuperOS only |
bootloader | MIDI SysEx bootloader, resident at 0x1F000; flash once over ISP |
flash-service | SPM flash-write service at 0x1FE00; bundled into every release image |
fuses | lfuse=0xDF hfuse=0xD2 efuse=0xF8, blank chips only |
Outputs land in the repo root: SuperOS-606_v<ver>_<env>_<rev>.syx to flash over MIDI,
and -full.hex (app + bootloader + service) for ISP. Never flash a bare app hex over
ISP — the chip erase would remove the bootloader and the flash service; use the
-full.hex.
Prebuilt firmware is on the releases
page, built automatically from
release tags with the changelog as the release notes. ROM-embedded builds are never
published — they contain the copyrighted mask ROM, so combined-rom is a local build
only.
Layout
src/
pins.h socket <-> AVR map
hw.h matrix scan + step-LED multiplex
controls.h panel decode (dials, buttons, status group)
pattern.h data model (sections, ratchet/probability slots, tracks)
engine.h sequencer, chains, tools, trigger bus
uclock.h MIDI-clock jitter smoothing (phase-locked timebase)
main.cpp panel handling, FUNCTION tools, config menu, LED frames
midi.cpp SysEx editor link, clock, notes
flash_persist.h block store glue (internal flash arena)
bootloader/ MIDI SysEx bootloader
flash_service/ SPM flash-write service
combined.cpp firmware selector for emulator builds
d650/ the µPD650C emulator: host machine, ROM store, AVR bridge
tools/
web-pattern-edit/ the web editor
makesyx.py packs the build into a flashable .syx
send_syx.py throttled SysEx uploader for the bootloader
The SysEx command set is documented at the top of src/midi_api.h.
Sources
- Roland TR-606 Service Notes
- TR-606 Owner's Manual
- The ucom4 CPU core is a port of MAME's
src/devices/cpu/ucom4(BSD-3-Clause, copyright hap)
