Beispiel #1
0
void 
fluid_rvoice_noteoff(fluid_rvoice_t* voice, unsigned int min_ticks)
{
  if (min_ticks > voice->envlfo.ticks) {
    /* Delay noteoff */
    voice->envlfo.noteoff_ticks = min_ticks;
    return;
  }
  voice->envlfo.noteoff_ticks = 0;

  if (fluid_adsr_env_get_section(&voice->envlfo.volenv) == FLUID_VOICE_ENVATTACK) {
    /* A voice is turned off during the attack section of the volume
     * envelope.  The attack section ramps up linearly with
     * amplitude. The other sections use logarithmic scaling. Calculate new
     * volenv_val to achieve equievalent amplitude during the release phase
     * for seamless volume transition.
     */
    if (fluid_adsr_env_get_val(&voice->envlfo.volenv) > 0){
      fluid_real_t lfo = fluid_lfo_get_val(&voice->envlfo.modlfo) * -voice->envlfo.modlfo_to_vol;
      fluid_real_t amp = fluid_adsr_env_get_val(&voice->envlfo.volenv) * pow (10.0, lfo / -200);
      fluid_real_t env_value = - ((-200 * log (amp) / log (10.0) - lfo) / 960.0 - 1);
      fluid_clip (env_value, 0.0, 1.0);
      fluid_adsr_env_set_val(&voice->envlfo.volenv, env_value);
    }
  }
  fluid_adsr_env_set_section(&voice->envlfo.volenv, FLUID_VOICE_ENVRELEASE);
  fluid_adsr_env_set_section(&voice->envlfo.modenv, FLUID_VOICE_ENVRELEASE);
}
Beispiel #2
0
void 
fluid_rvoice_voiceoff(fluid_rvoice_t* voice)
{
  fluid_adsr_env_set_section(&voice->envlfo.volenv, FLUID_VOICE_ENVFINISHED);
  fluid_adsr_env_set_section(&voice->envlfo.modenv, FLUID_VOICE_ENVFINISHED);
  if (voice->dsp.sample) {
    fluid_sample_decr_ref(voice->dsp.sample);
    voice->dsp.sample = NULL;
  }
}
void 
fluid_rvoice_voiceoff(fluid_rvoice_t* voice)
{
  fluid_adsr_env_set_section(&voice->envlfo.volenv, FLUID_VOICE_ENVFINISHED);
  fluid_adsr_env_set_section(&voice->envlfo.modenv, FLUID_VOICE_ENVFINISHED);
}