The Firmware Hub · FM-1 · RUPTURE

RUPTURE1.89
by Joppe Sikken (SikkenWorks)
GitHub ↗
A monophonic bass synth on Cycle Exchange Synthesis: two sub-oscillators, a ladder filter, Channel EQ, eight effects from MOSFET drive to octave fuzz, a step sequencer up to 128 steps and an arpeggiator.
Text by the maker.
About it
- Engines
- Analog / VAIts own: CXS (Cycle Exchange Synthesis) · SAW
- Runs on
- FM-1 · Browser ↗
- Release
- 1.89 · released 13 Nov 2026 · on the hub since 1 Nov 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_968what it reports over USB while it runs- Build
- Built by its maker, not signed
- Popular
- ↓ 26 installs via the hub · ★ 2 on GitHub
Ratings
More by Joppe Sikken (SikkenWorks)




Like RUPTURE






Changelog
What changed, version by version8 versions
V1.89 (2026-11-13)
- Imported the speaker startup POPFIX from the user-supplied V1.88.2 source into the complete V1.88.3 firmware. Only
bringup.c,hal/fm1_audio.handnative_output_startup.hchange startup behavior; a separate ABOUT version label identifies V1.89. - Starts the silent audio DMA and I2S clock before asserting codec lines PC0/PC2/PC1. Preserves the original line order, with a 2 ms step and 5 ms settling interval. Warm restarts with already-enabled codec lines avoid an unnecessary second edge.
- Holds a watchdog-fed 300 ms quiet interval between codec start and LED-bank activation, avoiding coincident codec-bias and LED-current transitions. The existing PC6 analog gate still requires 400 ms LED stability, DMA/USB settling, and subsequent muted-to-audible fade; recovery and keyboard-only modes retain their respective audio restrictions.
- Preserved all V1.88.3 ENV frames: the smoke settles into the exposed hole and returns in exact reverse on note release. BEND/LFO graphics and the synthesis/FX/MIDI/storage engines are unchanged.
- Retained the native trusted OTA loader, the protected bootheader, NUL-safe read-only Web MIDI connection verification and Puya/UC25HQ80 flash compatibility. The loader and bootheader are verified byte-identical to V1.88.3.
- Native and host-side regression checks verify the intended startup order and OTA packaging. Whether the speaker pop is audibly eliminated requires testing on real FM1 hardware; this remains a software release candidate.
---
V1.88.3 (2026-11-13)
- Restored the full ENV eruption sequence: all 20 original-resolution 224×30 monochrome frames now progress from the intact brick wall through an eruption into a fully exposed hole. The final eight frames animate the plumes settling and clearing instead of freezing in place.
- Held note: the finished hole remains visible. Note release: the exact animation rewinds toward the intact wall from the displayed frame, without a jump or a second plume. Short notes and retriggering during release are handled continuously.
- Regenerated the native ENV sprite and hold-frame ROM tables directly from the 1-bit PNGs; verified per-pixel parity. LFO, BEND, audio processing, effects, MIDI, presets and flash storage remain unchanged.
- Retained the trusted OTA loader and protected 16 KiB bootheader byte-for-byte from V1.88.2. The existing Web MIDI read-only identity probe and NUL-safe connection handling are unchanged; both supported Puya and UC25HQ80 JEDEC IDs are still accepted.
- Native compilation and host tests passed. Hardware installation, frame timing and actual OTA on a physical FM1 still require validation.
---
V1.88.2 (2026-11-11)
- Fixed all 40 BEND frames across LINEAR, SOFT, HARD, S-CURVE and EXP. The previous 156×90-ish poster cells were stretched independently along X/Y to fit a 224×30 panel, creating the flattened appearance.
- Each original poster cell now supplies a true 1:1 pixel crop, 30 pixels high, positioned by a per-frame camera Y coordinate. The crop (156 pixels wide) is centered in the existing 224×30 black panel with side margins, avoiding all image resampling or geometric distortion. Tall scenery outside the panel is deliberately cropped; it is not squashed.
- Frame sequence, 4-of-5 shake behavior, static close-up camera (no shake), curve presets, original source poster, control logic, voices, audio DSP, FX, flash storage and OTA/bootloader behavior retained.
- The native ROM sprite bank stays exactly 33,600 bytes, with no additional per-frame computations in the audio engine.
- Native FM1 software builds and tests are not hardware validation.
---
V1.88.1 (2026-11-11)
- Corrects V1.88's visual mismatch: the earlier V1.88 firmware used newly drawn sprites, not the 40 illustrated frames from the approved reference poster. This release directly crops and converts the actual 5 × 8 cells in the user-provided 1536×1024 JPEG, retaining the source compositions.
- All five preset animations now use that poster: LINEAR (Everest), SOFT (inscribed monolith), HARD (pirate flagship emerging from a meadow), S-CURVE (ship close-up from bottom to mast), EXP (Kraken).
- The reference poster is a composite, not the original individual source PNGs: original cells are cropped and non-uniformly scaled to the native 224×30 1-bit RUPTURE viewport. This conversion necessarily loses resolution; both untouched poster and intermediate crops are provided for traceability.
- No runtime animation math: all five 8-frame sets are prepacked at build time to the exact existing 33,600-byte read-only ROM array. UI frame selection and the existing 4-of-5 shake behavior are unchanged; close-up remains stable.
- Audio engine untouched: no additional ISR, DSP, MIDI, DAC, FX or animation cycles inside audio processing. Existing native LCD deadline gating is retained.
- OTA/Connection Fix preserved: Puya
0x856014, UC25HQ800xB36014, Web MIDI generic port probing and NUL-safe FM1 identity handling. Original protected 16 KiB bootheader, trusted OTA loader and flash/storage layout unchanged. - Version bumped to V1.88.1 so the corrected firmware and download artifacts cannot be mistaken for the original V1.88 release.
---
V1.88 (2026-11-11)
- K3 selects one unique 8-frame 224×30 1-bit animation per curve: LINEAR = unchanged V1.87 Mount Everest; SOFT = monolith smashing through stone; HARD = a three-masted pirate flagship bursting up from a meadow; S-CURVE = a steady close-up camera travelling up the flagship, from cannon-pierced hull to Jolly Roger; EXP = a colossal Kraken tearing open the ground.
- The 40 pre-rendered 1-bit frames are generated offline and packed into constant 33,600-byte flash ROM data. No additional audio ISR work, realtime procedural art, animation framebuffer, voices or DSP effects. The original 5 pre-FX K3 response curves remain byte-identical.
- UI-only shake on all sequences except S-CURVE. Up to 4 tiny ±1/2-pixel offsets cycle at 85ms while actively bending. The existing audio-first LCD refresh budget remains authoritative and can defer frames if audio is busy.
- V1.87 Everest sprites are kept bit-for-bit, including their original height and 1-bit monochrome appearance.
- Existing OTA/Connection Fix (NUL-safe identity parsing, generic Windows MIDI ports), both supported flashchip JEDEC IDs (Puya
0x856014, UC25HQ800xB36014), trusted OTA loader, 16KiB protected boothead and flash layout remain untouched. - Audio DSP, all 3 reverbs, presets, sequencer, MIDI queue, PC6 speaker gate and save format remain unchanged. Hardware verification required before unrestricted release.
---
V1.87 (2026-11-11)
- Replaces the BEND page mountain animation with the new Mount-Everest-style eruption sprite sheet approved by the user. The mountain now bursts upward more realistically and aggressively as bend intensity rises.
- Integration is offline only: the eight 224×30 1-bit frames are preconverted from the supplied PNG sheet and compiled into
rupture_bend_sprites.hROM data. There is no procedural drawing, no particle system, no extra LCD buffer and no work added to the audio ISR. - K3 curve presets remain exactly as in V1.86.1: LINEAR, SOFT, HARD, S-CURVE and EXP. K1 live bend behavior and K2 range selection remain unchanged.
- OTA fix preserved: the V1.86/V1.86.1 Web MIDI connection fix, dual flash-chip support and trusted OTA/storage code are unchanged.
- Changed assets only:
vendor/etch-v1.88-source/firmware/fm1-native/rupture_bend_sprites.handvendor/etch-v1.88-source/firmware/fm1-native/bend_frames/*.
---
V1.86.1 (2026-11-11)
- BEND K3 now selects five distinct pitch-response curves: LINEAR, SOFT (ease-out), HARD (ease-in), S-CURVE (smoothstep) and EXP (cubic).
- K1 still pushes the active string-style bend and quickly releases when turning stops. K2 still selects 1/4, 1/2, FULL, 1 1/2 or DOUBLE (2 semitones maximum). All curves share the same precise endpoints.
- Native BEND UI shows three physical knobs and their current values, a tiny actual K3 curve preview with K1 playhead, and the *curved* live pitch, meter and existing mountain sprite animation.
- Curve is computed in the control/UI path, before effects, not in the audio ISR. At K3 LINEAR the existing V1.86 pitch response remains unchanged. BEND performance settings are not saved to project flash.
- OTA connection hotfix preserved: NUL-terminated FM1 identity and extra JEDEC bytes are parsed correctly; unknown Windows MIDI port names still undergo read-only identification. Both existing flash chip IDs remain supported.
- Existing trusted OTA loader, 16 KiB boot/header, storage format, project/sequence handling, CXS/SAW and all effects unchanged. Device validation remains pending; keep a recovery path available.
---
V1.86 Web MIDI connection fix (installer/website only, 2026-11-11)
- Fixes a real FM1 detection regression introduced by V1.85.2 flash-chip telemetry. The 27-byte identity payload is NUL-terminated; JEDEC bytes 24..26 must not be concatenated to
FM-1_968. - Both Puya
0x856014and UC25HQ800xB36014identity packets now parse correctly, while invalid device identities remain rejected. - If Windows exposes generic or unrecognized MIDI port names, the installer safely probes at most 16 input/output combinations using the read-only ID query. OTA CHECK and WRITE rules are unchanged.
- Adds visible MIDI input/output diagnostics and a manual port pairing fallback when no FM1 identity is returned.
- No native FM1 firmware, audio, storage, OTA loader or flash image bytes were changed. Existing
RUPTURE-V1.86.fwscSHA-256 remains239edee0056b32896f6f293cab22a05e366b94928ed76d2ebd4487047a45ccd8. - FX short press continues to open the existing FX screen. Hold FX for 700 ms to open the new BEND play-parameter screen.
- K1 momentary bend: turning K1 raises the playing pitch; releasing the encoder causes the bend to return rapidly to zero. K1 is transient performance control, not an FX wet level or a stored patch edit.
- K2 range: select
1/4,1/2,FULL,1 1/2orDOUBLE(maximum 2 semitones). The active target, live semitone offset, 0–100% meter andIDLE/BENDING/RETURNstatus appear on the native 240×240 UI. - 8 original 224×30, 1-bit mountain PNG frames, compiled into packed ROM sprites: rise in response to K1, reverse automatically as the bend returns. No live mountain drawing or additional LCD buffers in the audio interrupt; existing CRT/VCR optics work on BEND.
- Pitch scaling is applied to the oscillator rates before the existing FX processors, preserving the sonic processing order, reverb algorithms and MIDI handling.
- BEND is session/performance state: no changes to stored projects, update-loader bytes, NOR layout, preset format, LEDs, PC6 startup logic or legacy page behavior.
- Native JieLi FM1 compilation and release packaging completed. Physical FM1 responsiveness, audible bend feel, DMA headroom, flash upgrade and post-USB power-on plop remain unverified without real-hardware checks.
- Add
hal/fm1_flash_id.hwith exact allowlist0x856014(Puya P25Q80) and0xB36014(UCUN UC25HQ80). Both are 1 MiB SPI NOR; flash map, erase/program commands and project serialization stay unchanged. - Read and cache JEDEC once before audio startup. Recognized IDs permit normal project and OTA staging writes; readable unknown IDs are refused. A failed/unavailable read (0) preserves V1.85.1's existing write behavior.
- Expose the cached ID in bytes 24–26 of the 27-byte MIDI update identity reply, retaining the exact
FM-1_968text and the original SysEx protocol. - Preserve the audited vendor/Felucca-derived app-only OTA loader and bootheader byte-identically: there is no separate JEDEC allowlist in that loader, so there is no verified loader-side patch to apply.
- No changes to synthesis, realtime DMA, sequencer, MIDI scheduling, UI, speaker-pop mitigation, flash partition boundaries, project data format, or first-run wizard. Existing V1.85.1 functionality is preserved.
- Host allowlist/unknown ID/identity tests, native FM1 build, MIDI regressions and sequencer audio regressions pass; project persistence and OTA on a physical UC25HQ80 FM1 remain unverified.
- Corrected the audio-engine sequencer length validation: LENGTH=4 displayed a four-step loop on the UI but the DSP incorrectly defaulted to sixteen steps.
- The real audio playhead wraps inside the selected length when LENGTH is reduced during playback; only selected steps can trigger on subsequent note boundaries.
- Steps beyond LENGTH are not deleted; raising LENGTH to 16 restores all sixteen recorded notes.
- Only
audio_core.cchanged in FM1 firmware sources. Sound, reverbs, all other sequencer behavior, storage, Welcome, MIDI, LED/PC6 and OTA remain byte-for-byte unchanged at source level. - Real DSP host tests cover live 16→4→16, fresh four-step loops and the unaffected 8–128 lengths. Unrelated 16-step/FX PCM is byte-identical to V1.85. Hardware verification pending.
- Bound exceptional USB MIDI bursts to 32 queued packets per 128-frame audio half. Preserve FIFO and existing overflow panic; remaining events are serviced next DMA half. This is a deliberate latency/headroom tradeoff only under extreme incoming burst traffic, never a note-drop policy.
- Fast-path unchanged 27-key outbound panel MIDI; retry pending unsent Note OFF/ON after USB queue backpressure.
- Skip optional scope copying when USB MIDI backlog remains; actual PCM and effects never skipped.
- Add second read-only GLO → AUDIO DIAGNOSTICS page (SEL to switch) showing pre-render control peak, nested TIMER5 peak, latest DMA slack, maximum MIDI batch/queue, deferred MIDI batches, guard count and post-publish LATE count. The LATE, GUARD and POST LATE counters remain cumulative across audio restarts, allowing LATE=GUARD+POST LATE to remain meaningful. Original diagnostic display retained.
- Keep native CXS/SAW, both SUBs, all three reverbs, Welcome/format, native PC6 LED-pop mitigation, project codec, OTA source, trusted OTA loader and protected bootheader unchanged.
- Native JieLi build and host randomized 120,000-state panel-MIDI packet parity tests pass. Physical FM1 DMA LATE/GUARD and pop-free speaker operation remain to be verified.
- Removed the simultaneous full-current twelve-button LED transition during AUDIO STOP/SAFE/UPDATE status. Protected states now keep the background function LEDs on their existing fast low-current glow; physical press feedback remains immediate. Normal page, SEQ, PLAY and REC LEDs remain unchanged.
- PC6's existing digital-silence/USB-stability startup now additionally requires 400 ms of actual stable function LED masks before the single analogue power-enable transition. The LED soft-start is refreshed during the Welcome wizard, and the bank is initialized before the audio start.
- Not changed: synth PCM, SUBs/DRIFT, ROOM/HALL/SPRING and all FX, audio fault-stop guard, input/LED scan ISR, sequencer, storage, first-boot wizard logic, USB MIDI/OTA, protected 16 KiB header, trusted OTA loader. No PWM is applied to PC6.
- Cross-build and host startup arbitration tests passed. The source-based mitigation is not proof that a hardware-only PC6 amplifier-bias pop has been eliminated; a low-volume physical comparison, including GLO-held PC6-muted diagnostic, is necessary.
- Only the function-button LED policy changes. In V1.84, the first-run Welcome state commanded all twelve function LEDs at full current in one update. V1.84.1 uses low-current glow for Welcome, introduces the dim states incrementally during the first ~260 ms, and then hands control to the original V1.84 LED rules.
- Unchanged: every non-startup button and note LED behavior, all synthesizer/DSP/reverbs, LCD, hardware matrix-scan ISR, USB/MIDI, boot/welcome logic, storage, protected flash header and OTA loader.
- Physical limitation: the sudden LED-current step was a plausible coupling source, but a startup pop can also result from the separate PC6 analog amplifier enable. The latter is deliberately untouched. The speaker-pop fix is not proven on FM1 hardware yet; do not infer physical silence from host tests.
- Contextual function LEDs: active hardware page is bright; inactive function keys retain the existing fast dim glow. Physical presses always override the page indicator. Sequencer PLAY, armed/live REC and SEQ count-in each have unambiguous LED ownership. Normal octave, note, GUIDE and GRID feedback is preserved.
- Encoder consistency: a page change resets K1–K4 acceleration history, so a fast turn on the previous page cannot double the first movement on the new page. Selecting another FX panel also resets the history; discrete controls and existing accelerated continuous controls otherwise behave as before.
- Realtime isolation: changes only in UI/control-loop routing and button LED planes. No changes to the synthesizer DSP, three reverb engines, IRQ timing, HAL scan implementation, project schema, Welcome completion logic or native OTA writer.
- Validation limits: cross-compiled native firmware and host tests, including function LED priority and count-in logic. Physical LED perceived brightness, responsiveness and DMA/GUARD counts still need verification on actual FM1 hardware.
- Mono mixer: replaced per-sample variable Q10 5–8-voice headroom stepping and variable division with the mathematically identical fixed
/4operation for the always-monophonic RUPTURE build. Unmodified upstream poly behavior remains under the non-RUPTURE build path. - Master volume: its Q16 target is now calculated once per audio render block, retaining the exact per-sample smoothing for changing gain, MIDI notes and preset ramps.
- Sound preservation: CXS, SAW, both SUBs with DRIFT, all three unique ROOM/HALL/SPRING reverbs, all other FX, envelope, sequence and MIDI paths are unchanged. Host stress renders match V1.82 sample-for-sample for rapid notes and multi-FX scenarios.
- Safety: project storage, the existing V1.82 Welcome completion marker, exact protected 16 KiB bootheader and trusted OTA loader are preserved; no new flash writes or partitions. The installed firmware's physical DMA deadline and true worst-case cycle headroom still need measured hardware validation; zero-underrun operation is not yet certified.
- Replaced the legacy-only
welcome_doneboot decision with a CRC-checked V1.82-specific completion marker in the existing device settings journal. Legacy V1.81 completion is now treated as requiring the V1.82 wizard once; normal subsequent boots skip it. - Complete Welcome, backup confirmation, safe optional format choice, CRT preference and optional 43-screen Quick Tour are restored on first V1.82 startup. Valid project storage is not erased by the wizard, and format remains an explicit user action.
- New settings records preserve existing volume, autosave, screensaver, autoload-project and CRT controls; legacy records remain readable. No new flash partition or storage payload format.
- Limitation: an V1.82 → V15 → *same V1.82* round-trip cannot always be distinguished from a restart if V15 preserves the journal. Reinstalling exactly the same firmware cannot be guaranteed to force the wizard automatically.
- Host regression covers legacy marker migration, restart, two project records, torn writes and previous journal compaction. FM1 first-boot hardware behavior is not yet verified. Original OTA code, trusted loader, protected header, synth and reverb processing remain unchanged.
- Fast-note mono DSP: compute pitch increments and organic/LIVING control state only for RUPTURE's single active mono voice, rather than eight unused ETCH polyphonic slots. MIDI note-on, note-off, legato, step gates and all sound processors remain unchanged.
- Timed mono gates: do not rewrite the held-note stack on each audio sample when no sequence note expired. On a genuine gate expiration compact the stack exactly as before, at the same sample.
- LCD contention: rapid key presses previously marked every frame as an urgent SPI LCD update, bypassing UI pressure throttling. Coalesce only visual updates during detected note bursts to at most ~13 fps (~10 fps under audio pressure). User interface actions retain priority; no change to audio/MIDI event handling, modulation, or sample rate. Animation frames are skipped only as redundant intermediate displays, not removed from assets.
- Reverbs: SPRING, ROOM and HALL DSP files and audio algorithms untouched. Project storage, bootheader and OTA loader untouched.
- Host verification: byte-identical PCM output in a 512,000-frame rapid MIDI/step-gate/sustain/FX scenario, host note-burst UI budget tests, native FM1 crossbuild. Physical DMA LATE/GUARD and DSP cycle budget still need confirmation; cannot guarantee zero hardware underruns from host tests.
- ROOM: replaced the shallow single-ring reflections with four independently delayed, damped lines in an energy-distributing Householder FDN. SIZE alters line lengths; DECAY controls loop feedback. A fully wet ROOM return no longer relies on low-level taps from an unrelated reverb design.
- SPRING: replaced sign-alternating feedback with two differently sized cross-coupled delay loops and cascaded short allpass dispersers, including loop-dependent re-dispersion. Damping and restrained spectral shaping target a more usable spring-like tail rather than the previous brittle metallic sound.
- HALL: preserved the existing algorithm and its native PCM behavior. The three engines share the same established 4,096-sample tank and 64-sample diffuser; just one engine processes each frame. K1 TYPE, K2 DECAY, K3 SIZE and K4 MIX remain unchanged. Project format / default legacy-HALL migration unchanged.
- CPU work: replaced redundant 64-bit Q15 calculations in phaser, tremolo, auto-wah, tape and decimator with *exact* bounded 32-bit products. Removed per-sample SIZE/DECAY-to-gain conversions from ROOM/SPRING: coefficients are cached at the parameter-change boundary. No new oscillator, FX instance, reverb PCM buffer or UI ISR.
- Validation: native FM1 crossbuild, 2-million-frame topology switching and bounds test, SIZE/DECAY response tests, high-gain SUB+FX stress for all three reverb engines, Hall sample-for-sample golden comparison, and native package/hash checks. Original OTA source, protected bootheader and trusted loader preserved.
- Caveat: ROOM uses a more capable delay network and can be slightly more expensive. Hardware DSP MAX, live DMA LATE/GUARD behavior and subjective realism still require actual FM1 measurements and listening. Never claim guaranteed zero underruns without physical testing.
- See
docs/TEST-V1.80.mdfor results and limitations. Includes original synthesized stereo WAV comparisons indemos/. - Optimized both suboscillator Q16 pitch increments using a sample-exact saturating 32-bit partial-product fast path. Continuous per-sample drift, phase, detune, octave, note timing and waveform remain identical to V1.78 (700,000+ tests and identical long-run PCM hash).
- Optimized eleven additional global FX dry/wet interpolations and both channels of the three independent reverbs using mathematically exact Q15 32-bit operations. An out-of-range guard retains original 64-bit precision when necessary. Full all-effects PCM output matches the V1.78 engine byte-for-byte in stress scenarios, including reverb switches.
- Coalesced knob-only LCD redraws under recent measured audio wall-time pressure (50/75/100ms limits, plus nonessential art capped at 20fps). The knob parameters continue publishing at normal input speed; urgent navigation, metronome, notes, screen state and OTA are not delayed. This targets SUB + DRIFT edits under heavy CPU/DMA pressure without reducing audio DSP quality.
- No DSP buffer/FX topology/project codec/sequence/OTA changes. Hardware DMA LATE and GUARD must be measured on the actual FM1; no zero-underrun guarantee before hardware soak testing.
- See
docs/TEST-V1.79.mdfor exact PCM parity, native tests, integrity and remaining physical validation. - Replaced the previous single shared reverb algorithm with three different real DSP topologies: SPRING (dispersive allpass + inharmonic sign-alternating feedback), HALL (Schroeder diffusion + filtered multi-tap late-feedback tank), ROOM (sparse specular early reflections + short damped feedback comb).
- K1 selects the algorithm without overwriting the user's SIZE or DECAY; K2 = DECAY, K3 = SIZE, K4 = true 0–100% dry/wet. At full wet there is no direct oscillator feed. Only one algorithm runs per sample.
- The three engines use the existing 4096-sample reverb ring, 64-sample diffuser and filter states; no new SRAM, effect instances, per-voice work or external dependencies. Actual FM1 DSP/DMA performance remains subject to physical measurement.
- The selected engine is now saved for project-global and per-preset FX by using two previously-unused bits of the existing 1-byte routing field, retaining the PJT34 record length and CRC. Legacy routing values 0/1 decode as HALL and remain loadable. Older RUPTURE releases may reject newly saved projects with SPRING or ROOM, so make backups before downgrading.
- The 16-KiB protected bootheader, trusted OTA loader, OTA native code, device identity and all other synthesizer and sequencer modules are preserved.
- See
docs/TEST-V1.78.mdfor host DSP, storage, throughput and firmware verification. Not physically verified on FM1. - SELECT on a normal screen with no assigned SELECT behavior now opens the identical scrolling screen list used on PLAY. Dedicated SELECT functions for FX, SEQ, project/sequence slots, help, settings and safe dialogs remain unchanged; no interception during OTA/recovery/welcome.
- SAW oscillator timbre: the original one-pole low-state and bandlimited SAW are retained. Rebalanced BRIGHT response puts a warmer filtered bass core in the lower/middle travel, while EDGE and SOUND SHAPE are less prone to premature hard clipping. No extra oscillator, delay line, wavetable or filter state. The original CXS oscillator code is untouched.
- Reverb: SPRING, HALL and ROOM tonal presets use more distinct SIZE/DECAY values and expanded existing tap spacing. A much more audible five-tap wet return, with stable 0% dry / 100% wet endpoints, fixes the perceived volume-drop-only behavior. The existing single 4096-sample tank, five reads and stereo return path remain in place; no per-voice reverb or larger buffers. These are character presets within the same algorithm, not separate physical spring and hall simulations.
- Builds and host regression/measurement results are in
docs/TEST-RESULTS-V1.77.md. No project storage-layout change, firmware identity change, bootheader change or trusted OTA loader change. Hardware listening/CPU/DMA verification is still required. - Recording quantization: note-ons snap to the nearest step rather than the delayed main-loop cursor. RUPTURE uses the hardware note-contact timestamp and current audio sample-clock phase, including tempo/swing and the wrap between first/last steps. Sustain tracks quantized note-on origins and does not count a future step before it starts.
- Count-in downbeat capture: the ISR-to-UI transition now reads the live audio step even before the UI publishes transport ON; it no longer substitutes the unrelated edit cursor. A key pressed within the last 50 ms before step 1 can be captured on the first step once it remains held. The first-step guard prevents the timestamp from wrapping a valid downbeat hit back to the previous sequence's last step.
- Count-in transport latch: after the UI acknowledges the start, the ISR's temporary force-PLAY flag is released, so later PLAY/STOP controls remain effective.
- Intermediate LED brightness: the existing 11-column LED multiplex scan uses 1-in-2 cycles (~455 Hz), or 1-in-3 in DIM LO (~303 Hz), rather than 1-in-8 (~114 Hz) / 1-in-12 (~76 Hz). No extra timer interrupt, LCD draw, audio callback, PWM timer or new buffer is added. Felucca HAL and boot are unchanged; RUPTURE sets compile-time overrides.
- Preserves V1.75 two-bar count-in, REC/PLAY behavior, independent click, sustain, pattern shift, step clear, ENV graphics, storage codec, protected 16-KiB boot header and exact trusted OTA loader. Native/host verification only; physical LED perception, key feel, timing and device recovery still require tests.
- Pressing REC on a stopped sequencer now ARMS live recording without starting playback. Press PLAY after REC to hear two bars of quarter-note clicks. The grid and physical SEQ key flash with the sample-clocked ticks; playback and recording begin together on step 1 after exactly eight beats.
- When the sequencer is already playing, REC still toggles live recording immediately, with no count-in. REC or PLAY during an active count-in cancels it; the synth can be played during countdown without capturing notes.
- The original independent PCM metronome mixes outside the monophonic synth. PRESETS still controls BPM; ALGORITHM changes metronome volume while armed/recording. Transport changes do not allocate voices, write flash or change the project format.
- Updated 43-page Quick Tour sequencer lesson, 13 HELP cards, cheat sheet and README. Protected bootheader and trusted OTA loader from V1.71 are retained; hardware validation remains necessary.
- Live sustain recording: detect key holds and releases against the sequencer audio playhead; record their length inside the existing note data without creating new triggers or discarding HOLD/lock lanes. Every take is session-local until the user saves.
- SEQ long press: removed the shortcut that opened the sequence library. SAVE on SEQUENCER still opens the eight sequence slots.
- SEQ + PRESETS: while physically holding SEQ, turning PRESETS shifts the entire current sequence left or right one step per detent, wrapping around. It preserves note durations, local HOLD events, explicit HOLD origin references, parameter locks, and other pattern settings. The dormant pattern buffer is filled outside the audio interrupt; only the final pattern pointer is swapped atomically. PRESETS still controls BPM when SEQ is not held.
- Welcome-overlay: found that previously completed onboarding is intentionally skipped using persisted
welcome_done. Returning users now see a short, *read-only*, non-destructive WELCOME screen at normal boot (the complete setup wizard remains only for first-time users). No flash format or forced setup. - Quick Tour SEQUENCER lesson, HELP cards, README, cheat sheet and GitHub Pages documentation updated. METRONOME control stays ALGORITHM during REC; OTA and bootheader retained.
- Host tests / native build results are documented separately. Hardware behaviour remains unverified.
- During active live sequencer recording, PRESETS keeps its existing global BPM role, with no special REC exception. Changes affect sequencer tempo and the beat-synchronised metronome together.
- ALGORITHM controls metronome volume (0–100) only while live recording. Encoder events are consumed before normal sequencer HOLD and other page controls; outside live recording the original ALGORITHM mappings are unchanged.
- Updated the native SEQUENCER footer, Quick Tour SEQUENCER lesson (including space for its instruction), onboard HELP with a dedicated LIVE REC CLICK card, README, cheat sheet and website embedded documentation.
- No changes to the separate metronome PCM mixer, monophonic synth DSP, existing ENV PNGs/animation, sequencer step-clear logic, project/sequence storage, OTA logic, protected bootheader or OTA loader. Physical FM1 testing remains required.
- ENV: introduced eight reworked, pixel-exact 224×30 monochrome PNG smoke/debris settling frames derived from the original wall. The smoke/falling pieces disappear after the eighth frame. The wall maintains its subtle, UI-only 1-pixel tremble throughout Note HOLD, and the original Note OFF closing frames remain unchanged. PLAY/LFO/SOUND SHAPE sprites and all existing opening/closing frames are untouched.
- Live REC: a quarter-note metronome follows the actual native sequencer's BPM/step triggers. It is rendered as a separate short audio click after the mono synth's voice, effects and idle gate. It never allocates, steals, silences or retriggers synth voices. It runs only in live recording, including during sequencer rests. PRESETS controls its independent 0–100 session volume while recording. Ordinary PLAY has no click.
- Sequencer: pressing SEL while stopped clears the whole selected step, all triggers, local HOLDs and six parameter locks, and safely detaches the directed HOLD links from other steps that reference the cleared triggers. Unlike V1.71, it does not delete only the first note. Step clear is blocked during transport/REC. No project format migration or storage-region changes.
- Added bounded host tests for metronome independence/tempo subdivision, full-step clearing, original asset parity, settling, sustained vibration and release behavior. Native FM1 builds and exact firmware OTA-container checks are required before any hardware claim; physical FM1 installation remains unverified.
- OTA: no modifications to native OTA handler, bootloader/header, update protocol, firmware identity (
FM-1_968), flash layout, recovery or persistent data codec. - After the original first-run CRT/storage setup, added an opt-in VIEW QUICK TUTORIAL? YES/NO question. NO immediately completes setup; YES enters 43 read-only real-screen previews. No setup data is written until the existing first-run finish path, and no flash format can be triggered in the tutorial.
- Each lesson shows the existing native 240×240 1-bit screen, the actual route into that page, and descriptions of functional K1–K4 encoders. All eight FX receive separate chapters. Non-editable screens explain their purpose without inventing knob functions.
- Compact bottom overlay: SEL next, SELECT previous/next, ALGORITHM full-screen text toggle, HOME skip/exit. No parameter, patch, sequencer, storage, MIDI or OTA actions are executed by tutorial navigation.
- Added GLO → QUICK TOUR so existing installations can replay the walkthrough; replay explicitly avoids altering the welcome setting or writing the global settings journal.
- The four animated scene renderers, knob focus/easing and DSP remain unchanged. The protected bootheader, trusted OTA loader, V15 return path and OTA behavior remain subject to native regression testing. Physical FM1 and V15 tests are still required.
- ENV: after the original wall-break opening animation, eight new original 224×30 monochrome hold frames make the airborne dust drift down and disperse. The last frame is pinned, motionless, for as long as a note remains held. Note OFF still uses the original ENV closing frames 13–19; short taps also close safely.
- LFO: after the original sinkhole opens, eight new original 224×30 monochrome frames show small rocks continually falling into the dark hole. They loop throughout Note HOLD. Note OFF retains the original reverse sequence down to the intact road.
- Added 16 pure 1-bit PNG source sprites, loop previews and a reproducible generator. The source graphics are packed into read-only native firmware ROM; no particle calculation, extra framebuffer, work in the audio ISR or new DSP overhead.
- The 20 original sprites of each existing panel animation (PLAY, ENV, LFO, SOUND SHAPE) remain byte-identical. The original HOLD animation of PLAY and SOUND SHAPE is also unchanged. The LFO shake continues during falling dirt; ENV shake ceases once dust has fully settled.
- Added actual native renderer and scheduler regression tests for settling, endless loops, immediate release, short taps and the on-screen sprite bytes. OTA/recovery identity and trusted loader are unchanged; a physical FM1 and V15 recovery test remain required.
- Precomputed compressor attack, release, threshold and ratio coefficients are refreshed on parameter changes rather than calculated for every PCM sample. The compressor transfer function, envelope rate, feedback and gain remain identical to V1.68. Existing idle bytes in the native FX state are reused; FX state footprint is unchanged.
- Replaced the four-knob 45×45 per-pixel geometry scan with exactly the same 332 foreground pixels per rotary outline. The entire 240×240 native framebuffer is pixel-identical to V1.68 across 42 non-versioned screen fixtures, including FX, EQ and knob focus.
- Knob animation targets 40 FPS (25 ms main-loop service) when DMA deadlines are healthy, independently of the historical DSP MAX. Time-based needle easing stays responsive when some LCD frames are late. Presses and parameter text remain immediate.
- PLAY, ENV, LFO, SOUND SHAPE loops and shake retain their original progression. Only actual repeated DMA deadline misses trigger the existing audio-first backoff (50/100 ms), never just a high historical DSP MAX.
- Tests: 800,000 stereo PCM frames with live compressor automation match V1.68 sample hashes, and 12 additional FX scenarios and 42 native framebuffers match exactly. Physical FM1 CPU load, sustained LCD FPS, audio deadlines and cross-firmware/V15 recovery still require hands-on testing.
- The trusted OTA loader, protected 16 KB bootheader and firmware identity
FM-1_968are preserved. - Step 1 note removal: the RUPTURE sequencer key-toggle can now delete a trigger at zero-based step 0 even when older directed HOLD links reference it. Exactly those dependent links are detached, while unrelated triggers, independent legacy HOLD lanes and parameter locks remain unchanged. The same behavior applies to all 128 visible steps.
- Explicit stopped-step delete: press SEL in the stopped SEQUENCER to remove the displayed note on the selected step. This is also available on STEP 1; no delete is performed by SEL during live recording. Tapping the same note key retains its normal toggle behavior when the transport is stopped.
- REC playhead animation: the visible sequencer cursor now requests an LCD repaint when the audio engine advances a step; a deferred frame remains pending until painted. The high-load LCD safety cap is retained. Sequencer LEDs, audio clocks, MIDI, DSP and flash persistence code are unchanged.
- Clear recording state: the SEQUENCER header shows REC instead of PLAY while recording. The native SYSTEM INFO version now reads V1.68.
- OTA and recovery packaging retain the byte-identical 16 KiB protected bootheader and trusted OTA loader. Physical FM1 verification is still required.
- Fixed the actual issue: K1–K4 focus is now recorded for every editable rotary page, including all eight FX choices. The internal FX-page forwarding can no longer hide the focus indication.
- Added the same side-of-knob focus bars to the SEQUENCER, which uses a separate renderer, and to the fifth ALGORITHM/BLEND knob on SUB 1 and SUB 2. Channel EQ shows a corresponding row indicator because its parameters are displayed as values rather than round knobs.
- The active indicator lasts approximately 950 ms after the last turn and clears on page changes, FX selection changes, and EQ tab changes. It never draws through labels or values.
- No changes to synthesis, DSP, sequencer timing, project format, OTA code, trusted OTA loader, or protected bootheader. Physical FM1 validation remains required.
---
- Replaced the old SCL label with SEL on native RUPTURE screens and help pages, and in the current user documentation. Hardware button mapping is unchanged.
- Fixed the V1.64 animation slowdown: changed sprite/shake frames remain pending until an LCD paint actually happens. Scheduled frame updates also catch up to wall-clock time after a slow main-loop iteration. Real repeated DMA misses still impose a protective render budget.
- PLAY has an actual subtle 1-pixel water-loop shake. ENV, LFO and SOUND SHAPE preserve their held-note animations and closing sequences. Original 1-bit PNG bytes, frame order and octave-based PLAY speed are preserved.
- CXS WEIGHT now increases the low/high tonal contrast instead of mostly adding gain. CXS PUNCH emphasizes upper-band/transient content for the full duration of a held note instead of ending after eight oscillator cycles. The original first-eight-cycle attack accent remains at reduced intensity.
- With WEIGHT/PUNCH at zero, CXS output is sample-identical to V1.65; existing saved presets with nonzero WEIGHT or PUNCH will intentionally sound different. SAW shaping stays unchanged. No project/storage format change or new audio buffer.
- Native build, targeted real CXS/SAW audio regressions, sprite renderer checks, OTA staging/regression, package CRC, pinned bootheader/loader and WebInstaller parity were retested. Physical FM1 audio and V15 restore tests remain outstanding.
- Rebuilt and audited the V1.64 feature set without changing audio/DSP, storage schema, USB/OTA or rescue logic.
- Corrected the SYSTEM INFO version and fixed the outdated firmware filename in README.
- Added a structured, reproducible release-gate report with a physical FM1 acceptance matrix.
- Verified application package boundaries, pinned bootheader/loader, installer parity and regression results.
- Release status: software RC only. Real FM1 stress and actual V15/cross-firmware recovery remain mandatory before a production release.
- Consolidated two competing screen-rendering paths into one and replaced redundant 50 ms idle full-screen redraws with a calibrated main-loop display budget: 350 ms idle refresh, 50 ms animation refresh under normal conditions, 100 ms with pressure/late DMA indicators, and 180 ms under severe stress. No new DSP/ISR work, buffers, synthesis routines or notes were changed.
- Physical inputs, notes, page transitions and explicit warnings remain immediately paintable. Only optional intermediate cosmetic frames are dropped when audio pressure increases.
- SYSTEM INFO now identifies the battery result as a coarse voltage band (LOW, MID, HIGH, FULL or UNKNOWN), not as a precise fuel-gauge percentage. USB link status and existing DSP/DMA diagnostics remain read-only.
- Existing FM1 key LEDs, active-note and sequencer LED mappings, 1-bit RUPTURE animations, PROJECT & PRESET safety, screen filter default OFF, and first-run wizard are retained.
- Protected 16 KB bootheader, trusted OTA loader, firmware identity and native cross-firmware / V15 recovery implementation preserved. OTA simulations do not replace a physical cross-firmware and V15 restoration test.
- Added an explicit unsaved-work indicator in the UI header and next to the active project's name in the project library. This is separate from the autosave retry flag, so a failed autosave never falsely clears the warning.
- The existing two-press project OPEN confirmation now warns about unsaved edits. STORAGE > PROJECTS also warns before switching away or reloading the current project. HOME or moving the cursor cancels confirmation.
- Uniform flash-operation feedback: SAVING/LOADING, SAVED SUCCESSFULLY, LOADED SUCCESSFULLY, SAVE FAILED, LOAD FAILED. Success is only announced when the existing storage operation reports OK.
- Added a RAM-only, single-gesture knob UNDO using HOME+SCL. Safe single-byte controls on PLAY, SHAPE, SUB 1/2 and TILT/FUZZ/SANDPAPER only. Complex FX, sequencer changes and project loads intentionally excluded.
- Updated SYSTEM INFO to report the actual V1.63 firmware version. Existing animations, CRT default OFF, boot identity, native audio DSP, storage journal format, protected OTA bootheader, trusted loader and cross-firmware/V15 restore source left unchanged.
- OTA/V15 hardware cross-install and audio stress tests remain required on physical FM1 units.
- Added a dedicated read-only SYSTEM INFO screen under GLO: firmware and identity, USB link, battery, storage, project-slot count and measured DSP/DMA peaks.
- Polished continuous knob behavior: one step per slow detent; controlled two-step acceleration only on sustained rapid turns. Discrete choices never accelerate.
- Added a subtle, temporary focus marker to the last changed control knob.
- Kept CXS/SAW audio DSP, all existing waveform animations, storage journal schema and OTA/recovery routines unchanged.
- Physical FM1 verification remains required, especially audio DMA margin and cross-firmware/V15 transition.
- Following a deliberate three-second SAVE hold, the wizard now displays a dedicated FORMATTING... / PLEASE DO NOT POWER OFF screen while the existing storage operation runs.
- The result remains on screen until SEL is pressed (with a short anti-skip interval): FORMAT SUCCESSFUL / STORAGE READY and a visible check mark only after successful initialization; STORAGE ALREADY READY if valid RUPTURE storage is present and no erase occurs; FORMAT FAILED on an unsuccessful operation.
- Existing NO paths, CRT choice, project storage, animation sprites, synthesis, and OTA-to-other-firmware/V15 recovery code are preserved.
- This is a UI/control-flow correction. No additional work or allocations in the audio callback. Hardware validation remains necessary.
- First launch shows a 240×240 monochrome welcome overlay with backup confirmation, a continue-without-backup branch (including
:(), optional storage formatting, CRT ON/OFF selection and a visible CONTINUE TO RUPTURE action. - Flash format is never automatic. The wizard requires an explicit YES followed by a three-second physical SAVE hold; HOME/SEL cancels. Already-valid RUPTURE project storage is preserved rather than reformatted.
- Setup-completed status is stored in the existing CRC-protected global settings journal, without a new flash partition or per-project format. The marker is copied through A/B project saves and journal compaction. If the user continues with no compatible, initialized storage, no journal write is possible and the wizard may reappear on reboot.
- CRT preference stays stored globally; previously chosen CRT preferences are respected until changed. The audio ISR, synthesis/DSP code, protected bootheader, trusted OTA loader and cross-firmware/V15 restore logic are unchanged.
- README is now a permanent user guide with no release-history text. CHANGELOG.md contains release history. The distribution is cleaned of stale firmware binaries, old build outputs and redundant logs.
- Native build, welcome-flow and storage-journal tests passed. Physical FM1 formatting, startup and V15 restoration remain to be tested on hardware.
- Adds a subtle, 1-2 pixel shake to existing LFO sinkhole, ENV wall rupture and SOUND SHAPE volcano 1-bit sprites.
- ENV and LFO now continue shaking while their note gate is held, and reverse/close normally at Note OFF. Volcano's 3-frame lava loop shakes with its sprite changes.
- A byte-packed UI-only shifter keeps the blit inexpensive, with no extra screen framebuffer, no sprite rerendering and no change to audio processing.
- The original sprites, CXS PRESSURE fix, persistent settings, identity
FM-1_968, cross-firmware OTA logic and stock V15 restore logic remain intact. - Physical FM1 audio/display and cross-firmware recovery still need hardware verification.
- Added subtle PLAY-style shake/jitter to the SOUND SHAPE volcano animation.
- Added matching shake/jitter to the ENV wall-breach animation.
- Added matching shake/jitter to the LFO sinkhole animation.
- Uses the existing pixel-for-pixel PNG sprite art with a tiny UI-only whole-panel offset; no audio-engine, DSP, interrupt or OTA logic changes.
- OTA / V15 recovery path intentionally untouched.
- Added 20 offline-converted native 224×30 1-bit PNG volcano sprites to SOUND SHAPE. The static label is replaced; oscillator controls and labels are retained.
- Note ON progressively fractures the volcano; holding keys loops 3 lava eruption frames. On the last Note OFF the lava recedes and the crater closes.
- Animation data lives in firmware ROM (16,800 bytes), sharing the existing UI canvas and animation state. No audio ISR, CXS, SAW, FX, oscillator or envelope DSP changes.
- Firmware identity FM-1_968 and previously implemented OTA/stock V15 compatibility protections are preserved. Physical hardware verification is still required.
- LFO uses the approved top-down street/sinkhole artwork; holding keys opens the hole and releasing the last key reverses the exact opening-frame sequence back to the intact road. ENV uses the approved independent wall-rupture sequence with its own opening and closing frames.
- Added 40 offline-prepared 224×30 1-bit PNGs to the source project and their 33,600 bytes of packed, read-only bitmaps to native firmware. The same byte-aligned 840-byte sprite blitter and existing 240×240 1-bit framebuffer are reused. Animation state/timers are managed exclusively by the non-realtime UI loop, never the audio interrupt. No added voices, DSP effects, audio buffers or DSP calculations.
- Preserved V1.55 PRESSURE fix, V1.54 PLAY DAM V3 animation and shaking, Utrecht screensaver, CRT default OFF, existing project format and settings. OTA C source, trusted loader, protected 16 KiB boothead, firmware identity
FM-1_968and cross-firmware safety behavior must remain unchanged. - The WebInstaller retains the independent JavaScript selection/right-click guard, repaired firmware validation, 100% transfer/reboot statuses, post-boot identity retry, and FM1 Recovery Windows link. Native pixel parity, animation timing, OTA package tests and physical FM1 status are documented in
docs/TEST-V1.56.md. - Fixed CXS PRESSURE appearing to change the sound only between 0 and 1. The existing cycle-exchange energy model changes segment durations only slightly after fixed-point rounding. PRESSURE now also progressively shapes the amplitude profile of the existing eight CXS waveform segments, providing real tonal variation throughout the 0–100 range.
- All new amplitude work happens only at oscillator-cycle boundaries, never for every audio sample. No new voice, synth block, extra RAM buffer, audio interrupt, FX stage or parameter-storage field. The change intentionally affects CXS timbre, including any enabled CXS suboscillator using the shared core; SAW core is untouched.
- Preserved DAM V3, 20 supplied sprites, shaking visual, Utrecht screensaver, CRT default OFF, settings and project formats.
- Safety-critical:
ota.c,usb.c, protected 16 KiB boot area and the trusted staged OTA-loader must remain unchanged. Native OTA regression and package comparison are required; the actual physical FM1 update and recoverability are not proven by software tests. - Retains the corrected installer status, manual reconnect/verification, text selection and rightclick blocking, and README/CHANGELOG + FM1 RECOVERY WINDOWS links. These fixes are now also carried forward in the site generation template.
- Replaced the original 12 PLAY waveform sprites with 20 exact 1-bit 224×30 PNGs from the user-approved DAM V3 set, including water and foam flowing visibly over the dashed road. The PNGs are copied as immutable ROM pixels, not procedurally redrawn.
- First note triggers frames 1–10, sustained notes cycle only frames 11–13; last note-off begins the appropriate closing frame from 14–20. Octave -2..+5 sets loop rate from 250 down to 40 ms. Very short notes never trigger a full flood.
- The existing UI canvas copies 840 bytes per frame, exactly as V1.53. Static ROM asset size grows from 10080 to 16800 bytes. No new RAM framebuffer, no audio callback or DSP changes, and no extra audio samples are calculated. Longer animation sequences may result in more UI redraw events per note.
- Retains V1.53 CRT default OFF, screensaver, storage format, FM-1_968 identity, trusted OTA loader, and V1.53 WebInstaller success/reconnect improvements and FM1 Recovery Windows nav link.
- Native JieLi crossbuild and 20/20 pixel-parity host test pass; actual FM1 CPU/DMA timing and LCD impact remain unverified.
- Changed the CRT / VCR LOOK factory/default setting to OFF on first boot and in the legacy settings fallback. The SETTINGS switch still enables the exact same optional V1.52 two-axis CRT effect and persists its value in the existing CRC-checked 8-byte global settings journal.
- Existing explicitly stored CRT ON/OFF choices are respected; they are not silently overwritten by a firmware upgrade. For any unit with CRT previously saved ON, change it once under SETTINGS to select OFF.
- With CRT disabled, the original binary 1-bit RGB565 LCD output is used; no per-pixel CRT transformation is run. No audio DSP, waveforms, stored projects, OTA loader, protected boot header or firmware identity changed.
- Kept the improved V1.52 web installer success, reconnect and manual verification flow; updated its embedded verified .fwsc to V1.53.
- Native, storage and OTA tests are host-only; physical FM1 UI and OTA verification remain outstanding.
- Fixed the V1.51 CRT effect: white 1-bit text is no longer damaged by a checkerboard row-cutting filter.
- Visible 2D barrel/fisheye distortion with gentle bilinear phosphor sampling, rounded black corners and subtle monochrome dimmed scanlines in RGB565 output.
- The original 1-bit UI buffer remains pristine; the effect is applied only when writing existing LCD DMA stripes. No new full framebuffers, audio DSP or storage-format changes. QR report stays unfiltered.
- SETTINGS → CRT / VCR LOOK remains saved and default ON. OFF restores the original unmodified 1-bit UI.
- Same OTA loader, protected bootheader and identity FM-1_968. Native build and targeted host validation pass; actual FM1 performance and appearance need physical testing.
- Subtle horizontal barrel warp and alternating monochrome scanline pixels added after the existing native 1-bit renderer, covering PLAY, SETTINGS, editors, screensaver, boot logo, and storage progress overlays. White remains white, black remains black; there are no colour or grayscale pixels. The scan-safe REPORT A BUG QR screen is intentionally unaffected.
- SETTINGS → CRT / VCR LOOK is a direct SEL ON/OFF switch, enabled by default on existing devices. OFF bypasses the filter entirely and is pixel-identical with V1.50 rendering.
- Reuses the already-allocated 240×240 1-bit display canvas; only 30 bytes of temporary row space and a small read-only 1200-byte barrel table. No new full-screen framebuffer or audio-DSP code. Filtering runs exclusively in the UI task, not the audio interrupt. CPU/display overhead requires measurement on physical FM1 hardware.
- The CRT flag is saved in the existing eight-byte CRC-protected device-global NOR journal using a new non-conflicting magic range for OFF. Boot volume, autosave, screensaver timeout and startup project remain backward-compatible. Compaction and project bank moves retain CRT state.
- Keeps the V1.50 Domtoren screensaver and V1.49 DAM sprites, all audio effects, MIDI, project storage, OTA recovery path and existing FM-1_968 identity.
- Extends the procedural Utrecht screensaver so the crack no longer stops at the foreground ground split. Once the ground has ruptured, the fracture now climbs upward through the streets, disappears briefly behind the front houses, and continues visibly through the Dom Tower.
- Adds a late-stage structural shift in the Dom Tower: one cracked half sinks a few pixels downward while the saver is near its peak frame, then returns automatically during the existing reverse loop.
- Keeps the established saver timing model intact: the 64-frame saver still plays forward, holds, reverses back to frame zero, and loops using the existing state machine. No extra full-screen animation frame table, heap allocation, DSP work, or audio-thread rendering was introduced.
- Implementation remains purely 1-bit native UI drawing inside
ru_crack_saver(), using the existing Utrecht city art plus procedural crack carving and a small moving tower-half mask. Physical FM1 validation is still required. - Replaces PLAY waveform bars (both CXS and SAW) with the actual 12 user-supplied 224×30 monochrome PNG sprites. Native ROM stores their exact 1-bit pixels; no redraw, scaling, or procedural fluid simulation.
- The crack opens on the first gated note; leak animation cycles only source frames 06–08; stops on the last gate release and closes via source frames 09–12. A very short press skips safely to the matching closing frame.
- Leak frame interval reacts to displayed octave -2..+5: 270/220/165/115/75/55/45/35ms. Existing audio ISR, presets, sequencer, effects, MIDI/USB, storage format, recovery boothead, and OTA loader preserved.
- +10,080 static bytes (flash) for 12 original bitmaps, no new framebuffers or audio allocations. The renderer copies 840 bytes into the already-existing 1-bit UI canvas; unchanged LCD bands remain cached.
- Added exact pixel comparison and timing-state tests. Native crossbuild passes; physical FM1 display and audio under load require validation.
