#pragma once

#define FPD98CALLTYPE __cdecl

#pragma pack(push, 4)
struct FPDPLAY {
    char fpvdir[2][256];//FPV(音色波形データのディレクトリ)
    int op_s;    //再生周波数0:44100Hz 1:33075Hz 2:22050Hz 3:16538Hz 4:11025Hz
    int op_v;    //パン制御1:モノラル2:ステレオ
    int op_e;    //エフェクト 0:なし1:リバーブ 2:リバーブ・コーラス
    int op_f;    //フェードアウト速度    1(小)〜40(大)
    int op_l;    //ループ回数0〜2147483647 (ただし0は無限回)
    int op_b;    //ビット数8:8ビット  16:16ビット
    int reserved;//常に0を入れておくこと
    int op_se;   //システムエフェクト 0:なし1:リバーブ 2:リバーブ・コーラス
};
struct FPDSUB_MANUFACT_PARAM {
	int  iBpm;			// [ IN]BPM変更値(-99~99)
	int  iTp;			// [ IN]トランスポーズ値(-12~12)
	BOOL bFadeout;		// [ IN]FadeOutを考慮するか
	int  iFadeout;		// [ IN]FadeOut速度(1~40)
	BOOL bLoop;			// [ IN]Loop回数を考慮するか
	int  iLoop;			// [ IN]Loop回数(1~255)
	BOOL bPartMask[17];	// [ IN]パートマスク(パートマスクするトラックは1)
	int  iLongCh;		// [OUT]一番演奏時間が長いチャンネル(0~127)
	int  iPlayTime;		// [OUT]演奏時間(秒)
	int  iPlayBar;		// [OUT]演奏時間(192ステップを1とした小節数)
};
struct FPDHEADER {
    BYTE szhead[4];   // 0- 3 FPDM,FPD3,FPDL
    BYTE l;           //    4 基本長
    WORD playspeed;   // 5- 6 再生スピード
    WORD fpvoffset;   // 7- 8
    BYTE npcm;        //    9
    BYTE memtype;     //   10
    WORD titleoffset; //11-12
    WORD keyoffset;   //13-14
    BYTE version;     //   15
    WORD flinkoffset; //16-17
};
#pragma pack(pop)

//fpd98.dll
typedef int   (FPD98CALLTYPE *pfnFPDPlay)(char *,struct FPDPLAY *,int,void (*)(void));//演奏
typedef int   (FPD98CALLTYPE *pfnFPDPlayInit)(void);//正常終了なら0 を返す
typedef int   (FPD98CALLTYPE *pfnFPDPlayEnd)(void); //正常終了なら0 を返す
typedef void  (FPD98CALLTYPE *pfnFPDPlayCancel)(void);//演奏中止
typedef void  (FPD98CALLTYPE *pfnPlayPause)(void);  //演奏一時停止
typedef void  (FPD98CALLTYPE *pfnPlayRestart)(void);//演奏再開
typedef int   (FPD98CALLTYPE *pfnCheckMmx)(void);   //MMX対応CPUなら1 そうでないなら0
typedef int   (FPD98CALLTYPE *pfnCheckPlay)(void);  //演奏中なら1 そうでないなら0
typedef int   (FPD98CALLTYPE *pfnGetTitle)(char *,char *);//正常終了なら0 を返す
typedef void  (FPD98CALLTYPE *pfnQuietFlag)(int);   //デバイス使用不可のメッセージを表示しない
//fpd98sub.dll
typedef char* (FPD98CALLTYPE *pfnGetVersionX)(void);//FPD98SUB_GetVersionX(void);
typedef BOOL  (FPD98CALLTYPE *pfnManufactMusicMain)(char *,
                                                    struct FPDSUB_MANUFACT_PARAM*,
                                                    struct FPDHEADER *);//FPD98SUB_ManufactMusicMain;
typedef BOOL  (FPD98CALLTYPE *pfnGetFpdHeader)(char *,
                                               struct FPDHEADER *);//FPD98SUB_GetFpdHeader;
typedef BOOL (FPD98CALLTYPE *pfnFPD98SUB_AddTranspose)(char *pszSrcFile, char *pszDstFile, FPDHEADER *fpdheader);

//fpd98.dll
extern pfnFPDPlay       FPDPlay;       //演奏開始
extern pfnFPDPlayInit   FPDPlayInit;   //正常終了なら0 を返す
extern pfnFPDPlayEnd    FPDPlayEnd;    //正常終了なら0 を返す
extern pfnFPDPlayCancel FPDPlayCancel; //演奏中止
extern pfnPlayPause     FPDPlayPause;  //演奏一時停止
extern pfnPlayRestart   FPDPlayRestart;//演奏再開
extern pfnCheckMmx      FPDCheckMmx;   //MMX対応CPUなら1 そうでないなら0
extern pfnCheckPlay     FPDCheckPlay;  //演奏中なら1 そうでないなら0
extern pfnGetTitle      FPDGetTitle;   //正常終了なら0 を返す
extern pfnQuietFlag     FPDQuietFlag;  //デバイス使用不可のメッセージを表示しない

//fpd98sub.dll
extern pfnGetVersionX       FPD98SubGetVersionX;
extern pfnGetFpdHeader      FPD98SubGetFpdHeader;
extern pfnManufactMusicMain FPD98SubManufactMusicMain;
extern pfnFPD98SUB_AddTranspose FPD98SUB_AddTranspose;

HINSTANCE __fastcall LoadFpdDll(HINSTANCE hKpi);
void __fastcall UnloadFpdDll(void);

