Releases: little-scale/sndj
Release list
sndj v0.12
The performance release: LIVE mode grows up into a real clip launcher.
- A+B queues, launches and stops. On a populated cell A+B queues that chain on its track (launching right away from stopped); on the cell the track is playing it queues that track's stop instead — it never re-triggers the chain you're hearing. Queued chains take over at the playing track's phrase boundary; cues on silent tracks fire at the next bar (16 rows) so they land in time with the others.
- Plain B is edit-only: insert a chain on an empty cell (A+B then launches it), inert on occupied cells — a stray tap can't trigger or overwrite anything mid-set.
- The grid tells you what's happening: a steady ▸ on each track's playing cell, a flashing ▸ on a cued chain, an X on a track draining toward a queued stop. On SONG every playing track gets its own playhead triangle — 8 independent heads, nothing painted over the numbers.
- The launcher is on the map: A+d-pad navigates from LIVE as if on SONG, L/R and Y+←/→ switch tracks, Select still round-trips.
- Start plays the arrangement at the song cursor from every screen — drill into a chain or phrase and Start sounds the context you're looking at; tracks enter at the chain covering the cursor row (the LSDJ feel).
- Fixed: the first LIVE launch after power-on started all eight tracks (boot-zeroed pending slots read as "chain 0 queued") — now seeded at boot, cleared on stop, and pinned by a 20-assert regression check.
- HELP is 8 pages: instrument types and the samples/memory story join as pages 4–5, the command reference moves to 6–7.
- CLONE defaults to DEEP on fresh carts.
Still awaiting hardware bring-up: sync/MIDI rigs and the FXPak SRAM matrix (CLAUDE.md §4.4).
Full details in CHANGELOG.md.
ROM stamp: 0.12 de585a9 — check the boot splash to verify your flash.
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).
sndj v0.1
The first release of sndj — an LSDJ-inspired music tracker for the
Super Nintendo / Super Famicom, written in 65816 + SPC700 assembly.
Third sibling of smsggdj
and genmddj: same data
model, same two-modifier control grammar, same screen map — built
around what only the S-DSP can do.
Flash sndj-0.1.sfc to an FXPak/SD2SNES or open it in Mesen 2 /
ares / bsnes. Tempo and pitch are region-free by construction (the
audio unit has its own crystal) — PAL only changes the picture.
Highlights
- 8-track sequencer — phrases, chains, a 128-row song grid,
journalled 16-slot saves in cart SRAM, LIVE mode with quantised
chain launching and hardware ENVX meters. - Six instrument types — SMP (pool samples), KIT (drum kits),
WAV (drawn wavetables), NSE (noise), SLICE (chop any sample
into up to 16 parts at zero audio-RAM cost — the note picks the
slice) and KARP (Karplus-Strong on the echo hardware: the room
becomes a plucked string, per-note-tuned by the FIR filter — a
technique no commercial SNES soundtrack ever shipped). - The room as an instrument — echo delay with its live audio-RAM
cost on screen, feedback, per-voice sends with channel gates, and
8 patchable FIR curves; reconfiguration runs an erratum-safe
driver sequence. - One groove, two steps — the song's feel is a public pair of
tick counts (6/6 straight, 8/4 swing) andG xywrites it live
from a phrase. - 24-command language shared by phrases and tables, sibling
semantics preserved. - Sync & MIDI takeover (console side) — follow a sibling master
or the Ableton Link ESP32 bridge, pulse out to Volca/PO gear, or
play sndj as an 8-voice BRR module over MIDI. Hardware bring-up of
the cables/rigs is still pending; these pass their emulated gates. - Browser ecosystem, zero toolchain —
user-tools/patcher.html:
sample pool with SoundFont drag-import and bit-exact BRR audition,
slice designer with draggable cuts, kit builder, boot instruments,
FIR designer with a live response plot (including a KARP pluck
prototype), palettes, ROM + audio-RAM budget meters.
user-tools/savetool.htmlmanages cart saves and.sndjsongs.
Full history in CHANGELOG.md. Built and verified by
35 emulator-in-the-loop test suites + golden screenshots; the boot
splash shows V0.1 B239FB9 so you can confirm the flash took.