Catch the effects up with the audioif floor at cebb7ca - #67
Merged
Merged
Conversation
The pin move to audioif cebb7ca brought four behaviour changes these tests were written against, and each test was right to go red: - a released node raises ValueError on every target, as CircuitPython does (audioif e1f3704), not RuntimeError; - audioroute.Splitter has a deinit() (audioif#58), so the walk releases it: the NoiseGate walk checks it by its flag, since it is not a sample, and the kit's no-deinit gap is held to its behaviour with a planted node; - Dynamics.reset() clears the key filters (audioif 1f33077): the test that recorded the 33 LSB miss was written to go red on exactly this, and now asserts exact zero from -6 dBFS and from full scale; - acoustickit is the 55th instrument. Part of #66.
…thio The floor move to audioif cebb7ca brought 10.3.0's synthio loudness changes, and AutoPan's gain notes met both. Panning's sign reversed, so the pairing panning=+1 for the left table put it on the right. Every sweep test is symmetric and stayed green; Centre shows it, where -0.8 came out on the right. The pairing is swapped, and a new test holds Centre to its side with the old pairing planted as SwappedSides. A fresh voice renders at level 0 until its output crosses zero, and a gain table never does, so the first block was silent and the gain stepped in after it. The notes are pressed on a silent waveform for one block, which opens the gate at once, and then take their tables. Without the prime six tests go red. Part of #66.
Since CircuitPython 10.3.0 (audioif 4ec5718) a fresh mixer voice or synthio note starts at level 0 and takes its level only when its signal is zero or changes sign. The first block of anything that does not cross zero in it - a ramp, an impulse at frame 0, a gain table - came out silent, and the level then stepped in at the block boundary, which is a click. _component.open_level_gates plays silence on the voices for one pull, which opens every gate at the level already set; the caller then gives the voices their sources. MultibandCompressor does this in _play_voices, which already ran after the macros. DeEsser now plays its six voices at the end of construction, after the macros, instead of in the middle of it. AutoPan's prime gets the same guard: audiocore.get_buffer is compiled out of CircuitPython's default board builds, where the prime does nothing. With the helper switched off, the seven DeEsser and MultibandCompressor tests that went red at the pin move go red again. Part of #66.
… accurate audioif#77 split the biquads by ownership: synthio.Biquad, and so audiofilters.Filter, runs CircuitPython's Q15 arithmetic on every target, and the widened kernel is audiobiquad's alone. At the cebb7ca floor an 80 Hz low shelf asked for +1.5 dB reads -7.65 dB through synthio, so tape lost its head bump and five Saturation tests went red. Saturation now chains audiobiquad shelves, and falls back to synthio only where audiobiquad is missing; forcing that fallback turns the same five tests red again. The shelves are a chain, so reset() and deinit() walk the ones behind the output. The low-shelf resolution test reads audiobiquad, where the claim now lives, and the README's note on how low a filter can go says which node is accurate and why. Part of #66.
…fixed audioif#64 moved audiobiquad's float sections to transposed direct form II. Three tests written to stay red on the old kernel's defects went green, and each was right to say so. BandPass T1 held the -0.50 dB miss at the knob stops, and said it would be the test to announce audioif#64. Re-running the low-corner probe at the new floor: 55 of 56 cells inside the 0.05 dB bar, stops included, and one miss, -0.091 dB at f0 31.5 Hz with Q 32, now pinned by its own test. The class docstring and the README row say so. GraphicEQ's retired plant is green on every band now, not six of ten. Its live plant, a patch jump on stale state, no longer slams from 5 to 1; from 2 to 1 it still reaches 2.72x steady against the check's 2x bar, and 1.32x through the class, so the plant moves there and is held to that bar. The CHANGELOG records all of #66.
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.
Fixes #66.
Testshas been red onmainsince the audioif floor moved tocebb7cafor acoustickit. That move brought five deliberate audioif changes, and 27 tests went red.Four of the fixes change what you'd hear:
_component.open_level_gatesopens each gate on one block of silence before the voices take their sources. With the helper switched off, the original failures come back.synthio.Biquadis CircuitPython's Q15 arithmetic again (audioif#77), so the 80 Hz shelf that should add +1.5 dB was reading −7.65 dB. The shelves are onaudiobiquadnow, falling back to synthio only where it's missing. Forcing the fallback turns the five tests red again.The rest are tests catching up with audioif's intended behaviour. A released node raises
ValueError,Splitterreleases,Dynamics.reset()clears the key filters, and there are 55 instruments. GraphicEQ's two plants were re-pointed so they can still fail.Verified in a clean venv with audioif installed from the pin, as CI does:
validate_api(55 + 45), effects smoke 0 failures over 203 patches, and flake8 clean.build-standard, which carries this audioif) render the same FNV digest on nine renders across all six touched classes.Not done: no board cost runs, and nothing was run on the CircuitPython oracle build.