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

new OscillatorNode()

Methode

Erzeugt einen <code>OscillatorNode</code>, der als Audioquelle eine periodische Wellenform (Sinus, Rechteck, Sägezahn, Dreieck oder eigene) erzeugt.

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

Signatur

new OscillatorNode(context, options)

Beschreibung

Der Konstruktor new OscillatorNode() erstellt einen Quellknoten der Web Audio API. Dieser erzeugt einen Ton mit fester oder automatisierbarer Frequenz. Er macht dasselbe wie die Fabrikmethode AudioContext.createOscillator(), aber du kannst alle Startwerte direkt über ein options-Objekt setzen.

Typische Einsatzgebiete sind Synthesizer, Signal- und Warntöne, Testsignale, LFOs (niederfrequente Oszillatoren) zur Modulation anderer AudioParams sowie Lehr- und Messanwendungen. Den Knoten verbindest du mit connect() mit weiteren Knoten, etwa einem GainNode oder context.destination.

Ein OscillatorNode ist ein Einweg-Knoten: Du kannst start() nur einmal aufrufen. Nach stop() lässt er sich nicht neu starten, für jeden neuen Ton brauchst du also eine neue Instanz. Das Erzeugen ist günstig und so auch vorgesehen.

Parameter

Name Typ Default Beschreibung
$context Pflicht BaseAudioContext Der AudioContext oder OfflineAudioContext, zu dem der Knoten gehört.
$options object {} Optionale Startwerte: type ("sine", "square", "sawtooth", "triangle", "custom"; Standard "sine"), frequency (Hz, Standard 440), detune (Cent, Standard 0), periodicWave (PeriodicWave, setzt den Typ auf "custom") sowie die AudioNode-Optionen channelCount, channelCountMode und channelInterpretation.

Rückgabewert

Typ
OscillatorNode
Beschreibung
Ein neuer, noch nicht gestarteter OscillatorNode.

Beispiele

Kurzen Signalton abspielen

const ctx = new AudioContext();

const beep = (freq = 880, dauer = 0.2) => {
  const osc = new OscillatorNode(ctx, { type: 'square', frequency: freq });
  const gain = new GainNode(ctx, { gain: 0.1 });
  osc.connect(gain).connect(ctx.destination);
  osc.start();
  osc.stop(ctx.currentTime + dauer);
};

// Erst nach einer Nutzerinteraktion abspielen (Autoplay-Regeln)
document.querySelector('#beep').addEventListener('click', async () => {
  await ctx.resume();
  beep();
});

Frequenz-Sweep mit Ausblenden

const ctx = new AudioContext();
const osc = new OscillatorNode(ctx, { type: 'sawtooth', frequency: 110 });
const gain = new GainNode(ctx, { gain: 0.2 });
osc.connect(gain).connect(ctx.destination);

const t = ctx.currentTime;
osc.frequency.exponentialRampToValueAtTime(1760, t + 2);
gain.gain.setValueAtTime(0.2, t + 1.5);
gain.gain.linearRampToValueAtTime(0, t + 2);

osc.start(t);
osc.stop(t + 2);
osc.addEventListener('ended', () => console.log('Sweep beendet'));
Sweep beendet

LFO als Vibrato und eigene Wellenform

const ctx = new AudioContext();
const wave = new PeriodicWave(ctx, {
  real: new Float32Array([0, 0, 0, 0]),
  imag: new Float32Array([0, 1, 0.5, 0.25])
});

const ton = new OscillatorNode(ctx, { periodicWave: wave, frequency: 330 });
const lfo = new OscillatorNode(ctx, { frequency: 5 });
const tiefe = new GainNode(ctx, { gain: 10 }); // ±10 Hz Vibrato

lfo.connect(tiefe).connect(ton.frequency);
ton.connect(ctx.destination);

lfo.start();
ton.start();
console.log(ton.type);
custom

// Wichtig · Fallstricke

  • Nur ein Start: Rufst du start() ein zweites Mal auf, wird ein InvalidStateError ausgelöst. Für jeden Ton erzeugst du einen neuen Knoten.
  • Autoplay-Regeln: Browser starten einen AudioContext oft im Zustand \"suspended\". Rufe ctx.resume() innerhalb einer Nutzerinteraktion auf.
  • Knackgeräusche: Ein hartes stop() oder ein Sprung in der Lautstärke erzeugt ein Klicken. Blende deshalb über einen GainNode mit Rampen ein und aus.
  • Lautstärke: Der Oszillator gibt die volle Amplitude (±1) aus. Rechteck- und Sägezahnwellen klingen dadurch sehr laut. Regle die Lautstärke immer über einen GainNode.
  • type: \"custom\" darfst du im options-Objekt nicht ohne periodicWave angeben, sonst wird ein InvalidStateError ausgelöst. Die Zuweisung osc.type = \"custom\" ist ebenfalls nicht erlaubt. Verwende stattdessen setPeriodicWave().
  • exponentialRampToValueAtTime() akzeptiert keinen Zielwert 0.
  • Kompatibilität: Der Konstruktor wird in allen aktuellen Browsern unterstützt. Sehr alte Safari-Versionen kennen nur createOscillator() mit dem Präfix webkitAudioContext.