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

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.  
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. GNU Library General Public License for more details.
  13.  
  14. You should have received a copy of the GNU Library General Public
  15. License along with this library; if not, write to the Free Software
  16. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  17. 02111-1307, USA.
  18. */
  19. /*==============================================================================
  20.   $Id: load_it.c,v 1.2 2004/02/06 19:29:03 raph Exp $
  21.   Impulse tracker (IT) module loader
  22. ==============================================================================*/
  23. #ifdef HAVE_CONFIG_H
  24. #include "config.h"
  25. #endif
  26. #ifdef HAVE_UNISTD_H
  27. #include <unistd.h>
  28. #endif
  29. #include <ctype.h>
  30. #include <stdio.h>
  31. #ifdef HAVE_MEMORY_H
  32. #include <memory.h>
  33. #endif
  34. #include <string.h>
  35. #include "mikmod_internals.h"
  36. #ifdef SUNOS
  37. extern int fprintf(FILE *, const char *, ...);
  38. extern int toupper(int);
  39. #endif
  40. /*========== Module structure */
  41. /* header */
  42. typedef struct ITHEADER {
  43. CHAR songname[26];
  44. UBYTE blank01[2];
  45. UWORD ordnum;
  46. UWORD insnum;
  47. UWORD smpnum;
  48. UWORD patnum;
  49. UWORD cwt; /* Created with tracker (y.xx = 0x0yxx) */
  50. UWORD cmwt; /* Compatible with tracker ver > than val. */
  51. UWORD flags;
  52. UWORD special; /* bit 0 set = song message attached */
  53. UBYTE globvol;
  54. UBYTE mixvol; /* mixing volume [ignored] */
  55. UBYTE initspeed;
  56. UBYTE inittempo;
  57. UBYTE pansep; /* panning separation between channels */
  58. UBYTE zerobyte;       
  59. UWORD msglength;
  60. ULONG msgoffset;
  61. UBYTE blank02[4];
  62. UBYTE pantable[64];
  63. UBYTE voltable[64];
  64. } ITHEADER;
  65. /* sample information */
  66. typedef struct ITSAMPLE {
  67. CHAR filename[12];
  68. UBYTE zerobyte;
  69. UBYTE globvol;
  70. UBYTE flag;
  71. UBYTE volume;
  72. UBYTE panning;
  73. CHAR sampname[28];
  74. UWORD convert; /* sample conversion flag */
  75. ULONG length;
  76. ULONG loopbeg;
  77. ULONG loopend;
  78. ULONG c5spd;
  79. ULONG susbegin;
  80. ULONG susend;
  81. ULONG sampoffset;
  82. UBYTE vibspeed;
  83. UBYTE vibdepth;
  84. UBYTE vibrate;
  85. UBYTE vibwave; /* 0=sine, 1=rampdown, 2=square, 3=random (speed ignored) */
  86. } ITSAMPLE;
  87. /* instrument information */
  88. #define ITENVCNT 25
  89. #define ITNOTECNT 120
  90. typedef struct ITINSTHEADER {
  91. ULONG size; /* (dword) Instrument size */
  92. CHAR filename[12]; /* (char) Instrument filename */
  93. UBYTE zerobyte; /* (byte) Instrument type (always 0) */
  94. UBYTE volflg;
  95. UBYTE volpts;   
  96. UBYTE volbeg; /* (byte) Volume loop start (node) */
  97. UBYTE volend; /* (byte) Volume loop end (node) */
  98. UBYTE volsusbeg; /* (byte) Volume sustain begin (node) */
  99. UBYTE volsusend; /* (byte) Volume Sustain end (node) */
  100. UBYTE panflg;
  101. UBYTE panpts;  
  102. UBYTE panbeg; /* (byte) channel loop start (node) */
  103. UBYTE panend; /* (byte) channel loop end (node) */
  104. UBYTE pansusbeg; /* (byte) channel sustain begin (node) */
  105. UBYTE pansusend; /* (byte) channel Sustain end (node) */
  106. UBYTE pitflg;
  107. UBYTE pitpts;   
  108. UBYTE pitbeg; /* (byte) pitch loop start (node) */
  109. UBYTE pitend; /* (byte) pitch loop end (node) */
  110. UBYTE pitsusbeg; /* (byte) pitch sustain begin (node) */
  111. UBYTE pitsusend; /* (byte) pitch Sustain end (node) */
  112. UWORD blank;
  113. UBYTE globvol;
  114. UBYTE chanpan;
  115. UWORD fadeout; /* Envelope end / NNA volume fadeout */
  116. UBYTE dnc; /* Duplicate note check */
  117. UBYTE dca; /* Duplicate check action */
  118. UBYTE dct; /* Duplicate check type */
  119. UBYTE nna; /* New Note Action [0,1,2,3] */
  120. UWORD trkvers; /* tracker version used to save [files only] */
  121. UBYTE ppsep; /* Pitch-pan Separation */
  122. UBYTE ppcenter; /* Pitch-pan Center */
  123. UBYTE rvolvar; /* random volume varations */
  124. UBYTE rpanvar; /* random panning varations */
  125. UWORD numsmp; /* Number of samples in instrument [files only] */
  126. CHAR name[26]; /* Instrument name */
  127. UBYTE blank01[6];
  128. UWORD samptable[ITNOTECNT];/* sample for each note [note / samp pairs] */
  129. UBYTE volenv[200];      /* volume envelope (IT 1.x stuff) */
  130. UBYTE oldvoltick[ITENVCNT];/* volume tick position (IT 1.x stuff) */
  131. UBYTE volnode[ITENVCNT];   /* amplitude of volume nodes */
  132. UWORD voltick[ITENVCNT];   /* tick value of volume nodes */
  133. SBYTE pannode[ITENVCNT];   /* panenv - node points */
  134. UWORD pantick[ITENVCNT];   /* tick value of panning nodes */
  135. SBYTE pitnode[ITENVCNT];   /* pitchenv - node points */
  136. UWORD pittick[ITENVCNT];   /* tick value of pitch nodes */
  137. } ITINSTHEADER;                       
  138. /* unpacked note */
  139. typedef struct ITNOTE {
  140. UBYTE note,ins,volpan,cmd,inf;
  141. } ITNOTE;
  142. /*========== Loader data */
  143. static ULONG *paraptr=NULL; /* parapointer array (see IT docs) */
  144. static ITHEADER *mh=NULL;
  145. static ITNOTE *itpat=NULL; /* allocate to space for one full pattern */
  146. static UBYTE *mask=NULL; /* arrays allocated to 64 elements and used for */
  147. static ITNOTE *last=NULL; /* uncompressing IT's pattern information */
  148. static int numtrk=0;
  149. static unsigned int old_effect; /* if set, use S3M old-effects stuffs */
  150.    
  151. static CHAR* IT_Version[]={
  152. "ImpulseTracker  .  ",
  153. "Compressed ImpulseTracker  .  ",
  154. "ImpulseTracker 2.14p3",
  155. "Compressed ImpulseTracker 2.14p3",
  156. "ImpulseTracker 2.14p4",
  157. "Compressed ImpulseTracker 2.14p4",
  158. };
  159. /* table for porta-to-note command within volume/panning column */
  160. static UBYTE portatable[10]= {0,1,4,8,16,32,64,96,128,255};
  161. /*========== Loader code */
  162. BOOL IT_Test(void)
  163. {
  164. UBYTE id[4];
  165. if(!_mm_read_UBYTES(id,4,modreader)) return 0;
  166. if(!memcmp(id,"IMPM",4)) return 1;
  167. return 0;
  168. }
  169. BOOL IT_Init(void)
  170. {
  171. if(!(mh=(ITHEADER*)_mm_malloc(sizeof(ITHEADER)))) return 0;
  172. if(!(poslookup=(UBYTE*)_mm_malloc(256*sizeof(UBYTE)))) return 0;
  173. if(!(itpat=(ITNOTE*)_mm_malloc(200*64*sizeof(ITNOTE)))) return 0;
  174. if(!(mask=(UBYTE*)_mm_malloc(64*sizeof(UBYTE)))) return 0;
  175. if(!(last=(ITNOTE*)_mm_malloc(64*sizeof(ITNOTE)))) return 0;
  176. return 1;
  177. }
  178. void IT_Cleanup(void)
  179. {
  180. FreeLinear();
  181. _mm_free(mh);
  182. _mm_free(poslookup);
  183. _mm_free(itpat);
  184. _mm_free(mask);
  185. _mm_free(last);
  186. _mm_free(paraptr);
  187. _mm_free(origpositions);
  188. }
  189. /* Because so many IT files have 64 channels as the set number used, but really
  190.    only use far less (usually from 8 to 24 still), I had to make this function,
  191.    which determines the number of channels that are actually USED by a pattern.
  192.  
  193.    NOTE: You must first seek to the file location of the pattern before calling
  194.          this procedure.
  195.    Returns 1 on error
  196. */
  197. static BOOL IT_GetNumChannels(UWORD patrows)
  198. {
  199. int row=0,flag,ch;
  200. do {
  201. if((flag=_mm_read_UBYTE(modreader))==EOF) {
  202. _mm_errno=MMERR_LOADING_PATTERN;
  203. return 1;
  204. }
  205. if(!flag)
  206. row++;
  207. else {
  208. ch=(flag-1)&63;
  209. remap[ch]=0;
  210. if(flag & 128) mask[ch]=_mm_read_UBYTE(modreader);
  211. if(mask[ch]&1)   _mm_read_UBYTE(modreader);
  212. if(mask[ch]&2)   _mm_read_UBYTE(modreader);
  213. if(mask[ch]&4)   _mm_read_UBYTE(modreader);
  214. if(mask[ch]&8) { _mm_read_UBYTE(modreader);_mm_read_UBYTE(modreader); }
  215. }
  216. } while(row<patrows);
  217. return 0;
  218. }
  219. static UBYTE* IT_ConvertTrack(ITNOTE* tr,UWORD numrows)
  220. {
  221. int t;
  222. UBYTE note,ins,volpan;
  223. UniReset();
  224. for(t=0;t<numrows;t++) {
  225. note=tr[t*of.numchn].note;
  226. ins=tr[t*of.numchn].ins;
  227. volpan=tr[t*of.numchn].volpan;
  228. if(note!=255) {
  229. if(note==253)
  230. UniWriteByte(UNI_KEYOFF);
  231. else if(note==254) {
  232. UniPTEffect(0xc,-1); /* note cut command */
  233. volpan=255;
  234. } else
  235. UniNote(note);
  236. }
  237. if((ins)&&(ins<100))
  238. UniInstrument(ins-1);
  239. else if(ins==253)
  240. UniWriteByte(UNI_KEYOFF);
  241. else if(ins!=255) { /* crap */
  242. _mm_errno=MMERR_LOADING_PATTERN;
  243. return NULL;
  244. }
  245. /* process volume / panning column
  246.    volume / panning effects do NOT all share the same memory address
  247.    yet. */
  248. if(volpan<=64) 
  249. UniVolEffect(VOL_VOLUME,volpan);
  250. else if(volpan==65) /* fine volume slide up (65-74) - A0 case */
  251. UniVolEffect(VOL_VOLSLIDE,0);
  252. else if(volpan<=74) { /* fine volume slide up (65-74) - general case */
  253. UniVolEffect(VOL_VOLSLIDE,0x0f+((volpan-65)<<4));
  254. } else if(volpan==75) /* fine volume slide down (75-84) - B0 case */
  255. UniVolEffect(VOL_VOLSLIDE,0);
  256. else if(volpan<=84) { /* fine volume slide down (75-84) - general case*/
  257. UniVolEffect(VOL_VOLSLIDE,0xf0+(volpan-75));
  258. } else if(volpan<=94) /* volume slide up (85-94) */
  259. UniVolEffect(VOL_VOLSLIDE,((volpan-85)<<4));
  260. else if(volpan<=104)/* volume slide down (95-104) */
  261. UniVolEffect(VOL_VOLSLIDE,(volpan-95));
  262. else if(volpan<=114)/* pitch slide down (105-114) */
  263. UniVolEffect(VOL_PITCHSLIDEDN,(volpan-105));
  264. else if(volpan<=124)/* pitch slide up (115-124) */
  265. UniVolEffect(VOL_PITCHSLIDEUP,(volpan-115));
  266. else if(volpan<=127) { /* crap */
  267. _mm_errno=MMERR_LOADING_PATTERN;
  268. return NULL;
  269. } else if(volpan<=192)
  270. UniVolEffect(VOL_PANNING,((volpan-128)==64)?255:((volpan-128)<<2));
  271. else if(volpan<=202)/* portamento to note */
  272. UniVolEffect(VOL_PORTAMENTO,portatable[volpan-193]);
  273. else if(volpan<=212)/* vibrato */
  274. UniVolEffect(VOL_VIBRATO,(volpan-203));
  275. else if((volpan!=239)&&(volpan!=255)) { /* crap */
  276. _mm_errno=MMERR_LOADING_PATTERN;
  277. return NULL;
  278. }
  279. S3MIT_ProcessCmd(tr[t*of.numchn].cmd,tr[t*of.numchn].inf,
  280.     old_effect|S3MIT_IT);
  281. UniNewline();
  282. }
  283. return UniDup();
  284. }
  285. static BOOL IT_ReadPattern(UWORD patrows)
  286. {
  287. int row=0,flag,ch,blah;
  288. ITNOTE *itt=itpat,dummy,*n,*l;
  289. memset(itt,255,200*64*sizeof(ITNOTE));
  290. do {
  291. if((flag=_mm_read_UBYTE(modreader))==EOF) {
  292. _mm_errno = MMERR_LOADING_PATTERN;
  293. return 0;
  294. }
  295. if(!flag) {
  296. itt=&itt[of.numchn];
  297. row++;
  298. } else {
  299. ch=remap[(flag-1)&63];
  300. if(ch!=-1) {
  301. n=&itt[ch];
  302. l=&last[ch];
  303. } else 
  304. n=l=&dummy;
  305. if(flag&128) mask[ch]=_mm_read_UBYTE(modreader);
  306. if(mask[ch]&1)
  307. /* convert IT note off to internal note off */
  308. if((l->note=n->note=_mm_read_UBYTE(modreader))==255) 
  309. l->note=n->note=253;
  310. if(mask[ch]&2)
  311. l->ins=n->ins=_mm_read_UBYTE(modreader);
  312. if(mask[ch]&4)
  313. l->volpan=n->volpan=_mm_read_UBYTE(modreader);
  314. if(mask[ch]&8) {
  315. l->cmd=n->cmd=_mm_read_UBYTE(modreader);
  316. l->inf=n->inf=_mm_read_UBYTE(modreader);
  317. }
  318. if(mask[ch]&16)
  319. n->note=l->note;
  320. if(mask[ch]&32)
  321. n->ins=l->ins;
  322. if(mask[ch]&64)
  323. n->volpan=l->volpan;
  324. if(mask[ch]&128) {
  325. n->cmd=l->cmd;
  326. n->inf=l->inf;
  327. }
  328. }
  329. } while(row<patrows);
  330. for(blah=0;blah<of.numchn;blah++) {
  331. if(!(of.tracks[numtrk++]=IT_ConvertTrack(&itpat[blah],patrows)))
  332. return 0;
  333. }
  334. return 1;
  335. }
  336. static void LoadMidiString(MREADER* modreader,CHAR* dest)
  337. {
  338. CHAR *cur,*last;
  339. _mm_read_UBYTES(dest,32,modreader);
  340. cur=last=dest;
  341. /* remove blanks and uppercase all */
  342. while(*last) {
  343. if(isalnum((int)*last)) *(cur++)=toupper((int)*last);
  344. last++;
  345. }
  346. *cur=0;
  347. }
  348. /* Load embedded midi information for resonant filters */
  349. static void IT_LoadMidiConfiguration(MREADER* modreader)
  350. {
  351. int i;
  352. memset(filtermacros,0,sizeof(filtermacros));
  353. memset(filtersettings,0,sizeof(filtersettings));
  354. if (modreader) { /* information is embedded in file */
  355. UWORD dat;
  356. CHAR midiline[33];
  357. dat=_mm_read_I_UWORD(modreader);
  358. _mm_fseek(modreader,8*dat+0x120,SEEK_CUR);
  359. /* read midi macros */
  360. for(i=0;i<UF_MAXMACRO;i++) {
  361. LoadMidiString(modreader,midiline);
  362. if((!strncmp(midiline,"F0F00",5))&&
  363.    ((midiline[5]=='0')||(midiline[5]=='1')))
  364. filtermacros[i]=(midiline[5]-'0')|0x80;
  365. }
  366. /* read standalone filters */
  367. for(i=0x80;i<0x100;i++) {
  368. LoadMidiString(modreader,midiline);
  369. if((!strncmp(midiline,"F0F00",5))&&
  370.    ((midiline[5]=='0')||(midiline[5]=='1'))) {
  371. filtersettings[i].filter=(midiline[5]-'0')|0x80;
  372. dat=(midiline[6])?(midiline[6]-'0'):0;
  373. if(midiline[7])dat=(dat<<4)|(midiline[7]-'0');
  374. filtersettings[i].inf=dat;
  375. }
  376. }
  377. } else { /* use default information */
  378. filtermacros[0]=FILT_CUT;
  379. for(i=0x80;i<0x90;i++) {
  380. filtersettings[i].filter=FILT_RESONANT;
  381. filtersettings[i].inf=(i&0x7f)<<3;
  382. }
  383. }
  384. activemacro=0;
  385. for(i=0;i<0x80;i++) {
  386. filtersettings[i].filter=filtermacros[0];
  387. filtersettings[i].inf=i;
  388. }
  389. }
  390. BOOL IT_Load(BOOL curious)
  391. {
  392. int t,u,lp;
  393. INSTRUMENT *d;
  394. SAMPLE *q;
  395. BOOL compressed=0;
  396. numtrk=0;
  397. filters=0;
  398. /* try to read module header */
  399. _mm_read_I_ULONG(modreader); /* kill the 4 byte header */
  400. _mm_read_string(mh->songname,26,modreader);
  401. _mm_read_UBYTES(mh->blank01,2,modreader);
  402. mh->ordnum      =_mm_read_I_UWORD(modreader);
  403. mh->insnum      =_mm_read_I_UWORD(modreader);
  404. mh->smpnum      =_mm_read_I_UWORD(modreader);
  405. mh->patnum      =_mm_read_I_UWORD(modreader);
  406. mh->cwt         =_mm_read_I_UWORD(modreader);
  407. mh->cmwt        =_mm_read_I_UWORD(modreader);
  408. mh->flags       =_mm_read_I_UWORD(modreader);
  409. mh->special     =_mm_read_I_UWORD(modreader);
  410. mh->globvol     =_mm_read_UBYTE(modreader);
  411. mh->mixvol      =_mm_read_UBYTE(modreader);
  412. mh->initspeed   =_mm_read_UBYTE(modreader);
  413. mh->inittempo   =_mm_read_UBYTE(modreader);
  414. mh->pansep      =_mm_read_UBYTE(modreader);
  415. mh->zerobyte    =_mm_read_UBYTE(modreader);
  416. mh->msglength   =_mm_read_I_UWORD(modreader);
  417. mh->msgoffset   =_mm_read_I_ULONG(modreader);
  418. _mm_read_UBYTES(mh->blank02,4,modreader);
  419. _mm_read_UBYTES(mh->pantable,64,modreader);
  420. _mm_read_UBYTES(mh->voltable,64,modreader);
  421. if(_mm_eof(modreader)) {
  422. _mm_errno=MMERR_LOADING_HEADER;
  423. return 0;
  424. }
  425. /* set module variables */
  426. of.songname    = DupStr(mh->songname,26,0); /* make a cstr of songname  */
  427. of.reppos      = 0;
  428. of.numpat      = mh->patnum;
  429. of.numins      = mh->insnum;
  430. of.numsmp      = mh->smpnum;
  431. of.initspeed   = mh->initspeed;
  432. of.inittempo   = mh->inittempo;
  433. of.initvolume  = mh->globvol;
  434. of.flags      |= UF_BGSLIDES | UF_ARPMEM;
  435. if (!(mh->flags & 1))
  436. of.flags |= UF_PANNING;
  437. of.bpmlimit=32;
  438. if(mh->songname[25]) {
  439. of.numvoices=1+mh->songname[25];
  440. #ifdef MIKMOD_DEBUG
  441. fprintf(stderr,"Embedded IT limitation to %d voicesn",of.numvoices);
  442. #endif
  443. }
  444. /* set the module type */
  445. /* 2.17 : IT 2.14p4 */
  446. /* 2.16 : IT 2.14p3 with resonant filters */
  447. /* 2.15 : IT 2.14p3 (improved compression) */
  448. if((mh->cwt<=0x219)&&(mh->cwt>=0x217))
  449. of.modtype=strdup(IT_Version[mh->cmwt<0x214?4:5]);
  450. else if (mh->cwt>=0x215)
  451. of.modtype=strdup(IT_Version[mh->cmwt<0x214?2:3]);
  452. else {
  453. of.modtype     = strdup(IT_Version[mh->cmwt<0x214?0:1]);
  454. of.modtype[mh->cmwt<0x214?15:26] = (mh->cwt>>8)+'0';
  455. of.modtype[mh->cmwt<0x214?17:28] = ((mh->cwt>>4)&0xf)+'0';
  456. of.modtype[mh->cmwt<0x214?18:29] = ((mh->cwt)&0xf)+'0';
  457. }
  458. if(mh->flags&8)
  459. of.flags |= UF_XMPERIODS | UF_LINEAR;
  460. if((mh->cwt>=0x106)&&(mh->flags&16))
  461. old_effect=S3MIT_OLDSTYLE;
  462. else
  463. old_effect=0;
  464. /* set panning positions */
  465. if (mh->flags & 1)
  466. for(t=0;t<64;t++) {
  467. mh->pantable[t]&=0x7f;
  468. if(mh->pantable[t]<64)
  469. of.panning[t]=mh->pantable[t]<<2;
  470. else if(mh->pantable[t]==64)
  471. of.panning[t]=255;
  472. else if(mh->pantable[t]==100)
  473. of.panning[t]=PAN_SURROUND;
  474. else if(mh->pantable[t]==127)
  475. of.panning[t]=PAN_CENTER;
  476. else {
  477. _mm_errno=MMERR_LOADING_HEADER;
  478. return 0;
  479. }
  480. }
  481. else
  482. for(t=0;t<64;t++)
  483. of.panning[t]=PAN_CENTER;
  484. /* set channel volumes */
  485. memcpy(of.chanvol,mh->voltable,64);
  486. /* read the order data */
  487. if(!AllocPositions(mh->ordnum)) return 0;
  488. if(!(origpositions=_mm_calloc(mh->ordnum,sizeof(UWORD)))) return 0;
  489. for(t=0;t<mh->ordnum;t++) {
  490. origpositions[t]=_mm_read_UBYTE(modreader);
  491. if((origpositions[t]>mh->patnum)&&(origpositions[t]<254))
  492. origpositions[t]=255;
  493. }
  494. if(_mm_eof(modreader)) {
  495. _mm_errno = MMERR_LOADING_HEADER;
  496. return 0;
  497. }
  498. poslookupcnt=mh->ordnum;
  499. S3MIT_CreateOrders(curious);
  500. if(!(paraptr=(ULONG*)_mm_malloc((mh->insnum+mh->smpnum+of.numpat)*
  501.                                sizeof(ULONG)))) return 0;
  502. /* read the instrument, sample, and pattern parapointers */
  503. _mm_read_I_ULONGS(paraptr,mh->insnum+mh->smpnum+of.numpat,modreader);
  504. if(_mm_eof(modreader)) {
  505. _mm_errno = MMERR_LOADING_HEADER;
  506. return 0;
  507. }
  508. /* Check for and load midi information for resonant filters */
  509. if(mh->cmwt>=0x216) {
  510. if(mh->special&8) {
  511. IT_LoadMidiConfiguration(modreader);
  512. if(_mm_eof(modreader)) {
  513. _mm_errno = MMERR_LOADING_HEADER;
  514. return 0;
  515. }
  516. } else
  517. IT_LoadMidiConfiguration(NULL);
  518. filters=1;
  519. }
  520. /* Check for and load song comment */
  521. if((mh->special&1)&&(mh->cwt>=0x104)&&(mh->msglength)) {
  522. _mm_fseek(modreader,(long)(mh->msgoffset),SEEK_SET);
  523. if(!ReadComment(mh->msglength)) return 0;
  524. }
  525. if(!(mh->flags&4)) of.numins=of.numsmp;
  526. if(!AllocSamples()) return 0;
  527. if(!AllocLinear()) return 0;
  528. /* Load all samples */
  529. q = of.samples;
  530. for(t=0;t<mh->smpnum;t++) {
  531. ITSAMPLE s;
  532. /* seek to sample position */
  533. _mm_fseek(modreader,(long)(paraptr[mh->insnum+t]+4),SEEK_SET);
  534. /* load sample info */
  535. _mm_read_string(s.filename,12,modreader);
  536. s.zerobyte    = _mm_read_UBYTE(modreader);
  537. s.globvol     = _mm_read_UBYTE(modreader);
  538. s.flag        = _mm_read_UBYTE(modreader);
  539. s.volume      = _mm_read_UBYTE(modreader);
  540. _mm_read_string(s.sampname,26,modreader);
  541. s.convert     = _mm_read_UBYTE(modreader);
  542. s.panning     = _mm_read_UBYTE(modreader);
  543. s.length      = _mm_read_I_ULONG(modreader);
  544. s.loopbeg     = _mm_read_I_ULONG(modreader);
  545. s.loopend     = _mm_read_I_ULONG(modreader);
  546. s.c5spd       = _mm_read_I_ULONG(modreader);
  547. s.susbegin    = _mm_read_I_ULONG(modreader);
  548. s.susend      = _mm_read_I_ULONG(modreader);
  549. s.sampoffset  = _mm_read_I_ULONG(modreader);
  550. s.vibspeed    = _mm_read_UBYTE(modreader);
  551. s.vibdepth    = _mm_read_UBYTE(modreader);
  552. s.vibrate     = _mm_read_UBYTE(modreader);
  553. s.vibwave     = _mm_read_UBYTE(modreader);
  554. /* Generate an error if c5spd is > 512k, or samplelength > 256 megs
  555.    (nothing would EVER be that high) */
  556. if(_mm_eof(modreader)||(s.c5spd>0x7ffffL)||(s.length>0xfffffffUL)) {
  557. _mm_errno = MMERR_LOADING_SAMPLEINFO;
  558. return 0;
  559. }
  560. /* Reality check for sample loop information */
  561. if((s.flag&16)&&
  562.    ((s.loopbeg>0xfffffffUL)||(s.loopend>0xfffffffUL))) {
  563. _mm_errno = MMERR_LOADING_SAMPLEINFO;
  564. return 0;
  565. }
  566. q->samplename = DupStr(s.sampname,26,0);
  567. q->speed      = s.c5spd / 2;
  568. q->panning    = ((s.panning&127)==64)?255:(s.panning&127)<<2;
  569. q->length     = s.length;
  570. q->loopstart  = s.loopbeg;
  571. q->loopend    = s.loopend;
  572. q->volume     = s.volume;
  573. q->globvol    = s.globvol;
  574. q->seekpos    = s.sampoffset;
  575. /* Convert speed to XM linear finetune */
  576. if(of.flags&UF_LINEAR)
  577. q->speed=speed_to_finetune(s.c5spd,t);
  578. if(s.panning&128) q->flags|=SF_OWNPAN;
  579. if(s.vibrate) {
  580. q->vibflags |= AV_IT;
  581. q->vibtype   = s.vibwave;
  582. q->vibsweep  = s.vibrate * 2;
  583. q->vibdepth  = s.vibdepth;
  584. q->vibrate   = s.vibspeed;
  585. }
  586. if(s.flag&2) q->flags|=SF_16BITS;
  587. if((s.flag&8)&&(mh->cwt>=0x214)) {
  588. q->flags|=SF_ITPACKED;
  589. compressed=1;
  590. }
  591. if(s.flag&16) q->flags|=SF_LOOP;
  592. if(s.flag&64) q->flags|=SF_BIDI;
  593. if(mh->cwt>=0x200) {
  594. if(s.convert&1) q->flags|=SF_SIGNED;
  595. if(s.convert&4) q->flags|=SF_DELTA;   
  596. }
  597. q++;
  598. }
  599. /* Load instruments if instrument mode flag enabled */
  600. if(mh->flags&4) {
  601. if(!AllocInstruments()) return 0;
  602. d=of.instruments;
  603. of.flags|=UF_NNA|UF_INST;
  604. for(t=0;t<mh->insnum;t++) {
  605. ITINSTHEADER ih;
  606. /* seek to instrument position */
  607. _mm_fseek(modreader,paraptr[t]+4,SEEK_SET);
  608. /* load instrument info */
  609. _mm_read_string(ih.filename,12,modreader);
  610. ih.zerobyte  = _mm_read_UBYTE(modreader);
  611. if(mh->cwt<0x200) {
  612. /* load IT 1.xx inst header */
  613. ih.volflg    = _mm_read_UBYTE(modreader);
  614. ih.volbeg    = _mm_read_UBYTE(modreader);
  615. ih.volend    = _mm_read_UBYTE(modreader);
  616. ih.volsusbeg = _mm_read_UBYTE(modreader);
  617. ih.volsusend = _mm_read_UBYTE(modreader);
  618. _mm_read_I_UWORD(modreader);
  619. ih.fadeout   = _mm_read_I_UWORD(modreader);
  620. ih.nna       = _mm_read_UBYTE(modreader);
  621. ih.dnc       = _mm_read_UBYTE(modreader);
  622. } else {
  623. /* Read IT200+ header */
  624. ih.nna       = _mm_read_UBYTE(modreader);
  625. ih.dct       = _mm_read_UBYTE(modreader);
  626. ih.dca       = _mm_read_UBYTE(modreader);
  627. ih.fadeout   = _mm_read_I_UWORD(modreader);
  628. ih.ppsep     = _mm_read_UBYTE(modreader);
  629. ih.ppcenter  = _mm_read_UBYTE(modreader);
  630. ih.globvol   = _mm_read_UBYTE(modreader);
  631. ih.chanpan   = _mm_read_UBYTE(modreader);
  632. ih.rvolvar   = _mm_read_UBYTE(modreader);
  633. ih.rpanvar   = _mm_read_UBYTE(modreader);
  634. }
  635. ih.trkvers   = _mm_read_I_UWORD(modreader);
  636. ih.numsmp    = _mm_read_UBYTE(modreader);
  637. _mm_read_UBYTE(modreader);
  638. _mm_read_string(ih.name,26,modreader);
  639. _mm_read_UBYTES(ih.blank01,6,modreader);
  640. _mm_read_I_UWORDS(ih.samptable,ITNOTECNT,modreader);
  641. if(mh->cwt<0x200) {
  642. /* load IT 1xx volume envelope */
  643. _mm_read_UBYTES(ih.volenv,200,modreader);
  644. for(lp=0;lp<ITENVCNT;lp++) {
  645. ih.oldvoltick[lp] = _mm_read_UBYTE(modreader);
  646. ih.volnode[lp]    = _mm_read_UBYTE(modreader);
  647. } else {
  648. /* load IT 2xx volume, pan and pitch envelopes */
  649. #if defined __STDC__ || defined _MSC_VER || defined MPW_C
  650. #define IT_LoadEnvelope(name,type) 
  651. ih. name##flg   =_mm_read_UBYTE(modreader);
  652. ih. name##pts   =_mm_read_UBYTE(modreader);
  653. ih. name##beg   =_mm_read_UBYTE(modreader);
  654. ih. name##end   =_mm_read_UBYTE(modreader);
  655. ih. name##susbeg=_mm_read_UBYTE(modreader);
  656. ih. name##susend=_mm_read_UBYTE(modreader);
  657. for(lp=0;lp<ITENVCNT;lp++) {
  658. ih. name##node[lp]=_mm_read_##type (modreader);
  659. ih. name##tick[lp]=_mm_read_I_UWORD(modreader);
  660. }
  661. _mm_read_UBYTE(modreader)
  662. #else
  663. #define IT_LoadEnvelope(name,type) 
  664. ih. name/**/flg   =_mm_read_UBYTE(modreader);
  665. ih. name/**/pts   =_mm_read_UBYTE(modreader);
  666. ih. name/**/beg   =_mm_read_UBYTE(modreader);
  667. ih. name/**/end   =_mm_read_UBYTE(modreader);
  668. ih. name/**/susbeg=_mm_read_UBYTE(modreader);
  669. ih. name/**/susend=_mm_read_UBYTE(modreader);
  670. for(lp=0;lp<ITENVCNT;lp++) {
  671. ih. name/**/node[lp]=_mm_read_/**/type (modreader);
  672. ih. name/**/tick[lp]=_mm_read_I_UWORD(modreader);
  673. }
  674. _mm_read_UBYTE(modreader)
  675. #endif
  676. IT_LoadEnvelope(vol,UBYTE);
  677. IT_LoadEnvelope(pan,SBYTE);
  678. IT_LoadEnvelope(pit,SBYTE);
  679. #undef IT_LoadEnvelope
  680. }
  681.  
  682. if(_mm_eof(modreader)) {
  683. _mm_errno = MMERR_LOADING_SAMPLEINFO;
  684. return 0;
  685. }
  686. d->volflg|=EF_VOLENV;
  687. d->insname = DupStr(ih.name,26,0);
  688. d->nnatype = ih.nna & NNA_MASK;
  689. if(mh->cwt<0x200) {
  690. d->volfade=ih.fadeout<< 6;
  691. if(ih.dnc) {
  692. d->dct=DCT_NOTE;
  693. d->dca=DCA_CUT;
  694. }
  695. if(ih.volflg&1) d->volflg|=EF_ON;
  696. if(ih.volflg&2) d->volflg|=EF_LOOP;
  697. if(ih.volflg&4) d->volflg|=EF_SUSTAIN;      
  698. /* XM conversion of IT envelope Array */
  699. d->volbeg    = ih.volbeg;   
  700. d->volend    = ih.volend;
  701. d->volsusbeg = ih.volsusbeg;
  702. d->volsusend = ih.volsusend;
  703. if(ih.volflg&1) {
  704. for(u=0;u<ITENVCNT;u++)
  705. if(ih.oldvoltick[d->volpts]!=0xff) {
  706. d->volenv[d->volpts].val=(ih.volnode[d->volpts]<<2);
  707. d->volenv[d->volpts].pos=ih.oldvoltick[d->volpts];
  708. d->volpts++;
  709. } else
  710. break;
  711. }  
  712. } else {
  713. d->panning=((ih.chanpan&127)==64)?255:(ih.chanpan&127)<<2;
  714. if(!(ih.chanpan&128)) d->flags|=IF_OWNPAN;
  715. if(!(ih.ppsep & 128)) {
  716. d->pitpansep=ih.ppsep<<2;
  717. d->pitpancenter=ih.ppcenter;
  718. d->flags|=IF_PITCHPAN;
  719. }
  720. d->globvol=ih.globvol>>1;
  721. d->volfade=ih.fadeout<<5;
  722. d->dct    =ih.dct;
  723. d->dca    =ih.dca;
  724. if(mh->cwt>=0x204) {
  725. d->rvolvar = ih.rvolvar;
  726. d->rpanvar = ih.rpanvar;
  727. }
  728. #if defined __STDC__ || defined _MSC_VER || defined MPW_C
  729. #define IT_ProcessEnvelope(name) 
  730. if(ih. name##flg&1) d-> name##flg|=EF_ON;
  731. if(ih. name##flg&2) d-> name##flg|=EF_LOOP;
  732. if(ih. name##flg&4) d-> name##flg|=EF_SUSTAIN;
  733. d-> name##pts=ih. name##pts;
  734. d-> name##beg=ih. name##beg;
  735. d-> name##end=ih. name##end;
  736. d-> name##susbeg=ih. name##susbeg;
  737. d-> name##susend=ih. name##susend;
  738. for(u=0;u<ih. name##pts;u++)
  739. d-> name##env[u].pos=ih. name##tick[u];
  740. if((d-> name##flg&EF_ON)&&(d-> name##pts<2))
  741. d-> name##flg&=~EF_ON
  742. #else
  743. #define IT_ProcessEnvelope(name) 
  744. if(ih. name/**/flg&1) d-> name/**/flg|=EF_ON;
  745. if(ih. name/**/flg&2) d-> name/**/flg|=EF_LOOP;
  746. if(ih. name/**/flg&4) d-> name/**/flg|=EF_SUSTAIN;
  747. d-> name/**/pts=ih. name/**/pts;
  748. d-> name/**/beg=ih. name/**/beg;
  749. d-> name/**/end=ih. name/**/end;
  750. d-> name/**/susbeg=ih. name/**/susbeg;
  751. d-> name/**/susend=ih. name/**/susend;
  752. for(u=0;u<ih. name/**/pts;u++)
  753. d-> name/**/env[u].pos=ih. name/**/tick[u];
  754. if((d-> name/**/flg&EF_ON)&&(d-> name/**/pts<2))
  755. d-> name/**/flg&=~EF_ON
  756. #endif
  757. IT_ProcessEnvelope(vol);
  758. for(u=0;u<ih.volpts;u++)
  759. d->volenv[u].val=(ih.volnode[u]<<2);
  760. IT_ProcessEnvelope(pan);
  761. for(u=0;u<ih.panpts;u++)
  762. d->panenv[u].val=
  763.   ih.pannode[u]==32?255:(ih.pannode[u]+32)<<2;
  764. IT_ProcessEnvelope(pit);
  765. for(u=0;u<ih.pitpts;u++)
  766. d->pitenv[u].val=ih.pitnode[u]+32;
  767. #undef IT_ProcessEnvelope
  768. if(ih.pitflg&0x80) {
  769. /* filter envelopes not supported yet */
  770. d->pitflg&=~EF_ON;
  771. ih.pitpts=ih.pitbeg=ih.pitend=0;
  772. #ifdef MIKMOD_DEBUG
  773. {
  774. static int warn=0;
  775. if(!warn)
  776. fprintf(stderr, "rFilter envelopes not supported yetn");
  777. warn=1;
  778. }
  779. #endif
  780. }
  781. }
  782. for(u=0;u<ITNOTECNT;u++) {
  783. d->samplenote[u]=(ih.samptable[u]&255);
  784. d->samplenumber[u]=
  785.   (ih.samptable[u]>>8)?((ih.samptable[u]>>8)-1):0xffff;
  786. if(d->samplenumber[u]>=of.numsmp)
  787. d->samplenote[u]=255;
  788. else if (of.flags&UF_LINEAR) {
  789. int note=(int)d->samplenote[u]+noteindex[d->samplenumber[u]];
  790. d->samplenote[u]=(note<0)?0:(note>255?255:note);
  791. }
  792. }
  793. d++;                  
  794. }
  795. } else if(of.flags & UF_LINEAR) {
  796. if(!AllocInstruments()) return 0;
  797. d=of.instruments;
  798. of.flags|=UF_INST;
  799. for(t=0;t<mh->smpnum;t++,d++)
  800. for(u=0;u<ITNOTECNT;u++) {
  801. if(d->samplenumber[u]>=of.numsmp)
  802. d->samplenote[u]=255;
  803. else {
  804. int note=(int)d->samplenote[u]+noteindex[d->samplenumber[u]];
  805. d->samplenote[u]=(note<0)?0:(note>255?255:note);
  806. }
  807. }
  808. }
  809. /* Figure out how many channels this song actually uses */
  810. of.numchn=0;
  811. memset(remap,-1,UF_MAXCHAN*sizeof(UBYTE));
  812. for(t=0;t<of.numpat;t++) {
  813. UWORD packlen;
  814. /* seek to pattern position */
  815. if(paraptr[mh->insnum+mh->smpnum+t]) { /* 0 -> empty 64 row pattern */
  816. _mm_fseek(modreader,((long)paraptr[mh->insnum+mh->smpnum+t]),SEEK_SET);
  817. _mm_read_I_UWORD(modreader);
  818. /* read pattern length (# of rows)
  819.    Impulse Tracker never creates patterns with less than 32 rows,
  820.    but some other trackers do, so we only check for more than 256
  821.    rows */
  822. packlen=_mm_read_I_UWORD(modreader);
  823. if(packlen>256) {
  824. _mm_errno=MMERR_LOADING_PATTERN;
  825. return 0;
  826. }
  827. _mm_read_I_ULONG(modreader);
  828. if(IT_GetNumChannels(packlen)) return 0;
  829. }
  830. }
  831. /* give each of them a different number */
  832. for(t=0;t<UF_MAXCHAN;t++) 
  833. if(!remap[t])
  834. remap[t]=of.numchn++;
  835. of.numtrk = of.numpat*of.numchn;
  836. if(of.numvoices)
  837. if (of.numvoices<of.numchn) of.numvoices=of.numchn;
  838. if(!AllocPatterns()) return 0;
  839. if(!AllocTracks()) return 0;
  840. for(t=0;t<of.numpat;t++) {
  841. UWORD packlen;
  842. /* seek to pattern position */
  843. if(!paraptr[mh->insnum+mh->smpnum+t]) { /* 0 -> empty 64 row pattern */
  844. of.pattrows[t]=64;
  845. for(u=0;u<of.numchn;u++) {
  846. int k;
  847. UniReset();
  848. for(k=0;k<64;k++) UniNewline();
  849. of.tracks[numtrk++]=UniDup();
  850. }
  851. } else {
  852. _mm_fseek(modreader,((long)paraptr[mh->insnum+mh->smpnum+t]),SEEK_SET);
  853. packlen=_mm_read_I_UWORD(modreader);
  854. of.pattrows[t]=_mm_read_I_UWORD(modreader);
  855. _mm_read_I_ULONG(modreader);
  856. if(!IT_ReadPattern(of.pattrows[t])) return 0;
  857. }
  858. }
  859. return 1;
  860. }
  861. CHAR *IT_LoadTitle(void)
  862. {
  863. CHAR s[26];
  864. _mm_fseek(modreader,4,SEEK_SET);
  865. if(!_mm_read_UBYTES(s,26,modreader)) return NULL;
  866.    
  867. return(DupStr(s,26,0));
  868. }
  869. /*========== Loader information */
  870. MIKMODAPI MLOADER load_it={
  871. NULL,
  872. "IT",
  873. "IT (Impulse Tracker)",
  874. IT_Init,
  875. IT_Test,
  876. IT_Load,
  877. IT_Cleanup,
  878. IT_LoadTitle
  879. };
  880. /* ex:set ts=4: */