📄 mplayer.c
字号:
}static void DoS3MSlideDn(UWORD tick, MP_CONTROL *a, UBYTE inf){ UBYTE hi,lo; if (inf) a->slidespeed=inf; else inf=a->slidespeed; hi=inf>>4; lo=inf&0xf; if (hi==0xf) { if (!tick) a->tmpperiod+=(UWORD)lo<<2; } else if (hi==0xe) { if (!tick) a->tmpperiod+=lo; } else { if (tick) a->tmpperiod+=(UWORD)inf<<2; }}static int DoS3MEffectE(UWORD tick, UWORD flags, MP_CONTROL *a, MODULE *mod, SWORD channel){ UBYTE dat; dat=UniGetByte(); if (a->main.period) DoS3MSlideDn(tick, a,dat); return 0;}static void DoS3MSlideUp(UWORD tick, MP_CONTROL *a, UBYTE inf){ UBYTE hi,lo; if (inf) a->slidespeed=inf; else inf=a->slidespeed; hi=inf>>4; lo=inf&0xf; if (hi==0xf) { if (!tick) a->tmpperiod-=(UWORD)lo<<2; } else if (hi==0xe) { if (!tick) a->tmpperiod-=lo; } else { if (tick) a->tmpperiod-=(UWORD)inf<<2; }}static int DoS3MEffectF(UWORD tick, UWORD flags, MP_CONTROL *a, MODULE *mod, SWORD channel){ UBYTE dat; dat=UniGetByte(); if (a->main.period) DoS3MSlideUp(tick, a,dat); return 0;}static int DoS3MEffectI(UWORD tick, UWORD flags, MP_CONTROL *a, MODULE *mod, SWORD channel){ UBYTE inf, on, off; inf = UniGetByte(); if (inf) a->s3mtronof = inf; else { inf = a->s3mtronof; if (!inf) return 0; } if (!tick) return 0; on=(inf>>4)+1; off=(inf&0xf)+1; a->s3mtremor%=(on+off); a->volume=(a->s3mtremor<on)?a->tmpvolume:0; a->ownvol=1; a->s3mtremor++; return 0;}static int DoS3MEffectQ(UWORD tick, UWORD flags, MP_CONTROL *a, MODULE *mod, SWORD channel){ UBYTE inf; inf = UniGetByte(); if (a->main.period) { if (inf) { a->s3mrtgslide=inf>>4; a->s3mrtgspeed=inf&0xf; } /* only retrigger if low nibble > 0 */ if (a->s3mrtgspeed>0) { if (!a->retrig) { /* when retrig counter reaches 0, reset counter and restart the sample */ if (a->main.kick!=KICK_NOTE) a->main.kick=KICK_KEYOFF; a->retrig=a->s3mrtgspeed; if ((tick)||(flags&UF_S3MSLIDES)) { switch (a->s3mrtgslide) { case 1: case 2: case 3: case 4: case 5: a->tmpvolume-=(1<<(a->s3mrtgslide-1)); break; case 6: a->tmpvolume=(2*a->tmpvolume)/3; break; case 7: a->tmpvolume>>=1; break; case 9: case 0xa: case 0xb: case 0xc: case 0xd: a->tmpvolume+=(1<<(a->s3mrtgslide-9)); break; case 0xe: a->tmpvolume=(3*a->tmpvolume)>>1; break; case 0xf: a->tmpvolume=a->tmpvolume<<1; break; } if (a->tmpvolume<0) a->tmpvolume=0; else if (a->tmpvolume>64) a->tmpvolume=64; } } a->retrig--; /* countdown */ } } return 0;}static int DoS3MEffectR(UWORD tick, UWORD flags, MP_CONTROL *a, MODULE *mod, SWORD channel){ UBYTE dat, q; UWORD temp=0; /* silence warning */ dat = UniGetByte(); if (!tick) { if (dat&0x0f) a->trmdepth=dat&0xf; if (dat&0xf0) a->trmspd=(dat&0xf0)>>2; } q=(a->trmpos>>2)&0x1f; switch ((a->wavecontrol>>4)&3) { case 0: /* sine */ temp=VibratoTable[q]; break; case 1: /* ramp down */ q<<=3; if (a->trmpos<0) q=255-q; temp=q; break; case 2: /* square wave */ temp=255; break; case 3: /* random */ temp=getrandom(256); break; } temp*=a->trmdepth; temp>>=7; if (a->trmpos>=0) { a->volume=a->tmpvolume+temp; if (a->volume>64) a->volume=64; } else { a->volume=a->tmpvolume-temp; if (a->volume<0) a->volume=0; } a->ownvol = 1; if (tick) a->trmpos+=a->trmspd; return 0;}static int DoS3MEffectT(UWORD tick, UWORD flags, MP_CONTROL *a, MODULE *mod, SWORD channel){ UBYTE tempo; tempo = UniGetByte(); if (tick || mod->patdly2) return 0; mod->bpm = (tempo < 32) ? 32 : tempo; return 0;}static int DoS3MEffectU(UWORD tick, UWORD flags, MP_CONTROL *a, MODULE *mod, SWORD channel){ UBYTE dat, q; UWORD temp = 0; /* silence warning */ dat = UniGetByte(); if (!tick) { if (dat&0x0f) a->vibdepth=dat&0xf; if (dat&0xf0) a->vibspd=(dat&0xf0)>>2; } else if (a->main.period) { q=(a->vibpos>>2)&0x1f; switch (a->wavecontrol&3) { case 0: /* sine */ temp=VibratoTable[q]; break; case 1: /* ramp down */ q<<=3; if (a->vibpos<0) q=255-q; temp=q; break; case 2: /* square wave */ temp=255; break; case 3: /* random */ temp=getrandom(256); break; } temp*=a->vibdepth; temp>>=8; if (a->vibpos>=0) a->main.period=a->tmpperiod+temp; else a->main.period=a->tmpperiod-temp; a->ownper = 1; a->vibpos+=a->vibspd; } return 0;}/*========== Envelope helpers */static int DoKeyOff(UWORD tick, UWORD flags, MP_CONTROL *a, MODULE *mod, SWORD channel){ a->main.keyoff|=KEY_OFF; if ((!(a->main.volflg&EF_ON))||(a->main.volflg&EF_LOOP)) a->main.keyoff=KEY_KILL; return 0;}static int DoKeyFade(UWORD tick, UWORD flags, MP_CONTROL *a, MODULE *mod, SWORD channel){ UBYTE dat; dat=UniGetByte(); if ((tick>=dat)||(tick==mod->sngspd-1)) { a->main.keyoff=KEY_KILL; if (!(a->main.volflg&EF_ON)) a->main.fadevol=0; } return 0;}/*========== Fast Tracker effects *//* DoXMEffect6 after DoXMEffectA */static int DoXMEffectA(UWORD tick, UWORD flags, MP_CONTROL *a, MODULE *mod, SWORD channel){ UBYTE inf, lo, hi; inf = UniGetByte(); if (inf) a->s3mvolslide = inf; else inf = a->s3mvolslide; if (tick) { lo=inf&0xf; hi=inf>>4; if (!hi) { a->tmpvolume-=lo; if (a->tmpvolume<0) a->tmpvolume=0; } else { a->tmpvolume+=hi; if (a->tmpvolume>64) a->tmpvolume=64; } } return 0;}static int DoXMEffect6(UWORD tick, UWORD flags, MP_CONTROL *a, MODULE *mod, SWORD channel){ if (a->main.period) DoVibrato(tick, a); return DoXMEffectA(tick, flags, a, mod, channel);}static int DoXMEffectE1(UWORD tick, UWORD flags, MP_CONTROL *a, MODULE *mod, SWORD channel){ UBYTE dat; dat=UniGetByte(); if (!tick) { if (dat) a->fportupspd=dat; if (a->main.period) a->tmpperiod-=(a->fportupspd<<2); } return 0;}static int DoXMEffectE2(UWORD tick, UWORD flags, MP_CONTROL *a, MODULE *mod, SWORD channel){ UBYTE dat; dat=UniGetByte(); if (!tick) { if (dat) a->fportdnspd=dat; if (a->main.period) a->tmpperiod+=(a->fportdnspd<<2); } return 0;}static int DoXMEffectEA(UWORD tick, UWORD flags, MP_CONTROL *a, MODULE *mod, SWORD channel){ UBYTE dat; dat=UniGetByte(); if (!tick) if (dat) a->fslideupspd=dat; a->tmpvolume+=a->fslideupspd; if (a->tmpvolume>64) a->tmpvolume=64; return 0;}static int DoXMEffectEB(UWORD tick, UWORD flags, MP_CONTROL *a, MODULE *mod, SWORD channel){ UBYTE dat; dat=UniGetByte(); if (!tick) if (dat) a->fslidednspd=dat; a->tmpvolume-=a->fslidednspd; if (a->tmpvolume<0) a->tmpvolume=0; return 0;}static int DoXMEffectG(UWORD tick, UWORD flags, MP_CONTROL *a, MODULE *mod, SWORD channel){ mod->volume=UniGetByte()<<1; if (mod->volume>128) mod->volume=128; return 0;}static int DoXMEffectH(UWORD tick, UWORD flags, MP_CONTROL *a, MODULE *mod, SWORD channel){ UBYTE inf; inf = UniGetByte(); if (tick) { if (inf) mod->globalslide=inf; else inf=mod->globalslide; if (inf & 0xf0) inf&=0xf0; mod->volume=mod->volume+((inf>>4)-(inf&0xf))*2; if (mod->volume<0) mod->volume=0; else if (mod->volume>128) mod->volume=128; } return 0;}static int DoXMEffectL(UWORD tick, UWORD flags, MP_CONTROL *a, MODULE *mod, SWORD channel){ UBYTE dat; dat=UniGetByte(); if ((!tick)&&(a->main.i)) { UWORD points; INSTRUMENT *i=a->main.i; MP_VOICE *aout; if ((aout=a->slave)) { if (aout->venv.env) { points=i->volenv[i->volpts-1].pos; aout->venv.p=aout->venv.env[(dat>points)?points:dat].pos; } if (aout->penv.env) { points=i->panenv[i->panpts-1].pos; aout->penv.p=aout->penv.env[(dat>points)?points:dat].pos; } } } return 0;}static int DoXMEffectP(UWORD tick, UWORD flags, MP_CONTROL *a, MODULE *mod, SWORD channel){ UBYTE inf, lo, hi; SWORD pan; inf = UniGetByte(); if (!mod->panflag) return 0; if (inf) a->pansspd = inf; else inf =a->pansspd; if (tick) { lo=inf&0xf; hi=inf>>4; /* slide right has absolute priority */ if (hi) lo = 0; pan=((a->main.panning==PAN_SURROUND)?PAN_CENTER:a->main.panning)+hi-lo; a->main.panning=(pan<PAN_LEFT)?PAN_LEFT:(pan>PAN_RIGHT?PAN_RIGHT:pan); } return 0;}static int DoXMEffectX1(UWORD tick, UWORD flags, MP_CONTROL *a, MODULE *mod, SWORD channel){ UBYTE dat; dat = UniGetByte(); if (dat) a->ffportupspd = dat; else dat = a->ffportupspd; if (a->main.period) if (!tick) { a->main.period-=dat; a->tmpperiod-=dat; a->ownper = 1; } return 0;}static int DoXMEffectX2(UWORD tick, UWORD flags, MP_CONTROL *a, MODULE *mod, SWORD channel){ UBYTE dat; dat = UniGetByte(); if (dat) a->ffportdnspd=dat; else dat = a->ffportdnspd; if (a->main.period) if (!tick) { a->main.period+=dat; a->tmpperiod+=dat; a->ownper = 1; } return 0;}/*========== Impulse Tracker effects */static void DoITToneSlide(UWORD tick, MP_CONTROL *a, UBYTE dat){ if (dat) a->portspeed = dat; /* if we don't come from another note, ignore the slide and play the note as is */ if (!a->oldnote || !a->main.period) return; if ((!tick)&&(a->newsamp)){ a->main.kick=KICK_NOTE; a->main.start=-1; } else a->main.kick=(a->main.kick==KICK_NOTE)?KICK_ENV:KICK_ABSENT; if (tick) { int dist; /* We have to slide a->main.period towards a->wantedperiod, compute the difference between those two values */ dist=a->main.period-a->wantedperiod; /* if they are equal or if portamentospeed is too big... */ if ((!dist)||((a->portspeed<<2)>abs(dist))) /* ... make tmpperiod equal tperiod */ a->tmpperiod=a->main.period=a->wantedperiod; else if (dist>0) { a->tmpperiod-=a->portspeed<<2; a->main.period-=a->portspeed<<2; /* dist>0 slide up */ } else { a->tmpperiod+=a->portspeed<<2; a->main.period+=a->portspeed<<2; /* dist<0 slide down */ } } else a->tmpperiod=a->main.period; a->ownper=1;}static int DoITEffectG(UWORD tick, UWORD flags, MP_CONTROL *a, MODULE *mod, SWORD channel){ DoITToneSlide(tick, a, UniGetByte()); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -