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

📄 reverb.c

📁 MIDI解码程序(用VC编写)
💻 C
📖 第 1 页 / 共 5 页
字号:
	int32 ba1 = p->ba1, a2 = p->a2, b0 = p->b0, b2 = p->b2;	for(i = 0; i < count; i++) {		yout = imuldiv24(buf[i], b0) + imuldiv24(x1l - y1l, ba1) + imuldiv24(x2l, b2) - imuldiv24(y2l, a2);		x2l = x1l;		x1l = buf[i];		y2l = y1l;		y1l = yout;		buf[i] = yout;		yout = imuldiv24(buf[++i], b0) + imuldiv24(x1r - y1r, ba1) + imuldiv24(x2r, b2) - imuldiv24(y2r, a2);		x2r = x1r;		x1r = buf[i];		y2r = y1r;		y1r = yout;		buf[i] = yout;	}	p->x1l = x1l, p->x2l = x2l, p->y1l = y1l, p->y2l = y2l,		p->x1r = x1r, p->x2r = x2r, p->y1r = y1r, p->y2r = y2r;}void init_pink_noise(pink_noise *p){	p->b0 = p->b1 = p->b2 = p->b3 = p->b4 = p->b5 = p->b6 = 0;}float get_pink_noise(pink_noise *p){	float b0 = p->b0, b1 = p->b1, b2 = p->b2, b3 = p->b3,	   b4 = p->b4, b5 = p->b5, b6 = p->b6, pink, white;	white = genrand_real1() * 2.0 - 1.0;	b0 = 0.99886 * b0 + white * 0.0555179;	b1 = 0.99332 * b1 + white * 0.0750759;	b2 = 0.96900 * b2 + white * 0.1538520;	b3 = 0.86650 * b3 + white * 0.3104856;	b4 = 0.55000 * b4 + white * 0.5329522;	b5 = -0.7616 * b5 - white * 0.0168980;	pink = b0 + b1 + b2 + b3 + b4 + b5 + b6 + white * 0.5362;	b6 = white * 0.115926;	pink *= 0.22;	pink = (pink > 1.0) ? 1.0 : (pink < -1.0) ? -1.0 : pink;	p->b0 = b0, p->b1 = b1, p->b2 = b2, p->b3 = b3,		p->b4 = b4, p->b5 = b5, p->b6 = b6;	return pink;}float get_pink_noise_light(pink_noise *p){	float b0 = p->b0, b1 = p->b1, b2 = p->b2, pink, white;	white = genrand_real1() * 2.0 - 1.0;	b0 = 0.99765 * b0 + white * 0.0990460;	b1 = 0.96300 * b1 + white * 0.2965164;	b2 = 0.57000 * b2 + white * 1.0526913;	pink = b0 + b1 + b2 + white * 0.1848;	pink *= 0.22;	pink = (pink > 1.0) ? 1.0 : (pink < -1.0) ? -1.0 : pink;	p->b0 = b0, p->b1 = b1, p->b2 = b2;	return pink;}/*                          *//*  Standard Reverb Effect  *//*                          */#define REV_VAL0         5.3#define REV_VAL1        10.5#define REV_VAL2        44.12#define REV_VAL3        21.0static int32  reverb_effect_buffer[AUDIO_BUFFER_SIZE * 2];static int32  reverb_effect_bufsize = sizeof(reverb_effect_buffer);#if OPT_MODE != 0#if defined(_MSC_VER) || defined(__WATCOMC__) || ( defined(__BORLANDC__) &&(__BORLANDC__ >= 1380) )void set_ch_reverb(int32 *buf, int32 count, int32 level){	int32 *dbuf = reverb_effect_buffer;	if(!level) {return;}	level = TIM_FSCALE(level / 127.0 * REV_INP_LEV, 24);	_asm {		mov		ecx, [count]		mov		esi, [buf]		mov		ebx, [level]		test	ecx, ecx		jz		short L2		mov		edi, [dbuf]L1:		mov		eax, [esi]		imul	ebx		shr		eax, 24		shl		edx, 8		or		eax, edx	/* u */		mov		edx, [edi]	/* v */		add		esi, 4		/* u */			add		edx, eax	/* v */		mov		[edi], edx	/* u */		add		edi, 4		/* v */		dec		ecx			/* u */		jnz		L1			/* v */L2:	}}#elsevoid set_ch_reverb(int32 *buf, int32 count, int32 level){    int32 i, *dbuf = reverb_effect_buffer;	if(!level) {return;}    level = TIM_FSCALE(level / 127.0 * REV_INP_LEV, 24);	for(i = count - 1; i >= 0; i--) {dbuf[i] += imuldiv24(buf[i], level);}}#endif	/* _MSC_VER */#elsevoid set_ch_reverb(register int32 *sbuffer, int32 n, int32 level){    register int32  i;	if(!level) {return;}    FLOAT_T send_level = (FLOAT_T)level / 127.0 * REV_INP_LEV;		for(i = 0; i < n; i++)    {        reverb_effect_buffer[i] += sbuffer[i] * send_level;    }}#endif /* OPT_MODE != 0 */static double gs_revchar_to_roomsize(int character){	double rs;	switch(character) {	case 0: rs = 1.0;	break;	/* Room 1 */	case 1: rs = 0.94;	break;	/* Room 2 */	case 2: rs = 0.97;	break;	/* Room 3 */	case 3: rs = 0.90;	break;	/* Hall 1 */	case 4: rs = 0.85;	break;	/* Hall 2 */	default: rs = 1.0;	break;	/* Plate, Delay, Panning Delay */	}	return rs;}static double gs_revchar_to_level(int character){	double level;	switch(character) {	case 0: level = 0.744025605;	break;	/* Room 1 */	case 1: level = 1.224309745;	break;	/* Room 2 */	case 2: level = 0.858592403;	break;	/* Room 3 */	case 3: level = 1.0471802;	break;	/* Hall 1 */	case 4: level = 1.0;	break;	/* Hall 2 */	case 5: level = 0.865335496;	break;	/* Plate */	default: level = 1.0;	break;	/* Delay, Panning Delay */	}	return level;}static double gs_revchar_to_rt(int character){	double rt;	switch(character) {	case 0: rt = 0.516850262;	break;	/* Room 1 */	case 1: rt = 1.004226004;	break;	/* Room 2 */	case 2: rt = 0.691046825;	break;	/* Room 3 */	case 3: rt = 0.893006004;	break;	/* Hall 1 */	case 4: rt = 1.0;	break;	/* Hall 2 */	case 5: rt = 0.538476488;	break;	/* Plate */	default: rt = 1.0;	break;	/* Delay, Panning Delay */	}	return rt;}static void init_standard_reverb(InfoStandardReverb *info){	double time;	info->ta = info->tb = 0;	info->HPFL = info->HPFR = info->LPFL = info->LPFR = info->EPFL = info->EPFR = 0;	info->spt0 = info->spt1 = info->spt2 = info->spt3 = 0;	time = reverb_time_table[reverb_status_gs.time] * gs_revchar_to_rt(reverb_status_gs.character) 		/ reverb_time_table[64] * 0.8;	info->rpt0 = REV_VAL0 * play_mode->rate / 1000.0f * time;	info->rpt1 = REV_VAL1 * play_mode->rate / 1000.0f * time;	info->rpt2 = REV_VAL2 * play_mode->rate / 1000.0f * time;	info->rpt3 = REV_VAL3 * play_mode->rate / 1000.0f * time;	while (!isprime(info->rpt0)) {info->rpt0++;}	while (!isprime(info->rpt1)) {info->rpt1++;}	while (!isprime(info->rpt2)) {info->rpt2++;}	while (!isprime(info->rpt3)) {info->rpt3++;}	set_delay(&(info->buf0_L), info->rpt0 + 1);	set_delay(&(info->buf0_R), info->rpt0 + 1);	set_delay(&(info->buf1_L), info->rpt1 + 1);	set_delay(&(info->buf1_R), info->rpt1 + 1);	set_delay(&(info->buf2_L), info->rpt2 + 1);	set_delay(&(info->buf2_R), info->rpt2 + 1);	set_delay(&(info->buf3_L), info->rpt3 + 1);	set_delay(&(info->buf3_R), info->rpt3 + 1);	info->fbklev = 0.12f;	info->nmixlev = 0.7f;	info->cmixlev = 0.9f;	info->monolev = 0.7f;	info->hpflev = 0.5f;	info->lpflev = 0.45f;	info->lpfinp = 0.55f;	info->epflev = 0.4f;	info->epfinp = 0.48f;	info->width = 0.125f;	info->wet = 2.0f * (double)reverb_status_gs.level / 127.0f * gs_revchar_to_level(reverb_status_gs.character);	info->fbklevi = TIM_FSCALE(info->fbklev, 24);	info->nmixlevi = TIM_FSCALE(info->nmixlev, 24);	info->cmixlevi = TIM_FSCALE(info->cmixlev, 24);	info->monolevi = TIM_FSCALE(info->monolev, 24);	info->hpflevi = TIM_FSCALE(info->hpflev, 24);	info->lpflevi = TIM_FSCALE(info->lpflev, 24);	info->lpfinpi = TIM_FSCALE(info->lpfinp, 24);	info->epflevi = TIM_FSCALE(info->epflev, 24);	info->epfinpi = TIM_FSCALE(info->epfinp, 24);	info->widthi = TIM_FSCALE(info->width, 24);	info->weti = TIM_FSCALE(info->wet, 24);}static void free_standard_reverb(InfoStandardReverb *info){	free_delay(&(info->buf0_L));	free_delay(&(info->buf0_R));	free_delay(&(info->buf1_L));	free_delay(&(info->buf1_R));	free_delay(&(info->buf2_L));	free_delay(&(info->buf2_R));	free_delay(&(info->buf3_L));	free_delay(&(info->buf3_R));}/*! Standard Reverberator; this implementation is specialized for system effect. */#if OPT_MODE != 0 /* fixed-point implementation */static void do_ch_standard_reverb(int32 *buf, int32 count, InfoStandardReverb *info){	int32 i, fixp, s, t;	int32 spt0 = info->spt0, spt1 = info->spt1, spt2 = info->spt2, spt3 = info->spt3,		ta = info->ta, tb = info->tb, HPFL = info->HPFL, HPFR = info->HPFR,		LPFL = info->LPFL, LPFR = info->LPFR, EPFL = info->EPFL, EPFR = info->EPFR;	int32 *buf0_L = info->buf0_L.buf, *buf0_R = info->buf0_R.buf,		*buf1_L = info->buf1_L.buf, *buf1_R = info->buf1_R.buf,		*buf2_L = info->buf2_L.buf, *buf2_R = info->buf2_R.buf,		*buf3_L = info->buf3_L.buf, *buf3_R = info->buf3_R.buf;	int32 fbklevi = info->fbklevi, cmixlevi = info->cmixlevi,		hpflevi = info->hpflevi, lpflevi = info->lpflevi, lpfinpi = info->lpfinpi,		epflevi = info->epflevi, epfinpi = info->epfinpi, widthi = info->widthi,		rpt0 = info->rpt0, rpt1 = info->rpt1, rpt2 = info->rpt2, rpt3 = info->rpt3, weti = info->weti;	if(count == MAGIC_INIT_EFFECT_INFO) {		init_standard_reverb(info);		return;	} else if(count == MAGIC_FREE_EFFECT_INFO) {		free_standard_reverb(info);		return;	}	for (i = 0; i < count; i++)	{        /* L */        fixp = reverb_effect_buffer[i];        LPFL = imuldiv24(LPFL, lpflevi) + imuldiv24(buf2_L[spt2] + tb, lpfinpi) + imuldiv24(ta, widthi);        ta = buf3_L[spt3];        s  = buf3_L[spt3] = buf0_L[spt0];        buf0_L[spt0] = -LPFL;        t = imuldiv24(HPFL + fixp, hpflevi);        HPFL = t - fixp;        buf2_L[spt2] = imuldiv24(s - imuldiv24(fixp, fbklevi), cmixlevi);        tb = buf1_L[spt1];        buf1_L[spt1] = t;        EPFL = imuldiv24(EPFL, epflevi) + imuldiv24(ta, epfinpi);        buf[i] += imuldiv24(ta + EPFL, weti);        /* R */        fixp = reverb_effect_buffer[++i];        LPFR = imuldiv24(LPFR, lpflevi) + imuldiv24(buf2_R[spt2] + tb, lpfinpi) + imuldiv24(ta, widthi);        ta = buf3_R[spt3];        s  = buf3_R[spt3] = buf0_R[spt0];        buf0_R[spt0] = LPFR;        t = imuldiv24(HPFR + fixp, hpflevi);        HPFR = t - fixp;        buf2_R[spt2] = imuldiv24(s - imuldiv24(fixp, fbklevi), cmixlevi);        tb = buf1_R[spt1];        buf1_R[spt1] = t;        EPFR = imuldiv24(EPFR, epflevi) + imuldiv24(ta, epfinpi);        buf[i] += imuldiv24(ta + EPFR, weti);		if (++spt0 == rpt0) {spt0 = 0;}		if (++spt1 == rpt1) {spt1 = 0;}		if (++spt2 == rpt2) {spt2 = 0;}		if (++spt3 == rpt3) {spt3 = 0;}	}	memset(reverb_effect_buffer, 0, sizeof(int32) * count);	info->spt0 = spt0, info->spt1 = spt1, info->spt2 = spt2, info->spt3 = spt3,	info->ta = ta, info->tb = tb, info->HPFL = HPFL, info->HPFR = HPFR,	info->LPFL = LPFL, info->LPFR = LPFR, info->EPFL = EPFL, info->EPFR = EPFR;}#else /* floating-point implementation */static void do_ch_standard_reverb(int32 *buf, int32 count, InfoStandardReverb *info){	int32 i, fixp, s, t;	int32 spt0 = info->spt0, spt1 = info->spt1, spt2 = info->spt2, spt3 = info->spt3,		ta = info->ta, tb = info->tb, HPFL = info->HPFL, HPFR = info->HPFR,		LPFL = info->LPFL, LPFR = info->LPFR, EPFL = info->EPFL, EPFR = info->EPFR;	int32 *buf0_L = info->buf0_L.buf, *buf0_R = info->buf0_R.buf,		*buf1_L = info->buf1_L.buf, *buf1_R = info->buf1_R.buf,		*buf2_L = info->buf2_L.buf, *buf2_R = info->buf2_R.buf,		*buf3_L = info->buf3_L.buf, *buf3_R = info->buf3_R.buf;	FLOAT_T fbklev = info->fbklev, cmixlev = info->cmixlev,		hpflev = info->hpflev, lpflev = info->lpflev, lpfinp = info->lpfinp,		epflev = info->epflev, epfinp = info->epfinp, width = info->width,		rpt0 = info->rpt0, rpt1 = info->rpt1, rpt2 = info->rpt2, rpt3 = info->rpt3, wet = info->wet;	if(count == MAGIC_INIT_EFFECT_INFO) {		init_standard_reverb(info);		return;	} else if(count == MAGIC_FREE_EFFECT_INFO) {		free_standard_reverb(info);		return;	}	for (i = 0; i < count; i++)	{        /* L */        fixp = reverb_effect_buffer[i];        LPFL = LPFL * lpflev + (buf2_L[spt2] + tb) * lpfinp + ta * width;        ta = buf3_L[spt3];        s  = buf3_L[spt3] = buf0_L[spt0];        buf0_L[spt0] = -LPFL;        t = (HPFL + fixp) * hpflev;        HPFL = t - fixp;        buf2_L[spt2] = (s - fixp * fbklev) * cmixlev;        tb = buf1_L[spt1];        buf1_L[spt1] = t;        EPFL = EPFL * epflev + ta * epfinp;        buf[i] += (ta + EPFL) * wet;        /* R */        fixp = reverb_effect_buffer[++i];        LPFR = LPFR * lpflev + (buf2_R[spt2] + tb) * lpfinp + ta * width;        ta = buf3_R[spt3];        s  = buf3_R[spt3] = buf0_R[spt0];        buf0_R[spt0] = LPFR;        t = (HPFR + fixp) * hpflev;        HPFR = t - fixp;        buf2_R[spt2] = (s - fixp * fbklev) * cmixlev;        tb = buf1_R[spt1];        buf1_R[spt1] = t;        EPFR = EPFR * epflev + ta * epfinp;        buf[i] += (ta + EPFR) * wet;		if (++spt0 == rpt0) {spt0 = 0;}		if (++spt1 == rpt1) {spt1 = 0;}		if (++spt2 == rpt2) {spt2 = 0;}		if (++spt3 == rpt3) {spt3 = 0;}	}	memset(reverb_effect_buffer, 0, sizeof(int32) * count);	info->spt0 = spt0, info->spt1 = spt1, info->spt2 = spt2, info->spt3 = spt3,	info->ta = ta, info->tb = tb, info->HPFL = HPFL, info->HPFR = HPFR,	info->LPFL = LPFL, info->LPFR = LPFR, info->EPFL = EPFL, info->EPFR = EPFR;}#endif /* OPT_MODE != 0 *//*! Standard Monoral Reverberator; this implementation is specialized for system effect. */static void do_ch_standard_reverb_mono(int32 *buf, int32 count, InfoStandardReverb *info){	int32 i, fixp, s, t;	int32 spt0 = info->spt0, spt1 = info->spt1, spt2 = info->spt2, spt3 = info->spt3,		ta = info->ta, tb = info->tb, HPFL = info->HPFL, HPFR = info->HPFR,		LPFL = info->LPFL, LPFR = info->LPFR, EPFL = info->EPFL, EPFR = info->EPFR;	int32 *buf0_L = info->buf0_L.buf, *buf0_R = info->buf0_R.buf,		*buf1_L = info->buf1_L.buf, *buf1_R = info->buf1_R.buf,		*buf2_L = info->buf2_L.buf, *buf2_R = info->buf2_R.buf,		*buf3_L = info->buf3_L.buf, *buf3_R = info->buf3_R.buf;	FLOAT_T fbklev = info->fbklev, nmixlev = info->nmixlev, monolev = info->monolev,		hpflev = info->hpflev, lpflev = info->lpflev, lpfinp = info->lpfinp,		epflev = info->epflev, epfinp = info->epfinp, width = info->width,		rpt0 = info->rpt0, rpt1 = info->rpt1, rpt2 = info->rpt2, rpt3 = info->rpt3, wet = info->wet;	if(count == MAGIC_INIT_EFFECT_INFO) {		init_standard_reverb(info);		return;	} else if(count == MAGIC_FREE_EFFECT_INFO) {		free_standard_reverb(info);		return;	}	for (i = 0; i < count; i++)	{        /* L */        fixp = buf[i] * monolev;        LPFL = LPFL * lpflev + (buf2_L[spt2] + tb) * lpfinp + ta * width;        ta = buf3_L[spt3];        s  = buf3_L[spt3] = buf0_L[spt0];        buf0_L[spt0] = -LPFL;        t = (HPFL + fixp) * hpflev;        HPFL = t - fixp;        buf2_L[spt2] = (s - fixp * fbklev) * nmixlev;        tb = buf1_L[spt1];        buf1_L[spt1] = t;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -