Signatur
Beschreibung
Die Eigenschaft oversample eines WaveShaperNode ist ein Aufzählungswert vom Typ OverSampleType. Sie bestimmt, ob das Eingangssignal vor dem Anwenden der Verzerrungskurve (curve) auf eine höhere Abtastrate hochgerechnet wird. Mögliche Werte sind "none" (Standard), "2x" und "4x".
Nichtlineare Verzerrung erzeugt Obertöne, die oberhalb der Nyquist-Frequenz (halbe Abtastrate) liegen können. Ohne Oversampling werden diese Frequenzen in den hörbaren Bereich zurückgespiegelt – es entsteht Aliasing, das metallisch oder kratzig klingt. Mit "2x" bzw. "4x" wird das Signal intern hochgetastet, verzerrt, tiefpassgefiltert und wieder heruntergetastet. Das Ergebnis klingt sauberer, kostet aber mehr Rechenzeit.
Verwende "none" bei milder Sättigung oder wenn CPU-Leistung knapp ist, und "4x" bei harter Verzerrung (z. B. Gitarren-Distortion, Bitcrusher-ähnliche Kurven), wo Aliasing deutlich hörbar wäre. Die Eigenschaft kann jederzeit gelesen und gesetzt werden, auch während die Wiedergabe läuft.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $value | "none" | "2x" | "4x" | "none" | Beim Setzen: der gewünschte Oversampling-Modus. "none" = kein Oversampling, "2x" = doppelte, "4x" = vierfache interne Abtastrate. |
Rückgabewert
Beispiele
Oversampling beim Erstellen einer Verzerrung setzen
const ctx = new AudioContext();
const shaper = ctx.createWaveShaper();
// Klassische Sättigungskurve erzeugen
const makeCurve = (amount = 50, samples = 44100) => {
const curve = new Float32Array(samples);
const deg = Math.PI / 180;
for (let i = 0; i < samples; i++) {
const x = (i * 2) / samples - 1;
curve[i] = ((3 + amount) * x * 20 * deg) / (Math.PI + amount * Math.abs(x));
}
return curve;
};
shaper.curve = makeCurve(400);
shaper.oversample = '4x'; // harte Verzerrung → Aliasing vermeiden
console.log(shaper.oversample);
Über den Konstruktor mit Optionen
const ctx = new AudioContext();
const shaper = new WaveShaperNode(ctx, {
curve: new Float32Array([-1, 0, 1]),
oversample: '2x'
});
console.log(shaper.oversample);
Qualität per Auswahlfeld umschalten
// <select id="quality"><option>none</option><option>2x</option><option>4x</option></select>
const ctx = new AudioContext();
const osc = new OscillatorNode(ctx, { type: 'sawtooth', frequency: 220 });
const shaper = new WaveShaperNode(ctx, { curve: new Float32Array([-1, -0.9, 0, 0.9, 1]) });
osc.connect(shaper).connect(ctx.destination);
document.querySelector('#quality').addEventListener('change', (e) => {
shaper.oversample = e.target.value; // live während der Wiedergabe änderbar
console.log(`Oversampling: ${shaper.oversample}`);
});
document.addEventListener('click', () => { ctx.resume(); osc.start(); }, { once: true });
Ungültige Werte werden ignoriert
const ctx = new AudioContext();
const shaper = ctx.createWaveShaper();
shaper.oversample = '8x'; // kein gültiger OverSampleType
console.log(shaper.oversample);
// Wichtig · Fallstricke
- Ungültige Werte: Das Zuweisen eines Strings außerhalb von
"none","2x","4x"wirft keinen Fehler, sondern wird stillschweigend ignoriert (Verhalten von WebIDL-Enums). Im Konstruktor (new WaveShaperNode(ctx, { oversample: '8x' })) wird dagegen einTypeErrorausgelöst. - Performance:
"4x"erhöht die CPU-Last merklich, besonders bei vielen parallelen Knoten oder auf Mobilgeräten. Nur einsetzen, wo Aliasing tatsächlich hörbar ist. - Latenz: Die für Oversampling nötigen Filter können je nach Implementierung eine geringe zusätzliche Verzögerung verursachen.
- Ohne gesetzte
curvehatoversamplekeine Wirkung – das Signal wird unverändert durchgereicht. - Kompatibilität: In allen aktuellen Browsern (Chrome, Firefox, Safari, Edge) verfügbar; ältere Safari-Versionen benötigten
webkitAudioContext. DerAudioContextstartet wegen Autoplay-Richtlinien meist erst nach einer Nutzerinteraktion.