2018-06-14 07:40:17 +08:00
/* FluidSynth - A Software Synthesizer
*
* Copyright ( C ) 2003 Peter Hanappe and others .
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation ; either version 2.1 of
* the License , or ( at your option ) any later version .
*
* This library is distributed in the hope that it will be useful , but
* WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Lesser General Public License for more details .
2019-06-23 03:03:47 +08:00
*
2018-06-14 07:40:17 +08:00
* You should have received a copy of the GNU Lesser General Public
* License along with this library ; if not , write to the Free
* Software Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA
* 02110 - 1301 , USA
*/
# ifndef _FLUIDSYNTH_SYNTH_H
# define _FLUIDSYNTH_SYNTH_H
# ifdef __cplusplus
extern " C " {
# endif
/**
* @ file synth . h
* @ brief Embeddable SoundFont synthesizer
2019-06-23 03:03:47 +08:00
*
2018-06-14 07:40:17 +08:00
* You create a new synthesizer with new_fluid_synth ( ) and you destroy
* if with delete_fluid_synth ( ) . Use the settings structure to specify
2019-06-23 03:03:47 +08:00
* the synthesizer characteristics .
2018-06-14 07:40:17 +08:00
*
* You have to load a SoundFont in order to hear any sound . For that
* you use the fluid_synth_sfload ( ) function .
*
* You can use the audio driver functions described below to open
* the audio device and create a background audio thread .
2019-06-23 03:03:47 +08:00
*
2018-06-14 07:40:17 +08:00
* The API for sending MIDI events is probably what you expect :
* fluid_synth_noteon ( ) , fluid_synth_noteoff ( ) , . . .
*/
2019-06-23 03:03:47 +08:00
FLUIDSYNTH_API fluid_synth_t * new_fluid_synth ( fluid_settings_t * settings ) ;
FLUIDSYNTH_API void delete_fluid_synth ( fluid_synth_t * synth ) ;
FLUIDSYNTH_API fluid_settings_t * fluid_synth_get_settings ( fluid_synth_t * synth ) ;
2018-06-14 07:40:17 +08:00
/* MIDI channel messages */
2019-06-23 03:03:47 +08:00
FLUIDSYNTH_API int fluid_synth_noteon ( fluid_synth_t * synth , int chan , int key , int vel ) ;
FLUIDSYNTH_API int fluid_synth_noteoff ( fluid_synth_t * synth , int chan , int key ) ;
FLUIDSYNTH_API int fluid_synth_cc ( fluid_synth_t * synth , int chan , int ctrl , int val ) ;
FLUIDSYNTH_API int fluid_synth_get_cc ( fluid_synth_t * synth , int chan , int ctrl , int * pval ) ;
2018-06-14 07:40:17 +08:00
FLUIDSYNTH_API int fluid_synth_sysex ( fluid_synth_t * synth , const char * data , int len ,
char * response , int * response_len , int * handled , int dryrun ) ;
2019-06-23 03:03:47 +08:00
FLUIDSYNTH_API int fluid_synth_pitch_bend ( fluid_synth_t * synth , int chan , int val ) ;
FLUIDSYNTH_API int fluid_synth_get_pitch_bend ( fluid_synth_t * synth , int chan , int * ppitch_bend ) ;
FLUIDSYNTH_API int fluid_synth_pitch_wheel_sens ( fluid_synth_t * synth , int chan , int val ) ;
FLUIDSYNTH_API int fluid_synth_get_pitch_wheel_sens ( fluid_synth_t * synth , int chan , int * pval ) ;
FLUIDSYNTH_API int fluid_synth_program_change ( fluid_synth_t * synth , int chan , int program ) ;
FLUIDSYNTH_API int fluid_synth_channel_pressure ( fluid_synth_t * synth , int chan , int val ) ;
FLUIDSYNTH_API int fluid_synth_key_pressure ( fluid_synth_t * synth , int chan , int key , int val ) ;
FLUIDSYNTH_API int fluid_synth_bank_select ( fluid_synth_t * synth , int chan , int bank ) ;
FLUIDSYNTH_API int fluid_synth_sfont_select ( fluid_synth_t * synth , int chan , int sfont_id ) ;
2018-06-14 07:40:17 +08:00
FLUIDSYNTH_API
2019-06-23 03:03:47 +08:00
int fluid_synth_program_select ( fluid_synth_t * synth , int chan , int sfont_id ,
2018-06-17 22:56:35 +08:00
int bank_num , int preset_num ) ;
2018-06-14 07:40:17 +08:00
FLUIDSYNTH_API int
2019-06-23 03:03:47 +08:00
fluid_synth_program_select_by_sfont_name ( fluid_synth_t * synth , int chan ,
const char * sfont_name , int bank_num ,
int preset_num ) ;
FLUIDSYNTH_API
int fluid_synth_get_program ( fluid_synth_t * synth , int chan , int * sfont_id ,
int * bank_num , int * preset_num ) ;
FLUIDSYNTH_API int fluid_synth_unset_program ( fluid_synth_t * synth , int chan ) ;
FLUIDSYNTH_API int fluid_synth_program_reset ( fluid_synth_t * synth ) ;
FLUIDSYNTH_API int fluid_synth_system_reset ( fluid_synth_t * synth ) ;
FLUIDSYNTH_API int fluid_synth_all_notes_off ( fluid_synth_t * synth , int chan ) ;
FLUIDSYNTH_API int fluid_synth_all_sounds_off ( fluid_synth_t * synth , int chan ) ;
2018-06-14 07:40:17 +08:00
/**
* The midi channel type used by fluid_synth_set_channel_type ( )
*/
enum fluid_midi_channel_type
{
2019-06-23 03:03:47 +08:00
CHANNEL_TYPE_MELODIC = 0 , /**< Melodic midi channel */
CHANNEL_TYPE_DRUM = 1 /**< Drum midi channel */
2018-06-14 07:40:17 +08:00
} ;
2019-06-23 03:03:47 +08:00
FLUIDSYNTH_API int fluid_synth_set_channel_type ( fluid_synth_t * synth , int chan , int type ) ;
2018-06-14 07:40:17 +08:00
/* Low level access */
2019-06-23 03:03:47 +08:00
FLUIDSYNTH_API fluid_preset_t * fluid_synth_get_channel_preset ( fluid_synth_t * synth , int chan ) ;
FLUIDSYNTH_API int fluid_synth_start ( fluid_synth_t * synth , unsigned int id ,
fluid_preset_t * preset , int audio_chan ,
int midi_chan , int key , int vel ) ;
FLUIDSYNTH_API int fluid_synth_stop ( fluid_synth_t * synth , unsigned int id ) ;
2018-06-14 07:40:17 +08:00
/* SoundFont management */
2019-06-23 03:03:47 +08:00
FLUIDSYNTH_API
int fluid_synth_sfload ( fluid_synth_t * synth , const char * filename , int reset_presets ) ;
FLUIDSYNTH_API int fluid_synth_sfreload ( fluid_synth_t * synth , int id ) ;
FLUIDSYNTH_API int fluid_synth_sfunload ( fluid_synth_t * synth , int id , int reset_presets ) ;
FLUIDSYNTH_API int fluid_synth_add_sfont ( fluid_synth_t * synth , fluid_sfont_t * sfont ) ;
FLUIDSYNTH_API int fluid_synth_remove_sfont ( fluid_synth_t * synth , fluid_sfont_t * sfont ) ;
FLUIDSYNTH_API int fluid_synth_sfcount ( fluid_synth_t * synth ) ;
FLUIDSYNTH_API fluid_sfont_t * fluid_synth_get_sfont ( fluid_synth_t * synth , unsigned int num ) ;
FLUIDSYNTH_API fluid_sfont_t * fluid_synth_get_sfont_by_id ( fluid_synth_t * synth , int id ) ;
FLUIDSYNTH_API fluid_sfont_t * fluid_synth_get_sfont_by_name ( fluid_synth_t * synth ,
const char * name ) ;
FLUIDSYNTH_API int fluid_synth_set_bank_offset ( fluid_synth_t * synth , int sfont_id , int offset ) ;
FLUIDSYNTH_API int fluid_synth_get_bank_offset ( fluid_synth_t * synth , int sfont_id ) ;
2018-06-14 07:40:17 +08:00
/* Reverb */
2018-06-17 22:56:35 +08:00
2019-06-23 03:03:47 +08:00
FLUIDSYNTH_API int fluid_synth_set_reverb ( fluid_synth_t * synth , double roomsize ,
double damping , double width , double level ) ;
FLUIDSYNTH_API int fluid_synth_set_reverb_roomsize ( fluid_synth_t * synth , double roomsize ) ;
FLUIDSYNTH_API int fluid_synth_set_reverb_damp ( fluid_synth_t * synth , double damping ) ;
FLUIDSYNTH_API int fluid_synth_set_reverb_width ( fluid_synth_t * synth , double width ) ;
FLUIDSYNTH_API int fluid_synth_set_reverb_level ( fluid_synth_t * synth , double level ) ;
2018-06-17 22:56:35 +08:00
2019-06-23 03:03:47 +08:00
FLUIDSYNTH_API void fluid_synth_set_reverb_on ( fluid_synth_t * synth , int on ) ;
FLUIDSYNTH_API double fluid_synth_get_reverb_roomsize ( fluid_synth_t * synth ) ;
FLUIDSYNTH_API double fluid_synth_get_reverb_damp ( fluid_synth_t * synth ) ;
FLUIDSYNTH_API double fluid_synth_get_reverb_level ( fluid_synth_t * synth ) ;
FLUIDSYNTH_API double fluid_synth_get_reverb_width ( fluid_synth_t * synth ) ;
2018-06-14 07:40:17 +08:00
/* Chorus */
/**
* Chorus modulation waveform type .
*/
2019-06-23 03:03:47 +08:00
enum fluid_chorus_mod
{
FLUID_CHORUS_MOD_SINE = 0 , /**< Sine wave chorus modulation */
FLUID_CHORUS_MOD_TRIANGLE = 1 /**< Triangle wave chorus modulation */
2018-06-14 07:40:17 +08:00
} ;
2019-06-23 03:03:47 +08:00
FLUIDSYNTH_API int fluid_synth_set_chorus ( fluid_synth_t * synth , int nr , double level ,
double speed , double depth_ms , int type ) ;
FLUIDSYNTH_API int fluid_synth_set_chorus_nr ( fluid_synth_t * synth , int nr ) ;
FLUIDSYNTH_API int fluid_synth_set_chorus_level ( fluid_synth_t * synth , double level ) ;
FLUIDSYNTH_API int fluid_synth_set_chorus_speed ( fluid_synth_t * synth , double speed ) ;
FLUIDSYNTH_API int fluid_synth_set_chorus_depth ( fluid_synth_t * synth , double depth_ms ) ;
FLUIDSYNTH_API int fluid_synth_set_chorus_type ( fluid_synth_t * synth , int type ) ;
2018-06-17 22:56:35 +08:00
2019-06-23 03:03:47 +08:00
FLUIDSYNTH_API void fluid_synth_set_chorus_on ( fluid_synth_t * synth , int on ) ;
FLUIDSYNTH_API int fluid_synth_get_chorus_nr ( fluid_synth_t * synth ) ;
FLUIDSYNTH_API double fluid_synth_get_chorus_level ( fluid_synth_t * synth ) ;
FLUIDSYNTH_API double fluid_synth_get_chorus_speed ( fluid_synth_t * synth ) ;
FLUIDSYNTH_API double fluid_synth_get_chorus_depth ( fluid_synth_t * synth ) ;
FLUIDSYNTH_API int fluid_synth_get_chorus_type ( fluid_synth_t * synth ) ; /* see fluid_chorus_mod */
2018-06-14 07:40:17 +08:00
/* Audio and MIDI channels */
2019-06-23 03:03:47 +08:00
FLUIDSYNTH_API int fluid_synth_count_midi_channels ( fluid_synth_t * synth ) ;
FLUIDSYNTH_API int fluid_synth_count_audio_channels ( fluid_synth_t * synth ) ;
FLUIDSYNTH_API int fluid_synth_count_audio_groups ( fluid_synth_t * synth ) ;
FLUIDSYNTH_API int fluid_synth_count_effects_channels ( fluid_synth_t * synth ) ;
FLUIDSYNTH_API int fluid_synth_count_effects_groups ( fluid_synth_t * synth ) ;
2018-06-14 07:40:17 +08:00
/* Synthesis parameters */
2019-06-23 03:03:47 +08:00
FLUIDSYNTH_API void fluid_synth_set_sample_rate ( fluid_synth_t * synth , float sample_rate ) ;
FLUIDSYNTH_API void fluid_synth_set_gain ( fluid_synth_t * synth , float gain ) ;
FLUIDSYNTH_API float fluid_synth_get_gain ( fluid_synth_t * synth ) ;
FLUIDSYNTH_API int fluid_synth_set_polyphony ( fluid_synth_t * synth , int polyphony ) ;
FLUIDSYNTH_API int fluid_synth_get_polyphony ( fluid_synth_t * synth ) ;
FLUIDSYNTH_API int fluid_synth_get_active_voice_count ( fluid_synth_t * synth ) ;
FLUIDSYNTH_API int fluid_synth_get_internal_bufsize ( fluid_synth_t * synth ) ;
2018-06-14 07:40:17 +08:00
2019-06-23 03:03:47 +08:00
FLUIDSYNTH_API
int fluid_synth_set_interp_method ( fluid_synth_t * synth , int chan , int interp_method ) ;
2018-06-14 07:40:17 +08:00
/**
* Synthesis interpolation method .
*/
2019-06-23 03:03:47 +08:00
enum fluid_interp
{
FLUID_INTERP_NONE = 0 , /**< No interpolation: Fastest, but questionable audio quality */
FLUID_INTERP_LINEAR = 1 , /**< Straight-line interpolation: A bit slower, reasonable audio quality */
FLUID_INTERP_4THORDER = 4 , /**< Fourth-order interpolation, good quality, the default */
FLUID_INTERP_7THORDER = 7 , /**< Seventh-order interpolation */
FLUID_INTERP_DEFAULT = FLUID_INTERP_4THORDER , /**< Default interpolation method */
FLUID_INTERP_HIGHEST = FLUID_INTERP_7THORDER , /**< Highest interpolation method */
2018-06-14 07:40:17 +08:00
} ;
/* Generator interface */
2019-06-23 03:03:47 +08:00
FLUIDSYNTH_API int fluid_synth_set_gen ( fluid_synth_t * synth , int chan ,
int param , float value ) ;
FLUIDSYNTH_API float fluid_synth_get_gen ( fluid_synth_t * synth , int chan , int param ) ;
2018-06-14 07:40:17 +08:00
/* Tuning */
FLUIDSYNTH_API
2019-06-23 03:03:47 +08:00
int fluid_synth_activate_key_tuning ( fluid_synth_t * synth , int bank , int prog ,
const char * name , const double * pitch , int apply ) ;
FLUIDSYNTH_API
int fluid_synth_activate_octave_tuning ( fluid_synth_t * synth , int bank , int prog ,
const char * name , const double * pitch , int apply ) ;
2018-06-14 07:40:17 +08:00
FLUIDSYNTH_API
2019-06-23 03:03:47 +08:00
int fluid_synth_tune_notes ( fluid_synth_t * synth , int bank , int prog ,
int len , const int * keys , const double * pitch , int apply ) ;
2018-06-14 07:40:17 +08:00
FLUIDSYNTH_API
2019-06-23 03:03:47 +08:00
int fluid_synth_activate_tuning ( fluid_synth_t * synth , int chan , int bank , int prog ,
2018-06-14 07:40:17 +08:00
int apply ) ;
FLUIDSYNTH_API
2019-06-23 03:03:47 +08:00
int fluid_synth_deactivate_tuning ( fluid_synth_t * synth , int chan , int apply ) ;
FLUIDSYNTH_API void fluid_synth_tuning_iteration_start ( fluid_synth_t * synth ) ;
FLUIDSYNTH_API
int fluid_synth_tuning_iteration_next ( fluid_synth_t * synth , int * bank , int * prog ) ;
FLUIDSYNTH_API int fluid_synth_tuning_dump ( fluid_synth_t * synth , int bank , int prog ,
char * name , int len , double * pitch ) ;
2018-06-14 07:40:17 +08:00
/* Misc */
2019-06-23 03:03:47 +08:00
FLUIDSYNTH_API double fluid_synth_get_cpu_load ( fluid_synth_t * synth ) ;
FLUID_DEPRECATED FLUIDSYNTH_API const char * fluid_synth_error ( fluid_synth_t * synth ) ;
2018-06-17 22:56:35 +08:00
/* Default modulators */
/**
* Enum used with fluid_synth_add_default_mod ( ) to specify how to handle duplicate modulators .
*/
2019-06-23 03:03:47 +08:00
enum fluid_synth_add_mod
{
FLUID_SYNTH_OVERWRITE , /**< Overwrite any existing matching modulator */
FLUID_SYNTH_ADD , /**< Add (sum) modulator amounts */
2018-06-17 22:56:35 +08:00
} ;
2019-06-23 03:03:47 +08:00
FLUIDSYNTH_API int fluid_synth_add_default_mod ( fluid_synth_t * synth , const fluid_mod_t * mod , int mode ) ;
FLUIDSYNTH_API int fluid_synth_remove_default_mod ( fluid_synth_t * synth , const fluid_mod_t * mod ) ;
2018-06-14 07:40:17 +08:00
/*
* Synthesizer plugin
*
* To create a synthesizer plugin , create the synthesizer as
* explained above . Once the synthesizer is created you can call
2019-06-23 03:03:47 +08:00
* any of the functions below to get the audio .
2018-06-14 07:40:17 +08:00
*/
2019-06-23 03:03:47 +08:00
FLUIDSYNTH_API int fluid_synth_write_s16 ( fluid_synth_t * synth , int len ,
void * lout , int loff , int lincr ,
void * rout , int roff , int rincr ) ;
FLUIDSYNTH_API int fluid_synth_write_float ( fluid_synth_t * synth , int len ,
void * lout , int loff , int lincr ,
void * rout , int roff , int rincr ) ;
FLUID_DEPRECATED FLUIDSYNTH_API int fluid_synth_nwrite_float ( fluid_synth_t * synth , int len ,
float * * left , float * * right ,
float * * fx_left , float * * fx_right ) ;
FLUIDSYNTH_API int fluid_synth_process ( fluid_synth_t * synth , int len ,
int nfx , float * fx [ ] ,
int nout , float * out [ ] ) ;
2018-06-14 07:40:17 +08:00
/* Synthesizer's interface to handle SoundFont loaders */
2019-06-23 03:03:47 +08:00
FLUIDSYNTH_API void fluid_synth_add_sfloader ( fluid_synth_t * synth , fluid_sfloader_t * loader ) ;
FLUIDSYNTH_API fluid_voice_t * fluid_synth_alloc_voice ( fluid_synth_t * synth ,
fluid_sample_t * sample ,
int channum , int key , int vel ) ;
FLUIDSYNTH_API void fluid_synth_start_voice ( fluid_synth_t * synth , fluid_voice_t * voice ) ;
FLUIDSYNTH_API void fluid_synth_get_voicelist ( fluid_synth_t * synth ,
fluid_voice_t * buf [ ] , int bufsize , int ID ) ;
FLUIDSYNTH_API int fluid_synth_handle_midi_event ( void * data , fluid_midi_event_t * event ) ;
2018-06-17 22:56:35 +08:00
/**
* Specifies the type of filter to use for the custom IIR filter
*/
2019-06-23 03:03:47 +08:00
enum fluid_iir_filter_type
{
2018-06-17 22:56:35 +08:00
FLUID_IIR_DISABLED = 0 , /**< Custom IIR filter is not operating */
FLUID_IIR_LOWPASS , /**< Custom IIR filter is operating as low-pass filter */
FLUID_IIR_HIGHPASS , /**< Custom IIR filter is operating as high-pass filter */
FLUID_IIR_LAST /**< @internal Value defines the count of filter types (#fluid_iir_filter_type) @warning This symbol is not part of the public API and ABI stability guarantee and may change at any time! */
} ;
/**
* Specifies optional settings to use for the custom IIR filter
*/
2019-06-23 03:03:47 +08:00
enum fluid_iir_filter_flags
{
2018-06-17 22:56:35 +08:00
FLUID_IIR_Q_LINEAR = 1 < < 0 , /**< The Soundfont spec requires the filter Q to be interpreted in dB. If this flag is set the filter Q is instead assumed to be in a linear range */
FLUID_IIR_Q_ZERO_OFF = 1 < < 1 , /**< If this flag the filter is switched off if Q == 0 (prior to any transformation) */
FLUID_IIR_NO_GAIN_AMP = 1 < < 2 /**< The Soundfont spec requires to correct the gain of the filter depending on the filter's Q. If this flag is set the filter gain will not be corrected. */
} ;
2019-06-23 03:03:47 +08:00
FLUIDSYNTH_API int fluid_synth_set_custom_filter ( fluid_synth_t * , int type , int flags ) ;
2018-06-17 22:56:35 +08:00
/* LADSPA */
FLUIDSYNTH_API fluid_ladspa_fx_t * fluid_synth_get_ladspa_fx ( fluid_synth_t * synth ) ;
/* API: Poly mono mode */
/** Interface to poly/mono mode variables
2019-06-23 03:03:47 +08:00
*
2018-06-17 22:56:35 +08:00
* Channel mode bits OR - ed together so that it matches with the midi spec : poly omnion ( 0 ) , mono omnion ( 1 ) , poly omnioff ( 2 ) , mono omnioff ( 3 )
*/
enum fluid_channel_mode_flags
{
FLUID_CHANNEL_POLY_OFF = 0x01 , /**< if flag is set, the basic channel is in mono on state, if not set poly is on */
FLUID_CHANNEL_OMNI_OFF = 0x02 , /**< if flag is set, the basic channel is in omni off state, if not set omni is on */
} ;
/** Indicates the breath mode a channel is set to */
enum fluid_channel_breath_flags
{
FLUID_CHANNEL_BREATH_POLY = 0x10 , /**< when channel is poly, this flag indicates that the default velocity to initial attenuation modulator is replaced by a breath to initial attenuation modulator */
FLUID_CHANNEL_BREATH_MONO = 0x20 , /**< when channel is mono, this flag indicates that the default velocity to initial attenuation modulator is replaced by a breath modulator */
FLUID_CHANNEL_BREATH_SYNC = 0x40 , /**< when channel is mono, this flag indicates that the breath controler(MSB)triggers noteon/noteoff on the running note */
} ;
/** Indicates the mode a basic channel is set to */
enum fluid_basic_channel_modes
2019-06-23 03:03:47 +08:00
{
2018-06-17 22:56:35 +08:00
FLUID_CHANNEL_MODE_MASK = ( FLUID_CHANNEL_OMNI_OFF | FLUID_CHANNEL_POLY_OFF ) , /**< Mask Poly and Omni bits of #fluid_channel_mode_flags, usually only used internally */
FLUID_CHANNEL_MODE_OMNION_POLY = FLUID_CHANNEL_MODE_MASK & ( ~ FLUID_CHANNEL_OMNI_OFF & ~ FLUID_CHANNEL_POLY_OFF ) , /**< corresponds to MIDI mode 0 */
FLUID_CHANNEL_MODE_OMNION_MONO = FLUID_CHANNEL_MODE_MASK & ( ~ FLUID_CHANNEL_OMNI_OFF & FLUID_CHANNEL_POLY_OFF ) , /**< corresponds to MIDI mode 1 */
FLUID_CHANNEL_MODE_OMNIOFF_POLY = FLUID_CHANNEL_MODE_MASK & ( FLUID_CHANNEL_OMNI_OFF & ~ FLUID_CHANNEL_POLY_OFF ) , /**< corresponds to MIDI mode 2 */
FLUID_CHANNEL_MODE_OMNIOFF_MONO = FLUID_CHANNEL_MODE_MASK & ( FLUID_CHANNEL_OMNI_OFF | FLUID_CHANNEL_POLY_OFF ) , /**< corresponds to MIDI mode 3 */
FLUID_CHANNEL_MODE_LAST /**< @internal Value defines the count of basic channel modes (#fluid_basic_channel_modes) @warning This symbol is not part of the public API and ABI stability guarantee and may change at any time! */
} ;
2019-06-23 03:03:47 +08:00
FLUIDSYNTH_API int fluid_synth_reset_basic_channel ( fluid_synth_t * synth , int chan ) ;
2018-06-17 22:56:35 +08:00
2019-06-23 03:03:47 +08:00
FLUIDSYNTH_API int fluid_synth_get_basic_channel ( fluid_synth_t * synth , int chan ,
int * basic_chan_out ,
int * mode_chan_out ,
int * basic_val_out ) ;
FLUIDSYNTH_API int fluid_synth_set_basic_channel ( fluid_synth_t * synth , int chan , int mode , int val ) ;
2018-06-17 22:56:35 +08:00
/** Interface to mono legato mode
2019-06-23 03:03:47 +08:00
*
2018-06-17 22:56:35 +08:00
* Indicates the legato mode a channel is set to
* n1 , n2 , n3 , . . is a legato passage . n1 is the first note , and n2 , n3 , n4 are played legato with previous note . */
enum fluid_channel_legato_mode
{
2019-06-23 03:03:47 +08:00
FLUID_CHANNEL_LEGATO_MODE_RETRIGGER , /**< Mode 0 - Release previous note, start a new note */
FLUID_CHANNEL_LEGATO_MODE_MULTI_RETRIGGER , /**< Mode 1 - On contiguous notes retrigger in attack section using current value, shape attack using current dynamic and make use of previous voices if any */
FLUID_CHANNEL_LEGATO_MODE_LAST /**< @internal Value defines the count of legato modes (#fluid_channel_legato_mode) @warning This symbol is not part of the public API and ABI stability guarantee and may change at any time! */
2018-06-17 22:56:35 +08:00
} ;
2019-06-23 03:03:47 +08:00
FLUIDSYNTH_API int fluid_synth_set_legato_mode ( fluid_synth_t * synth , int chan , int legatomode ) ;
FLUIDSYNTH_API int fluid_synth_get_legato_mode ( fluid_synth_t * synth , int chan , int * legatomode ) ;
2018-06-17 22:56:35 +08:00
/** Interface to portamento mode
*
* Indicates the portamento mode a channel is set to
*/
enum fluid_channel_portamento_mode
{
2019-06-23 03:03:47 +08:00
FLUID_CHANNEL_PORTAMENTO_MODE_EACH_NOTE , /**< Mode 0 - Portamento on each note (staccato or legato) */
FLUID_CHANNEL_PORTAMENTO_MODE_LEGATO_ONLY , /**< Mode 1 - Portamento only on legato note */
FLUID_CHANNEL_PORTAMENTO_MODE_STACCATO_ONLY , /**< Mode 2 - Portamento only on staccato note */
FLUID_CHANNEL_PORTAMENTO_MODE_LAST /**< @internal Value defines the count of portamento modes (#fluid_channel_portamento_mode) @warning This symbol is not part of the public API and ABI stability guarantee and may change at any time! */
2018-06-17 22:56:35 +08:00
} ;
2019-06-23 03:03:47 +08:00
FLUIDSYNTH_API int fluid_synth_set_portamento_mode ( fluid_synth_t * synth ,
int chan , int portamentomode ) ;
FLUIDSYNTH_API int fluid_synth_get_portamento_mode ( fluid_synth_t * synth ,
int chan , int * portamentomode ) ;
2018-06-17 22:56:35 +08:00
/* Interface to breath mode */
2019-06-23 03:03:47 +08:00
FLUIDSYNTH_API int fluid_synth_set_breath_mode ( fluid_synth_t * synth ,
int chan , int breathmode ) ;
FLUIDSYNTH_API int fluid_synth_get_breath_mode ( fluid_synth_t * synth ,
int chan , int * breathmode ) ;
2018-06-17 22:56:35 +08:00
2018-06-14 07:40:17 +08:00
# ifdef __cplusplus
}
# endif
# endif /* _FLUIDSYNTH_SYNTH_H */