Это невозможно с любым из встроенных AudioNodes. Но это может быть достигнуто с помощью пользовательского AudioWorklet. Я недавно опубликовал пакет, который делает именно это. Он называется limiter-audio-worklet .
. Экспортирует две функции:
import { addLimiterAudioWorkletModule, createLimiterAudioWorkletNode } from 'limiter-audio-worklet';
Первая функция может использоваться для добавления AudioWorklet
к определенному AudioContext
.
await addLimiterAudioWorkletModule((url) => {
audioContext.audioWorklet.addModule(url);
});
Как только это будет сделано, фактическое AudioWorkletNode
может быть создано следующим образом:
const limiterAudioWorkletNode = createLimiterAudioWorkletNode(
AudioWorkletNode,
audioContext,
{ attack: 0 }
);
Если вы установите attack
два нуля, вы получите желаемый эффект , Все выше + 1 / -1 зажимается. Если вы увеличите значение attack
, оно станет более плавным, если смотреть вперед. Это приведет к небольшой задержке (того же размера), но звучит намного лучше.
Конечно, также необходимо подключить ранее созданный limiterAudioWorkletNode
близко к концу вашего звукового графика.
yourLastAudioNode
.connect(limiterAudioWorkletNode)
.connect(audioContext.destination);