Signatur
Beschreibung
Der Konstruktor new GainNode() erzeugt einen GainNode, also einen AudioNode mit genau einem Eingang und einem Ausgang. Er multipliziert jedes eingehende Sample mit dem Wert seines AudioParam gain. Damit steuert man die Lautstärke, baut Ein- und Ausblendungen (Fades), Mischpulte oder Hüllkurven für Synthesizer.
Im Gegensatz zur älteren Fabrikmethode AudioContext.createGain() lassen sich beim Konstruktor gleich ein Startwert für gain und Kanal-Optionen übergeben. Beide Varianten liefern dasselbe Ergebnis. Der Konstruktor gilt als die modernere Form.
Der Wert von gain ist ein linearer Faktor: 1 lässt das Signal unverändert, 0.5 halbiert die Amplitude (ungefähr −6 dB), 0 schaltet stumm. Werte über 1 verstärken das Signal und können es übersteuern (Clipping). Negative Werte kehren die Phase um.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $context Pflicht | BaseAudioContext | Der AudioContext oder OfflineAudioContext, zu dem der Knoten gehören soll. |
|
| $options | GainOptions | {} | Optionales Objekt mit folgenden Eigenschaften:
|
Rückgabewert
GainNode-Objekt. Seine Eigenschaft gain ist ein AudioParam vom Typ a-rate.Beispiele
Oszillator mit halber Lautstärke abspielen
const ctx = new AudioContext();
const osc = new OscillatorNode(ctx, { frequency: 440 });
const gain = new GainNode(ctx, { gain: 0.5 });
// Graph verbinden: Oszillator -> Gain -> Lautsprecher
osc.connect(gain).connect(ctx.destination);
osc.start();
osc.stop(ctx.currentTime + 1);
console.log(gain.gain.value);
Weiches Ausblenden (Fade-out) ohne Knacken
const ctx = new AudioContext();
const audio = document.querySelector('audio');
const source = new MediaElementAudioSourceNode(ctx, { mediaElement: audio });
const gain = new GainNode(ctx);
source.connect(gain).connect(ctx.destination);
const fadeOut = (seconds = 2) => {
const now = ctx.currentTime;
gain.gain.cancelScheduledValues(now);
gain.gain.setValueAtTime(gain.gain.value, now);
gain.gain.linearRampToValueAtTime(0, now + seconds);
};
document.querySelector('#fade').addEventListener('click', async () => {
await ctx.resume();
fadeOut(3);
});
Lautstärkeregler mit Dezibel-Umrechnung
const ctx = new AudioContext();
const master = new GainNode(ctx, { gain: 1 });
master.connect(ctx.destination);
// Dezibel in linearen Faktor umrechnen
const dbToGain = (db) => 10 ** (db / 20);
const slider = document.querySelector('#volume'); // <input type="range" min="-60" max="0">
slider.addEventListener('input', () => {
const value = dbToGain(Number(slider.value));
// setTargetAtTime glättet Sprünge
master.gain.setTargetAtTime(value, ctx.currentTime, 0.02);
});
console.log(dbToGain(-6).toFixed(3));
// Wichtig · Fallstricke
- Knacken vermeiden: Wenn man
gain.valuedirekt setzt, springt der Wert sofort, und man hört oft ein Klicken. Für hörbare Änderungen bessersetTargetAtTime(),linearRampToValueAtTime()oderexponentialRampToValueAtTime()verwenden. Achtung: Exponentielle Rampen dürfen nicht bei0beginnen oder enden. Stattdessen einen kleinen Wert wie0.0001nehmen. - Linear statt dB:
gainist ein Faktor und kein Dezibel-Wert. Das menschliche Gehör nimmt Lautstärke logarithmisch wahr. Deshalb sollten Regler in dB arbeiten und den Wert umrechnen. - Clipping: Werte über
1können am Ausgang übersteuern. Bei Bedarf einenDynamicsCompressorNodenachschalten. - Autoplay-Richtlinien: Ein
AudioContextstartet in vielen Browsern im Zustandsuspended.ctx.resume()muss dann nach einer Nutzeraktion aufgerufen werden. - Kompatibilität: Die Konstruktor-Form wird in allen aktuellen Browsern unterstützt. Sehr alte Versionen (z. B. Safari vor 14.1) kennen nur
createGain(). Wenn solche Versionen unterstützt werden müssen, sollte man auf die Fabrikmethode zurückgreifen. - Ist
contextkein gültigerBaseAudioContext, wirft der Konstruktor einenTypeError.