Archived

This topic is now archived and is closed to further replies.

The_[PI]_ehT

xm format problem

Recommended Posts

Okay, this one is to all you pro''s who use to design players and stuff for the .xm format (or other module formats)... I have a lil'' problem with the format description which was released by mr.t or what''s-his-name. It says that if an instrument has more than one sample, you gotta load the sample header, and then the sample data for each of the samples. This is right if every sample actually contains sample data. But now there are plenty of modules which contain instruments with more than one sample, and the first sample says it contains n bytes sample data. But immediately after it''s header, there comes another sample, and then another, until the last of those samples finally contain the actual sample data. But this one which has the sample data attached to it actually says it doesn''t (samplesize field is zero). So I fixed my reading algo, but now it''s unable to read modules with instruments that contain several samples *with* sample data. So is there any flag or something indicating how I have to handle the instrument''s samples? I''d really appreciate your help!!! pi~

Share this post


Link to post
Share on other sites
Guest Anonymous Poster
The XM format is quite messy and the description not accurate.

I suggest you take a look at the modplug XM loader (it was ported to Linux some time ago and is open-source)

if XMINSTRUMENTHEADER.size is zero, there is still
sizeof(XMINSTRUMENTHEADER) bytes that are written.

(Search for gmodplay and/or modplug-xmms)

Here is the structures I''m using


typedef struct tagXMINSTRUMENTHEADER
{
DWORD size;
CHAR name[22];
BYTE type;
WORD samples;
} XMINSTRUMENTHEADER;


typedef struct tagXMINSTRUMENT
{
DWORD shsize;
BYTE snum[96];
WORD venv[24];
WORD penv[24];
BYTE vnum, pnum;
BYTE vsustain, vloops, vloope, psustain, ploops, ploope;
BYTE vtype, ptype;
BYTE vibtype, vibsweep, vibdepth, vibrate;
WORD volfade;
WORD res;
BYTE reserved1[20];
} XMINSTRUMENT;

typedef struct tagXMSAMPLESTRUCT
{
DWORD samplen;
DWORD loopstart;
DWORD looplen;
BYTE vol;
signed char finetune;
BYTE type;
BYTE pan;
signed char relnote;
BYTE res;
char name[22];
} XMSAMPLESTRUCT;

Olivier

Share this post


Link to post
Share on other sites