;*******************************************************************************
;Aleix Riera
;www.fjarre.com/~aleix
;aleix@fjarre.com
;*******************************************************************************
;/////////////////////////////////////////////////////////////////
;CONTROL BUFFERS
;/////////////////////////////////////////////////////////////////
;MODULE: LFOCut
	MOVE	#>ModuleParamX_LFO0Cut,R_X
	MOVE	#>LFOWave,X0
	MOVE	#>LFO_WAVETABLE_SIZE,X1
	MOVE	#>OutLFO0Cut,Y0
	MOVE	Y:Ctrl_Osc0Line0Amp,Y1
	MOVE	Y:Ctrl_Osc0Line0iFreq,A0
	MOVE	Y:Ctrl_Osc0Line0fFreq,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:K0Cut_actual,X0
		MOVE	Y:Ctrl_Addk0Line0K,A
		SUB	X0,A
		TFR	X0,B	A,Y1	#CUTOFF_INC,X0
		MACR	X0,Y1,B
	MOVE	#>ModuleParamX,R_X
	MOVE	#>Ctrl_Addk0Line0In,X0
	MOVE	#>OutK0Cut,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:K0Cut_actual
	BSR	module_addklim
;END MODULE
	
;MODULE: LFORes
	MOVE	#>ModuleParamX_LFO0Res,R_X
	MOVE	#>LFOWave,X0
	MOVE	#>LFO_WAVETABLE_SIZE,X1
	MOVE	#>OutLFO0Res,Y0
	MOVE	Y:Ctrl_Osc1Line0Amp,Y1
	MOVE	Y:Ctrl_Osc1Line0iFreq,A0
	MOVE	Y:Ctrl_Osc1Line0fFreq,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_Addk1Line0In,X0
	MOVE	#>OutK0Res,X1
	MOVE	Y:Ctrl_Addk1Line0K,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_LFO0Pan,R_X
	MOVE	#>LFOWave,X0
	MOVE	#>LFO_WAVETABLE_SIZE,X1
	MOVE	#>OutLFO0Pan,Y0
	MOVE	Y:Ctrl_Osc2Line0Amp,Y1
	MOVE	Y:Ctrl_Osc2Line0iFreq,A0
	MOVE	Y:Ctrl_Osc2Line0fFreq,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_Addk2Line0In,X0
	MOVE	#>OutK0Pan,X1
	MOVE	Y:Ctrl_Addk2Line0K,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
;/////////////////////////////////////////////////////////////////

;END MODULE;MODULE: LPF
	MOVE	#>InStereoFilter0,R1
	MOVE	#>OutStereoFilter0,R5
	MOVE	#>Ctrl_FilterLine0Cut,R2
	MOVE	#>ModuleParamX_Filt0,R_X
	MOVE	Y:Ctrl_FilterLine0Res,Y1	;1st element
	MOVE	R1,X:(R_X)
	MOVE	R5,X:(R_X+1)
	MOVE	R2,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 ===
	;avoiding cut off values greater than
	;#COMP_NOTCH_BANDWIDTH (if they are, the
	;NonRessonance LPF wouldn't allow
	;the signal pass when subtracting in BPF)
	;UPDATING: 'Ctrl_Filter..Cut_NR'
	MOVE	#COMP_NOTCH_BANDWIDTH,Y0
	MOVE	Y:(Ctrl_FilterLine0Cut_NR),A
	CMP	Y0,A	#>Ctrl_FilterLine0Cut_NR,Y1
	TFR	Y0,A	IFGT
	;MODULE: LPF (without resson)
		MOVE	#>ModuleParamX_Filt0_NR1,R_X
		MOVE	#>InStereoFilter0_NR1,X0
		MOVE	#>OutStereoFilter0_NR1,X1
		MOVE	A,Y:(Ctrl_FilterLine0Cut_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_FilterLine0Cut_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_Filt0_NR2,R_X
		MOVE	#>InStereoFilter0_NR2,X0
		MOVE	#>OutStereoFilter0_NR2,X1
		MOVE	#>Ctrl_FilterLine0Cut_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===
	;(subtracting LP components)
	;MODULE: SUB
		MOVE	#>ModuleParamX,R_X
		MOVE	#>InStereoHFilter0,X0
		MOVE	#>Ctrl_HFilter0,X1
		MOVE	#>OutStereoHFilter0,Y0
		MOVE	X0,X:(R_X)
		MOVE	X1,X:(R_X+1)
		MOVE	Y0,X:(R_X+2)
		BSR	module_sub
	;END MODULE
;======

;===BPF===
	;(subtracting LP and HP components)
	;MODULE: SUB
		MOVE	#>ModuleParamX,R_X
		MOVE	#>InStereoBFilter0,X0
		MOVE	#>CtrlLP_BFilter0,X1
		MOVE	#>OutStereoBFilter0,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	#>OutStereoBFilter0,X0
		MOVE	#>CtrlHP_BFilter0,X1
		MOVE	#>OutStereoBFilter0,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	#>OutStereo3Mixer0,X0
	MOVE	#>InStereo3Mixer00,X1
	MOVE	Y:Ctrl_3Mixer00,Y0
	MOVE	#>InStereo3Mixer01,Y1
	MOVE	Y:Ctrl_3Mixer01,A0
	MOVE	#>InStereo3Mixer02,A1
	MOVE	Y:Ctrl_3Mixer02,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	#>InStereoSat0,X0
	MOVE	#>OutStereoSat0,X1
	MOVE	#>SatWave,Y0
	MOVE	#>HALFSAT_WAVETABLE_SIZE,Y1	
	MOVE	Y:Ctrl_Sat0,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