# compressors.lib

A library of compressor effects. Its official prefix is co.

## Functions Reference

### (co.)peak_compression_gain_mono

Mono dynamic range compressor gain computer. peak_compression_gain_mono is a standard Faust function.

#### Usage

_ : peak_compression_gain_mono(strength,thresh,att,rel,knee,prePost) : _


Where:

• strength: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression)
• thresh: dB level threshold above which compression kicks in
• att: attack time = time constant (sec) when level & compression going up
• rel: release time = time constant (sec) coming out of compression
• knee: a gradual increase in gain reduction around the threshold: Below thresh-(knee/2) there is no gain reduction, above thresh+(knee/2) there is the same gain reduction as without a knee, and in between there is a gradual increase in gain reduction.
• prePost: places the level detector either at the input or after the gain computer; this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector It uses a strength parameter instead of the traditional ratio, in order to be able to function as a hard limiter. For that you'd need a ratio of infinity:1, and you cannot express that in Faust Sometimes even bigger ratios are useful: For example a group recording where one instrument is recorded with both a close microphone and a room microphone, and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft.

### (co.)peak_compression_gain_N_chan

N channel dynamic range compressor gain computer. peak_compression_gain_N_chan is a standard Faust function.

#### Usage

si.bus(N) : peak_compression_gain_N_chan(strength,thresh,att,rel,knee,prePost,link,N) : si.bus(N)


Where:

• strength: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression)
• thresh: dB level threshold above which compression kicks in
• att: attack time = time constant (sec) when level & compression going up
• rel: release time = time constant (sec) coming out of compression
• knee: a gradual increase in gain reduction around the threshold: Below thresh-(knee/2) there is no gain reduction, above thresh+(knee/2) there is the same gain reduction as without a knee, and in between there is a gradual increase in gain reduction.
• prePost: places the level detector either at the input or after the gain computer; this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector
• link: the amount of linkage between the channels. 0 = each channel is independent, 1 = all channels have the same amount of gain reduction
• N: the number of channels of the compressor It uses a strength parameter instead of the traditional ratio, in order to be able to function as a hard limiter. For that you'd need a ratio of infinity:1, and you cannot express that in Faust. Sometimes even bigger ratios are useful: for example a group recording where one instrument is recorded with both a close microphone and a room microphone, and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft.

### (co.)FFcompressor_N_chan

feed forward N channel dynamic range compressor. FFcompressor_N_chan is a standard Faust function.

#### Usage

si.bus(N) : FFcompressor_N_chan(strength,thresh,att,rel,knee,prePost,link,meter,N) : si.bus(N)


Where:

• strength: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression)
• thresh: dB level threshold above which compression kicks in
• att: attack time = time constant (sec) when level & compression going up
• rel: release time = time constant (sec) coming out of compression
• knee: a gradual increase in gain reduction around the threshold: Below thresh-(knee/2) there is no gain reduction, above thresh+(knee/2) there is the same gain reduction as without a knee, and in between there is a gradual increase in gain reduction.
• prePost: places the level detector either at the input or after the gain computer; this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector
• link: the amount of linkage between the channels. 0 = each channel is independent, 1 = all channels have the same amount of gain reduction
• meter: a gain reduction meter. It can be implemented like so: meter = <:(, (ba.linear2db:max(maxGR):meter_group((hbargraph("[1][unit:dB][tooltip: gain reduction in dB]", maxGR, 0))))):attach;
• N: the number of channels of the compressor It uses a strength parameter instead of the traditional ratio, in order to be able to function as a hard limiter. For that you'd need a ratio of infinity:1, and you cannot express that in Faust. Sometimes even bigger ratios are useful: for example a group recording where one instrument is recorded with both a close microphone and a room microphone, and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft.

### (co.)FBcompressor_N_chan

feed back N channel dynamic range compressor. FBcompressor_N_chan is a standard Faust function.

#### Usage

si.bus(N) : FBcompressor_N_chan(strength,thresh,att,rel,knee,prePost,link,meter,N) : si.bus(N)


Where:

• strength: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression)
• thresh: dB level threshold above which compression kicks in
• att: attack time = time constant (sec) when level & compression going up
• rel: release time = time constant (sec) coming out of compression
• knee: a gradual increase in gain reduction around the threshold: Below thresh-(knee/2) there is no gain reduction, above thresh+(knee/2) there is the same gain reduction as without a knee, and in between there is a gradual increase in gain reduction.
• prePost: places the level detector either at the input or after the gain computer; this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector
• link: the amount of linkage between the channels. 0 = each channel is independent, 1 = all channels have the same amount of gain reduction
• meter: a gain reduction meter. It can be implemented like so: meter = <:(, (ba.linear2db:max(maxGR):meter_group((hbargraph("[1][unit:dB][tooltip: gain reduction in dB]", maxGR, 0))))):attach; or it can be omitted by defining 'meter = _'.
• N: the number of channels of the compressor It uses a strength parameter instead of the traditional ratio, in order to be able to function as a hard limiter. For that you'd need a ratio of infinity:1, and you cannot express that in Faust. Sometimes even bigger ratios are useful: for example a group recording where one instrument is recorded with both a close microphone and a room microphone, and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft.

### (co.)FFFBcompressor_N_chan

feed forward / feed back N channel dynamic range compressor. the feedback part has a much higher strength, so they end up sounding similar FFFBcompressor_N_chan is a standard Faust function.

#### Usage

si.bus(N) : FFFBcompressor_N_chan(strength,thresh,att,rel,knee,prePost,link,FBFF,meter,N) : si.bus(N)


Where:

• strength: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression)
• thresh: dB level threshold above which compression kicks in
• att: attack time = time constant (sec) when level & compression going up
• rel: release time = time constant (sec) coming out of compression
• knee: a gradual increase in gain reduction around the threshold: Below thresh-(knee/2) there is no gain reduction, above thresh+(knee/2) there is the same gain reduction as without a knee, and in between there is a gradual increase in gain reduction.
• prePost: places the level detector either at the input or after the gain computer; this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector
• link: the amount of linkage between the channels. 0 = each channel is independent, 1 = all channels have the same amount of gain reduction
• FFFB: fade between feed forward (0) and feed back (1) compression.
• meter: a gain reduction meter. It can be implemented like so: meter = <:(, (ba.linear2db:max(maxGR):meter_group((hbargraph("[1][unit:dB][tooltip: gain reduction in dB]", maxGR, 0))))):attach;
• N: the number of channels of the compressor It uses a strength parameter instead of the traditional ratio, in order to be able to function as a hard limiter. For that you'd need a ratio of infinity:1, and you cannot express that in Faust. Sometimes even bigger ratios are useful: for example a group recording where one instrument is recorded with both a close microphone and a room microphone, and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft.

### (co.)RMS_compression_gain_mono

Mono RMS dynamic range compressor gain computer. RMS_compression_gain_mono is a standard Faust function

#### Usage

_ : RMS_compression_gain_mono(strength,thresh,att,rel,knee,prePost) : _


Where:

• strength: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression)
• thresh: dB level threshold above which compression kicks in
• att: attack time = time constant (sec) when level & compression going up
• rel: release time = time constant (sec) coming out of compression
• knee: a gradual increase in gain reduction around the threshold: Below thresh-(knee/2) there is no gain reduction, above thresh+(knee/2) there is the same gain reduction as without a knee, and in between there is a gradual increase in gain reduction.
• prePost: places the level detector either at the input or after the gain computer; this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector It uses a strength parameter instead of the traditional ratio, in order to be able to function as a hard limiter. For that you'd need a ratio of infinity:1, and you cannot express that in Faust. Sometimes even bigger ratios are useful: for example a group recording where one instrument is recorded with both a close microphone and a room microphone, and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft.

### (co.)RMS_compression_gain_N_chan

RMS N channel dynamic range compressor gain computer. RMS_compression_gain_N_chan is a standard Faust function.

#### Usage

si.bus(N) : RMS_compression_gain_N_chan(strength,thresh,att,rel,knee,prePost,link,N) : si.bus(N)


Where:

• strength: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression)
• thresh: dB level threshold above which compression kicks in
• att: attack time = time constant (sec) when level & compression going up
• rel: release time = time constant (sec) coming out of compression
• knee: a gradual increase in gain reduction around the threshold: Below thresh-(knee/2) there is no gain reduction, above thresh+(knee/2) there is the same gain reduction as without a knee, and in between there is a gradual increase in gain reduction.
• prePost: places the level detector either at the input or after the gain computer; this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector
• link: the amount of linkage between the channels. 0 = each channel is independent, 1 = all channels have the same amount of gain reduction
• N: the number of channels of the compressor It uses a strength parameter instead of the traditional ratio, in order to be able to function as a hard limiter. For that you'd need a ratio of infinity:1, and you cannot express that in Faust. Sometimes even bigger ratios are useful: for example a group recording where one instrument is recorded with both a close microphone and a room microphone, and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft.

### (co.)RMS_FFFBcompressor_N_chan

RMS feed forward / feed back N channel dynamic range compressor. the feedback part has a much higher strength, so they end up sounding similar RMS_FFFBcompressor_N_chan is a standard Faust function.

#### Usage

si.bus(N) : RMS_FFFBcompressor_N_chan(strength,thresh,att,rel,knee,prePost,link,FBFF,meter,N) : si.bus(N)


Where:

• strength: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression)
• thresh: dB level threshold above which compression kicks in
• att: attack time = time constant (sec) when level & compression going up
• rel: release time = time constant (sec) coming out of compression
• knee: a gradual increase in gain reduction around the threshold: Below thresh-(knee/2) there is no gain reduction, above thresh+(knee/2) there is the same gain reduction as without a knee, and in between there is a gradual increase in gain reduction.
• prePost: places the level detector either at the input or after the gain computer; this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector
• link: the amount of linkage between the channels. 0 = each channel is independent, 1 = all channels have the same amount of gain reduction
• FFFB: fade between feed forward (0) and feed back (1) compression.
• meter: a gain reduction meter. It can be implemented like so: meter = <:(, (ba.linear2db:max(maxGR):meter_group((hbargraph("[1][unit:dB][tooltip: gain reduction in dB]", maxGR, 0))))):attach;
• N: the number of channels of the compressor It uses a strength parameter instead of the traditional ratio, in order to be able to function as a hard limiter. For that you'd need a ratio of infinity:1, and you cannot express that in Faust. Sometimes even bigger ratios are useful: for example a group recording where one instrument is recorded with both a close microphone and a room microphone, and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft. to save CPU we cheat a bit, in a similar way as in the original libs: instead of crosfading between two sets of gain calculators as above, we take the abs of the audio from both the FF and FB, and crossfade between those, and feed that into one set of gain calculators again the strength is much higher when in FB mode, but implemented differently

### (co.)RMS_FBcompressor_peak_limiter_N_chan

N channel RMS feed back compressor into peak limiter feeding back into the FB compressor. By combining them this way, they complement each other optimally: The RMS compressor doesn't have to deal with the peaks, and the peak limiter get's spared from the steady state signal. the feedback part has a much higher strength, so they end up sounding similar RMS_FBcompressor_peak_limiter_N_chan is a standard Faust function.

#### Usage

si.bus(N) : RMS_FBcompressor_peak_limiter_N_chan(strength,thresh,threshLim,att,rel,knee,link,meter,N) : si.bus(N)


Where:

• strength: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression)
• thresh: dB level threshold above which compression kicks in
• threshLim: dB level threshold above which the brick wall limiter kicks in
• att: attack time = time constant (sec) when level & compression going up this is also used as the release time of the limiter
• rel: release time = time constant (sec) coming out of compression
• knee: a gradual increase in gain reduction around the threshold: Below thresh-(knee/2) there is no gain reduction, above thresh+(knee/2) there is the same gain reduction as without a knee, and in between there is a gradual increase in gain reduction. the limiter uses a knee half this size
• link: the amount of linkage between the channels. 0 = each channel is independent, 1 = all channels have the same amount of gain reduction
• meter: a gain reduction meter. It can be implemented like so: meter = <:(, (ba.linear2db:max(maxGR):meter_group((hbargraph("[1][unit:dB][tooltip: gain reduction in dB]", maxGR, 0))))):attach;
• N: the number of channels of the compressor It uses a strength parameter instead of the traditional ratio, in order to be able to function as a hard limiter. For that you'd need a ratio of infinity:1, and you cannot express that in Faust. Sometimes even bigger ratios are useful: for example a group recording where one instrument is recorded with both a close microphone and a room microphone, and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft.

## Original versions section

The functions in this section are largely superseded by the limiters above, but we retain them for backward compatibility and for situations in which a more permissive, MIT-style license is required.

## Functions Reference

### (co.)compressor_lad_mono

Mono dynamic range compressor with lookahead delay. compressor_lad_mono is a standard Faust function.

#### Usage

_ : compressor_lad_mono(lad,ratio,thresh,att,rel) : _


Where:

• lad: lookahead delay in seconds (nonnegative) - gets rounded to nearest sample. The effective attack time is a good setting.
• ratio: compression ratio (1 = no compression, >1 means compression) Ratios: 4 is moderate compression, 8 is strong compression, 12 is mild limiting, and 20 is pretty hard limiting at the threshold.
• thresh: dB level threshold above which compression kicks in (0 dB = max level)
• att: attack time = time constant (sec) when level & compression are going up
• rel: release time = time constant (sec) coming out of compression

### (co.)compressor_mono

Mono dynamic range compressors. compressor_mono is a standard Faust function.

#### Usage

_ : compressor_mono(ratio,thresh,att,rel) : _


Where:

• ratio: compression ratio (1 = no compression, >1 means compression) Ratios: 4 is moderate compression, 8 is strong compression, 12 is mild limiting, and 20 is pretty hard limiting at the threshold.
• thresh: dB level threshold above which compression kicks in (0 dB = max level)
• att: attack time = time constant (sec) when level & compression are going up
• rel: release time = time constant (sec) coming out of compression

### (co.)compressor_stereo

Stereo dynamic range compressors.

#### Usage

_,_ : compressor_stereo(ratio,thresh,att,rel) : _,_


Where:

• ratio: compression ratio (1 = no compression, >1 means compression)
• thresh: dB level threshold above which compression kicks in (0 dB = max level)
• att: attack time = time constant (sec) when level & compression going up
• rel: release time = time constant (sec) coming out of compression

### (co.)compression_gain_mono

Compression-gain calculation for dynamic range compressors.

#### Usage

_ : compression_gain_mono(ratio,thresh,att,rel) : _


Where:

• ratio: compression ratio (1 = no compression, >1 means compression)
• thresh: dB level threshold above which compression kicks in (0 dB = max level)
• att: attack time = time constant (sec) when level & compression going up
• rel: release time = time constant (sec) coming out of compression

### (co.)limiter_1176_R4_mono

A limiter guards against hard-clipping. It can be implemented as a compressor having a high threshold (near the clipping level), fast attack, and high ratio. Since the compression ratio is so high, some knee smoothing is desirable (for softer limiting). This example is intended to get you started using compressors as limiters, so all parameters are hardwired here to nominal values. Ratio: 4 (moderate compression) See compressor_mono() comments for a guide to other choices. Mike Shipley likes this (lowest) setting on the 1176. (Grammy award-winning mixer for Queen, Tom Petty, etc.) Thresh: -6 dB, meaning 4:1 compression begins at amplitude 1/2. Att: 800 MICROseconds (Note: scaled by ratio in the 1176) The 1176 range is said to be 20-800 microseconds. Faster attack gives "more bite" (e.g. on vocals), and makes hard-clipping less likely on fast overloads. Rel: 0.5 s (Note: scaled by ratio in the 1176) The 1176 range is said to be 50-1100 ms. The 1176 also has a "bright, clear eq effect" (use filters.lib if desired). limiter_1176_R4_mono is a standard Faust function.

#### Usage

 _ : limiter_1176_R4_mono : _;


### (co.)limiter_1176_R4_stereo

A limiter guards against hard-clipping. It can be implemented as a compressor having a high threshold (near the clipping level), fast attack and release, and high ratio. Since the ratio is so high, some knee smoothing is desirable ("soft limiting"). This example is intended to get you started using compressor_* as a limiter, so all parameters are hardwired to nominal values here. Ratios: 4 (moderate compression), 8 (severe compression), 12 (mild limiting), or 20 to 1 (hard limiting) Att: 20-800 MICROseconds (Note: scaled by ratio in the 1176) Rel: 50-1100 ms (Note: scaled by ratio in the 1176) Mike Shipley likes 4:1 (Grammy-winning mixer for Queen, Tom Petty, etc.) Faster attack gives "more bite" (e.g. on vocals) He hears a bright, clear eq effect as well (not implemented here)

#### Usage

 _,_ : limiter_1176_R4_stereo : _,_;


### (co.)limiter_lad_N

N-channel lookahead limiter inspired by IOhannes Zmölnig's post, which is in turn based on the thesis by Peter Falkner "Entwicklung eines digitalen Stereo-Limiters mit Hilfe des Signalprozessors DSP56001". This version of the limiter uses a peak-holder with smoothed attack and release based on tau time constant filters.

It is also possible to use a time constant that is 2PItau by dividing the attack and release times by 2*PI. This time constant allows for the amplitude profile to reach 1 - e^(-2pi) of the final peak after the attack time. The input path can be delayed by the same amount as the attack time to synchronise input and amplitude profile, realising a system that is particularly effective as a colourless (ideally) brickwall limiter.

Note that the effectiveness of the ceiling settings are dependent on the other parameters, especially the time constant used for the smoothing filters and the lookahead delay.

Similarly, the colourless characteristics are also dependent on attack, hold, and release times. Since fluctuations above ~15 Hz are perceived as timbral effects, [Vassilakis and Kendall 2010] it is reasonable to set the attack time to 1/15 seconds for a smooth amplitude modulation. On the other hand, the hold time can be set to the peak-to-peak period of the expected lowest frequency in the signal, which allows for minimal distortion of the low frequencies. The release time can then provide a perceptually linear and gradual gain increase determined by the user for any specific application.

The scaling factor for all the channels is determined by the loudest peak between them all, so that amplitude ratios between the signals are kept.

#### Usage

si.bus(N) : limiter_lad_N(N, LD, ceiling, attack, hold, release) :
si.bus(N);


Where:

• N is the number of channels, known at compile-time.
• LD is the lookahead delay in seconds, known at compile-time.
• ceiling is the linear amplitude output limit.
• attack is the attack time in seconds.
• hold is the hold time in seconds.
• release is the release time in seconds.

Example for a stereo limiter: limiter_lad_N(2, .01, 1, .01, .1, 1);

### (co.)limiter_lad_mono

Specialised case of limiter_lad_N: mono limiter.

#### Usage

_ : limiter_lad_mono(LD, ceiling, attack, hold, release) : _;


Where:

• LD is the lookahead delay in seconds, known at compile-time.
• ceiling is the linear amplitude output limit.
• attack is the attack time in seconds.
• hold is the hold time in seconds.
• release is the release time in seconds.

### (co.)limiter_lad_stereo

Specialised case of limiter_lad_N: stereo limiter.

#### Usage

_ , _ : limiter_lad_stereo(LD, ceiling, attack, hold, release) : _ , _;


Where:

• LD is the lookahead delay in seconds, known at compile-time.
• ceiling is the linear amplitude output limit.
• attack is the attack time in seconds.
• hold is the hold time in seconds.
• release is the release time in seconds.

### (co.)limiter_lad_quad

#### Usage

si.bus(4) : limiter_lad_quad(LD, ceiling, attack, hold, release) :
si.bus(4);


Where:

• LD is the lookahead delay in seconds, known at compile-time.
• ceiling is the linear amplitude output limit.
• attack is the attack time in seconds.
• hold is the hold time in seconds.
• release is the release time in seconds.

### (co.)limiter_lad_bw

Specialised case of limiter_lad_N and ready-to-use unit-amplitude mono limiting function. This implementation, in particular, uses 2pi*tau time constant filters for attack and release smoothing with synchronised input and gain signals.

This function's best application is to be used as a brickwall limiter with the least colouring artefacts while keeping a not-so-slow release curve. Tests have shown that, given a pop song with 60 dB of amplification and a 0-dB-ceiling, the loudest peak recorded was ~0.38 dB.

#### Usage

_ : limiter_lad_bw : _;