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