Brutzeln in Web Audio
Das Grillgeräusch unter dem Hero-Video war bisher eine Datei: acht Sekunden, in Pure Data gebaut, als nahtlose Schleife gerendert. Schleifen haben ein Problem, das man nicht sofort bemerkt. Das Zischen verrät sich nie, weil Rauschen keine Wiedererkennung hat — aber die einzelnen Knacker sitzen bei jedem Durchlauf an derselben Stelle. Ab dem dritten Mal hört das Ohr das Muster statt des Grills. Deshalb ist das Modell in Web Audio nachgebaut: Es entsteht live im Browser und wiederholt sich nie.
Zwei Schichten tragen den Klang. Der Knister ist eine Kette von Einzelereignissen: alle 20 ms ein Würfelwurf, in einem von sechs Fällen entsteht ein kurzer Ausschnitt Rauschen durch einen schmalen Bandpass, 1 ms Anstieg, 25 ms Ausklang, Mittenfrequenz und Lautstärke jedes Mal neu gewürfelt. Das Zischen ist Hochpassrauschen, dessen Pegel von einem trägen Zufallssignal moduliert wird — und diese Modulation ist der ganze Unterschied zwischen einem Grill und einem Dampfventil. Dazu kommen vereinzelte Stichflammen, wenn Fett in die Glut tropft. Geplant wird nicht mit setTimeout, sondern mit Vorlauf: Alle 25 ms schaut ein Planer nach, was in den nächsten 100 ms fällig ist, und legt die Ereignisse mit exakten Zeiten der Audiouhr fest. Browser-Timer sind für Hüllkurven von einer Millisekunde viel zu ungenau; man hört das Zittern sofort.
Der lehrreiche Teil war nicht das Bauen, sondern das Beurteilen. Die erste Fassung klang nach Rückmeldung „dünn“ und „atmet nicht“ — und die naheliegende Erklärung war falsch. Erst eine Messung brachte es heraus: Derselbe Klangmotor läuft unverändert auch headless unter Node im OfflineAudioContext, schreibt dort eine Datei, und die lässt sich gegen den Pd-Render stellen. Kennzahlen, Terzbänder, gezählte Knacker pro Sekunde. Das Ergebnis war eindeutig: Die Zischschicht war zehn Dezibel zu laut und hatte die Knacker vollständig zugedeckt — statt sieben pro Sekunde fand der Zähler noch 0,1. Was nach einem zu leisen Zischen klang, war in Wahrheit ein Zischen ohne alles andere.
Zwei weitere Abweichungen kamen aus derselben Messung. Unterhalb 1250 Hz fehlten bis zu 36 Dezibel, weil der Hochpass in Pure Data ein Einpolfilter ist und der von Web Audio ein Zweipoler — es waren also zwei doppelt so steile Filter in Reihe, wo eines gehört hätte. Und über zwei Minuten Dauerlauf gemessen war der Pegel zu heiß: Der Pd-Loop ist auf genau acht Sekunden normalisiert, endlos treffen irgendwann mehrere Knacker zusammen. Zwei geklippte Samples auf 5,7 Millionen hört niemand bewusst, aber es ist der Unterschied zwischen läuft und läuft sauber.
Auf der Seite lassen sich beide Fassungen unter demselben Bild gegeneinander schalten, dazu vierzehn Regler und eine Pegelanzeige. Gemessen liegen Synthese und Datei beieinander: Spitze −0,3 gegen −1,0 dBFS, Effektivpegel −23,7 gegen −23,2, Scheitelfaktor 23,5 gegen 22,2. Ob das auch fürs Ohr gilt, ist die Frage, die kein Messwerkzeug beantwortet.
↗ Live im Lab: labs.marckusse.at/derbrandt/brutzel-webaudio