#ifndef _ITDEFS_H_
#define _ITDEFS_H_

#pragma pack(1)

typedef struct tagITFILEHEADER
{
        DWORD id;                       /* 0x4D504D49 */
        CHAR songname[26];
        WORD reserved1;         /* 0x1004 */
        WORD ordnum;
        WORD insnum;
        WORD smpnum;
        WORD patnum;
        WORD cwtv;
        WORD cmwt;
        WORD flags;
        WORD special;
        BYTE globalvol;
        BYTE mv;
        BYTE speed;
        BYTE tempo;
        BYTE sep;
        BYTE zero;
        WORD msglength;
        DWORD msgoffset;
        DWORD reserved2;
        BYTE chnpan[64];
        BYTE chnvol[64];
} ITFILEHEADER;


typedef struct tagITENVELOPE
{
        BYTE flags;
        BYTE num;
        BYTE lpb;
        BYTE lpe;
        BYTE slb;
        BYTE sle;
        BYTE data[25*3];
        BYTE reserved;
} ITENVELOPE;

/* Old Impulse Instrument Format (cmwt < 0x200) */
typedef struct tagITOLDINSTRUMENT
{
        DWORD id;                       /* IMPI = 0x49504D49 */
        CHAR filename[12];      /* DOS file name */
        BYTE zero;
        BYTE flags;
        BYTE vls;
        BYTE vle;
        BYTE sls;
        BYTE sle;
        WORD reserved1;
        WORD fadeout;
        BYTE nna;
        BYTE dnc;
        WORD trkvers;
        BYTE nos;
        BYTE reserved2;
        CHAR name[26];
        WORD reserved3[3];
        BYTE keyboard[240];
        BYTE volenv[200];
        BYTE nodes[50];
} ITOLDINSTRUMENT;


/* Impulse Instrument Format */
typedef struct tagITINSTRUMENT
{
        DWORD id;
        CHAR filename[12];
        BYTE zero;
        BYTE nna;
        BYTE dct;
        BYTE dca;
        WORD fadeout;
        signed char pps;
        BYTE ppc;
        BYTE gbv;
        BYTE dfp;
        BYTE rv;
        BYTE rp;
        WORD trkvers;
        BYTE nos;
        BYTE reserved1;
        CHAR name[26];
        BYTE ifc;
        BYTE ifr;
        BYTE mch;
        BYTE mpr;
        WORD mbank;
        BYTE keyboard[240];
        ITENVELOPE volenv;
        ITENVELOPE panenv;
        ITENVELOPE pitchenv;
        BYTE dummy[4]; /* was 7, but IT v2.17 saves 554 bytes */
} ITINSTRUMENT;


/* IT Sample Format */
typedef struct ITSAMPLESTRUCT
{
        DWORD id;               /* 0x53504D49 */
        CHAR filename[12];
        BYTE zero;
        BYTE gvl;
        BYTE flags;
        BYTE vol;
        CHAR name[26];
        BYTE cvt;
        BYTE dfp;
        DWORD length;
        DWORD loopbegin;
        DWORD loopend;
        DWORD C5Speed;
        DWORD susloopbegin;
        DWORD susloopend;
        DWORD samplepointer;
        BYTE vis;
        BYTE vid;
        BYTE vir;
        BYTE vit;
} ITSAMPLESTRUCT;

#pragma pack()

extern BYTE autovibit2xm[8];
extern BYTE autovibxm2it[8];

#endif