📄 mplayer.c
字号:
else if (a->notedelay) a->notedelay--; break; case 0xe: /* pattern delay */ if (pf->vbtick) break; if (!pf->patdly2) pf->patdly=nib+1; /* only once, when vbtick=0 */ break; case 0xf: /* invert loop, not supported */ break; }}static void DoVibrato(void){ UBYTE q; UWORD temp=0; 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 wave */ temp=getrandom(256); break; } temp*=a->vibdepth; temp>>=7;temp<<=2; if (a->vibpos>=0) a->period=a->tmpperiod+temp; else a->period=a->tmpperiod-temp; if (pf->vbtick) a->vibpos+=a->vibspd;}static void DoTremolo(void){ UBYTE q; UWORD temp=0; 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 wave */ temp=getrandom(256); break; } temp*=a->trmdepth; temp>>=6; 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; } if (pf->vbtick) a->trmpos+=a->trmspd;}static void DoVolSlide(UBYTE dat){ if (!pf->vbtick) return; if (dat&0xf) { a->tmpvolume-=(dat&0x0f); if (a->tmpvolume<0) a->tmpvolume=0; } else { a->tmpvolume+=(dat>>4); if (a->tmpvolume>64) a->tmpvolume=64; }}static void DoToneSlide(void){ if (pf->vbtick) { int dist; /* We have to slide a->period towards a->wantedperiod, so compute the difference between those two values */ dist=a->period-a->wantedperiod; /* if they are equal or if portamentospeed is too big ...*/ if ((!dist)||a->portspeed>abs(dist)) /* ...make tmpperiod equal tperiod */ a->tmpperiod=a->period=a->wantedperiod; else if (dist>0) { a->tmpperiod-=a->portspeed; a->period-=a->portspeed; /* dist>0, slide up */ } else { a->tmpperiod+=a->portspeed; a->period+=a->portspeed; /* dist<0, slide down */ } } else a->tmpperiod=a->period;}static void DoArpeggio(UBYTE dat){ UBYTE note=a->note; if (dat) { switch (pf->vbtick%3) { case 1: note+=(dat>>4); break; case 2: note+=(dat&0xf); break; } a->period=GetPeriod((UWORD)note<<1,a->speed); a->ownper=1; }}/*========== Scream Tracker effects */static void DoS3MVolSlide(UBYTE inf){ UBYTE lo, hi; explicitslides=1; if (inf) a->s3mvolslide=inf; else inf=a->s3mvolslide; lo=inf&0xf; hi=inf>>4; if (!lo) { if ((pf->vbtick)||(pf->flags&UF_S3MSLIDES)) a->tmpvolume+=hi; } else if (!hi) { if ((pf->vbtick)||(pf->flags&UF_S3MSLIDES)) a->tmpvolume-=lo; } else if (lo==0xf) { if (!pf->vbtick) a->tmpvolume+=(hi?hi:0xf); } else if (hi==0xf) { if (!pf->vbtick) a->tmpvolume-=(lo?lo:0xf); } else return; if (a->tmpvolume<0) a->tmpvolume=0; else if (a->tmpvolume>64) a->tmpvolume=64;}static void DoS3MSlideDn(UBYTE inf){ UBYTE hi,lo; if (inf) a->slidespeed=inf; else inf=a->slidespeed; hi=inf>>4; lo=inf&0xf; if (hi==0xf) { if (!pf->vbtick) a->tmpperiod+=(UWORD)lo<<2; } else if (hi==0xe) { if (!pf->vbtick) a->tmpperiod+=lo; } else { if (pf->vbtick) a->tmpperiod+=(UWORD)inf<<2; }}static void DoS3MSlideUp(UBYTE inf){ UBYTE hi,lo; if (inf) a->slidespeed=inf; else inf=a->slidespeed; hi=inf>>4; lo=inf&0xf; if (hi==0xf) { if (!pf->vbtick) a->tmpperiod-=(UWORD)lo<<2; } else if (hi==0xe) { if (!pf->vbtick) a->tmpperiod-=lo; } else { if (pf->vbtick) a->tmpperiod-=(UWORD)inf<<2; }}static void DoS3MTremor(UBYTE inf){ UBYTE on,off; if (inf) a->s3mtronof=inf; else { inf=a->s3mtronof; if (!inf) return; } if (!pf->vbtick) return; on=(inf>>4)+1; off=(inf&0xf)+1; a->s3mtremor%=(on+off); a->volume=(a->s3mtremor<on)?a->tmpvolume:0; a->s3mtremor++;}static void DoS3MRetrig(UBYTE inf){ 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->kick!=KICK_NOTE) a->kick=KICK_KEYOFF; a->retrig=a->s3mrtgspeed; if ((pf->vbtick)||(pf->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 */ }}static void DoS3MSpeed(UBYTE speed){ if (pf->vbtick||pf->patdly2) return; if (speed>128) speed-=128; if (speed) { pf->sngspd=speed; pf->vbtick=0; }}static void DoS3MTempo(UBYTE tempo){ if (pf->vbtick||pf->patdly2) return; pf->bpm=(tempo<32)?32:tempo;}static void DoS3MFineVibrato(void){ UBYTE q; UWORD temp=0; 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->period=a->tmpperiod+temp; else a->period=a->tmpperiod-temp; a->vibpos+=a->vibspd;}static void DoS3MTremolo(void){ UBYTE q; UWORD temp=0; 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; } if (pf->vbtick) a->trmpos+=a->trmspd;}/*========== Fast Tracker effects */static void DoXMVolSlide(UBYTE inf){ UBYTE lo,hi; explicitslides=2; if (inf) a->s3mvolslide=inf; else inf=a->s3mvolslide; if (!pf->vbtick) return; 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; }}static void DoXMGlobalSlide(UBYTE inf){ if (pf->vbtick) { if (inf) pf->globalslide=inf; else inf=pf->globalslide; if (inf & 0xf0) inf&=0xf0; pf->volume=pf->volume+((inf>>4)-(inf&0xf))*2; if (pf->volume<0) pf->volume=0; else if (pf->volume>128) pf->volume=128; }}static void DoXMPanSlide(UBYTE inf){ UBYTE lo,hi; SWORD pan; if (inf) a->pansspd=inf; else inf=a->pansspd; if (!pf->vbtick) return; lo=inf&0xf; hi=inf>>4; /* slide right has absolute priority */ if (hi) lo=0; pan=((a->panning==PAN_SURROUND)?PAN_CENTER:a->panning)+hi-lo; a->panning=(pan<PAN_LEFT)?PAN_LEFT:(pan>PAN_RIGHT?PAN_RIGHT:pan);}static void DoXMExtraFineSlideUp(UBYTE inf){ if (!pf->vbtick) { a->period-=inf; a->tmpperiod-=inf; }}static void DoXMExtraFineSlideDown(UBYTE inf){ if (!pf->vbtick) { a->period+=inf; a->tmpperiod+=inf; }}/*========== Impulse Tracker effects */static void DoITChanVolSlide(UBYTE inf){ UBYTE lo, hi; if (inf) a->chanvolslide=inf; inf=a->chanvolslide; lo=inf&0xf; hi=inf>>4; if (!hi) a->chanvol-=lo; else if (!lo) { a->chanvol+=hi; } else if (hi==0xf) { if (!pf->vbtick) a->chanvol-=lo; } else if (lo==0xf) { if (!pf->vbtick) a->chanvol+=hi; } if (a->chanvol<0) a->chanvol=0; if (a->chanvol>64) a->chanvol=64;}static void DoITGlobalSlide(UBYTE inf){ UBYTE lo,hi; if (inf) pf->globalslide=inf; inf=pf->globalslide; lo=inf&0xf; hi=inf>>4; if (!lo) { if (pf->vbtick) pf->volume+=hi; } else if (!hi) { if (pf->vbtick) pf->volume-=lo; } else if (lo==0xf) { if (!pf->vbtick) pf->volume+=hi; } else if (hi==0xf) { if (!pf->vbtick) pf->volume-=lo; } if (pf->volume<0) pf->volume=0; if (pf->volume>128) pf->volume=128;}static void DoITPanSlide(UBYTE inf){ UBYTE lo,hi; SWORD pan; if (inf) a->pansspd=inf; else inf=a->pansspd; lo=inf&0xf; hi=inf>>4; pan=(a->panning==PAN_SURROUND)?PAN_CENTER:a->panning; if (!hi) pan+=lo<<2; else if (!lo) { pan-=hi<<2; } else if (hi==0xf) { if (!pf->vbtick) pan+=lo<<2; } else if (lo==0xf) { if (!pf->vbtick) pan-=hi<<2; } a->panning=/*pf->panning[mp_channel]=*/ (pan<PAN_LEFT)?PAN_LEFT:(pan>PAN_RIGHT?PAN_RIGHT:pan);}static void DoITTempo(UBYTE tempo){ SWORD temp=pf->bpm; if (pf->vbtick||pf->patdly2) return; if (tempo&0x10) temp+=(tempo&0x0f); else temp-=tempo; pf->bpm=(temp>255)?255:(temp<1?1:temp);}static void DoITVibrato(void){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -