/* NonlinearProcSpec.h */

#ifndef Included_NonlinearProcSpec_h
#define Included_NonlinearProcSpec_h

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

struct NonlinProcSpecRec;
typedef struct NonlinProcSpecRec NonlinProcSpecRec;

/* forwards */
struct WaveTableObjectRec;
struct AlgoWaveTableObjectRec;

typedef enum
	{
		eNLDataWaveTable EXECUTE(= -12874),
		eNLAlgoWaveTable
	} NLProcWaveType;

/* forwards */
struct EnvelopeRec;
struct LFOListSpecRec;

/* create a new nonlinear processor specifier */
NonlinProcSpecRec*	NewNonlinProcSpecDataWave(struct WaveTableObjectRec* Wave);

/* create a new nonlinear processor specifier */
NonlinProcSpecRec*	NewNonlinProcSpecAlgoWave(struct AlgoWaveTableObjectRec* Wave);

/* dispose of the nonlinear processor specifier */
void								DisposeNonlinProcSpec(NonlinProcSpecRec* NLProc);

/* set various attributes */
void								PutNLProcInputScaling(NonlinProcSpecRec* NLProc, float InputScaling);
void								PutNLProcInputAccent1(NonlinProcSpecRec* NLProc, float InputAccent1);
void								PutNLProcInputAccent2(NonlinProcSpecRec* NLProc, float InputAccent2);
void								PutNLProcInputAccent3(NonlinProcSpecRec* NLProc, float InputAccent3);
void								PutNLProcInputAccent4(NonlinProcSpecRec* NLProc, float InputAccent4);
void								PutNLProcOutputScaling(NonlinProcSpecRec* NLProc, float OutputScaling);
void								PutNLProcOutputAccent1(NonlinProcSpecRec* NLProc, float OutputAccent1);
void								PutNLProcOutputAccent2(NonlinProcSpecRec* NLProc, float OutputAccent2);
void								PutNLProcOutputAccent3(NonlinProcSpecRec* NLProc, float OutputAccent3);
void								PutNLProcOutputAccent4(NonlinProcSpecRec* NLProc, float OutputAccent4);
void								PutNLProcWaveTableIndex(NonlinProcSpecRec* NLProc, float WaveTableIndex);
void								PutNLProcIndexAccent1(NonlinProcSpecRec* NLProc, float IndexAccent1);
void								PutNLProcIndexAccent2(NonlinProcSpecRec* NLProc, float IndexAccent2);
void								PutNLProcIndexAccent3(NonlinProcSpecRec* NLProc, float IndexAccent3);
void								PutNLProcIndexAccent4(NonlinProcSpecRec* NLProc, float IndexAccent4);

/* retrieve various attributes */
float								GetNLProcInputScaling(NonlinProcSpecRec* NLProc);
float								GetNLProcInputAccent1(NonlinProcSpecRec* NLProc);
float								GetNLProcInputAccent2(NonlinProcSpecRec* NLProc);
float								GetNLProcInputAccent3(NonlinProcSpecRec* NLProc);
float								GetNLProcInputAccent4(NonlinProcSpecRec* NLProc);
float								GetNLProcOutputScaling(NonlinProcSpecRec* NLProc);
float								GetNLProcOutputAccent1(NonlinProcSpecRec* NLProc);
float								GetNLProcOutputAccent2(NonlinProcSpecRec* NLProc);
float								GetNLProcOutputAccent3(NonlinProcSpecRec* NLProc);
float								GetNLProcOutputAccent4(NonlinProcSpecRec* NLProc);
float								GetNLProcWaveTableIndex(NonlinProcSpecRec* NLProc);
float								GetNLProcIndexAccent1(NonlinProcSpecRec* NLProc);
float								GetNLProcIndexAccent2(NonlinProcSpecRec* NLProc);
float								GetNLProcIndexAccent3(NonlinProcSpecRec* NLProc);
float								GetNLProcIndexAccent4(NonlinProcSpecRec* NLProc);

/* get the wave type */
NLProcWaveType			GetNLProcSpecWaveType(NonlinProcSpecRec* NLProc);

/* get the algorithmic wave table from the nl proc */
struct AlgoWaveTableObjectRec*	GetNLProcSpecAlgoWaveTable(NonlinProcSpecRec* NLProc);

/* get the data wave table from the nl proc */
struct WaveTableObjectRec*	GetNLProcSpecDataWaveTable(NonlinProcSpecRec* NLProc);

/* get enveloping things */
struct EnvelopeRec*	GetNLProcInputEnvelope(NonlinProcSpecRec* NLProc);
struct EnvelopeRec*	GetNLProcOutputEnvelope(NonlinProcSpecRec* NLProc);
struct EnvelopeRec*	GetNLProcIndexEnvelope(NonlinProcSpecRec* NLProc);
struct LFOListSpecRec*	GetNLProcInputLFO(NonlinProcSpecRec* NLProc);
struct LFOListSpecRec*	GetNLProcOutputLFO(NonlinProcSpecRec* NLProc);
struct LFOListSpecRec*	GetNLProcIndexLFO(NonlinProcSpecRec* NLProc);

#endif
