;*******************************************************************************
;Aleix Riera
;www.fjarre.com/~aleix
;aleix@fjarre.com
;*******************************************************************************
;/////////////////////////////////////////////////////////////////
;CONTROL BUFFERS
;/////////////////////////////////////////////////////////////////
;MODULE: LFOCut
	MOVE	#>ModuleParamX_LFO2Cut,R_X
	MOVE	#>LFOWave,X0
	MOVE	#>LFO_WAVETABLE_SIZE,X1
	MOVE	#>OutLFO2Cut,Y0
	MOVE	Y:Ctrl_Osc0Line2Amp,Y1
	MOVE	Y:Ctrl_Osc0Line2iFreq,A0
	MOVE	Y:Ctrl_Osc0Line2fFreq,A1
	MOVE	X0,X:(R_X)
	MOVE	X1,X:(R_X+1)
	MOVE	Y0,X:(R_X+2)
	MOVE	Y1,X:(R_X+3)
	MOVE	A0,X:(R_X+4)
	MOVE	A1,X:(R_X+5)
	BSR	module_osc
;END MODULE
		
;MODULE: ADDKCut
		;Making interpolation	0.95
		;actual+=(ctrl-actual)*inc
		MOVE	Y:K2Cut_actual,X0
		MOVE	Y:Ctrl_Addk0Line2K,A
		SUB	X0,A
		TFR	X0,B	A,Y1	#CUTOFF_INC,X0
		MACR	X0,Y1,B
	MOVE	#>ModuleParamX,R_X
	MOVE	#>Ctrl_Addk0Line2In,X0
	MOVE	#>OutK2Cut,X1
	MOVE	#MIN_CUTOFF,Y1
	MOVE	X0,X:(R_X)
	MOVE	X1,X:(R_X+1)
	MOVE	B,X:(R_X+2)
	MOVE	Y1,X:(R_X+3)
	MOVE			B,Y:K2Cut_actual
	BSR	module_addklim
;END MODULE
		
;MODULE: LFORes
	MOVE	#>ModuleParamX_LFO2Res,R_X
	MOVE	#>LFOWave,X0
	MOVE	#>LFO_WAVETABLE_SIZE,X1
	MOVE	#>OutLFO2Res,Y0
	MOVE	Y:Ctrl_Osc1Line2Amp,Y1
	MOVE	Y:Ctrl_Osc1Line2iFreq,A0
	MOVE	Y:Ctrl_Osc1Line2fFreq,A1
	MOVE	X0,X:(R_X)
	MOVE	X1,X:(R_X+1)
	MOVE	Y0,X:(R_X+2)
	MOVE	Y1,X:(R_X+3)
	MOVE	A0,X:(R_X+4)
	MOVE	A1,X:(R_X+5)
	BSR	module_osc
;END MODULE
		
;MODULE: ADDKRes
	MOVE	#>ModuleParamX,R_X
	MOVE	#>Ctrl_Addk1Line2In,X0
	MOVE	#>OutK2Res,X1
	MOVE	Y:Ctrl_Addk1Line2K,Y0
	MOVE	#MIN_RES,Y1
	MOVE	X0,X:(R_X)
	MOVE	X1,X:(R_X+1)
	MOVE	Y0,X:(R_X+2)
	MOVE	Y1,X:(R_X+3)
	BSR	module_addklim
;END MODULE
	
;MODULE: LFOPan
	MOVE	#>ModuleParamX_LFO2Pan,R_X
	MOVE	#>LFOWave,X0
	MOVE	#>LFO_WAVETABLE_SIZE,X1
	MOVE	#>OutLFO2Pan,Y0
	MOVE	Y:Ctrl_Osc2Line2Amp,Y1
	MOVE	Y:Ctrl_Osc2Line2iFreq,A0
	MOVE	Y:Ctrl_Osc2Line2fFreq,A1
	MOVE	X0,X:(R_X)
	MOVE	X1,X:(R_X+1)
	MOVE	Y0,X:(R_X+2)
	MOVE	Y1,X:(R_X+3)
	MOVE	A0,X:(R_X+4)
	MOVE	A1,X:(R_X+5)
	BSR	module_osc
;END MODULE
		
;MODULE: ADDKPan
	MOVE	#>ModuleParamX,R_X
	MOVE	#>Ctrl_Addk2Line2In,X0
	MOVE	#>OutK2Pan,X1
	MOVE	Y:Ctrl_Addk2Line2K,Y0
	MOVE	#MIN_PAN,Y1
	MOVE	X0,X:(R_X)
	MOVE	X1,X:(R_X+1)
	MOVE	Y0,X:(R_X+2)
	MOVE	Y1,X:(R_X+3)
	BSR	module_addklim
;END MODULE

;/////////////////////////////////////////////////////////////////
;AUDIO BUFFERS
;/////////////////////////////////////////////////////////////////

;/////////////////////////////////////////////////////////////////
;SATURATOR
;/////////////////////////////////////////////////////////////////

;MODULE: SAT
	MOVE	#>ModuleParamX,R_X
	MOVE	#>InStereoSat2,X0
	MOVE	#>OutStereoSat2,X1
	MOVE	#>SatWave,Y0
	MOVE	#>HALFSAT_WAVETABLE_SIZE,Y1
	MOVE	Y:Ctrl_Sat2,A0
	MOVE	X0,X:(R_X)
	MOVE	X1,X:(R_X+1)
	MOVE	Y0,X:(R_X+2)
	MOVE	Y1,X:(R_X+3)
	MOVE	A0,X:(R_X+4)
	BSR	module_sat
;END MODULE

;MODULE: LPF
	MOVE	#>ModuleParamX_Filt2,R_X
	MOVE	#>InStereoFilter2,X0
	MOVE	#>OutStereoFilter2,X1
	MOVE	#>Ctrl_FilterLine2Cut,Y0
	MOVE	Y:Ctrl_FilterLine2Res,Y1	;1st element
	MOVE	X0,X:(R_X)
	MOVE	X1,X:(R_X+1)
	MOVE	Y0,X:(R_X+2)
	MOVE	Y1,X:(R_X+3)
	MOVE	Y1,X:(R_X+12)
	BSR	module_filter
;END MODULE

;===HPF & BPF Previous operations ===
	MOVE	#COMP_NOTCH_BANDWIDTH,Y0
	MOVE	Y:(Ctrl_FilterLine2Cut_NR),A
	CMP	Y0,A	#>Ctrl_FilterLine2Cut_NR,Y1
	TFR	Y0,A	IFGT
	;MODULE: LPF (without resson)
		MOVE	#>ModuleParamX_Filt2_NR1,R_X
		MOVE	#>InStereoFilter2_NR1,X0
		MOVE	#>OutStereoFilter2_NR1,X1
		MOVE	A,Y:(Ctrl_FilterLine2Cut_NR)
		MOVE	X0,X:(R_X)
		MOVE	X1,X:(R_X+1)
		MOVE	Y1,X:(R_X+2)
		MOVE	#ZERO,Y1
		MOVE	Y1,X:(R_X+3)
		MOVE	Y1,X:(R_X+12)
		BSR	module_filter
	;END MODULE

		;adding constant to cut off in order to
		;take a margin (notch) for BPF substracting
		;MODULE ADDK
		MOVE	#>ModuleParamX,R_X
		MOVE	#>Ctrl_FilterLine2Cut_NR,X0
		MOVE	#NOTCH_BANDWIDTH,X1
		MOVE	X0,X:(R_X)
		MOVE	X0,X:(R_X+1)
		MOVE	X1,X:(R_X+2)
		BSR	module_addk
		;END MODULE
	
	;MODULE: LPF (without resson)
		MOVE	#>ModuleParamX_Filt2_NR2,R_X
		MOVE	#>InStereoFilter2_NR2,X0
		MOVE	#>OutStereoFilter2_NR2,X1
		MOVE	#>Ctrl_FilterLine2Cut_NR,Y0
		MOVE	#ZERO,Y1
		MOVE	X0,X:(R_X)
		MOVE	X1,X:(R_X+1)
		MOVE	Y0,X:(R_X+2)
		MOVE	Y1,X:(R_X+3)
		MOVE	Y1,X:(R_X+12)
		BSR	module_filter
	;END MODULE
	
;===END PREVIOUS OPERATIONS===

;===HPF===
	;MODULE: SUB
		MOVE	#>ModuleParamX,R_X
		MOVE	#>InStereoHFilter2,X0
		MOVE	#>Ctrl_HFilter2,X1
		MOVE	#>OutStereoHFilter2,Y0
		MOVE	X0,X:(R_X)
		MOVE	X1,X:(R_X+1)
		MOVE	Y0,X:(R_X+2)
		BSR	module_sub
	;END MODULE
;======

;===BPF===
	;MODULE: SUB
		MOVE	#>ModuleParamX,R_X
		MOVE	#>InStereoBFilter2,X0
		MOVE	#>CtrlLP_BFilter2,X1
		MOVE	#>OutStereoBFilter2,Y0
		MOVE	X0,X:(R_X)
		MOVE	X1,X:(R_X+1)
		MOVE	Y0,X:(R_X+2)
		BSR	module_sub
	;END MODULE
	;MODULE: SUB
		MOVE	#>ModuleParamX,R_X
		MOVE	#>OutStereoBFilter2,X0
		MOVE	#>CtrlHP_BFilter2,X1
		MOVE	#>OutStereoBFilter2,Y0
		MOVE	X0,X:(R_X)
		MOVE	X1,X:(R_X+1)
		MOVE	Y0,X:(R_X+2)
		BSR	module_sub
	;END MODULE
;======

;/////////////////////////////////////////////////////////////////
;MIXING FILTERS
;/////////////////////////////////////////////////////////////////

;MODULE: 3MIXER
	MOVE	#>ModuleParamX,R_X
	MOVE	#>OutStereo3Mixer2,X0
	MOVE	#>InStereo3Mixer20,X1
	MOVE	Y:Ctrl_3Mixer20,Y0
	MOVE	#>InStereo3Mixer21,Y1
	MOVE	Y:Ctrl_3Mixer21,A0
	MOVE	#>InStereo3Mixer22,A1
	MOVE	Y:Ctrl_3Mixer22,B0
	MOVE	X0,X:(R_X)
	MOVE	X1,X:(R_X+1)
	MOVE	Y0,X:(R_X+2)
	MOVE	Y1,X:(R_X+3)
	MOVE	A0,X:(R_X+4)
	MOVE	A1,X:(R_X+5)
	MOVE	B0,X:(R_X+6)
	BSR	module_3mixer
;END MODULE
