static BOOL ULT_Load(BOOL curious) { int t,u,tracks=0; SAMPLE *q; ULTSAMPLE s; ULTHEADER mh; UBYTE nos,noc,nop; /* try to read module header */ _mm_read_string(mh.id,15,modreader); _mm_read_string(mh.songtitle,32,modreader); mh.reserved=_mm_read_UBYTE(modreader); if(_mm_eof(modreader)) { _mm_errno = MMERR_LOADING_HEADER; return 0; } ULT_Version[ULT_VERSION_LEN-1]='3'+(mh.id[14]-'1'); of.modtype = DupStr(ULT_Version,ULT_VERSION_LEN,1); of.initspeed = 6; of.inittempo = 125; of.reppos = 0; /* read songtext */ if ((mh.id[14]>'1')&&(mh.reserved)) if(!ReadLinedComment(mh.reserved * 32, 32)) return 0; nos=_mm_read_UBYTE(modreader); if(_mm_eof(modreader)) { _mm_errno = MMERR_LOADING_HEADER; return 0; } of.songname=DupStr(mh.songtitle,32,1); of.numins=of.numsmp=nos; if(!AllocSamples()) return 0; q = of.samples; for(t=0; t<nos; t++) { /* try to read sample info */ _mm_read_string(s.samplename,32,modreader); _mm_read_string(s.dosname,12,modreader); s.loopstart =_mm_read_I_ULONG(modreader); s.loopend =_mm_read_I_ULONG(modreader); s.sizestart =_mm_read_I_ULONG(modreader); s.sizeend =_mm_read_I_ULONG(modreader); s.volume =_mm_read_UBYTE(modreader); s.flags =_mm_read_UBYTE(modreader); s.speed =(mh.id[14]>='4')?_mm_read_I_UWORD(modreader):8363; s.finetune =_mm_read_I_SWORD(modreader); if(_mm_eof(modreader)) { _mm_errno = MMERR_LOADING_SAMPLEINFO; return 0; } q->samplename=DupStr(s.samplename,32,1); /* The correct formula for the coefficient would be pow(2,(double)s.finetume/OCTAVE/32768), but to avoid floating point here, we'll use a first order approximation here. 1/567290 == Ln(2)/OCTAVE/32768 */ q->speed=s.speed+s.speed*(((SLONG)s.speed*(SLONG)s.finetune)/567290); q->length = s.sizeend-s.sizestart; q->volume = s.volume>>2; q->loopstart = s.loopstart; q->loopend = s.loopend; q->flags = SF_SIGNED; if(s.flags&ULTS_LOOP) q->flags|=SF_LOOP; if(s.flags&ULTS_16BITS) { s.sizeend+=(s.sizeend-s.sizestart); s.sizestart<<=1; q->flags|=SF_16BITS; q->loopstart>>=1; q->loopend>>=1; } q++; }
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,tempo; memset(pat,0,256*16*4*sizeof(FARNOTE)); if(mh2->patsiz[t]) { rows = _mm_read_UBYTE(modreader); tempo = _mm_read_UBYTE(modreader); 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++; }