feat: the Leslie, a two-rotor rotary speaker with drive ahead of the crossover #169
No reviewers
Labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
bcox/tymbal!169
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "leslie"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Adds
dsp::LeslieLayer, a two-rotor rotary speaker, as the thirteenthLayerKind(format 2.10), with two factory patches.What it is
speedfield from -1 to +1 covers brake, slow and fast. Each rotor's rate slews toward its target at its own rise and fall, so the horn arrives while the drum is still accelerating.dsp/shaper.h's soft clip at twice the rate on the mono input, withdriveandasymmetry(the shaper's bias), so the amplifier's harmonics are split by band and thrown by the rotors. The stage is AC-coupled and has unity gain where the curve does not bend. A patch that does not engage it pays nothing and stays bit-exact against the undriven engine.resolve/leslie.h,format/leslie.h(LESL,LESH, twoROTR),patchdiff/walk_leslie.h, an editor page, a voice test.leslie-return, a channel-scope Leslie on the external input;tonewheel-leslie, the tonewheel organ through one, macro 1 on speed. The bank is 65.Outside the Leslie
Program::Initnow resets slot strips and channel LFOs. It reset neither.tonewheel-leslieis the first factory patch to author a strip gain, which is how the bank test found the first; the review found the second. Before this, a new document in the editor kept the previous document's channel LFOs and a save wrote them.format/project_test.cc: a project has 64 channels and the bank no longer fits in one. The fixture is the first 64 patches, and the round-trip case runs a second project so every patch is held by one of the two.format/exchange_test.cc: a layer at gain zero is silent when soloed. The test asserts the import carried the zero, then compares at unity.No file on the plan's read-only list changed: nothing under
fabric/,rtl/orhps/, and notdsp/layer.h,dsp/shaper.h,dsp/decimator.h,dsp/svf.hordsp/va_*.h.sizeof(VoiceType), the patch size and the allocator size did not move. No golden moved.Verified
On
954ac36a, once each:bazel test //...and--config=opt //..., 329 of 329;--config=asan //...and--config=ubsan //..., 329 of 329;--config=tsanover the five scoped targets, 5 of 5. The only commit after that is a ledger note.Each task's tests were checked by injection, and an independent review re-ran 29 of those injections and wrote 28 of its own. Four of its own failed nothing at first; each became a test. The ledger has every one.
Known and left
//patches:patches_test's build entry asks for per-shard ASan times. The lane passed; the per-shard figures were not captured and the entry is still owed them.//plugin:preset_race_testfailed its anti-vacuity floor once in the review's first full run (47 adoptions against 48) and passed in every run since, the sanitizer lanes included. Its own comment attributes that to a loaded machine.Design:
docs/superpowers/specs/2026-10-05-leslie-layer-design.md. Ledger, with every measurement, injection and open item:docs/superpowers/ledgers/2026-10-05-leslie-layer.md.🤖 Generated with Claude Code