fix #119731: fluidsynth optimizations
This commit is contained in:
parent
95bcc1e5cb
commit
65fad51543
3 changed files with 109 additions and 91 deletions
106
fluid/dsp.cpp
106
fluid/dsp.cpp
|
@ -46,13 +46,29 @@ namespace FluidS {
|
||||||
* - dsp_buf: Output buffer of floating point values (FLUID_BUFSIZE in length)
|
* - dsp_buf: Output buffer of floating point values (FLUID_BUFSIZE in length)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
inline void updateAmpInc(unsigned int &nextNewAmpInc,std::map<int, qreal>::iterator &curSample2AmpInc, qreal &dsp_amp_incr, unsigned int dsp_i)
|
inline bool Voice::updateAmpInc(unsigned int &nextNewAmpInc, std::map<int, qreal>::iterator &curSample2AmpInc, qreal &dsp_amp_incr, unsigned int &dsp_i)
|
||||||
{
|
{
|
||||||
|
if (positionToTurnOff > 0 && dsp_i >= (unsigned int) positionToTurnOff)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// if volume is zero skip all phases that do not change that!
|
||||||
|
if (amp == 0.0f) {
|
||||||
|
while (dsp_amp_incr == 0.0f && curSample2AmpInc != Sample2AmpInc.end()) {
|
||||||
|
dsp_i = curSample2AmpInc->first;
|
||||||
|
curSample2AmpInc++;
|
||||||
|
nextNewAmpInc = curSample2AmpInc->first;
|
||||||
|
dsp_amp_incr = curSample2AmpInc->second;
|
||||||
|
}
|
||||||
|
if (curSample2AmpInc == Sample2AmpInc.end())
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (dsp_i >= nextNewAmpInc) {
|
if (dsp_i >= nextNewAmpInc) {
|
||||||
curSample2AmpInc++;
|
curSample2AmpInc++;
|
||||||
nextNewAmpInc = curSample2AmpInc->first;
|
nextNewAmpInc = curSample2AmpInc->first;
|
||||||
dsp_amp_incr = curSample2AmpInc->second;
|
dsp_amp_incr = curSample2AmpInc->second;
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -131,7 +147,6 @@ int Voice::dsp_float_interpolate_none(unsigned n)
|
||||||
Phase dsp_phase_incr; // end_phase;
|
Phase dsp_phase_incr; // end_phase;
|
||||||
short int *dsp_data = voice->sample->data;
|
short int *dsp_data = voice->sample->data;
|
||||||
float *dsp_buf = voice->dsp_buf;
|
float *dsp_buf = voice->dsp_buf;
|
||||||
float dsp_amp = voice->amp;
|
|
||||||
auto curSample2AmpInc = Sample2AmpInc.begin();
|
auto curSample2AmpInc = Sample2AmpInc.begin();
|
||||||
qreal dsp_amp_incr = curSample2AmpInc->second;
|
qreal dsp_amp_incr = curSample2AmpInc->second;
|
||||||
unsigned int nextNewAmpInc = curSample2AmpInc->first;
|
unsigned int nextNewAmpInc = curSample2AmpInc->first;
|
||||||
|
@ -155,13 +170,14 @@ int Voice::dsp_float_interpolate_none(unsigned n)
|
||||||
|
|
||||||
/* interpolate sequence of sample points */
|
/* interpolate sequence of sample points */
|
||||||
for ( ; dsp_i < n && dsp_phase_index <= end_index; dsp_i++) {
|
for ( ; dsp_i < n && dsp_phase_index <= end_index; dsp_i++) {
|
||||||
dsp_buf[dsp_i] = dsp_amp * dsp_data[dsp_phase_index];
|
dsp_buf[dsp_i] = amp * dsp_data[dsp_phase_index];
|
||||||
|
|
||||||
/* increment phase and amplitude */
|
/* increment phase and amplitude */
|
||||||
dsp_phase += dsp_phase_incr;
|
dsp_phase += dsp_phase_incr;
|
||||||
dsp_phase_index = dsp_phase.index_round(); /* round to nearest point */
|
dsp_phase_index = dsp_phase.index_round(); /* round to nearest point */
|
||||||
updateAmpInc(nextNewAmpInc, curSample2AmpInc, dsp_amp_incr, dsp_i);
|
if (!updateAmpInc(nextNewAmpInc, curSample2AmpInc, dsp_amp_incr, dsp_i))
|
||||||
dsp_amp += dsp_amp_incr;
|
return dsp_i;
|
||||||
|
amp += dsp_amp_incr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* break out if not looping (buffer may not be full) */
|
/* break out if not looping (buffer may not be full) */
|
||||||
|
@ -180,7 +196,6 @@ int Voice::dsp_float_interpolate_none(unsigned n)
|
||||||
}
|
}
|
||||||
|
|
||||||
voice->phase = dsp_phase;
|
voice->phase = dsp_phase;
|
||||||
voice->amp = dsp_amp;
|
|
||||||
return dsp_i;
|
return dsp_i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,7 +213,6 @@ int Voice::dsp_float_interpolate_linear(unsigned n)
|
||||||
Phase dsp_phase_incr; // end_phase;
|
Phase dsp_phase_incr; // end_phase;
|
||||||
short int *dsp_data = voice->sample->data;
|
short int *dsp_data = voice->sample->data;
|
||||||
float *dsp_buf = voice->dsp_buf;
|
float *dsp_buf = voice->dsp_buf;
|
||||||
float dsp_amp = voice->amp;
|
|
||||||
auto curSample2AmpInc = Sample2AmpInc.begin();
|
auto curSample2AmpInc = Sample2AmpInc.begin();
|
||||||
qreal dsp_amp_incr = curSample2AmpInc->second;
|
qreal dsp_amp_incr = curSample2AmpInc->second;
|
||||||
unsigned int nextNewAmpInc = curSample2AmpInc->first;
|
unsigned int nextNewAmpInc = curSample2AmpInc->first;
|
||||||
|
@ -232,14 +246,15 @@ int Voice::dsp_float_interpolate_linear(unsigned n)
|
||||||
/* interpolate the sequence of sample points */
|
/* interpolate the sequence of sample points */
|
||||||
for ( ; dsp_i < n && dsp_phase_index <= end_index; dsp_i++) {
|
for ( ; dsp_i < n && dsp_phase_index <= end_index; dsp_i++) {
|
||||||
coeffs = interp_coeff_linear[fluid_phase_fract_to_tablerow (dsp_phase)];
|
coeffs = interp_coeff_linear[fluid_phase_fract_to_tablerow (dsp_phase)];
|
||||||
dsp_buf[dsp_i] = dsp_amp * (coeffs[0] * dsp_data[dsp_phase_index]
|
dsp_buf[dsp_i] = amp * (coeffs[0] * dsp_data[dsp_phase_index]
|
||||||
+ coeffs[1] * dsp_data[dsp_phase_index+1]);
|
+ coeffs[1] * dsp_data[dsp_phase_index+1]);
|
||||||
|
|
||||||
/* increment phase and amplitude */
|
/* increment phase and amplitude */
|
||||||
dsp_phase += dsp_phase_incr;
|
dsp_phase += dsp_phase_incr;
|
||||||
dsp_phase_index = dsp_phase.index();
|
dsp_phase_index = dsp_phase.index();
|
||||||
updateAmpInc(nextNewAmpInc, curSample2AmpInc, dsp_amp_incr, dsp_i);
|
if (!updateAmpInc(nextNewAmpInc, curSample2AmpInc, dsp_amp_incr, dsp_i))
|
||||||
dsp_amp += dsp_amp_incr;
|
return dsp_i;
|
||||||
|
amp += dsp_amp_incr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* break out if buffer filled */
|
/* break out if buffer filled */
|
||||||
|
@ -251,14 +266,15 @@ int Voice::dsp_float_interpolate_linear(unsigned n)
|
||||||
/* interpolate within last point */
|
/* interpolate within last point */
|
||||||
for (; dsp_phase_index <= end_index && dsp_i < n; dsp_i++) {
|
for (; dsp_phase_index <= end_index && dsp_i < n; dsp_i++) {
|
||||||
coeffs = interp_coeff_linear[fluid_phase_fract_to_tablerow (dsp_phase)];
|
coeffs = interp_coeff_linear[fluid_phase_fract_to_tablerow (dsp_phase)];
|
||||||
dsp_buf[dsp_i] = dsp_amp * (coeffs[0] * dsp_data[dsp_phase_index]
|
dsp_buf[dsp_i] = amp * (coeffs[0] * dsp_data[dsp_phase_index]
|
||||||
+ coeffs[1] * point);
|
+ coeffs[1] * point);
|
||||||
|
|
||||||
/* increment phase and amplitude */
|
/* increment phase and amplitude */
|
||||||
dsp_phase += dsp_phase_incr;
|
dsp_phase += dsp_phase_incr;
|
||||||
dsp_phase_index = dsp_phase.index();
|
dsp_phase_index = dsp_phase.index();
|
||||||
updateAmpInc(nextNewAmpInc, curSample2AmpInc, dsp_amp_incr, dsp_i);
|
if (!updateAmpInc(nextNewAmpInc, curSample2AmpInc, dsp_amp_incr, dsp_i))
|
||||||
dsp_amp += dsp_amp_incr; /* increment amplitude */
|
return dsp_i;
|
||||||
|
amp += dsp_amp_incr; /* increment amplitude */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!looping)
|
if (!looping)
|
||||||
|
@ -277,7 +293,6 @@ int Voice::dsp_float_interpolate_linear(unsigned n)
|
||||||
}
|
}
|
||||||
|
|
||||||
voice->phase = dsp_phase;
|
voice->phase = dsp_phase;
|
||||||
voice->amp = dsp_amp;
|
|
||||||
return dsp_i;
|
return dsp_i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -345,7 +360,8 @@ int Voice::dsp_float_interpolate_4th_order(unsigned n)
|
||||||
/* increment phase and amplitude */
|
/* increment phase and amplitude */
|
||||||
phase += dsp_phase_incr;
|
phase += dsp_phase_incr;
|
||||||
dsp_phase_index = phase.index();
|
dsp_phase_index = phase.index();
|
||||||
updateAmpInc(nextNewAmpInc, curSample2AmpInc, dsp_amp_incr, dsp_i);
|
if (!updateAmpInc(nextNewAmpInc, curSample2AmpInc, dsp_amp_incr, dsp_i))
|
||||||
|
return dsp_i;
|
||||||
amp += dsp_amp_incr;
|
amp += dsp_amp_incr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -360,7 +376,8 @@ int Voice::dsp_float_interpolate_4th_order(unsigned n)
|
||||||
/* increment phase and amplitude */
|
/* increment phase and amplitude */
|
||||||
phase += dsp_phase_incr;
|
phase += dsp_phase_incr;
|
||||||
dsp_phase_index = phase.index();
|
dsp_phase_index = phase.index();
|
||||||
updateAmpInc(nextNewAmpInc, curSample2AmpInc, dsp_amp_incr, dsp_i);
|
if (!updateAmpInc(nextNewAmpInc, curSample2AmpInc, dsp_amp_incr, dsp_i))
|
||||||
|
return dsp_i;
|
||||||
amp += dsp_amp_incr;
|
amp += dsp_amp_incr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -381,7 +398,8 @@ int Voice::dsp_float_interpolate_4th_order(unsigned n)
|
||||||
/* increment phase and amplitude */
|
/* increment phase and amplitude */
|
||||||
phase += dsp_phase_incr;
|
phase += dsp_phase_incr;
|
||||||
dsp_phase_index = phase.index();
|
dsp_phase_index = phase.index();
|
||||||
updateAmpInc(nextNewAmpInc, curSample2AmpInc, dsp_amp_incr, dsp_i);
|
if (!updateAmpInc(nextNewAmpInc, curSample2AmpInc, dsp_amp_incr, dsp_i))
|
||||||
|
return dsp_i;
|
||||||
amp += dsp_amp_incr;
|
amp += dsp_amp_incr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -398,7 +416,8 @@ int Voice::dsp_float_interpolate_4th_order(unsigned n)
|
||||||
/* increment phase and amplitude */
|
/* increment phase and amplitude */
|
||||||
phase += dsp_phase_incr;
|
phase += dsp_phase_incr;
|
||||||
dsp_phase_index = phase.index();
|
dsp_phase_index = phase.index();
|
||||||
updateAmpInc(nextNewAmpInc, curSample2AmpInc, dsp_amp_incr, dsp_i);
|
if (!updateAmpInc(nextNewAmpInc, curSample2AmpInc, dsp_amp_incr, dsp_i))
|
||||||
|
return dsp_i;
|
||||||
amp += dsp_amp_incr;
|
amp += dsp_amp_incr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -437,7 +456,6 @@ int Voice::dsp_float_interpolate_7th_order(unsigned n)
|
||||||
Phase dsp_phase_incr; // end_phase;
|
Phase dsp_phase_incr; // end_phase;
|
||||||
short int *dsp_data = voice->sample->data;
|
short int *dsp_data = voice->sample->data;
|
||||||
float *dsp_buf = voice->dsp_buf;
|
float *dsp_buf = voice->dsp_buf;
|
||||||
float dsp_amp = voice->amp;
|
|
||||||
auto curSample2AmpInc = Sample2AmpInc.begin();
|
auto curSample2AmpInc = Sample2AmpInc.begin();
|
||||||
qreal dsp_amp_incr = curSample2AmpInc->second;
|
qreal dsp_amp_incr = curSample2AmpInc->second;
|
||||||
unsigned int nextNewAmpInc = curSample2AmpInc->first;
|
unsigned int nextNewAmpInc = curSample2AmpInc->first;
|
||||||
|
@ -496,7 +514,7 @@ int Voice::dsp_float_interpolate_7th_order(unsigned n)
|
||||||
for ( ; dsp_phase_index == start_index && dsp_i < n; dsp_i++) {
|
for ( ; dsp_phase_index == start_index && dsp_i < n; dsp_i++) {
|
||||||
coeffs = sinc_table7[fluid_phase_fract_to_tablerow (dsp_phase)];
|
coeffs = sinc_table7[fluid_phase_fract_to_tablerow (dsp_phase)];
|
||||||
|
|
||||||
dsp_buf[dsp_i] = dsp_amp * (coeffs[0] * (float)start_points[2]
|
dsp_buf[dsp_i] = amp * (coeffs[0] * (float)start_points[2]
|
||||||
+ coeffs[1] * (float)start_points[1]
|
+ coeffs[1] * (float)start_points[1]
|
||||||
+ coeffs[2] * (float)start_points[0]
|
+ coeffs[2] * (float)start_points[0]
|
||||||
+ coeffs[3] * (float)dsp_data[dsp_phase_index]
|
+ coeffs[3] * (float)dsp_data[dsp_phase_index]
|
||||||
|
@ -507,8 +525,9 @@ int Voice::dsp_float_interpolate_7th_order(unsigned n)
|
||||||
/* increment phase and amplitude */
|
/* increment phase and amplitude */
|
||||||
dsp_phase += dsp_phase_incr;
|
dsp_phase += dsp_phase_incr;
|
||||||
dsp_phase_index = dsp_phase.index();
|
dsp_phase_index = dsp_phase.index();
|
||||||
updateAmpInc(nextNewAmpInc, curSample2AmpInc, dsp_amp_incr, dsp_i);
|
if (!updateAmpInc(nextNewAmpInc, curSample2AmpInc, dsp_amp_incr, dsp_i))
|
||||||
dsp_amp += dsp_amp_incr;
|
return dsp_i;
|
||||||
|
amp += dsp_amp_incr;
|
||||||
}
|
}
|
||||||
|
|
||||||
start_index++;
|
start_index++;
|
||||||
|
@ -517,7 +536,7 @@ int Voice::dsp_float_interpolate_7th_order(unsigned n)
|
||||||
for ( ; dsp_phase_index == start_index && dsp_i < n; dsp_i++) {
|
for ( ; dsp_phase_index == start_index && dsp_i < n; dsp_i++) {
|
||||||
coeffs = sinc_table7[fluid_phase_fract_to_tablerow (dsp_phase)];
|
coeffs = sinc_table7[fluid_phase_fract_to_tablerow (dsp_phase)];
|
||||||
|
|
||||||
dsp_buf[dsp_i] = dsp_amp * (coeffs[0] * (float)start_points[1]
|
dsp_buf[dsp_i] = amp * (coeffs[0] * (float)start_points[1]
|
||||||
+ coeffs[1] * (float)start_points[0]
|
+ coeffs[1] * (float)start_points[0]
|
||||||
+ coeffs[2] * (float)dsp_data[dsp_phase_index-1]
|
+ coeffs[2] * (float)dsp_data[dsp_phase_index-1]
|
||||||
+ coeffs[3] * (float)dsp_data[dsp_phase_index]
|
+ coeffs[3] * (float)dsp_data[dsp_phase_index]
|
||||||
|
@ -528,8 +547,9 @@ int Voice::dsp_float_interpolate_7th_order(unsigned n)
|
||||||
/* increment phase and amplitude */
|
/* increment phase and amplitude */
|
||||||
dsp_phase += dsp_phase_incr;
|
dsp_phase += dsp_phase_incr;
|
||||||
dsp_phase_index = dsp_phase.index();
|
dsp_phase_index = dsp_phase.index();
|
||||||
updateAmpInc(nextNewAmpInc, curSample2AmpInc, dsp_amp_incr, dsp_i);
|
if (!updateAmpInc(nextNewAmpInc, curSample2AmpInc, dsp_amp_incr, dsp_i))
|
||||||
dsp_amp += dsp_amp_incr;
|
return dsp_i;
|
||||||
|
amp += dsp_amp_incr;
|
||||||
}
|
}
|
||||||
|
|
||||||
start_index++;
|
start_index++;
|
||||||
|
@ -538,7 +558,7 @@ int Voice::dsp_float_interpolate_7th_order(unsigned n)
|
||||||
for ( ; dsp_phase_index == start_index && dsp_i < n; dsp_i++) {
|
for ( ; dsp_phase_index == start_index && dsp_i < n; dsp_i++) {
|
||||||
coeffs = sinc_table7[fluid_phase_fract_to_tablerow (dsp_phase)];
|
coeffs = sinc_table7[fluid_phase_fract_to_tablerow (dsp_phase)];
|
||||||
|
|
||||||
dsp_buf[dsp_i] = dsp_amp * (coeffs[0] * (float)start_points[0]
|
dsp_buf[dsp_i] = amp * (coeffs[0] * (float)start_points[0]
|
||||||
+ coeffs[1] * (float)dsp_data[dsp_phase_index-2]
|
+ coeffs[1] * (float)dsp_data[dsp_phase_index-2]
|
||||||
+ coeffs[2] * (float)dsp_data[dsp_phase_index-1]
|
+ coeffs[2] * (float)dsp_data[dsp_phase_index-1]
|
||||||
+ coeffs[3] * (float)dsp_data[dsp_phase_index]
|
+ coeffs[3] * (float)dsp_data[dsp_phase_index]
|
||||||
|
@ -549,8 +569,9 @@ int Voice::dsp_float_interpolate_7th_order(unsigned n)
|
||||||
/* increment phase and amplitude */
|
/* increment phase and amplitude */
|
||||||
dsp_phase += dsp_phase_incr;
|
dsp_phase += dsp_phase_incr;
|
||||||
dsp_phase_index = dsp_phase.index();
|
dsp_phase_index = dsp_phase.index();
|
||||||
updateAmpInc(nextNewAmpInc, curSample2AmpInc, dsp_amp_incr, dsp_i);
|
if (!updateAmpInc(nextNewAmpInc, curSample2AmpInc, dsp_amp_incr, dsp_i))
|
||||||
dsp_amp += dsp_amp_incr;
|
return dsp_i;
|
||||||
|
amp += dsp_amp_incr;
|
||||||
}
|
}
|
||||||
|
|
||||||
start_index -= 2; /* set back to original start index */
|
start_index -= 2; /* set back to original start index */
|
||||||
|
@ -559,7 +580,7 @@ int Voice::dsp_float_interpolate_7th_order(unsigned n)
|
||||||
for ( ; dsp_i < n && dsp_phase_index <= end_index; dsp_i++) {
|
for ( ; dsp_i < n && dsp_phase_index <= end_index; dsp_i++) {
|
||||||
coeffs = sinc_table7[fluid_phase_fract_to_tablerow (dsp_phase)];
|
coeffs = sinc_table7[fluid_phase_fract_to_tablerow (dsp_phase)];
|
||||||
|
|
||||||
dsp_buf[dsp_i] = dsp_amp * (coeffs[0] * (float)dsp_data[dsp_phase_index-3]
|
dsp_buf[dsp_i] = amp * (coeffs[0] * (float)dsp_data[dsp_phase_index-3]
|
||||||
+ coeffs[1] * (float)dsp_data[dsp_phase_index-2]
|
+ coeffs[1] * (float)dsp_data[dsp_phase_index-2]
|
||||||
+ coeffs[2] * (float)dsp_data[dsp_phase_index-1]
|
+ coeffs[2] * (float)dsp_data[dsp_phase_index-1]
|
||||||
+ coeffs[3] * (float)dsp_data[dsp_phase_index]
|
+ coeffs[3] * (float)dsp_data[dsp_phase_index]
|
||||||
|
@ -570,8 +591,9 @@ int Voice::dsp_float_interpolate_7th_order(unsigned n)
|
||||||
/* increment phase and amplitude */
|
/* increment phase and amplitude */
|
||||||
dsp_phase += dsp_phase_incr;
|
dsp_phase += dsp_phase_incr;
|
||||||
dsp_phase_index = dsp_phase.index();
|
dsp_phase_index = dsp_phase.index();
|
||||||
updateAmpInc(nextNewAmpInc, curSample2AmpInc, dsp_amp_incr, dsp_i);
|
if (!updateAmpInc(nextNewAmpInc, curSample2AmpInc, dsp_amp_incr, dsp_i))
|
||||||
dsp_amp += dsp_amp_incr;
|
return dsp_i;
|
||||||
|
amp += dsp_amp_incr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* break out if buffer filled */
|
/* break out if buffer filled */
|
||||||
|
@ -584,7 +606,7 @@ int Voice::dsp_float_interpolate_7th_order(unsigned n)
|
||||||
for (; dsp_phase_index <= end_index && dsp_i < n; dsp_i++) {
|
for (; dsp_phase_index <= end_index && dsp_i < n; dsp_i++) {
|
||||||
coeffs = sinc_table7[fluid_phase_fract_to_tablerow (dsp_phase)];
|
coeffs = sinc_table7[fluid_phase_fract_to_tablerow (dsp_phase)];
|
||||||
|
|
||||||
dsp_buf[dsp_i] = dsp_amp * (coeffs[0] * (float)dsp_data[dsp_phase_index-3]
|
dsp_buf[dsp_i] = amp * (coeffs[0] * (float)dsp_data[dsp_phase_index-3]
|
||||||
+ coeffs[1] * (float)dsp_data[dsp_phase_index-2]
|
+ coeffs[1] * (float)dsp_data[dsp_phase_index-2]
|
||||||
+ coeffs[2] * (float)dsp_data[dsp_phase_index-1]
|
+ coeffs[2] * (float)dsp_data[dsp_phase_index-1]
|
||||||
+ coeffs[3] * (float)dsp_data[dsp_phase_index]
|
+ coeffs[3] * (float)dsp_data[dsp_phase_index]
|
||||||
|
@ -595,8 +617,9 @@ int Voice::dsp_float_interpolate_7th_order(unsigned n)
|
||||||
/* increment phase and amplitude */
|
/* increment phase and amplitude */
|
||||||
dsp_phase += dsp_phase_incr;
|
dsp_phase += dsp_phase_incr;
|
||||||
dsp_phase_index = dsp_phase.index();
|
dsp_phase_index = dsp_phase.index();
|
||||||
updateAmpInc(nextNewAmpInc, curSample2AmpInc, dsp_amp_incr, dsp_i);
|
if (!updateAmpInc(nextNewAmpInc, curSample2AmpInc, dsp_amp_incr, dsp_i))
|
||||||
dsp_amp += dsp_amp_incr;
|
return dsp_i;
|
||||||
|
amp += dsp_amp_incr;
|
||||||
}
|
}
|
||||||
|
|
||||||
end_index++; /* we're now interpolating the 2nd to last point */
|
end_index++; /* we're now interpolating the 2nd to last point */
|
||||||
|
@ -605,7 +628,7 @@ int Voice::dsp_float_interpolate_7th_order(unsigned n)
|
||||||
for (; dsp_phase_index <= end_index && dsp_i < n; dsp_i++) {
|
for (; dsp_phase_index <= end_index && dsp_i < n; dsp_i++) {
|
||||||
coeffs = sinc_table7[fluid_phase_fract_to_tablerow (dsp_phase)];
|
coeffs = sinc_table7[fluid_phase_fract_to_tablerow (dsp_phase)];
|
||||||
|
|
||||||
dsp_buf[dsp_i] = dsp_amp * (coeffs[0] * (float)dsp_data[dsp_phase_index-3]
|
dsp_buf[dsp_i] = amp * (coeffs[0] * (float)dsp_data[dsp_phase_index-3]
|
||||||
+ coeffs[1] * (float)dsp_data[dsp_phase_index-2]
|
+ coeffs[1] * (float)dsp_data[dsp_phase_index-2]
|
||||||
+ coeffs[2] * (float)dsp_data[dsp_phase_index-1]
|
+ coeffs[2] * (float)dsp_data[dsp_phase_index-1]
|
||||||
+ coeffs[3] * (float)dsp_data[dsp_phase_index]
|
+ coeffs[3] * (float)dsp_data[dsp_phase_index]
|
||||||
|
@ -616,8 +639,9 @@ int Voice::dsp_float_interpolate_7th_order(unsigned n)
|
||||||
/* increment phase and amplitude */
|
/* increment phase and amplitude */
|
||||||
dsp_phase += dsp_phase_incr;
|
dsp_phase += dsp_phase_incr;
|
||||||
dsp_phase_index = dsp_phase.index();
|
dsp_phase_index = dsp_phase.index();
|
||||||
updateAmpInc(nextNewAmpInc, curSample2AmpInc, dsp_amp_incr, dsp_i);
|
if (!updateAmpInc(nextNewAmpInc, curSample2AmpInc, dsp_amp_incr, dsp_i))
|
||||||
dsp_amp += dsp_amp_incr;
|
return dsp_i;
|
||||||
|
amp += dsp_amp_incr;
|
||||||
}
|
}
|
||||||
|
|
||||||
end_index++; /* we're now interpolating the last point */
|
end_index++; /* we're now interpolating the last point */
|
||||||
|
@ -626,7 +650,7 @@ int Voice::dsp_float_interpolate_7th_order(unsigned n)
|
||||||
for (; dsp_phase_index <= end_index && dsp_i < n; dsp_i++) {
|
for (; dsp_phase_index <= end_index && dsp_i < n; dsp_i++) {
|
||||||
coeffs = sinc_table7[fluid_phase_fract_to_tablerow (dsp_phase)];
|
coeffs = sinc_table7[fluid_phase_fract_to_tablerow (dsp_phase)];
|
||||||
|
|
||||||
dsp_buf[dsp_i] = dsp_amp * (coeffs[0] * (float)dsp_data[dsp_phase_index-3]
|
dsp_buf[dsp_i] = amp * (coeffs[0] * (float)dsp_data[dsp_phase_index-3]
|
||||||
+ coeffs[1] * (float)dsp_data[dsp_phase_index-2]
|
+ coeffs[1] * (float)dsp_data[dsp_phase_index-2]
|
||||||
+ coeffs[2] * (float)dsp_data[dsp_phase_index-1]
|
+ coeffs[2] * (float)dsp_data[dsp_phase_index-1]
|
||||||
+ coeffs[3] * (float)dsp_data[dsp_phase_index]
|
+ coeffs[3] * (float)dsp_data[dsp_phase_index]
|
||||||
|
@ -637,8 +661,9 @@ int Voice::dsp_float_interpolate_7th_order(unsigned n)
|
||||||
/* increment phase and amplitude */
|
/* increment phase and amplitude */
|
||||||
dsp_phase += dsp_phase_incr;
|
dsp_phase += dsp_phase_incr;
|
||||||
dsp_phase_index = dsp_phase.index();
|
dsp_phase_index = dsp_phase.index();
|
||||||
updateAmpInc(nextNewAmpInc, curSample2AmpInc, dsp_amp_incr, dsp_i);
|
if (!updateAmpInc(nextNewAmpInc, curSample2AmpInc, dsp_amp_incr, dsp_i))
|
||||||
dsp_amp += dsp_amp_incr;
|
return dsp_i;
|
||||||
|
amp += dsp_amp_incr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!looping)
|
if (!looping)
|
||||||
|
@ -668,7 +693,6 @@ int Voice::dsp_float_interpolate_7th_order(unsigned n)
|
||||||
dsp_phase -= (Phase)0x80000000;
|
dsp_phase -= (Phase)0x80000000;
|
||||||
|
|
||||||
voice->phase = dsp_phase;
|
voice->phase = dsp_phase;
|
||||||
voice->amp = dsp_amp;
|
|
||||||
|
|
||||||
return dsp_i;
|
return dsp_i;
|
||||||
}
|
}
|
||||||
|
|
|
@ -332,6 +332,7 @@ void Voice::write(unsigned n, float* out, float* reverb, float* chorus)
|
||||||
|
|
||||||
int modLfoStart = -1;
|
int modLfoStart = -1;
|
||||||
|
|
||||||
|
if (fabs(modlfo_to_vol) > 0) {
|
||||||
if (ticks >= modlfo_delay)
|
if (ticks >= modlfo_delay)
|
||||||
modLfoStart = 0;
|
modLfoStart = 0;
|
||||||
else if (n >= modlfo_delay)
|
else if (n >= modlfo_delay)
|
||||||
|
@ -349,6 +350,7 @@ void Voice::write(unsigned n, float* out, float* reverb, float* chorus)
|
||||||
modLfoNextTurn += samplesToNextTurningPoint(modlfo_dur, modLfoNextTurn);
|
modLfoNextTurn += samplesToNextTurningPoint(modlfo_dur, modLfoNextTurn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fluid_check_fpe ("voice_write mod LFO");
|
fluid_check_fpe ("voice_write mod LFO");
|
||||||
|
|
||||||
|
@ -425,12 +427,6 @@ void Voice::write(unsigned n, float* out, float* reverb, float* chorus)
|
||||||
* fluid_cb2amp (960.0f * (1.0f - volenv_val)
|
* fluid_cb2amp (960.0f * (1.0f - volenv_val)
|
||||||
+ modlfo_val * -modlfo_to_vol);
|
+ modlfo_val * -modlfo_to_vol);
|
||||||
|
|
||||||
// REMOVED DUE TO CHANGE IN ENVELOPE CALCULATION
|
|
||||||
// is an optimization
|
|
||||||
// TODO: Make it work again with sample based volume
|
|
||||||
|
|
||||||
/* We turn off a voice, if the volume has dropped low enough. */
|
|
||||||
|
|
||||||
/* A voice can be turned off, when an estimate for the volume
|
/* A voice can be turned off, when an estimate for the volume
|
||||||
* (upper bound) falls below that volume, that will drop the
|
* (upper bound) falls below that volume, that will drop the
|
||||||
* sample below the noise floor.
|
* sample below the noise floor.
|
||||||
|
@ -440,11 +436,12 @@ void Voice::write(unsigned n, float* out, float* reverb, float* chorus)
|
||||||
* the sample loop
|
* the sample loop
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
float amplitude_that_reaches_noise_floor;
|
||||||
/* Is the playing pointer already in the loop? */
|
/* Is the playing pointer already in the loop? */
|
||||||
/*if (has_looped)
|
if (has_looped)
|
||||||
amplitude_that_reaches_noise_floor = amplitude_that_reaches_noise_floor_loop;
|
amplitude_that_reaches_noise_floor = amplitude_that_reaches_noise_floor_loop;
|
||||||
else
|
else
|
||||||
amplitude_that_reaches_noise_floor = amplitude_that_reaches_noise_floor_nonloop;*/
|
amplitude_that_reaches_noise_floor = amplitude_that_reaches_noise_floor_nonloop;
|
||||||
|
|
||||||
/* voice->attenuation_min is a lower boundary for the attenuation
|
/* voice->attenuation_min is a lower boundary for the attenuation
|
||||||
* now and in the future (possibly 0 in the worst case). Now the
|
* now and in the future (possibly 0 in the worst case). Now the
|
||||||
|
@ -452,16 +449,15 @@ void Voice::write(unsigned n, float* out, float* reverb, float* chorus)
|
||||||
* volenv_val can only drop):
|
* volenv_val can only drop):
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//amp_max = fluid_atten2amp (min_attenuation_cB) * volenv_val;
|
float amp_max = fluid_atten2amp (min_attenuation_cB) * volenv_val;
|
||||||
|
|
||||||
/* And if amp_max is already smaller than the known amplitude,
|
/* And if amp_max is already smaller than the known amplitude,
|
||||||
* which will attenuate the sample below the noise floor, then we
|
* which will attenuate the sample below the noise floor, then we
|
||||||
* can safely turn off the voice. Duh. */
|
* can safely turn off the voice. Duh. */
|
||||||
/*if (amp_max < amplitude_that_reaches_noise_floor) {
|
if (amp_max < amplitude_that_reaches_noise_floor) {
|
||||||
off();
|
positionToTurnOff = curPos;
|
||||||
ticks += n;
|
}
|
||||||
return;
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (curVolEnvSection->second != oldVolEnvSection->second) {
|
if (curVolEnvSection->second != oldVolEnvSection->second) {
|
||||||
|
@ -476,6 +472,11 @@ void Voice::write(unsigned n, float* out, float* reverb, float* chorus)
|
||||||
amp_incr = (target_amp - oldTargetAmp) / (curPos - lastPos);
|
amp_incr = (target_amp - oldTargetAmp) / (curPos - lastPos);
|
||||||
lastPos = curPos;
|
lastPos = curPos;
|
||||||
Sample2AmpInc.insert(std::pair<int, qreal>(curPos, amp_incr));
|
Sample2AmpInc.insert(std::pair<int, qreal>(curPos, amp_incr));
|
||||||
|
|
||||||
|
// if voice is turned off after this no need to calculate any more values
|
||||||
|
if (positionToTurnOff > 0)
|
||||||
|
break;
|
||||||
|
|
||||||
oldTargetAmp = target_amp;
|
oldTargetAmp = target_amp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -486,17 +487,6 @@ void Voice::write(unsigned n, float* out, float* reverb, float* chorus)
|
||||||
|
|
||||||
fluid_check_fpe ("voice_write amplitude calculation");
|
fluid_check_fpe ("voice_write amplitude calculation");
|
||||||
|
|
||||||
// REMOVED DUE TO CHANGE IN ENVELOPE CALCULATION
|
|
||||||
// is an optimization
|
|
||||||
// TODO: Make it work again with sample based volume
|
|
||||||
|
|
||||||
/* no volume and not changing? - No need to process */
|
|
||||||
|
|
||||||
//if ((amp == 0.0f) && (amp_incr == 0.0f)) {
|
|
||||||
// ticks += n;
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
|
|
||||||
/* Calculate the number of samples, that the DSP loop advances
|
/* Calculate the number of samples, that the DSP loop advances
|
||||||
* through the original waveform with each step in the output
|
* through the original waveform with each step in the output
|
||||||
* buffer. It is the ratio between the frequencies of original
|
* buffer. It is the ratio between the frequencies of original
|
||||||
|
@ -622,6 +612,7 @@ void Voice::write(unsigned n, float* out, float* reverb, float* chorus)
|
||||||
|
|
||||||
float l_dsp_buf[n];
|
float l_dsp_buf[n];
|
||||||
dsp_buf = l_dsp_buf;
|
dsp_buf = l_dsp_buf;
|
||||||
|
memset(dsp_buf, 0, n*sizeof(float)); // init the arry with zeros so we can skip silent parts
|
||||||
unsigned count;
|
unsigned count;
|
||||||
switch (interp_method) {
|
switch (interp_method) {
|
||||||
case FLUID_INTERP_NONE:
|
case FLUID_INTERP_NONE:
|
||||||
|
@ -642,8 +633,8 @@ void Voice::write(unsigned n, float* out, float* reverb, float* chorus)
|
||||||
if (count > 0)
|
if (count > 0)
|
||||||
effects(count, out, reverb, chorus);
|
effects(count, out, reverb, chorus);
|
||||||
|
|
||||||
/* turn off voice if short count (sample ended and not looping) */
|
/* turn off voice if short count (sample ended and not looping) or voice reached noise floor*/
|
||||||
if (count < n)
|
if (count < n || positionToTurnOff > 0)
|
||||||
off();
|
off();
|
||||||
|
|
||||||
ticks += n;
|
ticks += n;
|
||||||
|
@ -792,6 +783,7 @@ void Voice::voice_start()
|
||||||
* This cannot be done earlier, because it depends on modulators.
|
* This cannot be done earlier, because it depends on modulators.
|
||||||
*/
|
*/
|
||||||
check_sample_sanity_flag = FLUID_SAMPLESANITY_STARTUP;
|
check_sample_sanity_flag = FLUID_SAMPLESANITY_STARTUP;
|
||||||
|
positionToTurnOff = -1;
|
||||||
|
|
||||||
status = FLUID_VOICE_ON;
|
status = FLUID_VOICE_ON;
|
||||||
}
|
}
|
||||||
|
|
|
@ -120,6 +120,7 @@ class Voice
|
||||||
float volenv_val;
|
float volenv_val;
|
||||||
float amplitude_that_reaches_noise_floor_nonloop;
|
float amplitude_that_reaches_noise_floor_nonloop;
|
||||||
float amplitude_that_reaches_noise_floor_loop;
|
float amplitude_that_reaches_noise_floor_loop;
|
||||||
|
int positionToTurnOff; // this is the sample accurate position where the sample reaches the noise floor
|
||||||
|
|
||||||
/* mod env */
|
/* mod env */
|
||||||
fluid_env_data_t modenv_data[FLUID_VOICE_ENVLAST];
|
fluid_env_data_t modenv_data[FLUID_VOICE_ENVLAST];
|
||||||
|
@ -234,6 +235,7 @@ class Voice
|
||||||
void add_mod(const Mod* mod, int mode);
|
void add_mod(const Mod* mod, int mode);
|
||||||
|
|
||||||
static void dsp_float_config();
|
static void dsp_float_config();
|
||||||
|
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_none(unsigned);
|
||||||
int dsp_float_interpolate_linear(unsigned);
|
int dsp_float_interpolate_linear(unsigned);
|
||||||
int dsp_float_interpolate_4th_order(unsigned);
|
int dsp_float_interpolate_4th_order(unsigned);
|
||||||
|
|
Loading…
Reference in a new issue