Signatur
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
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'));
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);
// Wichtig · Fallstricke
- Nur ein Start: Rufst du
start()ein zweites Mal auf, wird einInvalidStateErrorausgelöst. Für jeden Ton erzeugst du einen neuen Knoten. - Autoplay-Regeln: Browser starten einen
AudioContextoft im Zustand\"suspended\". Rufectx.resume()innerhalb einer Nutzerinteraktion auf. - Knackgeräusche: Ein hartes
stop()oder ein Sprung in der Lautstärke erzeugt ein Klicken. Blende deshalb über einenGainNodemit 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 imoptions-Objekt nicht ohneperiodicWaveangeben, sonst wird einInvalidStateErrorausgelöst. Die Zuweisungosc.type = \"custom\"ist ebenfalls nicht erlaubt. Verwende stattdessensetPeriodicWave().exponentialRampToValueAtTime()akzeptiert keinen Zielwert0.- Kompatibilität: Der Konstruktor wird in allen aktuellen Browsern unterstützt. Sehr alte Safari-Versionen kennen nur
createOscillator()mit dem PräfixwebkitAudioContext.