Start · Sprachen · JavaScript · Referenz · new ConstantSourceNode()

new ConstantSourceNode()

Methode

Erzeugt einen <code>ConstantSourceNode</code>, eine Audioquelle, die fortlaufend denselben Samplewert (<code>offset</code>) ausgibt.

seit JavaScript Baseline: alle modernen Browser (seit 2020, Safari Kategorie: webapi

Signatur

new ConstantSourceNode(context, options)

Beschreibung

Der Konstruktor ConstantSourceNode() erstellt einen Quellknoten der Web Audio API, dessen Ausgabe ein konstantes Signal ist. Jedes Sample hat den Wert des AudioParam offset (Standard 1). Damit entspricht der Knoten einer Gleichspannungsquelle, wie man sie aus modularen Synthesizern kennt.

Richtig nützlich wird er, wenn du seine Ausgabe mit einem oder mehreren AudioParams verbindest. So steuerst du mit einem einzigen Parameter (offset) gleichzeitig mehrere Werte, z. B. die Lautstärke mehrerer GainNodes oder die Frequenz mehrerer Filter, und kannst dafür die Automatisierungsmethoden wie linearRampToValueAtTime() verwenden.

Als Alternative zum Konstruktor gibt es die Fabrikmethode BaseAudioContext.createConstantSource(). Der Konstruktor hat den Vorteil, dass du offset direkt über das Optionsobjekt setzen kannst. Wie bei jedem AudioScheduledSourceNode musst du start() aufrufen, bevor der Knoten ein Signal ausgibt. Nach stop() lässt er sich nicht erneut starten.

Parameter

Name Typ Default Beschreibung
$context Pflicht BaseAudioContext Der AudioContext oder OfflineAudioContext, zu dem der Knoten gehören soll.
$options Object {} Optionales Konfigurationsobjekt. Eigenschaft offset (number, Standard 1): der konstante Ausgabewert als Startwert des offset-AudioParams.

Rückgabewert

Typ
ConstantSourceNode
Beschreibung
Ein neuer, noch nicht gestarteter ConstantSourceNode, der mit einem Kanal ausgibt.

Beispiele

Knoten erzeugen und offset auslesen

const ctx = new AudioContext();
const constant = new ConstantSourceNode(ctx, { offset: 0.5 });

console.log(constant.offset.value);
console.log(constant.numberOfOutputs);
0.5 1

Mehrere Lautstärken mit einem Regler steuern

const ctx = new AudioContext();

// Zwei Oszillatoren mit je eigenem GainNode
const osc1 = new OscillatorNode(ctx, { frequency: 220 });
const osc2 = new OscillatorNode(ctx, { frequency: 330 });
const gain1 = new GainNode(ctx, { gain: 0 }); // Basiswert 0
const gain2 = new GainNode(ctx, { gain: 0 });

osc1.connect(gain1).connect(ctx.destination);
osc2.connect(gain2).connect(ctx.destination);

// Konstante Quelle steuert beide gain-Parameter
const master = new ConstantSourceNode(ctx, { offset: 0.2 });
master.connect(gain1.gain);
master.connect(gain2.gain);

[osc1, osc2, master].forEach((node) => node.start());

// Ein Aufruf regelt beide Stimmen
document.querySelector('#volume').addEventListener('input', (e) => {
  master.offset.setTargetAtTime(Number(e.target.value), ctx.currentTime, 0.05);
});

Filterfrequenz sanft automatisieren (offline gerendert)

const ctx = new OfflineAudioContext(1, 44100 * 2, 44100);

const noise = ctx.createBuffer(1, ctx.length, ctx.sampleRate);
const data = noise.getChannelData(0);
for (let i = 0; i < data.length; i++) data[i] = Math.random() * 2 - 1;

const src = new AudioBufferSourceNode(ctx, { buffer: noise });
const filter = new BiquadFilterNode(ctx, { type: 'lowpass', frequency: 0 });
const sweep = new ConstantSourceNode(ctx, { offset: 200 });

sweep.connect(filter.frequency);
src.connect(filter).connect(ctx.destination);

sweep.offset.linearRampToValueAtTime(5000, 2);
src.start();
sweep.start();

const rendered = await ctx.startRendering();
console.log(rendered.duration);
2

// Wichtig · Fallstricke

  • Kein Ton ohne start(): Wie jede Quelle ist der Knoten nach dem Erzeugen stumm. Nach stop() kannst du ihn nicht erneut starten, sondern musst einen neuen Knoten erzeugen.
  • Signale werden addiert: Verbindest du den Knoten mit einem AudioParam, wird sein Signal zum Eigenwert des Parameters addiert. Setze diesen Eigenwert (z. B. gain) meist auf 0, sonst bekommst du unerwartete Summen.
  • Autoplay-Richtlinie: Ein AudioContext startet in Browsern oft im Zustand suspended. Rufe ctx.resume() nach einer Nutzeraktion auf.
  • Fehlerfälle: Ohne new wird ein TypeError geworfen, ebenso bei fehlendem oder ungültigem context.
  • Browser-Kompatibilität: Chrome/Edge 56+, Firefox 52+ und Safari 14.1+ unterstützen den Knoten. Ältere Safari-Versionen kennen ihn nicht. Prüfe das bei Bedarf mit 'ConstantSourceNode' in window.