Hier ein Update, aus Zeitmangel bzgl. Programmierung habe ich in der letzten Zeit vor allem mit der Konzeption weitergemacht.
Insbesondere habe ich überlegt, wie das Thema Spektrum-Warp umgesetzt werden soll.
Das betrifft zum einen die Frage, welche Parameter benötigt werden und welche Bedienelemente für den Spektrum-Warp eingeführt werden sollen, um die Funktionalität gut steuerbar und gut automatisierbar zu machen.
Zum anderen war zu klären, wie und in welcher Reihenfolge diese Parameter das für die Synthese verwendete Spektrum "verformen" sollen.
Mit diesen Punkten bin ich gut vorwärts gekommen und habe somit einen Stand, mit dem die Implementierung jetzt grundsätzlich möglich wäre.
Bei der Beschäftigung mit dem Thema Spectral Warp ist mir allerdings klar geworden, dass die spektralen Transformationen oft auch sehr obertonreiche Klänge erzeugen werden (beispielsweise wird man mit ihnen Hard Sync-ähnliche Effekte erzielen können).
Um diesen Obertonreichtum zu bändigen, ist es jetzt doch sinnvoll geworden, die Stimmen mit einem subtraktiven Filter auszustatten (es wäre rechnerisch aufwendiger, diese Nachfilterung auch noch in die spektralen Transformationen oder den additiven Syntheseschritt einzubauen).
Deshalb habe ich mich zuletzt nicht mit der Umsetzung des Spektrum-Warp beschäftigt, sondern erst einmal das Thema "Filter" bearbeitet.
Dieses interessiert für mein Projekt aber eigentlich nur am Rande, so dass ich mir einfach mal angesehen habe, was JUCE an Filtern bereits so mitbringt.
Zum einen ist das ein durch das
Moog Ladder Filter inspiriertes Multi-Mode-Filter. Das JUCE Ladder-Filter unterstützt Tiefpass-, Bandpass- und Hochpass-Charakteristik mit Flankensteilheiten von 12 dB oder 24 dB pro Oktave. Es hat neben der Cutoff-Frequenz eine im Bereich 0..1 einstellbare Resonanz und zusätzlich einen Drive-Parameter (mit zulässigen Werten >= 1).
Das Ladder-Filter glättet die Cutoff- und Resonance-Werte automatisch mit einer Ramp-Zeit von 50 ms. Daher ist es problemlos modulierbar, allerdings recht behäbig und schon gar nicht für eine Audio-Rate Filter-FM geeignet.
Auch ist das Filter offenbar zu Selbstresonanz nicht in der Lage, wie man mit dem Maximalwert Resonance=1 leicht testen kann.
Als Alternative bietet JUCE auch ein State-Variable Filter an. Dieses unterstützt ebenfalls Tiefpass-, Bandpass- und Hochpass-Charakteristik, allerdings SVF-üblich nur mit 12 dB/Oktave.
Die Resonance muss hier ein beliebiger Wert > 0 sein, einen Drive-Parameter gibt es nicht. Und anders als beim Ladder-Filter werden die Werte nicht intern geglättet.
Mein Ziel ist es nun eigentlich, beide Filter-Arten auswählbar zu machen und sie User-seitig gleich aussehen zu lassen. D.h. das SVF soll auch noch mit einer Drive-Option ausgestattet werden und bzgl. Parameterglättung ähnlich reagieren wie das Ladder-Filter. Außerdem muss die Resonanz-Einstellung denselben Wertebereich erhalten, so dass beide Filter-Arten einheitlich benutzbar werden.
Begonnen habe ich aber erst einmal nur mit dem Einbau des Ladder-Filters, das bei jeder Stimme nun in der Default-Einstellung (Low Pass 12) vor dem Envelope Gate sitzt.
Ergänzt habe ich noch einen Key Follow-Parameter, so dass die Cutoff-Frequenz zu einem einstellbaren Grad der Tonhöhe der gespielten Note folgen kann.
Spektrum Warp fehlt ja noch, aber auch für sich genommen ist die Hinzunahme des Filters schon eine klangliche Erweiterung und ermöglicht jetzt neue Klangfarben.
Andererseits hat sich gezeigt, dass das JUCE Ladder Filter den Klang
immer sehr deutlich verfärbt, weil auch schon bei der geringstmöglichen Drive-Einstellung von 1 eine signifikante Verzerrung erfolgt.
Ein Blick in den Code offenbart die Verwendung zweier Nichtlinearitäten im Signalweg (für die die typische Wahl "tanh" genommen wurde), deren Effekt sich leider nicht eliminieren lässt.
Somit muss das Filter entweder abschaltbar sein (wenn die Verzerrungen stören), oder aber der Code muss geändert werden.
Ich denke darüber nach, die Drive-Umsetzung im Ladder-Filter für meine Zwecke so zu verändern, dass bei geringstem Drive dann tatsächlich alles 100% clean ist.
Außerdem würde ich bei der Gelegenheit wohl auch die Zeit-Konstanten für die Glättung noch einmal ansehen, weil mir 50 ms für eine Wertänderung etwas überdimensioniert erscheinen.
Es hat sich außerdem gezeigt, dass die Positionierung vor dem Envelope-Gate nicht immer ideal ist und dass das Filter manchmal besser noch weiter nach vorne in die eigentliche Synthese verschoben würde.
Von daher werde ich jetzt vermutlich noch eine Zeit lang mit den JUCE-Filtern und ihrer Positionierung im Signalweg experimentieren und ggf. auch Clones erstellen und diese nach den eigenen Bedürfnissen anpassen.