/docs · MixLab · Deep
Mid/Side-Zerlegung in WebAudio
Summen- und Differenzsignale sind die richtige Art, über Stereo nachzudenken. Hier ist der WebAudio-API-Code dafür.
Die Stereokanäle, die du aus einer typischen Browser-Audiodatei erhältst, sind links und rechts. Die Stereokanäle, die deine Ohren tatsächlich auswerten, sind Mitte und Seiten. Die Mid/Side-Zerlegung übersetzt zwischen beiden. Sobald du sie hast, werden viele „Stereo”-Fragen trivial.
Die Mathematik
Für jedes Sample:
mid = (L + R) / 2
side = (L - R) / 2
Und zurück:
L = mid + side
R = mid - side
Das ist alles. Zwei Additionen und ein paar Divisionen pro Sample. Da steckt keine versteckte Raffinesse dahinter.
In WebAudio
WebAudio besitzt einen ChannelSplitterNode und einen ChannelMergerNode. Mit ein paar Gain-Stufen lässt sich M/S direkt im Graphen aufbauen:
const source = ctx.createMediaElementSource(audioEl);
const splitter = ctx.createChannelSplitter(2);
const merger = ctx.createChannelMerger(2);
// L → mid+side, R → mid−side
const lGain = ctx.createGain(); lGain.gain.value = 0.5;
const rGainPos = ctx.createGain(); rGainPos.gain.value = 0.5;
const rGainNeg = ctx.createGain(); rGainNeg.gain.value = -0.5;
source.connect(splitter);
// Mid = 0.5*L + 0.5*R → channel 0 of merger
splitter.connect(lGain, 0);
splitter.connect(rGainPos, 1);
lGain.connect(merger, 0, 0);
rGainPos.connect(merger, 0, 0);
// Side = 0.5*L + (-0.5)*R → channel 1 of merger
splitter.connect(lGain, 0);
splitter.connect(rGainNeg, 1);
lGain.connect(merger, 0, 1);
rGainNeg.connect(merger, 0, 1);
merger.connect(ctx.destination);
Für die Offline-Analyse eines dekodierten AudioBuffer ist es günstiger, die Berechnung direkt auf den Typed Arrays durchzuführen:
const left = buffer.getChannelData(0);
const right = buffer.getChannelData(1) ?? left;
const mid = new Float32Array(left.length);
const side = new Float32Array(left.length);
for (let i = 0; i < left.length; i++) {
mid[i] = (left[i] + right[i]) * 0.5;
side[i] = (left[i] - right[i]) * 0.5;
}
Genau das macht MixLab Analyzer unter der Haube.
Was du messen kannst, sobald du M/S hast
-
Echte Stereobreite. Das Verhältnis von Seiten-Energie zu Mitten-Energie ist ein direktes Maß dafür, wie viel „Stereo“ in der Mischung steckt. Ein RMS-basierter Vergleich ist robust und schnell:
const widthRatio = rms(side) / (rms(mid) + 1e-6); -
Mono-Kompatibilität. Ist
rms(side)groß, die Pearson-Korrelation zwischen L und R aber stark negativ, verliert die Mischung beim Summieren auf Mono Inhalt. Das ist eine Meldung wert. -
Phasenprobleme. Eine negative Korrelation bei hoher Seiten-Energie ist das klassische Symptom für einen irgendwo weiter oben in der Kette vertauschten Kanal.
-
Stereo-Dynamikbearbeitung. Mitte und Seiten unabhängig zu behandeln (die Mitte komprimieren, die Seiten in Ruhe lassen) ist die Grundlage des Mid/Side-Masterings. Die gesamte Effektkette lässt sich vollständig in WebAudio-Nodes prototypisieren.
Häufige Fehler
- Den Faktor 0,5 vergessen. Ohne ihn berechnest du L+R und L−R, nicht Mid und Side. Die Energieskalierung liegt dann um 6 dB daneben.
- Annehmen, Mono-Dateien hätten keine Seiten. Eine als Stereo eingelesene Mono-Datei (L = R) hat exakt null Seiten-Energie. Das ist ein nützliches Erkennungssignal.
- In dB rechnen, bevor rekombiniert wird. Lass das. Bleib bis ganz zum Schluss linear.
Wann M/S das falsche Werkzeug ist
Mid/Side ist ein Summen-und-Differenz-Rahmen für die Kanäle, die du hast. Es sagt nichts über die räumliche Wahrnehmung dieser Kanäle aus; dafür brauchst du eine binaurale / HRTF-bewusste Analyse. Wenn du etwas baust, das nachvollziehen muss, wo sich ein Klang in der Klangbühne befindet, ist M/S der falsche Ausgangspunkt.
Für die Mischanalyse und nahezu jede Mastering-Entscheidung ist M/S genau der richtige Rahmen. Es ist außerdem derjenige, der die meisten Heimproduzenten am meisten überrascht, wenn sie ihn zum ersten Mal sehen.
More in MixLab docs
- Intro
Was integrierte LUFS dir wirklich sagen
Integrierte LUFS sind der Lautheitswert, auf den es ankommt, und der Wert, den die meisten „Loudness”-Tools auf subtile Weise falsch ermitteln.
- Practical
Den Crest-Faktor lesen, ohne sich selbst zu täuschen
Der Crest-Faktor ist die am einfachsten zu berechnende Dynamikkennzahl, und die am einfachsten falsch zu lesende.