MuseScore  3.4
Music composition and notation
Public Member Functions | Static Public Member Functions | Public Attributes | Private Member Functions | Private Attributes | Static Private Attributes | List of all members
FluidS::Voice Class Reference

#include <voice.h>

Collaboration diagram for FluidS::Voice:
Collaboration graph
[legend]

Public Member Functions

 Voice (Fluid *)
 
Channelget_channel () const
 
void voice_start ()
 
void off ()
 
void init (Sample *, Channel *, int key, int vel, unsigned id, double tuning)
 
void gen_incr (int i, float val)
 
void gen_set (int i, float val)
 
float gen_get (int gen)
 
unsigned int get_id () const
 
bool isPlaying ()
 
void set_param (int gen, float nrpn_value, int abs)
 
void update_param (int gen)
 
double GEN (int n)
 
void modulate_all ()
 fluid_voice_modulate_all More...
 
void modulate (bool _cc, int _ctrl)
 fluid_voice_modulate More...
 
float get_lower_boundary_for_attenuation ()
 
void check_sample_sanity ()
 
void noteoff ()
 
void kill_excl ()
 
int calculate_hold_decay_frames (int gen_base, int gen_key2base, int is_decay)
 
void calculate_gen_pitch ()
 
bool RELEASED () const
 
bool SUSTAINED () const
 
bool PLAYING () const
 
bool ON () const
 
int SAMPLEMODE () const
 
void calcVolEnv (int n, fluid_env_data_t *env_data)
 
void write (unsigned n, float *out, float *reverb, float *chorus)
 
void add_mod (const Mod *mod, int mode)
 
bool updateAmpInc (unsigned int &nextNewAmpInc, std::map< int, qreal >::iterator &curSample2AmpInc, qreal &dsp_amp_incr, unsigned int &dsp_i)
 
int dsp_float_interpolate_none (unsigned)
 
int dsp_float_interpolate_linear (unsigned)
 
int dsp_float_interpolate_4th_order (unsigned)
 
int dsp_float_interpolate_7th_order (unsigned)
 

Static Public Member Functions

static void dsp_float_config ()
 

Public Attributes

unsigned int id
 
unsigned char status
 
unsigned char chan
 
unsigned char key
 
unsigned char vel
 
Channelchannel
 
Generator gen [GEN_LAST]
 
Mod mod [FLUID_NUM_MOD]
 
int mod_count
 
bool has_looped
 
Samplesample
 
int check_sample_sanity_flag
 
unsigned int ticks
 
float amp
 
Phase phase
 
float phase_incr
 
qreal amp_incr
 
std::vector< float > dsp_buf
 
float pitch
 
float attenuation
 
float min_attenuation_cB
 
float root_pitch
 
float root_pitch_hz
 
int start
 
int end
 
int loopstart
 
int loopend
 
fluid_env_data_t volenv_data [FLUID_VOICE_ENVLAST]
 
unsigned int volenv_count
 
int volenv_section
 
std::map< int, qreal > Sample2AmpInc
 
float volenv_val
 
float amplitude_that_reaches_noise_floor_nonloop
 
float amplitude_that_reaches_noise_floor_loop
 
int positionToTurnOff
 
fluid_env_data_t modenv_data [FLUID_VOICE_ENVLAST]
 
unsigned int modenv_count
 
int modenv_section
 
float modenv_val
 
float modenv_to_fc
 
float modenv_to_pitch
 
float modlfo_val
 
unsigned int modlfo_delay
 
unsigned int modlfo_pos
 
unsigned int modlfo_dur
 
float modlfo_to_fc
 
float modlfo_to_pitch
 
float modlfo_to_vol
 
float viblfo_val
 
unsigned int viblfo_delay
 
float viblfo_incr
 
float viblfo_to_pitch
 
float fres
 
float last_fres
 
float q_lin
 
float filter_gain
 
float hist1
 
float hist2
 
int filter_startup
 
float b02
 
float b1
 
float a1
 
float a2
 
float b02_incr
 
float b1_incr
 
float a1_incr
 
float a2_incr
 
int filter_coeff_incr_count
 
float pan
 
float amp_left
 
float amp_right
 
float reverb_send
 
float amp_reverb
 
float chorus_send
 
float amp_chorus
 
int interp_method
 
int debug
 
double ref
 

Private Member Functions

void effects (int startBufIdx, int count, float *out, float *effect1, float *effect2)
 
bool generateDataForDSPChain (unsigned frames)
 
std::tuple< unsigned, bool > interpolateGeneratedDSPData (unsigned n)
 

Private Attributes

Fluid_fluid
 
double _noteTuning
 
unsigned _cachedFrames = 0
 
unsigned _initialCacheFrames = 0
 
std::vector< float > _cacheOut
 
std::vector< float > _cacheReverb
 
std::vector< float > _cacheChorus
 

Static Private Attributes

static float interp_coeff_linear [FLUID_INTERP_MAX][2]
 
static float interp_coeff [FLUID_INTERP_MAX][4]
 
static float sinc_table7 [FLUID_INTERP_MAX][7]
 

Constructor & Destructor Documentation

◆ Voice()

Voice::Voice ( Fluid f)

Member Function Documentation

◆ add_mod()

void Voice::add_mod ( const Mod mod,
int  mode 
)

◆ calculate_gen_pitch()

void Voice::calculate_gen_pitch ( )

◆ calculate_hold_decay_frames()

int Voice::calculate_hold_decay_frames ( int  gen_base,
int  gen_key2base,
int  is_decay 
)

◆ calcVolEnv()

void Voice::calcVolEnv ( int  n,
fluid_env_data_t env_data 
)
inline

◆ check_sample_sanity()

void Voice::check_sample_sanity ( )

◆ dsp_float_config()

void Voice::dsp_float_config ( )
static

◆ dsp_float_interpolate_4th_order()

int Voice::dsp_float_interpolate_4th_order ( unsigned  n)

◆ dsp_float_interpolate_7th_order()

int Voice::dsp_float_interpolate_7th_order ( unsigned  n)

◆ dsp_float_interpolate_linear()

int Voice::dsp_float_interpolate_linear ( unsigned  n)

◆ dsp_float_interpolate_none()

int Voice::dsp_float_interpolate_none ( unsigned  n)

◆ effects()

void Voice::effects ( int  startBufIdx,
int  count,
float *  out,
float *  effect1,
float *  effect2 
)
private

◆ GEN()

double FluidS::Voice::GEN ( int  n)
inline

◆ gen_get()

float Voice::gen_get ( int  gen)

◆ gen_incr()

void Voice::gen_incr ( int  i,
float  val 
)

◆ gen_set()

void Voice::gen_set ( int  i,
float  val 
)

◆ generateDataForDSPChain()

bool Voice::generateDataForDSPChain ( unsigned  frames)
private

◆ get_channel()

Channel* FluidS::Voice::get_channel ( ) const
inline

◆ get_id()

unsigned int FluidS::Voice::get_id ( ) const
inline

◆ get_lower_boundary_for_attenuation()

float Voice::get_lower_boundary_for_attenuation ( )

◆ init()

void FluidS::Voice::init ( Sample ,
Channel ,
int  key,
int  vel,
unsigned  id,
double  tuning 
)

◆ interpolateGeneratedDSPData()

std::tuple< unsigned, bool > Voice::interpolateGeneratedDSPData ( unsigned  n)
private

◆ isPlaying()

bool FluidS::Voice::isPlaying ( )
inline

◆ kill_excl()

void Voice::kill_excl ( )

◆ modulate()

void Voice::modulate ( bool  _cc,
int  _ctrl 
)

fluid_voice_modulate

In this implementation, I want to make sure that all controllers are event based: the parameter values of the DSP algorithm should only be updates when a controller event arrived and not at every iteration of the audio cycle (which would probably be feasible if the synth was made in silicon).

The update is done in three steps:

  • first, we look for all the modulators that have the changed controller as a source. This will yield a list of generators that will be changed because of the controller event.
  • For every changed generator, calculate its new value. This is the sum of its original value plus the values of al the attached modulators.
  • For every changed generator, convert its value to the correct unit of the corresponding DSP parameter

◆ modulate_all()

void Voice::modulate_all ( )

fluid_voice_modulate_all

Update all the modulators. This function is called after a ALL_CTRL_OFF MIDI message has been received (CC 121).

◆ noteoff()

void Voice::noteoff ( )

◆ off()

void Voice::off ( )

◆ ON()

bool FluidS::Voice::ON ( ) const
inline

◆ PLAYING()

bool FluidS::Voice::PLAYING ( ) const
inline

◆ RELEASED()

bool FluidS::Voice::RELEASED ( ) const
inline

◆ SAMPLEMODE()

int FluidS::Voice::SAMPLEMODE ( ) const
inline

◆ set_param()

void Voice::set_param ( int  gen,
float  nrpn_value,
int  abs 
)

◆ SUSTAINED()

bool FluidS::Voice::SUSTAINED ( ) const
inline

◆ update_param()

void Voice::update_param ( int  gen)

◆ updateAmpInc()

bool Voice::updateAmpInc ( unsigned int &  nextNewAmpInc,
std::map< int, qreal >::iterator &  curSample2AmpInc,
qreal &  dsp_amp_incr,
unsigned int &  dsp_i 
)
inline

◆ voice_start()

void Voice::voice_start ( )

◆ write()

void Voice::write ( unsigned  n,
float *  out,
float *  reverb,
float *  chorus 
)

Member Data Documentation

◆ _cacheChorus

std::vector<float> FluidS::Voice::_cacheChorus
private

◆ _cachedFrames

unsigned FluidS::Voice::_cachedFrames = 0
private

◆ _cacheOut

std::vector<float> FluidS::Voice::_cacheOut
private

◆ _cacheReverb

std::vector<float> FluidS::Voice::_cacheReverb
private

◆ _fluid

Fluid* FluidS::Voice::_fluid
private

◆ _initialCacheFrames

unsigned FluidS::Voice::_initialCacheFrames = 0
private

◆ _noteTuning

double FluidS::Voice::_noteTuning
private

◆ a1

float FluidS::Voice::a1

◆ a1_incr

float FluidS::Voice::a1_incr

◆ a2

float FluidS::Voice::a2

◆ a2_incr

float FluidS::Voice::a2_incr

◆ amp

float FluidS::Voice::amp

◆ amp_chorus

float FluidS::Voice::amp_chorus

◆ amp_incr

qreal FluidS::Voice::amp_incr

◆ amp_left

float FluidS::Voice::amp_left

◆ amp_reverb

float FluidS::Voice::amp_reverb

◆ amp_right

float FluidS::Voice::amp_right

◆ amplitude_that_reaches_noise_floor_loop

float FluidS::Voice::amplitude_that_reaches_noise_floor_loop

◆ amplitude_that_reaches_noise_floor_nonloop

float FluidS::Voice::amplitude_that_reaches_noise_floor_nonloop

◆ attenuation

float FluidS::Voice::attenuation

◆ b02

float FluidS::Voice::b02

◆ b02_incr

float FluidS::Voice::b02_incr

◆ b1

float FluidS::Voice::b1

◆ b1_incr

float FluidS::Voice::b1_incr

◆ chan

unsigned char FluidS::Voice::chan

◆ channel

Channel* FluidS::Voice::channel

◆ check_sample_sanity_flag

int FluidS::Voice::check_sample_sanity_flag

◆ chorus_send

float FluidS::Voice::chorus_send

◆ debug

int FluidS::Voice::debug

◆ dsp_buf

std::vector<float> FluidS::Voice::dsp_buf

◆ end

int FluidS::Voice::end

◆ filter_coeff_incr_count

int FluidS::Voice::filter_coeff_incr_count

◆ filter_gain

float FluidS::Voice::filter_gain

◆ filter_startup

int FluidS::Voice::filter_startup

◆ fres

float FluidS::Voice::fres

◆ gen

Generator FluidS::Voice::gen[GEN_LAST]

◆ has_looped

bool FluidS::Voice::has_looped

◆ hist1

float FluidS::Voice::hist1

◆ hist2

float FluidS::Voice::hist2

◆ id

unsigned int FluidS::Voice::id

◆ interp_coeff

float Voice::interp_coeff
staticprivate

◆ interp_coeff_linear

float Voice::interp_coeff_linear
staticprivate

◆ interp_method

int FluidS::Voice::interp_method

◆ key

unsigned char FluidS::Voice::key

◆ last_fres

float FluidS::Voice::last_fres

◆ loopend

int FluidS::Voice::loopend

◆ loopstart

int FluidS::Voice::loopstart

◆ min_attenuation_cB

float FluidS::Voice::min_attenuation_cB

◆ mod

Mod FluidS::Voice::mod[FLUID_NUM_MOD]

◆ mod_count

int FluidS::Voice::mod_count

◆ modenv_count

unsigned int FluidS::Voice::modenv_count

◆ modenv_data

fluid_env_data_t FluidS::Voice::modenv_data[FLUID_VOICE_ENVLAST]

◆ modenv_section

int FluidS::Voice::modenv_section

◆ modenv_to_fc

float FluidS::Voice::modenv_to_fc

◆ modenv_to_pitch

float FluidS::Voice::modenv_to_pitch

◆ modenv_val

float FluidS::Voice::modenv_val

◆ modlfo_delay

unsigned int FluidS::Voice::modlfo_delay

◆ modlfo_dur

unsigned int FluidS::Voice::modlfo_dur

◆ modlfo_pos

unsigned int FluidS::Voice::modlfo_pos

◆ modlfo_to_fc

float FluidS::Voice::modlfo_to_fc

◆ modlfo_to_pitch

float FluidS::Voice::modlfo_to_pitch

◆ modlfo_to_vol

float FluidS::Voice::modlfo_to_vol

◆ modlfo_val

float FluidS::Voice::modlfo_val

◆ pan

float FluidS::Voice::pan

◆ phase

Phase FluidS::Voice::phase

◆ phase_incr

float FluidS::Voice::phase_incr

◆ pitch

float FluidS::Voice::pitch

◆ positionToTurnOff

int FluidS::Voice::positionToTurnOff

◆ q_lin

float FluidS::Voice::q_lin

◆ ref

double FluidS::Voice::ref

◆ reverb_send

float FluidS::Voice::reverb_send

◆ root_pitch

float FluidS::Voice::root_pitch

◆ root_pitch_hz

float FluidS::Voice::root_pitch_hz

◆ sample

Sample* FluidS::Voice::sample

◆ Sample2AmpInc

std::map<int, qreal> FluidS::Voice::Sample2AmpInc

◆ sinc_table7

float Voice::sinc_table7
staticprivate

◆ start

int FluidS::Voice::start

◆ status

unsigned char FluidS::Voice::status

◆ ticks

unsigned int FluidS::Voice::ticks

◆ vel

unsigned char FluidS::Voice::vel

◆ viblfo_delay

unsigned int FluidS::Voice::viblfo_delay

◆ viblfo_incr

float FluidS::Voice::viblfo_incr

◆ viblfo_to_pitch

float FluidS::Voice::viblfo_to_pitch

◆ viblfo_val

float FluidS::Voice::viblfo_val

◆ volenv_count

unsigned int FluidS::Voice::volenv_count

◆ volenv_data

fluid_env_data_t FluidS::Voice::volenv_data[FLUID_VOICE_ENVLAST]

◆ volenv_section

int FluidS::Voice::volenv_section

◆ volenv_val

float FluidS::Voice::volenv_val

The documentation for this class was generated from the following files: