diff --git a/docs/conf.py b/docs/conf.py index d049743..0f7665f 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """Sphinx configuration for the audioeffects documentation. Everything shared by the PyDevices documentation projects (theme, top bar, diff --git a/lib/audioeffects/__init__.py b/lib/audioeffects/__init__.py index 5df65a8..dccd714 100644 --- a/lib/audioeffects/__init__.py +++ b/lib/audioeffects/__init__.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """Forty-five effect classes built out of audiodsp's audio nodes. Every class wires itself from an audio source - a synthesizer, an diff --git a/lib/audioeffects/_component.py b/lib/audioeffects/_component.py index e2befd1..5e2fc11 100644 --- a/lib/audioeffects/_component.py +++ b/lib/audioeffects/_component.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The construction shape every rebuilt effect class is built on. It replaced `_core.py`, the pre-contract shape, in which a module-level diff --git a/lib/audioeffects/_iso.py b/lib/audioeffects/_iso.py index e2f4142..c476caf 100644 --- a/lib/audioeffects/_iso.py +++ b/lib/audioeffects/_iso.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """ISO centre frequencies, kept as a shared private constant. The old family GraphicEQ walked these ten centres. The rebuilt GraphicEQ diff --git a/lib/audioeffects/airspace.py b/lib/audioeffects/airspace.py index 07b3390..00e0ed5 100644 --- a/lib/audioeffects/airspace.py +++ b/lib/audioeffects/airspace.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`AirSpace` - a tape echo sent into a chamber, with the dry beside it. You send your signal to a tape echo whose repeats feed an echo chamber, and diff --git a/lib/audioeffects/analogdelay.py b/lib/audioeffects/analogdelay.py index 82a2725..904859c 100644 --- a/lib/audioeffects/analogdelay.py +++ b/lib/audioeffects/analogdelay.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`AnalogDelay` - a bucket-brigade delay whose Time knob is its clock. The player's text is the class docstring, and every sentence in it that diff --git a/lib/audioeffects/autopan.py b/lib/audioeffects/autopan.py index a62d1e1..8a15515 100644 --- a/lib/audioeffects/autopan.py +++ b/lib/audioeffects/autopan.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`AutoPan` - an auto-panner: a pan law under an LFO. The player's text is the class docstring; the `CLAIMS` table in the class's diff --git a/lib/audioeffects/bandpass.py b/lib/audioeffects/bandpass.py index 9b90759..e9142c7 100644 --- a/lib/audioeffects/bandpass.py +++ b/lib/audioeffects/bandpass.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`BandPass` - the two-pole resonant band-pass, rebuilt on `audiobiquad`. The player's text is the class docstring; the `CLAIMS` table in the diff --git a/lib/audioeffects/bitcrusher.py b/lib/audioeffects/bitcrusher.py index 8eb13ae..25bf140 100644 --- a/lib/audioeffects/bitcrusher.py +++ b/lib/audioeffects/bitcrusher.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Bitcrusher` — a linear hold, the SP-1200's two numbers as knobs. The player's text is the class docstring; the `CLAIMS` table in the class's diff --git a/lib/audioeffects/cabinetsim.py b/lib/audioeffects/cabinetsim.py index 88cfe2b..61c0c5e 100644 --- a/lib/audioeffects/cabinetsim.py +++ b/lib/audioeffects/cabinetsim.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`CabinetSim` - a designed guitar-cabinet response, two characters. The player's text is the class docstring; the `CLAIMS` table in the class's diff --git a/lib/audioeffects/chorus.py b/lib/audioeffects/chorus.py index 7678725..2c4c755 100644 --- a/lib/audioeffects/chorus.py +++ b/lib/audioeffects/chorus.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Chorus` - one delayed voice on a clock-modulated bucket-brigade line. The player's text is the class docstring; the `CLAIMS` table in the class's diff --git a/lib/audioeffects/combfilter.py b/lib/audioeffects/combfilter.py index 490f37a..38a5b67 100644 --- a/lib/audioeffects/combfilter.py +++ b/lib/audioeffects/combfilter.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`CombFilter` - a delay line short enough to be a pitch, fed back on itself. diff --git a/lib/audioeffects/compressor.py b/lib/audioeffects/compressor.py index 0b57baa..1ee2187 100644 --- a/lib/audioeffects/compressor.py +++ b/lib/audioeffects/compressor.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Compressor` - compressor characters on a shared palette. The player's text is the class docstring; the `CLAIMS` table in the diff --git a/lib/audioeffects/convolutionreverb.py b/lib/audioeffects/convolutionreverb.py index 1cdc6e8..1866885 100644 --- a/lib/audioeffects/convolutionreverb.py +++ b/lib/audioeffects/convolutionreverb.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`ConvolutionReverb` - a room made by convolution, synthesized or loaded. The player's text is the class docstring, and every sentence in it that diff --git a/lib/audioeffects/deesser.py b/lib/audioeffects/deesser.py index ed338e2..cd02e6a 100644 --- a/lib/audioeffects/deesser.py +++ b/lib/audioeffects/deesser.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The dbx 902 de-esser: sibilance measured against the programme, not against a threshold knob. diff --git a/lib/audioeffects/digitaldelay.py b/lib/audioeffects/digitaldelay.py index 373456a..875e74f 100644 --- a/lib/audioeffects/digitaldelay.py +++ b/lib/audioeffects/digitaldelay.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`DigitalDelay` - a clean digital delay with the Boss DD-2's control law. Your dry signal passes untouched, and one clean repeat follows it, fed back diff --git a/lib/audioeffects/distortion.py b/lib/audioeffects/distortion.py index b9b2e93..52fb190 100644 --- a/lib/audioeffects/distortion.py +++ b/lib/audioeffects/distortion.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Distortion` - the ProCo Rat, with a Boss pedal as a second character. The player's text is the class docstring; the `CLAIMS` table in the diff --git a/lib/audioeffects/dynamiceq.py b/lib/audioeffects/dynamiceq.py index 365e66a..7ec51b7 100644 --- a/lib/audioeffects/dynamiceq.py +++ b/lib/audioeffects/dynamiceq.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`DynamicEQ` - one equaliser band that only moves when there is something in it. diff --git a/lib/audioeffects/exciter.py b/lib/audioeffects/exciter.py index beebd62..1ca17d9 100644 --- a/lib/audioeffects/exciter.py +++ b/lib/audioeffects/exciter.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Exciter` - dry plus a high-passed harmonic branch. The player's text is the class docstring; the `CLAIMS` table in the diff --git a/lib/audioeffects/expander.py b/lib/audioeffects/expander.py index 5843680..63a123c 100644 --- a/lib/audioeffects/expander.py +++ b/lib/audioeffects/expander.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Expander` - a downward expander in the Drawmer DS201's shape. The player's text is the class docstring; the `CLAIMS` table in the class's diff --git a/lib/audioeffects/flanger.py b/lib/audioeffects/flanger.py index 49e4c6d..3ddcadb 100644 --- a/lib/audioeffects/flanger.py +++ b/lib/audioeffects/flanger.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Flanger` - a swept comb on CircuitPython's own `audiodelays.Flanger`. The player's text is the class docstring; the `CLAIMS` table in the class's diff --git a/lib/audioeffects/fuzz.py b/lib/audioeffects/fuzz.py index 1311bcd..371a36e 100644 --- a/lib/audioeffects/fuzz.py +++ b/lib/audioeffects/fuzz.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Fuzz` - a biased germanium pair, with a Big Muff cascade as a second character. The player's text is the class docstring; the `CLAIMS` table in the class's diff --git a/lib/audioeffects/graphiceq.py b/lib/audioeffects/graphiceq.py index 3a5d336..3f7de6c 100644 --- a/lib/audioeffects/graphiceq.py +++ b/lib/audioeffects/graphiceq.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`GraphicEQ` - ten octave bands and two level sliders, after the MXR M-108 Ten Band. diff --git a/lib/audioeffects/harmonizer.py b/lib/audioeffects/harmonizer.py index 90cbfcd..dc4cadf 100644 --- a/lib/audioeffects/harmonizer.py +++ b/lib/audioeffects/harmonizer.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Harmonizer` - a harmony of pitch-shifted voices. The player's text is the class docstring; the `CLAIMS` table in the class's diff --git a/lib/audioeffects/highpass.py b/lib/audioeffects/highpass.py index 91a8438..2b54f3f 100644 --- a/lib/audioeffects/highpass.py +++ b/lib/audioeffects/highpass.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`HighPass` - the low-cut: a two-pole analog high-pass whose transmission zero at DC is exact, not nearly. diff --git a/lib/audioeffects/ladderfilter.py b/lib/audioeffects/ladderfilter.py index 43fd9df..acac7a7 100644 --- a/lib/audioeffects/ladderfilter.py +++ b/lib/audioeffects/ladderfilter.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`LadderFilter` - the Moog transistor ladder, rebuilt on `audioladder`. The player's text is the class docstring; the `CLAIMS` table in the class's diff --git a/lib/audioeffects/limiter.py b/lib/audioeffects/limiter.py index ea98057..f463bd8 100644 --- a/lib/audioeffects/limiter.py +++ b/lib/audioeffects/limiter.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """A lookahead brickwall limiter: a ceiling the signal does not get past. The player's text is the class docstring; the `CLAIMS` table in the class's diff --git a/lib/audioeffects/lowpass.py b/lib/audioeffects/lowpass.py index d284bf6..5f4e02f 100644 --- a/lib/audioeffects/lowpass.py +++ b/lib/audioeffects/lowpass.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`LowPass` - the two-pole analog prototype every synth and console low-pass is a version of, digitised without losing its tail. diff --git a/lib/audioeffects/multibandcompressor.py b/lib/audioeffects/multibandcompressor.py index cf118bf..dc36f03 100644 --- a/lib/audioeffects/multibandcompressor.py +++ b/lib/audioeffects/multibandcompressor.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`MultibandCompressor` - split-band compression, two or three bands. The player's text is the class docstring; the `CLAIMS` table in the class's diff --git a/lib/audioeffects/multitapdelay.py b/lib/audioeffects/multitapdelay.py index 985484a..83dddbc 100644 --- a/lib/audioeffects/multitapdelay.py +++ b/lib/audioeffects/multitapdelay.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`MultiTapDelay` - one recording read by several heads on a fixed grid. The player's text is the class docstring, and every sentence in it that diff --git a/lib/audioeffects/noisegate.py b/lib/audioeffects/noisegate.py index 238e555..d8ef842 100644 --- a/lib/audioeffects/noisegate.py +++ b/lib/audioeffects/noisegate.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`NoiseGate` - a noise gate after the Drawmer DS201. The player's text is the class docstring; the `CLAIMS` table in the class's diff --git a/lib/audioeffects/notch.py b/lib/audioeffects/notch.py index f7a5368..99693ff 100644 --- a/lib/audioeffects/notch.py +++ b/lib/audioeffects/notch.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Notch` - the two-pole band-stop: everything except one band, tuned. The player's text is the class docstring; the `CLAIMS` table in the diff --git a/lib/audioeffects/octaver.py b/lib/audioeffects/octaver.py index bc5e2b1..f31cecb 100644 --- a/lib/audioeffects/octaver.py +++ b/lib/audioeffects/octaver.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Octaver` - the analog octave-down. The player's text is the class docstring; the `CLAIMS` table in the class's diff --git a/lib/audioeffects/overdrive.py b/lib/audioeffects/overdrive.py index a167cba..a541037 100644 --- a/lib/audioeffects/overdrive.py +++ b/lib/audioeffects/overdrive.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Overdrive` - a Tube Screamer-shaped boost: dry plus a clipped shelf. The player's text is the class docstring; the `CLAIMS` table in the diff --git a/lib/audioeffects/parametriceq.py b/lib/audioeffects/parametriceq.py index 0c48587..4cc10f5 100644 --- a/lib/audioeffects/parametriceq.py +++ b/lib/audioeffects/parametriceq.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`ParametricEQ` - the Pultec EQP-1A's two low networks and its resonant top, with three API 550A proportional-Q bells in the middle. diff --git a/lib/audioeffects/phaser.py b/lib/audioeffects/phaser.py index e432ce8..4d6f812 100644 --- a/lib/audioeffects/phaser.py +++ b/lib/audioeffects/phaser.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Phaser` - four first-order all-pass stages swept the way a Phase 90 is. The player's text is the class docstring; the `CLAIMS` table in the class's diff --git a/lib/audioeffects/pingpongdelay.py b/lib/audioeffects/pingpongdelay.py index cd18356..cb60add 100644 --- a/lib/audioeffects/pingpongdelay.py +++ b/lib/audioeffects/pingpongdelay.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`PingPongDelay` - repeats that alternate between the speakers. The player's text is the class docstring, and every sentence in it that diff --git a/lib/audioeffects/pitchshifter.py b/lib/audioeffects/pitchshifter.py index 8f0f758..e15653e 100644 --- a/lib/audioeffects/pitchshifter.py +++ b/lib/audioeffects/pitchshifter.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`PitchShifter` - a fixed-interval splice pitch shifter. The player's text is the class docstring; the `CLAIMS` table in the class's diff --git a/lib/audioeffects/rack.py b/lib/audioeffects/rack.py index ac674a6..f24d0ab 100644 --- a/lib/audioeffects/rack.py +++ b/lib/audioeffects/rack.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Rack` - a serial chain of effects, as a single effect. The player's text is the class docstring, and the sentences in it that make diff --git a/lib/audioeffects/reverb.py b/lib/audioeffects/reverb.py index 634c83e..de7ff85 100644 --- a/lib/audioeffects/reverb.py +++ b/lib/audioeffects/reverb.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Reverb` - Dattorro's plate network, cut four ways: a plate, a room, a chamber and a hall. diff --git a/lib/audioeffects/ringmod.py b/lib/audioeffects/ringmod.py index 73b1d3c..8d19802 100644 --- a/lib/audioeffects/ringmod.py +++ b/lib/audioeffects/ringmod.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`RingMod` - Bode multiplier-type ring, with a switching character. The player's text is the class docstring; the `CLAIMS` table in the class's diff --git a/lib/audioeffects/saturation.py b/lib/audioeffects/saturation.py index 029c750..f500fcc 100644 --- a/lib/audioeffects/saturation.py +++ b/lib/audioeffects/saturation.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Saturation` - a tube stage, a tape chain, or transformer iron. The player's text is the class docstring; the `CLAIMS` table in the class's diff --git a/lib/audioeffects/shimmerhall.py b/lib/audioeffects/shimmerhall.py index 4870bd1..2b9f160 100644 --- a/lib/audioeffects/shimmerhall.py +++ b/lib/audioeffects/shimmerhall.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`ShimmerHall` - a hall that rings an octave above what you play. You play into a hall, and a pitch shifter beside it makes the tail ring at diff --git a/lib/audioeffects/slapbackdelay.py b/lib/audioeffects/slapbackdelay.py index b898022..5a45efc 100644 --- a/lib/audioeffects/slapbackdelay.py +++ b/lib/audioeffects/slapbackdelay.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`SlapbackDelay` - one tape repeat after the dry, in mono: the Sun Studio slap. The player's text is the class docstring, and every sentence in it that diff --git a/lib/audioeffects/stereowidener.py b/lib/audioeffects/stereowidener.py index 59f0fbd..ab2c876 100644 --- a/lib/audioeffects/stereowidener.py +++ b/lib/audioeffects/stereowidener.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`StereoWidener` - a stereo widener with Haas and Mid/Side characters. The player's text is the class docstring; the `CLAIMS` table in the class's diff --git a/lib/audioeffects/tapedelay.py b/lib/audioeffects/tapedelay.py index 8bc8f02..f570597 100644 --- a/lib/audioeffects/tapedelay.py +++ b/lib/audioeffects/tapedelay.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`TapeDelay` - a tape echo with two transports: the Roland RE-201's motor and the Maestro EP-3's sliding head. diff --git a/lib/audioeffects/transientshaper.py b/lib/audioeffects/transientshaper.py index d53ff65..15f00a3 100644 --- a/lib/audioeffects/transientshaper.py +++ b/lib/audioeffects/transientshaper.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`TransientShaper` - transient shaping in the SPL Transient Designer's shape. The player's text is the class docstring; the `CLAIMS` table in the class's diff --git a/lib/audioeffects/tremolo.py b/lib/audioeffects/tremolo.py index 7b23e47..ddc5607 100644 --- a/lib/audioeffects/tremolo.py +++ b/lib/audioeffects/tremolo.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Tremolo` — Fender bias-vary and optical characters on one Multiply. The player's text is the class docstring; the `CLAIMS` table in the class's diff --git a/lib/audioeffects/vibrato.py b/lib/audioeffects/vibrato.py index 46831a5..8a7a1c3 100644 --- a/lib/audioeffects/vibrato.py +++ b/lib/audioeffects/vibrato.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Vibrato` - a clock-modulated bucket-brigade line, wet alone. The player's text is the class docstring; the `CLAIMS` table in the class's diff --git a/manifest.py b/manifest.py index e0d92f6..9c44f8e 100644 --- a/manifest.py +++ b/manifest.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """Freeze audioeffects into a MicroPython firmware. A firmware build that names audioeffects takes this file. diff --git a/tests/airspace_plants.py b/tests/airspace_plants.py index b9cf629..dab1342 100644 --- a/tests/airspace_plants.py +++ b/tests/airspace_plants.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`AirSpace`'s planted faults, one or two per trait of its card. Kept apart from the test module, and free of numpy and unittest, so the diff --git a/tests/conftest.py b/tests/conftest.py index af6afc7..901578a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """pytest's view of the suite, for CI's parallel run (pytest-xdist). The tests are plain unittest and `python -m unittest discover -s tests` diff --git a/tests/parity/effects_library_smoke.py b/tests/parity/effects_library_smoke.py index cc241bf..330b4f1 100644 --- a/tests/parity/effects_library_smoke.py +++ b/tests/parity/effects_library_smoke.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """Every audioeffects class builds through the factory and renders, on whichever interpreter runs this. diff --git a/tests/support/controls_table.py b/tests/support/controls_table.py index a3a066c..33d76ca 100644 --- a/tests/support/controls_table.py +++ b/tests/support/controls_table.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """Every effect's knobs, their spans and its patches, built from the classes. `docs/reference/effect-controls.md` publishes these tables so someone can diff --git a/tests/support/effects_measure.py b/tests/support/effects_measure.py index b44a05a..79c3464 100644 --- a/tests/support/effects_measure.py +++ b/tests/support/effects_measure.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """What the audioeffects test modules build and measure with. The effects suite is split by what retires each part. The contract-level diff --git a/tests/support/kit.py b/tests/support/kit.py index e7ef4d4..3809253 100644 --- a/tests/support/kit.py +++ b/tests/support/kit.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The effects kit: nine mechanical checks on one class, no model in the loop. python tests/support/kit.py DigitalDelay [--only tail,plants,...] diff --git a/tests/support/kit_args.py b/tests/support/kit_args.py index 846698c..1169250 100644 --- a/tests/support/kit_args.py +++ b/tests/support/kit_args.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """Readback and arguments: what the control surface does with the values a host can hand it. diff --git a/tests/support/kit_ceiling.py b/tests/support/kit_ceiling.py index 8c48bad..9e8f8b4 100644 --- a/tests/support/kit_ceiling.py +++ b/tests/support/kit_ceiling.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The input ceiling: rendered at the level the class says it is clean at, on the worst material, the output never wraps, never sits on a rail the input was not on, and never goes silent while the input plays. diff --git a/tests/support/kit_claims.py b/tests/support/kit_claims.py index bfa6cdb..6bb87f8 100644 --- a/tests/support/kit_claims.py +++ b/tests/support/kit_claims.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The claims check: every sentence in a class's docstring that makes a claim is tied to a test, and that test exists and passes. diff --git a/tests/support/kit_common.py b/tests/support/kit_common.py index 257f751..619ed28 100644 --- a/tests/support/kit_common.py +++ b/tests/support/kit_common.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """What the effects kit's checks share: material, rendering, the printed cell and the table of declared exceptions. diff --git a/tests/support/kit_faults.py b/tests/support/kit_faults.py index 6067967..1aa6cfa 100644 --- a/tests/support/kit_faults.py +++ b/tests/support/kit_faults.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The planted faults for the measurement kit's first ten measurements. The discipline these are held to: a fault that does not turn its own diff --git a/tests/support/kit_fresh.py b/tests/support/kit_fresh.py index 2cc2f5b..7bbb42d 100644 --- a/tests/support/kit_fresh.py +++ b/tests/support/kit_fresh.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """Reset equals fresh: after `reset()`, from every patch, a class renders byte for byte what a fresh instance at patch 0 renders. diff --git a/tests/support/kit_levels.py b/tests/support/kit_levels.py index ad9ab20..738ae62 100644 --- a/tests/support/kit_levels.py +++ b/tests/support/kit_levels.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The level pass: real material at three levels, so a trait measured on sines at one level is read again where the input level moves it. diff --git a/tests/support/kit_nogb.py b/tests/support/kit_nogb.py index 6b6dd0c..9c96d26 100644 --- a/tests/support/kit_nogb.py +++ b/tests/support/kit_nogb.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """A board build with no `audiocore.get_buffer`. CircuitPython's default board builds compile `audiocore.get_buffer` out diff --git a/tests/support/kit_options.py b/tests/support/kit_options.py index 38f8a87..cabd0b7 100644 --- a/tests/support/kit_options.py +++ b/tests/support/kit_options.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The constructor options the kit builds a class with. Most classes are run at their defaults ({}). A class whose defaults are diff --git a/tests/support/kit_paperwork.py b/tests/support/kit_paperwork.py index beb9094..dfc4b98 100644 --- a/tests/support/kit_paperwork.py +++ b/tests/support/kit_paperwork.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The paperwork check: the class has a CHANGELOG line, and every source citation in its module resolves against the audiodsp pin. diff --git a/tests/support/kit_planted.py b/tests/support/kit_planted.py index a2329ed..70842d0 100644 --- a/tests/support/kit_planted.py +++ b/tests/support/kit_planted.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The kit's planted faults: tiny components that each break one thing a kit check measures, beside the controls that break nothing. diff --git a/tests/support/kit_plants.py b/tests/support/kit_plants.py index 326c26a..e30524d 100644 --- a/tests/support/kit_plants.py +++ b/tests/support/kit_plants.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """Plant validity: each planted fault a class's tests use differs from the clean class at the defaults, and no knob position and no patch of the clean class renders what the plant renders. diff --git a/tests/support/kit_player.py b/tests/support/kit_player.py index bf13140..7e32635 100644 --- a/tests/support/kit_player.py +++ b/tests/support/kit_player.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The player's text against its `CLAIMS` table, and the two readings every class's table leans on: latency and the modules it needs. diff --git a/tests/support/kit_probes.py b/tests/support/kit_probes.py index 29fc270..7b9aea1 100644 --- a/tests/support/kit_probes.py +++ b/tests/support/kit_probes.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """Probe material and a render loop for the measurement kit's fault battery. Two things live here, both deliberately small: diff --git a/tests/support/kit_tail.py b/tests/support/kit_tail.py index 5b86c5e..77a8b15 100644 --- a/tests/support/kit_tail.py +++ b/tests/support/kit_tail.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The tail harness: the output reaches exact zero inside the tail the class reports, read after every control event, on a DC step and on low bursts. diff --git a/tests/support/lifecycle.py b/tests/support/lifecycle.py index 01122ff..7d21cd2 100644 --- a/tests/support/lifecycle.py +++ b/tests/support/lifecycle.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The shared lifecycle matrix for audioeffects classes. One fixed set of lifecycle EVENTS (reset, a host reset of the output, diff --git a/tests/support/lifecycle_known.py b/tests/support/lifecycle_known.py index 763645a..0e64620 100644 --- a/tests/support/lifecycle_known.py +++ b/tests/support/lifecycle_known.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """What is red in the lifecycle matrix today, class by class: the rows `tests/test_lifecycle_matrix.py` holds as KNOWN_RED. diff --git a/tests/support/node_matrix.py b/tests/support/node_matrix.py index 698d654..74b1a91 100644 --- a/tests/support/node_matrix.py +++ b/tests/support/node_matrix.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The lifecycle matrix on audiodsp nodes, before any class is built on them. `lifecycle.py` judges effect classes. This module wraps each node a phase diff --git a/tests/support/stale_blocks.py b/tests/support/stale_blocks.py index f000061..ecfa95d 100644 --- a/tests/support/stale_blocks.py +++ b/tests/support/stale_blocks.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The stale-block measurement, shared by the ten classes' tests (audiocomponents#113). diff --git a/tests/support/tail_ring.py b/tests/support/tail_ring.py index a51e91f..291125b 100644 --- a/tests/support/tail_ring.py +++ b/tests/support/tail_ring.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """How long a class rings after its input stops, against what it declares (audiocomponents#114). diff --git a/tests/test_audio_component_api.py b/tests/test_audio_component_api.py index cbd87dc..390736c 100644 --- a/tests/test_audio_component_api.py +++ b/tests/test_audio_component_api.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + import array import math import sys diff --git a/tests/test_bypass_return.py b/tests/test_bypass_return.py index 84e9d58..7d44827 100644 --- a/tests/test_bypass_return.py +++ b/tests/test_bypass_return.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """Mix back up from 0 plays nothing from before (Phase 7, step 7f, F3). At Mix 0 the host reads the source itself, so whatever the node at the head diff --git a/tests/test_catalogue.py b/tests/test_catalogue.py index d89a301..a651955 100644 --- a/tests/test_catalogue.py +++ b/tests/test_catalogue.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The effects catalogue: what `audioeffects` serves and how `create()` finds it. diff --git a/tests/test_component_foundation.py b/tests/test_component_foundation.py index 5a0716f..c1e7435 100644 --- a/tests/test_component_foundation.py +++ b/tests/test_component_foundation.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The Phase 2 construction module, held to what roadmap section 3 asks of it. Every check that can go wrong quietly is paired with a **planted fault**: a diff --git a/tests/test_cpython_effects_airspace.py b/tests/test_cpython_effects_airspace.py index 6f92d9a..c9cd3ac 100644 --- a/tests/test_cpython_effects_airspace.py +++ b/tests/test_cpython_effects_airspace.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`AirSpace`'s own trait and planted-fault tests. The card (frozen 2026-10-12) has five traits, T1-T5. Each is measured here diff --git a/tests/test_cpython_effects_analogdelay.py b/tests/test_cpython_effects_analogdelay.py index a3e6710..6fd17ac 100644 --- a/tests/test_cpython_effects_analogdelay.py +++ b/tests/test_cpython_effects_analogdelay.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`AnalogDelay`'s own invariant and planted-fault tests. The dossier was frozen at the Station A critique revision, with the diff --git a/tests/test_cpython_effects_autopan.py b/tests/test_cpython_effects_autopan.py index 0b35857..81b0f31 100644 --- a/tests/test_cpython_effects_autopan.py +++ b/tests/test_cpython_effects_autopan.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`AutoPan`'s invariant and planted-fault tests (effects Phase 3). Traits diff --git a/tests/test_cpython_effects_bandpass.py b/tests/test_cpython_effects_bandpass.py index 6dae9ea..10bc392 100644 --- a/tests/test_cpython_effects_bandpass.py +++ b/tests/test_cpython_effects_bandpass.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`BandPass`'s own invariant and planted-fault tests (effects Phase 2). The dossier's traits were frozen 2026-09-07, and this file's numbers are diff --git a/tests/test_cpython_effects_bitcrusher.py b/tests/test_cpython_effects_bitcrusher.py index 78d95a0..d90a38e 100644 --- a/tests/test_cpython_effects_bitcrusher.py +++ b/tests/test_cpython_effects_bitcrusher.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Bitcrusher`'s own invariant and planted-fault tests. Exhaustive rate coverage lives in the evidence pack, not here. diff --git a/tests/test_cpython_effects_cabinetsim.py b/tests/test_cpython_effects_cabinetsim.py index 0b8e1d4..6fba89b 100644 --- a/tests/test_cpython_effects_cabinetsim.py +++ b/tests/test_cpython_effects_cabinetsim.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`CabinetSim`'s own invariant and planted-fault tests. The dossier was frozen diff --git a/tests/test_cpython_effects_chorus.py b/tests/test_cpython_effects_chorus.py index 5baf12c..9fce556 100644 --- a/tests/test_cpython_effects_chorus.py +++ b/tests/test_cpython_effects_chorus.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Chorus`'s own invariant and planted-fault tests. The dossier's Tier 2 diff --git a/tests/test_cpython_effects_combfilter.py b/tests/test_cpython_effects_combfilter.py index 1eaef1e..effe4d7 100644 --- a/tests/test_cpython_effects_combfilter.py +++ b/tests/test_cpython_effects_combfilter.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`CombFilter`'s own invariant and planted-fault tests. The Tier 2 traits are measured in the evidence pack with the kit; what is diff --git a/tests/test_cpython_effects_compressor.py b/tests/test_cpython_effects_compressor.py index bd1541d..cbde297 100644 --- a/tests/test_cpython_effects_compressor.py +++ b/tests/test_cpython_effects_compressor.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Compressor`'s own planted-fault checks, in the suite. The class gate asks each rebuilt class for its invariant and planted-fault diff --git a/tests/test_cpython_effects_convolutionreverb.py b/tests/test_cpython_effects_convolutionreverb.py index 746e4ea..10b73d9 100644 --- a/tests/test_cpython_effects_convolutionreverb.py +++ b/tests/test_cpython_effects_convolutionreverb.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`ConvolutionReverb`'s own invariant and planted-fault tests. The dossier's Tier 2 rows are D1-D6. Each row here is the diff --git a/tests/test_cpython_effects_deesser.py b/tests/test_cpython_effects_deesser.py index 636e773..e9236ca 100644 --- a/tests/test_cpython_effects_deesser.py +++ b/tests/test_cpython_effects_deesser.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`DeEsser`'s own invariant, trait and planted-fault battery. The class gate asks for two diff --git a/tests/test_cpython_effects_digitaldelay.py b/tests/test_cpython_effects_digitaldelay.py index bb3329c..379f3c5 100644 --- a/tests/test_cpython_effects_digitaldelay.py +++ b/tests/test_cpython_effects_digitaldelay.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`DigitalDelay`'s own invariant and planted-fault tests. The dossier's Tier 2 rows are T1-T5. Each row here is the diff --git a/tests/test_cpython_effects_distortion.py b/tests/test_cpython_effects_distortion.py index 776e682..2e695eb 100644 --- a/tests/test_cpython_effects_distortion.py +++ b/tests/test_cpython_effects_distortion.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Distortion`'s own invariant and planted-fault tests. Exhaustive rate coverage lives in the evidence pack. This file stays at diff --git a/tests/test_cpython_effects_dynamiceq.py b/tests/test_cpython_effects_dynamiceq.py index b3b83c9..a2560d7 100644 --- a/tests/test_cpython_effects_dynamiceq.py +++ b/tests/test_cpython_effects_dynamiceq.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`DynamicEQ`'s own invariant, trait and planted-fault battery. The class gate asks for two diff --git a/tests/test_cpython_effects_dynamics_eq.py b/tests/test_cpython_effects_dynamics_eq.py index 1db327d..67e2375 100644 --- a/tests/test_cpython_effects_dynamics_eq.py +++ b/tests/test_cpython_effects_dynamics_eq.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """What the dynamics and EQ classes do to a signal today. Where a bell lands, what a corner costs, whether lookahead catches the diff --git a/tests/test_cpython_effects_exciter.py b/tests/test_cpython_effects_exciter.py index 4f199a2..db2536b 100644 --- a/tests/test_cpython_effects_exciter.py +++ b/tests/test_cpython_effects_exciter.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Exciter`'s own invariant and planted-fault tests. The dossier was frozen diff --git a/tests/test_cpython_effects_expander.py b/tests/test_cpython_effects_expander.py index 46e468d..f56ddd8 100644 --- a/tests/test_cpython_effects_expander.py +++ b/tests/test_cpython_effects_expander.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Expander`'s own planted-fault tests, and the two checks that say a fault and a reading are worth citing at all. diff --git a/tests/test_cpython_effects_flanger.py b/tests/test_cpython_effects_flanger.py index 33badf6..e08111e 100644 --- a/tests/test_cpython_effects_flanger.py +++ b/tests/test_cpython_effects_flanger.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Flanger`'s trait and planted-fault tests. Six traits, T1 to T6 (the card's), each with its measurement run over the diff --git a/tests/test_cpython_effects_fuzz.py b/tests/test_cpython_effects_fuzz.py index 37535f9..54d3267 100644 --- a/tests/test_cpython_effects_fuzz.py +++ b/tests/test_cpython_effects_fuzz.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Fuzz`'s own invariant and planted-fault tests. The dossier was frozen diff --git a/tests/test_cpython_effects_graphiceq.py b/tests/test_cpython_effects_graphiceq.py index 1020690..ba58a45 100644 --- a/tests/test_cpython_effects_graphiceq.py +++ b/tests/test_cpython_effects_graphiceq.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`GraphicEQ`, rebuilt: its Tier 1 invariants and its own planted faults. This file is the part of the evidence pack that diff --git a/tests/test_cpython_effects_harmonizer.py b/tests/test_cpython_effects_harmonizer.py index 3697d6c..f454d08 100644 --- a/tests/test_cpython_effects_harmonizer.py +++ b/tests/test_cpython_effects_harmonizer.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Harmonizer`'s trait and planted-fault tests. Six traits, T1 to T6, each with its measurement run over the span listed diff --git a/tests/test_cpython_effects_highpass.py b/tests/test_cpython_effects_highpass.py index 0dc7201..7a944f9 100644 --- a/tests/test_cpython_effects_highpass.py +++ b/tests/test_cpython_effects_highpass.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`HighPass`'s own invariant and planted-fault tests. The class's Tier 2 traits are measured in the evidence pack with the kit; diff --git a/tests/test_cpython_effects_ladderfilter.py b/tests/test_cpython_effects_ladderfilter.py index 7fdd2fe..b873be5 100644 --- a/tests/test_cpython_effects_ladderfilter.py +++ b/tests/test_cpython_effects_ladderfilter.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`LadderFilter`'s input ceiling and the class docstring's claims, each tied to its test by the `CLAIMS` table. diff --git a/tests/test_cpython_effects_library.py b/tests/test_cpython_effects_library.py index ca7e7ab..7b7cc92 100644 --- a/tests/test_cpython_effects_library.py +++ b/tests/test_cpython_effects_library.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The contract every class in `audioeffects.ALL` is held to. Exports and metadata, the factory and the rate it owns, building and diff --git a/tests/test_cpython_effects_limiter.py b/tests/test_cpython_effects_limiter.py index b5aeed3..fe2c6fa 100644 --- a/tests/test_cpython_effects_limiter.py +++ b/tests/test_cpython_effects_limiter.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Limiter`'s own invariant and planted-fault tests. The dossier's Tier 2 rows are L1..L7 and each diff --git a/tests/test_cpython_effects_lowpass.py b/tests/test_cpython_effects_lowpass.py index e2f64c3..8c4cfb6 100644 --- a/tests/test_cpython_effects_lowpass.py +++ b/tests/test_cpython_effects_lowpass.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`LowPass`'s own invariant and planted-fault tests. The class's Tier 2 traits are measured in the evidence pack with the kit; diff --git a/tests/test_cpython_effects_modulation.py b/tests/test_cpython_effects_modulation.py index 59f2a9a..a5d4196 100644 --- a/tests/test_cpython_effects_modulation.py +++ b/tests/test_cpython_effects_modulation.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """What the modulation classes do to a signal today. Ring modulation is the one modulation trait the old surface pinned: the diff --git a/tests/test_cpython_effects_multiband.py b/tests/test_cpython_effects_multiband.py index 529bb15..9cfd822 100644 --- a/tests/test_cpython_effects_multiband.py +++ b/tests/test_cpython_effects_multiband.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`MultibandCompressor`'s own invariant and planted-fault tests. The dossier's Tier 2 rows are diff --git a/tests/test_cpython_effects_multitapdelay.py b/tests/test_cpython_effects_multitapdelay.py index d53f584..c99a242 100644 --- a/tests/test_cpython_effects_multitapdelay.py +++ b/tests/test_cpython_effects_multitapdelay.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`MultiTapDelay`'s own invariant and planted-fault tests. The dossier, frozen at the Station A revision, has Tier 2 rows diff --git a/tests/test_cpython_effects_notch.py b/tests/test_cpython_effects_notch.py index 3590b05..7297a91 100644 --- a/tests/test_cpython_effects_notch.py +++ b/tests/test_cpython_effects_notch.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Notch`'s own invariant and planted-fault tests. The class's Tier 2 traits are measured in the evidence pack with the kit; diff --git a/tests/test_cpython_effects_octaver.py b/tests/test_cpython_effects_octaver.py index b6448d3..880e21b 100644 --- a/tests/test_cpython_effects_octaver.py +++ b/tests/test_cpython_effects_octaver.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Octaver`'s trait and planted-fault tests. Six traits, T1 to T6, each with its measurement run over the span listed diff --git a/tests/test_cpython_effects_overdrive.py b/tests/test_cpython_effects_overdrive.py index f45aabc..9be1879 100644 --- a/tests/test_cpython_effects_overdrive.py +++ b/tests/test_cpython_effects_overdrive.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Overdrive`'s own invariant and planted-fault tests. The dossier was frozen diff --git a/tests/test_cpython_effects_parametriceq.py b/tests/test_cpython_effects_parametriceq.py index 1758bbb..35e3439 100644 --- a/tests/test_cpython_effects_parametriceq.py +++ b/tests/test_cpython_effects_parametriceq.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`ParametricEQ`'s own invariant and planted-fault tests. The class's Tier 2 traits are measured in the evidence pack with the kit; diff --git a/tests/test_cpython_effects_phaser.py b/tests/test_cpython_effects_phaser.py index 45042ae..733333b 100644 --- a/tests/test_cpython_effects_phaser.py +++ b/tests/test_cpython_effects_phaser.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Phaser`'s own invariant and planted-fault tests. The dossier's diff --git a/tests/test_cpython_effects_pingpongdelay.py b/tests/test_cpython_effects_pingpongdelay.py index ef26a11..d2e651a 100644 --- a/tests/test_cpython_effects_pingpongdelay.py +++ b/tests/test_cpython_effects_pingpongdelay.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`PingPongDelay`'s own invariant and planted-fault tests. The dossier, frozen at the Station A critique's re-freeze, has Tier 2 diff --git a/tests/test_cpython_effects_pitchshifter.py b/tests/test_cpython_effects_pitchshifter.py index 01f2414..28aa863 100644 --- a/tests/test_cpython_effects_pitchshifter.py +++ b/tests/test_cpython_effects_pitchshifter.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`PitchShifter`'s trait and planted-fault tests. Four traits: T1 the interval, T2 the splice's arrivals, T3 the repeats diff --git a/tests/test_cpython_effects_rack.py b/tests/test_cpython_effects_rack.py index 3718c49..3e619fd 100644 --- a/tests/test_cpython_effects_rack.py +++ b/tests/test_cpython_effects_rack.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The rebuilt `Rack`: a serial chain of effects as one effect. One test per trait of the class card (T1-T6), each shown red on the card's diff --git a/tests/test_cpython_effects_reverb.py b/tests/test_cpython_effects_reverb.py index a1731ca..fcf3223 100644 --- a/tests/test_cpython_effects_reverb.py +++ b/tests/test_cpython_effects_reverb.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Reverb`'s own invariant and planted-fault tests. The dossier's diff --git a/tests/test_cpython_effects_ringmod.py b/tests/test_cpython_effects_ringmod.py index 3689639..ba17b58 100644 --- a/tests/test_cpython_effects_ringmod.py +++ b/tests/test_cpython_effects_ringmod.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`RingMod`'s own invariant and planted-fault tests. Exhaustive rates live in the evidence pack, not in this file. diff --git a/tests/test_cpython_effects_saturation.py b/tests/test_cpython_effects_saturation.py index 47c39fe..6674200 100644 --- a/tests/test_cpython_effects_saturation.py +++ b/tests/test_cpython_effects_saturation.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Saturation`'s own invariant and planted-fault tests. The dossier was frozen diff --git a/tests/test_cpython_effects_shimmerhall.py b/tests/test_cpython_effects_shimmerhall.py index d33fe8f..d016b83 100644 --- a/tests/test_cpython_effects_shimmerhall.py +++ b/tests/test_cpython_effects_shimmerhall.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`ShimmerHall`'s trait and planted-fault tests. Six traits: T1 the Bloom stagger, T2 the interval, T3 the octaves climbing diff --git a/tests/test_cpython_effects_slapbackdelay.py b/tests/test_cpython_effects_slapbackdelay.py index 69f19a4..9b7128b 100644 --- a/tests/test_cpython_effects_slapbackdelay.py +++ b/tests/test_cpython_effects_slapbackdelay.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`SlapbackDelay`'s own invariant and planted-fault tests. The dossier, frozen at the Station A critique's re-freeze, has Tier 2 diff --git a/tests/test_cpython_effects_stereowidener.py b/tests/test_cpython_effects_stereowidener.py index eff3242..8cef080 100644 --- a/tests/test_cpython_effects_stereowidener.py +++ b/tests/test_cpython_effects_stereowidener.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`StereoWidener`'s trait and planted-fault tests. Six traits: H1-H3 for Haas, M1-M2 for Mid/Side, W for the wire. Each has diff --git a/tests/test_cpython_effects_tapedelay.py b/tests/test_cpython_effects_tapedelay.py index d997f46..ca62ed5 100644 --- a/tests/test_cpython_effects_tapedelay.py +++ b/tests/test_cpython_effects_tapedelay.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`TapeDelay`'s own invariant and planted-fault tests. The dossier's Tier 2 diff --git a/tests/test_cpython_effects_transientshaper.py b/tests/test_cpython_effects_transientshaper.py index 478e11c..41beea9 100644 --- a/tests/test_cpython_effects_transientshaper.py +++ b/tests/test_cpython_effects_transientshaper.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`TransientShaper`'s own invariant and planted-fault tests (Phase 2). The class gate asks for these beside the contract-level suite: a fault that diff --git a/tests/test_cpython_effects_tremolo.py b/tests/test_cpython_effects_tremolo.py index 1805c37..e769cef 100644 --- a/tests/test_cpython_effects_tremolo.py +++ b/tests/test_cpython_effects_tremolo.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Tremolo`'s own invariant and planted-fault tests. Exhaustive rates live in the evidence pack, not in this file. diff --git a/tests/test_cpython_effects_vibrato.py b/tests/test_cpython_effects_vibrato.py index 3f2e857..8f840c0 100644 --- a/tests/test_cpython_effects_vibrato.py +++ b/tests/test_cpython_effects_vibrato.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`Vibrato`'s own invariant and planted-fault tests. The dossier's Tier 2 diff --git a/tests/test_curve_tables.py b/tests/test_curve_tables.py index f9f3f29..40a695b 100644 --- a/tests/test_curve_tables.py +++ b/tests/test_curve_tables.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """Every int16 curve table in the library, held to three bars. A `Waveshaper` curve is a lookup table, and a lookup table can be wrong in diff --git a/tests/test_effect_kit.py b/tests/test_effect_kit.py index 0c603dc..110fb44 100644 --- a/tests/test_effect_kit.py +++ b/tests/test_effect_kit.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The measurement kit's planted-fault battery, measurements 1-10. Every planted fault lands as a test here, in `test_rig_comparator.py`'s shape - diff --git a/tests/test_effect_kit_11_20.py b/tests/test_effect_kit_11_20.py index 35a689d..74b56b8 100644 --- a/tests/test_effect_kit_11_20.py +++ b/tests/test_effect_kit_11_20.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The planted-fault battery for measurements 11-20 of the kit spec. A measurement whose planted-fault run diff --git a/tests/test_effect_kit_graph.py b/tests/test_effect_kit_graph.py index a7aec4b..b2d9175 100644 --- a/tests/test_effect_kit_graph.py +++ b/tests/test_effect_kit_graph.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The kit's two graph guards, each with its planted fault and its control. audiocomponents#78 read 70 dB of measurement floor off a wet-branch diff --git a/tests/test_effect_kit_sweep.py b/tests/test_effect_kit_sweep.py index 9958177..92cf3de 100644 --- a/tests/test_effect_kit_sweep.py +++ b/tests/test_effect_kit_sweep.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The sweep driver's battery: a measurement run over the span its trait quantifies over, not at a point inside it. diff --git a/tests/test_first_pull.py b/tests/test_first_pull.py index e28f08d..16cbdcd 100644 --- a/tests/test_first_pull.py +++ b/tests/test_first_pull.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """Settings changed between construction and the first pull land as a fresh instance at those settings would (Phase 7, step 7f). diff --git a/tests/test_kit.py b/tests/test_kit.py index 22057c8..4ea5864 100644 --- a/tests/test_kit.py +++ b/tests/test_kit.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The effects kit's own proof: every check goes red on a planted fault and its control is green on the same cell, and a class that does nothing at all is never read as a pass. diff --git a/tests/test_lifecycle_matrix.py b/tests/test_lifecycle_matrix.py index bd32d44..203a7bb 100644 --- a/tests/test_lifecycle_matrix.py +++ b/tests/test_lifecycle_matrix.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The lifecycle matrix (`tests/support/lifecycle.py`) on every effect class the package serves (`audioeffects.ALL`, all 45), on CPython and on the two native interpreters. diff --git a/tests/test_measure_effect_cost.py b/tests/test_measure_effect_cost.py index 61471fc..bac988d 100644 --- a/tests/test_measure_effect_cost.py +++ b/tests/test_measure_effect_cost.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The cost tool's Phase 5 additions (housekeeping, 2026-09-28). `tools/measure_effect_cost.py` is a board tool and its timings are not diff --git a/tests/test_metadata_contract.py b/tests/test_metadata_contract.py index f28ad52..8e56893 100644 --- a/tests/test_metadata_contract.py +++ b/tests/test_metadata_contract.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + import pathlib import unittest from types import SimpleNamespace diff --git a/tests/test_nan_options.py b/tests/test_nan_options.py index 5ae3965..fa2e100 100644 --- a/tests/test_nan_options.py +++ b/tests/test_nan_options.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """A NaN constructor option is the option left out, on every effect. The API reference promises it for macros (NaN is the bottom stop) and each diff --git a/tests/test_node_matrix.py b/tests/test_node_matrix.py index eadfb93..81df811 100644 --- a/tests/test_node_matrix.py +++ b/tests/test_node_matrix.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The lifecycle matrix on the audiodsp nodes the effects stand on (`tests/support/node_matrix.py`), on CPython and on the two native interpreters. diff --git a/tests/test_noisegate.py b/tests/test_noisegate.py index 9cabecd..c3e342c 100644 --- a/tests/test_noisegate.py +++ b/tests/test_noisegate.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """`NoiseGate`'s own invariants and its planted faults (Phase 2, Drawmer DS201). diff --git a/tests/test_panel_view.py b/tests/test_panel_view.py index 45581e3..bb72705 100644 --- a/tests/test_panel_view.py +++ b/tests/test_panel_view.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The effect panel's adapter, on CPython with no LVGL and no audiodsp. A fake effect stands in for a rebuilt class: the same declarations diff --git a/tests/test_portability_tier.py b/tests/test_portability_tier.py index 4b59096..3319a66 100644 --- a/tests/test_portability_tier.py +++ b/tests/test_portability_tier.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The portability tier, tested where it can be tested. Roadmap section 3 gives every class one of two tiers: diff --git a/tests/test_reset_is_fresh.py b/tests/test_reset_is_fresh.py index e0f43f9..f3e3b0c 100644 --- a/tests/test_reset_is_fresh.py +++ b/tests/test_reset_is_fresh.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """A reset comes back as a fresh instance at patch 0, for the classes the kit's fresh check found red when it was built (Phase 7, step 7d). diff --git a/tests/test_reset_keeps_source_frames.py b/tests/test_reset_keeps_source_frames.py index 3f42c1b..5e1e9ab 100644 --- a/tests/test_reset_keeps_source_frames.py +++ b/tests/test_reset_keeps_source_frames.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """A reset part-way through a source buffer keeps the frames the graph took. A host that hands an effect 100-frame buffers and resets it after twelve diff --git a/tests/test_tempo_follow.py b/tests/test_tempo_follow.py index c7ea12a..28d14a9 100644 --- a/tests/test_tempo_follow.py +++ b/tests/test_tempo_follow.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """A synced class follows a host tempo change without a control moving (audiocomponents#118). diff --git a/tools/compressor_evidence.py b/tools/compressor_evidence.py index 1c8fd52..376ee72 100644 --- a/tools/compressor_evidence.py +++ b/tools/compressor_evidence.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """Station C's measurements for `Compressor`, as one runnable file. Every table in the class's evidence pack is one case here, so a diff --git a/tools/curves/bitcrusher_curve.py b/tools/curves/bitcrusher_curve.py index d15d69e..67fb299 100644 --- a/tools/curves/bitcrusher_curve.py +++ b/tools/curves/bitcrusher_curve.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """SP-1200 12-bit linear DAC staircase for `audioeffects.bitcrusher`. S1: "The DAC is a standard 12 bit linear device" in complement-offset diff --git a/tools/curves/distortion_curve.py b/tools/curves/distortion_curve.py index 348e331..6af15ca 100755 --- a/tools/curves/distortion_curve.py +++ b/tools/curves/distortion_curve.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """Derive Distortion's waveshaper tables from the Rat and DS-1 clipper circuits. The tables are the static solution of a silicon pair to ground: diff --git a/tools/curves/exciter_curve.py b/tools/curves/exciter_curve.py index cf93ea8..80c2e22 100644 --- a/tools/curves/exciter_curve.py +++ b/tools/curves/exciter_curve.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """1N914 one-sided clipper curve for `audioeffects.exciter`. Derives one normalised Q15 table from the component values of the diff --git a/tools/curves/fuzz_curve.py b/tools/curves/fuzz_curve.py index b1ac880..2a63097 100644 --- a/tools/curves/fuzz_curve.py +++ b/tools/curves/fuzz_curve.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """Derive the Fuzz waveshaper tables from the dossier's named values. Run from the audiocomponents worktree: diff --git a/tools/curves/overdrive_curve.py b/tools/curves/overdrive_curve.py index abd8fb4..abb1f4f 100644 --- a/tools/curves/overdrive_curve.py +++ b/tools/curves/overdrive_curve.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """TS808 feedback-diode curve for `audioeffects.overdrive`. Derives one normalised Q15 table from the circuit values of the diff --git a/tools/curves/phaser_curve.py b/tools/curves/phaser_curve.py index 940797a..7941fd6 100644 --- a/tools/curves/phaser_curve.py +++ b/tools/curves/phaser_curve.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """Drive curve for `audioeffects.phaser`. `Phaser`'s Drive is a cubic soft clip, `y = x - x**3 / 3` over x in ±1 - the diff --git a/tools/curves/saturation_curve.py b/tools/curves/saturation_curve.py index fc0d603..f4f537c 100644 --- a/tools/curves/saturation_curve.py +++ b/tools/curves/saturation_curve.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """Derive Saturation waveshaper tables from the dossier's named values. Run from the audiocomponents worktree: diff --git a/tools/effect_measurements.py b/tools/effect_measurements.py index 51401b0..05ac1e1 100644 --- a/tools/effect_measurements.py +++ b/tools/effect_measurements.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """The measurement kit's first ten measurements, over rendered audio. The kit specifies twenty measurements. This module implements the first ten - diff --git a/tools/effect_probes/make_probes.py b/tools/effect_probes/make_probes.py index b221798..70620a0 100644 --- a/tools/effect_probes/make_probes.py +++ b/tools/effect_probes/make_probes.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """Generate the measurement kit's probe material, once, on CPython. tools/effect_probes/make_probes.py [--dry-run] [--verify] [--ensure] diff --git a/tools/measure_effect_cost.py b/tools/measure_effect_cost.py index 58daa6a..8855d83 100644 --- a/tools/measure_effect_cost.py +++ b/tools/measure_effect_cost.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """What does ONE effect, or ONE audiodsp node, cost this board per block? mpftp put -d tools/measure_effect_cost.py /measure_effect_cost.py diff --git a/tools/phase2_probes/parametriceq_traits.py b/tools/phase2_probes/parametriceq_traits.py index 2fc8c81..508714f 100644 --- a/tools/phase2_probes/parametriceq_traits.py +++ b/tools/phase2_probes/parametriceq_traits.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """ParametricEQ's Tier 2 traits, measured with the kit, each beside the planted fault of the same kind that has to turn it red. diff --git a/tools/provenance_gate.py b/tools/provenance_gate.py index 72ab44a..ea38362 100644 --- a/tools/provenance_gate.py +++ b/tools/provenance_gate.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """Refuse a `bin/` interpreter that does not contain the audiodsp this repository's gates are read at. diff --git a/tools/render_effect.py b/tools/render_effect.py index a24a46f..e6885ad 100644 --- a/tools/render_effect.py +++ b/tools/render_effect.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """Render one audioeffects class over one probe, on any of the three interpreters, and export the WAV plus the FNV digest the measurement kit compares. diff --git a/tools/scoped_tests.py b/tools/scoped_tests.py index 3d89587..5e5de4d 100755 --- a/tools/scoped_tests.py +++ b/tools/scoped_tests.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """Run the tests that this change can break, and no more. The full suite renders audio and grows with every rebuilt class. Most changes diff --git a/tools/spice/ds1/analyze.py b/tools/spice/ds1/analyze.py index c44f327..44dcd1d 100644 --- a/tools/spice/ds1/analyze.py +++ b/tools/spice/ds1/analyze.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """Print DS-1 clipper peaks/THD from out/.""" import csv import math diff --git a/tools/spice/fuzzface/analyze.py b/tools/spice/fuzzface/analyze.py index 15e5fce..628ef1f 100644 --- a/tools/spice/fuzzface/analyze.py +++ b/tools/spice/fuzzface/analyze.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """THD of the last 10 ms of each Fuzz Face transient.""" import glob import math diff --git a/tools/spice/rat/analyze.py b/tools/spice/rat/analyze.py index f459bbe..b236f89 100644 --- a/tools/spice/rat/analyze.py +++ b/tools/spice/rat/analyze.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """Print clipper peaks/THD and the gain-stage AC peak from out/.""" import csv import math diff --git a/tools/spice/ts808/analyze.py b/tools/spice/ts808/analyze.py index 8a9c03d..981c895 100755 --- a/tools/spice/ts808/analyze.py +++ b/tools/spice/ts808/analyze.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """analyze.py -- read the CSVs run.sh left in out/ and print the numbers. numpy only. Run with a python that has numpy, e.g. diff --git a/tools/validate_api.py b/tools/validate_api.py index cad3f77..2044fb5 100644 --- a/tools/validate_api.py +++ b/tools/validate_api.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """Validate the live audio-component API across the provider catalogue. This is intentionally a small runtime check rather than an inheritance check: diff --git a/tools/validate_metadata.py b/tools/validate_metadata.py index dad77da..a7d4d2c 100644 --- a/tools/validate_metadata.py +++ b/tools/validate_metadata.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """Validate audio component metadata declared by the audiodsp providers. This module deliberately uses only the Python standard library. It is a diff --git a/tools/wheel_gate.py b/tools/wheel_gate.py index 8581298..af9df3a 100644 --- a/tools/wheel_gate.py +++ b/tools/wheel_gate.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Brad Barnett +# +# SPDX-License-Identifier: MIT + """Build the package's wheel the way a release does, install it into a clean venv, and play it.