;*******************************************************************************
;Aleix Riera
;www.fjarre.com/~aleix
;aleix@fjarre.com
;*******************************************************************************
;/////////////////////////////////////////////////////////////////
;CONTROL BUFFERS
;/////////////////////////////////////////////////////////////////
;MODULE: LFOCut
	MOVE	#>ModuleParamX_LFO1Cut,R_X
	MOVE	#>LFOWave,X0
	MOVE	#>LFO_WAVETABLE_SIZE,X1
	MOVE	#>OutLFO1Cut,Y0
	MOVE	Y:Ctrl_Osc0Line1Amp,Y1
	MOVE	Y:Ctrl_Osc0Line1iFreq,A0
	MOVE	Y:Ctrl_Osc0Line1fFreq,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:K1Cut_actual,X0
		MOVE	Y:Ctrl_Addk0Line1K,A
		SUB	X0,A
		TFR	X0,B	A,Y1	#CUTOFF_INC,X0
		MACR	X0,Y1,B
	MOVE	#>ModuleParamX,R_X
	MOVE	#>Ctrl_Addk0Line1In,X0
	MOVE	#>OutK1Cut,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:K1Cut_actual
	BSR	module_addklim
;END MODULE
		
;MODULE: LFORes
	MOVE	#>ModuleParamX_LFO1Res,R_X
	MOVE	#>LFOWave,X0
	MOVE	#>LFO_WAVETABLE_SIZE,X1
	MOVE	#>OutLFO1Res,Y0
	MOVE	Y:Ctrl_Osc1Line1Amp,Y1
	MOVE	Y:Ctrl_Osc1Line1iFreq,A0
	MOVE	Y:Ctrl_Osc1Line1fFreq,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_Addk1Line1In,X0
	MOVE	#>OutK1Res,X1
	MOVE	Y:Ctrl_Addk1Line1K,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_LFO1Pan,R_X
	MOVE	#>LFOWave,X0
	MOVE	#>LFO_WAVETABLE_SIZE,X1
	MOVE	#>OutLFO1Pan,Y0
	MOVE	Y:Ctrl_Osc2Line1Amp,Y1
	MOVE	Y:Ctrl_Osc2Line1iFreq,A0
	MOVE	Y:Ctrl_Osc2Line1fFreq,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_Addk2Line1In,X0
	MOVE	#>OutK1Pan,X1
	MOVE	Y:Ctrl_Addk2Line1K,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
;/////////////////////////////////////////////////////////////////

;MODULE: LPF
	MOVE	#>ModuleParamX_Filt1,R_X
	MOVE	#>InStereoFilter1,X0
	MOVE	#>OutStereoFilter1,X1
	MOVE	#>Ctrl_FilterLine1Cut,Y0
	MOVE	Y:Ctrl_FilterLine1Res,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_FilterLine1Cut_NR),A
	CMP	Y0,A	#>Ctrl_FilterLine1Cut_NR,Y1
	TFR	Y0,A	IFGT
	;MODULE: LPF (without resson)
		MOVE	#>ModuleParamX_Filt1_NR1,R_X
		MOVE	#>InStereoFilter1_NR1,X0
		MOVE	#>OutStereoFilter1_NR1,X1
		MOVE	A,Y:(Ctrl_FilterLine1Cut_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_FilterLine1Cut_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_Filt1_NR2,R_X
		MOVE	#>InStereoFilter1_NR2,X0
		MOVE	#>OutStereoFilter1_NR2,X1
		MOVE	#>Ctrl_FilterLine1Cut_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	#>InStereoHFilter1,X0
		MOVE	#>Ctrl_HFilter1,X1
		MOVE	#>OutStereoHFilter1,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	#>InStereoBFilter1,X0
		MOVE	#>CtrlLP_BFilter1,X1
		MOVE	#>OutStereoBFilter1,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	#>OutStereoBFilter1,X0
		MOVE	#>CtrlHP_BFilter1,X1
		MOVE	#>OutStereoBFilter1,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	#>OutStereo3Mixer1,X0
	MOVE	#>InStereo3Mixer10,X1
	MOVE	Y:Ctrl_3Mixer10,Y0
	MOVE	#>InStereo3Mixer11,Y1
	MOVE	Y:Ctrl_3Mixer11,A0
	MOVE	#>InStereo3Mixer12,A1
	MOVE	Y:Ctrl_3Mixer12,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

;/////////////////////////////////////////////////////////////////
;SATURATOR
;/////////////////////////////////////////////////////////////////

;MODULE: SAT
	MOVE	#>ModuleParamX,R_X
	MOVE	#>InStereoSat1,X0
	MOVE	#>OutStereoSat1,X1
	MOVE	#>SatWave,Y0
	MOVE	#>HALFSAT_WAVETABLE_SIZE,Y1
	MOVE	Y:Ctrl_Sat1,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