Signatur
Beschreibung
Ein ChannelMergerNode ist ein AudioNode der Web Audio API, der mehrere Eingänge besitzt (Standard: 6) und genau einen Ausgang. Jeder Eingang wird als Mono-Signal behandelt und landet in dem Kanal des Ausgangs, der seinem Eingangsindex entspricht: Eingang 0 → Kanal 0 (links), Eingang 1 → Kanal 1 (rechts) usw. Der Ausgang hat so viele Kanäle, wie Eingänge angelegt wurden.
Typische Anwendungsfälle sind das gezielte Bearbeiten einzelner Kanäle: Man zerlegt ein Stereo-Signal mit einem ChannelSplitterNode, bearbeitet linken und rechten Kanal getrennt (z. B. unterschiedliche Lautstärke, Verzögerung, Filter) und setzt sie mit dem ChannelMergerNode wieder zusammen. Ebenso lassen sich zwei unabhängige Mono-Quellen (etwa zwei Mikrofone oder Oszillatoren) auf den linken bzw. rechten Kanal legen.
Erzeugt wird der Knoten über den Konstruktor new ChannelMergerNode(context, options) oder die Fabrikmethode BaseAudioContext.createChannelMerger(numberOfInputs). Die Kanal-Eigenschaften sind fest: channelCount ist immer 1 und channelCountMode ist immer "explicit" – mehrkanalige Eingaben werden daher auf Mono heruntergemischt. Unbelegte Eingänge liefern Stille im entsprechenden Ausgangskanal.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $context Pflicht | BaseAudioContext | Der AudioContext oder OfflineAudioContext, zu dem der Knoten gehört (nur beim Konstruktor). |
|
| $options | object | {} | Optionales Konfigurationsobjekt (ChannelMergerOptions). |
| $options.numberOfInputs | number | 6 | Anzahl der Eingänge und damit Kanäle des Ausgangs; ganzzahlig zwischen 1 und 32. Entspricht dem Argument von createChannelMerger(). |
| $options.channelCount | number | 1 | Muss 1 sein, sonst wird ein InvalidStateError ausgelöst. |
| $options.channelCountMode | string | "explicit" | Muss "explicit" sein, andere Werte führen zu einem InvalidStateError. |
| $options.channelInterpretation | "speakers"|"discrete" | "speakers" | Legt fest, wie Eingänge beim Heruntermischen auf Mono interpretiert werden. |
Beispiele
Instanziierung per Konstruktor und Fabrikmethode
const ctx = new AudioContext();
// Variante 1: Konstruktor
const merger = new ChannelMergerNode(ctx, { numberOfInputs: 2 });
// Variante 2: Fabrikmethode
const merger6 = ctx.createChannelMerger(); // Standard: 6 Eingänge
console.log(merger.numberOfInputs, merger.numberOfOutputs);
console.log(merger6.numberOfInputs);
console.log(merger.channelCount, merger.channelCountMode);
Zwei Mono-Oszillatoren auf linken und rechten Kanal legen
const ctx = new AudioContext();
const merger = ctx.createChannelMerger(2);
const links = new OscillatorNode(ctx, { frequency: 440 });
const rechts = new OscillatorNode(ctx, { frequency: 660 });
// connect(ziel, ausgangsIndex, eingangsIndex)
links.connect(merger, 0, 0); // → linker Kanal
rechts.connect(merger, 0, 1); // → rechter Kanal
merger.connect(ctx.destination);
document.querySelector('#play').addEventListener('click', async () => {
await ctx.resume();
links.start();
rechts.start();
links.stop(ctx.currentTime + 2);
rechts.stop(ctx.currentTime + 2);
});
Stereo-Kanäle getrennt bearbeiten (Splitter + Merger)
const ctx = new AudioContext();
const audio = document.querySelector('audio');
const source = ctx.createMediaElementSource(audio);
const splitter = ctx.createChannelSplitter(2);
const merger = ctx.createChannelMerger(2);
// Linken Kanal leiser, rechten Kanal um 20 ms verzögern
const gainLinks = new GainNode(ctx, { gain: 0.3 });
const delayRechts = new DelayNode(ctx, { delayTime: 0.02 });
source.connect(splitter);
splitter.connect(gainLinks, 0); // Ausgang 0 = links
splitter.connect(delayRechts, 1); // Ausgang 1 = rechts
gainLinks.connect(merger, 0, 0);
delayRechts.connect(merger, 0, 1);
merger.connect(ctx.destination);
audio.addEventListener('play', () => ctx.resume());
Linken und rechten Kanal vertauschen
const ctx = new AudioContext();
const osc = new OscillatorNode(ctx);
const panner = new StereoPannerNode(ctx, { pan: -1 }); // ganz links
const splitter = ctx.createChannelSplitter(2);
const merger = ctx.createChannelMerger(2);
osc.connect(panner).connect(splitter);
splitter.connect(merger, 0, 1); // links → rechts
splitter.connect(merger, 1, 0); // rechts → links
merger.connect(ctx.destination);
// Ton ist nun rechts zu hören
osc.start();
osc.stop(ctx.currentTime + 1);
// Wichtig · Fallstricke
- Eingangsindex nicht vergessen:
source.connect(merger)verbindet immer mit Eingang 0 (linker Kanal). Für andere Kanäle muss das dritte Argument vonconnect(ziel, output, input)angegeben werden. - Heruntermischen auf Mono: Wegen
channelCount = 1undchannelCountMode = "explicit"wird ein Stereo-Signal an einem Eingang zu Mono gemischt. Für kanalgenaue Arbeit vorher einenChannelSplitterNodeeinsetzen. - Feste Eigenschaften: Das Setzen von
channelCountauf einen anderen Wert als 1 oder vonchannelCountModeauf etwas anderes als"explicit"löst einenInvalidStateErroraus.numberOfInputsaußerhalb von 1–32 führt zu einemIndexSizeError. - Ausgabegerät: Mehr als zwei Ausgangskanäle werden nur hörbar, wenn
ctx.destination.maxChannelCountdas hergibt; sonst wird heruntergemischt. - Autoplay: Browser starten einen
AudioContextoft im Zustand"suspended";ctx.resume()daher in einem Benutzer-Ereignis aufrufen. - Kompatibilität:
createChannelMerger()wird von allen modernen Browsern unterstützt; der Konstruktornew ChannelMergerNode()erst seit Chrome 55, Firefox 53 und Safari 14.1. Für sehr alte Safari-Versionen die Fabrikmethode verwenden.