Skip to content

audiomath.Multiply: a mix move walks over 20 ms - #411

Merged
bdbarnett merged 4 commits into
mainfrom
multiply-mix-walks
Nov 10, 2026
Merged

bdbarnett merged 4 commits into
mainfrom
multiply-mix-walks

Conversation

@bdbarnett

@bdbarnett bdbarnett commented Nov 10, 2026 •

Copy link
Copy Markdown
Contributor

A move of Multiply's mix on a playing node now walks to the new value in a straight line over 20 ms, the way the Waveshaper's, the Biquad's and the FeedbackDelay's mix already do, instead of landing at the next block. An effect that sets this mix to take a tremolo's Depth to 0 and back stepped its output there: on a 110 Hz triangle the jump was 20 to 30 times the triangle's own steepest step. The walk runs in the shared kernel a frame at a time, rounded to the Q15 grid, and lands on mix exactly, so a node at rest renders the bytes it did before. A node's first mix, and the first block after a reset, land at once. The CPython twin keeps the walk's state in a buffer the kernel writes.

This also carries the __version__ and __revision__ names for audiocore, audiomp3, audiopump and synthio from the lane-d-audio-audiodsp branch, with the CPython modules given the same names so the stub check holds on every target. The binding-parity control, which checked that audiocore carried no build marker, now checks the three upstream modules that still don't.

What I ran: tests/test_cpython_node_level_ramps.py with a Multiply case (it fails with the walk turned off and passes with it), tests/test_cpython_audiomath.py, the five CI gates, tests/test_stubs_match_modules.py against CPython and a MicroPython unix build of this branch, flake8, and verify_dsp.py against that build: 65 comparisons, 0 failures, with multiply_probe.py and node_level_ramp_probe.py (which now moves a Multiply's mix) agreeing. Not run here: the CircuitPython oracle three-way and the CircuitPython build of the spike module, which CI's build job compiles.

A move of Multiply's mix on a playing node now walks to the new value in a
straight line over 20 ms, as the Waveshaper's, the Biquad's and the
FeedbackDelay's mix already do, instead of landing at the next block. A
tremolo whose depth goes to 0 or comes back from it sets this mix, and the
jump stepped the output by up to 30 times the steepest step of a 110 Hz
triangle going through it.

The walk runs in the shared kernel, a frame at a time, rounded to the Q15
grid, and lands on mix exactly, so a node at rest renders the bytes it did
before. A node's first mix, and the first block after a reset, land at once.
The CPython twin keeps the walk's state in a buffer the kernel writes.
… from the build

The four modules report which audiodsp source a MicroPython firmware was built from, as the other modules do, through the shared build strings. Their stubs declare both.
…n too

The stubs declare both names on every target since the previous commit, and
the CPython modules didn't have them, so tests/test_stubs_match_modules.py
failed there. They read the extension's own, as the other CPython modules
do.
…it out

The control in test_binding_parity checked that audiocore had no __version__ or __revision__, which the previous commits gave it. It now checks the three upstream modules that still don't. Ran test_binding_parity and the CPython suite; the stub test passes against a unix build of this branch.
@bdbarnett
bdbarnett merged commit ec82463 into main Nov 10, 2026
37 checks passed
@bdbarnett
bdbarnett deleted the multiply-mix-walks branch November 10, 2026 22:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant