Signatur
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
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);
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 = 100hat keine Wirkung (im Strict Mode gibt es einenTypeError). Richtig istosc.detune.value = 100. - Kombination mit
frequency: Beide Parameter wirken zusammen, das Ergebnis istfrequency · 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 vonvalueje nach Browser ignoriert oder überschrieben. VorhercancelScheduledValues()aufrufen. exponentialRampToValueAtTime()funktioniert nicht mit dem Zielwert0. Für Cent-Verläufe, die durch 0 gehen, deshalb lineare Rampen verwenden.- Autoplay-Richtlinie: Ein
AudioContextstartet in modernen Browsern oft im Zustandsuspendedund muss nach einer Nutzeraktion mitctx.resume()aktiviert werden. - Kompatibilität: Wird von allen aktuellen Browsern unterstützt. Der Konstruktor
new OscillatorNode()fehlt in sehr alten Safari-Versionen, dort als Ersatzctx.createOscillator()verwenden.