1 /* MikMod sound library
\r
2 (c) 1998, 1999, 2000, 2001, 2002 Miodrag Vallat and others - see file
\r
3 AUTHORS for complete list.
\r
5 This library is free software; you can redistribute it and/or modify
\r
6 it under the terms of the GNU Library General Public License as
\r
7 published by the Free Software Foundation; either version 2 of
\r
8 the License, or (at your option) any later version.
\r
10 This program is distributed in the hope that it will be useful,
\r
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
13 GNU Library General Public License for more details.
\r
15 You should have received a copy of the GNU Library General Public
\r
16 License along with this library; if not, write to the Free Software
\r
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
\r
21 /*==============================================================================
\r
23 $Id: load_mod.c,v 1.2 2004/01/21 13:33:11 raph Exp $
\r
25 Generic MOD loader (Protracker, StarTracker, FastTracker, etc)
\r
27 ==============================================================================*/
\r
29 #ifdef HAVE_CONFIG_H
\r
33 #ifdef HAVE_UNISTD_H
\r
37 //#include <ctype.h>
\r
39 #ifdef HAVE_MEMORY_H
\r
44 #include "mikmod_internals.h"
\r
47 extern int fprintf(FILE *, const char *, ...);
\r
50 /*========== Module structure */
\r
52 typedef struct MSAMPINFO {
\r
53 CHAR samplename[23]; /* 22 in module, 23 in memory */
\r
61 typedef struct MODULEHEADER {
\r
62 CHAR songname[21]; /* the songname.. 20 in module, 21 in memory */
\r
63 MSAMPINFO samples[31]; /* all sampleinfo */
\r
64 UBYTE songlength; /* number of patterns used */
\r
65 UBYTE magic1; /* should be 127 */
\r
66 UBYTE positions[128]; /* which pattern to play at pos */
\r
67 UBYTE magic2[4]; /* string "M.K." or "FLT4" or "FLT8" */
\r
70 typedef struct MODTYPE {
\r
76 typedef struct MODNOTE {
\r
80 /*========== Loader variables */
\r
82 #define MODULEHEADERSIZE 0x438
\r
84 static CHAR protracker[] = "Protracker";
\r
85 static CHAR startrekker[] = "Startrekker";
\r
86 static CHAR fasttracker[] = "Fasttracker";
\r
87 static CHAR oktalyser[] = "Oktalyser";
\r
88 static CHAR oktalyzer[] = "Oktalyzer";
\r
89 static CHAR taketracker[] = "TakeTracker";
\r
90 static CHAR orpheus[] = "Imago Orpheus (MOD format)";
\r
92 static MODULEHEADER *mh = NULL;
\r
93 static MODNOTE *patbuf = NULL;
\r
94 static int modtype, trekker;
\r
96 /*========== Loader code */
\r
98 /* given the module ID, determine the number of channels and the tracker
\r
99 description ; also alters modtype */
\r
100 static BOOL MOD_CheckType(UBYTE *id, UBYTE *numchn, CHAR **descr)
\r
102 modtype = trekker = 0;
\r
104 /* Protracker and variants */
\r
105 if ((!memcmp(id, "M.K.", 4)) || (!memcmp(id, "M!K!", 4))) {
\r
106 *descr = protracker;
\r
113 if (((!memcmp(id, "FLT", 3)) || (!memcmp(id, "EXO", 3))) &&
\r
114 (isdigit(id[3]))) {
\r
115 *descr = startrekker;
\r
116 modtype = trekker = 1;
\r
117 *numchn = id[3] - '0';
\r
118 if (*numchn == 4 || *numchn == 8)
\r
120 #ifdef MIKMOD_DEBUG
\r
122 fprintf(stderr, "\rUnknown FLT%d module type\n", *numchn);
\r
127 /* Oktalyzer (Amiga) */
\r
128 if (!memcmp(id, "OKTA", 4)) {
\r
129 *descr = oktalyzer;
\r
135 /* Oktalyser (Atari) */
\r
136 if (!memcmp(id, "CD81", 4)) {
\r
137 *descr = oktalyser;
\r
144 if ((!memcmp(id + 1, "CHN", 3)) && (isdigit(id[0]))) {
\r
145 *descr = fasttracker;
\r
147 *numchn = id[0] - '0';
\r
150 /* Fasttracker or Taketracker */
\r
151 if (((!memcmp(id + 2, "CH", 2)) || (!memcmp(id + 2, "CN", 2)))
\r
152 && (isdigit(id[0])) && (isdigit(id[1]))) {
\r
153 if (id[3] == 'H') {
\r
154 *descr = fasttracker;
\r
155 modtype = 2; /* this can also be Imago Orpheus */
\r
157 *descr = taketracker;
\r
160 *numchn = (id[0] - '0') * 10 + (id[1] - '0');
\r
167 static BOOL MOD_Test(void)
\r
169 UBYTE id[4], numchn;
\r
172 _mm_fseek(modreader, MODULEHEADERSIZE, SEEK_SET);
\r
173 if (!_mm_read_UBYTES(id, 4, modreader))
\r
176 if (MOD_CheckType(id, &numchn, &descr))
\r
182 static BOOL MOD_Init(void)
\r
184 if (!(mh = (MODULEHEADER *)_mm_malloc(sizeof(MODULEHEADER))))
\r
189 static void MOD_Cleanup(void)
\r
196 Old (amiga) noteinfo:
\r
198 _____byte 1_____ byte2_ _____byte 3_____ byte4_
\r
200 0000 0000-00000000 0000 0000-00000000
\r
202 Upper four 12 bits for Lower four Effect command.
\r
203 bits of sam- note period. bits of sam-
\r
204 ple number. ple number.
\r
208 static UBYTE ConvertNote(MODNOTE *n, UBYTE lasteffect)
\r
210 UBYTE instrument, effect, effdat, note;
\r
212 UBYTE lastnote = 0;
\r
214 /* extract the various information from the 4 bytes that make up a note */
\r
215 instrument = (n->a & 0x10) | (n->c >> 4);
\r
216 period = (((UWORD)n->a & 0xf) << 8) + n->b;
\r
217 effect = n->c & 0xf;
\r
220 /* Convert the period to a note number */
\r
223 for (note = 0; note < 7 * OCTAVE; note++)
\r
224 if (period >= npertab[note])
\r
226 if (note == 7 * OCTAVE)
\r
233 /* if instrument does not exist, note cut */
\r
234 if ((instrument > 31) || (!mh->samples[instrument - 1].length)) {
\r
235 UniPTEffect(0xc, 0);
\r
237 effect = effdat = 0;
\r
239 /* Protracker handling */
\r
241 /* if we had a note, then change instrument... */
\r
243 UniInstrument(instrument - 1);
\r
244 /* ...otherwise, only adjust volume... */
\r
246 /* ...unless an effect was specified, which forces a new
\r
247 note to be played */
\r
248 if (effect || effdat) {
\r
249 UniInstrument(instrument - 1);
\r
253 mh->samples[instrument -
\r
257 /* Fasttracker handling */
\r
258 UniInstrument(instrument - 1);
\r
265 UniNote(note + 2 * OCTAVE - 1);
\r
269 /* Convert pattern jump from Dec to Hex */
\r
271 effdat = (((effdat & 0xf0) >> 4) * 10) + (effdat & 0xf);
\r
273 /* Volume slide, up has priority */
\r
274 if ((effect == 0xa) && (effdat & 0xf) && (effdat & 0xf0))
\r
277 /* Handle ``heavy'' volumes correctly */
\r
278 if ((effect == 0xc) && (effdat > 0x40))
\r
281 /* An isolated 100, 200 or 300 effect should be ignored (no
\r
282 "standalone" porta memory in mod files). However, a sequence such
\r
283 as 1XX, 100, 100, 100 is fine. */
\r
284 if ((!effdat) && ((effect == 1)||(effect == 2)||(effect ==3)) &&
\r
285 (lasteffect < 0x10) && (effect != lasteffect))
\r
288 UniPTEffect(effect, effdat);
\r
290 of.flags |= UF_PANNING;
\r
295 static UBYTE *ConvertTrack(MODNOTE *n, int numchn)
\r
298 UBYTE lasteffect = 0x10; /* non existant effect */
\r
301 for (t = 0; t < 64; t++) {
\r
302 lasteffect = ConvertNote(n,lasteffect);
\r
309 /* Loads all patterns of a modfile and converts them into the 3 byte format. */
\r
310 static BOOL ML_LoadPatterns(void)
\r
312 int t, s, tracks = 0;
\r
314 if (!AllocPatterns())
\r
316 if (!AllocTracks())
\r
319 /* Allocate temporary buffer for loading and converting the patterns */
\r
320 if (!(patbuf = (MODNOTE *)_mm_calloc(64U * of.numchn, sizeof(MODNOTE))))
\r
323 if (trekker && of.numchn == 8) {
\r
324 /* Startrekker module dual pattern */
\r
325 for (t = 0; t < of.numpat; t++) {
\r
326 for (s = 0; s < (64U * 4); s++) {
\r
327 patbuf[s].a = _mm_read_UBYTE(modreader);
\r
328 patbuf[s].b = _mm_read_UBYTE(modreader);
\r
329 patbuf[s].c = _mm_read_UBYTE(modreader);
\r
330 patbuf[s].d = _mm_read_UBYTE(modreader);
\r
332 for (s = 0; s < 4; s++)
\r
333 if (!(of.tracks[tracks++] = ConvertTrack(patbuf + s, 4)))
\r
335 for (s = 0; s < (64U * 4); s++) {
\r
336 patbuf[s].a = _mm_read_UBYTE(modreader);
\r
337 patbuf[s].b = _mm_read_UBYTE(modreader);
\r
338 patbuf[s].c = _mm_read_UBYTE(modreader);
\r
339 patbuf[s].d = _mm_read_UBYTE(modreader);
\r
341 for (s = 0; s < 4; s++)
\r
342 if (!(of.tracks[tracks++] = ConvertTrack(patbuf + s, 4)))
\r
346 /* Generic module pattern */
\r
347 for (t = 0; t < of.numpat; t++) {
\r
348 /* Load the pattern into the temp buffer and convert it */
\r
349 for (s = 0; s < (64U * of.numchn); s++) {
\r
350 patbuf[s].a = _mm_read_UBYTE(modreader);
\r
351 patbuf[s].b = _mm_read_UBYTE(modreader);
\r
352 patbuf[s].c = _mm_read_UBYTE(modreader);
\r
353 patbuf[s].d = _mm_read_UBYTE(modreader);
\r
355 for (s = 0; s < of.numchn; s++)
\r
356 if (!(of.tracks[tracks++] = ConvertTrack(patbuf + s, of.numchn)))
\r
363 static BOOL MOD_Load(BOOL curious)
\r
370 /* try to read module header */
\r
371 _mm_read_string((CHAR *)mh->songname, 20, modreader);
\r
372 mh->songname[20] = 0; /* just in case */
\r
374 for (t = 0; t < 31; t++) {
\r
375 s = &mh->samples[t];
\r
376 _mm_read_string(s->samplename, 22, modreader);
\r
377 s->samplename[22] = 0; /* just in case */
\r
378 s->length = _mm_read_M_UWORD(modreader);
\r
379 s->finetune = _mm_read_UBYTE(modreader);
\r
380 s->volume = _mm_read_UBYTE(modreader);
\r
381 s->reppos = _mm_read_M_UWORD(modreader);
\r
382 s->replen = _mm_read_M_UWORD(modreader);
\r
385 mh->songlength = _mm_read_UBYTE(modreader);
\r
387 /* this fixes mods which declare more than 128 positions.
\r
388 * eg: beatwave.mod */
\r
389 if (mh->songlength > 128) { mh->songlength = 128; }
\r
391 mh->magic1 = _mm_read_UBYTE(modreader);
\r
392 _mm_read_UBYTES(mh->positions, 128, modreader);
\r
393 _mm_read_UBYTES(mh->magic2, 4, modreader);
\r
395 if (_mm_eof(modreader)) {
\r
396 _mm_errno = MMERR_LOADING_HEADER;
\r
400 /* set module variables */
\r
402 of.inittempo = 125;
\r
403 if (!(MOD_CheckType(mh->magic2, &of.numchn, &descr))) {
\r
404 _mm_errno = MMERR_NOT_A_MODULE;
\r
407 if (trekker && of.numchn == 8)
\r
408 for (t = 0; t < 128; t++)
\r
409 /* if module pretends to be FLT8, yet the order table
\r
410 contains odd numbers, chances are it's a lying FLT4... */
\r
411 if (mh->positions[t] & 1) {
\r
415 if (trekker && of.numchn == 8)
\r
416 for (t = 0; t < 128; t++)
\r
417 mh->positions[t] >>= 1;
\r
419 of.songname = DupStr(mh->songname, 21, 1);
\r
420 of.numpos = mh->songlength;
\r
423 /* Count the number of patterns */
\r
425 for (t = 0; t < of.numpos; t++)
\r
426 if (mh->positions[t] > of.numpat)
\r
427 of.numpat = mh->positions[t];
\r
429 /* since some old modules embed extra patterns, we have to check the
\r
430 whole list to get the samples' file offsets right - however we can find
\r
431 garbage here, so check carefully */
\r
433 for (t = of.numpos; t < 128; t++)
\r
434 if (mh->positions[t] >= 0x80)
\r
437 for (t = of.numpos; t < 128; t++) {
\r
438 if (mh->positions[t] > of.numpat)
\r
439 of.numpat = mh->positions[t];
\r
440 if ((curious) && (mh->positions[t]))
\r
444 of.numtrk = of.numpat * of.numchn;
\r
446 if (!AllocPositions(of.numpos))
\r
448 for (t = 0; t < of.numpos; t++)
\r
449 of.positions[t] = mh->positions[t];
\r
451 /* Finally, init the sampleinfo structures */
\r
452 of.numins = of.numsmp = 31;
\r
453 if (!AllocSamples())
\r
457 for (t = 0; t < of.numins; t++) {
\r
458 /* convert the samplename */
\r
459 q->samplename = DupStr(s->samplename, 23, 1);
\r
460 /* init the sampleinfo variables and convert the size pointers */
\r
461 q->speed = finetune[s->finetune & 0xf];
\r
462 q->volume = s->volume & 0x7f;
\r
463 q->loopstart = (ULONG)s->reppos << 1;
\r
464 q->loopend = q->loopstart + ((ULONG)s->replen << 1);
\r
465 q->length = (ULONG)s->length << 1;
\r
466 q->flags = SF_SIGNED;
\r
467 /* Imago Orpheus creates MODs with 16 bit samples, check */
\r
468 if ((modtype == 2) && (s->volume & 0x80)) {
\r
469 q->flags |= SF_16BITS;
\r
473 q->flags |= SF_LOOP;
\r
479 of.modtype = strdup(descr);
\r
481 if (!ML_LoadPatterns())
\r
487 static CHAR *MOD_LoadTitle(void)
\r
491 _mm_fseek(modreader, 0, SEEK_SET);
\r
492 if (!_mm_read_UBYTES(s, 20, modreader))
\r
494 s[20] = 0; /* just in case */
\r
496 return (DupStr(s, 21, 1));
\r
499 /*========== Loader information */
\r
501 MIKMODAPI MLOADER load_mod = {
\r
504 "MOD (31 instruments)",
\r