Repository navigation
Conversation
…for module machines (SETUP_ALL, LIST flags) The base's SRC SETUP editor hook (machine_registry.s, from POLY8's shared hooks) left encoder E (slot 10) read-only for every module machine, POLY8's hidden slot; Analog BD keeps HIGH there, so HIGH never moved over USB. A machine now sets MODWERK_MACHINE_SETUP_ALL to edit it. A track whose machine has no pool opened its double-tap window on stock's (empty) sample list, because Analog BD and FM Synth tracks are FLEX underneath; the base corrected it afterwards, which flickered. A new owned site at 0x400788c4 (mw_chooser_column) lets a MODWERK_MACHINE_LIST machine open on the machine list at once, as PICKUP does. Both are opt-in: POLY8, VECTOR, FM Synth and Analog BD 0.1.5 are unchanged (Analog BD 0.1.6 sets both). Beta base regenerated; the base-bound packages only change requiredBase; the machine recipes re-pin machine_ports.py. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks, this reads well. Both flags are opt-in, nothing in
Everything else looks fine: the changelog entry is there, no event or table index is added (only one owned site in |
|
#857 is in now, so this is the merge of main and the base rebuild I mentioned. Please merge main and regenerate the base files with their producers rather than resolving them by hand (base-binding.json, the elemod, the variants and the module packages conflict now). Then the short run from my earlier comment on that rebuilt base, with Analog BD 0.1.5. If you'd rather I do it on my unit, just say. |
Regenerated with their producers: events.py --write, then npm run octatrack:base -- --beta --write (beta base 68e6a90b) and npm run octatrack:module-packages (only requiredBase moved). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Regenerated with their producers: events.py --write, then npm run octatrack:base -- --beta --write (beta base b2810a87) and npm run octatrack:module-packages (only requiredBase moved). The Tape Echo and Euclid standalone recipes re-pin module-build.ts and the card-build assets repeat98#993 changed, or octatrack:module-packages refuses. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
Thanks for the run on 68e6a90b and for regenerating everything with the producers. One small thing: the new checklist line in |
…X2 swaps keep their block, with the fix/base-oct28 bundle and the Python firmware codec (#1017) * Fix: Octatrack base, SRC SETUP's encoder E and the double-tap window for module machines (SETUP_ALL, LIST flags) The base's SRC SETUP editor hook (machine_registry.s, from POLY8's shared hooks) left encoder E (slot 10) read-only for every module machine, POLY8's hidden slot; Analog BD keeps HIGH there, so HIGH never moved over USB. A machine now sets MODWERK_MACHINE_SETUP_ALL to edit it. A track whose machine has no pool opened its double-tap window on stock's (empty) sample list, because Analog BD and FM Synth tracks are FLEX underneath; the base corrected it afterwards, which flickered. A new owned site at 0x400788c4 (mw_chooser_column) lets a MODWERK_MACHINE_LIST machine open on the machine list at once, as PICKUP does. Both are opt-in: POLY8, VECTOR, FM Synth and Analog BD 0.1.5 are unchanged (Analog BD 0.1.6 sets both). Beta base regenerated; the base-bound packages only change requiredBase; the machine recipes re-pin machine_ports.py. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * WIP POLY8: the card machine chooser draws names and the mark by the list's row Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * POLY8 0.3.2-experimental: version and release notes Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * POLY8 0.3.2: card packages compiled from this tree Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * POLY8 0.3.2: performance record wording and generated catalogue Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * POLY8: the card chooser's cursor reaches every machine row (UP/DOWN clamps to the last row) Stock's five chooser UP/DOWN handlers clamp the machine list's cursor to row 5. With POLY8 at row 5 and VECTOR, FM Synth or Analog BD after it, the list scrolled but the cursor stayed on POLY8. The composition's count sites now set each clamp to the last row (card builds only). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * POLY8 0.3.2: card packages compiled from this tree (cursor clamps) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * POLY8: the clamp pokes guard stock's moveq #5 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * POLY8 0.3.2: card packages compiled from this tree (clamp guards) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * POLY8 0.3.2: USB port pins for the new source; its USB package rebuilds byte-identical and stays at 0.3.1 machine-ports.json pins POLY8's new manifest and shared-machine.s and lets the base's ot_machines own the chooser-name pointer (0x4007865e). The machine recipes pin that file, so their sources move; POLY8, VECTOR, FM Synth, Scale Quantizer and Analog BD rebuild byte-identical. The card-only clamp pokes are not in the USB form (Elekloader's port runs the manifest as octabam_poly8). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * POLY8 0.3.2: release notes, changelog, README and manifest summary for the cursor clamps Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * POLY8 0.3.2: card packages compiled from the final tree Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * POLY8 0.3.2: generated catalogue Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * POLY8 0.3.2: native comparison (193 images, 87 refusals, 0 mismatches of 280 selections) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * POLY8 0.3.2: testing record (emulator only) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * POLY8 0.3.2: the private VECTOR+FM group bridge takes the chooser-name pointer with the clamps Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * POLY8 0.3.2: owner approval (#842, #941, #942) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * POLY8 0.3.2: card packages compiled from the merged tree Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Octatrack base: module machines can own their SRC SETUP page (SETUP_PAGE) Over USB the base draws and edits SRC SETUP for every module machine row (mw_setup_draw6, mw_setup_edit6) and shows the track's backing pool's FLEX/STATIC setup there, so a machine with setup rows of its own (VECTOR's page 2: SEED, SPAN, OFST, ROT, RPT, DIR) had none (#972). A machine that sets MODWERK_MACHINE_SETUP_PAGE (64) contributes a struct modwerk_machine_setup: the 80-byte struct modwerk_machine, ABI 1, then two words, page(stock) and knob(index, delta). While SRC SETUP's cursor is on its row and the current track is its own, the drawer shows the page it returns and encoders A-F go to knob first (nonzero takes the turn; 0 lets stock edit the backing pool's byte, with encoder E's rule as before). Records without the flag are read exactly as before, and a base without it reads the first 80 bytes, so POLY8, VECTOR 0.2.4, FM Synth and Analog BD 0.1.5 are unchanged. Flags 16 and 32 stay free for #943. machine_ports.py emits the two words for a port that lists SETUP_PAGE; the registry's host test covers the row, track, flag and encoder rules. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * VECTOR (USB package): SRC SETUP page 2 through the base's SETUP_PAGE record VECTOR's port listed st_setup_draw6 and st_setup_edit6 in replaces (the base owns those sites), so its own page 2 (SEED, SPAN, OFST, ROT, RPT, DIR) was dropped from the package and SRC SETUP showed the stock FLEX/STATIC setup on a VECTOR track (#972). The port now sets SETUP_PAGE and names the card build's own st_setup_page and st_setup_knob, which the base asks on VECTOR's row. st_setup_page's test that SRC SETUP's cursor is on row 5 (the card's VECTOR row) is dropped in the package's source variant: over USB the row is 5-8, and the base asks only on VECTOR's own row. control.s is unchanged, so the card build is too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * VECTOR 0.2.5-experimental: version, notes and its recaptured machine recipe The USB package changes (SETUP_PAGE record, one test less), so VECTOR's machine recipe is recaptured from the stock OS (hashes only; the eight copies move by the 10 dropped bytes) and every machine recipe re-pins machine_ports.py, machine-ports.json and vector_runtime.py. Card build unchanged; the README gains a section at its end. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Octatrack base: the machine chooser's cursor reaches the last row #922 made the double-tap TRACK chooser draw its rows from the list's scroll offset, but stock's five UP/DOWN handlers clamp the cursor with moveq #5 twice each (0x40078c22, 0x40078cb0, 0x40078d2e, 0x40078dee, 0x40078e7c and 6 bytes on). With two or more machines the cursor stopped at row 5. The base owns the ten bytes as ot_machines count sites and writes the last row, 4+n, never below stock's 5 (addresses and guards as POLY8 0.3.2's card pokes). The registry's host test checks the clamps for 0 to 3 machines; the machines guide's chooser item and the base changelog say so. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * VECTOR 0.2.5: the MKII result over USB, recorded as a functional hardware report The owner's unit, 27 October 2026, driven over USB by the coordinating session on a development twin of the release base (e6e75d75, the b1b2ca58 build plus --dev): SRC SETUP page 2 draws and edits, the stock setup shows on STATIC rows and tracks, Analog BD's page on its row. Recorded word for word in TESTING.md and as the 0.2.5 qualification's functional hardware report, with what was not tested. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * VECTOR 0.2.5: the card UI captures cover 0.2.5 (its card build is 0.2.4's bytes) The isolated build of 0.2.5 changes only version fields in the card package assets: VECTOR's card build is byte-identical to 0.2.4's (image cabcc296...), so its eight captures document 0.2.5 as they stand. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * VECTOR 0.2.5: tests and pins follow the release vector.test.ts: 0.2.5 publishes a reported functional hardware result; the 9 October owner exception still covers only 0.2.4; the card evidence records (captures, behaviour, persistence, core tests) stay 0.2.4's, bound to the unchanged native source. The quick-test guide and the source-scope test pin 0.2.5; Analog BD's composition proofs take the new module source tree hash (VECTOR's card bytes are unchanged). The changelog's known issue names what the unit run did not cover. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * VECTOR 0.2.5: the hardware report's source revision is this branch's 0.2.5 source commit Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Analog BD companion proofs re-exported natively for POLY8 0.3.2's source tree (212 rows identical; only moduleSourceTreeSha256 moves) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * VECTOR 0.2.5 package; Octatrack beta base (SETUP_PAGE, chooser cursor clamps) Rebuilt with npm run octatrack:base -- --beta --write on main. Analog BD's trust row follows its source policy (machine_ports.py, machine-ports.json); its package bytes are unchanged. The five base-bound packages only change requiredBase (--base-only). VECTOR's USB package (18,354 bytes, sha256 45c962ca) is rebuilt alone with its strict stock-free scans. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * VECTOR 0.2.5: source-built card assets; Analog BD proofs' tree hash; module catalogue Isolated Docker build (modwerk-source-tools) and modules:import --development: only version fields move for VECTOR, its card bytes are 0.2.4's. Analog BD's composition proofs take the new module source tree hash (as d0aab7e); modules:generate. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Re-pin Tape Echo's and Euclid's standalone recipes to the rebuilt shared assets VECTOR 0.2.5's isolated build changes version fields in dsp-packages, descriptor-recipes, menu-recipes and rom-packages, which both recipes pin. octatrack:module-packages -- --check: every published package identical (Play Modes held at 0.1.1 as on main). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Analog BD native observations: re-pin module-adapters/machine_composition.py The AB probe takes only machine_composition.FLAGS from that file, which POLY8 0.3.2 leaves unchanged; the diff touches POLY8's source pins and the private VECTOR+FM bridge only, which the AB fixtures never build. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Tape Echo and Euclid standalone recipes re-pin the four rebuilt shared asset JSONs; both packages rebuild byte-identical Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * WIP POLY8: the base's ot_machines owns the chooser's ten cursor-clamp bytes (replaces) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * POLY8 0.3.2: the chooser's ten cursor-clamp bytes in both manifest forms; over USB the base's ot_machines owns them (needs fix/machine-setup-pages' base) machine-ports.json replaces the clamps with the chooser-name pointer, so the USB package leaves them out and rebuilds byte-identical (dc2ce372...) on a base that owns them. Pins of manifest.py and machine-ports.json follow (machine recipes, the private group adapter, Analog BD's native observations). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * POLY8 0.3.2: card packages compiled from this tree (object bytes unchanged) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * POLY8 0.3.2: native comparison for the final source (193 images, 87 refusals, 0 mismatches of 280) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * WIP: shared-window burn probe for the USB base's DSP loader; meter reads the report at the base's length --dsp-burn-window ADDR runs the --dsp-burn loop from a shared-window P address (calibration builds only). On the owner's MKII (28 Oct 2026, dev twins, core 0, stopped, same project): baseline 2,119.2 idle passes a frame; 2,000 cycles in private P 2,018.8 (100.4 passes); the same loop from P:0x36000 1,915.7 (203.5): code fetched from the window costs twice. device.mjs meter asked for a 66-word report; bases answer only their own length (78-85 words), so every read failed. It now uses reportView(). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * WIP: the DSP receiver's packet operations run from the shared window; wide FX2 buffers stay out of block 3 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Octatrack base: FLEX tracks no machine owns render unguarded (#999) The frame guard skipped ordinary sample tracks whenever FM Synth (RENDER_FLEX) was installed, because mw_source_render_impl sent unowned FLEX tracks to its render through guarded(). Only machines' own tracks are guarded now. Host test: an unowned track renders through F's RENDER_FLEX render in late frames with no shed (the old dispatch fails it). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * WIP: the resident base patch on the split receiver (engine ops stay in private P) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * WIP: regenerate the beta base (ccc21bc8) with the receiver's packet operations in the window; docs and changelog Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * WIP: records: the real Air Chorus/BBD limit, unit results on ccc21bc8 and its twin Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Build the Octatrack tooling with Modwerk's own firmware codec sdk/firmware_codec holds the section format of Elektron OS images (aplib.py packs, elz.py depacks), the .syx transport and ColdFire instruction lengths, for every machine. Every script that runs the pinned Elekloader checkout now puts it on sys.path through firmware_codec.use_elekloader(), which serves these modules in place of the checkout's codec/ and isa/ (an import finder first on sys.meta_path; it refuses if the checkout's codec was imported first). sdk/tests/test_firmware_codec.py checks the codec against vectors of the modules it stands in for and fails on any script that imports elekloader without use_elekloader() or reaches the checkout another way. The recipes that pin a build's inputs record the files actually used (firmware_codec.inputs()): CC Map, Mute Modes, Tape Echo, Euclid and the five machine packages, refreshed after rebuilding every published USB package byte-identical with the new tooling (Tape Echo's and Euclid's pins also take the page builder files they had fallen behind). The beta base built from unchanged sources with this codec equals the committed one byte for byte. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * WIP: an FX swap keeps its track's own buffer block (as stock); the no-room box in the player's words Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * WIP: changelog for the FX swap and the no-room box Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * WIP: changelog wording Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Regenerate the beta base (6541d7e9) from the combined source; relink the base-bound packages Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Machine recipes name the merged tooling's inputs (VECTOR, FM Synth, Scale Quantizer): every published package rebuilds byte-identical Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * POLY8 0.3.2: owner re-approval covers the clamp bytes in both manifest forms (f1a2500) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Docs: the shared-window record in its own document; the traps and the beta plan do not grow Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Docs: machines.md names HOOKS.md (EVENTS.md was renamed on main) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Import the source-built card assets (03006a5) and pin Tape Echo's and Euclid's recipes to them Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Analog BD's composition proofs bind the merged source tree (212 native proofs identical); the codec rule names elekloader-vendor.ts, which only edits the kit NOTICE (#1016) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Nathaniel Pawelczyk <nathaniel.pawelczyk@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks! This landed in #1017 (its bundle contains this head), and main's Generated by Claude Code |
…nto claude/analog-bd-0.1.6 Generated files regenerated with their producers. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> # Conflicts: # docs/module-guides/machines.md # public/octatrack-modules/analog-bassdrum/0.1.6-experimental.mwrm # scripts/module-source.test.mjs # sdk/machines/octatrack/HOOKS.md # sdk/machines/octatrack/base-binding.json # sdk/machines/octatrack/elekloader/runtime_events.h # sdk/machines/octatrack/events.json # sdk/machines/octatrack/include/modwerk_events.h # sdk/machines/octatrack/module-adapters/analog_bd_native_observations.json # sdk/machines/octatrack/module-adapters/controller-policies.json # sdk/machines/octatrack/module-adapters/machine-recipes.json # sdk/machines/octatrack/module-adapters/machine_ports.py # sdk/machines/octatrack/module-adapters/standalone-recipes.json # src/engine/assets/analog-bd-composition-proofs.json # src/engine/assets/bootstrap-package.json # src/engine/assets/coldfire-packages.json # src/engine/assets/descriptor-recipes.json # src/engine/assets/dsp-packages.json # src/engine/assets/menu-recipes.json # src/engine/assets/module-build.json # src/engine/assets/octatrack-base-fills.json # src/engine/assets/octatrack-base-sources.json # src/engine/assets/octatrack-base-variants.json # src/engine/assets/octatrack-base.elemod # src/engine/assets/octatrack-module-packages.json # src/engine/assets/platform-writes.json # src/engine/assets/requested-packages.json # src/engine/assets/resident-dsp.json # src/engine/assets/rom-packages.json # src/engine/assets/usb-audio-packages.json # src/engine/assets/utility-packages.json
Requested by Nathaniel
mw_setup_edit6, taken from POLY8's shared hooks) leaves encoder E, slot 10, read-only for every module machine. That is POLY8's hidden slot, but it is Analog BD's HIGH, so HIGH never moved over USB (0.1.5 included).MODWERK_MACHINE_SETUP_ALL(16) lets encoder E edit the machine's slot (mw_row_setup_all).MODWERK_MACHINE_LIST(32) makes the window open on the machine list. A new owned site at0x400788c4(12 bytes,mw_chooser_column→mw_window_column) takes stock's column choice and keeps stock's rule for everyone else.events.json, the headers andEVENTS.mdare regenerated;machine_ports.pyknows the two flag names. The beta base is regenerated:b2810a87after mergingmainatd6f1882b(Improvement: the Octatrack beta base carries the sample-editor service (Beat Slicer's base) #992's sample-editor service). It was68e6a90bonmainatfe5955b2, andcc74d638before the first merge; the five base-bound packages only changerequiredBase, and the machine recipes re-pinmachine_ports.py.npm run pr:ready: Ready, after mergingmain(dbf75048,dd113bb7, anda9ae0de1atd6f1882b). The last merge also re-pins the Tape Echo and Euclid standalone recipes tomodule-build.tsand the card-build assets Beat Slicer 0.1.66-experimental: first release, over USB on the base's sample-editor service #993 changed, without whichoctatrack:module-packagesrefuses. The base files were regenerated with their producers (events.py --write,npm run octatrack:base -- --beta --write,npm run octatrack:module-packages), not resolved by hand. Analog BD's controller hash is unchanged frommain; only its source-policy hash moves (themachine_ports.pyre-pin).test_machine_registry.ccovers both flags: a SETUP_ALL row, and the window column for a LIST machine, a pool machine, a stock FLEX track and a stock non-sample type.ot_emu, card build: the double tap shows the machine list; T2's window switched to T1 shows the list; FLEX + RIGHT still opens FLEX's pool.9976a5e8, RAM boot, then flashed with 14 modules), reported by me (npp1993):68e6a90b, this PR's base before Improvement: the Octatrack beta base carries the sample-editor service (Beat Slicer's base) #992 was merged in. Improvement: the Octatrack beta base carries the sample-editor service (Beat Slicer's base) #992 adds the sample-editor service and changes nothing in the machine registry; the run has not been repeated onb2810a87.68e6a90b(this PR's merged base at the time,npm run octatrack:base -- --beta --out, identical to the committed package) RAM-booted over USB, with Analog BD 0.1.5 (7a1b08e8, flags off) kept, observed by me (npp1993), 27 Oct 2026:flash, written and verified into slot 2) and power-cycled: the unit started on68e6a90bfrom the flashed slot (confirmed), Analog BD 0.1.5 still kept, self-test passed (1/1 intact).68e6a90b), all 14 are intact, but the self-test fails twice on CPU over 90 % (93.2 % and 93.1 %, named Air Chorus) with all 9 DSP effects running together. I have no run of this exact set on another base to compare, so I don't attribute it to this PR, which changes no DSP or tick code.9976a5e8(Analog BD 0.1.6-experimental: TYPE and FIXD switches, SETUP reorder, LPF OFF clockwise, 808 variation, leaner DSP #944's base) with Analog BD 0.1.6, not this PR's base.docs/module-guides/machines.mddid not say how to make a SETUP control a two-state switch, or that encoder E is read-only for module machines over USB. Added to the Track machines checklist.🤖 Generated with Claude Code