mirror of
https://github.com/ZDoom/fluidsynth.git
synced 2025-02-18 18:11:05 +00:00
Merge branch '2.2.x' into master
This commit is contained in:
commit
5dcae73657
4 changed files with 17 additions and 11 deletions
|
@ -37,7 +37,7 @@ struct _fluid_env_data_t
|
|||
};
|
||||
|
||||
/* Indices for envelope tables */
|
||||
enum fluid_voice_envelope_index_t
|
||||
enum fluid_voice_envelope_index
|
||||
{
|
||||
FLUID_VOICE_ENVDELAY,
|
||||
FLUID_VOICE_ENVATTACK,
|
||||
|
@ -49,7 +49,7 @@ enum fluid_voice_envelope_index_t
|
|||
FLUID_VOICE_ENVLAST
|
||||
};
|
||||
|
||||
typedef enum fluid_voice_envelope_index_t fluid_adsr_env_section_t;
|
||||
typedef enum fluid_voice_envelope_index fluid_adsr_env_section_t;
|
||||
|
||||
typedef struct _fluid_adsr_env_t fluid_adsr_env_t;
|
||||
|
||||
|
@ -57,14 +57,14 @@ struct _fluid_adsr_env_t
|
|||
{
|
||||
fluid_env_data_t data[FLUID_VOICE_ENVLAST];
|
||||
unsigned int count;
|
||||
int section;
|
||||
fluid_real_t val; /* the current value of the envelope */
|
||||
fluid_adsr_env_section_t section;
|
||||
};
|
||||
|
||||
/* For performance, all functions are inlined */
|
||||
|
||||
static FLUID_INLINE void
|
||||
fluid_adsr_env_calc(fluid_adsr_env_t *env, int is_volenv)
|
||||
fluid_adsr_env_calc(fluid_adsr_env_t *env)
|
||||
{
|
||||
fluid_env_data_t *env_data;
|
||||
fluid_real_t x;
|
||||
|
@ -76,7 +76,8 @@ fluid_adsr_env_calc(fluid_adsr_env_t *env, int is_volenv)
|
|||
{
|
||||
// If we're switching envelope stages from decay to sustain, force the value to be the end value of the previous stage
|
||||
// Hmm, should this only apply to volenv? It was so before refactoring, so keep it for now. [DH]
|
||||
if(env->section == FLUID_VOICE_ENVDECAY && is_volenv)
|
||||
// No, must apply to both, otherwise some voices may sound detuned. [TM] (https://github.com/FluidSynth/fluidsynth/issues/1059)
|
||||
if(env->section == FLUID_VOICE_ENVDECAY)
|
||||
{
|
||||
env->val = env_data->min * env_data->coeff;
|
||||
}
|
||||
|
@ -106,8 +107,6 @@ fluid_adsr_env_calc(fluid_adsr_env_t *env, int is_volenv)
|
|||
}
|
||||
|
||||
env->val = x;
|
||||
|
||||
|
||||
}
|
||||
|
||||
/* This one cannot be inlined since it is referenced in
|
||||
|
@ -118,7 +117,7 @@ static FLUID_INLINE void
|
|||
fluid_adsr_env_reset(fluid_adsr_env_t *env)
|
||||
{
|
||||
env->count = 0;
|
||||
env->section = 0;
|
||||
env->section = FLUID_VOICE_ENVDELAY;
|
||||
env->val = 0.0f;
|
||||
}
|
||||
|
||||
|
|
|
@ -331,7 +331,7 @@ fluid_rvoice_write(fluid_rvoice_t *voice, fluid_real_t *dsp_buf)
|
|||
|
||||
/******************* vol env **********************/
|
||||
|
||||
fluid_adsr_env_calc(&voice->envlfo.volenv, 1);
|
||||
fluid_adsr_env_calc(&voice->envlfo.volenv);
|
||||
fluid_check_fpe("voice_write vol env");
|
||||
|
||||
if(fluid_adsr_env_get_section(&voice->envlfo.volenv) == FLUID_VOICE_ENVFINISHED)
|
||||
|
@ -341,7 +341,7 @@ fluid_rvoice_write(fluid_rvoice_t *voice, fluid_real_t *dsp_buf)
|
|||
|
||||
/******************* mod env **********************/
|
||||
|
||||
fluid_adsr_env_calc(&voice->envlfo.modenv, 0);
|
||||
fluid_adsr_env_calc(&voice->envlfo.modenv);
|
||||
fluid_check_fpe("voice_write mod env");
|
||||
|
||||
/******************* lfo **********************/
|
||||
|
|
|
@ -1557,6 +1557,10 @@ fluid_synth_remove_default_mod(fluid_synth_t *synth, const fluid_mod_t *mod)
|
|||
|
||||
/**
|
||||
* Send a MIDI controller event on a MIDI channel.
|
||||
*
|
||||
* Most CCs are 7-bits wide in FluidSynth. There are a few exceptions which may be 14-bits wide as are documented here:
|
||||
* https://github.com/FluidSynth/fluidsynth/wiki/FluidFeatures#midi-control-change-implementation-chart
|
||||
*
|
||||
* @param synth FluidSynth instance
|
||||
* @param chan MIDI channel number (0 to MIDI channel count - 1)
|
||||
* @param num MIDI controller number (0-127)
|
||||
|
@ -1571,6 +1575,8 @@ fluid_synth_remove_default_mod(fluid_synth_t *synth, const fluid_mod_t *mod)
|
|||
* could be used as CC global for all channels belonging to basic channel 7.
|
||||
* - Let a basic channel 0 in mode 3. If MIDI channel 15 is disabled it could be used
|
||||
* as CC global for all channels belonging to basic channel 0.
|
||||
* @warning Contrary to the MIDI Standard, this function does not clear LSB controllers,
|
||||
* when MSB controllers are received.
|
||||
*/
|
||||
int
|
||||
fluid_synth_cc(fluid_synth_t *synth, int chan, int num, int val)
|
||||
|
|
|
@ -1110,8 +1110,9 @@ fluid_voice_update_param(fluid_voice_t *voice, int gen)
|
|||
/* Modulation envelope */
|
||||
case GEN_MODENVDELAY: /* SF2.01 section 8.1.3 # 25 */
|
||||
fluid_clip(x, -12000.0f, 5000.0f);
|
||||
count = NUM_BUFFERS_DELAY(x);
|
||||
fluid_voice_update_modenv(voice, TRUE, FLUID_VOICE_ENVDELAY,
|
||||
NUM_BUFFERS_DELAY(x), 0.0f, 0.0f, -1.0f, 1.0f);
|
||||
count, 0.0f, 0.0f, -1.0f, 1.0f);
|
||||
break;
|
||||
|
||||
case GEN_MODENVATTACK: /* SF2.01 section 8.1.3 # 26 */
|
||||
|
|
Loading…
Reference in a new issue