Obertöne als Körper
Ausgangspunkt war eine Frage nach Cymatics, also nach den Chladnischen Klangfiguren: Sand auf einer Metallplatte, ein Geigenbogen an der Kante, und das Material sammelt sich dort, wo die Platte stillsteht. Zweidimensional. Die naheliegende Fortsetzung ist dieselbe Idee auf einer Kugel, und dafür gibt es eine Formel, die Paul Bourke 1990 aufgeschrieben hat. Er nennt sie selbst nur entfernt verwandt mit den echten Kugelflächenfunktionen aus der Physik, und genau das macht sie brauchbar: acht ganzzahlige Parameter statt zweier fest gekoppelter Indizes, vier Terme aus Sinus und Kosinus über Längen- und Breitengrad, jeder mit eigenem Exponenten.
Acht Parameter, acht Teiltöne. Die Kopplung an den Klang war damit vorgezeichnet, aber die Zuordnung ist der eigentliche Entwurf. Eine FFT mit 8192 Punkten sucht die acht stärksten spektralen Gipfel und bestimmt deren Frequenz per parabolischer Interpolation über die Nachbarbins. Das ist nicht Genauigkeitsfetisch: Ein Bin ist knapp sechs Hertz breit, und bei einem Grundton von 110 Hertz liegt die vierte Oberschwingung sonst schnell eine Ordnung daneben. Der tiefste gefundene Teilton gilt als Grundton, alle weiteren werden als ganzzahliges Vielfaches davon ausgedrückt. Diese Ordnungszahl geht auf die acht Parameter. Der Pegel läuft getrennt als Fließkommawert in vier Termgewichte, die die Radiusauslenkung steuern. Die Klangfarbe formt also die Struktur, die Lautstärke die Auslenkung.
Warum die Ordnungszahlen ganzzahlig bleiben müssen, habe ich zuerst zu grob begründet. Es betrifft nur die beiden Frequenzen in Längsrichtung: Bei einem gebrochenen Wert trifft der Anfang der Fläche bei einer vollen Umdrehung nicht mehr auf ihr Ende, die Naht reißt auf. Die übrigen dürften reell sein. Für das Übergangsverhalten hilft das trotzdem nicht, denn ganze Stufen ruckeln. Die Lösung war, nicht die Zahlen zu interpolieren, sondern zwischen zwei fertigen Formen zu überblenden. Beide Endzustände sind geschlossen, also ist jeder Zwischenzustand geschlossen. Drei Modi stehen zur Wahl: Überblendung, stufenweises Durchlaufen und harter Schnitt. Das stufenweise Durchlaufen ist rhythmischer, weil jede Stufe ein hörbares Ereignis begleitet; die Überblendung ist flüssiger, verwischt aber genau diese Kopplung.
Als Quelle kommt neben dem Mikrofon der Pure-Data-Stream von A2R in Frage, und der brachte den lehrreichsten Teil. Er spricht nur HTTP und schickt keinen CORS-Header, kommt also weder durch die Mixed-Content-Sperre noch in die Analyse. Ein Reverse Proxy auf dem eigenen Server löst beides. Für Geräte, die kein Ogg Vorbis dekodieren, kodiert ein ffmpeg dahinter live nach MP3 um, ein Prozess je Zuhörer, der beim Verbindungsende beendet wird.
Und dann lief es in Chrome und in Safari nicht. Der Ton war hörbar, der Analyser bekam Stille. Safari leitet Live-Streams an createMediaElementSource vorbei, das Element spielt, aber der Audiograph sieht nichts. Der Ausweg war, den MP3-Strom selbst zu holen und stückweise zu dekodieren. Der erste Versuch scheiterte reihenweise mit EncodingError, und zwar auf lehrreiche Weise: Das erste Stück ging durch, alle weiteren nicht. Sie begannen mitten in einem Frame. Eine Suche nach dem MP3-Sync-Wort am Stückanfang genügte. Ein angeschnittenes Frame am Ende stört den Dekoder nicht, nur der Anfang muss stimmen. Die Seite erkennt den Fall selbst am ausbleibenden Pegel und schaltet um, ohne den Browser abzufragen. Falls Apple das repariert, nimmt sie von allein wieder den einfachen Weg.
Was am Ergebnis überrascht, ist eine Nichtwirkung: Die Gesamtlautstärke ändert die Form nicht. Jede Figur wird auf denselben maximalen Radius normalisiert, damit sie im Bild bleibt, also heben sich gleichmäßig lautere Teiltöne gegenseitig weg. Wirksam ist nur ihr Verhältnis zueinander. Das Modell reagiert damit auf Klangfarbe, nicht auf Pegel, und das ist genau die Eigenschaft, die eine Chladni-Platte auch hat.
↗ Live im Lab: labs.marckusse.at/derbrandt/harmonic-audio