Start · Sprachen · JavaScript · Referenz · ChannelMergerNode

ChannelMergerNode

Schnittstelle

Führt mehrere Mono-Eingänge eines Web-Audio-Graphen zu einem einzigen mehrkanaligen Ausgang zusammen – das Gegenstück zu <code>ChannelSplitterNode</code>.

seit JavaScript Baseline: alle modernen Browser (Konstruktor seit Kategorie: webapi

Signatur

interface ChannelMergerNode extends AudioNode

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);
2 1 6 1 explicit

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 von connect(ziel, output, input) angegeben werden.
  • Heruntermischen auf Mono: Wegen channelCount = 1 und channelCountMode = "explicit" wird ein Stereo-Signal an einem Eingang zu Mono gemischt. Für kanalgenaue Arbeit vorher einen ChannelSplitterNode einsetzen.
  • Feste Eigenschaften: Das Setzen von channelCount auf einen anderen Wert als 1 oder von channelCountMode auf etwas anderes als "explicit" löst einen InvalidStateError aus. numberOfInputs außerhalb von 1–32 führt zu einem IndexSizeError.
  • Ausgabegerät: Mehr als zwei Ausgangskanäle werden nur hörbar, wenn ctx.destination.maxChannelCount das hergibt; sonst wird heruntergemischt.
  • Autoplay: Browser starten einen AudioContext oft im Zustand "suspended"; ctx.resume() daher in einem Benutzer-Ereignis aufrufen.
  • Kompatibilität: createChannelMerger() wird von allen modernen Browsern unterstützt; der Konstruktor new ChannelMergerNode() erst seit Chrome 55, Firefox 53 und Safari 14.1. Für sehr alte Safari-Versionen die Fabrikmethode verwenden.