/* FilterSpec.h */

#ifndef Included_FilterSpec_h
#define Included_FilterSpec_h

/* FilterSpec module depends on */
/* MiscInfo.h */
/* Audit */
/* Debug */
/* Definitions */
/* Memory */
/* Array */
/* LFOListSpecifier */
/* Envelope */

struct FilterSpecRec;
typedef struct FilterSpecRec FilterSpecRec;

struct OneFilterRec;
typedef struct OneFilterRec OneFilterRec;

/* types of filters */
typedef enum
	{
		eFilterNull EXECUTE(= -2341),
		eFilterFirstOrderLowpass,
		eFilterFirstOrderHighpass,
		eFilterSecondOrderResonant,
		eFilterSecondOrderZero,
		eFilterButterworthLowpass,
		eFilterButterworthHighpass,
		eFilterButterworthBandpass,
		eFilterButterworthBandreject,
		eFilterParametricEQ,
		eFilterResonantLowpass
	} FilterTypes;

/* signal normalization options */
typedef enum
	{
		eFilterDefaultScaling EXECUTE(= -5132),
		eFilterResonMidbandGain1,
		eFilterResonNoiseGain1,
		eFilterZeroGain1
	} FilterScalings;

/* filter channels */
typedef enum
	{
		eFilterLeft EXECUTE(= 12435),
		eFilterRight,
		eFilterBoth
	} FilterChannels;

/* forwards */
struct EnvelopeRec;
struct LFOListSpecRec;

/* create a new parallel filter specification */
FilterSpecRec*		NewFilterSpec(void);

/* dispose of a filter specification */
void							DisposeFilterSpec(FilterSpecRec* Filter);

/* add a single filter to the list */
MyBoolean					AppendFilterToSpec(FilterSpecRec* Filter, OneFilterRec* Spec);

/* get the number of filters */
long							GetNumFiltersInSpec(FilterSpecRec* Filter);

/* get a filter type for the specified filter spec */
FilterTypes				GetFilterType(FilterSpecRec* Filter, long Index);

/* get which channel to apply a filter to */
FilterChannels		GetFilterChannel(FilterSpecRec* Filter, long Index);

/* get the cutoff frequency for a filter */
float							GetFilterCutoff(FilterSpecRec* Filter, long Index);
float							GetFilterCutoffAccent1(FilterSpecRec* Filter, long Index);
float							GetFilterCutoffAccent2(FilterSpecRec* Filter, long Index);
float							GetFilterCutoffAccent3(FilterSpecRec* Filter, long Index);
float							GetFilterCutoffAccent4(FilterSpecRec* Filter, long Index);

/* get the filter bandwidth */
float							GetFilterBandwidth(FilterSpecRec* Filter, long Index);
float							GetFilterBandwidthAccent1(FilterSpecRec* Filter, long Index);
float							GetFilterBandwidthAccent2(FilterSpecRec* Filter, long Index);
float							GetFilterBandwidthAccent3(FilterSpecRec* Filter, long Index);
float							GetFilterBandwidthAccent4(FilterSpecRec* Filter, long Index);

/* get filter scaling mode */
FilterScalings		GetFilterScalingMode(FilterSpecRec* Filter, long Index);

/* get filter output multiplier */
float							GetFilterOutputMultiplier(FilterSpecRec* Filter, long Index);
float							GetFilterOutputMultiplierAccent1(FilterSpecRec* Filter, long Index);
float							GetFilterOutputMultiplierAccent2(FilterSpecRec* Filter, long Index);
float							GetFilterOutputMultiplierAccent3(FilterSpecRec* Filter, long Index);
float							GetFilterOutputMultiplierAccent4(FilterSpecRec* Filter, long Index);

/* get filter gain */
float							GetFilterGain(FilterSpecRec* Filter, long Index);
float							GetFilterGainAccent1(FilterSpecRec* Filter, long Index);
float							GetFilterGainAccent2(FilterSpecRec* Filter, long Index);
float							GetFilterGainAccent3(FilterSpecRec* Filter, long Index);
float							GetFilterGainAccent4(FilterSpecRec* Filter, long Index);

/* get envelope things */
struct EnvelopeRec*	GetFilterCutoffEnvelope(FilterSpecRec* Filter, long Index);
struct EnvelopeRec*	GetFilterBandwidthEnvelope(FilterSpecRec* Filter, long Index);
struct EnvelopeRec*	GetFilterOutputEnvelope(FilterSpecRec* Filter, long Index);
struct EnvelopeRec*	GetFilterGainEnvelope(FilterSpecRec* Filter, long Index);
struct LFOListSpecRec*	GetFilterCutoffLFO(FilterSpecRec* Filter, long Index);
struct LFOListSpecRec*	GetFilterBandwidthLFO(FilterSpecRec* Filter, long Index);
struct LFOListSpecRec*	GetFilterOutputLFO(FilterSpecRec* Filter, long Index);
struct LFOListSpecRec*	GetFilterGainLFO(FilterSpecRec* Filter, long Index);

/* get resonant lowpass filter parameters */
long							GetFilterLowpassOrder(FilterSpecRec* Filter, long Index);
long							GetFilterBandpassOrder(FilterSpecRec* Filter, long Index);

/* get a filter specification record */
OneFilterRec*			GetSingleFilterSpec(FilterSpecRec* Filter, long Index);

/* create a new filter specification record */
OneFilterRec*			NewSingleFilterSpec(FilterTypes FilterType);

/* dispose of a single filter specification record */
void							DisposeSingleFilterSpec(OneFilterRec* Spec);

/* set filter cutoff value */
void							SetSingleFilterCutoff(OneFilterRec* Spec, float Cutoff);
void							SetSingleFilterCutoffAccent1(OneFilterRec* Spec, float Accent1);
void							SetSingleFilterCutoffAccent2(OneFilterRec* Spec, float Accent2);
void							SetSingleFilterCutoffAccent3(OneFilterRec* Spec, float Accent3);
void							SetSingleFilterCutoffAccent4(OneFilterRec* Spec, float Accent4);

/* set filter bandwidth value */
void							SetSingleFilterBandwidth(OneFilterRec* Spec, float Bandwidth);
void							SetSingleFilterBandwidthAccent1(OneFilterRec* Spec, float Accent1);
void							SetSingleFilterBandwidthAccent2(OneFilterRec* Spec, float Accent2);
void							SetSingleFilterBandwidthAccent3(OneFilterRec* Spec, float Accent3);
void							SetSingleFilterBandwidthAccent4(OneFilterRec* Spec, float Accent4);

/* set filter scaling mode */
void							SetSingleFilterScalingMode(OneFilterRec* Spec, FilterScalings Scaling);

/* set filter channel */
void							SetSingleFilterChannel(OneFilterRec* Spec, FilterChannels Channel);

/* set filter output multiplier */
void							SetSingleFilterOutputMultiplier(OneFilterRec* Spec, float Output);
void							SetSingleFilterOutputMultiplierAccent1(OneFilterRec* Spec, float Accent1);
void							SetSingleFilterOutputMultiplierAccent2(OneFilterRec* Spec, float Accent2);
void							SetSingleFilterOutputMultiplierAccent3(OneFilterRec* Spec, float Accent3);
void							SetSingleFilterOutputMultiplierAccent4(OneFilterRec* Spec, float Accent4);

/* set filter gain value */
void							SetSingleFilterGain(OneFilterRec* Spec, float Gain);
void							SetSingleFilterGainAccent1(OneFilterRec* Spec, float Accent1);
void							SetSingleFilterGainAccent2(OneFilterRec* Spec, float Accent2);
void							SetSingleFilterGainAccent3(OneFilterRec* Spec, float Accent3);
void							SetSingleFilterGainAccent4(OneFilterRec* Spec, float Accent4);

/* set resonant lowpass filter parameters */
void							SetFilterLowpassOrder(OneFilterRec* Spec, long Order);
void							SetFilterBandpassOrder(OneFilterRec* Spec, long Order);

#endif
