PageRenderTime 71ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 1ms

/lib/timidity/libunimod/load_imf.c

http://github.com/xbmc/xbmc
C | 799 lines | 676 code | 70 blank | 53 comment | 119 complexity | 34205b5657aa7eab2d56278bb4493fec MD5 | raw file
Possible License(s): GPL-3.0, CC-BY-SA-3.0, LGPL-2.0, 0BSD, Unlicense, GPL-2.0, AGPL-1.0, BSD-3-Clause, LGPL-2.1, LGPL-3.0
  1. /* MikMod sound library
  2. (c) 1998, 1999 Miodrag Vallat and others - see file AUTHORS for
  3. complete list.
  4. This library is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU Library General Public License as
  6. published by the Free Software Foundation; either version 2 of
  7. the License, or (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU Library General Public License for more details.
  12. You should have received a copy of the GNU Library General Public
  13. License along with this library; if not, write to the Free Software
  14. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  15. 02111-1307, USA.
  16. */
  17. /*==============================================================================
  18. $Id: load_imf.c,v 1.12 1999/10/25 16:31:41 miod Exp $
  19. Imago Orpheus (IMF) module loader
  20. ==============================================================================*/
  21. #ifdef HAVE_CONFIG_H
  22. #include "config.h"
  23. #endif
  24. #include <string.h>
  25. #include "unimod_priv.h"
  26. /*========== Module structure */
  27. /* module header */
  28. typedef struct IMFHEADER
  29. {
  30. CHAR songname[32];
  31. UWORD ordnum;
  32. UWORD patnum;
  33. UWORD insnum;
  34. UWORD flags;
  35. UBYTE initspeed;
  36. UBYTE inittempo;
  37. UBYTE mastervol;
  38. UBYTE mastermult;
  39. UBYTE orders[256];
  40. }
  41. IMFHEADER;
  42. /* channel settings */
  43. typedef struct IMFCHANNEL
  44. {
  45. CHAR name[12];
  46. UBYTE chorus;
  47. UBYTE reverb;
  48. UBYTE pan;
  49. UBYTE status;
  50. }
  51. IMFCHANNEL;
  52. /* instrument header */
  53. #define IMFNOTECNT (10*OCTAVE)
  54. #define IMFENVCNT (16*2)
  55. typedef struct IMFINSTHEADER
  56. {
  57. CHAR name[32];
  58. UBYTE what[IMFNOTECNT];
  59. UWORD volenv[IMFENVCNT];
  60. UWORD panenv[IMFENVCNT];
  61. UWORD pitenv[IMFENVCNT];
  62. UBYTE volpts;
  63. UBYTE volsus;
  64. UBYTE volbeg;
  65. UBYTE volend;
  66. UBYTE volflg;
  67. UBYTE panpts;
  68. UBYTE pansus;
  69. UBYTE panbeg;
  70. UBYTE panend;
  71. UBYTE panflg;
  72. UBYTE pitpts;
  73. UBYTE pitsus;
  74. UBYTE pitbeg;
  75. UBYTE pitend;
  76. UBYTE pitflg;
  77. UWORD volfade;
  78. UWORD numsmp;
  79. ULONG signature;
  80. }
  81. IMFINSTHEADER;
  82. /* sample header */
  83. typedef struct IMFWAVHEADER
  84. {
  85. CHAR samplename[13];
  86. ULONG length;
  87. ULONG loopstart;
  88. ULONG loopend;
  89. ULONG samplerate;
  90. UBYTE volume;
  91. UBYTE pan;
  92. UBYTE flags;
  93. }
  94. IMFWAVHEADER;
  95. typedef struct IMFNOTE
  96. {
  97. UBYTE note, ins, eff1, dat1, eff2, dat2;
  98. }
  99. IMFNOTE;
  100. /*========== Loader variables */
  101. static CHAR IMF_Version[] = "Imago Orpheus";
  102. static IMFNOTE *imfpat = NULL;
  103. static IMFHEADER *mh = NULL;
  104. /*========== Loader code */
  105. BOOL
  106. IMF_Test (void)
  107. {
  108. UBYTE id[4];
  109. _mm_fseek (modreader, 0x3c, SEEK_SET);
  110. if (!_mm_read_UBYTES (id, 4, modreader))
  111. return 0;
  112. if (!memcmp (id, "IM10", 4))
  113. return 1;
  114. return 0;
  115. }
  116. BOOL
  117. IMF_Init (void)
  118. {
  119. if (!(imfpat = (IMFNOTE *) _mm_malloc (32 * 256 * sizeof (IMFNOTE))))
  120. return 0;
  121. if (!(mh = (IMFHEADER *) _mm_malloc (sizeof (IMFHEADER))))
  122. return 0;
  123. return 1;
  124. }
  125. void
  126. IMF_Cleanup (void)
  127. {
  128. FreeLinear ();
  129. _mm_free (imfpat);
  130. _mm_free (mh);
  131. }
  132. static BOOL
  133. IMF_ReadPattern (SLONG size, UWORD rows)
  134. {
  135. int row = 0, flag, ch;
  136. IMFNOTE *n, dummy;
  137. /* clear pattern data */
  138. memset (imfpat, 255, 32 * 256 * sizeof (IMFNOTE));
  139. while ((size > 0) && (row < rows))
  140. {
  141. flag = _mm_read_UBYTE (modreader);
  142. size--;
  143. if (_mm_eof (modreader))
  144. {
  145. _mm_errno = MMERR_LOADING_PATTERN;
  146. return 0;
  147. }
  148. if (flag)
  149. {
  150. ch = remap[flag & 31];
  151. if (ch != -1)
  152. n = &imfpat[256 * ch + row];
  153. else
  154. n = &dummy;
  155. if (flag & 32)
  156. {
  157. n->note = _mm_read_UBYTE (modreader);
  158. if (n->note >= 0xa0)
  159. n->note = 0xa0; /* note off */
  160. n->ins = _mm_read_UBYTE (modreader);
  161. size -= 2;
  162. }
  163. if (flag & 64)
  164. {
  165. size -= 2;
  166. n->eff2 = _mm_read_UBYTE (modreader);
  167. n->dat2 = _mm_read_UBYTE (modreader);
  168. }
  169. if (flag & 128)
  170. {
  171. n->eff1 = _mm_read_UBYTE (modreader);
  172. n->dat1 = _mm_read_UBYTE (modreader);
  173. size -= 2;
  174. }
  175. }
  176. else
  177. row++;
  178. }
  179. if ((size) || (row != rows))
  180. {
  181. _mm_errno = MMERR_LOADING_PATTERN;
  182. return 0;
  183. }
  184. return 1;
  185. }
  186. static void
  187. IMF_ProcessCmd (UBYTE eff, UBYTE inf)
  188. {
  189. if ((eff) && (eff != 255))
  190. switch (eff)
  191. {
  192. case 0x01: /* set tempo */
  193. UniEffect (UNI_S3MEFFECTA, inf);
  194. break;
  195. case 0x02: /* set BPM */
  196. if (inf >= 0x20)
  197. UniEffect (UNI_S3MEFFECTT, inf);
  198. break;
  199. case 0x03: /* tone portamento */
  200. UniEffect (UNI_ITEFFECTG, inf);
  201. break;
  202. case 0x04: /* porta + volslide */
  203. UniEffect (UNI_ITEFFECTG, inf);
  204. UniEffect (UNI_S3MEFFECTD, 0);
  205. break;
  206. case 0x05: /* vibrato */
  207. UniPTEffect (0x4, inf);
  208. break;
  209. case 0x06: /* vibrato + volslide */
  210. UniPTEffect (0x4, inf);
  211. UniEffect (UNI_S3MEFFECTD, 0);
  212. break;
  213. case 0x07: /* fine vibrato */
  214. UniEffect (UNI_ITEFFECTU, inf);
  215. break;
  216. case 0x08: /* tremolo */
  217. UniEffect (UNI_S3MEFFECTR, inf);
  218. break;
  219. case 0x09: /* arpeggio */
  220. UniPTEffect (0x0, inf);
  221. break;
  222. case 0x0a: /* panning */
  223. UniPTEffect (0x8, (inf >= 128) ? 255 : (inf << 1));
  224. break;
  225. case 0x0b: /* pan slide */
  226. UniEffect (UNI_XMEFFECTP, inf);
  227. break;
  228. case 0x0c: /* set channel volume */
  229. if (inf <= 64)
  230. UniPTEffect (0xc, inf);
  231. break;
  232. case 0x0d: /* volume slide */
  233. UniEffect (UNI_S3MEFFECTD, inf);
  234. break;
  235. case 0x0e: /* fine volume slide */
  236. if (inf)
  237. {
  238. if (inf >> 4)
  239. UniEffect (UNI_S3MEFFECTD, 0x0f | inf);
  240. else
  241. UniEffect (UNI_S3MEFFECTD, 0xf0 | inf);
  242. }
  243. else
  244. UniEffect (UNI_S3MEFFECTD, 0);
  245. break;
  246. case 0x0f: /* set finetune */
  247. UniPTEffect (0xe, 0x50 | (inf >> 4));
  248. break;
  249. #ifdef MIKMOD_DEBUG
  250. case 0x10: /* note slide up */
  251. case 0x11: /* not slide down */
  252. fprintf (stderr, "\rIMF effect 0x10/0x11 (note slide)"
  253. " not implemented (eff=%2X inf=%2X)\n", eff, inf);
  254. break;
  255. #endif
  256. case 0x12: /* slide up */
  257. UniEffect (UNI_S3MEFFECTF, inf);
  258. break;
  259. case 0x13: /* slide down */
  260. UniEffect (UNI_S3MEFFECTE, inf);
  261. break;
  262. case 0x14: /* fine slide up */
  263. if (inf)
  264. {
  265. if (inf < 0x40)
  266. UniEffect (UNI_S3MEFFECTF, 0xe0 | (inf / 4));
  267. else
  268. UniEffect (UNI_S3MEFFECTF, 0xf0 | (inf >> 4));
  269. }
  270. else
  271. UniEffect (UNI_S3MEFFECTF, 0);
  272. break;
  273. case 0x15: /* fine slide down */
  274. if (inf)
  275. {
  276. if (inf < 0x40)
  277. UniEffect (UNI_S3MEFFECTE, 0xe0 | (inf / 4));
  278. else
  279. UniEffect (UNI_S3MEFFECTE, 0xf0 | (inf >> 4));
  280. }
  281. else
  282. UniEffect (UNI_S3MEFFECTE, 0);
  283. break;
  284. /* 0x16 set filter cutoff (awe32) */
  285. /* 0x17 filter side + resonance (awe32) */
  286. case 0x18: /* sample offset */
  287. UniPTEffect (0x9, inf);
  288. break;
  289. #ifdef MIKMOD_DEBUG
  290. case 0x19: /* set fine sample offset */
  291. fprintf (stderr, "\rIMF effect 0x19 (fine sample offset)"
  292. " not implemented (inf=%2X)\n", inf);
  293. break;
  294. #endif
  295. case 0x1a: /* keyoff */
  296. UniWriteByte (UNI_KEYOFF);
  297. break;
  298. case 0x1b: /* retrig */
  299. UniEffect (UNI_S3MEFFECTQ, inf);
  300. break;
  301. case 0x1c: /* tremor */
  302. UniEffect (UNI_S3MEFFECTI, inf);
  303. break;
  304. case 0x1d: /* position jump */
  305. UniPTEffect (0xb, inf);
  306. break;
  307. case 0x1e: /* pattern break */
  308. UniPTEffect (0xd, (inf >> 4) * 10 + (inf & 0xf));
  309. break;
  310. case 0x1f: /* set master volume */
  311. if (inf <= 64)
  312. UniEffect (UNI_XMEFFECTG, inf);
  313. break;
  314. case 0x20: /* master volume slide */
  315. UniEffect (UNI_XMEFFECTH, inf);
  316. break;
  317. case 0x21: /* extended effects */
  318. switch (inf >> 4)
  319. {
  320. case 0x1: /* set filter */
  321. case 0x5: /* vibrato waveform */
  322. case 0x8: /* tremolo waveform */
  323. UniPTEffect (0xe, inf - 0x10);
  324. break;
  325. case 0xa: /* pattern loop */
  326. UniPTEffect (0xe, 0x60 | (inf & 0xf));
  327. break;
  328. case 0xb: /* pattern delay */
  329. UniPTEffect (0xe, 0xe0 | (inf & 0xf));
  330. break;
  331. case 0x3: /* glissando */
  332. case 0xc: /* note cut */
  333. case 0xd: /* note delay */
  334. case 0xf: /* invert loop */
  335. UniPTEffect (0xe, inf);
  336. break;
  337. case 0xe: /* ignore envelope */
  338. UniEffect (UNI_ITEFFECTS0, 0x77); /* vol */
  339. UniEffect (UNI_ITEFFECTS0, 0x79); /* pan */
  340. UniEffect (UNI_ITEFFECTS0, 0x7b); /* pit */
  341. break;
  342. }
  343. break;
  344. /* 0x22 chorus (awe32) */
  345. /* 0x23 reverb (awe32) */
  346. }
  347. }
  348. static UBYTE *
  349. IMF_ConvertTrack (IMFNOTE * tr, UWORD rows)
  350. {
  351. int t;
  352. UBYTE note, ins;
  353. UniReset ();
  354. for (t = 0; t < rows; t++)
  355. {
  356. note = tr[t].note;
  357. ins = tr[t].ins;
  358. if ((ins) && (ins != 255))
  359. UniInstrument (ins - 1);
  360. if (note != 255)
  361. {
  362. if (note == 0xa0)
  363. {
  364. UniPTEffect (0xc, 0); /* Note cut */
  365. if (tr[t].eff1 == 0x0c)
  366. tr[t].eff1 = 0;
  367. if (tr[t].eff2 == 0x0c)
  368. tr[t].eff2 = 0;
  369. }
  370. else
  371. UniNote (((note >> 4) * OCTAVE) + (note & 0xf));
  372. }
  373. IMF_ProcessCmd (tr[t].eff1, tr[t].dat1);
  374. IMF_ProcessCmd (tr[t].eff2, tr[t].dat2);
  375. UniNewline ();
  376. }
  377. return UniDup ();
  378. }
  379. BOOL
  380. IMF_Load (BOOL curious)
  381. {
  382. #define IMF_SMPINCR 64
  383. int t, u, track = 0;
  384. IMFCHANNEL channels[32];
  385. INSTRUMENT *d;
  386. SAMPLE *q;
  387. IMFWAVHEADER *wh = NULL, *s = NULL;
  388. ULONG *nextwav = NULL;
  389. UWORD wavcnt = 0;
  390. UBYTE id[4];
  391. /* try to read the module header */
  392. _mm_read_string (mh->songname, 32, modreader);
  393. mh->ordnum = _mm_read_I_UWORD (modreader);
  394. mh->patnum = _mm_read_I_UWORD (modreader);
  395. mh->insnum = _mm_read_I_UWORD (modreader);
  396. mh->flags = _mm_read_I_UWORD (modreader);
  397. _mm_fseek (modreader, 8, SEEK_CUR);
  398. mh->initspeed = _mm_read_UBYTE (modreader);
  399. mh->inittempo = _mm_read_UBYTE (modreader);
  400. mh->mastervol = _mm_read_UBYTE (modreader);
  401. mh->mastermult = _mm_read_UBYTE (modreader);
  402. _mm_fseek (modreader, 64, SEEK_SET);
  403. if (_mm_eof (modreader))
  404. {
  405. _mm_errno = MMERR_LOADING_HEADER;
  406. return 0;
  407. }
  408. /* set module variables */
  409. of.songname = DupStr (mh->songname, 31, 1);
  410. of.modtype = strdup (IMF_Version);
  411. of.numpat = mh->patnum;
  412. of.numins = mh->insnum;
  413. of.reppos = 0;
  414. of.initspeed = mh->initspeed;
  415. of.inittempo = mh->inittempo;
  416. of.initvolume = mh->mastervol << 1;
  417. of.flags |= UF_INST;
  418. if (mh->flags & 1)
  419. of.flags |= UF_LINEAR;
  420. /* read channel information */
  421. of.numchn = 0;
  422. memset (remap, -1, 32 * sizeof (UBYTE));
  423. for (t = 0; t < 32; t++)
  424. {
  425. _mm_read_string (channels[t].name, 12, modreader);
  426. channels[t].chorus = _mm_read_UBYTE (modreader);
  427. channels[t].reverb = _mm_read_UBYTE (modreader);
  428. channels[t].pan = _mm_read_UBYTE (modreader);
  429. channels[t].status = _mm_read_UBYTE (modreader);
  430. }
  431. /* bug in Imago Orpheus ? If only channel 1 is enabled, in fact we have to
  432. enable 16 channels */
  433. if (!channels[0].status)
  434. {
  435. for (t = 1; t < 16; t++)
  436. if (channels[t].status != 1)
  437. break;
  438. if (t == 16)
  439. for (t = 1; t < 16; t++)
  440. channels[t].status = 0;
  441. }
  442. for (t = 0; t < 32; t++)
  443. {
  444. if (channels[t].status != 2)
  445. remap[t] = of.numchn++;
  446. else
  447. remap[t] = -1;
  448. }
  449. for (t = 0; t < 32; t++)
  450. if (remap[t] != -1)
  451. {
  452. of.panning[remap[t]] = channels[t].pan;
  453. of.chanvol[remap[t]] = channels[t].status ? 0 : 64;
  454. }
  455. if (_mm_eof (modreader))
  456. {
  457. _mm_errno = MMERR_LOADING_HEADER;
  458. return 0;
  459. }
  460. /* read order list */
  461. _mm_read_UBYTES (mh->orders, 256, modreader);
  462. if (_mm_eof (modreader))
  463. {
  464. _mm_errno = MMERR_LOADING_HEADER;
  465. return 0;
  466. }
  467. of.numpos = 0;
  468. for (t = 0; t < mh->ordnum; t++)
  469. if (mh->orders[t] != 0xff)
  470. of.numpos++;
  471. if (!AllocPositions (of.numpos))
  472. return 0;
  473. for (t = u = 0; t < mh->ordnum; t++)
  474. if (mh->orders[t] != 0xff)
  475. of.positions[u++] = mh->orders[t];
  476. /* load pattern info */
  477. of.numtrk = of.numpat * of.numchn;
  478. if (!AllocTracks ())
  479. return 0;
  480. if (!AllocPatterns ())
  481. return 0;
  482. for (t = 0; t < of.numpat; t++)
  483. {
  484. SLONG size;
  485. UWORD rows;
  486. size = (SLONG) _mm_read_I_UWORD (modreader);
  487. rows = _mm_read_I_UWORD (modreader);
  488. if ((rows > 256) || (size < 4))
  489. {
  490. _mm_errno = MMERR_LOADING_PATTERN;
  491. return 0;
  492. }
  493. of.pattrows[t] = rows;
  494. if (!IMF_ReadPattern (size - 4, rows))
  495. return 0;
  496. for (u = 0; u < of.numchn; u++)
  497. if (!(of.tracks[track++] = IMF_ConvertTrack (&imfpat[u * 256], rows)))
  498. return 0;
  499. }
  500. /* load instruments */
  501. if (!AllocInstruments ())
  502. return 0;
  503. d = of.instruments;
  504. for (t = 0; t < of.numins; t++)
  505. {
  506. IMFINSTHEADER ih;
  507. memset (d->samplenumber, 0xff, INSTNOTES * sizeof (UWORD));
  508. /* read instrument header */
  509. _mm_read_string (ih.name, 32, modreader);
  510. d->insname = DupStr (ih.name, 31, 1);
  511. _mm_read_UBYTES (ih.what, IMFNOTECNT, modreader);
  512. _mm_fseek (modreader, 8, SEEK_CUR);
  513. _mm_read_I_UWORDS (ih.volenv, IMFENVCNT, modreader);
  514. _mm_read_I_UWORDS (ih.panenv, IMFENVCNT, modreader);
  515. _mm_read_I_UWORDS (ih.pitenv, IMFENVCNT, modreader);
  516. #define IMF_FinishLoadingEnvelope(name) \
  517. ih.name##pts=_mm_read_UBYTE(modreader); \
  518. ih.name##sus=_mm_read_UBYTE(modreader); \
  519. ih.name##beg=_mm_read_UBYTE(modreader); \
  520. ih.name##end=_mm_read_UBYTE(modreader); \
  521. ih.name##flg=_mm_read_UBYTE(modreader); \
  522. _mm_read_UBYTE(modreader); \
  523. _mm_read_UBYTE(modreader); \
  524. _mm_read_UBYTE(modreader);
  525. IMF_FinishLoadingEnvelope (vol);
  526. IMF_FinishLoadingEnvelope (pan);
  527. IMF_FinishLoadingEnvelope (pit);
  528. ih.volfade = _mm_read_I_UWORD (modreader);
  529. ih.numsmp = _mm_read_I_UWORD (modreader);
  530. _mm_read_UBYTES (id, 4, modreader);
  531. if (memcmp (id, "II10", 4))
  532. {
  533. if (nextwav)
  534. free (nextwav);
  535. if (wh)
  536. free (wh);
  537. _mm_errno = MMERR_LOADING_SAMPLEINFO;
  538. return 0;
  539. }
  540. if ((ih.numsmp > 16) || (ih.volpts > IMFENVCNT / 2) || (ih.panpts > IMFENVCNT / 2) ||
  541. (ih.pitpts > IMFENVCNT / 2) || (_mm_eof (modreader)))
  542. {
  543. if (nextwav)
  544. free (nextwav);
  545. if (wh)
  546. free (wh);
  547. _mm_errno = MMERR_LOADING_SAMPLEINFO;
  548. return 0;
  549. }
  550. for (u = 0; u < IMFNOTECNT; u++)
  551. d->samplenumber[u] = ih.what[u] > ih.numsmp ? 0xffff : ih.what[u] + of.numsmp;
  552. d->volfade = ih.volfade;
  553. #define IMF_ProcessEnvelope(name) \
  554. for (u = 0; u < (IMFENVCNT >> 1); u++) { \
  555. d->name##env[u].pos = ih.name##env[u << 1]; \
  556. d->name##env[u].val = ih.name##env[(u << 1)+ 1]; \
  557. } \
  558. if (ih.name##flg&1) d->name##flg|=EF_ON; \
  559. if (ih.name##flg&2) d->name##flg|=EF_SUSTAIN; \
  560. if (ih.name##flg&4) d->name##flg|=EF_LOOP; \
  561. d->name##susbeg=d->name##susend=ih.name##sus; \
  562. d->name##beg=ih.name##beg; \
  563. d->name##end=ih.name##end; \
  564. d->name##pts=ih.name##pts; \
  565. \
  566. if ((d->name##flg&EF_ON)&&(d->name##pts<2)) \
  567. d->name##flg&=~EF_ON;
  568. IMF_ProcessEnvelope (vol);
  569. IMF_ProcessEnvelope (pan);
  570. IMF_ProcessEnvelope (pit);
  571. #undef IMF_ProcessEnvelope
  572. if (ih.pitflg & 1)
  573. {
  574. d->pitflg &= ~EF_ON;
  575. #ifdef MIKMOD_DEBUG
  576. fputs ("\rFilter envelopes not supported yet\n", stderr);
  577. #endif
  578. }
  579. /* gather sample information */
  580. for (u = 0; u < ih.numsmp; u++, s++)
  581. {
  582. /* allocate more room for sample information if necessary */
  583. if (of.numsmp + u == wavcnt)
  584. {
  585. wavcnt += IMF_SMPINCR;
  586. if (!(nextwav = realloc (nextwav, wavcnt * sizeof (ULONG))))
  587. {
  588. if (wh)
  589. free (wh);
  590. _mm_errno = MMERR_OUT_OF_MEMORY;
  591. return 0;
  592. }
  593. if (!(wh = realloc (wh, wavcnt * sizeof (IMFWAVHEADER))))
  594. {
  595. free (nextwav);
  596. _mm_errno = MMERR_OUT_OF_MEMORY;
  597. return 0;
  598. }
  599. s = wh + (wavcnt - IMF_SMPINCR);
  600. }
  601. _mm_read_string (s->samplename, 13, modreader);
  602. _mm_read_UBYTE (modreader);
  603. _mm_read_UBYTE (modreader);
  604. _mm_read_UBYTE (modreader);
  605. s->length = _mm_read_I_ULONG (modreader);
  606. s->loopstart = _mm_read_I_ULONG (modreader);
  607. s->loopend = _mm_read_I_ULONG (modreader);
  608. s->samplerate = _mm_read_I_ULONG (modreader);
  609. s->volume = _mm_read_UBYTE (modreader) & 0x7f;
  610. s->pan = _mm_read_UBYTE (modreader);
  611. _mm_fseek (modreader, 14, SEEK_CUR);
  612. s->flags = _mm_read_UBYTE (modreader);
  613. _mm_fseek (modreader, 11, SEEK_CUR);
  614. _mm_read_UBYTES (id, 4, modreader);
  615. if (((memcmp (id, "IS10", 4)) && (memcmp (id, "IW10", 4))) ||
  616. (_mm_eof (modreader)))
  617. {
  618. free (nextwav);
  619. free (wh);
  620. _mm_errno = MMERR_LOADING_SAMPLEINFO;
  621. return 0;
  622. }
  623. nextwav[of.numsmp + u] = _mm_ftell (modreader);
  624. _mm_fseek (modreader, s->length, SEEK_CUR);
  625. }
  626. of.numsmp += ih.numsmp;
  627. d++;
  628. }
  629. /* sanity check */
  630. if (!of.numsmp)
  631. {
  632. if (nextwav)
  633. free (nextwav);
  634. if (wh)
  635. free (wh);
  636. _mm_errno = MMERR_LOADING_SAMPLEINFO;
  637. return 0;
  638. }
  639. /* load samples */
  640. if (!AllocSamples ())
  641. {
  642. free (nextwav);
  643. free (wh);
  644. return 0;
  645. }
  646. if (!AllocLinear ())
  647. {
  648. free (nextwav);
  649. free (wh);
  650. return 0;
  651. }
  652. q = of.samples;
  653. s = wh;
  654. for (u = 0; u < of.numsmp; u++, s++, q++)
  655. {
  656. q->samplename = DupStr (s->samplename, 12, 1);
  657. q->length = s->length;
  658. q->loopstart = s->loopstart;
  659. q->loopend = s->loopend;
  660. q->volume = s->volume;
  661. q->speed = s->samplerate;
  662. if (of.flags & UF_LINEAR)
  663. q->speed = speed_to_finetune (s->samplerate << 1, u);
  664. q->panning = s->pan;
  665. q->seekpos = nextwav[u];
  666. q->flags |= SF_SIGNED;
  667. if (s->flags & 0x1)
  668. q->flags |= SF_LOOP;
  669. if (s->flags & 0x2)
  670. q->flags |= SF_BIDI;
  671. if (s->flags & 0x8)
  672. q->flags |= SF_OWNPAN;
  673. if (s->flags & 0x4)
  674. {
  675. q->flags |= SF_16BITS;
  676. q->length >>= 1;
  677. q->loopstart >>= 1;
  678. q->loopend >>= 1;
  679. }
  680. }
  681. d = of.instruments;
  682. s = wh;
  683. for (u = 0; u < of.numins; u++, d++)
  684. {
  685. for (t = 0; t < IMFNOTECNT; t++)
  686. {
  687. if (d->samplenumber[t] >= of.numsmp)
  688. d->samplenote[t] = 255;
  689. else if (of.flags & UF_LINEAR)
  690. {
  691. int note = (int) d->samplenote[u] + noteindex[d->samplenumber[u]];
  692. d->samplenote[u] = (note < 0) ? 0 : (note > 255 ? 255 : note);
  693. }
  694. else
  695. d->samplenote[t] = t;
  696. }
  697. }
  698. free (wh);
  699. free (nextwav);
  700. return 1;
  701. }
  702. CHAR *
  703. IMF_LoadTitle (void)
  704. {
  705. CHAR s[31];
  706. _mm_fseek (modreader, 0, SEEK_SET);
  707. if (!_mm_read_UBYTES (s, 31, modreader))
  708. return NULL;
  709. return (DupStr (s, 31, 1));
  710. }
  711. /*========== Loader information */
  712. MLOADER load_imf =
  713. {
  714. NULL,
  715. "IMF",
  716. "IMF (Imago Orpheus)",
  717. IMF_Init,
  718. IMF_Test,
  719. IMF_Load,
  720. IMF_Cleanup,
  721. IMF_LoadTitle
  722. };
  723. /* ex:set ts=4: */