Skip to content

Instantly share code, notes, and snippets.

@jsawruk
Created September 17, 2012 12:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jsawruk/3737091 to your computer and use it in GitHub Desktop.
Save jsawruk/3737091 to your computer and use it in GitHub Desktop.
Audio Compressor (Actionscript)
package
{
import flash.utils.ByteArray;
public class Compressor
{
private var attackTime:Number = 0.001;
private var releaseTime:Number = 0.130;
private var slope:Number = 0.5;
private var thresh:Number = -0.1;
private var peak:Number = 0;
private var peakPrev:Number = 0;
private var attackTimeParameter:Number = 0;
private var releaseTimeParameter:Number = 0;
private var sampleRate:int = 44100;
private var gain:Number;
private var gainExp:Number;
public function Compressor()
{
var nyquistFrequency:Number = this.sampleRate / 2;
this.attackTimeParameter = 1 - Math.exp(-2.2 / (nyquistFrequency * attackTime));
this.releaseTimeParameter = 1 - Math.exp(-2.2 / (nyquistFrequency * releaseTime));
}
public function log10(x:Number):Number {
return (Math.log(x) / Math.LN10);
}
public function process(data:ByteArray):ByteArray {
var returnData:ByteArray = new ByteArray();
while (data.bytesAvailable > 0)
{
var sample:Number = data.readFloat();
// Running sum peak amplitude - based on Zoelzer (7.10)
peak = ((1 - attackTimeParameter - releaseTimeParameter) * peakPrev) + (attackTimeParameter * Math.abs(sample));
peakPrev = peak;
var out:Number = sample;
if(peak > Math.abs(thresh)) {
// Exceeds threshold, so apply effect
if(thresh < 0) {
// Compressor
gainExp = log10(peak) - log10(Math.abs(thresh));
gainExp = gainExp * -1 * slope;
gain = Math.pow(10, gainExp);
// Saturation
out = gain * sample;
if(Math.abs(out) > 1.0) {
if(out < 0) {
out = -1;
}
else {
out = 1;
}
}
}
}
returnData.writeFloat(out);
//returnData.writeFloat(0.5 * level);
}
returnData.position = 0;
return returnData;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment