Aller au contenu
Se connecter

/docs · MixLab · Deep

Décomposition Mid/Side dans WebAudio

Les signaux de somme et de différence sont la bonne façon de penser la stéréo. Voici le code de l'API WebAudio pour le faire.


Les canaux stéréo que vous recevez d’un fichier audio typique dans le navigateur sont gauche et droite. Les canaux stéréo que vos oreilles analysent réellement sont centre et côtés. La décomposition Mid/Side traduit de l’un vers l’autre, et une fois que vous l’avez, beaucoup de questions « stéréo » deviennent triviales.

Les mathématiques

Pour chaque échantillon :

mid  = (L + R) / 2
side = (L - R) / 2

Et pour revenir en arrière :

L = mid + side
R = mid - side

C’est tout. Deux additions et quelques divisions par échantillon. Il n’y a aucune subtilité cachée.

Dans WebAudio

WebAudio dispose d’un ChannelSplitterNode et d’un ChannelMergerNode. Avec quelques étages de gain, vous pouvez construire le M/S directement dans le graphe :

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);

Pour une analyse hors ligne sur un AudioBuffer décodé, le chemin le moins coûteux consiste à effectuer le calcul directement sur les typed arrays :

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;
}

C’est ce que fait MixLab Analyzer en coulisses.

Ce que vous pouvez mesurer une fois que vous avez le M/S

  • La véritable largeur stéréo. Le rapport entre l’énergie des côtés et celle du centre est une mesure directe de la quantité de « stéréo » présente dans le mixage. Une comparaison fondée sur le RMS est robuste et rapide :

    const widthRatio = rms(side) / (rms(mid) + 1e-6);
  • La compatibilité mono. Si rms(side) est élevé mais que la corrélation de Pearson entre L et R est fortement négative, le mixage perdra du contenu une fois sommé en mono. Cela mérite d’être signalé.

  • Les problèmes de phase. Une corrélation négative associée à une forte énergie de côtés est le symptôme classique d’un canal inversé quelque part en amont.

  • Le traitement dynamique stéréo. Traiter le mid et le side indépendamment (compresser le centre, laisser les côtés tranquilles) est la base du mastering mid/side. Vous pouvez prototyper l’intégralité de la chaîne d’effets entièrement avec des nœuds WebAudio.

Erreurs courantes

  1. Oublier le facteur 0,5. Sans lui, vous calculez L+R et L−R, et non le mid et le side. La mise à l’échelle de l’énergie sera décalée de 6 dB.
  2. Supposer que les fichiers mono n’ont pas de côtés. Un fichier mono ingéré en stéréo (L = R) aura exactement zéro énergie de côtés. C’est un signal de détection utile.
  3. Travailler en dB avant de recombiner. À éviter. Restez en linéaire jusqu’au tout dernier moment.

Quand le M/S est le mauvais outil

Le Mid/Side est un cadre de somme et de différence portant sur les canaux dont vous disposez. Il ne vous dit rien sur la perception spatiale de ces canaux ; pour cela, il vous faut une analyse binaurale / tenant compte de la HRTF. Si vous construisez quelque chose qui doit raisonner sur l’endroit où se situe un son dans l’image sonore, le M/S est le mauvais point de départ.

Pour l’analyse de mixage et la quasi-totalité des décisions de mastering, le M/S est en revanche le bon cadre. C’est aussi celui qui surprend le plus les producteurs amateurs lorsqu’ils le découvrent pour la première fois.