Start · Sprachen · JavaScript · Referenz · AudioWorkletGlobalScope.sampleRate

AudioWorkletGlobalScope.sampleRate

Eigenschaft

Liefert als schreibgeschützte Fließkommazahl die Abtastrate (in Hz) des <code>BaseAudioContext</code>, zu dem das Audio-Worklet gehört.

seit JavaScript Baseline: alle modernen Browser (seit 2021) Kategorie: webapi

Signatur

AudioWorkletGlobalScope.sampleRate

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

Typ
number
Beschreibung
Abtastrate des zugehörigen 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`);
Kontext-Abtastrate: 48000 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);
{ type: 'info', sampleRate: 48000, windowSize: 4800 }

// Wichtig · Fallstricke

  • Nur im Worklet-Scope verfügbar: Im Hauptthread gibt es keine globale Variable sampleRate. Dort nimmt man audioContext.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 über new 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).