mirror of
https://github.com/ZDoom/fluidsynth.git
synced 2025-02-25 13:21:19 +00:00
Merge pull request #205 from FluidSynth/def-mod-api
API to manipulate default modulators
This commit is contained in:
commit
0902b261cc
3 changed files with 98 additions and 10 deletions
|
@ -275,6 +275,19 @@ FLUIDSYNTH_API double fluid_synth_get_cpu_load(fluid_synth_t* synth);
|
||||||
FLUIDSYNTH_API char* fluid_synth_error(fluid_synth_t* synth);
|
FLUIDSYNTH_API char* fluid_synth_error(fluid_synth_t* synth);
|
||||||
|
|
||||||
|
|
||||||
|
/* Default modulators */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enum used with fluid_synth_add_default_mod() to specify how to handle duplicate modulators.
|
||||||
|
*/
|
||||||
|
enum fluid_synth_add_mod {
|
||||||
|
FLUID_SYNTH_OVERWRITE, /**< Overwrite any existing matching modulator */
|
||||||
|
FLUID_SYNTH_ADD, /**< Add (sum) modulator amounts */
|
||||||
|
};
|
||||||
|
|
||||||
|
FLUIDSYNTH_API int fluid_synth_add_default_mod(fluid_synth_t* synth, fluid_mod_t* mod, int mode);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Synthesizer plugin
|
* Synthesizer plugin
|
||||||
*
|
*
|
||||||
|
|
|
@ -692,6 +692,21 @@ new_fluid_synth(fluid_settings_t *settings)
|
||||||
if (synth->eventhandler == NULL)
|
if (synth->eventhandler == NULL)
|
||||||
goto error_recovery;
|
goto error_recovery;
|
||||||
|
|
||||||
|
/* Setup the list of default modulators.
|
||||||
|
* Needs to happen after eventhandler has been set up, as fluid_synth_enter_api is called in the process */
|
||||||
|
synth->default_mod = NULL;
|
||||||
|
fluid_synth_add_default_mod(synth, &default_vel2att_mod, FLUID_SYNTH_ADD);
|
||||||
|
fluid_synth_add_default_mod(synth, &default_vel2filter_mod, FLUID_SYNTH_ADD);
|
||||||
|
fluid_synth_add_default_mod(synth, &default_at2viblfo_mod, FLUID_SYNTH_ADD);
|
||||||
|
fluid_synth_add_default_mod(synth, &default_mod2viblfo_mod, FLUID_SYNTH_ADD);
|
||||||
|
fluid_synth_add_default_mod(synth, &default_att_mod, FLUID_SYNTH_ADD);
|
||||||
|
fluid_synth_add_default_mod(synth, &default_pan_mod, FLUID_SYNTH_ADD);
|
||||||
|
fluid_synth_add_default_mod(synth, &default_expr_mod, FLUID_SYNTH_ADD);
|
||||||
|
fluid_synth_add_default_mod(synth, &default_reverb_mod, FLUID_SYNTH_ADD);
|
||||||
|
fluid_synth_add_default_mod(synth, &default_chorus_mod, FLUID_SYNTH_ADD);
|
||||||
|
fluid_synth_add_default_mod(synth, &default_pitch_bend_mod, FLUID_SYNTH_ADD);
|
||||||
|
|
||||||
|
|
||||||
#ifdef LADSPA
|
#ifdef LADSPA
|
||||||
/* Create and initialize the Fx unit.*/
|
/* Create and initialize the Fx unit.*/
|
||||||
fluid_settings_getint(settings, "synth.ladspa.active", &with_ladspa);
|
fluid_settings_getint(settings, "synth.ladspa.active", &with_ladspa);
|
||||||
|
@ -811,6 +826,8 @@ delete_fluid_synth(fluid_synth_t* synth)
|
||||||
fluid_list_t *list;
|
fluid_list_t *list;
|
||||||
fluid_sfont_info_t* sfont_info;
|
fluid_sfont_info_t* sfont_info;
|
||||||
fluid_sfloader_t* loader;
|
fluid_sfloader_t* loader;
|
||||||
|
fluid_mod_t* default_mod;
|
||||||
|
fluid_mod_t* mod;
|
||||||
|
|
||||||
if (synth == NULL) {
|
if (synth == NULL) {
|
||||||
return FLUID_OK;
|
return FLUID_OK;
|
||||||
|
@ -918,6 +935,14 @@ delete_fluid_synth(fluid_synth_t* synth)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* delete all default modulators */
|
||||||
|
default_mod = synth->default_mod;
|
||||||
|
while (default_mod != NULL) {
|
||||||
|
mod = default_mod;
|
||||||
|
default_mod = mod->next;
|
||||||
|
fluid_mod_delete(mod);
|
||||||
|
}
|
||||||
|
|
||||||
fluid_rec_mutex_destroy(synth->mutex);
|
fluid_rec_mutex_destroy(synth->mutex);
|
||||||
|
|
||||||
FLUID_FREE(synth);
|
FLUID_FREE(synth);
|
||||||
|
@ -1079,6 +1104,58 @@ fluid_synth_damp_voices_by_sostenuto_LOCAL(fluid_synth_t* synth, int chan)
|
||||||
return FLUID_OK;
|
return FLUID_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds the specified modulator \c mod as default modulator to the synth. If \c mod is new it
|
||||||
|
* will be used by any subsequently created voice. If an amount of an existing modulator is
|
||||||
|
* changed by \c mod it will take effect for any subsequently created voice.
|
||||||
|
* @param synth FluidSynth instance
|
||||||
|
* @param mod Modulator info (values copied, passed in object can be freed again immediately)
|
||||||
|
* @param mode Determines how to handle an existing identical modulator (#fluid_synth_add_mod)
|
||||||
|
* @return FLUID_OK on success, FLUID_FAILED otherwise
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
fluid_synth_add_default_mod(fluid_synth_t* synth, fluid_mod_t* mod, int mode)
|
||||||
|
{
|
||||||
|
fluid_mod_t* default_mod;
|
||||||
|
fluid_mod_t* last_mod = NULL;
|
||||||
|
fluid_mod_t* new_mod;
|
||||||
|
|
||||||
|
fluid_return_val_if_fail (synth != NULL, FLUID_FAILED);
|
||||||
|
fluid_return_val_if_fail (mod != NULL, FLUID_FAILED);
|
||||||
|
fluid_synth_api_enter(synth);
|
||||||
|
|
||||||
|
default_mod = synth->default_mod;
|
||||||
|
|
||||||
|
while (default_mod != NULL) {
|
||||||
|
if (fluid_mod_test_identity(default_mod, mod)) {
|
||||||
|
if (mode == FLUID_SYNTH_ADD)
|
||||||
|
default_mod->amount += mod->amount;
|
||||||
|
else if (mode == FLUID_SYNTH_OVERWRITE)
|
||||||
|
default_mod->amount = mod->amount;
|
||||||
|
else
|
||||||
|
FLUID_API_RETURN(FLUID_FAILED);
|
||||||
|
FLUID_API_RETURN(FLUID_OK);
|
||||||
|
}
|
||||||
|
last_mod = default_mod;
|
||||||
|
default_mod = default_mod->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add a new modulator (no existing modulator to add / overwrite). */
|
||||||
|
new_mod = fluid_mod_new();
|
||||||
|
if (new_mod == NULL)
|
||||||
|
FLUID_API_RETURN(FLUID_FAILED);
|
||||||
|
|
||||||
|
fluid_mod_clone(new_mod, mod);
|
||||||
|
new_mod->next = NULL;
|
||||||
|
|
||||||
|
if (last_mod == NULL)
|
||||||
|
synth->default_mod = new_mod;
|
||||||
|
else
|
||||||
|
last_mod->next = new_mod;
|
||||||
|
|
||||||
|
FLUID_API_RETURN(FLUID_OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send a MIDI controller event on a MIDI channel.
|
* Send a MIDI controller event on a MIDI channel.
|
||||||
|
@ -3142,6 +3219,7 @@ fluid_synth_alloc_voice(fluid_synth_t* synth, fluid_sample_t* sample, int chan,
|
||||||
int i, k;
|
int i, k;
|
||||||
fluid_voice_t* voice = NULL;
|
fluid_voice_t* voice = NULL;
|
||||||
fluid_channel_t* channel = NULL;
|
fluid_channel_t* channel = NULL;
|
||||||
|
fluid_mod_t* default_mod;
|
||||||
unsigned int ticks;
|
unsigned int ticks;
|
||||||
|
|
||||||
fluid_return_val_if_fail (sample != NULL, NULL);
|
fluid_return_val_if_fail (sample != NULL, NULL);
|
||||||
|
@ -3194,16 +3272,11 @@ fluid_synth_alloc_voice(fluid_synth_t* synth, fluid_sample_t* sample, int chan,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* add the default modulators to the synthesis process. */
|
/* add the default modulators to the synthesis process. */
|
||||||
fluid_voice_add_mod(voice, &default_vel2att_mod, FLUID_VOICE_DEFAULT); /* SF2.01 $8.4.1 */
|
default_mod = synth->default_mod;
|
||||||
fluid_voice_add_mod(voice, &default_vel2filter_mod, FLUID_VOICE_DEFAULT); /* SF2.01 $8.4.2 */
|
while (default_mod != NULL) {
|
||||||
fluid_voice_add_mod(voice, &default_at2viblfo_mod, FLUID_VOICE_DEFAULT); /* SF2.01 $8.4.3 */
|
fluid_voice_add_mod(voice, default_mod, FLUID_VOICE_DEFAULT);
|
||||||
fluid_voice_add_mod(voice, &default_mod2viblfo_mod, FLUID_VOICE_DEFAULT); /* SF2.01 $8.4.4 */
|
default_mod = default_mod->next;
|
||||||
fluid_voice_add_mod(voice, &default_att_mod, FLUID_VOICE_DEFAULT); /* SF2.01 $8.4.5 */
|
}
|
||||||
fluid_voice_add_mod(voice, &default_pan_mod, FLUID_VOICE_DEFAULT); /* SF2.01 $8.4.6 */
|
|
||||||
fluid_voice_add_mod(voice, &default_expr_mod, FLUID_VOICE_DEFAULT); /* SF2.01 $8.4.7 */
|
|
||||||
fluid_voice_add_mod(voice, &default_reverb_mod, FLUID_VOICE_DEFAULT); /* SF2.01 $8.4.8 */
|
|
||||||
fluid_voice_add_mod(voice, &default_chorus_mod, FLUID_VOICE_DEFAULT); /* SF2.01 $8.4.9 */
|
|
||||||
fluid_voice_add_mod(voice, &default_pitch_bend_mod, FLUID_VOICE_DEFAULT); /* SF2.01 $8.4.10 */
|
|
||||||
|
|
||||||
FLUID_API_RETURN(voice);
|
FLUID_API_RETURN(voice);
|
||||||
}
|
}
|
||||||
|
|
|
@ -167,6 +167,8 @@ struct _fluid_synth_t
|
||||||
|
|
||||||
int cores; /**< Number of CPU cores (1 by default) */
|
int cores; /**< Number of CPU cores (1 by default) */
|
||||||
|
|
||||||
|
fluid_mod_t* default_mod; /**< the (dynamic) list of default modulators */
|
||||||
|
|
||||||
#ifdef LADSPA
|
#ifdef LADSPA
|
||||||
fluid_LADSPA_FxUnit_t* LADSPA_FxUnit; /**< Effects unit for LADSPA support */
|
fluid_LADSPA_FxUnit_t* LADSPA_FxUnit; /**< Effects unit for LADSPA support */
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue