Start · Sprachen · JavaScript · Referenz · OscillatorNode.detune

OscillatorNode.detune

Eigenschaft

Schreibgeschützter a-rate-<code>AudioParam</code>, der die Verstimmung des Oszillators in Cent angibt (100 Cent = ein Halbton).

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

Signatur

OscillatorNode.detune

Beschreibung

Die Eigenschaft detune eines OscillatorNode liefert einen AudioParam, mit dem sich die Tonhöhe des Oszillators in Cent relativ zur Grundfrequenz (frequency) verschieben lässt. 100 Cent sind ein Halbton, 1200 Cent eine Oktave. Die tatsächlich erzeugte Frequenz ergibt sich aus frequency * 2^(detune / 1200).

Weil es sich um einen a-rate-Parameter handelt, wird der Wert für jedes einzelne Sample neu berechnet. Deshalb eignet sich detune gut für Vibrato, Pitch-Bends, Glissandi und das leichte Gegeneinander-Verstimmen mehrerer Oszillatoren („Chorus“- bzw. „Supersaw“-Effekt). Den Wert setzt man entweder direkt über detune.value, zeitgesteuert über die Automatisierungsmethoden wie setValueAtTime() und linearRampToValueAtTime() oder moduliert ihn mit einem anderen Audioknoten, etwa einem LFO, der mit connect(osc.detune) verbunden wird.

Die Eigenschaft selbst kann nicht neu zugewiesen werden, nur ihr value und ihre Automatisierung lassen sich ändern. Der Standardwert ist 0. Einen Anfangswert kann man auch über das Optionsobjekt des Konstruktors angeben: new OscillatorNode(ctx, { detune: 50 }).

Rückgabewert

Typ
AudioParam
Beschreibung
Ein a-rate-AudioParam mit dem Standardwert 0 (Cent). Der nominale Wertebereich reicht etwa von -153600 bis 153600 und ist durch die maximal darstellbare Frequenz begrenzt.

Beispiele

Oszillator um einen Halbton nach oben verstimmen

const ctx = new AudioContext();
const osc = new OscillatorNode(ctx, { type: 'sawtooth', frequency: 440 });

// +100 Cent = ein Halbton höher (ca. 466,16 Hz)
osc.detune.value = 100;
osc.connect(ctx.destination);
osc.start();
osc.stop(ctx.currentTime + 1);

console.log(osc.detune.value, osc.detune.defaultValue);
100 0

Pitch-Bend mit Automatisierung

const ctx = new AudioContext();
const osc = ctx.createOscillator();
osc.connect(ctx.destination);

const t = ctx.currentTime;
osc.detune.setValueAtTime(0, t);
// innerhalb von 0,5 s eine Oktave (1200 Cent) nach oben ziehen
osc.detune.linearRampToValueAtTime(1200, t + 0.5);
// und wieder zurück
osc.detune.linearRampToValueAtTime(0, t + 1);

osc.start(t);
osc.stop(t + 1.2);

Vibrato per LFO auf detune

const ctx = new AudioContext();
const osc = new OscillatorNode(ctx, { frequency: 330 });

// LFO mit 6 Hz, Tiefe ±30 Cent
const lfo = new OscillatorNode(ctx, { frequency: 6 });
const depth = new GainNode(ctx, { gain: 30 });
lfo.connect(depth).connect(osc.detune);

osc.connect(ctx.destination);
lfo.start();
osc.start();
setTimeout(() => { osc.stop(); lfo.stop(); }, 2000);

Fetter Klang durch leicht verstimmte Oszillatoren

const ctx = new AudioContext();
const master = new GainNode(ctx, { gain: 0.2 });
master.connect(ctx.destination);

const oscs = [-12, -5, 0, 5, 12].map((cents) => {
  const o = new OscillatorNode(ctx, { type: 'sawtooth', frequency: 220, detune: cents });
  o.connect(master);
  o.start();
  return o;
});

setTimeout(() => oscs.forEach((o) => o.stop()), 1500);

// Wichtig · Fallstricke

  • Nur lesbar: osc.detune = 100 hat keine Wirkung (im Strict Mode gibt es einen TypeError). Richtig ist osc.detune.value = 100.
  • Kombination mit frequency: Beide Parameter wirken zusammen, das Ergebnis ist frequency · 2^(detune/1200). Liegt das Ergebnis über der Nyquist-Frequenz (halbe Abtastrate), gibt der Oszillator Stille aus.
  • Automatisierung vs. value: Wenn Automatisierungsereignisse geplant sind, wird ein direktes Setzen von value je nach Browser ignoriert oder überschrieben. Vorher cancelScheduledValues() aufrufen.
  • exponentialRampToValueAtTime() funktioniert nicht mit dem Zielwert 0. Für Cent-Verläufe, die durch 0 gehen, deshalb lineare Rampen verwenden.
  • Autoplay-Richtlinie: Ein AudioContext startet in modernen Browsern oft im Zustand suspended und muss nach einer Nutzeraktion mit ctx.resume() aktiviert werden.
  • Kompatibilität: Wird von allen aktuellen Browsern unterstützt. Der Konstruktor new OscillatorNode() fehlt in sehr alten Safari-Versionen, dort als Ersatz ctx.createOscillator() verwenden.