📄 reverb.c
字号:
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 + -