winamp/Src/Plugins/Input/in_midi/midifile.h

89 lines
1.8 KiB
C++

#ifndef NULLSOFT_IN_MIDI_MIDIFILE_H
#define NULLSOFT_IN_MIDI_MIDIFILE_H
#include <dsound.h>
#ifndef MF_NO_DMCRAP
#define MF_USE_DMCRAP
#endif
#ifdef MF_USE_DMCRAP
#include <dmusici.h>
#include <dmusicf.h>
#endif
typedef struct
{
UINT fmt,ntrax,tix;
UINT channels;
const char* e_type;
string copyright;
string * traxnames;
} MIDIINFO;
#define FLAG_INCOMPLETE 1
typedef struct tagINSDESC
{
tagINSDESC * next;
UINT bank_hi,bank_lo,patch,count,note_max,note_min,channels,user;
BOOL drum;
} INSTRUMENT_DESC;
class MIDI_file
{
public:
string path;
string title;
int flags;
int format;
int len,tix;
int size;
const BYTE* data;
#ifdef MF_USE_DMCRAP
IDirectMusicSegment *pSeg;
IDirectMusicCollection *pDLS;
BYTE* pDLSdata;
int DLSsize;
#endif
MIDIINFO info;
int loopstart,loopend;
int loopstart_t;
void * rmi_data;//extra RMI crap
int rmi_size;
void * bmp_data;//RMI-style bitmap data w/o BITMAPFILEHEADER
int bmp_size;
int kar_track;
CTempoMap * tmap;
CSysexMap * smap;
void GetTitle(char *buf, int maxlen);
inline int GetLength(void) {return len;}
static MIDI_file* Create(const char* fn,const void * data, size_t size);
void Free() {if (--refcount==0) delete this;}
MIDI_file * AddRef() {refcount++;return this;}
static int HeaderTest(const void * data,int total_size);//test first 256 bytes of file
private:
int refcount;
MIDI_file(const char * fn);
int Load(const void * data,int size);
~MIDI_file();
};
#define CLEAN_DM 1
#define CLEAN_1TRACK 2
#define CLEAN_NOSYSEX 4
#define CLEAN_NOTEMPO 8
#define CLEAN_DLS 16
int DoCleanUp(MIDI_file*,DWORD,void** out_data,int * out_size);
INSTRUMENT_DESC* GetInstruments(MIDI_file*,BOOL do_lsb);
#ifdef MF_USE_DMCRAP
IDirectMusicSegment * LoadSegment(MIDI_file*);
void LoadDLS(MIDI_file* mf);
#endif
#endif