Start · Sprachen · JavaScript · Referenz · BaseAudioContext.createGain()

BaseAudioContext.createGain()

Methode

Erzeugt einen <code>GainNode</code>, mit dem sich die Lautstärke (Verstärkung) eines Audiosignals im Audiografen steuern lässt.

seit JavaScript Baseline: alle modernen Browser (Web Audio API) Kategorie: webapi

Signatur

BaseAudioContext.prototype.createGain()

Beschreibung

Die Methode createGain() eines AudioContext oder OfflineAudioContext erzeugt einen neuen GainNode. Das Signal, das durch diesen Knoten läuft, wird mit dem Wert von gain multipliziert. Ein Wert von 1 lässt das Signal unverändert, 0 schaltet es stumm, 0.5 halbiert die Amplitude und Werte größer als 1 verstärken das Signal.

Man setzt einen GainNode typischerweise zwischen eine Quelle (z. B. AudioBufferSourceNode, OscillatorNode oder MediaElementAudioSourceNode) und das Ziel context.destination ein. Häufige Einsatzgebiete sind ein Master-Lautstärkeregler, Stummschalten, Überblendungen (Crossfades), Hüllkurven (ADSR) bei Synthesizern oder das Mischen mehrerer Spuren mit eigener Kanal-Lautstärke.

Die Eigenschaft gain ist ein AudioParam. Deshalb lässt sie sich nicht nur direkt über gain.value setzen, sondern auch zeitgenau über Methoden wie setValueAtTime(), linearRampToValueAtTime(), exponentialRampToValueAtTime() oder setTargetAtTime() automatisieren. So vermeidet man hörbare Knackser bei abrupten Lautstärkeänderungen.

Als moderne Alternative kann der Knoten auch direkt über den Konstruktor new GainNode(context, { gain: 0.5 }) erzeugt werden, was zusätzlich das Setzen von Startoptionen erlaubt.

Rückgabewert

Typ
GainNode
Beschreibung
Ein neuer GainNode mit einem Eingang und einem Ausgang; der Standardwert von gain.value ist 1.

Beispiele

Einfacher Lautstärkeregler für einen Oszillator

const ctx = new AudioContext();
const osc = ctx.createOscillator();
const gainNode = ctx.createGain();

gainNode.gain.value = 0.2; // 20 % Lautstärke

osc.connect(gainNode).connect(ctx.destination);
osc.start();
osc.stop(ctx.currentTime + 1); // nach 1 Sekunde stoppen

console.log(gainNode.gain.value);
0.2

Lautstärke-Slider für ein <audio>-Element

// HTML: <audio id="player" src="musik.mp3" controls></audio>
//       <input id="volume" type="range" min="0" max="1" step="0.01" value="1">
const ctx = new AudioContext();
const audioEl = document.querySelector('#player');
const slider = document.querySelector('#volume');

const source = ctx.createMediaElementSource(audioEl);
const master = ctx.createGain();
source.connect(master).connect(ctx.destination);

// Autoplay-Richtlinie: Kontext erst nach Nutzerinteraktion fortsetzen
audioEl.addEventListener('play', () => ctx.resume());

slider.addEventListener('input', () => {
  // sanfter Übergang ohne Knacken
  master.gain.setTargetAtTime(Number(slider.value), ctx.currentTime, 0.02);
});

Weiches Ein- und Ausblenden (Fade-In/Fade-Out)

const ctx = new AudioContext();

const playTone = (freq = 440, dauer = 2) => {
  const osc = new OscillatorNode(ctx, { frequency: freq });
  const env = ctx.createGain();
  const t = ctx.currentTime;

  env.gain.setValueAtTime(0.0001, t);
  env.gain.exponentialRampToValueAtTime(0.5, t + 0.1);    // Fade-In
  env.gain.setValueAtTime(0.5, t + dauer - 0.3);
  env.gain.exponentialRampToValueAtTime(0.0001, t + dauer); // Fade-Out

  osc.connect(env).connect(ctx.destination);
  osc.start(t);
  osc.stop(t + dauer);
};

document.querySelector('button').addEventListener('click', async () => {
  await ctx.resume();
  playTone(330, 2);
});

// Wichtig · Fallstricke

  • Knackser vermeiden: Direktes Setzen von gain.value während der Wiedergabe kann hörbare Klicks erzeugen. Besser setTargetAtTime() oder linearRampToValueAtTime() verwenden.
  • Exponentielle Rampen: exponentialRampToValueAtTime() akzeptiert weder 0 als Ziel noch als Startwert (wirft RangeError) – stattdessen einen sehr kleinen Wert wie 0.0001 nutzen.
  • Übersteuerung: Werte über 1 können zu Clipping (Verzerrung) am Ausgang führen, wenn die Summe der Signale den Bereich −1 bis 1 überschreitet.
  • Autoplay-Richtlinien: Browser starten einen AudioContext meist im Zustand suspended; erst nach einer Nutzergeste mit ctx.resume() ist etwas zu hören.
  • Kompatibilität: In allen modernen Browsern verfügbar. Sehr alte WebKit-Versionen kannten nur webkitAudioContext und die veraltete Methode createGainNode(). Der Konstruktor new GainNode() wird in älteren Safari-Versionen (vor 14.1) nicht unterstützt – createGain() ist daher die sicherere Variante.