Repository navigation
Fix: Octatrack base, a FLEX <-> module machine switch stops the track's stale stock voice (first-trig stutter) - #1032
Conversation
…'s stale stock voice
Every trig on a module machine track (Analog BD, FM Synth) also starts
stock's FLEX voice from the machine's bytes read as FLEX settings, and
the machine's own render never advances it. Nothing stopped that voice
when the track left the machine, so after a switch back to FLEX while
playing it sounded as a short wrong burst that the first real trig cut
or played over. mw_assign now clears byte 0 ("playing") of the track's
voice record (0x800049d8 + 168 * track) when a switch keeps the stored
type (FLEX <-> machine, the playing Part only), before the track's
parameters change; a type change stays stock's. Host test covers both
directions, the same machine again, FLEX to FLEX, STATIC, an absent
machine, another track and a Part that is not playing.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…oice # Conflicts: # sdk/machines/octatrack/base-binding.json # src/engine/assets/octatrack-base-variants.json # src/engine/assets/octatrack-base.elemod # src/engine/assets/octatrack-module-packages.json
… main Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
Thanks, good find, and the host test that maps the voice records is just what I'd want. Two things before it goes in:
A minor point: |
…able Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…-stale-voice # Conflicts: # sdk/machines/octatrack/base-binding.json # src/engine/assets/octatrack-base-variants.json # src/engine/assets/octatrack-base.elemod # src/engine/assets/octatrack-module-packages.json
… main (Analog BD 0.1.6) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…oice # Conflicts: # sdk/machines/octatrack/base-binding.json # src/engine/assets/octatrack-base-variants.json # src/engine/assets/octatrack-base.elemod # src/engine/assets/octatrack-module-packages.json
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
Tested on an MKII (OS 1.40C) over USB, 29 Oct 2026, as an A/B against current Builds: two Run: T2 is a FLEX track playing a kick sample on trigs. Play, then switch T2 FLEX → FM SYNTH → FLEX three times, 6 s apart (FUNC+SRC, YES), while recording all 20 USB channels. Same script and same project on both twins. FM Synth → FLEX: fixed.
Not caused by this branch: after an FM Synth → FLEX switch, the first FLEX kicks come back late (2.5 s or more, once not for 5 s). That happens at the same moments on both twins. It looks like the live parameter reload #1024 addresses. Analog BD → FLEX: not judged. With this short kick sample, |
…X no longer stops the DSP Each trig on a module machine track starts stock's FLEX voice from the machine's bytes, and the machine's render never advances it. #1032 stops that voice in mw_assign, but a bank, pattern or Part change makes the track FLEX without mw_assign, and stock then rendered the stale voice. On a track that had been Analog BD since power-on, the first FLEX frame stopped DSP core 1 for good (MKII, cold boot, Analog BD on T1 in bank B, FLEX in bank C, PLAY, B -> C: every time; not with T1 played as FLEX first, and not with Analog BD on T1 in both banks). mw_source_render_impl now clears byte 0 of the track's stock voice record on every render a machine does itself, and on an absent machine's silent render. Machines without their own render (VECTOR, POLY8) keep stock's voice. Host test covers the machine's renders, a trig between them, the Part changing under the track, VECTOR, a FLEX track and an absent machine. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ot_machinesrecord has noleave, the base'sleave()only puts FLEX defaults back, and stock's parameter load (0x40001f18, disassembled to check) only rewrites parameters and never touches the per-track voice records at 0x800049d8 + 168 × track; voice bind (0x40006820) runs only where a commit changes the type. So the stale voice played as a short wrong burst that the first real trig cut or played over. The static Analog BD 0.1.6 draft closes the same gap withclr.bon byte 0 of that record (one MKII pass on image AB015FX4).machine_registry.chush(): when a switch keeps the stored type (FLEX ↔ module machine, the playing Part only)mw_assignclears byte 0 ("playing") of the track's voice record before the track's parameters change, on all three paths (machine chosen, machine left, an absent machine). A type change (STATIC and the other stock machines) stays stock's. On Octatrack base: module machines play right after a boot, the FLEX switch reloads live parameters, SRC label after a boot; USB bridge opens the Octatrack #1024'srelive()the same clear belongs just before the stock reload; the source merges cleanly with that branch. Changelogchangelog/2026-10-28-octatrack-switch-first-trig.md. Beta base regenerated.npm run pr:ready;test_machine_registry.cmaps the voice records and covers Analog BD → FLEX (cleared before the reload, the byte 1 of a neighbouring track untouched), FLEX → FLEX and the same machine again (unchanged), FLEX → Analog BD (cleared), Analog BD ↔ STATIC (not cleared), an absent machine, and a Part that is not playing; makinghusha no-op fails four checks. Not yet on a unit: an MKII run of Analog BD → FLEX and FM Synth → FLEX in a full project is still needed.Independent of #1024 and #944; whichever lands later regenerates the base.
🤖 Generated with Claude Code