static BOOL ASY_Load(BOOL curious) { int t; SAMPLE *q; MSAMPINFO *s; CHAR *descr=asylum; ULONG seekpos; // no title in asylum amf files :( strcpy(mh->songname, ""); _mm_fseek(modreader, 0x23, SEEK_SET); mh->num_patterns = _mm_read_UBYTE(modreader); mh->num_orders = _mm_read_UBYTE(modreader); // skip unknown byte _mm_skip_BYTE(modreader); _mm_read_UBYTES(mh->positions, 256, modreader); /* read samples headers*/ for (t = 0; t < 64; t++) { s = &mh->samples[t]; _mm_fseek(modreader, 0x126 + (t*37), SEEK_SET); _mm_read_string(s->samplename, 22, modreader); s->samplename[21] = 0; /* just in case */ s->finetune = _mm_read_UBYTE(modreader); s->volume = _mm_read_UBYTE(modreader); _mm_skip_BYTE(modreader); // skip unknown byte s->length = _mm_read_I_ULONG(modreader); s->reppos = _mm_read_I_ULONG(modreader); s->replen = _mm_read_I_ULONG(modreader); } if (_mm_eof(modreader)) { _mm_errno = MMERR_LOADING_HEADER; return 0; } /* set module variables */ of.initspeed = 6; of.inittempo = 125; of.numchn = 8; modtype = 0; of.songname = DupStr(mh->songname, 21, 1); of.numpos = mh->num_orders; of.reppos = 0; of.numpat = mh->num_patterns; of.numtrk = of.numpat * of.numchn; /* Copy positions (orders) */ if (!AllocPositions(of.numpos)) return 0; for (t = 0; t < of.numpos; t++) { of.positions[t] = mh->positions[t]; } /* Finally, init the sampleinfo structures */ of.numins = 31; of.numsmp = 31; if (!AllocSamples()) return 0; s = mh->samples; q = of.samples; seekpos = 2662+(2048*(of.numpat)); for (t = 0; t < of.numins; t++) { /* convert the samplename */ q->samplename = DupStr(s->samplename, 23, 1); /* init the sampleinfo variables */ q->speed = finetune[s->finetune & 0xf]; q->volume = s->volume & 0x7f; q->loopstart = (ULONG)s->reppos; q->loopend = (ULONG)q->loopstart + (s->replen); q->length = (ULONG)s->length; q->flags = SF_SIGNED; q->seekpos = seekpos; seekpos += q->length; if ((s->replen) > 2) { q->flags |= SF_LOOP; } /* fix replen if repend > length */ if (q->loopend > q->length) q->loopend = q->length; s++; q++; } of.modtype = StrDup(descr); if (!ML_LoadPatterns()) return 0; return 1; }
static BOOL UNI_Load(BOOL curious) { int t; char *modtype,*oldtype=NULL; INSTRUMENT *d; SAMPLE *q; /* read module header */ _mm_read_UBYTES(mh.id,4,modreader); if(mh.id[3]!='N') universion=mh.id[3]-'0'; else universion=0x100; if(universion>=6) { if (universion==6) { _mm_skip_BYTE(modreader); } else { universion=_mm_read_M_UWORD(modreader); } mh.flags =_mm_read_M_UWORD(modreader); mh.numchn =_mm_read_UBYTE(modreader); mh.numvoices =_mm_read_UBYTE(modreader); mh.numpos =_mm_read_M_UWORD(modreader); mh.numpat =_mm_read_M_UWORD(modreader); mh.numtrk =_mm_read_M_UWORD(modreader); mh.numins =_mm_read_M_UWORD(modreader); mh.numsmp =_mm_read_M_UWORD(modreader); mh.reppos =_mm_read_M_UWORD(modreader); mh.initspeed =_mm_read_UBYTE(modreader); mh.inittempo =_mm_read_UBYTE(modreader); mh.initvolume=_mm_read_UBYTE(modreader); /* I expect this to show up soon in APlayer 1.06 format */ if (universion >= 0x106) mh.bpmlimit=_mm_read_M_UWORD(modreader); else mh.bpmlimit=32; mh.flags &= UF_XMPERIODS | UF_LINEAR | UF_INST | UF_NNA; mh.flags |= UF_PANNING; } else { mh.numchn =_mm_read_UBYTE(modreader); mh.numpos =_mm_read_I_UWORD(modreader); mh.reppos =(universion==5)?_mm_read_I_UWORD(modreader):0; mh.numpat =_mm_read_I_UWORD(modreader); mh.numtrk =_mm_read_I_UWORD(modreader); mh.numins =_mm_read_I_UWORD(modreader); mh.initspeed =_mm_read_UBYTE(modreader); mh.inittempo =_mm_read_UBYTE(modreader); _mm_read_UBYTES(mh.positions,256,modreader); _mm_read_UBYTES(mh.panning,32,modreader); mh.flags =_mm_read_UBYTE(modreader); mh.bpmlimit =32; mh.flags &= UF_XMPERIODS | UF_LINEAR; mh.flags |= UF_INST | UF_NOWRAP | UF_PANNING; } /* set module parameters */ of.flags =mh.flags; of.numchn =mh.numchn; of.numpos =mh.numpos; of.numpat =mh.numpat; of.numtrk =mh.numtrk; of.numins =mh.numins; of.reppos =mh.reppos; of.initspeed =mh.initspeed; of.inittempo =mh.inittempo; if(mh.bpmlimit) of.bpmlimit=mh.bpmlimit; else /* be bug-compatible with older releases */ of.bpmlimit=32; of.songname=readstring(); if(universion<0x102) oldtype=readstring(); if(oldtype) { size_t len=strlen(oldtype)+20; if(!(modtype=(char*)MikMod_malloc(len))) return 0; #ifdef HAVE_SNPRINTF snprintf(modtype,len,"%s (was %s)",(universion>=0x100)?"APlayer":"MikCvt2",oldtype); #else sprintf(modtype,"%s (was %s)",(universion>=0x100)?"APlayer":"MikCvt2",oldtype); #endif } else { if(!(modtype=(char*)MikMod_malloc(10))) return 0; #ifdef HAVE_SNPRINTF snprintf(modtype,10,"%s",(universion>=0x100)?"APlayer":"MikCvt3"); #else sprintf(modtype,"%s",(universion>=0x100)?"APlayer":"MikCvt3"); #endif } of.modtype=MikMod_strdup(modtype); MikMod_free(modtype);MikMod_free(oldtype); of.comment=readstring(); if(universion>=6) { of.numvoices=mh.numvoices; of.initvolume=mh.initvolume; } if(_mm_eof(modreader)) { _mm_errno=MMERR_LOADING_HEADER; return 0; } /* positions */ if(!AllocPositions(of.numpos)) return 0; if(universion>=6) { if(universion>=0x100) _mm_read_M_UWORDS(of.positions,of.numpos,modreader); else for(t=0;t<of.numpos;t++) of.positions[t]=_mm_read_UBYTE(modreader); _mm_read_M_UWORDS(of.panning,of.numchn,modreader); _mm_read_UBYTES(of.chanvol,of.numchn,modreader); } else { if((mh.numpos>256)||(mh.numchn>32)) { _mm_errno=MMERR_LOADING_HEADER; return 0; } for(t=0;t<of.numpos;t++) of.positions[t]=mh.positions[t]; for(t=0;t<of.numchn;t++) of.panning[t]=mh.panning[t]; } /* convert the ``end of song'' pattern code if necessary */ if(universion<0x106) for(t=0;t<of.numpos;t++) if(of.positions[t]==255) of.positions[t]=LAST_PATTERN; /* instruments and samples */ if(universion>=6) { of.numsmp=mh.numsmp; if(!AllocSamples()) return 0; if(!loadsmp6()) return 0; if(of.flags&UF_INST) { if(!AllocInstruments()) return 0; if(!loadinstr6()) return 0; } } else { if(!AllocInstruments()) return 0; if(!loadinstr5()) return 0; if(!AllocSamples()) { MikMod_free(wh);wh=NULL; return 0; } if(!loadsmp5()) return 0; /* check if the original file had no instruments */ if(of.numsmp==of.numins) { for(t=0,d=of.instruments;t<of.numins;t++,d++) { int u; if((d->volpts)||(d->panpts)||(d->globvol!=64)) break; for(u=0;u<96;u++) if((d->samplenumber[u]!=t)||(d->samplenote[u]!=u)) break; if(u!=96) break; } if(t==of.numins) { of.flags&=~UF_INST; of.flags&=~UF_NOWRAP; for(t=0,d=of.instruments,q=of.samples;t<of.numins;t++,d++,q++) { q->samplename=d->insname; d->insname=NULL; } } } } /* patterns */ if(!AllocPatterns()) return 0; if(universion>=6) { _mm_read_M_UWORDS(of.pattrows,of.numpat,modreader); _mm_read_M_UWORDS(of.patterns,of.numpat*of.numchn,modreader); } else { _mm_read_I_UWORDS(of.pattrows,of.numpat,modreader); _mm_read_I_UWORDS(of.patterns,of.numpat*of.numchn,modreader); } /* tracks */ if(!AllocTracks()) return 0; for(t=0;t<of.numtrk;t++) if(!(of.tracks[t]=readtrack())) { _mm_errno=MMERR_LOADING_TRACK; return 0; } return 1; }
static BOOL FAR_Load(BOOL curious) { int t,u,tracks=0; SAMPLE *q; FARSAMPLE s; FARNOTE *crow; UBYTE smap[8]; /* try to read module header (first part) */ _mm_read_UBYTES(mh1->id,4,modreader); _mm_read_SBYTES(mh1->songname,40,modreader); _mm_read_SBYTES(mh1->blah,3,modreader); mh1->headerlen = _mm_read_I_UWORD (modreader); mh1->version = _mm_read_UBYTE (modreader); _mm_read_UBYTES(mh1->onoff,16,modreader); _mm_read_UBYTES(mh1->edit1,9,modreader); mh1->speed = _mm_read_UBYTE(modreader); _mm_read_UBYTES(mh1->panning,16,modreader); _mm_read_UBYTES(mh1->edit2,4,modreader); mh1->stlen = _mm_read_I_UWORD (modreader); /* init modfile data */ of.modtype = StrDup(FAR_Version); of.songname = DupStr(mh1->songname,40,1); of.numchn = 16; of.initspeed = mh1->speed; of.inittempo = 80; of.reppos = 0; of.flags |= UF_PANNING; for(t=0;t<16;t++) of.panning[t]=mh1->panning[t]<<4; /* read songtext into comment field */ if(mh1->stlen) if (!ReadLinedComment(mh1->stlen, 66)) return 0; /* try to read module header (second part) */ _mm_read_UBYTES(mh2->orders,256,modreader); mh2->numpat = _mm_read_UBYTE(modreader); mh2->snglen = _mm_read_UBYTE(modreader); mh2->loopto = _mm_read_UBYTE(modreader); _mm_read_I_UWORDS(mh2->patsiz,256,modreader); of.numpos = mh2->snglen; if(!AllocPositions(of.numpos)) return 0; for(t=0;t<of.numpos;t++) { if(mh2->orders[t]==0xff) break; of.positions[t] = mh2->orders[t]; } /* count number of patterns stored in file */ of.numpat = 0; for(t=0;t<256;t++) if(mh2->patsiz[t]) if((t+1)>of.numpat) of.numpat=t+1; of.numtrk = of.numpat*of.numchn; /* seek across eventual new data */ _mm_fseek(modreader,mh1->headerlen-(869+mh1->stlen),SEEK_CUR); /* alloc track and pattern structures */ if(!AllocTracks()) return 0; if(!AllocPatterns()) return 0; for(t=0;t<of.numpat;t++) { UBYTE rows=0; #ifdef WITH_TEMPO UBYTE tempo; #endif memset(pat,0,256*16*4*sizeof(FARNOTE)); if(mh2->patsiz[t]) { rows = _mm_read_UBYTE(modreader); #ifdef WITH_TEMPO tempo = _mm_read_UBYTE(modreader); #else _mm_skip_BYTE(modreader); #endif crow = pat; /* file often allocates 64 rows even if there are less in pattern */ if (mh2->patsiz[t]<2+(rows*16*4)) { _mm_errno = MMERR_LOADING_PATTERN; return 0; } for(u=(mh2->patsiz[t]-2)/4;u;u--,crow++) { crow->note = _mm_read_UBYTE(modreader); crow->ins = _mm_read_UBYTE(modreader); crow->vol = _mm_read_UBYTE(modreader); crow->eff = _mm_read_UBYTE(modreader); } if(_mm_eof(modreader)) { _mm_errno = MMERR_LOADING_PATTERN; return 0; } crow=pat; of.pattrows[t] = rows; for(u=16;u;u--,crow++) if(!(of.tracks[tracks++]=FAR_ConvertTrack(crow,rows))) { _mm_errno=MMERR_LOADING_PATTERN; return 0; } } else tracks+=16; } /* read sample map */ if(!_mm_read_UBYTES(smap,8,modreader)) { _mm_errno = MMERR_LOADING_HEADER; return 0; } /* count number of samples used */ of.numins = 0; for(t=0;t<64;t++) if(smap[t>>3]&(1<<(t&7))) of.numins=t+1; of.numsmp = of.numins; /* alloc sample structs */ if(!AllocSamples()) return 0; q = of.samples; for(t=0;t<of.numsmp;t++) { q->speed = 8363; q->flags = SF_SIGNED; if(smap[t>>3]&(1<<(t&7))) { _mm_read_SBYTES(s.samplename,32,modreader); s.length = _mm_read_I_ULONG(modreader); s.finetune = _mm_read_UBYTE(modreader); s.volume = _mm_read_UBYTE(modreader); s.reppos = _mm_read_I_ULONG(modreader); s.repend = _mm_read_I_ULONG(modreader); s.type = _mm_read_UBYTE(modreader); s.loop = _mm_read_UBYTE(modreader); q->samplename = DupStr(s.samplename,32,1); q->length = s.length; q->loopstart = s.reppos; q->loopend = s.repend; q->volume = s.volume<<2; if(s.type&1) q->flags|=SF_16BITS; if(s.loop&8) q->flags|=SF_LOOP; q->seekpos = _mm_ftell(modreader); _mm_fseek(modreader,q->length,SEEK_CUR); } else q->samplename = DupStr(NULL,0,0); q++; }