using System; namespace FluidSim.Core { public class SoundProcessor { private readonly float dt; private readonly float scaleFactor; // 1 / (4π r) private float flowLP, prevMassFlowOut, smoothDMdt; private readonly float lpAlpha, alpha; public float Gain = 1f; public SoundProcessor(int sampleRate, float listenerDistance = 1f) { dt = 1f / sampleRate; scaleFactor = 1f / (4f * MathF.PI * listenerDistance); float tau = 0.02f; alpha = MathF.Exp(-dt / tau); float tauLP = 0.005f; lpAlpha = MathF.Exp(-dt / tauLP); } public float Process(float massFlowOut) { flowLP = lpAlpha * flowLP + (1f - lpAlpha) * massFlowOut; float rawDerivative = (flowLP - prevMassFlowOut) / dt; prevMassFlowOut = flowLP; smoothDMdt = alpha * smoothDMdt + (1f - alpha) * rawDerivative; float pressure = smoothDMdt * scaleFactor * Gain; return MathF.Tanh(pressure); } } }