
Seit dem 12. Oktober gibt es POLSCHWARM im Shop. Auf der Produktseite steht, was das Filter kann. Hier steht, wie es funktioniert: mit den Formeln aus dem Code, den Zahlen dahinter und dem Fehler, den ich kurz vor dem Release noch gefunden habe. Wer nur hören will, wie es klingt, nimmt die Demo. Wer wissen will, warum es so klingt, liest weiter.
Was mich an Filterfahrten immer gestört hat
Ein gewöhnliches Filter geht genau dorthin, wohin man es schickt. Springt CUTOFF von 300 Hz auf 2 kHz, rechnet es ab dem nächsten Block mit 2 kHz, oder eine Glättung zieht den Wert in einer geraden Linie hinüber. Beides klingt, als hätte jemand die Bewegung mit dem Lineal gezogen. Ich wollte ein Filter, bei dem der Weg zum Ziel selbst etwas erzählt: wer zuerst ankommt, wer hinterherhängt, wer übers Ziel hinausschießt.
Die Idee dahinter ist einfach. Jede Resonanz bekommt eine Masse und hängt an einer Feder. Der Rest dieses Beitrags erklärt, wie daraus ein Filter wird, das in Ruhe trotzdem auf das Bit genau das tut, was man eingestellt hat.
Sieben Körper statt sieben Koeffizientensätze

POLSCHWARM ist eine Kette aus sieben Sektionen. Jede Sektion ist ein TPT-Zustandsvariablenfilter, also topologiebewahrend und ohne Verzögerung in der Rückkopplungsschleife. Zu jeder Sektion gehört ein Körper. Ein Körper ist ein analoger Pol s = 2π(−a + jf), mit f als gedämpfter Frequenz und a als Abklingrate, dazu eine Form aus vier Anteilen (cL, cB, cH, cX). Die Form mischt Tiefpass, Bandpass, Hochpass und das trockene Signal der Sektion.
Der wichtigste Satz für alles Weitere: TYPE, CUTOFF und RESO stellen nicht das Filter ein, sondern nur das Ziel jedes Körpers. Es gibt acht Typen: LP2, LP4, LP6, HP2, HP4, BP4, Formant und Obertöne. Was ein Typ nicht braucht, wird geparkt. Eine geparkte Sektion hat die Form (0, 0, 0, 1) und reicht das Signal bitgenau durch, egal wo ihr Pol gerade steht.
Im Feld der Oberfläche liegt die Frequenz waagerecht, die Dämpfung senkrecht. Jeder Körper zieht dort eine Spur hinter sich her, man sieht also, was man hört.
Wie aus der Lage eines Körpers ein Filterkoeffizient wird
Aus der Lage (f, a) entstehen drei Größen für das Zustandsvariablenfilter:
- die Eigenfrequenz f0 = √(a² + f²)
- die Dämpfung k = 2a / f0, mindestens 0,01
- der Abstimmwert g = tan(π · min(f0; 0,45 · fs) / fs)
Das geschieht einmal pro Steuerblock von 16 Samples des Hosts, und innerhalb des Blocks laufen die Werte linear hinüber. Wichtig ist, was hier nicht passiert: Keine Modulation, kein Impuls und kein Regler fasst g oder k direkt an. Alles, was das Filter bewegt, schiebt die Körper. Die Koeffizienten folgen nur aus ihrer Lage.
Die Feder, exakt gelöst statt angenähert

Jeder Körper folgt einer gedämpften Schwingung um sein Ziel: y″ + 2ζω y′ + ω² y = 0, wobei y der Abstand zum Ziel ist. Für Pollage und Form gilt dieselbe Gleichung. Ein einfaches Integrationsverfahren würde bei großen Schritten die Dämpfung verfälschen. POLSCHWARM rechnet deshalb in jedem Schritt die geschlossene Lösung: unterdämpft mit cos und sin, überdämpft mit cosh und sinh, und nahe ζ = 1 über eine Reihenentwicklung, damit nirgends durch eine fast verschwindende Zahl geteilt wird. Pro Steuerblock sind es bis zu 16 Unterschritte, gewählt so, dass dt · ω_max höchstens 0,1 beträgt.
Die Regler greifen direkt in diese Gleichung. TEMPO (0,2 bis 40 Hz) ist die Federrate, FRICTION setzt ζ. SWARM verteilt die Masse: Körper i hat die Masse m = 2^(SWARM · u), mit u in sieben Stufen zwischen −1 und +1, und schwingt mit ω = 2π · TEMPO / √m. Bei SWARM 0 bewegen sich alle sieben Körper gleich. Bei SWARM 100 % ist der schwerste Körper viermal so schwer wie der leichteste und damit halb so schnell. Die leichten führen, die schweren ziehen nach, und genau dieser Versatz ist im Frequenzgang zu hören.
Abstoßung, die in Ruhe von selbst verschwindet
Zwei Körper stoßen einander ab, und zwar mit einer Kraft proportional zu 1/(d² + 0,05²) − 1/(d_t² + 0,05²). Dabei ist d ihr relativer Abstand und d_t der relative Abstand ihrer Ziele. Der zweite Term ist der Trick: Die Abstoßung wirkt nur, solange zwei Körper näher beieinander sind als ihre Ziele, und am Ziel ist sie null. Im Flug weichen sich die Körper aus, und dabei entstehen Spitzen und Lücken im Spektrum, die keine feste Einstellung hat. In Ruhe stört die Abstoßung nichts. Liegen zwei Körper exakt aufeinander, weichen sie in einer festen Richtung je Paar aus, ohne Zufall.
Warum die Ruhe exakt das eingestellte Filter ist
Eine Feder kommt mathematisch nie ganz an. POLSCHWARM lässt die Körper deshalb einrasten: Sind relativer Abstand und relative Geschwindigkeit beide kleiner als 10⁻⁷, springt der Körper genau auf sein Ziel, und seine Geschwindigkeit wird null. Weil die Abstoßung dort ebenfalls null ist, zieht ihn nichts wieder weg. Das Filter in Ruhe ist damit kein Näherungswert, sondern genau das Filter, das man eingestellt hat.
Damit nichts aus dem Ruder läuft, gibt es Wände für Frequenz und Abklingrate. Ein Körper, der über das Ziel hinausschießt und gegen eine Wand fliegt, prallt mit der Hälfte seiner Geschwindigkeit zurück.
Was den Schwarm sonst noch anschiebt

Alle weiteren Bewegungen folgen derselben Regel: Sie ändern nur Geschwindigkeiten, nie eine Lage und nie einen Koeffizienten.
IMPULSE gibt den Körpern bei jedem erkannten Transienten einen Stoß, MIDI IMPULSE tut dasselbe bei eingehenden Noten. WIND wirkt wie eine zweite Feder, die Frequenz oder Dämpfung relativ zur eigenen Lage schiebt. Das Gleichgewicht liegt dann bei Ziel / (1 − 0,5 · WIND): bei WIND +1 eine Oktave über dem Ziel, bei −1 bei zwei Dritteln. SHAKE ist eine Zufallskraft, die mit der Wurzel der Blocklänge wächst. So wirkt sie bei jeder Abtastrate gleich. Bei TEMPO 3 Hz, FRICTION 50 % und SHAKE 100 % wackeln die Körper um etwa drei Halbtöne. GATHER zieht den Schwarm zu seiner Mitte, SCATTER treibt ihn auseinander.
Dazu kommen acht Stationen mit je eigenem TYPE, CUTOFF und RESO. PATH wechselt zwischen ihnen im Takt des Hosts. Das Ziel springt dabei diskret, und den Übergang formt allein die Bewegung der Körper. DRIVE sättigt vor jeder der sieben Sektionen, ein Pegelausgleich hält die Lautstärke, und der Signalweg rechnet wahlweise mit 1x, 2x oder 4x Oversampling.
Der Fehler, den ich kurz vor dem Release gefunden habe
Bis zum 12. Oktober hat die Feder nicht den Bandanteil cB bewegt, sondern einen Faktor b, und cB ergab sich erst als b · k mit dem k der aktuellen Lage. Das klingt harmlos, war es aber nicht. Eine Sektion, die auf dem Weg zu einer schmalen Spitze noch breit war, trug unterwegs schon die volle Anhebung dieser Spitze. Sieben solche Sektionen zusammen hoben das Signal um 70 dB und mehr an.
Die Lösung: Die Feder bewegt jetzt cB selbst. Das Ziel trägt cB = b · k mit dem k der Ziellage, und cB bleibt zwischen −2k und 4k. Bei 4k hebt eine Sektion bei ihrer Eigenfrequenz um 14 dB an, bei −2k ist sie ein Allpass. Flüge in eine Spitze heben seitdem nicht mehr breitbandig an. Das Release ist mit diesem Stand erschienen, aber ich erzähle es trotzdem, weil es zeigt, wie leicht eine physikalisch schöne Idee an einer einzigen falsch gewählten Größe scheitert.
POLSCHWARM selbst ausprobieren
Die Demo läuft mit vollem Funktionsumfang. Einmal pro Minute mischt sich für drei Sekunden leises Rauschen dazu, und nach 30 Starts bleibt sie stumm, bis eine Seriennummer eingegeben ist. Die Vollversion kostet 49 €. POLSCHWARM gibt es als VST3, CLAP und Standalone für macOS 11 oder neuer (Intel und Apple Silicon), Windows 10 oder neuer und Linux ab Ubuntu 22.04, auf dem Mac zusätzlich als AU. Dabei sind 70 Werkspresets in elf Bänken.
Demo und Vollversion: kreuzberg-audio.com/downloads/polschwarm
Wenn du Fragen zur Mathematik hast oder etwas anders lösen würdest, schreib mir. Ich freue mich über jede Rückmeldung.
Cheers,
Frank

