feat: add transient suppressor to audio pipeline
Implements a per-sample transient suppressor in the noise gate AudioWorklet that instantly cuts gain when a sudden loud peak (desk hit, mic bump) exceeds the slow background RMS by a configurable threshold, then releases over a short window. Exposes enable, sensitivity, and release controls in the audio settings tab. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -38,6 +38,9 @@ import {
|
||||
noiseGateAttack,
|
||||
noiseGateHold,
|
||||
noiseGateRelease,
|
||||
transientSuppressorEnabled,
|
||||
transientThreshold,
|
||||
transientRelease,
|
||||
} from "../../../settings/settings.ts";
|
||||
import {
|
||||
type NoiseGateParams,
|
||||
@@ -438,6 +441,9 @@ export class Publisher {
|
||||
attackMs: noiseGateAttack.getValue(),
|
||||
holdMs: noiseGateHold.getValue(),
|
||||
releaseMs: noiseGateRelease.getValue(),
|
||||
transientEnabled: transientSuppressorEnabled.getValue(),
|
||||
transientThresholdDb: transientThreshold.getValue(),
|
||||
transientReleaseMs: transientRelease.getValue(),
|
||||
});
|
||||
|
||||
// Attach / detach processor when enabled state or the track changes.
|
||||
@@ -482,10 +488,17 @@ export class Publisher {
|
||||
noiseGateAttack.value$,
|
||||
noiseGateHold.value$,
|
||||
noiseGateRelease.value$,
|
||||
transientSuppressorEnabled.value$,
|
||||
transientThreshold.value$,
|
||||
transientRelease.value$,
|
||||
])
|
||||
.pipe(scope.bind())
|
||||
.subscribe(([threshold, attackMs, holdMs, releaseMs]) => {
|
||||
transformer?.updateParams({ threshold, attackMs, holdMs, releaseMs });
|
||||
.subscribe(([threshold, attackMs, holdMs, releaseMs,
|
||||
transientEnabled, transientThresholdDb, transientReleaseMs]) => {
|
||||
transformer?.updateParams({
|
||||
threshold, attackMs, holdMs, releaseMs,
|
||||
transientEnabled, transientThresholdDb, transientReleaseMs,
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user