mirror of
https://github.com/ZDoom/fluidsynth.git
synced 2025-03-01 15:10:43 +00:00
correctly transform mod. source values from pitch bend
This commit is contained in:
parent
4b3590a326
commit
b7673c0e25
1 changed files with 32 additions and 17 deletions
|
@ -154,7 +154,9 @@ fluid_mod_get_amount(fluid_mod_t* mod)
|
|||
return (double) mod->amount;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* retrieves the initial value from the given source of the modulator
|
||||
*/
|
||||
static fluid_real_t
|
||||
fluid_mod_get_source_value(const unsigned char mod_src,
|
||||
const unsigned char mod_flags,
|
||||
|
@ -202,9 +204,18 @@ fluid_mod_get_source_value(const unsigned char mod_src,
|
|||
return val;
|
||||
}
|
||||
|
||||
/**
|
||||
* transforms the initial value retrieved by \c fluid_mod_get_source_value into [0.0;1.0]
|
||||
*/
|
||||
static fluid_real_t
|
||||
fluid_mod_transform_source_value(fluid_real_t val, unsigned char mod_flags, const fluid_real_t range)
|
||||
{
|
||||
/* normalized value, i.e. usually in the range [0;1]
|
||||
*
|
||||
* if val was retrieved from pitch_bend then [-0.5;0.5]
|
||||
*/
|
||||
const fluid_real_t val_norm = val / range;
|
||||
|
||||
/* we could also only switch case the lower nibble of mod_flags, however
|
||||
* this would keep us from adding further mod types in the future
|
||||
*
|
||||
|
@ -215,52 +226,56 @@ fluid_mod_transform_source_value(fluid_real_t val, unsigned char mod_flags, cons
|
|||
switch (mod_flags/* & 0x0f*/)
|
||||
{
|
||||
case FLUID_MOD_LINEAR | FLUID_MOD_UNIPOLAR | FLUID_MOD_POSITIVE: /* =0 */
|
||||
val /= range;
|
||||
val = val_norm;
|
||||
break;
|
||||
case FLUID_MOD_LINEAR | FLUID_MOD_UNIPOLAR | FLUID_MOD_NEGATIVE: /* =1 */
|
||||
val = 1.0f - val / range;
|
||||
val = 1.0f - val_norm;
|
||||
break;
|
||||
case FLUID_MOD_LINEAR | FLUID_MOD_BIPOLAR | FLUID_MOD_POSITIVE: /* =2 */
|
||||
val = -1.0f + 2.0f * val / range;
|
||||
val = -1.0f + 2.0f * val_norm;
|
||||
break;
|
||||
case FLUID_MOD_LINEAR | FLUID_MOD_BIPOLAR | FLUID_MOD_NEGATIVE: /* =3 */
|
||||
val = 1.0f - 2.0f * val / range;
|
||||
val = 1.0f - 2.0f * val_norm;
|
||||
break;
|
||||
case FLUID_MOD_CONCAVE | FLUID_MOD_UNIPOLAR | FLUID_MOD_POSITIVE: /* =4 */
|
||||
val = fluid_concave(val);
|
||||
val = fluid_concave(127 * (val_norm));
|
||||
break;
|
||||
case FLUID_MOD_CONCAVE | FLUID_MOD_UNIPOLAR | FLUID_MOD_NEGATIVE: /* =5 */
|
||||
val = fluid_concave(127 - val);
|
||||
val = fluid_concave(127 * (1.0f - val_norm));
|
||||
break;
|
||||
case FLUID_MOD_CONCAVE | FLUID_MOD_BIPOLAR | FLUID_MOD_POSITIVE: /* =6 */
|
||||
val = (val > 64)? fluid_concave(2 * (val - 64)) : -fluid_concave(2 * (64 - val));
|
||||
val = (val_norm > 0.5f) ? fluid_concave(127 * 2 * (val_norm - 0.5f))
|
||||
: -fluid_concave(127 * 2 * (0.5f - val_norm));
|
||||
break;
|
||||
case FLUID_MOD_CONCAVE | FLUID_MOD_BIPOLAR | FLUID_MOD_NEGATIVE: /* =7 */
|
||||
val = (val > 64)? -fluid_concave(2 * (val - 64)) : fluid_concave(2 * (64 - val));
|
||||
val = (val_norm > 0.5f) ? -fluid_concave(127 * 2 * (val_norm - 0.5f))
|
||||
: fluid_concave(127 * 2 * (0.5f - val_norm));
|
||||
break;
|
||||
case FLUID_MOD_CONVEX | FLUID_MOD_UNIPOLAR | FLUID_MOD_POSITIVE: /* =8 */
|
||||
val = fluid_convex(val);
|
||||
val = fluid_convex(127 * (val_norm));
|
||||
break;
|
||||
case FLUID_MOD_CONVEX | FLUID_MOD_UNIPOLAR | FLUID_MOD_NEGATIVE: /* =9 */
|
||||
val = fluid_convex(127 - val);
|
||||
val = fluid_convex(127 * (1.0f - val_norm));
|
||||
break;
|
||||
case FLUID_MOD_CONVEX | FLUID_MOD_BIPOLAR | FLUID_MOD_POSITIVE: /* =10 */
|
||||
val = (val > 64)? fluid_convex(2 * (val - 64)) : -fluid_convex(2 * (64 - val));
|
||||
val = (val_norm > 0.5f) ? fluid_convex(127 * 2 * (val_norm - 0.5f))
|
||||
: -fluid_convex(127 * 2 * (0.5f - val_norm));
|
||||
break;
|
||||
case FLUID_MOD_CONVEX | FLUID_MOD_BIPOLAR | FLUID_MOD_NEGATIVE: /* =11 */
|
||||
val = (val > 64)? -fluid_convex(2 * (val - 64)) : fluid_convex(2 * (64 - val));
|
||||
val = (val_norm > 0.5f) ? -fluid_convex(127 * 2 * (val_norm - 0.5f))
|
||||
: fluid_convex(127 * 2 * (0.5f - val_norm));
|
||||
break;
|
||||
case FLUID_MOD_SWITCH | FLUID_MOD_UNIPOLAR | FLUID_MOD_POSITIVE: /* =12 */
|
||||
val = (val >= 64)? 1.0f : 0.0f;
|
||||
val = (val_norm >= 0.5f)? 1.0f : 0.0f;
|
||||
break;
|
||||
case FLUID_MOD_SWITCH | FLUID_MOD_UNIPOLAR | FLUID_MOD_NEGATIVE: /* =13 */
|
||||
val = (val >= 64)? 0.0f : 1.0f;
|
||||
val = (val_norm >= 0.5f)? 0.0f : 1.0f;
|
||||
break;
|
||||
case FLUID_MOD_SWITCH | FLUID_MOD_BIPOLAR | FLUID_MOD_POSITIVE: /* =14 */
|
||||
val = (val >= 64)? 1.0f : -1.0f;
|
||||
val = (val_norm >= 0.5f)? 1.0f : -1.0f;
|
||||
break;
|
||||
case FLUID_MOD_SWITCH | FLUID_MOD_BIPOLAR | FLUID_MOD_NEGATIVE: /* =15 */
|
||||
val = (val >= 64)? -1.0f : 1.0f;
|
||||
val = (val_norm >= 0.5f)? -1.0f : 1.0f;
|
||||
break;
|
||||
default:
|
||||
FLUID_LOG(FLUID_ERR, "Unknown modulator type %d, disabling modulator.", mod_flags);
|
||||
|
|
Loading…
Reference in a new issue