sndj v0.11
The hardware release. v0.1's first real-silicon session found the kind of bug
emulators cannot show you — this release fixes it, and brings the browser
ecosystem to full strength.
Hardware fixes (the big one)
- Glitch-proofed APU mailbox. On real hardware, an SPC700 port read that
collides with the S-CPU's write returns mixed bits (no emulator models
this). Sample uploads could shear by 3 bytes (garbled instruments) or end
on a phantom zero (silent instruments) — differently on every reset, since
the two clock domains drift phase per boot. The driver now double-reads
port 0 and accepts only the expected round counter; the CPU resyncs and
retries a failed upload; the BRR LOOP bit ships in-stream (one bulk
session per sample). Instruments now play correctly on real consoles. - SRAM powers up as $FF: option bytes are seeded at format and
range-checked at boot — no more palette 7 greeting every reset. - The APU? dead-mailbox indicator actually fires now (its heartbeat used
an exact-frame gate that ~30 fps screens could miss forever). - New founding HARDWARE.md documents the errata; CLAUDE.md gains
invariant #13 (glitch-guarded port reads).
The tracker
- Tables are V · TSP · CMD — per tick: voice level, signed transpose,
and one command through the shared executor. Zero = no change per column. - Button timing options, persisted on the cart: KEY DELAY, KEY RATE,
TAP WIN. - Y+↑/↓ pages everywhere: chains, phrases, kits and tables all use the
one family gesture. KIT's number is a readout again. - HELP screen (hold A alone ~2.5 s from any screen), generated from
help.txt + the command CSV; KIT moved below PHRASE on the map; splash
shows LOADING AUDIO during the sample transfer. - PROJECT drops NEW (FILES owns it); layout polish across OPTIONS, PROJECT,
KIT, TABLE, INSTR (inverted cursor values everywhere).
The browser ecosystem (user-tools/)
- The reference sequencer in
sndj.js: a JS mirror of the whole console
engine driving the sample-accurate S-DSP model, ~100× realtime. - spcexport.html: listen in the browser, render WAV offline (with
loop detection), or export a standard.spc— the song's register
stream + samples + a tiny SPC700 replayer, playable in any SPC player. - savetool.html: per-song play button (drop the ROM alongside),
read-only song viewer, rename, free-bytes readout. - als2sndj.html: Ableton
.als/.mid/ MML ⇄.sndj, both
directions, with real note-offs and tempo import (ALS.md documents it).
Full details in CHANGELOG.md.
Still awaiting hardware bring-up: sync/MIDI rigs (two-console cable, ESP32
bridge) and the full FXPak SRAM matrix.
Save-format note: table content saved by v0.1 predates the V·TSP·CMD
layout — re-enter any table rows from old songs (blank tables are
unaffected).