Skip to content

sndj v0.11

Choose a tag to compare

@little-scale little-scale released this 11 Jul 01:08

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).