The Firmware Hub · FM-1 · SIDOU

SIDOU1.9.0
Turns the FM-1 into a C64 SID machine: two SIDs measured on real chips, a GoatTracker 2 tracker and step sequencer with slide and accent, .sid playback with live tweaks, LAB for sounds with step tables and LFOs, patches from an AI chat or SidStation banks, Bluetooth MIDI, and Live Link in a browser.
Text by the maker.
About it
- Engines
- Chip / retroIts own: two SID chips (6581/8580)
- Runs on
- FM-1 · Browser ↗
- Release
- 1.9.0 · released 8 Nov 2026 · on the hub since 23 Oct 2026596 KB · what's new
- Licence
- GPL-3.0 · source ↗ · copy on the hub
- Flash chip
- Every FM-1, the newer chip
0xB36014too - Identity
FM-1_964what it reports over USB while it runs- Build
- Built by its maker, not signed
- Popular
- ↓ 106 installs via the hub · ★ 7 on GitHub
Ratings
Like SIDOU





Changelog
What changed, version by version11 versions
[Unreleased]
[1.9.0] - 2026-11-08
Bluetooth MIDI in the one package, OFF until you turn it on, and USB audio on the FM-1's own clock.
- Bluetooth MIDI, in the one package. SIDOU is a Bluetooth MIDI device a Mac, an iPad or a phone connects to (
SIDOU XXXX, no pairing): notes, CCs and clock in, the panel's CCs and program changes out as over USB, and a dropped link releases the held notes. SETTINGS' last item, BLUETOOTH, turns it on; it is OFF by default, and the setting and SIDOU's address are kept. Bluetooth is no longer a separate test build (SIDOU_BLEis on by default;sidou-pack --verifyandtools/preflashexpect it). With BLUETOOTH OFF the radio never starts and the main loop leaves it alone: it costs what it cost without Bluetooth to within 4,000 instructions a second, where polling the radio every pass had cost 0.6M. Every boot now sets the FM-1's stock power-up (the rails, the DC-DC), and STATUS's READY line shows its record. The image is 577,136 bytes of 579,516. - *What's new in 1.9*: SIDOU LOOP playing, BLUETOOTH ON in SETTINGS, and cards for connecting from a Mac, an iPad or a phone; every video re-rendered on 1.9.
- USB audio packets keep the FM-1's own clock. felucca-bsp
7e09895c(fromf8788009): the packets carry 44 frames a millisecond and one more every 8 or 9, the I2S clock's rate, and are steered by at most one frame a render, so a host that follows the device's rate closely (iOS's Camera) no longer hears a run of short or long packets as a dropout. The recorded samples are the same, bit for bit. - Bluetooth fits the release ceiling. The radio driver builds in its own unit at
-Os(felucca-bsp#31'sFM1_IRQ_DEFS 0), 2,992 bytes smaller, and the image links againstapp.lditself. The test build's 500-byte exception is gone.
[1.8.0] - 2026-11-07
A sound from a prompt, live tweaks on playing .sid tunes, the ACID lane role, felucca-bsp, and USB audio at 44.1 kHz only.
- A sound from a prompt. SIDOU's instructions for language models ([docs/prompt-to-patch.md](docs/prompt-to-patch.md), on the site as
llms.txt) and a text format for one LAB sound,sidou-patch/1([the reference](docs/reference/patch-json.md), a JSON Schema beside it): named fields in musical units, everything a LAB sound holds, any field left out. The Library page reads a pasted patch or a#patch=link, checks it with the FM-1's rules (the ranges,lab_sound_valid, and playing it on both chips), says what is wrong in one line a model can fix from, previews it and sends it as a one-instrument song. An existing sound opens as a patch to change: each of the sixteen, and any LAB sound in an open song (Patch beside its instrument; a USER sound gets there by LAB's REC); the instructions tell a model to change only what it is asked. A bank,sidou-bank/1, carries up to sixteen patches and a song name, sent as one song (the sixteen as a bank make the site'sSIDOU SOUNDSbyte for byte), pasted or by a#bank=link;sidou-sysex bank FILE.jsonwrites it. A STEP pattern,sidou-step/1, is one lane of up to four pages: notes, the NEW song's drum kit by name, SLIDE, ACCENT and chance, the lane's role, and its instrument as a patch or the kit; it becomes the NEW song with that lane written as STEP's keys write it, so it opens on STEP and plays (checked, previewed and sent on the Library page, or by a#step=link). For coding agents ([docs/ai](docs/ai/README.md)):sidou-sysex patch|bank|step FILE.json --out DIRwrites the song and its.syxwith the same converter, andsidou-sysex send FILE(macOS) uploads a song, tune or instrument to the FM-1 with the stop-and-wait protocol after checking that the port answers as SIDOU, never a firmware package. The instructions are a shortllms.txtwith its depth in linked files and all of it inllms-full.txt, which the page copies; a model's answer ends with two to four things to turn in LAB, by LAB's own page and card names.sendstores a song under the song's own name. One converter,platform/web/patch_json.c, in its own wasm (tools/wasm-patch) and in the host tests;sidou-sysex patch FILE.jsonwrites the song and its.syx. The firmware is unchanged. - Bluetooth MIDI, in a test build (
SIDOU_BLE, until the device test passes): SIDOU as a Bluetooth MIDI device a Mac, an iPad or a phone connects to (no pairing), notes, CCs and clock both ways, SETTINGS BLUETOOTH OFF / ON, the setting and SIDOU's address kept. A dropped link releases the held notes. Connecting out to a Bluetooth keyboard is the next release's. - Bluetooth MIDI's measurement build (
-DSIDOU_BLE=ON, never released): SIDOU with Optimist's open stack linked in, both roles, to measure its flash, RAM and RAMTEXT ([the 1.8 plan](docs/plans/2026-11-05-bluetooth-1.8-plan.md)). The default image is unchanged.sidou-pack --verifynow also fails a package whose option record names an option a release never records. - Live tweaks on a playing
.sid. In NOW PLAYING K1 bends the tune's filter cutoff (-1024..+1024, 32 a detent), K2 its resonance (-15..+15), K3 picks a voice and K4 gives it another waveform (TRI, SAW, PUL or NOI; TUNE'S is its own), the tune's gate, sync, ring and test bits kept. Each turn shows the TWEAK popup; a TWEAKED line says what is bent. Back at 0 each gives the tune its own value at once, and leaving NOW PLAYING, another song or a stop gives everything back. EDIT + a knob is still the effect slot's. - An ACID lane for DICE. A lane's role can be ACID (after BASS+DRUMS): DICE writes a bassline as on a melodic lane and rolls 1.7's SLIDE and ACCENT locks with it, a slide on about three in ten notes followed by a note, an accent on about a third; a new roll clears them where a note went. SCENE hears the lane as the bass; an older SIDOU rolls it as a melodic lane.
- felucca-bsp. SIDOU builds on felucca-bsp's chip and board code (MPL-2.0) byte for byte, in place of the copies of Felucca 1.6.1 it carried; the update loader stays Felucca 1.6.1's, by its hash. A firmware update's first request is answered even when it comes right behind one of SIDOU's own SysEx frames (it was dropped before).
- USB audio records at 44.1 kHz only. The 48 kHz choice and its resampler are gone (about 8 KB of flash, the owner's call, for Bluetooth): a DAW records at 44.1 kHz, the rate SIDOU plays at.
- Five of the site's sixteen sounds filter every voice. PWM STRINGS, 303 BASS, WOBBLE BASS, S&H BLIPS and SWEEP PAD filtered voice 1 only, so the notes LAB played on voices 2 and 3 were unfiltered; a patch can no longer do that on a one-oscillator sound.
- A patch is refused as silent only when it is. The page and
sidou-sysexplay it through the song player on both chips instead of estimating, so a classic acid bass (low cutoff, high resonance, the filter envelope doing the work) is taken. - STEP's held step shows its chance and nothing after it. With a chance lock on a held step, the
95%beside HELD STEP could be followed by stray characters (whatever the memory held); the text now ends at the percent sign. - A step that slides and is accented keeps the accent's sustain. In 1.7 the slide's held SR came after the accent, so such a step played at the song's sustain; the accent's cutoff and resonance were right.
[1.7.1] - 2026-11-07
Newer FM-1s, with a UC25HQ80 flash, save and update.
- Newer FM-1s. Units sold since late 2026 carry a UC25HQ80 flash (JEDEC
B3 60 14) instead of the Puya P25Q80 (85 60 14): the same 1 MiB and the same commands. SIDOU accepted only the Puya, so on a newer unit nothing was saved (songs, LAB sounds and settings lasted until power-off) and an update from SIDOU was refused. Both parts are accepted now (Felucca#320). - The site's 1.7 deploy. The site's song core, built by CI's clang, came to 164,811 bytes, over its 160 KiB budget (Apple's clang made 161,337); the budget is 176 KiB, the owner's call, and the merge check now builds the core in the image as CI does.
[1.7.0] - 2026-11-05
A step table and two free LFOs in LAB, SLIDE and ACCENT in STEP, an NRPN for every LAB card, and SIDOU's own sounds on the site.
- TABLE in LAB. A sound carries a step table: up to 16 steps, each a waveform and a pitch (relative to the key or a fixed note), so many frames a step, played once or looped from a step, on every note (on a layered sound, on one layer). REC sends it as the instrument's GoatTracker wave program and ENV on INSTR reads a wave program back as a table. A 1.6 sound loads with its table off.
- Imported table patches keep their table.
sidou-sysex importputs the first playing oscillator's SidStation table on the LAB sound; the others still play from their song instruments, and the report names them. - LFO in LAB. Two free LFOs on MOD's second page (LFO on MOD goes there): triangle, saw up, saw down, square or sample and hold, on the pitch, the pulse width, the cutoff or the chip's volume, 0.05 to 12.75 Hz, depth -63..+63, drawn side by side. The import maps a SidStation patch's vibrato, PWM and filter LFOs onto them. A sound grows to 109 bytes.
- SLIDE and ACCENT in STEP. A held step and FX slides into the next note (the gate held through the hard restart, a 4-frame glide); a held step and ENV accents it (cutoff, resonance and sustain up for its row). They are LOCKs, saved with the song; the site's sounds include a 303 BASS for them. A song with either loses its locks in a 1.6 SIDOU.
- SIDOU's sounds on the site. The Library page lists sixteen original LAB sounds and sends them to the FM-1 as one song,
SIDOU SOUNDS; ENV on INSTR opens each in LAB as made. - An NRPN for every LAB card. FILTER ENV, LAYERS, TABLE and LFO's cards, which had none, are NRPN group 7 (7/0..7/19), one a card, its value the card's position: a DAW can automate each.
- GoatTracker's player runs from flash: the song's frame is called once a frame, so 6.3 KB of the SRAM kept for code every sample needs is free again.
- The 1.6 videos. "What's new in 1.6" (layers, FILTER ENV, the layered sound sent to the song and pulled back exactly, the import) replaces 1.5's, every video is re-rendered on 1.6 (LAB's eight pages, no title cards), and the v1.6.0 release carries them.
tools/readme-checkfails a release whose whats-new video names an earlier one. - An imported SidStation table played each step a frame too long when a step lasted two frames or more (GoatTracker holds a delay row one frame past its value).
[1.6.0] - 2026-11-04
Layered LAB sounds, a filter envelope, and SidStation and MIDIbox SID patch import; the title cards are gone.
- LAYERS in LAB. A sound plays up to three oscillators on one key, one a voice, each with its own waveform, envelope, pulse, transpose and detune. ALGORITHM sets how many; K1 picks the layer OSC and ENVELOPE edit (their header says
L2), K2 and K3 its transpose and detune, K4 its filter routing. A sound grows from 48 to 68 bytes; a 1.5 sound loads as one layer. - FILTER ENV in LAB. An envelope of its own sweeps the cutoff on every note: depth on ALGORITHM, attack, decay, sustain and release on the cards, drawn as it plays.
sidou-sysex import. An Elektron SidStation or MIDIbox SID V2 bank becomes songs of sixteen patches each, every instrument keeping its layered LAB sound to pull into LAB with ENV on INSTR, plus a report of what each patch keeps. A SidStation table plays as a GoatTracker wave program on its own instruments.- Filter metrics against real chips (host tests): a band-energy distance and a harmonic probe; SIDOU's 6581 filter measures inside the spread between real chips.
- The help card shows LAB F ENV and LAB LAYERS; LAB's audibility check counts each layer, its pitch, sync source and filter routing, and the filter envelope.
POPUP_INPUTis 256 instructions (was 250), for the filter envelope's check on the cutoff.- The title cards and SETTINGS' CARDS row. CHIP and SCENE open at once from the menu and HOME from the menu returns to LIVE directly; SETTINGS has nine items (KEYS, SOUNDS, ROWS, STORE, THEME, REC, SPREAD, SID MODEL, RESET). The image is about 20 KB smaller. The boot's own title screen stays. The settings record's byte 1, CARDS until now, is reserved: written as 0 and ignored on read, so older records still load; the layout and schema version are unchanged.
sidou-sysex sidandimportmake the--outfolder when it does not exist yet.
[1.5.0] - 2026-11-02
LAB's song bridge (send a sound to the song, pull one back); a .sid voice lifted into LAB; chords and time-shared drums from DICE; a popup for every small-print edit, page jumps and INSTR's pointer summaries; Live Link (the screen mirrored, the buttons and the computer keyboard from a browser); the site's library, song editor and preview; MIDI controller maps; 8.5 KB of duplicated code removed.
- The site's song editor (editor.html): a song from a file, the FM-1's current song or one saved on it (or the Library's new Edit), its instruments (the 25 bytes as INSTR shows them, the name), its four tables (as TABLE shows them, each row's meaning in words), a pattern grid (notes typed or played from the computer keyboard, INS and DEL that keep the length, rows inserted and deleted, the length, new and removed patterns; parameter locks shown and moved with their rows) and the orderlists (entries edited, inserted and deleted, the restart position), with undo and redo. Every edit is one of the FM-1's own primitives in SIDOU's wasm core, so what it refuses the FM-1 refuses (
SONG FULLpast the song's memory or the 64 KiB save,INVALID EDIT), and the song it saves is the one the FM-1 would. The preview plays an instrument from on-screen or computer keys, a pattern on one voice, or the song from an orderlist position with SIDOU's own player in an AudioWorklet, resampled from 44,118 Hz, with the song's chip setup (profile, character, experts, envelopes) and its effect slots; nothing sounds before a press. Save to a named file on the FM-1 (an existing one replaced only after you confirm) or Load now (PUT target 2; the page explains the FM-1's SAVE AS FIRST). A GoatTracker Stereo song's voices 4-6 are shown and kept, not edited. The wasm core grows by the effect slots and the chip's character and is now built-Oz: 160,375 bytes, within its 160 KiB budget. ([the manual](docs/manual/editor.md)) - The site's Live Link page (link.html): the FM-1's screen in the browser, live and pixel for pixel (SIDOU's own
grid.candfont.cin a 10 KB wasm,tools/wasm-link), with the panel's buttons and encoders (hold, drag, wheel, −/+, arrow keys) and an octave of note keys; Connect, Start, Stop and Redraw, frames and bytes a second; STOP when the tab is closed or hidden, starting again when it comes back; the font and palette fetched only when the FM-1's differ, then kept. Computer keyboard control (off by default): piano keys on two rows (Z S X D C... and Q 2 W 3 E..., GoatTracker-style), arrow keys for SELECT and ALGORITHM encoders, Page Up/Down for paging, Enter/Esc/Backspace/Space for buttons (SAVE, HOME, ARP, PLAY), Shift for EDIT layers. The device stays the source of truth (PANEL frames and MIDI notes); typing in inputs does not send. A reference card shows the whole keymap. ([the manual](docs/manual/live-link.md)) - MIDI controller maps (docs/manual/controllers.md): ready-made CC maps for 8-knob controllers covering LAB's six pages and LIVE, with a printable reference card. The full CC table from docs/reference/midi.md and notes on using MIDI learn.
- FM-1 Live Link, the device's side: a computer mirrors the screen and presses the buttons over the USB cable ([live-link.md](docs/reference/live-link.md), an open protocol for any FM-1 firmware; the site's Live Link page is its viewer). SysEx on the USB-MIDI port (
F0 7D 46 4D 31 4C, "FM1L"), started only by the host: START (the FM-1 answers its capabilities: the grid, the palette, the font's CRC), a heartbeat every 2 s, STOP, and an end by itself 3 s after the last heartbeat. While a session runs the FM-1 showsLINKin the bottom-left corner. The mirror sends the cells the LCD was sent (code, colour, large text's pieces, the scopes' overlays; SCENE's pixel art as 4-bit pixels), the newest state of each, in frames of at most 48 bytes that give way to SysEx transfers, MIDI out and clock out and stay within 22 KB/s; the font and palette on request. A PANEL frame holds and presses buttons and turns encoders (Felucca's ids), all let go 500 ms after the last one; the keys stay MIDI notes. The reference decoder is thefm1-live-linkcrate (host/crates/live-link), which rebuilds the screen pixel for pixel. - The site's Library page (library.html): everything in a connected FM-1's store (songs,
.sidtunes, instruments) with its type, size and CRC, and the free space; download, send (an identical file is left alone, a different one replaced only after you confirm), rename (the old file stays until the new one is stored), delete, and a backup of the whole store as one.zip(with a manifest keeping the FM-1's names and types) that restores in one go. Any song, from the FM-1 or a file, exports as a.sngwith SIDOU's trailer, as a plain GoatTracker file (with a warning when GoatTracker would read it with another channel count), and each instrument as a GoatTracker.ins(GTI5). The FM-1's private files are never listed, so never touched. The songs go through SIDOU's own C, compiled to WebAssembly (sidou-core.wasm, 130 KB,tools/wasm-corewith the build image's clang and Rust's linker): it accepts and refuses what the FM-1 does, with the FM-1's messages, and its bytes and player output match the host build's exactly (web/core.test.mjs). The Songs and Songs to MIDI pages stay, linked from it. ([the manual](docs/manual/library.md)) - LAB's song bridge: send a sound to the song, pull one back. REC in LAB writes the sound into the song's lowest free instrument as a plain GoatTracker 2 instrument, a byte at a time through the edit queue, so the song plays on (
SENT AS I06 SAW LEAD); EDIT + REC writes it over INSTR's instrument (REPLACE I05? EDIT+RECfirst). The waveform, ring, sync, AD, SR and pulse width are exact (GoatTracker's hard restart, gate timer 2; an attack of 0 becomes 1); the PWM and the filter LFO become loops, the vibrato a calculated speed, the cutoff 8 bits on the voice TRACKER shows; ARP opens TABLE's ARP helper on a default chord; one-voice sync, the fine tune, the targets and the effect slots stay behind. LAB's hint line says what was approximated or left out. On INSTR, ENV, LFO or FX pull the instrument into LAB at that page, one undo step: a sent, unedited one exactly, kept in a new trailer chunk per instrument (LB01..LB3F, [song-format.md](docs/reference/song-format.md)), any other decoded, the toast naming what was approximated (I01 ~DRUM). The ARP helper's SAVE now writes through the same batch writer. ([controls](docs/reference/controls.md#send-a-lab-sound-to-the-song), [LAB](docs/manual/lab.md#send-it-to-the-song-and-pull-one-back)) - Lift a sound from a
.sidinto LAB. In NOW PLAYING, REC asksLIFT WHICH VOICE? 1 2 3(large, note keys 1-3 lit); a key takes that voice's most recent note from a rolling history of the tune's registers (its last 64 play calls, 1,728 bytes) and LAB opens with it asLIFTED V2: waveform, ADSR, pulse width and PWM, filter and vibrato, the toast naming what LAB could only approximate (LIFTED V2 ~SWEEP). A voice silent lately saysWAITING FOR V2and its next note is taken; REC again or HOME cancels. SAVE keeps the sound as a new USER sound under its name, HOME goes back to the tune still playing. Digis are refused (DIGI: CAN'T LIFT). The capture reads the 6502's writes in the main loop and converts in passes within the slice budget; the audio interrupt is unchanged. LAB's pull keeps a wave row of00's first waveform and makes PWM or the filter LFO of a run that swings back and forth. Help: PLAYING's REC line and the LIFT card for the question ([controls](docs/reference/controls.md#lift-a-sound), [manual](docs/manual/sid-tunes.md#5-lift-a-sound)). - Chords and time-shared drums from DICE. A lane's role is set in DICE's frame: hold EDIT + SCL and turn PRESETS (
PRE ROLEbeside the root; the popup says it large): AUTO, DRUMS, BASS, BASS+DRUMS, ARP, LEAD, NONE, kept in the song'sSCNEchunk. DICE on an ARP lane writes chords (NEW CHORDS): each hit a note, the lane's instrument and GoatTracker's8XXat one of four shared wavetable chord programs (major, minor, sus4, 7: rows00and the semitones, a frame each, so the instrument's waveform plays every chord), a chord whose tones are in the lane's scale. The programs go after the wavetable's last row the first time (17 rows, through the batch writer) and are found by their rows after that; with no room the roll saysTABLE FULL. TRACKER's command line names the chord (CHORD A MIN). A BASS+DRUMS lane gets the NEW song's kit, its KICK and SNARE (found by their bytes, elseNO DRUM KIT), on the rhythm's strong rows and the lane's instrument between as the bass: one voice, time-shared, pattern cells only. RED MOON RITE hears a BASS+DRUMS voice's kick and snare as drums and its other notes as the bass. GoatTracker plays both as SIDOU does. ([controls](docs/reference/controls.md#step), [song format](docs/reference/song-format.md)) - INSTR says what its table pointers point to: beside the WAVE, PULSE and FILTER pointers' hex, small, the program's first two words (
SAW+0,50%PWM,LP40), and at the foot, at 2x, the whole summary of the pointer under the cursor: the waveform and the first notes (PUL +0 +4 +7), the start width and whether it sweeps (50% PWM), the filter's mode, cutoff and slide (LP 40 SLIDE),NO PROGRAMfor 00. No trip to TABLE to know what an instrument plays. On ATK/DEC and SUS/REL the foot spells the envelope out in the SID's times (A 2MS D 1.5S,S 4 R 0.3S) instead of the field's name. - EDIT + SELECT jumps a page on ORDER and TABLE (12 entries or rows, a screenful), as it jumps 8 rows on TRACKER, and 8 on INSTR (ATK/DEC to 1ST WAVE, then the same character on the name's other line). Their help cards say
E+SELECT PAGE. - 8.5 KB of duplicated code is gone with nothing heard or seen changed: the .sid player's voice shadow calls the chip's own voice code instead of a copy of it, EDIT + SCL, EDIT + ARP and EDIT + LFO share one either-finger mechanism in LAB, STEP and TRACKER, and the views share their note names, number and popup text helpers and one CRC-32.
- The LAB help cards list REC (to the song) and EDIT + REC (replace) in place of SAVE + K (MIDI learn, the same everywhere: MACRO's card keeps it); ENV, LFO and FX share a line (
ENV LFO FX LAB, as LIVE's). INSTR's card hasENV LFO FX LAB. LAB's hint line's last phrase endsREC SEND. - Every confirmation is SAVE, then SAVE AGAIN: SETTINGS' RESET (
RESET?, the popupRESET ALL?overSAVE AGAIN), a foreign store's format (FORMAT?,WIPE STORE?), SONG's discard and delete questions (SAVE AGAINin the alert colour where NO and YES were) and SIDS' question over an unsaved song (nowDISCARD UNSAVED SONG?andSAVE AGAIN, as SONG's LOAD asks; its save-first answer is gone, and SAVE discards where ALGORITHM did) no longer need an encoder turn. HOME, or moving SELECT off the item, backs out; no encoder confirms, so a spun one cannot reset, format, discard or delete. The RESET, STORE, CONFIRM and UNSAVED help cards say so. - No effect switches itself on after a power-on. The last song comes back at power-on with the keys' sound and effect slots left as the settings kept them: a song saved with LO-FI on, then LO-FI turned off, no longer turns LO-FI (and its noise floor, a faint hiss at rest) back on a few seconds after the boot. SONG's LOAD still brings the song's sound and slots, as before.
- Two value popups named the wrong control: EDIT + K1-K4 with ARP held on LIVE turns the arpeggio but said the effect slot's control (the knob row lights, as without EDIT), and K1 or K2 on ORDER's subtune selector or K2 on its restart marker, which change nothing there, said LIVE's cutoff or resonance (no popup now). A host test turns every encoder in every view and state and checks each opens the popup or is in one table of views that show the value large.
- A DICE setting turned while a roll is still writing its cells says
WAITING; it saidSONG FULL, and the song had room. - A pulled sound takes the instrument's name. INSTR → ENV / LFO / FX kept LAB's old name (
SAW LEAD*), and a send back renamed the instrument after it. LAB now shows the instrument's first 12 characters (I05for an unnamed one), and a send writes all 12 (it cut them to 10). - SEQ while a song loads (NEW, LOAD, the song coming back after a tune or ABOUT) painted white bands over the SONG page for about a second before STEP appeared. It says
LOADINGand the screen stays as it is; the song views open once the song is in. - A tune's mutes and solos stay the tune's. A GLO solo set in NOW PLAYING was still on in the song after the tune ended (
SOLin INSTR's header). A tune now starts with every voice on, and the song comes back with its own mutes and solos. - SEQ after a send lands INSTR on the instrument sent (or pulled), through STEP or not; STEP had set the lane's instrument on the way. STEP sets it again after that, as before.
- HOME after a pull goes back once. INSTR → ENV stacked a second LAB over the one the send came from, so HOME went INSTR → LAB → LIVE; it goes INSTR → LIVE now.
- The unsaved-song question names the built-in loop
SIDOU LOOP; it saidNEW SONG.
[1.1.0] - 2026-10-30
LAB's filter LFO, ARP RATE, MACRO links and peek; the ARP helper's and a held step's auditions; generative TRACKER, DICE's range, rhythm and a root and scale per lane; knob curves; the Distortion slot heard, with a popup; REC timing; uploads that wait for quiet; CLOCK OUT's start fix.
- An upload waits for quiet while a song plays. A SysEx upload (the Songs page, a
.sid, a.syx) used to mute the music for each packet's flash writes, about ten dips a second. Now, while a song or a tune plays or a computer records the FM-1's USB audio, the FM-1 writes nothing: it holds the packet's ACK, saysUPLOAD WAITS FOR QUIET, and goes on once the song stops (a minute at most, then BUSY). The protocol gains one reply, WAIT (7D), sent every two seconds while it waits; the Songs page shows "waiting for the FM-1 to be quiet" and keeps waiting ([sysex.md](docs/reference/sysex.md#waiting-for-quiet): older senders time out or stop at the first WAIT; a tool on a one-second timer is refused BUSY, so stop the song first). With only the keys sounding the dips come 250 ms apart, not 100 (four a second); the gap is a build option,SIDOU_SYSEX_GAP_MS, for the ear check on the device (BUILDING.md). - REC from the keys lands where you played. A key is placed 6.0 ms before the device reads it: what you heard lags the player by the output's double buffer (two audio blocks, 5.8 ms, less half a block on average by the time the key is read) and the key's debounce (1.5 scan frames, 1.65 ms), computed from those constants and measured in the emulator. Both NEAREST and OFF use it, K1's and K2's locks too; in OFF a key just past a row's start goes to the row before, at row 0 to the last row of the entry that played before it.
- The emulator is fm1-emu
93cb7ee3(wasc1c045fc), for the emulator gate and the browser demo: it models the watchdog and the reset through P33 (fm1-emu #92, our report #65). The boot-guard tests now die and reset as the FM-1 does, RAM kept: two crashes, each reset by the fault handler, and the third boot asks for UBOOT; the running firmware feeds the watchdog; and, with the checklist's hang build (SIDOU_FM1_DEATH_BUILD), a hang resets through the watchdog 8 s after the last feed. The firmware budgets are unchanged, instruction for instruction. - The USB tests run on fm1-emu's own USB controller and host (new at this revision), in place of the test crate's model: an independent check of Felucca's
usb.c. Enumeration, the update's step 1, MIDI both ways, SysEx transfers and USB audio at 44.1 and 48 kHz pass on it; what its host cannot do is listed indocs/upstream-reports.md(row 11). The USB audio cost test measures twice: with the SIE answering at once (the firmware's own cost, held to 2.0 instructions a sample as before) and with fm1-emu's estimated 1 µs round trip (held to 3.0). - LAB's MOD K4 was the velocity target; that stays on NRPN 6/1.
- A USER sound is 48 bytes (the filter LFO and the macro links); 1.0's 45-byte sounds and its unsaved edit load with them off (docs/reference/sound-format.md). The settings record is schema 9: it keeps the learned CCs of 1.1's parameters.
- Knob curves for every parameter whose ear is a ratio. LAB's PWM HZ walks 32 detents from 0.05 to 12.75 Hz even in pitch (shown in hundredths below 1 Hz), PWM's depth 32 on a square law, VIB HZ 24 from 0.5 to 12.7 Hz, VIB DEPTH 0 and 31 geometric to +-99 cents, VIB DELAY 0 and 23 from 40 ms to 1.27 s; each effect slot's Amount, A, B and Mix (EDIT + K1-K4, CHIP's slot line, LAB's FX page) takes one of three shapes by algorithm and control, chosen by rendering the slots (every Mix and a delay's feedback even in dB, CRUSH's rate fine near the top). Stored values keep their meaning: presets, USER sounds and songs sound as before, and a value off a curve stays until the knob turns, whose first detent goes the way turned. The vibrato's CCs (76-78), the slots' CCs (102-116) and a CC learned for these land on the same positions (the map's new
walkcurve, docs/reference/midi.md); their NRPNs still set any value. A DAW's automation of those CCs recorded against 1.0 lands on the curves' positions now, so it can sound different: re-record it, or send the NRPNs for exact values. docs/reference/controls.md "Knob curves" lists every curve. - EDIT + K1-K4 says the effect in the large popup. Turning the selected effect slot's Amount, A, B or Mix with EDIT held on LIVE opens the value popup: the effect's name over the control's and its value at 2x,
OVERDRIVEoverDRIVE 91, with a bar (a slot that is off:DIST OFFoverAMT 40). LIVE's knob row shows the slot's controls small; the popup is readable at arm's length. The same text everywhere the EDIT layer opens a popup (CHIP's chip focus, STATUS, the menu, SCENE), which saidDIST DRIVEover91before. - LAB: the filter LFO on FILTER's K4. The cutoff swings each way by up to 32 of K1's detents (a triangle, up first) at the PWM's rate, which OSC's PWM HZ sets and the card shows on its name line (
LFO1.3HZ); the drawing dots the swept band. The first detent on a sound with no rate starts it at 1 Hz. CC 31 and NRPN 0/8 reach it (docs/reference/midi.md); a preset loads it off, and DICE's rolls leave it off. It is kept with the sound. - LAB: macro links, on a sixth page, MACRO. RES LNK (
-8to+8) makes the resonance follow the cutoff (positive: it rises as the filter closes; negative, a squelch, as it opens) and PWM LNK makes the PWM's depth follow the pulse width's distance from a square. They belong to the sound and act wherever the cutoff or the width moves (LIVE's knobs, LAB's cards, CC 74, the mod wheel, the filter LFO), on top of the parameters, which stay as set. Two graphs show them; the RESO and PWM cards and LIVE's K2 show what the chip has, and light when K1 moves them. NRPN 0/10 and 0/11 (MIDI learn reaches them). - LAB: hold EDIT and play to peek at A. The note keys played while EDIT is held sound the sound as kept or loaded, for as long as EDIT is down (the header's
Aoutlined); letting go gives your edit back. A tap of EDIT still compares; any other control during a peek acts on the edit. The hint line hasEDIT+KEY PEEK A. - LAB: the arpeggio's RATE on MOD's K4 (
3FR,1/16: LIVE's ARP + K1), dark while ARP is off and set all the same. The rate is a parameter of the MIDI map now: CC 28 goes through its row, so MIDI learn can rebind it, it has NRPN 0/9 and MIDI out sends it. - TABLE's ARP helper is heard before SAVE. While the helper is open the keys play the draft (
HEARING DRAFTunder its name): the current instrument on the cursor's voice from the helper's first row, and every turn of an offset, the speed, the loop or the steps is heard at once on a held note. HOME closes it with nothing written; SAVE writes the rows as before. The draft is the player's (a song_ctl command at a block's start), on that voice only: a playing song keeps its own rows on the others. - A held STEP step plays its locks. Holding a step key sounds its note with the step's cutoff, resonance, filter mode, route and pulse LOCKs, and a K1-K3 turn on it is heard at once; the locks go when the key is let go, and the song's next rows play their own. Chance does not apply to an audition; the character LOCKs stay the row's.
- DICE's range and rhythm on STEP. With EDIT + SCL held, K2 sets the range (1 OCT, 2 OCT, 3 OCT, BASS: the lane's octave and the one below) and K4 the rhythm (STRAIGHT, OFFBEAT, 3-3-2, FOUR, BROKEN; a drum lane takes the rhythm and ignores the range). The frame now shows all four settings at 2x beside their knobs, and the lane's root under them. 2 OCT and STRAIGHT, the defaults, roll exactly what 1.0 rolled. The
DICEchunk grows from 3 to 5 bytes: SIDOU 1.0 still reads a 1.1 song's density and scale, and if its EDIT + SCL turns a knob it writes the chunk back without the rhythm and the range, which then return to their defaults. - Generative play in TRACKER. EDIT + ARP is MUTATE and EDIT + SCL is DICE (either finger first) on the shown voice's pattern, with STEP's settings frame over the window's lower half; the same seed rolls the same pattern as STEP. A row whose step has a chance below 100 % shows a yellow
%. With REC on, EDIT + ARP is now MUTATE: ARP alone still writes the key off, when it is let go while the song is stopped, so EDIT may land second. - A root and a scale per lane. With EDIT + SCL held a note key sets the selected lane's root (in STEP and TRACKER; the roll still comes when SCL is let go), and K3 sets that lane's scale. The
DICEchunk grows to 7 bytes: lanes 2 and 3's scales follow lane 1's, which 1.0 reads. - A filter sweep: EDIT + ENV in STEP and TRACKER writes GoatTracker
Ccommands (FILTER CUTOFF) every second row of the lane's pattern, up or down, never over a command; it plays in GoatTracker as written, and undo steps back a cell at a time. - Songs to MIDI reads from the connected FM-1:
midi.htmlhas "From the connected FM-1" beside the file picker. Connect (Web MIDI with SysEx, in Chrome or Edge; nothing is opened before the button), pick the ports, and it lists the current song (SysEx GET, target 2: the song as it is now, edits included) and the songs stored on the FM-1 (DIR, then GET of target 0; the.sidtunes in the store are not listed). The song is read, checked against the length and CRC the FM-1 announced, and converted exactly as a picked file. A refusal (BUSY while the song saves or loads, a song deleted since the listing, a transfer that arrives damaged) is shown in a sentence.web/sysex.js's client gainedget, tested inweb/sysex.test.mjsagainst the simulated device (DIR, GET of both targets, every refusal, a damaged transfer) and inweb/check.mjs's fake Web MIDI. - Wavetable arpeggios in the MIDI export: a wavetable step with a note (relative to the row's note, or a fixed one) that changes the pitch ends the sounding note and starts the next in the same tick, so an arpeggio is a run of tied notes and a noise drum sounds the pitch it plays. Checked against GoatTracker's packed player: the fixtures (
host/crates/gt2-ref/tests/midi_walk.rs) now also hold each voice's frequency register as table notes, andweb/songmidi.test.mjscompares the pitch of every note on 123,000 calls of the showcase songs, SIDOU LOOP and GoatTracker's examples (27 calls differ, all where a slide or tone portamento ends on a table note). Vibrato, slides and tone portamento are still not followed. SIDOU'sTRKBchunk (a second chip's tracks) is reserved and nothing writes it, so there is nothing of it to export. - The distortions are heard on a played note. The Distortion slot's algorithms are made for a SID voice at a quarter of full scale, but the chip gives the slot about 12 dB less (SAW LEAD's A4 peaks at -23 dBFS). Turned with EDIT + K1 from the bottom to the top on one note, TAPE's Amount did nothing you could hear; OVERDRIVE's and FUZZ's were mostly volume knobs (+14.5 and +13.3 dB louder, little clipping); CRUSH's top chopped the note into bursts; LO-FI's hum and noise drowned it. The slot now lifts its input x4 into the algorithms and lowers the wet signal as much again: TAPE saturates, OVERDRIVE and FUZZ clip at +4.0 and +1.8 dB, CRUSH's top plays a 4-bit note, the hum and noise sit under it. The same settings sound more driven than in 1.0 (a chord or a song through the slot, louder than one note, more so). Modulation and FX were heard end to end already, and the knob curves of 1.1 were not the cause: 1.0 measured the same (
emu-gate/tests/fx_knobs.rs). - The settings were sometimes not saved after two failed writes in a row. A flash program error while saving the unsaved LAB edit, twice in a row, left the settings record marked as saved though it was not on flash; it is now written again at the next debounce.
- TRACKER: EDIT + LFO (undo) works whichever finger lands first, as EDIT + ARP does. With REC on and the song stopped, LFO alone now writes its rest when it is let go (or as soon as another control is used; at once while REC records), so LFO a few milliseconds before EDIT no longer loses the undo.
- LAB and STEP: EDIT + ARP and EDIT + LFO are their chords whichever finger lands first, as EDIT + SCL is. ARP a few milliseconds before EDIT varies LAB's page or MUTATEs STEP's lane (on STEP, ARP alone now switches the lane's gate when it is let go, so the chord leaves the gate as it was); LFO first undoes (in LAB it shows MOD on the way, which is harmless).
- LAB: EDIT + SCL rolls the voice whichever finger lands first. SCL a few milliseconds before EDIT (two fingers pressed together) used to select the next effect slot and lose the roll; SCL alone now waits for EDIT and selects the slot when it is let go, or as soon as another control is used.
- The Songs page waits and sends again when the FM-1 answers a transfer with NAK BUSY, instead of giving up: it shows that the FM-1 is tidying its store, waits 1, 2, 4 and then 5 seconds between tries for about a minute, and sends the whole PUT again. Other refusals still stop the transfer.
sidou-sysexonly writes.syxfiles, so it has no sender to change. - CLOCK OUT: PLAY alone after a stop part way through sends a start (
FA), as the song starts again (from the song views' position). It used to send the stopped place's song position and a continue (F2,FB), so a synced sequencer carried on from there while the FM-1 started again, and the FM-1's clocks then paused for as long as it had been since the play before. Clock out read the call count before the audio interrupt had taken the PLAY; it now asks song control whether the last start was a play or a continue, and counts no calls until the play is taken. EDIT + PLAY still sends the song position and continue. - CLOCK OUT: a start, stop or continue that came while a SysEx reply filled the USB ring was lost. A reply now leaves the ring's last four packets to clock out, and clock out waits for room instead of handing USB a packet it would drop.
[1.0.0] - 2026-10-29
LAB, a view for shaping one sound and keeping it as one of sixteen USER sounds, DICE's density and scale, dense .sid players on time, the ARP helper's waveform, 2x text on TABLE and STEP, and the store's health on STATUS.
- LAB, a view to shape one sound and keep it. Five pages, OSC, ENVELOPE, FILTER, MOD and FX, each with four cards on K1 to K4 and a drawing of what they do (the pulse's width, the envelope, the filter's curve, the modulation, the effect slot); ALGORITHM is the page's choice (the waveform, the envelope mode, the filter mode, the arpeggio, the slot's algorithm). It opens from the menu (after SONG) and from LIVE with ENV, LFO or FX; HOME goes back to LIVE. A slot's algorithm OFF on the FX page bypasses it. SAVE held with a knob learns that card's parameter for MIDI; every page has a help card ([shape a sound in LAB](docs/manual/lab.md)).
- Keep it, name it, undo it. SAVE keeps the sound as one of sixteen USER sounds (
LAB 01and on, in the lowest free slot, or in place for a USER sound); EDIT + SAVE opens a name page (the keys type A to Z and a space). Tapping EDIT compares the sound as kept (A) with the edit (B); EDIT + LFO undoes, sixteen steps; EDIT + PRESETS goes back to the sound as kept. EDIT + ARP varies the page and EDIT + SCL rolls the voice, and neither result is ever silent (an estimate of a C4 held for 500 ms) or the same as the one before. - USER sounds in PRESETS. PRESETS clockwise from DICE plays the USER sounds (
U01toU16, empty slots skipped); a USER sound loads as a preset, with its three effect slots and its name, and its edits come back when it is loaded again. A MIDI program change knows the built-ins only. - The store and MIDI: the sixteen sounds are one private store file (
USER SOUNDS, type 4, rewritten whole a keep at a time; a power cut leaves the old file or the new; SAVE AS and SysEx refuse its name and no list shows it) and the unsaved edit is one more key. The settings record is schema 8; old records load as before. The PWM depth, PWM rate and fine tune are MIDI parameters (NRPN, no CC). - DICE's settings on STEP: with EDIT + SCL held, K1 sets the density (SPARSE, LIGHT, MEDIUM, BUSY, FULL: how many steps get a note) and K3 the scale (MIN PENT, MAJ PENT, MINOR, MAJOR, DORIAN, CHROMATIC); the frame shows both at 2x while SCL is held. Letting go of SCL with no knob turned rolls, as before, now at the release; MUTATE keeps to the chosen scale. The settings are saved with the song in SIDOU's
DICEchunk (GoatTracker skips it), and a song with none rolls exactly as before (MEDIUM, MIN PENT). STEP's help card gained SCL+K1 and SCL+K3 where PLAY and KEYS 17+ were. EDIT + SCL is the same chord whichever finger lands first: SCL a few milliseconds before EDIT no longer selects the next effect slot and leaves K1 to the EDIT layer's effect knob (SCL alone on STEP selects the slot when it is let go). - The ARP helper's waveform: PRESETS in TABLE's ARP helper chooses the waveform the rows carry (TRI, SAW, PULSE, NOISE and the combined ones), shown on the helper's page; the rows stay plain GoatTracker 2 wavetable rows, and the host test plays each waveform in GoatTracker's own player.
- Store health on STATUS: the bottom row shows
STORE ERR n(flash errors since boot) and, when the store retired sectors for the session,RETIRED n ERR n; nothing while it is healthy. - ENV, LFO and FX open LAB. On LIVE, ENV toggled the chip model and cycled the effect, FX stepped the next algorithm, and LFO did nothing. They open LAB at ENVELOPE, MOD and FX now, and do nothing outside LIVE and LAB. The chip model is ALGORITHM on LIVE's TONE page (or CC 25), the next algorithm is ALGORITHM on a slot's page, and an effect is bypassed by turning its algorithm to OFF. The first-run tour's
PRESS ENVnow opens LAB. - Readable small text on TABLE and STEP: TABLE's meaning line is at 2x for every table (the PULSE, FILTER and SPEED words are shorter), and STEP's step ruler and each lane's note, instrument and gate line (
C-3 I01 STAC) are at 2x. The greyed chip B lane (CHIP B IN M5) made room for it. - A failed background settings save is retried: a program error after the store took the settings (or the unsaved LAB edit) was never noticed; both are now written again at the next debounce, and the second failure in a row shows
STORE ERROR: NOT SAVEDonce. - Dense
.sidplayers write on time: a block of the audio now renders in up to 23 parts, not 15, so a player that writes 23-26 times within 16-19 samples (Thomkat, Kill Me, The Last Ninja) no longer has writes land at the end of their 128-sample block (up to 2.9 ms late). LATE on STATUS stays at 0 for them; Sound Test, with a write about every sample for a whole frame, still shows some. No memory and no audible change elsewhere. - A sound edit no longer asks about the song before a tune: a PRESETS change or a knob on LIVE or in LAB made SIDS ask
SONG NOT SAVEDbefore playing a tune, even on the built-in loop, and its discard lost the sound too (the song's file put its own back when the tune ended). Only the song's own edits (patterns, tables, instruments, its settings) ask now, and the keys' sound, effect slots, MIDI and chip A's setup stay as they are across the tune.
[0.5.0] - 2026-10-25
.sid playback: SIDOU's own 6502 plays PSID tunes on the chips, each write timed to its cycle, from the store (SIDS and NOW PLAYING); tunes go on over SysEx, with an openly licensed starter pack; STATUS, at 2x on three pages, shows the 6502's share of the CPU.
.sidplayback: PSID tunes (one or two SID chips, PAL or NTSC, up to 65,536 bytes) play on the FM-1 from the store. SIDOU's own 6502 runs a frame ahead of the audio in the main loop and stamps each SID write with its cycle; the audio interrupt places it at that cycle, so the timing is exact (and the tune never makes the audio wait). OSC3 and ENV3 reads see the chip's real voices (a shadow of them), as on a C64. Every GoatTracker 2 example and SIDOU song plays sample for sample the same as the host's reference, and the 6502 itself matches Tom Harte's and Klaus Dormann's tests. RSID tunes and MUS files are refused by name, never played wrongly ([docs/reference/psid.md](docs/reference/psid.md)).- SIDS and NOW PLAYING: the menu's SIDS (after SONG) lists the tunes on the store by name, eight a page; ALGORITHM or SAVE plays one and opens NOW PLAYING: title, author, year, the song (ALGORITHM changes it), the time, PAL or NTSC, each chip's model and the three voices with envelope bars. PLAY stops, EDIT + PLAY pauses; GLO mutes and solos the voices on the chip; MIDI start, stop (pauses) and continue follow. A tune takes the song's memory: with unsaved changes SIDS asks first (SAVE, discard or cancel), and the song comes back when the tune ends. The keys play chip B under a 1SID tune.
- SETTINGS → SID MODEL: AUTO plays each tune on the chip model its file names, KEYS on the chip the keys play, with its profile and character.
.sidfiles on the store, over SysEx: a tune goes in as a SysExPUTof type 2, checked at its first data message before anything is written, over USB-MIDI or the TRS jack.sidou-sysex sidmakes the.syx, with the same parser as the FM-1 and the same refusals ([the manual](docs/manual/sid-tunes.md));--packmakes one upload of a whole set.- A starter pack: eleven openly licensed tunes (five of SIDOU's songs and six of GoatTracker's example songs), in
assets/starter, each with a note on its licence and source ([LICENSING.md](LICENSING.md#the-starter-pack)). - STATUS shows the 6502: while a tune is loaded, STATUS's rows are the 6502's state, cycles a second, its share of the CPU and the ticks a thousand cycles took (timed with TIMER4), overruns, late writes, the voice shadow and a third SID's dropped writes. The flash day's checklist and its decision rule are in [docs/hardware-test.md](docs/hardware-test.md), section 21.
- STATUS is readable: it draws at 2× on three pages that SELECT turns (
1/3in the title): the knobs (the 6502's rows while a.sidtune is loaded), the chip, preset, octave and notes, the effect slots. Its help card names SELECT. - MENU: SIDS comes after SONG, so PRE and OCTAVE each move down one item.
- The store holds
.sidtunes beside songs (file type 2); a tune and the song share the song's memory, so the song views saySID PLAYING: STOP TO EDITwhile one plays.
[0.4.0] - 2026-10-25
A SID drum kit and digi drums, generative STEP (chance per step, MUTATE, DICE), recording over the USB cable, the button LEDs in two levels, an ARP helper in TABLE, SETTINGS -> RESET, and songs to MIDI on the site.
- Songs to MIDI, on the site:
midi.htmlturns a GoatTracker 2.sng(dropped or chosen, or one of the four showcase songs) into a Standard MIDI File in the browser: a track and a MIDI channel a voice (six for a GoatTracker Stereo song), one pass to the orderlist's loop point, the notes where GoatTracker's player puts them: speed, funktempo,FandEcommands, repeats, transposes, key offs and gate timers, legato and tone portamento as tied notes. One constant tempo and a tick that is a twentieth of a player call, so every start and end lands on a whole tick. The notes are the rows' (wavetable arpeggios, vibrato and slides are not followed), which the page says.web/songmidi.test.mjscompares every note's start, end and pitch with GoatTracker 2.77's packed player on the showcase songs, SIDOU LOOP and GoatTracker's examples (19,853 runs of the gate; fixtures made byhost/crates/gt2-ref/tests/midi_walk.rs). - Generative play in STEP: a held step plus ALGORITHM sets the step's chance to play on each pass (100 % down to 0, a lock in the LOCK chunk, parameter 9; GoatTracker plays the step always); the roll is seeded and made by the main loop a row ahead, so the audio interrupt only drops the note of a step that lost it. EDIT + ARP is MUTATE (two small changes to the lane's pattern: a note nudged within the scale or taken away, or a ghost step added) and EDIT + SCL is DICE (a new pattern for the lane, minor pentatonic notes on the eighth grid, or on the sixteenths for a SCNE drum lane): ordinary cell edits, plain GoatTracker 2 data.
- The button LEDs show more, in two levels: the hardware's dim glow means set or available, full light active now. ARP is dim while on and flashes on each arpeggio step (once a cycle at 1-2 frames a step); PLAY is lit on each beat and dim between while the song plays; REC is dim while armed, blinks through the count-in and is lit while recording; SAVE blinks while a question waits for it. With GLO held or latched, note keys 1-6 show the voices (lit sounding, dark muted, blinking solo), and in STEP the 16 step keys show the page (lit a note, dim an empty step) with the playhead's key flicking as it moves.
- An ARP helper on TABLE's WAVE table: press ARP on an arpeggio's first row (or a blank one) and set its steps as semitone offsets (SELECT, K1 octave, K2 semitone), the number of steps (ALGORITHM), the speed (K3) and the loop step or HOLD (K4); SAVE writes plain GoatTracker 2 wavetable rows, and rows written by it or by hand in the same shape open as the arpeggio. No new engine; GoatTracker's own packed player plays the rows as the helper says (a host test).
- SETTINGS → RESET: one reset for everything that is not a song. ALGORITHM clockwise asks (RESET?), SAVE alone does it: every preset's edits and all the saved settings go back to factory and are stored at once (toast RESET AND SAVED). Songs, USER chip profiles and MIDI learn mappings stay; HOME or moving away cancels with nothing written. Before, the only whole reset was a STORE format, which erased the songs too.
- A SID drum kit: a NEW song holds eight drums on the chip's own voices after its lead and bass, as instruments 03-0A: KICK, SNARE, CL HAT, OP HAT, CLAP, TOM LO, TOM HI and RIM. They are plain GoatTracker 2 instruments and table rows (a falling triangle for the kick and the toms, a tonal attack and noise for the snare, short and long noise for the hats, three noise bursts for the clap), so a song made with them plays the same in GoatTracker; each was tuned by rendering it on both chip models, and the kick keeps its weight on the 8580. Each drum sounds one frame (20 ms) after its row, every hit alike (its first frame resets the oscillator), with an 8 ms attack, and fades the same held or staccato (at tempo 5 and up); its instrument's SR is
00and a wavetableF6row (command 6, sustain/release) sets its release in its second or third frame, which keeps the chip's ADSR delay bug from holding the hit back 33 ms. STEP's and TRACKER's PRESETS popup names the instrument (03 KICK), so a lane's drum is picked by name. Decision record 0009. - Digi drums: short 4-bit samples (KICK, SNARE, CLAP, HAT) played through chip A's output as a C64 tune plays them through the 6581's volume register, at about 8.8 kHz, from the sample of their note, one at a time. A new
DIGIchunk in SIDOU's trailer marks the instruments that play them; GoatTracker skips it and plays the instruments' own GT2 content instead, so a song with digi drums still opens and plays there. A NEW song has them as instruments 0B-0E (DG KICK,DG SNARE,DG CLAP,DG HAT), copies of the chip kit's drums; while a digi drum plays, its voice's own sound is muted. They sound the same on either chip model (an 8580 plays them as one with the "digi boost"). The samples are synthesized by SIDOU's table generator, no recorded material. - Record SIDOU over the USB cable: the FM-1 is also a class-compliant USB audio input (UAC1, no driver on macOS, Windows, Linux or iPad), beside its USB-MIDI port in one device. A DAW records what the line out plays (after the effects, the limiter and MASTER), 16-bit stereo at 44.1 kHz, or 48 kHz resampled, the host's choice. It is Felucca's USB audio input from the same
usb.c, on as Felucca's firmware has it. The TIMER5 interrupt takes each block from the I2S buffer and feeds it, so the audio interrupt and its SRAM code are unchanged; recording costs the interrupts about 42 instructions a sample at 44.1 kHz and 335 at 48 (the resampler), and nothing while no host records. The installer's updates and SysEx work as before, still over the MIDI port. - The profile's word everywhere: STATUS names the chip as its model and the profile's word (
6581 CLASSIC,8580 CLEAN; both chips on a two-chip setup) and the PROFILE popup says the same at 2x, where they said6581 R4AR; the ergonomics readability table counts the new names as read while playing. - The emulator is fm1-emu
c1c045fc(wasdb8d472e), for the emulator gate and the browser demo: it runs the decrementing block load{r1, r3} = [-r1](fm1-emu #67, our report #64) andpsid_loadchecks its bounds (#68, our report #63), so the gate's own stand-in for that load,step_block_load_dec, is gone and with it theemulated_block_loadscount in the gate's reports. - About 25 KB of flash and 5.4 KB of the RAM region won back, nothing heard differently: the filter's cutoff codes are delta-coded (11,984 bytes), the combined waveforms' blocks overlap and alike rows are stored once (5,976), the noise tables are built at boot into POOL (2,980 of flash, 3,140 of the RAM region), the digi drums' codes are two a byte (2,412 of both), and the store is built at
-Oz(1,568).song_ctl.cis built at-Oz(112 bytes of RAMTEXT), so the code that runs from SRAM stays in its 48 KB, below Felucca's 8 KB debug area, which is kept free until a device check shows it is the app's ([hardware-test.md section 17](docs/hardware-test.md#17-code-in-feluccas-debug-area-v040)). The digi drums cost the audio interrupt less than before (9.47 instructions a sample, was 10.42). The study has the numbers. - A forced RESET says it reset. When RESET's save had to be forced (the device was never quiet), the toast said SAVED (GAPS); it now says RESET AND SAVED (GAPS).
- A NEW song's bass differs from its lead. Both were the same pulse at the same pitch. The bass (instrument 02) now plays an octave down (WAVE right column
74, relative note -12) with a thinner pulse, a quarter width ($400, its own PULSE row 03 after the kit's); the lead keeps the square. Songs saved from NEW before keep their sound. - A NEW song's lead and bass sound at their notes. Their wavetable rows kept the frequency unchanged (
$80on the right, GoatTracker's "keep frequency"), so no note ever set it: STEP's and TRACKER's auditions and PLAY gave only a faint thump on a voice stuck at 0 Hz (since NEW came in, 0.2.0). The rows now play the note (relative note00) and end withFF 00(the table stops, so the pattern's slides and vibrato still move the pitch). Songs saved from NEW before keep their rows: set the lead's and bass's WAVE right column to00in TABLE. - A NEW song's lead and bass start on their row. Their attack 0 met the chip's ADSR delay bug one time in nine (the envelope's rate counter, compared with the decay's rate for a cycle as the gate goes on, ran past attack 0's and waited out its wrap): the note then started 33 ms late, a flam against the drums, as GoatTracker plays it on reSIDfp too. Their attack is now 1 (8 ms to the top: AD
19for the lead,12for the bass). Songs saved from NEW before keep09and02: set the attack to 1 in INSTR for the same fix. - The first tap after picking an instrument auditions it in full. An instrument the song does not use yet waits a few calls for the player to take its tables in; a step key let go meanwhile released the note right after its first call, so the first tap after PRESETS (or any audition of a new instrument) gave a click of its first wave step instead of the instrument, and the drums all sounded alike. The note now sounds as long as the key was held.
- The MASTER popup stays away while the pot is untouched. The pot's readi
