summaryrefslogtreecommitdiff
path: root/libs/fluidsynth/src/fluid_rev.c
diff options
context:
space:
mode:
Diffstat (limited to 'libs/fluidsynth/src/fluid_rev.c')
-rw-r--r--libs/fluidsynth/src/fluid_rev.c62
1 files changed, 35 insertions, 27 deletions
diff --git a/libs/fluidsynth/src/fluid_rev.c b/libs/fluidsynth/src/fluid_rev.c
index 9acee96150..014562e807 100644
--- a/libs/fluidsynth/src/fluid_rev.c
+++ b/libs/fluidsynth/src/fluid_rev.c
@@ -193,9 +193,9 @@
#define DENORMALISING
#ifdef DENORMALISING
-#define DC_OFFSET 1e-8
+#define DC_OFFSET 1e-8f
#else
-#define DC_OFFSET 0.0
+#define DC_OFFSET 0.0f
#endif
/*----------------------------------------------------------------------------
@@ -272,7 +272,7 @@ a flatter response on comb filter. So the input gain is set to 0.1 rather 1.0. *
#define INTERP_SAMPLES_NBR 1
/* phase offset between modulators waveform */
-#define MOD_PHASE (360.0/(float) NBR_DELAYS)
+#define MOD_PHASE (360.0f/(float) NBR_DELAYS)
#if (NBR_DELAYS == 8)
#define DELAY_L0 601
@@ -431,12 +431,16 @@ typedef struct
static void set_mod_frequency(sinus_modulator *mod,
float freq, float sample_rate, float phase)
{
- fluid_real_t w = 2 * M_PI * freq / sample_rate; /* intial angle */
+ fluid_real_t w = 2 * FLUID_M_PI * freq / sample_rate; /* intial angle */
+ fluid_real_t a;
- mod->a1 = 2 * cos(w);
- mod->buffer2 = sin(2 * M_PI * phase / 360 - w); /* y(n-1) = sin(-intial angle) */
- mod->buffer1 = sin(2 * M_PI * phase / 360); /* y(n) = sin(initial phase) */
- mod->reset_buffer2 = sin(M_PI / 2.0 - w); /* reset value for PI/2 */
+ mod->a1 = 2 * FLUID_COS(w);
+
+ a = (2 * FLUID_M_PI / 360) * phase;
+
+ mod->buffer2 = FLUID_SIN(a - w); /* y(n-1) = sin(-intial angle) */
+ mod->buffer1 = FLUID_SIN(a); /* y(n) = sin(initial phase) */
+ mod->reset_buffer2 = FLUID_SIN(FLUID_M_PI / 2 - w); /* reset value for PI/2 */
}
/*-----------------------------------------------------------------------------
@@ -453,15 +457,15 @@ static FLUID_INLINE fluid_real_t get_mod_sinus(sinus_modulator *mod)
out = mod->a1 * mod->buffer1 - mod->buffer2;
mod->buffer2 = mod->buffer1;
- if(out >= 1.0) /* reset in case of instability near PI/2 */
+ if(out >= 1.0f) /* reset in case of instability near PI/2 */
{
- out = 1.0; /* forces output to the right value */
+ out = 1.0f; /* forces output to the right value */
mod->buffer2 = mod->reset_buffer2;
}
- if(out <= -1.0) /* reset in case of instability near -PI/2 */
+ if(out <= -1.0f) /* reset in case of instability near -PI/2 */
{
- out = -1.0; /* forces output to the right value */
+ out = -1.0f; /* forces output to the right value */
mod->buffer2 = - mod->reset_buffer2;
}
@@ -736,7 +740,7 @@ static void update_rev_time_damping(fluid_late *late,
fluid_real_t sample_period = 1 / late->samplerate; /* Sampling period */
fluid_real_t dc_rev_time; /* Reverb time at 0 Hz (in seconds) */
- fluid_real_t alpha;
+ fluid_real_t alpha, alpha2;
/*--------------------------------------------
Computes dc_rev_time and alpha
@@ -753,8 +757,8 @@ static void update_rev_time_damping(fluid_late *late,
------------------------------------------*/
dc_rev_time = GET_DC_REV_TIME(roomsize);
/* computes gi_tmp from dc_rev_time using relation E2 */
- gi_tmp = (fluid_real_t) pow(10, -3 * delay_length[NBR_DELAYS - 1] *
- sample_period / dc_rev_time); /* E2 */
+ gi_tmp = FLUID_POW(10, -3 * delay_length[NBR_DELAYS - 1] *
+ sample_period / dc_rev_time); /* E2 */
#else
/* roomsize parameters have the same response that Freeverb, that is:
* - roomsize (0 to 1) controls concave reverb time (0.7 to 10 s).
@@ -766,14 +770,14 @@ static void update_rev_time_damping(fluid_late *late,
fluid_real_t gi_min, gi_max;
/* values gi_min et gi_max are computed using E2 for the line with
maximum delay */
- gi_max = (fluid_real_t)pow(10, -3 * delay_length[NBR_DELAYS - 1] *
- sample_period / MAX_DC_REV_TIME); /* E2 */
- gi_min = (fluid_real_t)pow(10, -3 * delay_length[NBR_DELAYS - 1] *
- sample_period / MIN_DC_REV_TIME); /* E2 */
+ gi_max = FLUID_POW(10, (-3 * delay_length[NBR_DELAYS - 1] / MAX_DC_REV_TIME) *
+ sample_period); /* E2 */
+ gi_min = FLUID_POW(10, (-3 * delay_length[NBR_DELAYS - 1] / MIN_DC_REV_TIME) *
+ sample_period); /* E2 */
/* gi = f(roomsize, gi_max, gi_min) */
gi_tmp = gi_min + roomsize * (gi_max - gi_min);
/* Computes T60DC from gi using inverse of relation E2.*/
- dc_rev_time = -3 * delay_length[NBR_DELAYS - 1] * sample_period / log10(gi_tmp);
+ dc_rev_time = -3 * FLUID_M_LN10 * delay_length[NBR_DELAYS - 1] * sample_period / FLUID_LOGF(gi_tmp);
}
#endif /* ROOMSIZE_RESPONSE_LINEAR */
/*--------------------------------------------
@@ -781,8 +785,12 @@ static void update_rev_time_damping(fluid_late *late,
----------------------------------------------*/
/* Computes alpha from damp,ai_tmp,gi_tmp using relation R */
/* - damp (0 to 1) controls concave reverb time for fs/2 frequency (T60DC to 0) */
- ai_tmp = 1.0 * damp;
- alpha = sqrt(1 / (1 - ai_tmp / (20 * log10(gi_tmp) * log(10) / 80))); /* R */
+ ai_tmp = 1.0f * damp;
+
+ /* Preserve the square of R */
+ alpha2 = 1.f / (1.f - ai_tmp / ((20.f / 80.f) * FLUID_LOGF(gi_tmp)));
+
+ alpha = FLUID_SQRT(alpha2); /* R */
}
/* updates tone corrector coefficients b1,b2 from alpha */
@@ -802,15 +810,15 @@ static void update_rev_time_damping(fluid_late *late,
for(i = 0; i < NBR_DELAYS; i++)
{
/* iir low pass filter gain */
- fluid_real_t gi = (fluid_real_t)pow(10, -3 * delay_length[i] *
- sample_period / dc_rev_time);
+ fluid_real_t gi = FLUID_POW(10, -3 * delay_length[i] *
+ sample_period / dc_rev_time);
/* iir low pass filter feedback gain */
- fluid_real_t ai = (fluid_real_t)(20 * log10(gi) * log(10) / 80 *
- (1 - 1 / pow(alpha, 2)));
+ fluid_real_t ai = (20.f / 80.f) * FLUID_LOGF(gi) * (1.f - 1.f / alpha2);
+
/* b0 = gi * (1 - ai), a1 = - ai */
set_fdn_delay_lpf(&late->mod_delay_lines[i].dl.damping,
- gi * (1 - ai), -ai);
+ gi * (1.f - ai), -ai);
}
}