<info>
Compressor/Limiter/Expander/Gate
Stereo-Mono  
Signal flow:
gain -> expander -> compressor -> limiter -> noise gate-> gain
 
Alexandre Burton, 1995
</info>
<tk_interface>
cfilein source
cslider		 compthresh 			-rel lin 		-u db  		-o v	-co palegreen4 	-res  .1 		-mi .5 		-ma 100 	 	-i 80
cslider	  compratio					-rel lin		-u :1 	 	-o v 	-co palegreen3 		-res  1 		-mi .1 		-ma 60 		-i 2
cslider		 expthresh				-rel lin		-u db 	 	-o v	-co orangered3 	-res  .1 		-mi .1 		-ma 	100 	-i 80
cslider		 expratio 				-rel lin		-u :1 	 	-o v 	-co orangered2 	-res  .5 		-mi .5 		-ma 10 		-i 1
cslider		 limitthresh 			-rel lin		-u db 	 	-o v 	-co blue3 	-res  .1 		-mi .10 		-ma 100 		-i 100
cslider		 gatethresh				-rel lin		-u db 	 	-o v	-co blue2 	-res  .1	 	-mi .0 		-ma 100 		-i 0
cslider		 slewrate				-rel lin	  -u s   	  	-o v 		-res  .001 		-mi .0 		-ma 1 		-i .001
cslider  	ingain					-rel lin		-u x 		-o h 		-res  .01 		-mi .01 		-ma 8 		-i 1
ctoggle loop -label loop -init 0
cslider		 outgain				-rel lin 		-u x   	 	-o h 		-res  .01 		-mi  .01 		-ma  20		-i 1
cslider total_time 						-unit s -ori h -min 1 -res .01 -max 300 -init 30
</tk_interface>
<mono>
instr 1 

kexpthresh 			= 		gkgatethresh
kcompthresh 			= 		gkcompthresh
kcompratio 			= 		gkcompratio
kexpratio 			= 		gkexpratio
kingain 			= 		gkingain
klimitthresh 			= 		gklimitthresh
kgatethresh 			= 		gkgatethresh
koutgain 			= 		gkoutgain

asig1   			diskin	 		"[source]", 1,[offsource],iloop


kpre1 	rms 	asig1	* kingain
kpre1 	= 	dbamp(kpre1)
kpre1 	= 	(kpre1 < 0 ? 0 : kpre1)	
kpeak 	=	kpre1
	
	
if (kpeak < kexpthresh) goto compress
	kexpa 	=	(kexpratio - 1) * (kpeak - kexpthresh)
	alim1 	=	ampdb(kpre1 + kexpa)	
	kpre1 	rms 	alim1	
	kpre1	= 	dbamp(kpre1)
	kpre1 	= 	(kpre1 < 0 ? 0 : kpre1)	
	kpeak 	=	kpre1 
compress:	
if (kpeak < kcompthresh) goto limit
	kcomp 	= 	((kcompratio - 1) / kcompratio) * (kpeak - kcompthresh)	
	alim1 	=	ampdb(kpre1 - kcomp)	
	kpre1 	rms 	alim1	
	kpre1 	= 	dbamp(kpre1)
	kpre1 	= 	(kpre1 < 0 ? 0 : kpre1)	
	kpeak 	=	kpre1
limit:
if (kpeak < klimitthresh) goto gate
	alim1 	=	ampdb(klimitthresh)	
	goto ok
gate:
if (kpeak > kgatethresh) goto ok
	alim1 	=	ampdb(0)
ok:

klim1 	rms 	alim1					
klim1 	portk 	klim1, gkslewrate/2	 

asig1	gain 	asig1, klim1		
asig1 	= 	asig1 * koutgain		
			
out 	asig1	
		endin
</mono>
<stereo>
instr 1 

kexpthresh 			= 		gkgatethresh
kcompthresh 			= 		gkcompthresh
kcompratio 			= 		gkcompratio
kexpratio 			= 		gkexpratio
kingain 			= 		gkingain
klimitthresh 			= 		gklimitthresh
kgatethresh 			= 		gkgatethresh
koutgain 			= 		gkoutgain
iloop		=		i(gkloop)

asig1, asig2   			diskin	 		"[source]", 1,[offsource],iloop


kpre1 	rms 	asig1	* kingain
kpre2 	rms 	asig2	* kingain
kpre1 	= 	dbamp(kpre1)
kpre2 	= 	dbamp(kpre2)	
kpre1 	= 	(kpre1 < 0 ? 0 : kpre1)	
kpre2 	= 	(kpre2 < 0 ? 0 : kpre2)		
kpeak 	=	(kpre1 > kpre2 ? kpre1 : kpre2)	
	
	
if (kpeak < kexpthresh) goto compress
	kexpa 	=	(kexpratio - 1) * (kpeak - kexpthresh)
	alim1 	=	ampdb(kpre1 + kexpa)	
	alim2 	=	ampdb(kpre2 + kexpa)
	kpre1 	rms 	alim1	
	kpre2 	rms 	alim2		
	kpre1	= 	dbamp(kpre1)
	kpre2 	= 	dbamp(kpre2)	
	kpre1 	= 	(kpre1 < 0 ? 0 : kpre1)	
	kpre2 	= 	(kpre2 < 0 ? 0 : kpre2)		
	kpeak 	=	(kpre1 > kpre2 ? kpre1 : kpre2)	
compress:	
if (kpeak < kcompthresh) goto limit
	kcomp 	= 	((kcompratio - 1) / kcompratio) * (kpeak - kcompthresh)	
	alim1 	=	ampdb(kpre1 - kcomp)	
	alim2 	=	ampdb(kpre2 - kcomp)
	kpre1 	rms 	alim1	
	kpre2 	rms 	alim2		
	kpre1 	= 	dbamp(kpre1)
	kpre2 	= 	dbamp(kpre2)	
	kpre1 	= 	(kpre1 < 0 ? 0 : kpre1)	
	kpre2 	= 	(kpre2 < 0 ? 0 : kpre2)		
	kpeak 	=	(kpre1 > kpre2 ? kpre1 : kpre2)	
limit:
if (kpeak < klimitthresh) goto gate
	alim1 	=	ampdb(klimitthresh)	
	alim2 	=	ampdb(klimitthresh)
	goto ok
gate:
if (kpeak > kgatethresh) goto ok
	alim1 	=	ampdb(0)
	alim2 	=	ampdb(0)
ok:

klim1 	rms 	alim1					
klim2 	rms 	alim2				
klim1 	portk 	klim1, gkslewrate/2	 
klim2 	portk 	klim2, gkslewrate	/2

asig1	gain 	asig1, klim1		
asig2	gain 	asig2, klim2		
asig1 	= 	asig1 * koutgain		
asig2 	= 	asig2 * koutgain	
			
outs 	asig1, asig2	
		endin
</stereo>
<quad>

</quad>
<score>
#min
</score>
