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 Imago Orpheus (IMF) module loader
27 ==============================================================================*/
35 #include "unimod_priv.h"
37 /*========== Module structure */
40 typedef struct IMFHEADER
55 /* channel settings */
56 typedef struct IMFCHANNEL
66 /* instrument header */
67 #define IMFNOTECNT (10*OCTAVE)
68 #define IMFENVCNT (16*2)
69 typedef struct IMFINSTHEADER
72 UBYTE what[IMFNOTECNT];
73 UWORD volenv[IMFENVCNT];
74 UWORD panenv[IMFENVCNT];
75 UWORD pitenv[IMFENVCNT];
98 typedef struct IMFWAVHEADER
111 typedef struct IMFNOTE
113 UBYTE note, ins, eff1, dat1, eff2, dat2;
117 /*========== Loader variables */
119 static CHAR IMF_Version[] = "Imago Orpheus";
121 static IMFNOTE *imfpat = NULL;
122 static IMFHEADER *mh = NULL;
124 /*========== Loader code */
131 _mm_fseek (modreader, 0x3c, SEEK_SET);
132 if (!_mm_read_UBYTES (id, 4, modreader))
134 if (!memcmp (id, "IM10", 4))
142 if (!(imfpat = (IMFNOTE *) _mm_malloc (32 * 256 * sizeof (IMFNOTE))))
144 if (!(mh = (IMFHEADER *) _mm_malloc (sizeof (IMFHEADER))))
160 IMF_ReadPattern (SLONG size, UWORD rows)
162 int row = 0, flag, ch;
165 /* clear pattern data */
166 memset (imfpat, 255, 32 * 256 * sizeof (IMFNOTE));
168 while ((size > 0) && (row < rows))
170 flag = _mm_read_UBYTE (modreader);
173 if (_mm_eof (modreader))
175 _mm_errno = MMERR_LOADING_PATTERN;
181 ch = remap[flag & 31];
184 n = &imfpat[256 * ch + row];
190 n->note = _mm_read_UBYTE (modreader);
192 n->note = 0xa0; /* note off */
193 n->ins = _mm_read_UBYTE (modreader);
199 n->eff2 = _mm_read_UBYTE (modreader);
200 n->dat2 = _mm_read_UBYTE (modreader);
204 n->eff1 = _mm_read_UBYTE (modreader);
205 n->dat1 = _mm_read_UBYTE (modreader);
212 if ((size) || (row != rows))
214 _mm_errno = MMERR_LOADING_PATTERN;
221 IMF_ProcessCmd (UBYTE eff, UBYTE inf)
223 if ((eff) && (eff != 255))
226 case 0x01: /* set tempo */
227 UniEffect (UNI_S3MEFFECTA, inf);
229 case 0x02: /* set BPM */
231 UniEffect (UNI_S3MEFFECTT, inf);
233 case 0x03: /* tone portamento */
234 UniEffect (UNI_ITEFFECTG, inf);
236 case 0x04: /* porta + volslide */
237 UniEffect (UNI_ITEFFECTG, inf);
238 UniEffect (UNI_S3MEFFECTD, 0);
240 case 0x05: /* vibrato */
241 UniPTEffect (0x4, inf);
243 case 0x06: /* vibrato + volslide */
244 UniPTEffect (0x4, inf);
245 UniEffect (UNI_S3MEFFECTD, 0);
247 case 0x07: /* fine vibrato */
248 UniEffect (UNI_ITEFFECTU, inf);
250 case 0x08: /* tremolo */
251 UniEffect (UNI_S3MEFFECTR, inf);
253 case 0x09: /* arpeggio */
254 UniPTEffect (0x0, inf);
256 case 0x0a: /* panning */
257 UniPTEffect (0x8, (inf >= 128) ? 255 : (inf << 1));
259 case 0x0b: /* pan slide */
260 UniEffect (UNI_XMEFFECTP, inf);
262 case 0x0c: /* set channel volume */
264 UniPTEffect (0xc, inf);
266 case 0x0d: /* volume slide */
267 UniEffect (UNI_S3MEFFECTD, inf);
269 case 0x0e: /* fine volume slide */
273 UniEffect (UNI_S3MEFFECTD, 0x0f | inf);
275 UniEffect (UNI_S3MEFFECTD, 0xf0 | inf);
278 UniEffect (UNI_S3MEFFECTD, 0);
280 case 0x0f: /* set finetune */
281 UniPTEffect (0xe, 0x50 | (inf >> 4));
284 case 0x10: /* note slide up */
285 case 0x11: /* not slide down */
286 fprintf (stderr, "\rIMF effect 0x10/0x11 (note slide)"
287 " not implemented (eff=%2X inf=%2X)\n", eff, inf);
290 case 0x12: /* slide up */
291 UniEffect (UNI_S3MEFFECTF, inf);
293 case 0x13: /* slide down */
294 UniEffect (UNI_S3MEFFECTE, inf);
296 case 0x14: /* fine slide up */
300 UniEffect (UNI_S3MEFFECTF, 0xe0 | (inf / 4));
302 UniEffect (UNI_S3MEFFECTF, 0xf0 | (inf >> 4));
305 UniEffect (UNI_S3MEFFECTF, 0);
307 case 0x15: /* fine slide down */
311 UniEffect (UNI_S3MEFFECTE, 0xe0 | (inf / 4));
313 UniEffect (UNI_S3MEFFECTE, 0xf0 | (inf >> 4));
316 UniEffect (UNI_S3MEFFECTE, 0);
318 /* 0x16 set filter cutoff (awe32) */
319 /* 0x17 filter side + resonance (awe32) */
320 case 0x18: /* sample offset */
321 UniPTEffect (0x9, inf);
324 case 0x19: /* set fine sample offset */
325 fprintf (stderr, "\rIMF effect 0x19 (fine sample offset)"
326 " not implemented (inf=%2X)\n", inf);
329 case 0x1a: /* keyoff */
330 UniWriteByte (UNI_KEYOFF);
332 case 0x1b: /* retrig */
333 UniEffect (UNI_S3MEFFECTQ, inf);
335 case 0x1c: /* tremor */
336 UniEffect (UNI_S3MEFFECTI, inf);
338 case 0x1d: /* position jump */
339 UniPTEffect (0xb, inf);
341 case 0x1e: /* pattern break */
342 UniPTEffect (0xd, (inf >> 4) * 10 + (inf & 0xf));
344 case 0x1f: /* set master volume */
346 UniEffect (UNI_XMEFFECTG, inf);
348 case 0x20: /* master volume slide */
349 UniEffect (UNI_XMEFFECTH, inf);
351 case 0x21: /* extended effects */
354 case 0x1: /* set filter */
355 case 0x5: /* vibrato waveform */
356 case 0x8: /* tremolo waveform */
357 UniPTEffect (0xe, inf - 0x10);
359 case 0xa: /* pattern loop */
360 UniPTEffect (0xe, 0x60 | (inf & 0xf));
362 case 0xb: /* pattern delay */
363 UniPTEffect (0xe, 0xe0 | (inf & 0xf));
365 case 0x3: /* glissando */
366 case 0xc: /* note cut */
367 case 0xd: /* note delay */
368 case 0xf: /* invert loop */
369 UniPTEffect (0xe, inf);
371 case 0xe: /* ignore envelope */
372 UniEffect (UNI_ITEFFECTS0, 0x77); /* vol */
373 UniEffect (UNI_ITEFFECTS0, 0x79); /* pan */
374 UniEffect (UNI_ITEFFECTS0, 0x7b); /* pit */
378 /* 0x22 chorus (awe32) */
379 /* 0x23 reverb (awe32) */
384 IMF_ConvertTrack (IMFNOTE * tr, UWORD rows)
390 for (t = 0; t < rows; t++)
395 if ((ins) && (ins != 255))
396 UniInstrument (ins - 1);
401 UniPTEffect (0xc, 0); /* Note cut */
402 if (tr[t].eff1 == 0x0c)
404 if (tr[t].eff2 == 0x0c)
408 UniNote (((note >> 4) * OCTAVE) + (note & 0xf));
411 IMF_ProcessCmd (tr[t].eff1, tr[t].dat1);
412 IMF_ProcessCmd (tr[t].eff2, tr[t].dat2);
419 IMF_Load (BOOL curious)
421 #define IMF_SMPINCR 64
423 IMFCHANNEL channels[32];
426 IMFWAVHEADER *wh = NULL, *s = NULL;
427 ULONG *nextwav = NULL;
431 /* try to read the module header */
432 _mm_read_string (mh->songname, 32, modreader);
433 mh->ordnum = _mm_read_I_UWORD (modreader);
434 mh->patnum = _mm_read_I_UWORD (modreader);
435 mh->insnum = _mm_read_I_UWORD (modreader);
436 mh->flags = _mm_read_I_UWORD (modreader);
437 _mm_fseek (modreader, 8, SEEK_CUR);
438 mh->initspeed = _mm_read_UBYTE (modreader);
439 mh->inittempo = _mm_read_UBYTE (modreader);
440 mh->mastervol = _mm_read_UBYTE (modreader);
441 mh->mastermult = _mm_read_UBYTE (modreader);
442 _mm_fseek (modreader, 64, SEEK_SET);
444 if (_mm_eof (modreader))
446 _mm_errno = MMERR_LOADING_HEADER;
450 /* set module variables */
451 of.songname = DupStr (mh->songname, 31, 1);
452 of.modtype = strdup (IMF_Version);
453 of.numpat = mh->patnum;
454 of.numins = mh->insnum;
456 of.initspeed = mh->initspeed;
457 of.inittempo = mh->inittempo;
458 of.initvolume = mh->mastervol << 1;
461 of.flags |= UF_LINEAR;
463 /* read channel information */
465 memset (remap, -1, 32 * sizeof (UBYTE));
466 for (t = 0; t < 32; t++)
468 _mm_read_string (channels[t].name, 12, modreader);
469 channels[t].chorus = _mm_read_UBYTE (modreader);
470 channels[t].reverb = _mm_read_UBYTE (modreader);
471 channels[t].pan = _mm_read_UBYTE (modreader);
472 channels[t].status = _mm_read_UBYTE (modreader);
474 /* bug in Imago Orpheus ? If only channel 1 is enabled, in fact we have to
475 enable 16 channels */
476 if (!channels[0].status)
478 for (t = 1; t < 16; t++)
479 if (channels[t].status != 1)
482 for (t = 1; t < 16; t++)
483 channels[t].status = 0;
485 for (t = 0; t < 32; t++)
487 if (channels[t].status != 2)
488 remap[t] = of.numchn++;
492 for (t = 0; t < 32; t++)
495 of.panning[remap[t]] = channels[t].pan;
496 of.chanvol[remap[t]] = channels[t].status ? 0 : 64;
499 if (_mm_eof (modreader))
501 _mm_errno = MMERR_LOADING_HEADER;
505 /* read order list */
506 _mm_read_UBYTES (mh->orders, 256, modreader);
507 if (_mm_eof (modreader))
509 _mm_errno = MMERR_LOADING_HEADER;
514 for (t = 0; t < mh->ordnum; t++)
515 if (mh->orders[t] != 0xff)
517 if (!AllocPositions (of.numpos))
519 for (t = u = 0; t < mh->ordnum; t++)
520 if (mh->orders[t] != 0xff)
521 of.positions[u++] = mh->orders[t];
523 /* load pattern info */
524 of.numtrk = of.numpat * of.numchn;
527 if (!AllocPatterns ())
530 for (t = 0; t < of.numpat; t++)
535 size = (SLONG) _mm_read_I_UWORD (modreader);
536 rows = _mm_read_I_UWORD (modreader);
537 if ((rows > 256) || (size < 4))
539 _mm_errno = MMERR_LOADING_PATTERN;
543 of.pattrows[t] = rows;
544 if (!IMF_ReadPattern (size - 4, rows))
546 for (u = 0; u < of.numchn; u++)
547 if (!(of.tracks[track++] = IMF_ConvertTrack (&imfpat[u * 256], rows)))
551 /* load instruments */
552 if (!AllocInstruments ())
556 for (t = 0; t < of.numins; t++)
560 memset (d->samplenumber, 0xff, INSTNOTES * sizeof (UWORD));
562 /* read instrument header */
563 _mm_read_string (ih.name, 32, modreader);
564 d->insname = DupStr (ih.name, 31, 1);
565 _mm_read_UBYTES (ih.what, IMFNOTECNT, modreader);
566 _mm_fseek (modreader, 8, SEEK_CUR);
567 _mm_read_I_UWORDS (ih.volenv, IMFENVCNT, modreader);
568 _mm_read_I_UWORDS (ih.panenv, IMFENVCNT, modreader);
569 _mm_read_I_UWORDS (ih.pitenv, IMFENVCNT, modreader);
571 #define IMF_FinishLoadingEnvelope(name) \
572 ih.name##pts=_mm_read_UBYTE(modreader); \
573 ih.name##sus=_mm_read_UBYTE(modreader); \
574 ih.name##beg=_mm_read_UBYTE(modreader); \
575 ih.name##end=_mm_read_UBYTE(modreader); \
576 ih.name##flg=_mm_read_UBYTE(modreader); \
577 _mm_read_UBYTE(modreader); \
578 _mm_read_UBYTE(modreader); \
579 _mm_read_UBYTE(modreader);
581 IMF_FinishLoadingEnvelope (vol);
582 IMF_FinishLoadingEnvelope (pan);
583 IMF_FinishLoadingEnvelope (pit);
585 ih.volfade = _mm_read_I_UWORD (modreader);
586 ih.numsmp = _mm_read_I_UWORD (modreader);
588 _mm_read_UBYTES (id, 4, modreader);
589 if (memcmp (id, "II10", 4))
595 _mm_errno = MMERR_LOADING_SAMPLEINFO;
598 if ((ih.numsmp > 16) || (ih.volpts > IMFENVCNT / 2) || (ih.panpts > IMFENVCNT / 2) ||
599 (ih.pitpts > IMFENVCNT / 2) || (_mm_eof (modreader)))
605 _mm_errno = MMERR_LOADING_SAMPLEINFO;
609 for (u = 0; u < IMFNOTECNT; u++)
610 d->samplenumber[u] = ih.what[u] > ih.numsmp ? 0xffff : ih.what[u] + of.numsmp;
611 d->volfade = ih.volfade;
613 #define IMF_ProcessEnvelope(name) \
614 for (u = 0; u < (IMFENVCNT >> 1); u++) { \
615 d->name##env[u].pos = ih.name##env[u << 1]; \
616 d->name##env[u].val = ih.name##env[(u << 1)+ 1]; \
618 if (ih.name##flg&1) d->name##flg|=EF_ON; \
619 if (ih.name##flg&2) d->name##flg|=EF_SUSTAIN; \
620 if (ih.name##flg&4) d->name##flg|=EF_LOOP; \
621 d->name##susbeg=d->name##susend=ih.name##sus; \
622 d->name##beg=ih.name##beg; \
623 d->name##end=ih.name##end; \
624 d->name##pts=ih.name##pts; \
626 if ((d->name##flg&EF_ON)&&(d->name##pts<2)) \
627 d->name##flg&=~EF_ON;
629 IMF_ProcessEnvelope (vol);
630 IMF_ProcessEnvelope (pan);
631 IMF_ProcessEnvelope (pit);
632 #undef IMF_ProcessEnvelope
638 fputs ("\rFilter envelopes not supported yet\n", stderr);
642 /* gather sample information */
643 for (u = 0; u < ih.numsmp; u++, s++)
645 /* allocate more room for sample information if necessary */
646 if (of.numsmp + u == wavcnt)
648 wavcnt += IMF_SMPINCR;
649 if (!(nextwav = realloc (nextwav, wavcnt * sizeof (ULONG))))
653 _mm_errno = MMERR_OUT_OF_MEMORY;
656 if (!(wh = realloc (wh, wavcnt * sizeof (IMFWAVHEADER))))
659 _mm_errno = MMERR_OUT_OF_MEMORY;
662 s = wh + (wavcnt - IMF_SMPINCR);
665 _mm_read_string (s->samplename, 13, modreader);
666 _mm_read_UBYTE (modreader);
667 _mm_read_UBYTE (modreader);
668 _mm_read_UBYTE (modreader);
669 s->length = _mm_read_I_ULONG (modreader);
670 s->loopstart = _mm_read_I_ULONG (modreader);
671 s->loopend = _mm_read_I_ULONG (modreader);
672 s->samplerate = _mm_read_I_ULONG (modreader);
673 s->volume = _mm_read_UBYTE (modreader) & 0x7f;
674 s->pan = _mm_read_UBYTE (modreader);
675 _mm_fseek (modreader, 14, SEEK_CUR);
676 s->flags = _mm_read_UBYTE (modreader);
677 _mm_fseek (modreader, 11, SEEK_CUR);
678 _mm_read_UBYTES (id, 4, modreader);
679 if (((memcmp (id, "IS10", 4)) && (memcmp (id, "IW10", 4))) ||
680 (_mm_eof (modreader)))
684 _mm_errno = MMERR_LOADING_SAMPLEINFO;
687 nextwav[of.numsmp + u] = _mm_ftell (modreader);
688 _mm_fseek (modreader, s->length, SEEK_CUR);
691 of.numsmp += ih.numsmp;
702 _mm_errno = MMERR_LOADING_SAMPLEINFO;
707 if (!AllocSamples ())
721 for (u = 0; u < of.numsmp; u++, s++, q++)
723 q->samplename = DupStr (s->samplename, 12, 1);
724 q->length = s->length;
725 q->loopstart = s->loopstart;
726 q->loopend = s->loopend;
727 q->volume = s->volume;
728 q->speed = s->samplerate;
729 if (of.flags & UF_LINEAR)
730 q->speed = speed_to_finetune (s->samplerate << 1, u);
732 q->seekpos = nextwav[u];
734 q->flags |= SF_SIGNED;
740 q->flags |= SF_OWNPAN;
743 q->flags |= SF_16BITS;
752 for (u = 0; u < of.numins; u++, d++)
754 for (t = 0; t < IMFNOTECNT; t++)
756 if (d->samplenumber[t] >= of.numsmp)
757 d->samplenote[t] = 255;
758 else if (of.flags & UF_LINEAR)
760 int note = (int) d->samplenote[u] + noteindex[d->samplenumber[u]];
761 d->samplenote[u] = (note < 0) ? 0 : (note > 255 ? 255 : note);
764 d->samplenote[t] = t;
778 _mm_fseek (modreader, 0, SEEK_SET);
779 if (!_mm_read_UBYTES (s, 31, modreader))
782 return (DupStr (s, 31, 1));
785 /*========== Loader information */
791 "IMF (Imago Orpheus)",