Start · Sprachen · JavaScript · Referenz · PannerNode.rolloffFactor

PannerNode.rolloffFactor

Eigenschaft

Legt als Zahl fest, wie schnell die Lautstärke einer Quelle abnimmt, wenn sie sich vom Hörer entfernt. Standardwert: <code>1</code>.

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

Signatur

PannerNode.rolloffFactor

Beschreibung

Die Eigenschaft rolloffFactor eines PannerNode steuert, wie stark die Lautstärke einer Schallquelle mit zunehmender Entfernung vom AudioListener abnimmt. Mit Werten über 1 wird es schneller leise, mit Werten unter 1 langsamer. Bei 0 bleibt die Lautstärke unabhängig von der Entfernung gleich.

Wie sich der Wert auswirkt, hängt vom gewählten distanceModel ab. Dabei ist d die Entfernung, ref gleich refDistance und max gleich maxDistance:

  • "linear": 1 - rolloffFactor * (d - ref) / (max - ref). Der Wert wird auf den Bereich [0, 1] begrenzt.
  • "inverse" (Standard): ref / (ref + rolloffFactor * (max(d, ref) - ref))
  • "exponential": pow(max(d, ref) / ref, -rolloffFactor)

Einsatzgebiete sind 3D-Spiele, VR/WebXR-Anwendungen und räumliche Audio-Visualisierungen. So lassen sich etwa leise Umgebungsgeräusche weit hörbar machen (kleiner Faktor), während Schritte oder Stimmen schnell leiser werden (großer Faktor). Die Eigenschaft ist eine einfache Zahl und kein AudioParam. Man kann sie deshalb nicht mit setValueAtTime() o. Ä. zeitgesteuert verändern.

Parameter

Name Typ Default Beschreibung
$value number 1 Neuer Faktor beim Setzen. Er darf nicht negativ sein. Beim Modell "linear" ist er praktisch auf [0, 1] begrenzt, bei "inverse" und "exponential" gibt es keine Obergrenze.

Rückgabewert

Typ
number
Beschreibung
Der aktuelle Faktor als Gleitkommazahl (Standard: 1).

Beispiele

Faktor lesen und setzen

const ctx = new AudioContext();
const panner = new PannerNode(ctx, {
  panningModel: 'HRTF',
  distanceModel: 'inverse',
  refDistance: 1,
  maxDistance: 10000
});

console.log(panner.rolloffFactor); // Standardwert

// Quelle soll mit der Entfernung schneller leiser werden
panner.rolloffFactor = 2.5;
console.log(panner.rolloffFactor);
1 2.5

Direkt im Konstruktor festlegen und Quelle anschließen

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

// Schwacher Abfall: Das Geräusch ist auch weit weg noch zu hören
const panner = new PannerNode(ctx, {
  distanceModel: 'exponential',
  rolloffFactor: 0.5,
  positionX: 0,
  positionY: 0,
  positionZ: -20
});

osc.connect(panner).connect(ctx.destination);

document.querySelector('#play').addEventListener('click', async () => {
  await ctx.resume();
  osc.start();
  osc.stop(ctx.currentTime + 2);
});

Verstärkung abhängig von der Entfernung berechnen (Formeln der Spezifikation)

const distanceGain = ({ distanceModel, refDistance, maxDistance, rolloffFactor }, d) => {
  switch (distanceModel) {
    case 'linear': {
      const r = Math.min(Math.max(rolloffFactor, 0), 1);
      const dc = Math.min(Math.max(d, refDistance), maxDistance);
      return 1 - r * (dc - refDistance) / (maxDistance - refDistance);
    }
    case 'inverse':
      return refDistance / (refDistance + rolloffFactor * (Math.max(d, refDistance) - refDistance));
    case 'exponential':
      return Math.pow(Math.max(d, refDistance) / refDistance, -rolloffFactor);
  }
};

const ctx = new AudioContext();
const panner = new PannerNode(ctx, { refDistance: 1, rolloffFactor: 2 });

for (const d of [1, 5, 10]) {
  console.log(d, distanceGain(panner, d).toFixed(3));
}
1 1.000 5 0.111 10 0.053

// Wichtig · Fallstricke

  • Negative Werte lösen einen RangeError aus. Das gilt sowohl für die Zuweisung als auch für den Konstruktor.
  • Beim Modell "linear" werden Werte über 1 auf 1 begrenzt. Ein höherer Faktor bewirkt dort also nichts mehr.
  • rolloffFactor ist kein AudioParam. Wer weiche Übergänge braucht, sollte zusätzlich einen GainNode verwenden und dessen gain automatisieren.
  • Der Faktor wirkt erst ab refDistance. Innerhalb dieses Abstands bleibt die Verstärkung bei 1.
  • Kompatibilität: Die Eigenschaft wird von allen aktuellen Browsern unterstützt. Ältere Safari-Versionen benötigen webkitAudioContext. Außerdem darf ein AudioContext erst nach einer Nutzerinteraktion (z. B. einem Klick) Ton ausgeben.