Remove directional muffling, set rear directional range to 30%, and correct version to R119
This commit is contained in:
@@ -1,12 +1,11 @@
|
||||
import { HEARING_RADIUS, type WorldItem } from '../state/gameState';
|
||||
import { AudioEngine } from './audioEngine';
|
||||
import { resolveDirectionalMuffleRatio, resolveSpatialMix } from './spatial';
|
||||
import { resolveSpatialMix } from './spatial';
|
||||
|
||||
type EmitOutput = {
|
||||
soundUrl: string;
|
||||
element: HTMLAudioElement;
|
||||
source: MediaElementAudioSourceNode;
|
||||
directionalFilter: BiquadFilterNode;
|
||||
gain: GainNode;
|
||||
panner: StereoPannerNode | null;
|
||||
};
|
||||
@@ -35,7 +34,6 @@ export class ItemEmitRuntime {
|
||||
output.element.pause();
|
||||
output.element.src = '';
|
||||
output.source.disconnect();
|
||||
output.directionalFilter.disconnect();
|
||||
output.gain.disconnect();
|
||||
output.panner?.disconnect();
|
||||
this.outputs.delete(itemId);
|
||||
@@ -85,20 +83,17 @@ export class ItemEmitRuntime {
|
||||
element.preload = 'none';
|
||||
element.crossOrigin = 'anonymous';
|
||||
const source = audioCtx.createMediaElementSource(element);
|
||||
const directionalFilter = audioCtx.createBiquadFilter();
|
||||
directionalFilter.type = 'lowpass';
|
||||
directionalFilter.frequency.value = 12000;
|
||||
const gain = audioCtx.createGain();
|
||||
gain.gain.value = 0;
|
||||
let panner: StereoPannerNode | null = null;
|
||||
source.connect(directionalFilter).connect(gain);
|
||||
source.connect(gain);
|
||||
if (this.audio.supportsStereoPanner()) {
|
||||
panner = audioCtx.createStereoPanner();
|
||||
gain.connect(panner).connect(audioCtx.destination);
|
||||
} else {
|
||||
gain.connect(audioCtx.destination);
|
||||
}
|
||||
this.outputs.set(item.id, { soundUrl, element, source, directionalFilter, gain, panner });
|
||||
this.outputs.set(item.id, { soundUrl, element, source, gain, panner });
|
||||
void element.play().catch(() => undefined);
|
||||
}
|
||||
|
||||
@@ -133,26 +128,11 @@ export class ItemEmitRuntime {
|
||||
enabled: spatialConfig.directional,
|
||||
facingDeg: spatialConfig.facingDeg,
|
||||
coneDeg: 120,
|
||||
rearGain: 0.5,
|
||||
rearGain: 0.3,
|
||||
},
|
||||
});
|
||||
const gainValue = mix?.gain ?? 0;
|
||||
const panValue = mix?.pan ?? 0;
|
||||
const muffleRatio = resolveDirectionalMuffleRatio(
|
||||
item.x - playerPosition.x,
|
||||
item.y - playerPosition.y,
|
||||
{
|
||||
enabled: spatialConfig.directional,
|
||||
facingDeg: spatialConfig.facingDeg,
|
||||
coneDeg: 120,
|
||||
rearGain: 0.35,
|
||||
},
|
||||
);
|
||||
const clearCutoffHz = 22050;
|
||||
const rearCutoffHz = 4500;
|
||||
const muffleCurve = muffleRatio * muffleRatio;
|
||||
const cutoffHz = clearCutoffHz - (clearCutoffHz - rearCutoffHz) * muffleCurve;
|
||||
output.directionalFilter.frequency.linearRampToValueAtTime(cutoffHz, audioCtx.currentTime + 0.1);
|
||||
output.gain.gain.linearRampToValueAtTime(gainValue, audioCtx.currentTime + 0.1);
|
||||
if (output.panner) {
|
||||
const resolvedPan = this.audio.getOutputMode() === 'mono' ? 0 : Math.max(-1, Math.min(1, panValue));
|
||||
|
||||
Reference in New Issue
Block a user