Repository navigation
Scale Quantizer 0.1.4: TRACK / FOLLOW rows (five SEQUENCER rows instead of 19), the author's 2.21 quantizer - #1147
Merged
Merged
Conversation
… switches as two SEQUENCER rows, TRACK and FOLLOW upstream/ is timhastie/octatrick-modules 990eff8 byte for byte (2.21 + TRACK / FOLLOW, not yet published). The module contributes five SEQUENCER rows (SCALE, ROOT, GLIDE, TRACK, FOLLOW) to ot_sequencer_rows, within the base's eight; the per-track bits and project-file lines are 2.21's. The wrapper declares the two 2.21 detour guards (qz_panel_stage, qz_panel_commit); the runtime port writes 2.21's two-pass remix.inc for a standalone package.
…rds, and the participants test reads 2.21's two-pass remix.inc
The runtime port reads 2.21's two-pass remix.inc from the octabam root, where the author's manifest names it; the quantizer's machine recipe is re-captured for the new sources (6 copies, hashes only), and the other machine recipes' pin of machine-ports.json is refreshed.
…; this cut is untested on hardware
… Synth The author's 2.21 panel publication transaction is enabled only beside SYNTH MACHINE and writes FM's engine state (sy_state). FM Synth bundles its own copy of this quantizer and conflicts with this module, so the wrapper gives remix.inc a selection without FM Synth: the card-build object no longer names sy_state, and the card image and USB package are unchanged.
…alone recipe pins for the FM-free assembly
… media re-captured from its image
…ndled copy assembles from the same source, with this declaration's signature
…side FM Synth (one quantizer on FM Synth's copy of the same source)
…uantizer TEST2 image (FM Synth on the author's 3531b8e: an FM SYNTH track whose FOLLOW is OFF now plays SCALE OFF's pitches; on TEST1 only ROOT was skipped)
…y rule is merged (this module's conflicts stays empty, as on main); the author's MKI report of TEST2 and of the pair (30 October 2026), hardwareStatus reported; the changelog carries the marked compatibility note
…us FM Synth's LFO SETUP names hook); the author's MKI report of 30 October stays TEST2's record
…ir's TEST2 and states what TEST3 re-ran (55 of 55 captures byte-identical to TEST2)
…1 October: a module may not hook into another module's code, rows, tables or files); FM Synth stays a declared conflict in one sentence; on main 00ecaf5 the image rebuilds byte-identical to TEST2, the author's MKI report of 30 October is its record
…2026 (TEST3, the same bytes as TEST2: upgrade file ec4b811f, 449,848 B) The author flashed OCTATRACK_MODWERK_QUANTIZER_TEST3.bin (sha256 ec4b811f..., MAIN 22541cd6..., byte-identical to the TEST2 image he reported on 30 October 2026) on his MKI on 1 November 2026 and reported its test sheet passing. The record: a second tests.gates line, tests.summary and the last limitation updated, an "Author-reported hardware — 1 November 2026 (TEST3)" section in TESTING.md naming the sheet's checks and what was not recorded (play time, readings, MIDI gear; the optional 2.21-project step not stated), the Open list, and README's compatibility and Tests paragraphs. tests.hardwareStatus stays reported; no tests.qualification object: this cut measures neither cycles nor memory. The branch was rebased onto main 4ce910b after the pass; the card build's inputs did not change between 00ecaf5 and 4ce910b, so the image is unchanged and not rebuilt.
… his released 2.22 line (8f6f564) whose files these are; the vendored README is that commit's The import record's per-file pins, README and TESTING name 8f6f564a9c42636ed4c5cc6ad314ee6b7ce69e5c, the commit of the author's Octatrick 2.22 line (on v2.21) whose quantizer/ upstream/ carries, in place of his working commit 990eff8 of 29 October (the same code; the two differ in one README line). upstream/quantizer/README.md is 8f6f564's file, so every vendored file is that commit's byte for byte; the record's entry for it carries the new identity (size, blob, SHA-256). source.revision and tests.evidenceRevision stay 363861e3, the octabam import this wrapper descends from (main's own pin, which src/catalog/build-support.test.ts requires). The wrapper manifest.py is unchanged: its docstring still names 990eff8, because the file's SHA-256 is bound in the committed package records (requested-packages.json, media/capture.json, the machine adapters); TESTING.md says so. No code byte changes.
9 of 15 tasks
The package assets and the standalone recipes are main's here; they are rebuilt for Scale Quantizer 0.1.4 in the next commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The owner approved the update on 4 November 2026. It waives what the 0.1.3 record waived: the author's MKI reports cover the card image (TEST2, TEST3); the USB package was not run on a unit, and chip timing and complete memory bounds are unmeasured. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… Tape Echo's and Euclid's recipes re-pinned bash scripts/build-modules-isolated.sh at c885b82 in modwerk-source-tools, then npm run modules:import -- --development. The four quantizer objects are byte-identical to ff28c23's; requested-packages.json's composition section now follows composition.json as changed in 39ecde9, which the committed file did not. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…l record Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pair table for this source - npm run module:verify -- quantizer --os <1.40C>: 166 selections, 74 native images match outside the platform writes, 92 matching refusals, no mismatch (the committed record was still 0.1.3's). - export-composition-proofs.py --suite analog-bd --static-stock --vendored-sdk, 4 shards merged in case order: the 26 selections with Scale Quantizer change, the other 186 are identical, no refusal flips; moduleSourceTreeSha256 moves. - modules:pairs -- --write: the shared 0x40065c7c note names 0.1.4's 8 rows. - The approval record says plainly that nobody has run the USB package on a unit and the owner has run neither it nor the card build on hardware. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e Analog BD (owner-approved) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… 0.1.0 and Mute Modes 0.2.2) and imported; Tape Echo's and Euclid's recipes re-pinned bash scripts/build-modules-isolated.sh at 1c81f14 in modwerk-source-tools (sha256:28323550), then npm run modules:import -- --development. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… rebuilt packages export-composition-proofs.py --suite analog-bd --static-stock --vendored-sdk in modwerk-source-tools, 8 shards merged in case order: all 212 proofs identical to this branch's, only moduleSourceTreeSha256 moves. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Owner
|
Thanks Tim. I've pushed my part of 0.1.4 to your branch, as a fast-forward on top of your
Generated by Claude Code |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Scale Quantizer 0.1.4: TRACK / FOLLOW rows (five SEQUENCER rows instead of 19), the author's 2.21 quantizer
This is an author update of Scale Quantizer (
quantizer),0.1.3-experimental->0.1.4-experimental, on a fresh branch off current main501d8a42, as agreed on #555 on 31 October and confirmed there on 1 November ("Route 4 for now"). It carries the MIDI-track quantizing that FM Synth 0.1.5 (#555) had inside FM Synth, as agreed there on 29 October: these sites are Scale Quantizer's, FM Synth keeps its bundled copy to what FM tracks need. Nineteen commits: the module, its packages and proofs, the adapters, the tests, the changelog, the record of the hardware passes below and, last, the upstream pin moved to the commit of my released 2.22 line.What changed since 0.1.3
upstream/quantizeris my 2.21 quantizer plus the TRACK / FOLLOW rows,8f6f564a9c42636ed4c5cc6ad314ee6b7ce69e5c, byte for byte, released with Octatrick 2.22 (v2.22 =73686de, on v2.219e4d34a; the import recordsdk/imports/octabam-363861e.jsonlists its files at that commit). The files were vendored on 29 October from my working commit990eff8, whosequantizer/is identical to8f6f564's; the wrappermanifest.py's docstring still names990eff8and is left as is, because that file's SHA-256 is bound in the committed package records (src/engine/assets/requested-packages.json,media/capture.json, the machine adapters), to move with the next package rebuild.#SEQUENCER_MIDI_SCALE_OFF/#SEQUENCER_AUDIO_SCALE_OFFlines and battery-RAM bits as 2.19-2.21, so projects saved on either load the same (checked in the emulator: aproject.workbyte-identical to 2.21's for the same settings; a 2.21-saved project with tracks OFF loads with the same tracks OFF).quantizer.sis no longer edited by the wrapper.The seven guarded sites
These are the sites no base event covers, listed on #555 on 29 October against main
3b79e797and kept as ordinary guarded patches in this module only:qz_mknob(0x40055382, 8 B, MIDI NOTE and chord-offset knob edits),qz_mplock(0x40050b98, 10 B, held-trig MIDI NOTE locks),qz_mkey(0x400436a8, 10 B, a MIDI chromatic key press before note-on, arp insertion, held-note storage and recording),qz_mnote(0x4009fb80, 6 B, each sequenced, chord or arp note after transpose and KEY),qz_atrig(0x4000c614, 6 B, the resolved STATIC / FLEX trig pitch),qz_mprev(0x400439d6, 8 B, the four-note MIDI trig preview) andqz_heldmark(0x40044abc, 8 B, the audio chromatic keyboard's held-key mark). None overlaps a span the base owns. 2.21 adds two more guarded detours,qz_panel_stage(0x4004fc84, 16 B) andqz_panel_commit(0x40005162, 8 B), the panel publication transaction, which assemble to their replays in a selection without FM Synth. Every guard is Modwerk'sstock_guard(address, length, sha256): 28 detours and the row-count poke (manifest.py,stock-guardsin the import record); the vendored manifest names no stock bytes.Compatibility
compatibility.conflictsstays[], as on main: the module whose change makes the pair collide flags it, and that is FM Synth 0.1.4, which declaresquantizer(it bundles its own copy of the same quantizer source and the two would patch the same sites). The two stay declared as conflicting, as agreed on #555; nothing here hooks into FM Synth's code, rows, tables or files. Over USB, the eighteen quantizer sites FM Synth and POLY8 also use are base take events (this module at order 50) and the rows are the base's table; the nine other hooks stay guarded patches.modules:compat -- quantizerreports 0 problems (29 active modules, 406 pairs).Evidence
Card build (native exporter,
--vendored-sdk --static-stock --modules quantizer): MAIN22541cd628f8064cb6d12e81a0481b17ffad9e737fd968454ae6eb419bb735e8(1,116,202 B), upgrade fileec4b811fe6620f06eb6ba9fd23c18e996830f8fea255cf6552fdcc4d089ff808(449,848 B); rebuilt byte-identical from every later commit of the branch (the documents and records do not feed the build), and byte-identical again at the head rebased onto main00ecaf52on 31 October (the image I call TEST3 is TEST2).Base: the branch was rebased from
00ecaf52ontoc4515136on 1 November (the image rebuilt there twice, byte-identical), then onto4ce910bband, the same day, onto501d8a42, after the hardware pass. Betweenc4515136and501d8a42main changed 34 files: 31 undersdk/analog-rytm-mkii/modules/_submissions/,sdk/machines/analog-rytm-mkii/README.mdand two underchangelog/; the diff over the card build's inputs (the module folder,sdk/octabam/{platform,tools,dsp,licenses},scripts/export-composition-proofs.py, the module adapters,scripts/octatrack-module-packages.py,build_core.py) is empty, so the image is unchanged; it was nevertheless rebuilt once from the branch head (a927f6ae) on 1 November through the same exporter: byte-identical (every output file). This is the check #1138 proposes, done by hand.Emulator (ot_emu, MKII panel, a card with tracks 1 and 8 FLEX on one sine sample, trigs 1 / 5 / 9 / 13, Part PTCH +1):
0x100b14eb; TRACK to MIDI 1 shows FOLLOW ON in the first LCD read after the turn and back to AUDIO 8 shows OFF; TRACK turns change no stored byte; TRACK stops at AUDIO 1 and MIDI 8.qz_atrig) while track 8 keeps +1; with AUDIO 8 FOLLOW ON both snap.#SEQUENCER_MIDI_SCALE_OFF=2and#SEQUENCER_AUDIO_SCALE_OFF=132and aproject.workbyte-identical to 2.21's; after a power cycle the bits are back and TRACK starts at AUDIO 1; a 2.21-saved project loads with the same tracks OFF.ot-track-rows.pngchanged).Details in TESTING.md.
Hardware
I tested the exact image above on my Octatrack MKI twice, the same bytes each time: TEST2 on 30 October 2026 and TEST3 (the rebuild on current main) on 1 November 2026, every item of the sheet passing both times. The record is in
octamod.module.json(tests.hardwareStatusreported, twotests.gateslines) and TESTING.md ("Author-reported hardware — 30 October 2026" and "— 1 November 2026"):tests.qualificationis added, because the contract wants cycle and memory figures beside it and this cut measures neither.USB package
The branch ships
quantizer/0.1.4-experimental.mwrm(7,210 B,33700b9339c0d0e619716cf6358ac83c9912c9881e30721411d2bf79897bbe04; 19 hooks, 9 stock-code sites, 6 copies), built on this Mac from my own unit's OS with the machine recipe re-captured for the new sources;octatrack:module-packages --check --stockreports 27 packages identical. The card-build packages, the GNU link proofs and the standalone recipe pins are refreshed (Docker isolated build,modules:import --development). Not tested over USB on a unit.Checks and known CI items
Run on 1 November 2026 at the record commit, on main
4ce910bband again on501d8a42formodules:check,module:doctor,licenses:check, the changelog test andnpm run check(the same results), in this checkout without the owner's records, andmodules:check,module:doctor,licenses:check, the changelog test,sdk-importsandtest_requested_importsonce more at the branch heada927f6ae(the same results):npm run modules:check -- --base 501d8a42quantizer: owner-approved update does not cover this module version(sdk/quantizer-build-approval.jsoncovers 0.1.3; the owner's record).npm run module:doctor -- quantizerconflicts), cross-compatibility, board claim; ✗ module rules (the owner record above), native comparison and package fingerprint (module:verify -- quantizer --os <OS>after the records).npm run modules:compat -- quantizernpm run modules:pairssrc/catalog/compatibility-pairs.json is stale: run npm run modules:pairs -- --write(the owner's regeneration after his records).npm run licenses:checknpm run sdk:imports:checknpm run sdk:checknpx vitest run scripts/changelog.test.mjsnpx vitest run src/catalogbuild-support.test.ts(three) expects 0.1.4 from the generated catalogue, which stays 0.1.3's until the owner's record letsmodules:generaterun;module-qualification.test.tsstops at that record;native-comparisons.test.tswantsmodule:verify -- quantizer --os <OS>for the new code.npm run check -- --base 501d8a42(the full app suite) stops atmodules:check, the owner record above;prepare,licenses:checkandmachines:checkpass before it.src/engine/assets/analog-bd-composition-proofs.jsonis not refreshed (this Mac's exporter output differs from the committed record also for selections without the quantizer; the reference toolchain's run). The stock scan over the files this branch authors finds no run of 16 or more stock bytes.Review scope
Beside the module folder the branch changes
sdk/catalog.json, the import record,machine-ports.json/machine-recipes.json/standalone-recipes.json,quantizer_runtime.py(the standalone include at both panel-transaction sites), two SDK tests,src/catalog/build-support.test.tsandscripts/module-source.test.mjs(version expectations), the module changelog, the rebuilt packages and proofs undersrc/engine/assets/, andpublic/octatrack-modules/quantizer/(0.1.3's.mwrmreplaced by 0.1.4's). Owner: the approval record for 0.1.4 and POLY8's composition signature; thenmodule:verify,modules:pairs -- --writeandmodules:generate.How to test
The guides
Nothing lacking for this cut. The check I'd like on every PR is #1138 (say whether the card image's inputs changed since the tested build), which I did by hand above.
docs/module-guides/(sequencing), and TESTING.md lists what I did not test. An effect module holds one effect.Owner review, not automatic publication: this version names addresses 0.1.3 never used, and the owner records (
sdk/quantizer-build-approval.json, POLY8's composition signature) are yours.Validation commands and results: see "Checks and known CI items" above.
Related to #439.