A parallel bank of resonant band-pass sections for fixed source-filter colour.
More...
|
| bool | prepare (double sample_rate, std::size_t capacity=MaxFormants) noexcept |
| bool | prepared () const noexcept |
| std::size_t | capacity () const noexcept |
| double | sample_rate () const noexcept |
| void | set_transition_samples (std::size_t samples) noexcept |
| std::size_t | transition_samples () const noexcept |
| bool | transition_active () const noexcept |
| FormantConfigureStatus | configure (std::span< const FormantSpec > formants, double headroom_db=3.0) noexcept |
| FormantConfigureStatus | configure (const Recipe &recipe) noexcept |
| FormantConfigureStatus | configure_vowel_morph (FormantVowel from, FormantVowel to, double amount, double headroom_db=3.0) noexcept |
| const Recipe & | requested_recipe () const noexcept |
| SampleType | process (SampleType input) noexcept |
| bool | process_block (const SampleType *input, SampleType *output, std::size_t frames) noexcept |
| bool | process_block (SampleType *samples, std::size_t frames) noexcept |
| void | reset () noexcept |
| double | tail_seconds () const noexcept |
| BiquadCoefficientsT< SampleType > | coefficients (std::size_t index) const noexcept |
| double | magnitude (double frequency_hz) const noexcept |
| | Exact complex-sum magnitude of the requested endpoint.
|
| double | magnitude_db (double frequency_hz) const noexcept |
| void | response_curve_db (double min_hz, double max_hz, std::span< SampleType > output) const noexcept |
template<typename SampleType = float, std::size_t MaxFormants = 5>
class pulp::signal::FormantFilterBankT< SampleType, MaxFormants >
A parallel bank of resonant band-pass sections for fixed source-filter colour.
This is an audio filter, not a formant tracker and not an STFT envelope shifter. Frequencies and bandwidths are supplied explicitly. A complete recipe is validated before any active or requested state changes. Retunes crossfade two complete stable banks; recursive coefficients are never interpolated.
Headroom policy: each band's linear weight is divided by the sum of all absolute weights and by the requested headroom gain. Since an RBJ band-pass section has at most unity steady-state magnitude, the summed response is bounded by that headroom gain. This intentionally normalizes level rather than adding a limiter or nonlinear recovery stage.
RT contract: all storage is fixed. prepare(), configure(), process(), reset(), and response inspection allocate no memory, take no locks, perform no I/O, and throw no exceptions. Configure at a block boundary. One instance owns one recursive signal path; use one instance per channel.