📄 mplayer.c
字号:
mod->sngspd = speed;
mod->vbtick = 0;
}
return 0;
}
static void DoS3MVolSlide(UWORD tick, UWORD flags, MP_CONTROL *a, UBYTE inf)
{
UBYTE lo, hi;
if (inf)
a->s3mvolslide=inf;
else
inf=a->s3mvolslide;
lo=inf&0xf;
hi=inf>>4;
if (!lo) {
if ((tick)||(flags&UF_S3MSLIDES)) a->tmpvolume+=hi;
} else
if (!hi) {
if ((tick)||(flags&UF_S3MSLIDES)) a->tmpvolume-=lo;
} else
if (lo==0xf) {
if (!tick) a->tmpvolume+=(hi?hi:0xf);
} else
if (hi==0xf) {
if (!tick) a->tmpvolume-=(lo?lo:0xf);
} else
return;
if (a->tmpvolume<0)
a->tmpvolume=0;
else if (a->tmpvolume>64)
a->tmpvolume=64;
}
static int DoS3MEffectD(UWORD tick, UWORD flags, MP_CONTROL *a, MODULE *mod, SWORD channel)
{
DoS3MVolSlide(tick, flags, a, UniGetByte());
return 1;
}
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -