示例#1
0
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;
}
示例#2
0
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;
    }
}
示例#3
0
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++;
    }