PageRenderTime 54ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 0ms

/xbmc/lib/mikxbox/Source/loaders/load_imf.c

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