From 174845957a216ada646ddb9ae5355ca645586632 Mon Sep 17 00:00:00 2001 From: Jage9 Date: Sat, 21 Feb 2026 20:08:43 -0500 Subject: [PATCH] Remove directional muffling, set rear directional range to 30%, and correct version to R119 --- client/public/version.js | 2 +- client/src/audio/itemEmitRuntime.ts | 28 ++++------------------- client/src/audio/radioStationRuntime.ts | 30 ++++--------------------- 3 files changed, 9 insertions(+), 51 deletions(-) diff --git a/client/public/version.js b/client/public/version.js index 5af4338..98bc303 100644 --- a/client/public/version.js +++ b/client/public/version.js @@ -1,5 +1,5 @@ // Maintainer-controlled web client version. // Format: YYYY.MM.DD Rn (example: 2026.02.20 R2) -window.CHGRID_WEB_VERSION = "2026.02.21 R107"; +window.CHGRID_WEB_VERSION = "2026.02.21 R119"; // Optional display timezone for timestamps. Falls back to America/Detroit if unset/invalid. window.CHGRID_TIME_ZONE = "America/Detroit"; diff --git a/client/src/audio/itemEmitRuntime.ts b/client/src/audio/itemEmitRuntime.ts index 63bd911..91dcf80 100644 --- a/client/src/audio/itemEmitRuntime.ts +++ b/client/src/audio/itemEmitRuntime.ts @@ -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)); diff --git a/client/src/audio/radioStationRuntime.ts b/client/src/audio/radioStationRuntime.ts index 969e942..9526a71 100644 --- a/client/src/audio/radioStationRuntime.ts +++ b/client/src/audio/radioStationRuntime.ts @@ -1,7 +1,7 @@ import { HEARING_RADIUS, type WorldItem } from '../state/gameState'; import { EFFECT_IDS, clampEffectLevel, connectEffectChain, disconnectEffectRuntime, type EffectId, type EffectRuntime } from './effects'; import { AudioEngine } from './audioEngine'; -import { resolveDirectionalMuffleRatio, resolveSpatialMix } from './spatial'; +import { resolveSpatialMix } from './spatial'; export const RADIO_CHANNEL_OPTIONS = ['stereo', 'mono', 'left', 'right'] as const; export type RadioChannelMode = (typeof RADIO_CHANNEL_OPTIONS)[number]; @@ -26,7 +26,6 @@ type ItemRadioOutput = { effectRuntime: EffectRuntime | null; effect: EffectId; effectValue: number; - directionalFilter: BiquadFilterNode; gain: GainNode; panner: StereoPannerNode | null; }; @@ -153,7 +152,6 @@ export class RadioStationRuntime { output.sourceInput.disconnect(); output.effectInput.disconnect(); disconnectEffectRuntime(output.effectRuntime); - output.directionalFilter.disconnect(); output.gain.disconnect(); output.panner?.disconnect(); this.itemRadioOutputs.delete(itemId); @@ -227,26 +225,11 @@ export class RadioStationRuntime { 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)); @@ -266,7 +249,7 @@ export class RadioStationRuntime { } output.effectInput.disconnect(); disconnectEffectRuntime(output.effectRuntime); - output.effectRuntime = connectEffectChain(audioCtx, output.effectInput, output.directionalFilter, effect, effectValue); + output.effectRuntime = connectEffectChain(audioCtx, output.effectInput, output.gain, effect, effectValue); output.effect = effect; output.effectValue = effectValue; } @@ -330,15 +313,11 @@ export class RadioStationRuntime { const gain = audioCtx.createGain(); gain.gain.value = 0; - const directionalFilter = audioCtx.createBiquadFilter(); - directionalFilter.type = 'lowpass'; - directionalFilter.frequency.value = 12000; const effectInput = audioCtx.createGain(); const channelSource = connectRadioChannelSource(audioCtx, shared.source, channel, effectInput); const effect = normalizeRadioEffect(item.params.effect); const effectValue = normalizeRadioEffectValue(item.params.effectValue); - const effectRuntime = connectEffectChain(audioCtx, effectInput, directionalFilter, effect, effectValue); - directionalFilter.connect(gain); + const effectRuntime = connectEffectChain(audioCtx, effectInput, gain, effect, effectValue); let panner: StereoPannerNode | null = null; if (this.audio.supportsStereoPanner()) { panner = audioCtx.createStereoPanner(); @@ -359,7 +338,6 @@ export class RadioStationRuntime { effectRuntime, effect, effectValue, - directionalFilter, gain, panner, });