Skip to content

Sidechain Compressor 0.2.2: ColdFire units join the DRAM runtime when the set has one (#1175) - #1195

Merged
repeat98 merged 36 commits into
repeat98:mainfrom
Zac-Kyoti:sc-dram-when-present
Nov 11, 2026
Merged

repeat98 merged 36 commits into
repeat98:mainfrom
Zac-Kyoti:sc-dram-when-present

Conversation

@Zac-Kyoti

@Zac-Kyoti Zac-Kyoti commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

Related to #1175. @repeat98: option 3 from #1175, as agreed. #1098 is in, and main is merged (not rebased).

What was wrong

FM Synth + Sidechain Compressor + Mute Modes, with the stock FX2 effects kept, ran 8 bytes short of menu cave (PERSONALIZE setters: 68 bytes needed, 60 left), so the build fell back to the module-only FX2 chooser: COMPRESSOR alone (#1175). Your fix for the silent fallback is separate; this one frees the space.

What this changes

A shared placement rule, in both builders (owner review):

  • A stock-DSP effect may list ColdFire units in modules/<id>/placement.json. They link into the DRAM runtime only when another selected module already carries one, and into the menu cave otherwise. The runtime is a fixed ~10 MB sample-memory reserve, so this never makes a set start paying it.
  • Native: tools/build/runtime_join.py, which build_bus.py applies right after compose_map. tools/remix/ is untouched, so the pins over it (standalone recipes, table declarations) don't move. build_bus.py also resolves raw descriptor words after the platform runtime link (stage 1e), so a joined unit is named like a ROM one.
  • Configurator: createStaticColdFireRuntime links joining units at their module's place in native placement order. A module that replaces a stock effect in place leads while the stock FX2 rows stay; leadingModules is shared with composeChoosers. module-menus.ts resolves the descriptor's raw pointers and detours from the runtime. With Fix: the configurator's DRAM link takes the ROM units' symbols, as the native builder does (#1312) #1343's rom parameter, leading is the eighth parameter, so Fix: the configurator's DRAM link takes the ROM units' symbols, as the native builder does (#1312) #1343's callers are unchanged.
  • Packages: build-module-packages.py emits the joining units for the runtime's ISA into coldfire-packages.json (joinRuntime: true). Both builders refuse the rule for anything but a stock-DSP effect's descriptor units.

Sidechain Compressor 0.2.2, its first user:

  • placement.json names sc_cf and sc_ui (1,314 B). The code is 0.2.1's.
  • Source pin: Zac-Kyoti/octatrack-kyoti-fw ad7ecd2 (sdk/imports/sidechain-compressor-ad7ecd2.json).
  • The USB package stays 0.2.1 (lagsBehind, card placement only), as you asked.
  • README, TESTING.md and the hardware evidence keep main's text, with the 0.2.2 lines on top.

How I checked it

  • Builder record sdk/infrastructure-verification/runtime-join-builder.json, with its test and chain entry. Two fresh native builds of the dram-rom-symbols record's 128 selections: one with the base commit's build_bus.py, one with this and runtime_join.py. Everything else is the base commit's, including Sidechain's folder without placement.json, so the builder is the only difference. Every image (98) and every refusal (30) is identical.
  • Analog BD proofs re-exported natively (8 shards). Exactly the 28 built Analog BD + Sidechain selections change: Sidechain's units now join Analog BD's DRAM runtime. Every refusal (66) is identical, and nothing else moves.
  • Packages: rebuilt in the isolated toolchain after the merge. The two joining objects are byte-identical to the ones flashed. Tape Echo's and Euclid's recipes are re-pinned.
  • module:verify -- sidechain-compressor:
    • The committed record is the 0.2.2 run from before the merge: 162 selections, 64 images and 98 refusals matching, 0 mismatches.
    • Re-run on current main: 190 selections, 72 images and 110 refusals matching, 8 mismatches, every one a selection with Track Solo.
    • This is not this PR: on main, without it, npm run module:verify -- track-solo has 81 mismatches of 190 (sidechain-compressor+track-solo among them). Track Solo is USB-only, so the configurator leaves it out of card builds, while native octabam still builds its DRAM units and detours into the card image. Every module's coverage set now contains Track Solo selections, so every re-run hits it. Details below.
  • New tests:
    • src/engine/runtime-join.test.ts: placement, native order, no reserve without another runtime.
    • sdk/tests/test_runtime_join.py: native rule.
    • Sidechain's two pin tests now pin the new import record and the 0.2.2 hardware image.
  • Emulator (capture-module-ui.py, MKI panel): the [sidechain-compressor] compressor only fx available on fx2 #1175 image and the module alone show identical pixels on the FX1 chooser, COMPRESSOR's main page and page 2 with KEY selected. The [sidechain-compressor] compressor only fx available on fx2 #1175 image's FX2 chooser lists the stock effects.
  • Hardware, MKI, 3 November 2026 (Zac Kyoti). Sidechain beside Direct Jump (units in DRAM) and the six modules of [sidechain-compressor] compressor only fx available on fx2 #1175, all tests passing: the FX2 chooser, page 2 on FX1 and FX2, same-core and cross-core keys, MON/KEY/KBAS/KWID, a direct jump, reload and power cycle.
    • Beside Direct Jump: the release image differs from the flashed one only in the core logger's identity text (137 bytes); every OS write and runtime unit is the same.
    • The [sidechain-compressor] compressor only fx available on fx2 #1175 set: it also carries Mute Modes 0.2.2, released after the run. Sidechain's part is unchanged. TESTING.md has the exact comparison.
  • npm run pr:ready: Ready.

Not run: the USB beta base (Sidechain's USB package is unchanged, still 0.2.1) and Sidechain Ringmod on a unit.

Track Solo in card comparisons (found here, not fixed here)

Track Solo 0.2.4 is usbOnly, so cardBuildError refuses it and the configurator's static runtime never links it. Its native manifest still declares three Linked(..., dram=True) units and seven detours, so export-composition-proofs.py builds them into the card image, and every selection with Track Solo differs "outside the platform writes". It's in comparisonPool (availableModules(true)), so any module's module:verify now reports these.

Two possible fixes: leave USB-only modules out of the card comparison pool, or have native refuse a USB-only module in a card build so both sides match as refusals. Which do you prefer? I'm happy to send it as its own Fix:. This PR keeps its pre-merge Sidechain record until then.

What the guides lacked

The effects guide had nothing on where a module's ColdFire units go. A "ColdFire units that may move" bullet is in docs/module-guides/effects.md (Declare), and there's an SDK changelog entry.

  • I read the guide for its category in docs/module-guides/, and TESTING.md lists what I did not test. An effect module holds one effect.
  • Source and media are mine or properly licensed, with authors and full licence texts kept. Nothing comes from Elektron firmware.
  • Screenshots are real captures of the current module UI. Hardware results are what a named person saw on this exact build; emulator results are labelled as emulator results.

🤖 Generated with Claude Code

Zac-Kyoti and others added 19 commits October 30, 2026 17:33
…F0 (repeat98#1064)

Frees Y $7F0-$9FF on both cores for a DSP machine's voice. The key bus moves
to the tail of the first internal FX2 slot (+$3E00, past every +$3DFD ring),
Sidechain Compressor's MON words to Y $FF0-$FFF (no stock effect writes
either range: emulator, every stock effect through FX1/FX2 on all tracks,
both cores).

- dsp-sites.json / dsp_ledger.h / resident_dsp: feature 1 owns three regions,
  feature 8 the window and the bus at $7E00. A reset chunk stops at every
  region end from the ledger (MW_DSP_RESET_END); the board's 528 and the
  driver's single split assumed two regions.
- Sidechain Compressor 0.2.1: manifest tokens and declared ranges only
  (source: Zac-Kyoti/octatrack-kyoti-fw 8868867).
- Sidechain Ringmod 0.2.1: the same-core read at $7E00 (npp1993 agreed).
- BBD Delay 0.1.2: buffer_words 0x203A as octabam repeat98#783 (JamCones agreed),
  so it stays clear of the bus on T1/T5.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sidechain Compressor 0.2.1 and BBD Delay 0.1.2: hardware reports from the
author's MKI (30 October 2026), native images fb7c5e31 / c234d13c. Sidechain
Ringmod 0.2.1: screens on its native card image; hardware pending (USB only).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ay 0.1.2

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- octatrack:base --beta --write: base 62ed0ec0 (controller trust rows,
  base binding and base assets); Analog BD's machine recipe recaptured
  (only imageSha256 moved: the base's symbols shifted).
- octatrack:module-packages --stock: Sidechain Compressor 0.2.1
  (fd275bf2), Sidechain Ringmod 0.2.1 (91281f07), BBD Delay 0.1.2
  (58b77069, buffer 8,250); Output Matrix and Analog BD rebound to the new
  base. Earlier versions' files kept as on main.
- Tape Echo's and Euclid's standalone recipes re-pin the rebuilt shared
  assets (as repeat98#969).
- Sidechain Compressor's composed image recorded (9b8c9ed3, captures
  pixel-identical to the native image's).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…, import record author pin

Suites sidechain / sidechain-visible / analog-bd: the same selections build and
refuse as with 0.2.0; only selections containing the module changed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…records

- module:verify: Sidechain Compressor, Sidechain Ringmod and BBD Delay, 0
  mismatches of 162 selections each.
- modules:pairs: bbd+sidechain-compressor is no longer refused in card builds
  (BBD's 8,250-word claim stays clear of Sidechain's key window).
- Tests that pinned Sidechain's two-region reset or the old MON address
  (test_owned_transfer, test_resident_boot, sidechain-compressor.test.ts).
- BBD and Ringmod performance records carried to their new versions (same
  instructions); the hooks doc does not grow.

Sidechain Ringmod 0.2.1's qualification stays 0.2.0's until its USB run on
a unit, so modules:generate refuses and module-documents.json is not
regenerated in this branch yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…dalone recipes re-pinned

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d's release note names the T1/T5 limit

BBD's conflict with Sidechain Compressor existed only because of the 16K
claim (repeat98#731); with 8,250 words the pair builds (review on repeat98#1098).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…generated next)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… base-bound packages relinked

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n another module carries one

Native: remix.machine_composition.join_runtime (compose_map) sets dram=True on them,
and build_bus resolves raw descriptor words after the platform runtime link.
Browser: createStaticColdFireRuntime links them at the module's place in the selection,
module-menus resolves the module's raw pointers and detours from the runtime.
Packages: build-module-packages emits the joining units for the runtime's ISA
(coldfire-packages.json, joinRuntime). Sidechain Compressor lists sc_cf and sc_ui (repeat98#1175).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ock-replacing module leads while stock FX2 stays)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ve; native compose_map)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…when the set carries one (repeat98#1175)

Source pin Zac-Kyoti/octatrack-kyoti-fw ad7ecd2 (placement.json added; every other
source is 0.2.1's). Hardware: the author's MKI, 3 November 2026, beside Direct Jump
(MAIN e77ec14b) and the six modules of repeat98#1175 (ebaf5116), all tests pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…modwerk-source-tools 2c78cdad)

coldfire-packages.json gains the two joining units (sc_cf, sc_ui; byte-identical to the
objects in the flashed images); the other assets change only SC's version labels, the
source commit and the builder's own hash. TESTING.md records how the release images differ
from the flashed ones: the core logger's identity text only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…time; effects guide and SDK changelog

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ls and builder hash only)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… 0 mismatches)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@repeat98

repeat98 commented Nov 4, 2026

Copy link
Copy Markdown
Owner

Thanks, Zac, this is a good way to do option 3. No need to split it. The placement rule has one user and its tests are built on Sidechain, so I'll review the builder part here.

One thing before it's ready: src/engine/assets/octatrack-module-packages.json still lists Sidechain Compressor at 0.2.1 with no lagsBehind, and npm run octatrack:module-packages -- --check refuses a USB package that is behind the catalogue. 0.2.2 changes nothing over USB, so please declare the lag ("lagsBehind": "0.2.2-experimental" and a lagReason saying it's the card placement only) instead of shipping a new USB package that does nothing. Then, once #1098 is in, merge main, run npm run pr:ready until it says Ready and mark this ready for review.

Zac-Kyoti and others added 3 commits November 4, 2026 13:59
… build_bus after compose_map

tools/remix is again the base's byte for byte, so the reviewed pins over tools/remix/*.py
(the standalone recipes, Mute Modes' table declaration on repeat98#1007) do not move with this change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…card placement only)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…only); Tape Echo and Euclid standalone recipes re-pinned

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Zac-Kyoti

Copy link
Copy Markdown
Contributor Author

Thanks, Jannik. Both points are pushed (head b9ea7000):

  • USB lag: Sidechain Compressor's row in octatrack-module-packages.json now has "lagsBehind": "0.2.2-experimental", with a lagReason saying 0.2.2 changes only the card build's placement and the USB package and controller are 0.2.1's. npm run octatrack:module-packages -- --check passes: "sidechain-compressor kept at 0.2.1-experimental".
  • One change while doing that: the native join rule moved out of tools/remix/machine_composition.py into tools/build/runtime_join.py, which build_bus.py applies right after compose_map. tools/remix/ is the base's byte for byte again. Otherwise this PR would have moved the hashes that the standalone recipes and Mute Modes' table declaration (Mute Modes 0.2.2-experimental: SHADOW out of the stock timestretch task's SRAM (owner review) #1007) pin over tools/remix/*.py. Now only the asset files move, and Tape Echo's and Euclid's recipes are re-pinned to them as usual. Same behaviour; the two SC objects are byte-identical.

Once #1098 is in, I'll merge main, regenerate, re-export Analog BD's proofs, re-run module:verify, run pr:ready until it says Ready and mark this ready.

@repeat98

Copy link
Copy Markdown
Owner

Hi Zac, #1098 is merged, so this one can move again. It conflicts with main now, mostly in Sidechain's own README, TESTING.md and hardware evidence, which #1098 changed for the MON words. Please merge main (no rebase), keep main's side in those files and add your 0.2.2 lines on top, relink the packages, and run pr:ready until it says Ready. Then mark it ready for review once the checks are green.

# Conflicts:
#	sdk/catalog.json
#	sdk/machines/octatrack/base-binding.json
#	sdk/machines/octatrack/module-adapters/controller-policies.json
#	sdk/machines/octatrack/module-adapters/standalone-recipes.json
#	sdk/native-comparisons/sidechain-compressor.json
#	sdk/octabam/modules/ring-sc/README.md
#	sdk/octabam/modules/ring-sc/TESTING.md
#	sdk/octabam/modules/sidechain-compressor/README.md
#	sdk/octabam/modules/sidechain-compressor/TESTING.md
#	sdk/octabam/modules/sidechain-compressor/evidence/hardware.md
#	sdk/octabam/modules/sidechain-compressor/media/capture.json
#	sdk/octabam/modules/sidechain-compressor/octamod.module.json
#	sdk/octabam/modules/sidechain-compressor/upstream/README.md
#	sdk/tests/test_sidechain_compressor.py
#	src/community/module-changelogs/sidechain-compressor.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
#	src/engine/coldfire-runtime.ts
#	src/engine/static-compose.ts
Zac-Kyoti and others added 7 commits November 10, 2026 11:04
… stays 0.2.1 (lagsBehind, card placement only)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ho and Euclid standalone recipes re-pinned

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ainst the flashed ones (logger identity only beside Direct Jump; Mute Modes 0.2.2 in the repeat98#1175 set)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ctions change: its units join Analog BD's DRAM runtime; every refusal identical); builder record runtime-join-builder.json (128 identical); Sidechain's 0.2.2 comparison record restored

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ide Direct Jump; the module alone still builds 0.2.1's image

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…y makes (typecheck)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Zac-Kyoti
Zac-Kyoti marked this pull request as ready for review November 10, 2026 19:29
@Zac-Kyoti

Copy link
Copy Markdown
Contributor Author

@repeat98 Done: main merged (no rebase), Sidechain's README, TESTING.md and hardware evidence on main's text with the 0.2.2 lines on top, packages relinked, pr:ready Ready, checks green. Marked ready for review.

One thing for you in the description, under Track Solo in card comparisons: Track Solo is USB-only, but native octabam still builds its DRAM units into card images, so every module's module:verify now mismatches on Track Solo selections. On main, Track Solo's own comparison has 81 of 190. Sidechain's re-run hits it 8 times, all with Track Solo, so this PR keeps its pre-merge record. Tell me which fix you'd like and I'll send it as a Fix: PR.

repeat98 and others added 6 commits November 11, 2026 18:04
# Conflicts:
#	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-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
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…idechain selections change as before; every menu and refusal identical)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@repeat98

Copy link
Copy Markdown
Owner

Hi Zac, sorry, two of my merges this morning (Analog BD 0.1.7 and the new base) conflicted with yours again. Every conflict was a generated file, so I merged main into your branch myself and pushed: packages from the isolated build (only provenance moved), Tape Echo and Euclid re-pinned, and Analog BD's proofs re-exported. The same 28 Analog BD + Sidechain selections change as in your run, and every menu and refusal is identical. I'll merge once the checks are green.

On Track Solo: please send the Fix: that leaves USB-only modules out of the card comparison pool. That matches what the configurator offers and leaves native as it is. Thanks for the quick turnaround yesterday.

@repeat98
repeat98 merged commit adda2a1 into repeat98:main Nov 11, 2026
29 of 33 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants