FX Class: Limiter
Interactive example
Overview
Limiter with only 32 samples latency and less than 1 kb memory allocation. This effect can boost the perceived volume while keeping the maximum level below a limit. It can be used to prevent overload or reduce dynamic range.
thresholdDb
and ceilingDb
controls the amplitude in decibels between `0` and `-40`.The releaseSec
property controls how fast the attenuation decreases between `0.001` and `1` (seconds). Also, there is a getGainReductionDb()
method which will return the maximum gain reduction in decibels since the last getGainReductionDb()
call.Implementation example
The limiter is is an FX class, it expects both an input and output buffer. The process()
method should be called on every loop of the audio processing block.
class SuperpoweredLimiterProcessor extends SuperpoweredWebAudio.AudioWorkletProcessor {// Called when the AudioWorklet is ready to start processing audioonReady() {this.limiter = new this.Superpowered.Limiter(44100 // The initial sample rate in Hz. -);this.limiter.enabled = true;}// Runs before the node is destroyed.// Clean up memory and objects here (such as free allocated linear memory or destruct Superpowered objects).onDestruct() {this.limiter.destruct();}// The shape of the message we pass from our main thread is up to youonMessageFromMainScope(message) {// Here is an example of how to apply changes to the Three Band EQ instanceif (typeof message.bits !== 'undefined') this.limiter.bits = message.bits;if (typeof message.frequency !== 'undefined') this.limiter.frequency = message.frequency;}// This is the process loop which is passed pointers to buffers// from the WebAudio API (inputBuffer and outputBuffer), with the buffersize (128 samples when running as a native AudioWorklet)processAudio(inputBuffer, outputBuffer, buffersize) {// Ensure the samplerate is in sync on every audio processing callbackthis.limiter.samplerate = this.samplerate;// Render the output buffersif (!this.limiter.process(inputBuffer.pointer, outputBuffer.pointer, buffersize)) {for (let n = 0; n < buffersize * 2 ; n++) outputBuffer.array[n] = inputBuffer.array[n];}}}
#include "SuperpoweredLimiter.h"void initLimiterEffect() {const unsigned int sampleRate = 44100;limiter = new Superpowered::Limiter(sampleRate);limiter->enabled = true;}void configureEffect() {limiter->ceilingDb = 0;limiter->thresholdDb = -16;limiter->releaseSec = 0.2;}void processAudio(float *interleavedInput, float *interleavedOutput, unsigned int numberOfFrames, unsigned int samplerate) {// Ensure the samplerate is in sync on every audio processing callbacklimiter->samplerate = samplerate;// Render the output buffersbool outputChanged = limiter->process(interleavedInput, interleavedOutput, numberOfFrames);...}
Properties
ceilingDb
PROPERTYCeiling in decibels.
Type | Min | Max | Default | Number | -40 | 0 | 0 |
---|
ceilingDb
PROPERTYCeiling in decibels.
Type | Min | Max | Default | float | -40 | 0 | 0 |
---|
releaseSec
PROPERTYRelease in seconds (not milliseconds!).
Type | Min | Max | Default | Number | 0.001 | 1 | 0.05 (50ms) |
---|
releaseSec
PROPERTYRelease in seconds (not milliseconds!).
Type | Min | Max | Default | float | 0.001 | 1 | 0.05 (50ms) |
---|
thresholdDb
PROPERTYThreshold in decibels.
Type | Min | Max | Default | Number | -40 | 0 | 0 |
---|
thresholdDb
PROPERTYThreshold in decibels.
Type | Min | Max | Default | float | -40 | 0 | 0 |
---|
enabled
PROPERTYTurns the effect on/off. The actual switch will happen on the next process() call for smooth, audio-artifact free operation.
Type | Min | Max | Default | Boolean | false |
---|
enabled
PROPERTYTurns the effect on/off. The actual switch will happen on the next process() call for smooth, audio-artifact free operation.
Type | Min | Max | Default | bool | false |
---|
samplerate
PROPERTYThe sample rate of the audio context, you must update if it changes.
Type | Min | Max | Default | Number |
---|
samplerate
PROPERTYThe sample rate of the audio context, you must update if it changes.
Type | Min | Max | Default | unsigned int |
---|
Methods
constructor
METHODCreates a Limiter instance.ParametersReturnsName Type Description samplerate Number
The initial sample rate in Hz. Type Description Superpowered.Limiter
The constructed instance. constructor
METHODCreates a Limiter instance.ParametersReturnsName Type Default Description samplerate unsigned int
The initial sample rate in Hz. Type Description Superpowered::Limiter
The constructed instance. getGainReductionDb
METHODReturns the maximum gain reduction in decibels since the last getGainReductionDb() call.ParametersNoneReturnsType Description Number
Reduction in db. getGainReductionDb
METHODReturns the maximum gain reduction in decibels since the last getGainReductionDb() call.ParametersNoneReturnsType Description float
Reduction in db.
destruct
METHODDestructor to free Linear Memory.ParametersNoneReturnsNoneprocess
METHODProcesses/renders the audio. Always call it in the audio processing callback, regardless if the effect is enabled or not for smooth, audio-artifact free operation. It's never blocking for real-time usage.ParametersReturnsName Type Description input Number (pointer in Linear Memory)
32-bit interleaved stereo input. output Number (pointer in Linear Memory)
32-bit interleaved stereo output. numberOfFrames Number
Number of frames to process. Recommendations for best performance: multiply of 4, minimum 64. Type Description Boolean
If process() returns with true, the contents of output are replaced with the audio output. If process() returns with false, it indicates silence. The contents of output are not changed in this case (not overwritten with zeros). process
METHODProcesses/renders the audio. Always call it in the audio processing callback, regardless if the effect is enabled or not for smooth, audio-artifact free operation. It's never blocking for real-time usage. You can change all effect properties on any thread, concurrently with process().ParametersReturnsName Type Default Description input float *
32-bit interleaved stereo input. output float *
32-bit interleaved stereo output. numberOfFrames unsigned int
Number of frames to process. Recommendations for best performance: multiply of 4, minimum 64. Type Description bool
If process() returns with true, the contents of output are replaced with the audio output. If process() returns with false, it indicates silence. The contents of output are not changed in this case (not overwritten with zeros).