Start · Sprachen · JavaScript · Referenz · PannerNode.positionX

PannerNode.positionX

Eigenschaft

Ein schreibgeschützter <code>AudioParam</code>, der die X-Koordinate (links–rechts) der Audioquelle im 3D-Raum eines <code>PannerNode</code> festlegt.

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

Signatur

PannerNode.positionX

Beschreibung

Die Eigenschaft positionX eines PannerNode legt fest, wo sich eine Schallquelle auf der horizontalen Achse (links–rechts) im rechtshändigen kartesischen Koordinatensystem der Web Audio API befindet. Positive Werte liegen rechts vom Hörer, negative links. Gemeinsam mit positionY (oben–unten) und positionZ (vorne–hinten) ergibt sich die vollständige Position der Quelle.

Die Eigenschaft selbst ist schreibgeschützt, sie liefert aber einen AudioParam. Der eigentliche Wert wird über positionX.value gesetzt oder mit den Automatisierungsmethoden wie setValueAtTime(), linearRampToValueAtTime() oder setTargetAtTime() sampelgenau zeitlich gesteuert. Es handelt sich um einen a-rate-Parameter; der Standardwert ist 0.

Einsatzgebiete sind Spiele, VR/AR-Anwendungen, interaktive Klanginstallationen oder alles, bei dem sich eine Schallquelle hörbar im Raum bewegen soll. Wie stark die Position wahrgenommen wird, hängt außerdem von panningModel ("equalpower" oder "HRTF"), dem Entfernungsmodell und der Position des AudioListener ab.

Rückgabewert

Typ
AudioParam
Beschreibung
Ein AudioParam, dessen value die X-Koordinate der Quelle angibt (Standard 0, Bereich praktisch unbegrenzt: ±3.4028234663852886e38).

Beispiele

Oszillator links vom Hörer platzieren

const ctx = new AudioContext();
const osc = new OscillatorNode(ctx, { frequency: 440 });
const panner = new PannerNode(ctx, { panningModel: 'HRTF' });

// Quelle 3 Einheiten links vom Hörer
panner.positionX.value = -3;

osc.connect(panner).connect(ctx.destination);
osc.start();
osc.stop(ctx.currentTime + 2);

console.log(panner.positionX.value);
-3

Quelle von links nach rechts vorbeifliegen lassen

const ctx = new AudioContext();
const osc = new OscillatorNode(ctx, { type: 'sawtooth', frequency: 220 });
const panner = new PannerNode(ctx, {
  panningModel: 'HRTF',
  distanceModel: 'inverse',
  positionZ: -1 // leicht vor dem Hörer
});

const now = ctx.currentTime;
// Sampelgenaue Automatisierung über 4 Sekunden
panner.positionX.setValueAtTime(-10, now);
panner.positionX.linearRampToValueAtTime(10, now + 4);

osc.connect(panner).connect(ctx.destination);
osc.start(now);
osc.stop(now + 4);

Position an die Mausposition koppeln

const ctx = new AudioContext();
const panner = new PannerNode(ctx, { panningModel: 'HRTF' });
const osc = new OscillatorNode(ctx, { frequency: 330 });
osc.connect(panner).connect(ctx.destination);

document.addEventListener('click', async () => {
  await ctx.resume(); // Autoplay-Richtlinie
  osc.start();
}, { once: true });

document.addEventListener('mousemove', (e) => {
  // Bildschirmbreite auf -5 … 5 abbilden
  const x = (e.clientX / window.innerWidth) * 10 - 5;
  // Weiches Nachführen verhindert Knackgeräusche
  panner.positionX.setTargetAtTime(x, ctx.currentTime, 0.05);
});

// Wichtig · Fallstricke

  • Nicht direkt zuweisen: panner.positionX = 5 hat keine Wirkung (bzw. wirft im Strict Mode einen Fehler), da die Eigenschaft schreibgeschützt ist. Immer positionX.value oder Automatisierungsmethoden verwenden.
  • Sprünge vermeiden: Häufige, abrupte Änderungen von value können Knackser erzeugen. Für flüssige Bewegungen setTargetAtTime() oder linearRampToValueAtTime() nutzen.
  • Veraltete API: Früher wurde die Position über PannerNode.setPosition(x, y, z) gesetzt. Diese Methode ist veraltet; ältere Safari-Versionen kannten positionX noch nicht, daher ggf. per Feature-Erkennung (if (panner.positionX)) auf setPosition() ausweichen.
  • Die Wirkung ist relativ zur Position des AudioListener (ctx.listener.positionX usw.). Liegen Quelle und Hörer am selben Punkt, ist keine Richtung hörbar.
  • Für reines Stereo-Panning ohne 3D-Raum ist StereoPannerNode einfacher und performanter; "HRTF" ist rechenintensiver als "equalpower".
  • Wegen der Autoplay-Richtlinien der Browser startet ein AudioContext oft im Zustand "suspended" und muss nach einer Nutzerinteraktion mit resume() fortgesetzt werden.