load_imf.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:18k
源码类别:

Windows CE

开发平台:

C/C++

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