/* OscNLProc.h */

#ifndef Included_OscNLProc_h
#define Included_OscNLProc_h

/* OscNLProc module depends on */
/* MiscInfo.h */
/* Audit */
/* Debug */
/* Definitions */
/* FixedPoint */
/* NonlinearProcSpec */
/* Memory */
/* WaveTableObject */
/* AlgoWaveTableObject */
/* SampleConsts */
/* FloatingPoint */
/* FastFixedPoint */
/* WaveIndexUtility */
/* EnvelopeState */
/* LFOGenerator */
/* AccentStruct */

#include "FixedPoint.h"
#include "AccentStruct.h"

struct OscNLProcRec;
typedef struct OscNLProcRec OscNLProcRec;

/* flush free list elements */
void							FlushCachedOscNLProcStuff(void);

/* create a new nonlinear processor */
OscNLProcRec*			NewOscNLProcProcessor(struct NonlinProcSpecRec* Template,
										float EnvelopeTicksPerSecond, long SamplingRate,
										struct MainWindowRec* MainWindow, AccentParam* Accents, float HurryUp,
										float InitialFrequency, float FreqForMultisampling,
										long* PreOriginTimeOut, MyBoolean StereoFlag, float InverseVolume);

/* fix up the origin time so that envelopes start at the proper times */
void							OscOscNLProcProcessorFixEnvelopeOrigins(OscNLProcRec* NLProc,
										long ActualPreOriginTime);

/* dispose of the nonlinear processor */
void							DisposeOscNLProcProcessor(OscNLProcRec* NLProc);

/* update nonlinear state with accent information */
void							OscNLProcUpdateEnvelopes(OscNLProcRec* NLProc,
										float OscillatorFrequency);

/* apply nonlinear processing to some stuff */
void							ApplyOscNLProc(largefixedsigned* Data, long NumFrames,
										OscNLProcRec* NLProc);

/* create key-up impulse */
void							OscNLProcKeyUpSustain1(OscNLProcRec* NLProc);
void							OscNLProcKeyUpSustain2(OscNLProcRec* NLProc);
void							OscNLProcKeyUpSustain3(OscNLProcRec* NLProc);

/* retrigger effect envelopes from the origin point */
void							OscNLProcRetriggerEnvelopes(OscNLProcRec* NLProc,
										AccentParam* NewAccents, float NewHurryUp,
										float NewInitialFrequency, MyBoolean ActuallyRetrigger);

#endif
