Signatur
Beschreibung
Die Eigenschaft sampleRate steht im globalen Gültigkeitsbereich eines Audio-Worklets zur Verfügung, also im Code, der per audioContext.audioWorklet.addModule() geladen wird. Dort ist sie als globale Variable sampleRate direkt ansprechbar, ohne Präfix. Sie hat immer denselben Wert wie BaseAudioContext.sampleRate des zugehörigen Kontexts, zum Beispiel 44100 oder 48000.
Gebraucht wird der Wert überall, wo ein AudioWorkletProcessor Zeit oder Frequenz in Samples umrechnen muss: Oszillatoren (Phaseninkrement = Frequenz / sampleRate), Filterkoeffizienten, Hüllkurven, Verzögerungslinien oder Pegelmessung über feste Zeitfenster. Hart codierte Werte wie 44100 führen auf Geräten mit 48 kHz zu falscher Tonhöhe oder falschen Zeiten. Deshalb sollte man immer sampleRate verwenden.
Der Wert ändert sich während der Lebensdauer eines Kontexts nicht. Man kann abgeleitete Größen also einmal im Konstruktor des Prozessors berechnen und in process() wiederverwenden. Das spart Rechenzeit im zeitkritischen Audio-Thread.
Rückgabewert
BaseAudioContext in Samples pro Sekunde (Hz) als Fließkommazahl, z. B. 48000.Beispiele
Sinus-Oszillator mit korrekter Tonhöhe
// sine-processor.js – wird per addModule() geladen
class SineProcessor extends AudioWorkletProcessor {
static get parameterDescriptors() {
return [{ name: 'frequency', defaultValue: 440, minValue: 20, maxValue: 20000 }];
}
constructor() {
super();
this.phase = 0;
}
process(inputs, outputs, parameters) {
const output = outputs[0];
const freq = parameters.frequency;
for (let i = 0; i < output[0].length; i++) {
const f = freq.length > 1 ? freq[i] : freq[0];
const sample = Math.sin(2 * Math.PI * this.phase);
// Phaseninkrement hängt direkt von sampleRate ab
this.phase = (this.phase + f / sampleRate) % 1;
for (const channel of output) channel[i] = sample * 0.2;
}
return true;
}
}
registerProcessor('sine-processor', SineProcessor);
Hauptthread: Worklet laden und sampleRate prüfen
// main.js
const ctx = new AudioContext({ sampleRate: 48000 });
await ctx.audioWorklet.addModule('sine-processor.js');
const node = new AudioWorkletNode(ctx, 'sine-processor');
node.connect(ctx.destination);
// Im Worklet ist sampleRate identisch mit ctx.sampleRate
console.log(`Kontext-Abtastrate: ${ctx.sampleRate} Hz`);
Zeitfenster in Samples umrechnen und melden
// meter-processor.js – RMS-Pegel alle 100 ms an den Hauptthread melden
class MeterProcessor extends AudioWorkletProcessor {
constructor() {
super();
// Einmalig berechnen: 100 ms in Samples
this.windowSize = Math.round(sampleRate * 0.1);
this.sum = 0;
this.count = 0;
this.port.postMessage({ type: 'info', sampleRate, windowSize: this.windowSize });
}
process(inputs) {
const input = inputs[0][0];
if (!input) return true;
for (const s of input) {
this.sum += s * s;
if (++this.count >= this.windowSize) {
this.port.postMessage({ type: 'rms', value: Math.sqrt(this.sum / this.count) });
this.sum = 0;
this.count = 0;
}
}
return true;
}
}
registerProcessor('meter-processor', MeterProcessor);
// Wichtig · Fallstricke
- Nur im Worklet-Scope verfügbar: Im Hauptthread gibt es keine globale Variable
sampleRate. Dort nimmt manaudioContext.sampleRate. - Nicht hart codieren: Viele Geräte laufen mit 48 kHz, nicht mit 44,1 kHz. Mit festen Werten stimmen Tonhöhe und Timing nicht mehr.
- Schreibgeschützt: Eine Zuweisung hat keine Wirkung und wirft im Strict Mode (Modulcode) einen
TypeError. Die Rate legt man übernew AudioContext({ sampleRate })fest. - Performance: Abgeleitete Werte wie Koeffizienten oder Fenstergrößen besser im Konstruktor berechnen als in jedem
process()-Aufruf. - Kompatibilität: Audio-Worklets gibt es in Chrome 66+, Firefox 76+ und Safari 14.1+. Sie brauchen einen sicheren Kontext (HTTPS oder localhost).