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 UNIMOD (libmikmod's and APlayer's internal module format) loader
27 ==============================================================================*/
35 #include "unimod_priv.h"
37 /*========== Module structure */
39 typedef struct UNIHEADER
60 typedef struct UNISMP05
78 /*========== Loader variables */
80 static UWORD universion;
83 #define UNI_SMPINCR 64
84 static UNISMP05 *wh = NULL, *s = NULL;
86 /*========== Loader code */
94 len = _mm_read_I_UWORD (modreader);
97 s = _mm_malloc (len + 1);
98 _mm_read_UBYTES (s, len, modreader);
109 if (!_mm_read_UBYTES (id, 6, modreader))
112 /* UNIMod created by MikCvt */
113 if (!(memcmp (id, "UN0", 3)))
115 if ((id[3] >= '4') && (id[3] <= '6'))
118 /* UNIMod created by APlayer */
119 if (!(memcmp (id, "APUN\01", 5)))
121 if ((id[5] >= 1) && (id[5] <= 4))
148 len = _mm_read_M_UWORD (modreader);
150 len = _mm_read_I_UWORD (modreader);
154 if (!(t = _mm_malloc (len)))
156 _mm_read_UBYTES (t, len, modreader);
158 /* Check if the track is correct */
164 chunk = (chunk & 0x1f) - 1;
186 /* UNI_NOTE .. UNI_S3MEFFECTQ are the same */
188 opcode = UNI_S3MEFFECTT;
191 opcode = UNI_XMEFFECTA;
194 opcode = UNI_XMEFFECTG;
197 opcode = UNI_XMEFFECTH;
200 opcode = UNI_XMEFFECTP;
206 if (opcode > UNI_ITEFFECTP)
208 /* APlayer < 1.03 does not have ITEFFECTT */
209 if (universion < 0x103)
211 /* APlayer < 1.02 does not have ITEFFECTZ */
212 if ((opcode > UNI_ITEFFECTY) && (universion < 0x102))
217 if ((!opcode) || (opcode >= UNI_LAST))
222 oplen = unioperands[opcode] + 1;
226 if ((chunk < 0) || (cur >= len))
242 for (t = 0; t < of.numsmp; t++, s++)
246 flags = _mm_read_M_UWORD (modreader);
249 s->flags |= SF_REVERSE;
251 s->flags |= SF_STEREO;
253 s->flags |= SF_SIGNED;
255 s->flags |= SF_16BITS;
257 if (universion >= 0x102)
260 s->flags |= SF_UST_LOOP;
262 s->flags |= SF_OWNPAN;
264 s->flags |= SF_SUSTAIN;
270 s->flags |= SF_ITPACKED;
272 s->flags |= SF_DELTA;
274 s->flags |= SF_BIG_ENDIAN;
279 s->flags |= SF_UST_LOOP;
281 s->flags |= SF_OWNPAN;
283 s->flags |= SF_SUSTAIN;
289 s->flags |= SF_BIG_ENDIAN;
291 s->flags |= SF_DELTA;
294 s->speed = _mm_read_M_ULONG (modreader);
295 s->volume = _mm_read_UBYTE (modreader);
296 s->panning = _mm_read_M_UWORD (modreader);
297 s->length = _mm_read_M_ULONG (modreader);
298 s->loopstart = _mm_read_M_ULONG (modreader);
299 s->loopend = _mm_read_M_ULONG (modreader);
300 s->susbegin = _mm_read_M_ULONG (modreader);
301 s->susend = _mm_read_M_ULONG (modreader);
302 s->globvol = _mm_read_UBYTE (modreader);
303 s->vibflags = _mm_read_UBYTE (modreader);
304 s->vibtype = _mm_read_UBYTE (modreader);
305 s->vibsweep = _mm_read_UBYTE (modreader);
306 s->vibdepth = _mm_read_UBYTE (modreader);
307 s->vibrate = _mm_read_UBYTE (modreader);
309 s->samplename = readstring ();
311 if (_mm_eof (modreader))
313 _mm_errno = MMERR_LOADING_SAMPLEINFO;
327 for (t = 0; t < of.numins; t++, i++)
329 i->flags = _mm_read_UBYTE (modreader);
330 i->nnatype = _mm_read_UBYTE (modreader);
331 i->dca = _mm_read_UBYTE (modreader);
332 i->dct = _mm_read_UBYTE (modreader);
333 i->globvol = _mm_read_UBYTE (modreader);
334 i->panning = _mm_read_M_UWORD (modreader);
335 i->pitpansep = _mm_read_UBYTE (modreader);
336 i->pitpancenter = _mm_read_UBYTE (modreader);
337 i->rvolvar = _mm_read_UBYTE (modreader);
338 i->rpanvar = _mm_read_UBYTE (modreader);
339 i->volfade = _mm_read_M_UWORD (modreader);
341 #define UNI_LoadEnvelope6(name) \
342 i->name##flg=_mm_read_UBYTE(modreader); \
343 i->name##pts=_mm_read_UBYTE(modreader); \
344 i->name##susbeg=_mm_read_UBYTE(modreader); \
345 i->name##susend=_mm_read_UBYTE(modreader); \
346 i->name##beg=_mm_read_UBYTE(modreader); \
347 i->name##end=_mm_read_UBYTE(modreader); \
348 for(w=0;w<(universion>=0x100?32:i->name##pts);w++) { \
349 i->name##env[w].pos=_mm_read_M_SWORD(modreader); \
350 i->name##env[w].val=_mm_read_M_SWORD(modreader); \
353 UNI_LoadEnvelope6 (vol);
354 UNI_LoadEnvelope6 (pan);
355 UNI_LoadEnvelope6 (pit);
356 #undef UNI_LoadEnvelope6
358 if (universion == 0x103)
359 _mm_read_M_UWORDS (i->samplenumber, 120, modreader);
361 for (w = 0; w < 120; w++)
362 i->samplenumber[w] = _mm_read_UBYTE (modreader);
363 _mm_read_UBYTES (i->samplenote, 120, modreader);
365 i->insname = readstring ();
367 if (_mm_eof (modreader))
369 _mm_errno = MMERR_LOADING_SAMPLEINFO;
382 UBYTE vibtype, vibsweep, vibdepth, vibrate;
385 for (of.numsmp = t = 0; t < of.numins; t++, i++)
389 numsmp = _mm_read_UBYTE (modreader);
391 memset (i->samplenumber, 0xff, INSTNOTES * sizeof (UWORD));
392 for (u = 0; u < 96; u++)
393 i->samplenumber[u] = of.numsmp + _mm_read_UBYTE (modreader);
395 #define UNI_LoadEnvelope5(name) \
396 i->name##flg=_mm_read_UBYTE(modreader); \
397 i->name##pts=_mm_read_UBYTE(modreader); \
398 i->name##susbeg=_mm_read_UBYTE(modreader); \
399 i->name##susend=i->name##susbeg; \
400 i->name##beg=_mm_read_UBYTE(modreader); \
401 i->name##end=_mm_read_UBYTE(modreader); \
402 for(u=0;u<12;u++) { \
403 i->name##env[u].pos=_mm_read_I_SWORD(modreader); \
404 i->name##env[u].val=_mm_read_I_SWORD(modreader); \
407 UNI_LoadEnvelope5 (vol);
408 UNI_LoadEnvelope5 (pan);
409 #undef UNI_LoadEnvelope5
411 vibtype = _mm_read_UBYTE (modreader);
412 vibsweep = _mm_read_UBYTE (modreader);
413 vibdepth = _mm_read_UBYTE (modreader);
414 vibrate = _mm_read_UBYTE (modreader);
416 i->volfade = _mm_read_I_UWORD (modreader);
417 i->insname = readstring ();
419 for (u = 0; u < numsmp; u++, s++, of.numsmp++)
421 /* Allocate more room for sample information if necessary */
422 if (of.numsmp + u == wavcnt)
424 wavcnt += UNI_SMPINCR;
425 if (!(wh = realloc (wh, wavcnt * sizeof (UNISMP05))))
427 _mm_errno = MMERR_OUT_OF_MEMORY;
430 s = wh + (wavcnt - UNI_SMPINCR);
433 s->c2spd = _mm_read_I_UWORD (modreader);
434 s->transpose = _mm_read_SBYTE (modreader);
435 s->volume = _mm_read_UBYTE (modreader);
436 s->panning = _mm_read_UBYTE (modreader);
437 s->length = _mm_read_I_ULONG (modreader);
438 s->loopstart = _mm_read_I_ULONG (modreader);
439 s->loopend = _mm_read_I_ULONG (modreader);
440 s->flags = _mm_read_I_UWORD (modreader);
441 s->samplename = readstring ();
443 s->vibtype = vibtype;
444 s->vibsweep = vibsweep;
445 s->vibdepth = vibdepth;
446 s->vibrate = vibrate;
448 if (_mm_eof (modreader))
452 _mm_errno = MMERR_LOADING_SAMPLEINFO;
466 _mm_errno = MMERR_LOADING_SAMPLEINFO;
481 for (u = 0; u < of.numsmp; u++, q++, s++)
483 q->samplename = s->samplename;
485 q->length = s->length;
486 q->loopstart = s->loopstart;
487 q->loopend = s->loopend;
488 q->volume = s->volume;
490 q->panning = s->panning;
491 q->vibtype = s->vibtype;
492 q->vibsweep = s->vibsweep;
493 q->vibdepth = s->vibdepth;
494 q->vibrate = s->vibrate;
499 q->flags |= SF_REVERSE;
501 q->flags |= SF_SUSTAIN;
507 q->flags |= SF_BIG_ENDIAN;
509 q->flags |= SF_DELTA;
511 q->flags |= SF_SIGNED;
513 q->flags |= SF_16BITS;
518 for (u = 0; u < of.numins; u++, d++)
519 for (t = 0; t < INSTNOTES; t++)
520 d->samplenote[t] = (d->samplenumber[t] >= of.numsmp) ?
521 255 : (t + s[d->samplenumber[t]].transpose);
530 UNI_Load (BOOL curious)
533 char *modtype, *oldtype = NULL;
537 /* read module header */
538 _mm_read_UBYTES (mh.id, 4, modreader);
540 universion = mh.id[3] - '0';
547 _mm_read_UBYTE (modreader);
549 universion = _mm_read_M_UWORD (modreader);
551 mh.flags = _mm_read_M_UWORD (modreader);
552 mh.numchn = _mm_read_UBYTE (modreader);
553 mh.numvoices = _mm_read_UBYTE (modreader);
554 mh.numpos = _mm_read_M_UWORD (modreader);
555 mh.numpat = _mm_read_M_UWORD (modreader);
556 mh.numtrk = _mm_read_M_UWORD (modreader);
557 mh.numins = _mm_read_M_UWORD (modreader);
558 mh.numsmp = _mm_read_M_UWORD (modreader);
559 mh.reppos = _mm_read_M_UWORD (modreader);
560 mh.initspeed = _mm_read_UBYTE (modreader);
561 mh.inittempo = _mm_read_UBYTE (modreader);
562 mh.initvolume = _mm_read_UBYTE (modreader);
564 mh.flags &= (UF_XMPERIODS | UF_LINEAR | UF_INST | UF_NNA);
568 mh.numchn = _mm_read_UBYTE (modreader);
569 mh.numpos = _mm_read_I_UWORD (modreader);
570 mh.reppos = (universion == 5) ? _mm_read_I_UWORD (modreader) : 0;
571 mh.numpat = _mm_read_I_UWORD (modreader);
572 mh.numtrk = _mm_read_I_UWORD (modreader);
573 mh.numins = _mm_read_I_UWORD (modreader);
574 mh.initspeed = _mm_read_UBYTE (modreader);
575 mh.inittempo = _mm_read_UBYTE (modreader);
576 _mm_read_UBYTES (mh.positions, 256, modreader);
577 _mm_read_UBYTES (mh.panning, 32, modreader);
578 mh.flags = _mm_read_UBYTE (modreader);
580 mh.flags &= (UF_XMPERIODS | UF_LINEAR);
581 mh.flags |= UF_INST | UF_NOWRAP;
584 /* set module parameters */
586 of.numchn = mh.numchn;
587 of.numpos = mh.numpos;
588 of.numpat = mh.numpat;
589 of.numtrk = mh.numtrk;
590 of.numins = mh.numins;
591 of.reppos = mh.reppos;
592 of.initspeed = mh.initspeed;
593 of.inittempo = mh.inittempo;
595 of.songname = readstring ();
596 if (universion < 0x102)
597 oldtype = readstring ();
600 int len = strlen (oldtype) + 20;
601 if (!(modtype = _mm_malloc (len)))
604 snprintf (modtype, len, "%s (was %s)", (universion >= 0x100) ? "APlayer" : "MikCvt2", oldtype);
606 sprintf (modtype, "%s (was %s)", (universion >= 0x100) ? "APlayer" : "MikCvt2", oldtype);
611 if (!(modtype = _mm_malloc (10)))
614 snprintf (modtype, 10, "%s", (universion >= 0x100) ? "APlayer" : "MikCvt3");
616 sprintf (modtype, "%s", (universion >= 0x100) ? "APlayer" : "MikCvt3");
619 of.modtype = strdup (modtype);
622 of.comment = readstring ();
626 of.numvoices = mh.numvoices;
627 of.initvolume = mh.initvolume;
630 if (_mm_eof (modreader))
632 _mm_errno = MMERR_LOADING_HEADER;
637 if (!AllocPositions (of.numpos))
641 if (universion >= 0x100)
642 _mm_read_M_UWORDS (of.positions, of.numpos, modreader);
644 for (t = 0; t < of.numpos; t++)
645 of.positions[t] = _mm_read_UBYTE (modreader);
646 _mm_read_M_UWORDS (of.panning, of.numchn, modreader);
647 _mm_read_UBYTES (of.chanvol, of.numchn, modreader);
651 if ((mh.numpos > 256) || (mh.numchn > 32))
653 _mm_errno = MMERR_LOADING_HEADER;
656 for (t = 0; t < of.numpos; t++)
657 of.positions[t] = mh.positions[t];
658 for (t = 0; t < of.numchn; t++)
659 of.panning[t] = mh.panning[t];
662 /* instruments and samples */
665 of.numsmp = mh.numsmp;
666 if (!AllocSamples ())
671 if (of.flags & UF_INST)
673 if (!AllocInstruments ())
681 if (!AllocInstruments ())
685 if (!AllocSamples ())
697 /* check if the original file had no instruments */
698 if (of.numsmp == of.numins)
700 for (t = 0, d = of.instruments; t < of.numins; t++, d++)
704 if ((d->volpts) || (d->panpts) || (d->globvol != 64))
706 for (u = 0; u < 96; u++)
707 if ((d->samplenumber[u] != t) || (d->samplenote[u] != u))
714 of.flags &= ~UF_INST;
715 of.flags &= ~UF_NOWRAP;
716 for (t = 0, d = of.instruments, q = of.samples; t < of.numins; t++, d++, q++)
718 q->samplename = d->insname;
726 if (!AllocPatterns ())
730 _mm_read_M_UWORDS (of.pattrows, of.numpat, modreader);
731 _mm_read_M_UWORDS (of.patterns, of.numpat * of.numchn, modreader);
735 _mm_read_I_UWORDS (of.pattrows, of.numpat, modreader);
736 _mm_read_I_UWORDS (of.patterns, of.numpat * of.numchn, modreader);
742 for (t = 0; t < of.numtrk; t++)
743 if (!(of.tracks[t] = readtrack ()))
745 _mm_errno = MMERR_LOADING_TRACK;
759 _mm_fseek (modreader, 3, SEEK_SET);
760 ver = _mm_read_UBYTE (modreader);
764 _mm_fseek (modreader, posit[ver - '4'], SEEK_SET);
765 return readstring ();
768 /*========== Loader information */
774 "APUN (APlayer) and UNI (MikMod)",