/* BuildInstrument.h */

#ifndef Included_BuildInstrument_h
#define Included_BuildInstrument_h

/* BuildInstrument module depends on */
/* MiscInfo.h */
/* Audit */
/* Debug */
/* Definitions */
/* BuildInstrument2 */
/* CompilerScanner */
/* TrashTracker */
/* InstrumentStructure */
/* Memory */
/* EffectSpecList */

/* syntax errors */
typedef enum
	{
		eBuildInstrNoError EXECUTE(= -17736),
		eBuildInstrOutOfMemory,
		eBuildInstrUnexpectedInput,
		eBuildInstrExpectedInstrument,
		eBuildInstrExpectedOpenParen,
		eBuildInstrExpectedCloseParen,
		eBuildInstrSomeRequiredInstrParamsMissing,
		eBuildInstrExpectedSemicolon,
		eBuildInstrExpectedInstrumentMember,
		eBuildInstrMultipleInstrLoudness,
		eBuildInstrSomeRequiredLFOParamsMissing,
		eBuildInstrSomeRequiredOscillatorParamsMissing,
		eBuildInstrExpectedNumber,
		eBuildInstrExpectedStringOrIdentifier,
		eBuildInstrExpectedLFOMember,
		eBuildInstrMultipleLFOFreqEnvelope,
		eBuildInstrSomeRequiredEnvelopeParamsMissing,
		eBuildInstrMultipleLFOAmpEnvelope,
		eBuildInstrMultipleLFOOscillatorType,
		eBuildInstrExpectedLFOOscillatorType,
		eBuildInstrMultipleLFOModulationType,
		eBuildInstrMultipleLFOAddingMode,
		eBuildInstrExpectedLFOModulationType,
		eBuildInstrExpectedOscillatorMember,
		eBuildInstrMultipleOscType,
		eBuildInstrMultipleOscSampleList,
		eBuildInstrMultipleOscLoudness,
		eBuildInstrMultipleOscFreqMultiplier,
		eBuildInstrMultipleOscFreqDivisor,
		eBuildInstrMultipleOscLoudnessEnvelope,
		eBuildInstrMultipleOscIndexEnvelope,
		eBuildInstrExpectedOscType,
		eBuildInstrExpectedInteger,
		eBuildInstrExpectedEnvelopeMember,
		eBuildInstrMultipleEnvTotalScaling,
		eBuildInstrMultipleEnvPoints,
		eBuildInstrExpectedDelayOrOrigin,
		eBuildInstrExpectedLevelOrScale,
		eBuildInstrExpectedEnvPointMember,
		eBuildInstrExpectedIntBetween1And3,
		eBuildInstrEnvSustainPointAlreadyDefined,
		eBuildInstrMultipleEnvPointAmpAccent1,
		eBuildInstrMultipleEnvPointAmpAccent2,
		eBuildInstrMultipleEnvPointAmpAccent3,
		eBuildInstrMultipleEnvPointAmpAccent4,
		eBuildInstrMultipleEnvPointAmpAccent5,
		eBuildInstrMultipleEnvPointAmpAccent6,
		eBuildInstrMultipleEnvPointAmpAccent7,
		eBuildInstrMultipleEnvPointAmpAccent8,
		eBuildInstrMultipleEnvPointAmpFreq,
		eBuildInstrMultipleEnvPointRateAccent1,
		eBuildInstrMultipleEnvPointRateAccent2,
		eBuildInstrMultipleEnvPointRateAccent3,
		eBuildInstrMultipleEnvPointRateAccent4,
		eBuildInstrMultipleEnvPointRateAccent5,
		eBuildInstrMultipleEnvPointRateAccent6,
		eBuildInstrMultipleEnvPointRateAccent7,
		eBuildInstrMultipleEnvPointRateAccent8,
		eBuildInstrMultipleEnvPointRateFreq,
		eBuildInstrMultipleEnvPointCurveSpec,
		eBuildInstrSomeSamplesDontExist,
		eBuildInstrSomeWaveTablesDontExist,
		eBuildInstrMultipleOscStereoBias,
		eBuildInstrMultipleOscDisplacement,
		eBuildInstrMultipleOscSurroundBias,
		eBuildInstrMultipleOscFreqAdder,
		eBuildInstrExpectedSquareOrTriangle,
		eBuildInstrExpectedEffectName,
		eBuildInstrExpectedDelayLineElem,
		eBuildInstrExpectedTapChannel,
		eBuildInstrExpectedTo,
		eBuildInstrExpectedScale,
		eBuildInstrExpectedTapAttr,
		eBuildInstrMultipleSourceAccent1,
		eBuildInstrMultipleSourceAccent2,
		eBuildInstrMultipleSourceAccent3,
		eBuildInstrMultipleSourceAccent4,
		eBuildInstrMultipleTargetAccent1,
		eBuildInstrMultipleTargetAccent2,
		eBuildInstrMultipleTargetAccent3,
		eBuildInstrMultipleTargetAccent4,
		eBuildInstrMultipleScaleAccent1,
		eBuildInstrMultipleScaleAccent2,
		eBuildInstrMultipleScaleAccent3,
		eBuildInstrMultipleScaleAccent4,
		eBuildInstrMultipleFilter,
		eBuildInstrMultipleMaxDelayTime,
		eBuildInstrExpectedSlope,
		eBuildInstrExpectedCenter,
		eBuildInstrExpectedSamplelist,
		eBuildInstrExpectedEnvelope,
		eBuildInstrExpectedWavetable,
		eBuildInstrUndefinedWavetable,
		eBuildInstrExpectedInputscaling,
		eBuildInstrExpectedOutputscaling,
		eBuildInstrExpectedNLAttribute,
		eBuildInstrMultipleInputaccent1,
		eBuildInstrMultipleInputaccent2,
		eBuildInstrMultipleInputaccent3,
		eBuildInstrMultipleInputaccent4,
		eBuildInstrMultipleOutputaccent1,
		eBuildInstrMultipleOutputaccent2,
		eBuildInstrMultipleOutputaccent3,
		eBuildInstrMultipleOutputaccent4,
		eBuildInstrMultipleIndexaccent1,
		eBuildInstrMultipleIndexaccent2,
		eBuildInstrMultipleIndexaccent3,
		eBuildInstrMultipleIndexaccent4,
		eBuildInstrExpectedWavetableindex,
		eBuildInstrExpectedFilterType,
		eBuildInstrExpectedFreq,
		eBuildInstrExpectedBandwidth,
		eBuildInstrExpectedDefaultScaling,
		eBuildInstrExpectedResonScaling,
		eBuildInstrExpectedZeroScaling,
		eBuildInstrExpectedFilterAttr,
		eBuildInstrMultipleFreqaccent1,
		eBuildInstrMultipleFreqaccent2,
		eBuildInstrMultipleFreqaccent3,
		eBuildInstrMultipleFreqaccent4,
		eBuildInstrMultipleBandwidthaccent1,
		eBuildInstrMultipleBandwidthaccent2,
		eBuildInstrMultipleBandwidthaccent3,
		eBuildInstrMultipleBandwidthaccent4,
		eBuildInstrMultipleOutputScaling,
		eBuildInstrMultipleOutputScalingAccent1,
		eBuildInstrMultipleOutputScalingAccent2,
		eBuildInstrMultipleOutputScalingAccent3,
		eBuildInstrMultipleOutputScalingAccent4,
		eBuildInstrExpectedFilterChannel,
		eBuildInstrNullFilterHasNoFreqAccent1,
		eBuildInstrNullFilterHasNoFreqAccent2,
		eBuildInstrNullFilterHasNoFreqAccent3,
		eBuildInstrNullFilterHasNoFreqAccent4,
		eBuildInstrFilterHasNoBandwidthAccent1,
		eBuildInstrFilterHasNoBandwidthAccent2,
		eBuildInstrFilterHasNoBandwidthAccent3,
		eBuildInstrFilterHasNoBandwidthAccent4,
		eBuildInstrExpectedScoreEffect,
		eBuildInstrExpectedOscillatorEffect,
		eBuildInstrExpectedSourceEnvelope,
		eBuildInstrExpectedTargetEnvelope,
		eBuildInstrExpectedScaleEnvelope,
		eBuildInstrExpectedSourceLfoOrTo,
		eBuildInstrExpectedTargetLfoOrScaleEnvelope,
		eBuildInstrExpectedScaleLfoCutoffOrSemicolon,
		eBuildInstrExpectedInputScalingEnvelope,
		eBuildInstrExpectedOutputScalingEnvelope,
		eBuildInstrExpectedIndexEnvelope,
		eBuildInstrExpectedInputScalingLfoOrOutputScalingEnvelope,
		eBuildInstrExpectedOutputScalingLfoOrIndexEnvelope,
		eBuildInstrExpectedIndexLfoOrSemicolon,
		eBuildInstrExpectedFreqEnvelope,
		eBuildInstrExpectedBandwidthEnvelope,
		eBuildInstrExpectedFreqLfoOrScalingOrChannel,
		eBuildInstrExpectedBandwidthLfoOrScalingOrChannel,
		eBuildInstrExpectedOutputScalingLfoOrSemicolon,
		eBuildInstrExpectedFilter,
		eBuildInstrExpectedFreqLfoOrSemicolon,
		eBuildInstrMultipleDelayLowpassFreq,
		eBuildInstrMultipleDelayFilterAccent1,
		eBuildInstrMultipleDelayFilterAccent2,
		eBuildInstrMultipleDelayFilterAccent3,
		eBuildInstrMultipleDelayFilterAccent4,
		eBuildInstrExpectedIndexLFOOrSemicolon,
		eBuildInstrMultiplePitchControl,
		eBuildInstrExpectedGain,
		eBuildInstrMultipleGainAccent1,
		eBuildInstrMultipleGainAccent2,
		eBuildInstrMultipleGainAccent3,
		eBuildInstrMultipleGainAccent4,
		eBuildInstrExpectedGainEnvelope,
		eBuildInstrExpectedGainLfoOrScalingOrChannel,
		eBuildInstrFilterHasNoGainAccent1,
		eBuildInstrFilterHasNoGainAccent2,
		eBuildInstrFilterHasNoGainAccent3,
		eBuildInstrFilterHasNoGainAccent4,
		eBuildInstrExpectedOrder,
		eBuildInstrOrderMustBeNonNegativeEvenInteger
	} BuildInstrErrors;

/* forwards */
struct InstrumentRec;
struct SampleListRec;
struct AlgoSampListRec;
struct WaveTableListRec;
struct AlgoWaveTableListRec;
struct WaveTableObjectRec;
struct AlgoWaveTableObjectRec;
struct EffectSpecListRec;

/* take a block of text and parse it into an instrument definition.  it returns an */
/* error code.  if an error occurs, then *InstrOut is invalid, otherwise it will */
/* be valid.  the text file remains unaltered.  *ErrorLine is numbered from 1. */
BuildInstrErrors						BuildInstrumentFromText(char* TextFile, long* ErrorLine,
															struct InstrumentRec** InstrOut,
															struct SampleListRec* SampleList,
															struct AlgoSampListRec* AlgoSampList,
															struct WaveTableListRec* WaveTableList,
															struct AlgoWaveTableListRec* AlgoWaveTableList);

/* get a static null terminated string describing the error */
char*												BuildInstrGetErrorMessageText(BuildInstrErrors ErrorCode);

/* build just a list of effects */
BuildInstrErrors						BuildEffectList(char* TextFile, long* ErrorLine,
															struct EffectSpecListRec** EffectOut,
															struct WaveTableListRec* WaveTableList,
															struct AlgoWaveTableListRec* AlgoWaveTableList);

#endif
