/* OscillatorSpecifier.h */

#ifndef Included_OscillatorSpecifier_h
#define Included_OscillatorSpecifier_h

/* OscillatorSpecifier module depends on */
/* MiscInfo.h */
/* Audit */
/* Debug */
/* Definitions */
/* Memory */
/* SampleSelector */
/* ModulationSpecifier */
/* Envelope */
/* LFOListSpecifier */
/* EffectSpecList */

typedef float OscillatorNumType;

/* forwards */
struct SampleSelectorRec;
struct EnvelopeRec;
struct LFOListSpecRec;
struct OscillatorListRec;
struct EffectSpecListRec;

typedef enum
	{
		eOscillatorSampled EXECUTE(= -1229),
		eOscillatorWaveTable
	} OscillatorTypes;

struct OscillatorRec;
typedef struct OscillatorRec OscillatorRec;

/* create a new oscillator structure */
OscillatorRec*						NewOscillatorSpecifier(void);

/* dispose of an oscillator structure */
void											DisposeOscillatorSpecifier(OscillatorRec* Osc);

/* set the oscillator type */
void											OscillatorSetTheType(OscillatorRec* Osc,
														OscillatorTypes WhatKindOfOscillator);

/* find out what kind of oscillator this is */
OscillatorTypes						OscillatorGetWhatKindItIs(OscillatorRec* Osc);

/* get the pitch interval --> sample mapping */
struct SampleSelectorRec*	OscillatorGetSampleIntervalList(OscillatorRec* Osc);

/* get the output loudness of the oscillator */
OscillatorNumType					OscillatorGetOutputLoudness(OscillatorRec* Osc);

/* put a new output loudness in for the oscillator */
void											PutOscillatorNewOutputLoudness(OscillatorRec* Osc,
														double NewOutputLevel);

/* get the frequency multiplier factor */
OscillatorNumType					OscillatorGetFrequencyMultiplier(OscillatorRec* Osc);

/* get the frequency divisor integer */
long											OscillatorGetFrequencyDivisor(OscillatorRec* Osc);

/* get the frequency adder thing */
OscillatorNumType					OscillatorGetFrequencyAdder(OscillatorRec* Osc);

/* change the frequency adjust factors */
void											PutOscillatorNewFrequencyFactors(OscillatorRec* Osc,
														double NewMultipler, long NewDivisor);

/* put a new frequency adder value */
void											PutOscillatorFrequencyAdder(OscillatorRec* Osc,
														double NewAdder);

/* get the loudness envelope for the oscillator */
struct EnvelopeRec*				OscillatorGetLoudnessEnvelope(OscillatorRec* Osc);

/* get the list of LFO oscillators modulating the loudness envelope output */
struct LFOListSpecRec*		OscillatorGetLoudnessLFOList(OscillatorRec* Osc);

/* get the excitation envelope for the oscillator */
struct EnvelopeRec*				OscillatorGetExcitationEnvelope(OscillatorRec* Osc);

/* get the list of LFO oscillators modulating the excitation envelope output */
struct LFOListSpecRec*		OscillatorGetExcitationLFOList(OscillatorRec* Osc);

/* get the stereo bias factor */
OscillatorNumType					OscillatorGetStereoBias(OscillatorRec* Osc);

/* put a new value for the stereo bias factor */
void											OscillatorPutStereoBias(OscillatorRec* Osc,
														OscillatorNumType NewStereoBias);

/* get the surround bias factor */
OscillatorNumType					OscillatorGetSurroundBias(OscillatorRec* Osc);

/* put a new value for the surround bias factor */
void											OscillatorPutSurroundBias(OscillatorRec* Osc,
														OscillatorNumType NewSurroundBias);

/* get the time displacement factor */
OscillatorNumType					OscillatorGetTimeDisplacement(OscillatorRec* Osc);

/* put a new value for the time displacement factor */
void											OscillatorPutTimeDisplacement(OscillatorRec* Osc,
														OscillatorNumType NewTimeDisplacement);

/* get the oscillator's frequency LFO list */
struct LFOListSpecRec*		GetOscillatorFrequencyLFOList(OscillatorRec* Osc);

/* get the effect list for the oscillator */
struct EffectSpecListRec*	GetOscillatorEffectList(OscillatorRec* Osc);

#endif
