Rebuild the instrument filter as a TPT/SVF with a continuous HP-BP-LP morph and a configurable drive stage

This commit is contained in:
2026-07-30 09:14:13 -04:00
parent 7d42d7ed29
commit 902030bfba
12 changed files with 888 additions and 812 deletions
+11 -9
View File
@@ -995,15 +995,16 @@ target_link_libraries(curve_popup PUBLIC editor_geometry)
add_library(master_gain STATIC src/core/instrument/engine/master_gain.cpp)
target_include_directories(master_gain PUBLIC src)
# filter — the per-voice 2-pole resonant low/high-pass, ported from Daniel's Cortex-M4 filter
# with its virtual FilterBase/Filter/Biquad hierarchy flattened away (that hierarchy dispatched
# virtually per channel per sample, which the per-voice per-sample path forbids). Control
# mapping, RBJ coefficient math, feedback saturation, and the filter type each get their own
# file; VoiceFilter::process is header-inline so the biquad kernel still inlines at the call
# site. Standard library only. NEITHER SDK.
# filter — the per-voice TPT/SVF with a continuous HP->BP->LP morph and an in-loop drive stage.
# The Cortex-M4 source's virtual FilterBase/Filter/Biquad hierarchy dispatched per channel per
# sample, which the per-voice per-sample path forbids, so none of it came across. Control
# mapping, SVF coefficients, morph weights, and the filter type each get their own file;
# VoiceFilter::process is header-inline so the kernel still inlines at the call site. Standard
# library only. NEITHER SDK.
add_library(filter STATIC
src/core/instrument/engine/filter/filter_params.cpp
src/core/instrument/engine/filter/filter_coeffs.cpp
src/core/instrument/engine/filter/filter_morph.cpp
src/core/instrument/engine/filter/voice_filter.cpp)
target_include_directories(filter PUBLIC src)
@@ -1107,9 +1108,10 @@ add_executable(master_gain_tests tests/test_master_gain.cpp)
target_link_libraries(master_gain_tests PRIVATE master_gain)
add_test(NAME master_gain_tests COMMAND master_gain_tests)
# filter: the per-voice resonant filter. Pins the RBJ coefficients against an independent
# textbook cos/sin derivation, asserts the cutoff/Q control mappings at their anchors, and
# measures the resonant peak both analytically and by driving real sines. NEITHER SDK.
# filter: the per-voice resonant filter. Pins the SVF coefficients against an independent
# derivation, asserts the cutoff/Q control mappings at their anchors, holds the morph endpoints
# to the analytic 2-pole targets, and measures rate/level invariance and drive stability by
# driving real sines. NEITHER SDK.
add_executable(filter_tests tests/test_filter.cpp)
target_link_libraries(filter_tests PRIVATE filter)
add_test(NAME filter_tests COMMAND filter_tests)