⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mplayer.c

📁 SDL_mixer 是一个基于 SDL 的混音器
💻 C
📖 第 1 页 / 共 5 页
字号:
			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 + -