1 /* MikMod sound library
2 (c) 1998, 1999 Miodrag Vallat and others - see file AUTHORS for
5 This library is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Library General Public License as
7 published by the Free Software Foundation; either version 2 of
8 the License, or (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Library General Public License for more details.
15 You should have received a copy of the GNU Library General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
21 /*==============================================================================
25 Fasttracker (XM) module loader
27 ==============================================================================*/
37 #include "unimod_priv.h"
39 /*========== Module structure */
41 typedef struct XMHEADER
43 CHAR id[17]; /* ID text: 'Extended module: ' */
44 CHAR songname[21]; /* Module name */
45 CHAR trackername[20]; /* Tracker name */
46 UWORD version; /* Version number */
47 ULONG headersize; /* Header size */
48 UWORD songlength; /* Song length (in patten order table) */
49 UWORD restart; /* Restart position */
50 UWORD numchn; /* Number of channels (2,4,6,8,10,...,32) */
51 UWORD numpat; /* Number of patterns (max 256) */
52 UWORD numins; /* Number of instruments (max 128) */
54 UWORD tempo; /* Default tempo */
55 UWORD bpm; /* Default BPM */
56 UBYTE orders[256]; /* Pattern order table */
60 typedef struct XMINSTHEADER
62 ULONG size; /* Instrument size */
63 CHAR name[22]; /* Instrument name */
64 UBYTE type; /* Instrument type (always 0) */
65 UWORD numsmp; /* Number of samples in instrument */
70 #define XMENVCNT (12 * 2)
71 #define XMNOTECNT (8*OCTAVE)
72 typedef struct XMPATCHHEADER
74 UBYTE what[XMNOTECNT]; /* Sample number for all notes */
75 UWORD volenv[XMENVCNT]; /* Points for volume envelope */
76 UWORD panenv[XMENVCNT]; /* Points for panning envelope */
77 UBYTE volpts; /* Number of volume points */
78 UBYTE panpts; /* Number of panning points */
79 UBYTE volsus; /* Volume sustain point */
80 UBYTE volbeg; /* Volume loop start point */
81 UBYTE volend; /* Volume loop end point */
82 UBYTE pansus; /* Panning sustain point */
83 UBYTE panbeg; /* Panning loop start point */
84 UBYTE panend; /* Panning loop end point */
85 UBYTE volflg; /* Volume type: bit 0: On; 1: Sustain; 2: Loop */
86 UBYTE panflg; /* Panning type: bit 0: On; 1: Sustain; 2: Loop */
87 UBYTE vibflg; /* Vibrato type */
88 UBYTE vibsweep; /* Vibrato sweep */
89 UBYTE vibdepth; /* Vibrato depth */
90 UBYTE vibrate; /* Vibrato rate */
91 UWORD volfade; /* Volume fadeout */
95 typedef struct XMWAVHEADER
97 ULONG length; /* Sample length */
98 ULONG loopstart; /* Sample loop start */
99 ULONG looplength; /* Sample loop length */
100 UBYTE volume; /* Volume */
101 SBYTE finetune; /* Finetune (signed byte -128..+127) */
102 UBYTE type; /* Loop type */
103 UBYTE panning; /* Panning (0-255) */
104 SBYTE relnote; /* Relative note number (signed byte) */
106 CHAR samplename[22]; /* Sample name */
107 UBYTE vibtype; /* Vibrato type */
108 UBYTE vibsweep; /* Vibrato sweep */
109 UBYTE vibdepth; /* Vibrato depth */
110 UBYTE vibrate; /* Vibrato rate */
114 typedef struct XMPATHEADER
116 ULONG size; /* Pattern header length */
117 UBYTE packing; /* Packing type (always 0) */
118 UWORD numrows; /* Number of rows in pattern (1..256) */
119 SWORD packsize; /* Packed patterndata size */
123 typedef struct XMNOTE
125 UBYTE note, ins, vol, eff, dat;
129 /*========== Loader variables */
131 static XMNOTE *xmpat = NULL;
132 static XMHEADER *mh = NULL;
134 /* increment unit for sample array reallocation */
135 #define XM_SMPINCR 64
136 static ULONG *nextwav = NULL;
137 static XMWAVHEADER *wh = NULL, *s = NULL;
139 /*========== Loader code */
146 if (!_mm_read_UBYTES(id, 38, modreader))
148 if (memcmp(id, "Extended Module: ", 17))
158 if (!(mh = (XMHEADER*) _mm_malloc(sizeof(XMHEADER))))
170 XM_ReadNote(XMNOTE * n)
172 UBYTE cmp, result = 1;
174 memset(n, 0, sizeof(XMNOTE));
175 cmp = _mm_read_UBYTE(modreader);
182 n->note = _mm_read_UBYTE(modreader);
187 n->ins = _mm_read_UBYTE(modreader);
192 n->vol = _mm_read_UBYTE(modreader);
197 n->eff = _mm_read_UBYTE(modreader);
202 n->dat = _mm_read_UBYTE(modreader);
208 n->ins = _mm_read_UBYTE(modreader);
209 n->vol = _mm_read_UBYTE(modreader);
210 n->eff = _mm_read_UBYTE(modreader);
211 n->dat = _mm_read_UBYTE(modreader);
218 XM_Convert(XMNOTE * xmtrack, UWORD rows)
221 UBYTE note, ins, vol, eff, dat;
224 for (t = 0; t < rows; t++)
226 note = xmtrack->note;
234 if (note > XMNOTECNT)
235 UniEffect(UNI_KEYFADE, 0);
240 UniInstrument(ins - 1);
244 case 0x6: /* volslide down */
246 UniEffect(UNI_XMEFFECTA, vol & 0xf);
248 case 0x7: /* volslide up */
250 UniEffect(UNI_XMEFFECTA, (vol << 4) & 0xff);
253 /* volume-row fine volume slide is compatible with protracker
254 EBx and EAx effects i.e. a zero nibble means DO NOT SLIDE, as
255 opposed to 'take the last sliding value'. */
256 case 0x8: /* finevol down */
257 UniPTEffect(0xe, 0xb0 | (vol & 0xf));
259 case 0x9: /* finevol up */
260 UniPTEffect(0xe, 0xa0 | (vol & 0xf));
262 case 0xa: /* set vibrato speed */
263 UniPTEffect(0x4, (vol << 4) & 0xff);
265 case 0xb: /* vibrato */
266 UniPTEffect(0x4, vol & 0xf);
268 case 0xc: /* set panning */
269 UniPTEffect(0x8, (vol << 4) & 0xff);
271 case 0xd: /* panning slide left (only slide when data not zero) */
273 UniEffect(UNI_XMEFFECTP, vol & 0xf);
275 case 0xe: /* panning slide right (only slide when data not zero) */
277 UniEffect(UNI_XMEFFECTP, vol << 4);
279 case 0xf: /* tone porta */
280 UniPTEffect(0x3, (vol << 4) & 0xff);
283 if ((vol >= 0x10) && (vol <= 0x50))
284 UniPTEffect(0xc, vol - 0x10);
290 UniEffect(UNI_XMEFFECT4, dat);
293 UniEffect(UNI_XMEFFECTA, dat);
295 case 0xe: /* Extended effects */
298 case 0x1: /* XM fine porta up */
299 UniEffect(UNI_XMEFFECTE1, dat & 0xf);
301 case 0x2: /* XM fine porta down */
302 UniEffect(UNI_XMEFFECTE2, dat & 0xf);
304 case 0xa: /* XM fine volume up */
305 UniEffect(UNI_XMEFFECTEA, dat & 0xf);
307 case 0xb: /* XM fine volume down */
308 UniEffect(UNI_XMEFFECTEB, dat & 0xf);
311 UniPTEffect(eff, dat);
314 case 'G' - 55: /* G - set global volume */
315 UniEffect(UNI_XMEFFECTG, dat > 64 ? 64 : dat);
317 case 'H' - 55: /* H - global volume slide */
318 UniEffect(UNI_XMEFFECTH, dat);
320 case 'K' - 55: /* K - keyOff and KeyFade */
321 UniEffect(UNI_KEYFADE, dat);
323 case 'L' - 55: /* L - set envelope position */
324 UniEffect(UNI_XMEFFECTL, dat);
326 case 'P' - 55: /* P - panning slide */
327 UniEffect(UNI_XMEFFECTP, dat);
329 case 'R' - 55: /* R - multi retrig note */
330 UniEffect(UNI_S3MEFFECTQ, dat);
332 case 'T' - 55: /* T - Tremor */
333 UniEffect(UNI_S3MEFFECTI, dat);
338 case 1: /* X1 - Extra Fine Porta up */
339 UniEffect(UNI_XMEFFECTX1, dat & 0xf);
341 case 2: /* X2 - Extra Fine Porta down */
342 UniEffect(UNI_XMEFFECTX2, dat & 0xf);
349 /* the pattern jump destination is written in decimal,
350 but it seems some poor tracker software writes them
351 in hexadecimal... (sigh) */
353 /* don't change anything if we're sure it's in hexa */
354 if ((((dat & 0xf0) >> 4) <= 9) && ((dat & 0xf) <= 9))
355 /* otherwise, convert from dec to hex */
356 dat = (((dat & 0xf0) >> 4) * 10) + (dat & 0xf);
357 UniPTEffect(eff, dat);
368 LoadPatterns(BOOL dummypat)
374 if (!AllocPatterns())
378 for (t = 0; t < mh->numpat; t++)
382 ph.size = _mm_read_I_ULONG(modreader);
383 if (ph.size < (mh->version == 0x0102 ? 8 : 9))
385 _mm_errno = MMERR_LOADING_PATTERN;
388 ph.packing = _mm_read_UBYTE(modreader);
391 _mm_errno = MMERR_LOADING_PATTERN;
394 if (mh->version == 0x0102)
395 ph.numrows = _mm_read_UBYTE(modreader) + 1;
397 ph.numrows = _mm_read_I_UWORD(modreader);
398 ph.packsize = _mm_read_I_UWORD(modreader);
400 ph.size -= (mh->version == 0x0102 ? 8 : 9);
402 _mm_fseek(modreader, ph.size, SEEK_CUR);
404 of.pattrows[t] = ph.numrows;
408 if (!(xmpat = (XMNOTE*) _mm_calloc(ph.numrows * of.numchn, sizeof(XMNOTE))))
411 /* when packsize is 0, don't try to load a pattern.. it's empty. */
413 for (u = 0; u < ph.numrows; u++)
414 for (v = 0; v < of.numchn; v++)
419 ph.packsize -= XM_ReadNote(&xmpat[(v * ph.numrows) + u]);
424 _mm_errno = MMERR_LOADING_PATTERN;
431 _mm_fseek(modreader, ph.packsize, SEEK_CUR);
434 if (_mm_eof(modreader))
438 _mm_errno = MMERR_LOADING_PATTERN;
442 for (v = 0; v < of.numchn; v++)
443 of.tracks[numtrk++] = XM_Convert(&xmpat[v * ph.numrows], ph.numrows);
450 for (v = 0; v < of.numchn; v++)
451 of.tracks[numtrk++] = XM_Convert(NULL, ph.numrows);
458 if (!(xmpat = (XMNOTE*) _mm_calloc(64 * of.numchn, sizeof(XMNOTE))))
460 for (v = 0; v < of.numchn; v++)
461 of.tracks[numtrk++] = XM_Convert(&xmpat[v * 64], 64);
470 LoadInstruments(void)
477 if (!AllocInstruments())
480 for (t = 0; t < of.numins; t++, d++)
485 memset(d->samplenumber, 0xff, INSTNOTES * sizeof(UWORD));
487 /* read instrument header */
488 headend = _mm_ftell(modreader);
489 ih.size = _mm_read_I_ULONG(modreader);
491 ck = _mm_ftell(modreader);
492 _mm_fseek(modreader, 0, SEEK_END);
493 if ((headend < 0) || (_mm_ftell(modreader) < headend) || (headend < ck)) {
494 _mm_fseek(modreader, ck, SEEK_SET);
497 _mm_fseek(modreader, ck, SEEK_SET);
498 _mm_read_string(ih.name, 22, modreader);
499 ih.type = _mm_read_UBYTE(modreader);
500 ih.numsmp = _mm_read_I_UWORD(modreader);
502 d->insname = DupStr(ih.name, 22, 1);
504 if ((SWORD) ih.size > 29)
506 ih.ssize = _mm_read_I_ULONG(modreader);
507 if (((SWORD) ih.numsmp > 0) && (ih.numsmp <= XMNOTECNT))
514 _mm_read_UBYTES(pth.what, XMNOTECNT, modreader);
515 _mm_read_I_UWORDS(pth.volenv, XMENVCNT, modreader);
516 _mm_read_I_UWORDS(pth.panenv, XMENVCNT, modreader);
517 pth.volpts = _mm_read_UBYTE(modreader);
518 pth.panpts = _mm_read_UBYTE(modreader);
519 pth.volsus = _mm_read_UBYTE(modreader);
520 pth.volbeg = _mm_read_UBYTE(modreader);
521 pth.volend = _mm_read_UBYTE(modreader);
522 pth.pansus = _mm_read_UBYTE(modreader);
523 pth.panbeg = _mm_read_UBYTE(modreader);
524 pth.panend = _mm_read_UBYTE(modreader);
525 pth.volflg = _mm_read_UBYTE(modreader);
526 pth.panflg = _mm_read_UBYTE(modreader);
527 pth.vibflg = _mm_read_UBYTE(modreader);
528 pth.vibsweep = _mm_read_UBYTE(modreader);
529 pth.vibdepth = _mm_read_UBYTE(modreader);
530 pth.vibrate = _mm_read_UBYTE(modreader);
531 pth.volfade = _mm_read_I_UWORD(modreader);
533 /* read the remainder of the header
534 (2 bytes for 1.03, 22 for 1.04) */
535 if (headend >= _mm_ftell(modreader))
536 for (u = headend - _mm_ftell(modreader); u; u--)
537 _mm_read_UBYTE(modreader);
539 /* #@!$&% fix for K_OSPACE.XM and possibly others */
540 if (pth.volpts > XMENVCNT / 2)
541 pth.volpts = XMENVCNT / 2;
542 if (pth.panpts > XMENVCNT / 2)
543 pth.panpts = XMENVCNT / 2;
545 if ((_mm_eof(modreader)) || (pth.volpts > XMENVCNT / 2) || (pth.panpts > XMENVCNT / 2))
551 _mm_errno = MMERR_LOADING_SAMPLEINFO;
555 for (u = 0; u < XMNOTECNT; u++)
556 d->samplenumber[u] = pth.what[u] + of.numsmp;
557 d->volfade = pth.volfade;
559 #define XM_ProcessEnvelope(name) \
560 for (u = 0; u < (XMENVCNT / 2); u++) { \
561 d->name##env[u].pos = pth.name##env[2*u]; \
562 d->name##env[u].val = pth.name##env[2*u + 1]; \
564 memcpy(d->name##env, pth.name##env, XMENVCNT); \
565 if (pth.name##flg & 1) d->name##flg |= EF_ON; \
566 if (pth.name##flg & 2) d->name##flg |= EF_SUSTAIN; \
567 if (pth.name##flg & 4) d->name##flg |= EF_LOOP; \
568 d->name##susbeg = d->name##susend = pth.name##sus; \
569 d->name##beg = pth.name##beg; \
570 d->name##end = pth.name##end; \
571 d->name##pts = pth.name##pts; \
573 /* scale envelope */ \
574 for (p = 0; p < XMENVCNT / 2; p++) \
575 d->name##env[p].val <<= 2; \
577 if ((d->name##flg & EF_ON) && (d->name##pts < 2)) \
578 d->name##flg &= ~EF_ON;
580 XM_ProcessEnvelope(vol);
581 XM_ProcessEnvelope(pan);
582 #undef XM_ProcessEnvelope
584 /* Samples are stored outside the instrument struct now, so we
585 have to load them all into a temp area, count the of.numsmp
586 along the way and then do an AllocSamples() and move
588 if (mh->version > 0x0103)
590 for (u = 0; u < ih.numsmp; u++, s++)
592 /* Allocate more room for sample information if necessary */
593 if (of.numsmp + u == wavcnt)
595 wavcnt += XM_SMPINCR;
596 if (!(newnextwav = realloc(nextwav, wavcnt * sizeof(ULONG))))
601 _mm_errno = MMERR_OUT_OF_MEMORY;
604 nextwav = newnextwav;
605 if (!(newwh = realloc(wh, wavcnt * sizeof(XMWAVHEADER))))
610 _mm_errno = MMERR_OUT_OF_MEMORY;
614 s = wh + (wavcnt - XM_SMPINCR);
617 s->length = _mm_read_I_ULONG(modreader);
618 s->loopstart = _mm_read_I_ULONG(modreader);
619 s->looplength = _mm_read_I_ULONG(modreader);
620 s->volume = _mm_read_UBYTE(modreader);
621 s->finetune = _mm_read_SBYTE(modreader);
622 s->type = _mm_read_UBYTE(modreader);
623 s->panning = _mm_read_UBYTE(modreader);
624 s->relnote = _mm_read_SBYTE(modreader);
625 s->vibtype = pth.vibflg;
626 s->vibsweep = pth.vibsweep;
627 s->vibdepth = pth.vibdepth * 4;
628 s->vibrate = pth.vibrate;
629 s->reserved = _mm_read_UBYTE(modreader);
630 _mm_read_string(s->samplename, 22, modreader);
632 nextwav[of.numsmp + u] = next;
635 if (_mm_eof(modreader))
641 _mm_errno = MMERR_LOADING_SAMPLEINFO;
646 if (mh->version > 0x0103)
648 for (u = 0; u < ih.numsmp; u++)
649 nextwav[of.numsmp++] += _mm_ftell(modreader);
650 _mm_fseek(modreader, next, SEEK_CUR);
653 of.numsmp += ih.numsmp;
657 /* read the remainder of the header */
658 ck = _mm_ftell(modreader);
659 _mm_fseek(modreader, 0, SEEK_END);
660 if ((headend < 0) || (_mm_ftell(modreader) < headend) || (headend < ck)) {
661 _mm_fseek(modreader, ck, SEEK_SET);
664 _mm_fseek(modreader, ck, SEEK_SET);
666 for (u = headend - _mm_ftell(modreader); u; u--)
667 _mm_read_UBYTE(modreader);
669 /* last instrument is at the end of file in version 0x0104 */
670 if (_mm_eof(modreader) && (mh->version < 0x0104 || t < of.numins - 1))
676 _mm_errno = MMERR_LOADING_SAMPLEINFO;
690 _mm_errno = MMERR_LOADING_SAMPLEINFO;
698 XM_Load(BOOL curious)
704 char tracker[21], modtype[60];
706 /* try to read module header */
707 _mm_read_string(mh->id, 17, modreader);
708 _mm_read_string(mh->songname, 21, modreader);
709 _mm_read_string(mh->trackername, 20, modreader);
710 mh->version = _mm_read_I_UWORD(modreader);
711 if ((mh->version < 0x102) || (mh->version > 0x104))
713 _mm_errno = MMERR_NOT_A_MODULE;
716 mh->headersize = _mm_read_I_ULONG(modreader);
717 mh->songlength = _mm_read_I_UWORD(modreader);
718 mh->restart = _mm_read_I_UWORD(modreader);
719 mh->numchn = _mm_read_I_UWORD(modreader);
720 mh->numpat = _mm_read_I_UWORD(modreader);
721 mh->numins = _mm_read_I_UWORD(modreader);
722 mh->flags = _mm_read_I_UWORD(modreader);
723 mh->tempo = _mm_read_I_UWORD(modreader);
724 mh->bpm = _mm_read_I_UWORD(modreader);
727 _mm_errno = MMERR_NOT_A_MODULE;
730 t = mh->headersize - 20;
731 if (t > sizeof(mh->orders)) t = sizeof(mh->orders);
732 _mm_read_UBYTES(mh->orders, t, modreader);
734 if (_mm_eof(modreader))
736 _mm_errno = MMERR_LOADING_HEADER;
740 /* set module variables */
741 of.initspeed = mh->tempo;
742 of.inittempo = mh->bpm;
743 strncpy(tracker, mh->trackername, 20);
745 for (t = 20; (tracker[t] <= ' ') && (t >= 0); t--)
748 /* some modules have the tracker name empty */
750 strcpy(tracker, "Unknown tracker");
753 snprintf(modtype, 60, "%s (XM format %d.%02d)",
754 tracker, mh->version >> 8, mh->version & 0xff);
756 sprintf(modtype, "%s (XM format %d.%02d)",
757 tracker, mh->version >> 8, mh->version & 0xff);
759 of.modtype = strdup(modtype);
760 of.numchn = mh->numchn;
761 of.numpat = mh->numpat;
762 of.numtrk = (UWORD) of.numpat * of.numchn; /* get number of channels */
763 of.songname = DupStr(mh->songname, 20, 1);
764 of.numpos = mh->songlength; /* copy the songlength */
765 of.reppos = mh->restart < mh->songlength ? mh->restart : 0;
766 of.numins = mh->numins;
767 of.flags |= UF_XMPERIODS | UF_INST | UF_BGSLIDES | UF_NOWRAP | UF_FT2QUIRKS;
769 of.flags |= UF_LINEAR;
771 memset(of.chanvol, 64, of.numchn); /* store channel volumes */
773 if (!AllocPositions(of.numpos + 1))
775 for (t = 0; t < of.numpos; t++)
776 of.positions[t] = mh->orders[t];
778 /* We have to check for any pattern numbers in the order list greater than
779 the number of patterns total. If one or more is found, we set it equal to
780 the pattern total and make a dummy pattern to workaround the problem */
781 for (t = 0; t < of.numpos; t++)
783 if (of.positions[t] >= of.numpat)
785 of.positions[t] = of.numpat;
792 of.numtrk += of.numchn;
795 if (mh->version < 0x0104)
797 if (!LoadInstruments())
799 if (!LoadPatterns(dummypat))
801 for (t = 0; t < of.numsmp; t++)
802 nextwav[t] += _mm_ftell(modreader);
806 if (!LoadPatterns(dummypat))
808 if (!LoadInstruments())
822 for (u = 0; u < of.numsmp; u++, q++, s++)
824 q->samplename = DupStr(s->samplename, 22, 1);
825 q->length = s->length;
826 q->loopstart = s->loopstart;
827 q->loopend = s->loopstart + s->looplength;
828 q->volume = s->volume;
829 q->speed = s->finetune + 128;
830 q->panning = s->panning;
831 q->seekpos = nextwav[u];
832 q->vibtype = s->vibtype;
833 q->vibsweep = s->vibsweep;
834 q->vibdepth = s->vibdepth;
835 q->vibrate = s->vibrate;
844 q->flags |= SF_OWNPAN;
850 q->flags |= SF_16BITS;
851 q->flags |= SF_DELTA | SF_SIGNED;
856 for (u = 0; u < of.numins; u++, d++)
857 for (t = 0; t < XMNOTECNT; t++)
859 if (d->samplenumber[t] >= of.numsmp)
860 d->samplenote[t] = 255;
863 int note = t + s[d->samplenumber[t]].relnote;
864 d->samplenote[t] = (note < 0) ? 0 : note;
880 _mm_fseek(modreader, 17, SEEK_SET);
881 if (!_mm_read_UBYTES(s, 21, modreader))
884 return (DupStr(s, 21, 1));
887 /*========== Loader information */
893 "XM (FastTracker 2)",