/*=============================================================================
	MMLコンパイラコントロールヘッダ
=============================================================================*/
#pragma once

namespace FMC32 {

	// コンパイルフラグ
	enum eCFLAG {
		ONLY_PREPRO				= 0x00000001,	// 展開チェックのみ
		ONLY_COMPILE			= 0x00000002,	// コンパイルチェックのみ
		PLAY_AFTER				= 0x00000100,	// コンパイル成功後自動演奏
	};

	// コンパイルステータス
	enum eSTATUS {
		SUCCESS						= 0,		// 正常終了
		ERROR_COMPILE				= 1,		// コンパイルエラー
		ERROR_FILE_OPEN				= 2,		// ファイルオープンエラー
		ERROR_READ_FILE				= 3,		// 読み込みエラー
		ERROR_WRITE_FILE			= 4,		// 書き込みエラー
		ERROR_DELETE_FILE			= 5,		// 削除エラー
		ERROR_NODATA				= 6,		// 有効なデータなし
		ERROR_PLAY					= 7,		// データ演奏エラー
	};

	// コンパイル情報種別
	enum eKIND {
		KIND_FILE					= 0,		// ファイル情報
		KIND_PART					= 1,		// パート情報
		KIND_LOG					= 2,		// コンパイルログ
		KIND_INFO					= 3,		// インフォメーション
	};
	// 音源タイプ
	enum eTYPE {
		TYPE_OPNA					= 0,		// OPNA音源
		TYPE_SSG					= 1,		// SSG音源
		TYPE_PCM					= 2,		// PCM音源
		TYPE_OPM					= 3,		// OPM音源
	};
	// ログ情報識別
	enum eLKIND {
		LKIND_ERROR					= 0,		// エラー
		LKIND_WARN					= 1,		// ワーニング
		LKIND_INFO					= 2,		// 情報
	};

#pragma pack(1)
	// コンパイルログ
	struct CLOG {
		eLKIND Kind;							// ログ識別
		LPWSTR pMessage;						// エラーメッセージ
		int nLine;								// エラー行
		int nCol;								// エラーカラム
		WCHAR pPart[3];							// パート名
		LPWSTR pFileName;						// エラーファイル名
		LPWSTR pAliasName;						// エイリアス名
		LPWSTR pMML;							// 該当MML
	};
	// パート情報
	struct CPART {
		WCHAR pPart[3];							// パート名
		int nType;								// 音源タイプ
		int nTotal;								// 総クロック
		int nLoop;								// ループクロック
		int nBytes;								// 出力byte数
	};
	// ファイル情報
	struct CFILE {
		LPWSTR pFileName;						// ファイル名
		int nPartTotal;							// 総パート数
		int nPartOPNA;							// OPNAパート数
		int nPartSSG;							// SSGパート数
		int nPartPCM;							// PCMパート数
		int nToneFM4;							// FM音色数
		int nWavePCM;							// WAVE数
		int nEnvelop;							// エンベロープ数
		int nPartOPM;							// OPMパート数
	};
	// 各種インフォメーション
	struct CINFO {
		LPWSTR pMessage;
	};

	// コンパイル情報
	struct INFO {
		int Kind;								// 種別(eKIND)
		union {
			CLOG Log;
			CFILE File;
			CPART Part;
			CINFO Info;
		};
	};
#pragma pack()
}

/*----------------------------------------------------------------------------
	プロトタイプ
----------------------------------------------------------------------------*/
#ifdef __cplusplus
extern "C" {
#endif

extern void __stdcall GetVer(int*,int*,int*);
extern FMC32::eSTATUS __stdcall Compile(LPWSTR,LPWSTR,DWORD);
extern void __stdcall Free(void);
extern int __stdcall GetInfoNum(void);
extern FMC32::INFO* __stdcall GetInfo(int);
extern void __stdcall OptionSetting(HWND);

#ifdef __cplusplus
}
#endif
