static BOOL DSM_ReadPattern(void) { int flag,row=0; SWORD length; DSMNOTE *n; /* clear pattern data */ memset(dsmbuf,255,DSM_MAXCHAN*64*sizeof(DSMNOTE)); length=_mm_read_I_SWORD(modreader); while(row<64) { flag=_mm_read_UBYTE(modreader); if((_mm_eof(modreader))||(--length<0)) { _mm_errno = MMERR_LOADING_PATTERN; return 0; } if(flag) { n=&dsmbuf[((flag&0xf)*64)+row]; if(flag&0x80) n->note=_mm_read_UBYTE(modreader); if(flag&0x40) n->ins=_mm_read_UBYTE(modreader); if(flag&0x20) n->vol=_mm_read_UBYTE(modreader); if(flag&0x10) { n->cmd=_mm_read_UBYTE(modreader); n->inf=_mm_read_UBYTE(modreader); } } else row++; } return 1; }
void SL_Load(void *buffer, ULONG length) { SBYTE *bptr=(SBYTE *)buffer; SWORD *wptr=(SWORD *)buffer; UWORD stodo; int t; /* compute number of samples to load */ // if (sl_outfmt & SF_16BITS) length>>=1; #ifdef DEBUG if (IsError(sl_buffer == NULL)) ; #endif while (length) { stodo= (length<1024) ? (UWORD)length : 1024; if (sl_infmt&SF_16BITS) { if ( !(sl_infmt&SF_BIG_ENDIAN) ) { SWORD *sp = (SWORD *) sl_buffer; for ( t=0; t < stodo; t++ ) { *sp++ = _mm_read_I_SWORD(); } } else _mm_read_str((char *) sl_buffer,sizeof(SWORD)*stodo); } else { SBYTE *s; SWORD *d; _mm_read_str((char *)sl_buffer,sizeof(SBYTE)*stodo); s=(SBYTE *)sl_buffer; d=sl_buffer; s+=stodo; d+=stodo; for (t=0;t<stodo;t++) { s--; d--; *d=(*s)<<8; } } if (sl_infmt & SF_DELTA) { for (t=0;t<stodo;t++) { sl_buffer[t]+=sl_old; sl_old=sl_buffer[t]; } } if ((sl_infmt^sl_outfmt) & SF_SIGNED) { for (t=0;t<stodo;t++) { sl_buffer[t]^=0x8000; } } if (sl_outfmt & SF_16BITS) { for (t=0;t<stodo;t++) *(wptr++)=sl_buffer[t]; } else { for (t=0;t<stodo;t++) *(bptr++)=sl_buffer[t]>>8; } length-=stodo; } }
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++; }
static BOOL ULT_Load(void) { int t,u,tracks=0; INSTRUMENT *d; SAMPLE *q; ULTSAMPLE s; ULTHEADER mh; UBYTE nos,noc,nop; /* try to read module header */ _mm_read_str(mh.id,15); _mm_read_str(mh.songtitle,32); mh.reserved=_mm_read_UBYTE(); if(modpos > modsize){ gModPlayerErrorMessage=ERROR_LOADING_HEADER; return 0; } if(mh.id[14]<'1' || mh.id[14]>'4'){ //printf("This version is not yet supported\n"); return 0; } of.modtype=strdup(ULT_Version[mh.id[14]-'1']); of.initspeed=6; of.inittempo=125; /* read songtext */ if(!ReadComment((UWORD)(mh.reserved * 32))) return 0; nos=_mm_read_UBYTE(); if(modpos > modsize){ gModPlayerErrorMessage=ERROR_LOADING_HEADER; return 0; } of.songname=DupStr(mh.songtitle,32); of.numins=nos; if(!AllocInstruments()) return 0; d=of.instruments; for(t=0;t<nos;t++){ d->numsmp=1; if(!AllocSamples(d)) return 0; q=d->samples; /* try to read sample info */ _mm_read_str(s.samplename,32); _mm_read_str(s.dosname,12); s.loopstart =_mm_read_I_ULONG(); s.loopend =_mm_read_I_ULONG(); s.sizestart =_mm_read_I_ULONG(); s.sizeend =_mm_read_I_ULONG(); s.volume =_mm_read_UBYTE(); s.flags =_mm_read_UBYTE(); s.finetune =_mm_read_I_SWORD(); if(modpos > modsize){ gModPlayerErrorMessage=ERROR_LOADING_SAMPLEINFO; return 0; } d->insname=DupStr(s.samplename,32); q->seekpos=0; q->c2spd=8363; if(mh.id[14]>='4'){ _mm_read_I_UWORD(); /* read 1.6 extra info(??) word */ q->c2spd=s.finetune; } 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){ q->flags|=SF_16BITS; q->loopstart>>=1; q->loopend>>=1; } /* printf("Sample %d %s length %ld\n",t,d->samplename,d->length); */ d++; }