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


xm format problem

Recommended Posts

The_[PI]_ehT    122
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   
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;

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];

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];


Share this post

Link to post
Share on other sites
The_[PI]_ehT    122
Thx for your response. I''ll immediately try it out to fix my code, I hope it works.
I can''t understand though why the group who invented this format is unable to build up a fine documentation on it.


Share this post

Link to post
Share on other sites