/*=============================================================================
	exPMD.dll拡張API
=============================================================================*/
#pragma once
#include	"fmp32_api.h"

namespace exPMD {

/*-----------------------------------------------------------------------------
	アクセスクラス
-----------------------------------------------------------------------------*/
	class FUNC {
	  public:
		enum {								// ファンクション
			GET_MEMO = 1,					// #title,#arranger,$composer,#memo取得
			GET_DRIVER = 2,					// 動作ドライバ取得
			GET_FILEPATH = 3,				// 演奏ファイル情報取得
		};

		// ドライバ情報
		static const DWORD DRIVER_PMDB2		= 0x00000001;
		static const DWORD DRIVER_PMD86		= 0x00000002;
		static const DWORD DRIVER_PMDPPZ	= 0x00000004;
		static const DWORD DRIVER_PPSDRV	= 0x00000010;

		// 取得ファイル種別
		static const int FILE_MUSIC			= 0;
		static const int FILE_PPC			= 1;
		static const int FILE_PPS			= 2;
		static const int FILE_PPZ1			= 3;
		static const int FILE_PPZ2			= 4;

		// コメントバッファ(max 1K)
		static const int COMMENT_SIZE = 1024;

	  public:
		FUNC::FUNC(void);
		char* GetTitle(void);
		char* GetComposer(void);
		char* GetArranger(void);
		char* GetMemo(int);
		DWORD GetDriverInfo(void);
		char* GetFilePath(int);

	  private:
		FMP32::FUNC* hFMP7;
		char CommentBuff[COMMENT_SIZE +1];
		char FilePath[_MAX_PATH +1];
	};

/*-----------------------------------------------------------------------------
	拡張共有メモリ情報
-----------------------------------------------------------------------------*/
	namespace SHM {
		// GUID {E4463D69-5266-42c5-B0ED-82F46AC24F2B}
		static const GUID GUID = 
			{ 0xe4463d69, 0x5266, 0x42c5,
				{ 0xb0, 0xed, 0x82, 0xf4, 0x6a, 0xc2, 0x4f, 0x2b }
			};

		// 対応音源パート数
		static const int PARTS_FM		= 6;
		static const int PARTS_SSG		= 3;
		static const int PARTS_ADPCM	= 1;
		static const int PARTS_RHYTHM	= 6;
		static const int PARTS_FMEX		= 3;
		static const int PARTS_PPZ8		= 8;
		static const int PARTS_PPS		= 2;
		static const int PARTS_ALL		= (PARTS_FM +
										   PARTS_SSG +
										   PARTS_ADPCM +
										   PARTS_RHYTHM +
										   PARTS_FMEX +
										   PARTS_PPZ8 +
										   PARTS_PPS);

		// パートモード種別
		static const BYTE EX_MODE_NON	= 0x00;		// 未使用
		static const BYTE EX_MODE_FM	= 0x01;		// FM
		static const BYTE EX_MODE_FMEX	= 0x02;		// FM(C-EX)
		static const BYTE EX_MODE_SSG	= 0x03;		// SSG
		static const BYTE EX_MODE_R_BD	= 0x04;		// リズム(バスドラム)
		static const BYTE EX_MODE_R_SD	= 0x05;		// リズム(スネアドラム)
		static const BYTE EX_MODE_R_CYM	= 0x06;		// リズム(シンバル)
		static const BYTE EX_MODE_R_HAT	= 0x07;		// リズム(ハイハット)
		static const BYTE EX_MODE_R_TOM	= 0x08;		// リズム(タム)
		static const BYTE EX_MODE_R_RIM	= 0x09;		// リズム(リムショット)
		static const BYTE EX_MODE_ADPCM	= 0x0a;		// ADPCM
		static const BYTE EX_MODE_PPZ8	= 0x0b;		// PCM(PPZ8)
		static const BYTE EX_MODE_PPS	= 0x0c;		// PCM(PPS)

		// 拡張情報ワーク構造体
#pragma pack(1)
		typedef struct tEX {
			BYTE	TimerB;					// TimerB値
			BYTE	Mode[PARTS_ALL];		// 音源詳細(※ EX_MODE参照)
			BYTE	Vol[PARTS_ALL];			// 実音量値
			BYTE	Pan[PARTS_ALL];			// パン[0-3]/[1-9]
		} EX, *PEX;
#pragma pack()
	};
};
