From 4a089a19dc1ed243f4f033d1d0eb91fae683bbe3 Mon Sep 17 00:00:00 2001 From: Fawn Date: Sat, 8 Feb 2025 21:50:02 -0700 Subject: [PATCH] Update math functions to C++ standard library (#7685) * use c++ std::* math functions This updates usages of sin, cos, tan, pow, exp, log, log10, sqrt, fmod, fabs, and fabsf, excluding any usages that look like they might be part of a submodule or 3rd-party code. There's probably some std math functions not listed here that haven't been updated yet. * fix std::sqrt typo lmao one always sneaks by * Apply code review suggestions - std::pow(2, x) -> std::exp2(x) - std::pow(10, x) -> lmms::fastPow10f(x) - std::pow(x, 2) -> x * x, std::pow(x, 3) -> x * x * x, etc. - Resolve TODOs, fix typos, and so forth Co-authored-by: Rossmaxx <74815851+Rossmaxx@users.noreply.github.com> * Fix double -> float truncation, DrumSynth fix I mistakenly introduced a bug in my recent PR regarding template constants, in which a -1 that was supposed to appear outside of an abs() instead was moved inside it, screwing up the generated waveform. I fixed that and also simplified the function by factoring out the phase domain wrapping using the new `ediv()` function from this PR. It should behave how it's supposed to now... assuming all my parentheses are in the right place lol * Annotate magic numbers with TODOs for C++20 * On second thought, why wait? What else is lmms::numbers for? * begone inline Co-authored-by: Rossmaxx <74815851+Rossmaxx@users.noreply.github.com> * begone other inline Co-authored-by: Rossmaxx <74815851+Rossmaxx@users.noreply.github.com> * Re-inline function in lmms_math.h For functions, constexpr implies inline so this just re-adds inline to the one that isn't constexpr yet * Formatting fixes, readability improvements Co-authored-by: Dalton Messmer * Fix previously missed pow() calls, cleanup Co-authored-by: Dalton Messmer * Just delete ediv() entirely lmao No ediv(), no std::fmod(), no std::remainder(), just std::floor(). It should all work for negative phase inputs as well. If I end up needing ediv() in the future, I can add it then. * Simplify DrumSynth triangle waveform This reuses more work and is also a lot more easy to visualize. It's probably a meaningless micro-optimization, but it might be worth changing it back to a switch-case and just calculating ph_tau and saw01 at the beginning of the function in all code paths, even if it goes unused for the first two cases. Guess I'll see if anybody has strong opinions about it. * Move multiplication inside abs() * Clean up a few more pow(x, 2) -> x * x * Remove numbers::inv_pi, numbers::inv_tau * delete spooky leading 0 Co-authored-by: Dalton Messmer --------- Co-authored-by: Rossmaxx <74815851+Rossmaxx@users.noreply.github.com> Co-authored-by: Dalton Messmer --- include/BasicFilters.h | 4 +- include/DspEffectLibrary.h | 8 +- include/QuadratureLfo.h | 7 +- include/RmsHelper.h | 2 +- include/lmms_constants.h | 1 + include/lmms_math.h | 2 +- plugins/BitInvader/BitInvader.cpp | 6 +- plugins/Compressor/Compressor.cpp | 28 ++----- plugins/Compressor/Compressor.h | 2 - plugins/Delay/Lfo.cpp | 2 +- plugins/Eq/EqCurve.cpp | 51 ++++++------ plugins/Eq/EqFilter.h | 34 ++++---- plugins/Eq/EqSpectrumView.cpp | 4 +- plugins/GigPlayer/GigPlayer.cpp | 6 +- plugins/LOMM/LOMM.cpp | 4 +- plugins/LOMM/LOMM.h | 2 +- plugins/Lb302/Lb302.cpp | 20 ++--- plugins/Monstro/Monstro.cpp | 20 ++--- plugins/Nes/Nes.cpp | 6 +- plugins/OpulenZ/OpulenZ.cpp | 4 +- plugins/Organic/Organic.cpp | 14 ++-- plugins/ReverbSC/ReverbSC.cpp | 11 ++- plugins/Sf2Player/Sf2Player.cpp | 2 +- plugins/Sfxr/Sfxr.cpp | 71 ++++++++-------- plugins/Sid/SidInstrument.cpp | 4 +- plugins/SpectrumAnalyzer/SaProcessor.cpp | 27 +++--- plugins/SpectrumAnalyzer/SaSpectrumView.cpp | 17 ++-- plugins/TripleOscillator/TripleOscillator.cpp | 10 +-- plugins/Watsyn/Watsyn.cpp | 28 +++---- plugins/Xpressive/ExprSynth.cpp | 4 +- src/core/AutomationClip.cpp | 3 +- src/core/DrumSynth.cpp | 83 +++++++------------ src/core/LadspaManager.cpp | 11 ++- src/core/Microtuner.cpp | 6 +- src/core/MixHelpers.cpp | 2 +- src/core/NotePlayHandle.cpp | 8 +- src/core/Oscillator.cpp | 4 +- src/core/Scale.cpp | 4 +- src/core/audio/AudioSoundIo.cpp | 2 +- src/core/lv2/Lv2Proc.cpp | 2 +- src/gui/GuiApplication.cpp | 2 +- src/gui/clips/ClipView.cpp | 4 +- src/gui/editors/AutomationEditor.cpp | 2 +- src/gui/editors/PianoRoll.cpp | 4 +- src/gui/instrument/PianoView.cpp | 4 +- src/gui/widgets/Graph.cpp | 2 +- src/gui/widgets/Knob.cpp | 4 +- src/gui/widgets/LcdFloatSpinBox.cpp | 3 +- 48 files changed, 256 insertions(+), 295 deletions(-) diff --git a/include/BasicFilters.h b/include/BasicFilters.h index 1ca68d82f..c4664009c 100644 --- a/include/BasicFilters.h +++ b/include/BasicFilters.h @@ -806,8 +806,8 @@ public: // other filters _freq = std::clamp(_freq, minFreq(), 20000.0f); const float omega = numbers::tau_v * _freq * m_sampleRatio; - const float tsin = sinf( omega ) * 0.5f; - const float tcos = cosf( omega ); + const float tsin = std::sin(omega) * 0.5f; + const float tcos = std::cos(omega); const float alpha = tsin / _q; diff --git a/include/DspEffectLibrary.h b/include/DspEffectLibrary.h index ddd7dc14d..55afb69f7 100644 --- a/include/DspEffectLibrary.h +++ b/include/DspEffectLibrary.h @@ -289,7 +289,7 @@ namespace lmms::DspEffectLibrary { if( in >= m_threshold || in < -m_threshold ) { - return ( fabsf( fabsf( fmodf( in - m_threshold, m_threshold*4 ) ) - m_threshold*2 ) - m_threshold ) * m_gain; + return (std::abs(std::abs(std::fmod(in - m_threshold, m_threshold * 4)) - m_threshold * 2) - m_threshold) * m_gain; } return in * m_gain; } @@ -303,7 +303,7 @@ namespace lmms::DspEffectLibrary sample_t nextSample( sample_t in ) { - return m_gain * ( in * ( fabsf( in )+m_threshold ) / ( in*in +( m_threshold-1 )* fabsf( in ) + 1 ) ); + return m_gain * (in * (std::abs(in) + m_threshold) / (in * in + (m_threshold - 1) * std::abs(in) + 1)); } } ; @@ -330,8 +330,8 @@ namespace lmms::DspEffectLibrary { const float toRad = numbers::pi_v / 180; const sample_t tmp = inLeft; - inLeft += inRight * sinf( m_wideCoeff * ( .5 * toRad ) ); - inRight -= tmp * sinf( m_wideCoeff * ( .5 * toRad ) ); + inLeft += inRight * std::sin(m_wideCoeff * toRad * .5f); + inRight -= tmp * std::sin(m_wideCoeff * toRad * .5f); } private: diff --git a/include/QuadratureLfo.h b/include/QuadratureLfo.h index 7d4190cf0..72734a8b0 100644 --- a/include/QuadratureLfo.h +++ b/include/QuadratureLfo.h @@ -77,11 +77,10 @@ public: void tick( float *l, float *r ) { - *l = sinf( m_phase ); - *r = sinf( m_phase + m_offset ); + *l = std::sin(m_phase); + *r = std::sin(m_phase + m_offset); m_phase += m_increment; - - while (m_phase >= numbers::tau) { m_phase -= numbers::tau; } + while (m_phase >= numbers::tau) { m_phase -= numbers::tau; } } private: diff --git a/include/RmsHelper.h b/include/RmsHelper.h index a50d5ff6d..ae0fb71b3 100644 --- a/include/RmsHelper.h +++ b/include/RmsHelper.h @@ -84,7 +84,7 @@ public: m_sum -= m_buffer[ m_pos ]; m_sum += m_buffer[ m_pos ] = in * in; ++m_pos %= m_size; - return sqrtf( m_sum * m_sizef ); + return std::sqrt(m_sum * m_sizef); } private: diff --git a/include/lmms_constants.h b/include/lmms_constants.h index 266604fa8..6ac0fac77 100644 --- a/include/lmms_constants.h +++ b/include/lmms_constants.h @@ -65,6 +65,7 @@ inline constexpr double inv_e = e_v; //TODO C++20: Use std::floating_point instead of typename //TODO C++20: Use std::numbers::sqrt2_v instead of literal value +//TODO C++26: Remove since std::sqrt(2.0) is constexpr template inline constexpr T sqrt2_v = T(1.41421356237309504880168872420969807856967187537695); inline constexpr double sqrt2 = sqrt2_v; diff --git a/include/lmms_math.h b/include/lmms_math.h index 9d1088a01..be58e6805 100644 --- a/include/lmms_math.h +++ b/include/lmms_math.h @@ -119,7 +119,7 @@ inline float sign(float val) } -//! if val >= 0.0f, returns sqrtf(val), else: -sqrtf(-val) +//! if val >= 0.0f, returns sqrt(val), else: -sqrt(-val) inline float sqrt_neg(float val) { return std::sqrt(std::abs(val)) * sign(val); diff --git a/plugins/BitInvader/BitInvader.cpp b/plugins/BitInvader/BitInvader.cpp index 8d9bef4d3..2f31449c7 100644 --- a/plugins/BitInvader/BitInvader.cpp +++ b/plugins/BitInvader/BitInvader.cpp @@ -86,7 +86,7 @@ BSynth::BSynth( float * _shape, NotePlayHandle * _nph, bool _interpolation, i.e., the absolute value of all samples is <= 1.0 if _factor is different to the default normalization factor. If there is a value > 1.0, clip the sample to 1.0 to limit the range. */ - if ((_factor != defaultNormalizationFactor) && (fabsf(buf) > 1.0f)) + if ((_factor != defaultNormalizationFactor) && (std::abs(buf) > 1.0f)) { buf = (buf < 0) ? -1.0f : 1.0f; } @@ -238,7 +238,7 @@ void BitInvader::normalize() const float* samples = m_graph.samples(); for(int i=0; i < m_graph.length(); i++) { - const float f = fabsf( samples[i] ); + const float f = std::abs(samples[i]); if (f > max) { max = f; } } m_normalizeFactor = 1.0 / max; @@ -554,4 +554,4 @@ PLUGIN_EXPORT Plugin * lmms_plugin_main( Model *m, void * ) } -} // namespace lmms \ No newline at end of file +} // namespace lmms diff --git a/plugins/Compressor/Compressor.cpp b/plugins/Compressor/Compressor.cpp index 78d695750..06d4f1d0d 100755 --- a/plugins/Compressor/Compressor.cpp +++ b/plugins/Compressor/Compressor.cpp @@ -61,7 +61,7 @@ CompressorEffect::CompressorEffect(Model* parent, const Descriptor::SubPluginFea m_yL[0] = m_yL[1] = COMP_NOISE_FLOOR; // 200 ms - m_crestTimeConst = exp(-1.f / (0.2f * m_sampleRate)); + m_crestTimeConst = std::exp(-1.f / (0.2f * m_sampleRate)); connect(&m_compressorControls.m_attackModel, SIGNAL(dataChanged()), this, SLOT(calcAttack()), Qt::DirectConnection); connect(&m_compressorControls.m_releaseModel, SIGNAL(dataChanged()), this, SLOT(calcRelease()), Qt::DirectConnection); @@ -97,7 +97,7 @@ CompressorEffect::CompressorEffect(Model* parent, const Descriptor::SubPluginFea float CompressorEffect::msToCoeff(float ms) { // Convert time in milliseconds to applicable lowpass coefficient - return exp(m_coeffPrecalc / ms); + return std::exp(m_coeffPrecalc / ms); } @@ -175,7 +175,7 @@ void CompressorEffect::calcRange() void CompressorEffect::resizeRMS() { const float rmsValue = m_compressorControls.m_rmsModel.value(); - m_rmsTimeConst = (rmsValue > 0) ? exp(-1.f / (rmsValue * 0.001f * m_sampleRate)) : 0; + m_rmsTimeConst = (rmsValue > 0) ? std::exp(-1.f / (rmsValue * 0.001f * m_sampleRate)) : 0; } void CompressorEffect::calcLookaheadLength() @@ -211,14 +211,14 @@ void CompressorEffect::calcTiltCoeffs() { m_tiltVal = m_compressorControls.m_tiltModel.value(); - const float amp = 6 / log(2); + const float amp = 6.f / std::log(2.f); const float gfactor = 5; const float g1 = m_tiltVal > 0 ? -gfactor * m_tiltVal : -m_tiltVal; const float g2 = m_tiltVal > 0 ? m_tiltVal : gfactor * m_tiltVal; - m_lgain = exp(g1 / amp) - 1; - m_hgain = exp(g2 / amp) - 1; + m_lgain = std::exp(g1 / amp) - 1; + m_hgain = std::exp(g2 / amp) - 1; const float omega = numbers::tau_v * m_compressorControls.m_tiltFreqModel.value(); const float n = 1 / (m_sampleRate * 3 + omega); @@ -528,20 +528,6 @@ void CompressorEffect::processBypassedImpl() } } -// Regular modulo doesn't handle negative numbers correctly. This does. -inline int CompressorEffect::realmod(int k, int n) -{ - return (k %= n) < 0 ? k+n : k; -} - -// Regular fmod doesn't handle negative numbers correctly. This does. -inline float CompressorEffect::realfmod(float k, float n) -{ - return (k = fmod(k, n)) < 0 ? k+n : k; -} - - - inline void CompressorEffect::calcTiltFilter(sample_t inputSample, sample_t &outputSample, int filtNum) { m_tiltOut[filtNum] = m_a0 * inputSample + m_b1 * m_tiltOut[filtNum]; @@ -557,7 +543,7 @@ void CompressorEffect::changeSampleRate() m_coeffPrecalc = COMP_LOG / (m_sampleRate * 0.001f); // 200 ms - m_crestTimeConst = exp(-1.f / (0.2f * m_sampleRate)); + m_crestTimeConst = std::exp(-1.f / (0.2f * m_sampleRate)); m_lookBufLength = std::ceil((20.f / 1000.f) * m_sampleRate) + 2; for (int i = 0; i < 2; ++i) diff --git a/plugins/Compressor/Compressor.h b/plugins/Compressor/Compressor.h index d4c9625c9..f5649411a 100755 --- a/plugins/Compressor/Compressor.h +++ b/plugins/Compressor/Compressor.h @@ -78,8 +78,6 @@ private: float msToCoeff(float ms); inline void calcTiltFilter(sample_t inputSample, sample_t &outputSample, int filtNum); - inline int realmod(int k, int n); - inline float realfmod(float k, float n); enum class StereoLinkMode { Unlinked, Maximum, Average, Minimum, Blend }; diff --git a/plugins/Delay/Lfo.cpp b/plugins/Delay/Lfo.cpp index a6d490d40..e4e002b79 100644 --- a/plugins/Delay/Lfo.cpp +++ b/plugins/Delay/Lfo.cpp @@ -41,7 +41,7 @@ Lfo::Lfo( int samplerate ) float Lfo::tick() { - float output = sinf( m_phase ); + float output = std::sin(m_phase); m_phase += m_increment; return output; diff --git a/plugins/Eq/EqCurve.cpp b/plugins/Eq/EqCurve.cpp index e0d2e43d3..a0654054b 100644 --- a/plugins/Eq/EqCurve.cpp +++ b/plugins/Eq/EqCurve.cpp @@ -68,10 +68,10 @@ QRectF EqHandle::boundingRect() const float EqHandle::freqToXPixel( float freq , int w ) { if (approximatelyEqual(freq, 0.0f)) { return 0.0f; } - float min = log10f( 20 ); - float max = log10f( 20000 ); + float min = std::log10(20); + float max = std::log10(20000); float range = max - min; - return ( log10f( freq ) - min ) / range * w; + return (std::log10(freq) - min) / range * w; } @@ -79,10 +79,10 @@ float EqHandle::freqToXPixel( float freq , int w ) float EqHandle::xPixelToFreq( float x , int w ) { - float min = log10f( 20 ); - float max = log10f( 20000 ); + float min = std::log10(20); + float max = std::log10(20000); float range = max - min; - return powf( 10 , x * ( range / w ) + min ); + return fastPow10f(x * (range / w) + min); } @@ -202,11 +202,11 @@ float EqHandle::getPeakCurve( float x ) { double freqZ = xPixelToFreq( EqHandle::x(), m_width ); double w0 = numbers::tau * freqZ / Engine::audioEngine()->outputSampleRate(); - double c = cosf( w0 ); - double s = sinf( w0 ); + double c = std::cos(w0); + double s = std::sin(w0); double Q = getResonance(); - double A = pow( 10, yPixelToGain( EqHandle::y(), m_heigth, m_pixelsPerUnitHeight ) / 40 ); - double alpha = s * sinh( log( 2 ) / 2 * Q * w0 / sinf( w0 ) ); + double A = fastPow10f(yPixelToGain(EqHandle::y(), m_heigth, m_pixelsPerUnitHeight) / 40); + double alpha = s * std::sinh(std::log(2.0) / 2 * Q * w0 / std::sin(w0)); //calc coefficents double b0 = 1 + alpha * A; @@ -238,10 +238,10 @@ float EqHandle::getHighShelfCurve( float x ) { double freqZ = xPixelToFreq( EqHandle::x(), m_width ); double w0 = numbers::tau * freqZ / Engine::audioEngine()->outputSampleRate(); - double c = cosf( w0 ); - double s = sinf( w0 ); - double A = pow( 10, yPixelToGain( EqHandle::y(), m_heigth, m_pixelsPerUnitHeight ) * 0.025 ); - double beta = sqrt( A ) / m_resonance; + double c = std::cos(w0); + double s = std::sin(w0); + double A = fastPow10f(yPixelToGain(EqHandle::y(), m_heigth, m_pixelsPerUnitHeight) * 0.025); + double beta = std::sqrt(A) / m_resonance; //calc coefficents double b0 = A * ((A + 1) + (A - 1) * c + beta * s); @@ -273,10 +273,10 @@ float EqHandle::getLowShelfCurve( float x ) { double freqZ = xPixelToFreq( EqHandle::x(), m_width ); double w0 = numbers::tau * freqZ / Engine::audioEngine()->outputSampleRate(); - double c = cosf( w0 ); - double s = sinf( w0 ); - double A = pow( 10, yPixelToGain( EqHandle::y(), m_heigth, m_pixelsPerUnitHeight ) / 40 ); - double beta = sqrt( A ) / m_resonance; + double c = std::cos(w0); + double s = std::sin(w0); + double A = fastPow10f(yPixelToGain(EqHandle::y(), m_heigth, m_pixelsPerUnitHeight) / 40); + double beta = std::sqrt(A) / m_resonance; //calc coefficents double b0 = A * ((A + 1) - (A - 1) * c + beta * s); @@ -308,8 +308,8 @@ float EqHandle::getLowCutCurve( float x ) { double freqZ = xPixelToFreq( EqHandle::x(), m_width ); double w0 = numbers::tau * freqZ / Engine::audioEngine()->outputSampleRate(); - double c = cosf( w0 ); - double s = sinf( w0 ); + double c = std::cos(w0); + double s = std::sin(w0); double resonance = getResonance(); double alpha = s / (2 * resonance); @@ -350,8 +350,8 @@ float EqHandle::getHighCutCurve( float x ) { double freqZ = xPixelToFreq( EqHandle::x(), m_width ); double w0 = numbers::tau * freqZ / Engine::audioEngine()->outputSampleRate(); - double c = cosf( w0 ); - double s = sinf( w0 ); + double c = std::cos(w0); + double s = std::sin(w0); double resonance = getResonance(); double alpha = s / (2 * resonance); @@ -525,9 +525,10 @@ double EqHandle::calculateGain(const double freq, const double a1, const double const double w = std::sin(numbers::pi * freq / Engine::audioEngine()->outputSampleRate()); const double PHI = w * w * 4; - double gain = 10 * log10( pow( b0 + b1 + b2 , 2 ) + ( b0 * b2 * PHI - ( b1 * ( b0 + b2 ) - + 4 * b0 * b2 ) ) * PHI ) - 10 * log10( pow( 1 + a1 + a2, 2 ) - + ( 1 * a2 * PHI - ( a1 * ( 1 + a2 ) + 4 * 1 * a2 ) ) * PHI ); + auto bb = b0 + b1 + b2; + auto aa = 1 + a1 + a2; + double gain = 10 * std::log10(bb * bb + (b0 * b2 * PHI - (b1 * (b0 + b2) + 4 * b0 * b2)) * PHI) + - 10 * std::log10(aa * aa + (1 * a2 * PHI - (a1 * (1 + a2) + 4 * 1 * a2)) * PHI); return gain; } diff --git a/plugins/Eq/EqFilter.h b/plugins/Eq/EqFilter.h index 03a1f385d..c5685dd88 100644 --- a/plugins/Eq/EqFilter.h +++ b/plugins/Eq/EqFilter.h @@ -186,8 +186,8 @@ public : // calc intermediate float w0 = numbers::tau_v * m_freq / m_sampleRate; - float c = cosf( w0 ); - float s = sinf( w0 ); + float c = std::cos(w0); + float s = std::sin(w0); float alpha = s / ( 2 * m_res ); //calc coefficents @@ -229,8 +229,8 @@ public : // calc intermediate float w0 = numbers::tau_v * m_freq / m_sampleRate; - float c = cosf( w0 ); - float s = sinf( w0 ); + float c = std::cos(w0); + float s = std::sin(w0); float alpha = s / ( 2 * m_res ); //calc coefficents @@ -270,10 +270,10 @@ public: { // calc intermediate float w0 = numbers::tau_v * m_freq / m_sampleRate; - float c = cosf( w0 ); - float s = sinf( w0 ); - float A = pow( 10, m_gain * 0.025); - float alpha = s * sinh( log( 2 ) / 2 * m_bw * w0 / sinf(w0) ); + float c = std::cos(w0); + float s = std::sin(w0); + float A = fastPow10f(m_gain * 0.025); + float alpha = s * std::sinh(std::log(2.f) / 2 * m_bw * w0 / std::sin(w0)); //calc coefficents float b0 = 1 + alpha * A; @@ -333,11 +333,11 @@ public : // calc intermediate float w0 = numbers::tau_v * m_freq / m_sampleRate; - float c = cosf( w0 ); - float s = sinf( w0 ); - float A = pow( 10, m_gain * 0.025); - // float alpha = s / ( 2 * m_res ); - float beta = sqrt( A ) / m_res; + float c = std::cos(w0); + float s = std::sin(w0); + float A = fastPow10f(m_gain * 0.025); + // float alpha = s / (2 * m_res); + float beta = std::sqrt(A) / m_res; //calc coefficents float b0 = A * ((A + 1) - (A - 1) * c + beta * s); @@ -370,10 +370,10 @@ public : // calc intermediate float w0 = numbers::tau_v * m_freq / m_sampleRate; - float c = cosf( w0 ); - float s = sinf( w0 ); - float A = pow( 10, m_gain * 0.025 ); - float beta = sqrt( A ) / m_res; + float c = std::cos(w0); + float s = std::sin(w0); + float A = fastPow10f(m_gain * 0.025); + float beta = std::sqrt(A) / m_res; //calc coefficents float b0 = A * ((A + 1) + (A - 1) * c + beta * s); diff --git a/plugins/Eq/EqSpectrumView.cpp b/plugins/Eq/EqSpectrumView.cpp index 261dbeacd..7dc398bfb 100644 --- a/plugins/Eq/EqSpectrumView.cpp +++ b/plugins/Eq/EqSpectrumView.cpp @@ -193,7 +193,7 @@ EqSpectrumView::EqSpectrumView(EqAnalyser *b, QWidget *_parent) : connect( getGUI()->mainWindow(), SIGNAL( periodicUpdate() ), this, SLOT( periodicalUpdate() ) ); setAttribute( Qt::WA_TranslucentBackground, true ); m_skipBands = MAX_BANDS * 0.5; - float totalLength = log10( 20000 ); + const float totalLength = std::log10(20000); m_pixelsPerUnitWidth = width() / totalLength ; m_scale = 1.5; m_color = QColor( 255, 255, 255, 255 ); @@ -233,7 +233,7 @@ void EqSpectrumView::paintEvent(QPaintEvent *event) const float fallOff = 1.07f; for( int x = 0; x < MAX_BANDS; ++x, ++bands ) { - float peak = *bands != 0. ? (fh * 2.0 / 3.0 * (20. * log10(*bands / energy) - LOWER_Y) / (-LOWER_Y)) : 0.; + float peak = *bands != 0. ? (fh * 2.0 / 3.0 * (20. * std::log10(*bands / energy) - LOWER_Y) / (-LOWER_Y)) : 0.; if( peak < 0 ) { diff --git a/plugins/GigPlayer/GigPlayer.cpp b/plugins/GigPlayer/GigPlayer.cpp index b72e30b33..c2d27f1e6 100644 --- a/plugins/GigPlayer/GigPlayer.cpp +++ b/plugins/GigPlayer/GigPlayer.cpp @@ -1101,9 +1101,7 @@ GigSample::GigSample( gig::Sample * pSample, gig::DimensionRegion * pDimRegion, if( region->PitchTrack == true ) { // Calculate what frequency the provided sample is - sampleFreq = 440.0 * powf( 2, 1.0 / 12 * ( - 1.0 * region->UnityNote - 69 - - 0.01 * region->FineTune ) ); + sampleFreq = 440.0f * std::exp2((region->UnityNote - 69 - region->FineTune * 0.01) / 12.0f); freqFactor = sampleFreq / desiredFreq; } @@ -1342,7 +1340,7 @@ float ADSR::value() { // Maybe not the best way of doing this, but it appears to be about right // Satisfies f(0) = sustain and f(releaseLength) = very small - amplitude = ( sustain + 1e-3 ) * expf( -5.0 / releaseLength * releasePosition ) - 1e-3; + amplitude = (sustain + 1e-3) * std::exp(-5.0f / releaseLength * releasePosition) - 1e-3; // Don't have an infinite exponential decay if( amplitude <= 0 || releasePosition >= releaseLength ) diff --git a/plugins/LOMM/LOMM.cpp b/plugins/LOMM/LOMM.cpp index 14f254eab..32c77e3db 100644 --- a/plugins/LOMM/LOMM.cpp +++ b/plugins/LOMM/LOMM.cpp @@ -82,7 +82,7 @@ void LOMMEffect::changeSampleRate() m_coeffPrecalc = -2.2f / (m_sampleRate * 0.001f); m_needsUpdate = true; - m_crestTimeConst = exp(-1.f / (0.2f * m_sampleRate)); + m_crestTimeConst = std::exp(-1.f / (0.2f * m_sampleRate)); m_lookBufLength = std::ceil((LOMM_MAX_LOOKAHEAD / 1000.f) * m_sampleRate) + 2; for (int i = 0; i < 2; ++i) @@ -171,7 +171,7 @@ Effect::ProcessStatus LOMMEffect::processImpl(SampleFrame* buf, const fpp_t fram float rel[3] = {relH, relM, relL}; float relCoef[3] = {relCoefH, relCoefM, relCoefL}; const float rmsTime = m_lommControls.m_rmsTimeModel.value(); - const float rmsTimeConst = (rmsTime == 0) ? 0 : exp(-1.f / (rmsTime * 0.001f * m_sampleRate)); + const float rmsTimeConst = (rmsTime == 0) ? 0 : std::exp(-1.f / (rmsTime * 0.001f * m_sampleRate)); const float knee = m_lommControls.m_kneeModel.value() * 0.5f; const float range = m_lommControls.m_rangeModel.value(); const float rangeAmp = dbfsToAmp(range); diff --git a/plugins/LOMM/LOMM.h b/plugins/LOMM/LOMM.h index 0dd209e07..36aa12dea 100644 --- a/plugins/LOMM/LOMM.h +++ b/plugins/LOMM/LOMM.h @@ -55,7 +55,7 @@ public: inline float msToCoeff(float ms) { - return (ms == 0) ? 0 : exp(m_coeffPrecalc / ms); + return (ms == 0) ? 0 : std::exp(m_coeffPrecalc / ms); } private slots: diff --git a/plugins/Lb302/Lb302.cpp b/plugins/Lb302/Lb302.cpp index 9cb82bd7c..5a085df4d 100644 --- a/plugins/Lb302/Lb302.cpp +++ b/plugins/Lb302/Lb302.cpp @@ -109,20 +109,20 @@ Lb302Filter::Lb302Filter(Lb302FilterKnobState* p_fs) : void Lb302Filter::recalc() { - vcf_e1 = exp(6.109 + 1.5876*(fs->envmod) + 2.1553*(fs->cutoff) - 1.2*(1.0-(fs->reso))); - vcf_e0 = exp(5.613 - 0.8*(fs->envmod) + 2.1553*(fs->cutoff) - 0.7696*(1.0-(fs->reso))); + vcf_e1 = std::exp(6.109f + 1.5876f * fs->envmod + 2.1553f * fs->cutoff - 1.2f * (1.0f - fs->reso)); + vcf_e0 = std::exp(5.613f - 0.8f * fs->envmod + 2.1553f * fs->cutoff - 0.7696f * (1.0f - fs->reso)); vcf_e0*=M_PI/Engine::audioEngine()->outputSampleRate(); vcf_e1*=M_PI/Engine::audioEngine()->outputSampleRate(); vcf_e1 -= vcf_e0; - vcf_rescoeff = exp(-1.20 + 3.455*(fs->reso)); + vcf_rescoeff = std::exp(-1.20f + 3.455f * fs->reso); }; void Lb302Filter::envRecalc() { vcf_c0 *= fs->envdecay; // Filter Decay. vcf_decay is adjusted for Hz and ENVINC - // vcf_rescoeff = exp(-1.20 + 3.455*(fs->reso)); moved above + // vcf_rescoeff = std::exp(-1.20f + 3.455f * fs->reso); moved above }; @@ -169,9 +169,9 @@ void Lb302FilterIIR2::envRecalc() Lb302Filter::envRecalc(); float w = vcf_e0 + vcf_c0; // e0 is adjusted for Hz and doesn't need ENVINC - float k = exp(-w/vcf_rescoeff); // Does this mean c0 is inheritantly? + float k = std::exp(-w / vcf_rescoeff); // Does this mean c0 is inheritantly? - vcf_a = 2.0*cos(2.0*w) * k; + vcf_a = 2.0 * std::cos(2.0 * w) * k; vcf_b = -k*k; vcf_c = 1.0 - vcf_a - vcf_b; } @@ -241,7 +241,7 @@ void Lb302Filter3Pole::envRecalc() kp1 = kp+1.0; kp1h = 0.5*kp1; #ifdef LB_24_RES_TRICK - k = exp(-w/vcf_rescoeff); + k = std::exp(-w / vcf_rescoeff); kres = (((k))) * (((-2.7079*kp1 + 10.963)*kp1 - 14.934)*kp1 + 8.4974); #else kres = (((fs->reso))) * (((-2.7079*kp1 + 10.963)*kp1 - 14.934)*kp1 + 8.4974); @@ -415,7 +415,7 @@ void Lb302Synth::filterChanged() float d = 0.2 + (2.3*vcf_dec_knob.value()); d *= Engine::audioEngine()->outputSampleRate(); // d *= smpl rate - fs.envdecay = pow(0.1, 1.0/d * ENVINC); // decay is 0.1 to the 1/d * ENVINC + fs.envdecay = std::pow(0.1f, 1.0f / d * ENVINC); // decay is 0.1 to the 1/d * ENVINC // vcf_envdecay is now adjusted for both // sampling rate and ENVINC recalcFilter(); @@ -563,7 +563,7 @@ int Lb302Synth::process(SampleFrame* outbuf, const std::size_t size) break; case VcoShape::RoundSquare: // p0: width of round - vco_k = (vco_c<0)?(sqrtf(1-(vco_c*vco_c*4))-0.5):-0.5; + vco_k = (vco_c < 0.f) ? (std::sqrt(1.f - (vco_c * vco_c * 4.f)) - 0.5f) : -0.5f; break; case VcoShape::Moog: // Maybe the fall should be exponential/sinsoidal instead of quadric. @@ -574,7 +574,7 @@ int Lb302Synth::process(SampleFrame* outbuf, const std::size_t size) } else if (vco_k>0.5) { float w = 2.0 * (vco_k - 0.5) - 1.0; - vco_k = 0.5 - sqrtf(1.0-(w*w)); + vco_k = 0.5 - std::sqrt(1.0 - (w * w)); } vco_k *= 2.0; // MOOG wave gets filtered away break; diff --git a/plugins/Monstro/Monstro.cpp b/plugins/Monstro/Monstro.cpp index c7d22edfe..367ef7f71 100644 --- a/plugins/Monstro/Monstro.cpp +++ b/plugins/Monstro/Monstro.cpp @@ -120,7 +120,7 @@ void MonstroSynth::renderOutput( fpp_t _frames, SampleFrame* _buf ) if( mod##_e2 != 0.0f ) modtmp += m_env[1][f] * mod##_e2; \ if( mod##_l1 != 0.0f ) modtmp += m_lfo[0][f] * mod##_l1; \ if( mod##_l2 != 0.0f ) modtmp += m_lfo[1][f] * mod##_l2; \ - car = qBound( MIN_FREQ, car * powf( 2.0f, modtmp ), MAX_FREQ ); + (car) = qBound( MIN_FREQ, (car) * std::exp2(modtmp), MAX_FREQ); #define modulateabs( car, mod ) \ if( mod##_e1 != 0.0f ) car += m_env[0][f] * mod##_e1; \ @@ -1361,25 +1361,25 @@ void MonstroInstrument::updateVolume3() void MonstroInstrument::updateFreq1() { - m_osc1l_freq = powf( 2.0f, m_osc1Crs.value() / 12.0f ) * - powf( 2.0f, m_osc1Ftl.value() / 1200.0f ); - m_osc1r_freq = powf( 2.0f, m_osc1Crs.value() / 12.0f ) * - powf( 2.0f, m_osc1Ftr.value() / 1200.0f ); + m_osc1l_freq = std::exp2(m_osc1Crs.value() / 12.0f) + * std::exp2(m_osc1Ftl.value() / 1200.0f); + m_osc1r_freq = std::exp2(m_osc1Crs.value() / 12.0f) + * std::exp2(m_osc1Ftr.value() / 1200.0f); } void MonstroInstrument::updateFreq2() { - m_osc2l_freq = powf( 2.0f, m_osc2Crs.value() / 12.0f ) * - powf( 2.0f, m_osc2Ftl.value() / 1200.0f ); - m_osc2r_freq = powf( 2.0f, m_osc2Crs.value() / 12.0f ) * - powf( 2.0f, m_osc2Ftr.value() / 1200.0f ); + m_osc2l_freq = std::exp2(m_osc2Crs.value() / 12.0f) + * std::exp2(m_osc2Ftl.value() / 1200.0f); + m_osc2r_freq = std::exp2(m_osc2Crs.value() / 12.0f) + * std::exp2(m_osc2Ftr.value() / 1200.0f); } void MonstroInstrument::updateFreq3() { - m_osc3_freq = powf( 2.0f, m_osc3Crs.value() / 12.0f ); + m_osc3_freq = std::exp2(m_osc3Crs.value() / 12.0f); } diff --git a/plugins/Nes/Nes.cpp b/plugins/Nes/Nes.cpp index 6aea0ebdf..d91130ef1 100644 --- a/plugins/Nes/Nes.cpp +++ b/plugins/Nes/Nes.cpp @@ -700,19 +700,19 @@ gui::PluginView* NesInstrument::instantiateView( QWidget * parent ) void NesInstrument::updateFreq1() { - m_freq1 = powf( 2, m_ch1Crs.value() / 12.0f ); + m_freq1 = std::exp2(m_ch1Crs.value() / 12.0f); } void NesInstrument::updateFreq2() { - m_freq2 = powf( 2, m_ch2Crs.value() / 12.0f ); + m_freq2 = std::exp2(m_ch2Crs.value() / 12.0f); } void NesInstrument::updateFreq3() { - m_freq3 = powf( 2, m_ch3Crs.value() / 12.0f ); + m_freq3 = std::exp2(m_ch3Crs.value() / 12.0f); } diff --git a/plugins/OpulenZ/OpulenZ.cpp b/plugins/OpulenZ/OpulenZ.cpp index 5fd4bf58a..48dfb6c8c 100644 --- a/plugins/OpulenZ/OpulenZ.cpp +++ b/plugins/OpulenZ/OpulenZ.cpp @@ -497,7 +497,7 @@ void OpulenzInstrument::loadPatch(const unsigned char inst[14]) { void OpulenzInstrument::tuneEqual(int center, float Hz) { for(int n=0; n<128; ++n) { - float tmp = Hz * pow(2.0, (n - center) * (1.0 / 12.0) + pitchbend * (1.0 / 1200.0)); + float tmp = Hz * std::exp2((n - center) / 12.0f + pitchbend / 1200.0f); fnums[n] = Hz2fnum( tmp ); } } @@ -505,7 +505,7 @@ void OpulenzInstrument::tuneEqual(int center, float Hz) { // Find suitable F number in lowest possible block int OpulenzInstrument::Hz2fnum(float Hz) { for(int block=0; block<8; ++block) { - unsigned int fnum = Hz * pow( 2.0, 20.0 - (double)block ) * ( 1.0 / 49716.0 ); + auto fnum = static_cast(Hz * std::exp2(20.0f - static_cast(block)) / 49716.0f); if(fnum<1023) { return fnum + (block << 10); } diff --git a/plugins/Organic/Organic.cpp b/plugins/Organic/Organic.cpp index c167bcec2..558a7d542 100644 --- a/plugins/Organic/Organic.cpp +++ b/plugins/Organic/Organic.cpp @@ -342,8 +342,7 @@ void OrganicInstrument::deleteNotePluginData( NotePlayHandle * _n ) float inline OrganicInstrument::waveshape(float in, float amount) { float k = 2.0f * amount / ( 1.0f - amount ); - - return( ( 1.0f + k ) * in / ( 1.0f + k * fabs( in ) ) ); + return (1.0f + k) * in / (1.0f + k * std::abs(in)); } @@ -603,12 +602,11 @@ void OscillatorObject::updateVolume() void OscillatorObject::updateDetuning() { - m_detuningLeft = powf( 2.0f, OrganicInstrument::s_harmonics[ static_cast( m_harmModel.value() ) ] - + (float)m_detuneModel.value() * CENT ) / - Engine::audioEngine()->outputSampleRate(); - m_detuningRight = powf( 2.0f, OrganicInstrument::s_harmonics[ static_cast( m_harmModel.value() ) ] - - (float)m_detuneModel.value() * CENT ) / - Engine::audioEngine()->outputSampleRate(); + const auto harmonic = OrganicInstrument::s_harmonics[static_cast(m_harmModel.value())]; + const auto sr = Engine::audioEngine()->outputSampleRate(); + + m_detuningLeft = std::exp2(harmonic + m_detuneModel.value() * CENT) / sr; + m_detuningRight = std::exp2(harmonic - m_detuneModel.value() * CENT) / sr; } diff --git a/plugins/ReverbSC/ReverbSC.cpp b/plugins/ReverbSC/ReverbSC.cpp index 1383d5266..4eae13129 100644 --- a/plugins/ReverbSC/ReverbSC.cpp +++ b/plugins/ReverbSC/ReverbSC.cpp @@ -24,10 +24,9 @@ #include "ReverbSC.h" #include "embed.h" +#include "lmms_math.h" #include "plugin_export.h" -#define DB2LIN(X) pow(10, X / 20.0f); - namespace lmms { @@ -92,10 +91,10 @@ Effect::ProcessStatus ReverbSCEffect::processImpl(SampleFrame* buf, const fpp_t { auto s = std::array{buf[f][0], buf[f][1]}; - const auto inGain - = (SPFLOAT)DB2LIN((inGainBuf ? inGainBuf->values()[f] : m_reverbSCControls.m_inputGainModel.value())); - const auto outGain - = (SPFLOAT)DB2LIN((outGainBuf ? outGainBuf->values()[f] : m_reverbSCControls.m_outputGainModel.value())); + const auto inGain = static_cast(fastPow10f( + (inGainBuf ? inGainBuf->values()[f] : m_reverbSCControls.m_inputGainModel.value()) / 20.f)); + const auto outGain = static_cast(fastPow10f( + (outGainBuf ? outGainBuf->values()[f] : m_reverbSCControls.m_outputGainModel.value()) / 20.f)); s[0] *= inGain; s[1] *= inGain; diff --git a/plugins/Sf2Player/Sf2Player.cpp b/plugins/Sf2Player/Sf2Player.cpp index 13dab7b8a..020364151 100644 --- a/plugins/Sf2Player/Sf2Player.cpp +++ b/plugins/Sf2Player/Sf2Player.cpp @@ -556,7 +556,7 @@ void Sf2Instrument::updateTuning() if (instrumentTrack()->microtuner()->enabledModel()->value()) { auto centArray = std::array{}; - double lowestHz = pow(2., -69. / 12.) * 440.;// Frequency of MIDI note 0, which is approximately 8.175798916 Hz + double lowestHz = std::exp2(-69. / 12.) * 440.; // Frequency of MIDI note 0, which is approximately 8.175798916 Hz for (int i = 0; i < 128; ++i) { // Get desired Hz of note diff --git a/plugins/Sfxr/Sfxr.cpp b/plugins/Sfxr/Sfxr.cpp index 0279eb41a..b941d8f0a 100644 --- a/plugins/Sfxr/Sfxr.cpp +++ b/plugins/Sfxr/Sfxr.cpp @@ -97,33 +97,34 @@ void SfxrSynth::resetSample( bool restart ) fperiod=100.0/(s->m_startFreqModel.value()*s->m_startFreqModel.value()+0.001); period=(int)fperiod; fmaxperiod=100.0/(s->m_minFreqModel.value()*s->m_minFreqModel.value()+0.001); - fslide=1.0-pow((double)s->m_slideModel.value(), 3.0)*0.01; - fdslide=-pow((double)s->m_dSlideModel.value(), 3.0)*0.000001; + const auto sv = static_cast(s->m_slideModel.value()); + const auto dsv = static_cast(s->m_dSlideModel.value()); + fslide = 1.0 - sv * sv * sv * 0.01; + fdslide = -dsv * dsv * dsv * 0.000001; square_duty=0.5f-s->m_sqrDutyModel.value()*0.5f; square_slide=-s->m_sqrSweepModel.value()*0.00005f; - if(s->m_changeAmtModel.value()>=0.0f) - arp_mod=1.0-pow((double)s->m_changeAmtModel.value(), 2.0)*0.9; - else - arp_mod=1.0+pow((double)s->m_changeAmtModel.value(), 2.0)*10.0; - arp_time=0; - arp_limit=(int)(pow(1.0f-s->m_changeSpeedModel.value(), 2.0f)*20000+32); - if(s->m_changeSpeedModel.value()==1.0f) - arp_limit=0; + const auto cha = static_cast(s->m_changeAmtModel.value()); + arp_mod = (cha >= 0.0) + ? 1.0 - cha * cha * 0.9 + : 1.0 + cha * cha * 10.0; + arp_time = 0; + const auto chs = 1.f - s->m_changeSpeedModel.value(); + arp_limit = (chs == 0.f) ? 0 : static_cast(chs * chs * 20000 + 32); if(!restart) { // reset filter fltp=0.0f; fltdp=0.0f; - fltw=pow(s->m_lpFilCutModel.value(), 3.0f)*0.1f; + fltw = std::pow(s->m_lpFilCutModel.value(), 3.f) * 0.1f; fltw_d=1.0f+s->m_lpFilCutSweepModel.value()*0.0001f; - fltdmp=5.0f/(1.0f+pow(s->m_lpFilResoModel.value(), 2.0f)*20.0f)*(0.01f+fltw); + fltdmp = 5.0f / (1.0f + std::pow(s->m_lpFilResoModel.value(), 2.0f) * 20.0f) * (0.01f + fltw); if(fltdmp>0.8f) fltdmp=0.8f; fltphp=0.0f; - flthp=pow(s->m_hpFilCutModel.value(), 2.0f)*0.1f; + flthp = std::pow(s->m_hpFilCutModel.value(), 2.f) * 0.1f; flthp_d=1.0+s->m_hpFilCutSweepModel.value()*0.0003f; // reset vibrato vib_phase=0.0f; - vib_speed=pow(s->m_vibSpeedModel.value(), 2.0f)*0.01f; + vib_speed = std::pow(s->m_vibSpeedModel.value(), 2.f) * 0.01f; vib_amp=s->m_vibDepthModel.value()*0.5f; // reset envelope env_vol=0.0f; @@ -134,9 +135,9 @@ void SfxrSynth::resetSample( bool restart ) env_length[1]=(int)(s->m_holdModel.value()*s->m_holdModel.value()*99999.0f)+1; env_length[2]=(int)(s->m_decModel.value()*s->m_decModel.value()*99999.0f)+1; - fphase=pow(s->m_phaserOffsetModel.value(), 2.0f)*1020.0f; + fphase = std::pow(s->m_phaserOffsetModel.value(), 2.f) * 1020.f; if(s->m_phaserOffsetModel.value()<0.0f) fphase=-fphase; - fdphase=pow(s->m_phaserSweepModel.value(), 2.0f)*1.0f; + fdphase = std::pow(s->m_phaserSweepModel.value(), 2.f) * 1.f; if(s->m_phaserSweepModel.value()<0.0f) fdphase=-fdphase; iphase=abs((int)fphase); ipp=0; @@ -148,10 +149,10 @@ void SfxrSynth::resetSample( bool restart ) } rep_time=0; - rep_limit=(int)(pow(1.0f-s->m_repeatSpeedModel.value(), 2.0f)*20000+32); + rep_limit = static_cast(std::pow(1.0f - s->m_repeatSpeedModel.value(), 2.0f) * 20000 + 32); if(s->m_repeatSpeedModel.value()==0.0f) rep_limit=0; - } + } } @@ -195,7 +196,7 @@ void SfxrSynth::update( SampleFrame* buffer, const int32_t frameNum ) if(vib_amp>0.0f) { vib_phase+=vib_speed; - rfperiod=fperiod*(1.0+sin(vib_phase)*vib_amp); + rfperiod = fperiod * (1.0 + std::sin(vib_phase) * vib_amp); } period=(int)rfperiod; if(period<8) period=8; @@ -214,7 +215,7 @@ void SfxrSynth::update( SampleFrame* buffer, const int32_t frameNum ) if(env_stage==0) env_vol=(float)env_time/env_length[0]; if(env_stage==1) - env_vol=1.0f+pow(1.0f-(float)env_time/env_length[1], 1.0f)*2.0f*s->m_susModel.value(); + { env_vol = 1.0f + (1.0f - static_cast(env_time) / env_length[1]) * 2.0f * s->m_susModel.value(); } if(env_stage==2) env_vol=1.0f-(float)env_time/env_length[2]; @@ -1000,13 +1001,13 @@ void SfxrInstrumentView::randomize() { auto s = castModel(); - s->m_startFreqModel.setValue( pow(frnd(2.0f)-1.0f, 2.0f) ); + s->m_startFreqModel.setValue(std::pow(frnd(2.0f) - 1.0f, 2.0f)); if(rnd(1)) { - s->m_startFreqModel.setValue( pow(frnd(2.0f)-1.0f, 3.0f)+0.5f ); + s->m_startFreqModel.setValue(std::pow(frnd(2.0f) - 1.0f, 3.0f) + 0.5f); } s->m_minFreqModel.setValue( 0.0f ); - s->m_slideModel.setValue( pow(frnd(2.0f)-1.0f, 5.0f) ); + s->m_slideModel.setValue(std::pow(frnd(2.0f) - 1.0f, 5.0f)); if( s->m_startFreqModel.value()>0.7f && s->m_slideModel.value()>0.2f ) { s->m_slideModel.setValue( -s->m_slideModel.value() ); @@ -1015,19 +1016,19 @@ void SfxrInstrumentView::randomize() { s->m_slideModel.setValue( -s->m_slideModel.value() ); } - s->m_dSlideModel.setValue( pow(frnd(2.0f)-1.0f, 3.0f) ); + s->m_dSlideModel.setValue(std::pow(frnd(2.0f) - 1.0f, 3.0f)); s->m_sqrDutyModel.setValue( frnd(2.0f)-1.0f ); - s->m_sqrSweepModel.setValue( pow(frnd(2.0f)-1.0f, 3.0f) ); + s->m_sqrSweepModel.setValue(std::pow(frnd(2.0f) - 1.0f, 3.0f)); - s->m_vibDepthModel.setValue( pow(frnd(2.0f)-1.0f, 3.0f) ); + s->m_vibDepthModel.setValue(std::pow(frnd(2.0f) - 1.0f, 3.0f)); s->m_vibSpeedModel.setValue( frnd(2.0f)-1.0f ); //s->m_vibDelayModel.setValue( frnd(2.0f)-1.0f ); - s->m_attModel.setValue( pow(frnd(2.0f)-1.0f, 3.0f) ); - s->m_holdModel.setValue( pow(frnd(2.0f)-1.0f, 2.0f) ); + s->m_attModel.setValue(std::pow(frnd(2.0f) - 1.0f, 3.0f)); + s->m_holdModel.setValue(std::pow(frnd(2.0f) - 1.0f, 2.0f)); s->m_decModel.setValue( frnd(2.0f)-1.0f ); - s->m_susModel.setValue( pow(frnd(0.8f), 2.0f) ); + s->m_susModel.setValue(std::pow(frnd(0.8f), 2.0f)); if(s->m_attModel.value()+s->m_holdModel.value()+s->m_decModel.value()<0.2f) { s->m_holdModel.setValue( s->m_holdModel.value()+0.2f+frnd(0.3f) ); @@ -1035,17 +1036,17 @@ void SfxrInstrumentView::randomize() } s->m_lpFilResoModel.setValue( frnd(2.0f)-1.0f ); - s->m_lpFilCutModel.setValue( 1.0f-pow(frnd(1.0f), 3.0f) ); - s->m_lpFilCutSweepModel.setValue( pow(frnd(2.0f)-1.0f, 3.0f) ); + s->m_lpFilCutModel.setValue(1.0f - std::pow(frnd(1.0f), 3.0f)); + s->m_lpFilCutSweepModel.setValue(std::pow(frnd(2.0f) - 1.0f, 3.0f)); if(s->m_lpFilCutModel.value()<0.1f && s->m_lpFilCutSweepModel.value()<-0.05f) { s->m_lpFilCutSweepModel.setValue( -s->m_lpFilCutSweepModel.value() ); } - s->m_hpFilCutModel.setValue( pow(frnd(1.0f), 5.0f) ); - s->m_hpFilCutSweepModel.setValue( pow(frnd(2.0f)-1.0f, 5.0f) ); + s->m_hpFilCutModel.setValue(std::pow(frnd(1.0f), 5.0f)); + s->m_hpFilCutSweepModel.setValue(std::pow(frnd(2.0f) - 1.0f, 5.0f)); - s->m_phaserOffsetModel.setValue( pow(frnd(2.0f)-1.0f, 3.0f) ); - s->m_phaserSweepModel.setValue( pow(frnd(2.0f)-1.0f, 3.0f) ); + s->m_phaserOffsetModel.setValue(std::pow(frnd(2.0f) - 1.0f, 3.0f)); + s->m_phaserSweepModel.setValue(std::pow(frnd(2.0f) - 1.0f, 3.0f)); s->m_repeatSpeedModel.setValue( frnd(2.0f)-1.0f ); diff --git a/plugins/Sid/SidInstrument.cpp b/plugins/Sid/SidInstrument.cpp index 9a5a74f71..fbb68b4e4 100644 --- a/plugins/Sid/SidInstrument.cpp +++ b/plugins/Sid/SidInstrument.cpp @@ -341,9 +341,9 @@ void SidInstrument::playNote( NotePlayHandle * _n, base = i*7; // freq ( Fn = Fout / Fclk * 16777216 ) + coarse detuning freq = _n->frequency(); - note = 69.0 + 12.0 * log( freq / 440.0 ) / log( 2 ); + note = 69.0 + 12.0 * std::log2(freq / 440.0); note += m_voice[i]->m_coarseModel.value(); - freq = 440.0 * pow( 2.0, (note-69.0)/12.0 ); + freq = 440.0 * std::exp2((note - 69.0) / 12.0); data16 = int( freq / float(clockrate) * 16777216.0 ); sidreg[base+0] = data16&0x00FF; diff --git a/plugins/SpectrumAnalyzer/SaProcessor.cpp b/plugins/SpectrumAnalyzer/SaProcessor.cpp index d9e7ac8a4..1ea80f126 100644 --- a/plugins/SpectrumAnalyzer/SaProcessor.cpp +++ b/plugins/SpectrumAnalyzer/SaProcessor.cpp @@ -26,6 +26,7 @@ #include "SaProcessor.h" #include +#include "lmms_math.h" #ifdef SA_DEBUG #include #endif @@ -331,15 +332,15 @@ QRgb SaProcessor::makePixel(float left, float right) const const float gamma_correction = m_controls->m_waterfallGammaModel.value(); if (m_controls->m_stereoModel.value()) { - float ampL = pow(left, gamma_correction); - float ampR = pow(right, gamma_correction); + float ampL = std::pow(left, gamma_correction); + float ampR = std::pow(right, gamma_correction); return qRgb(m_controls->m_colorL.red() * ampL + m_controls->m_colorR.red() * ampR, m_controls->m_colorL.green() * ampL + m_controls->m_colorR.green() * ampR, m_controls->m_colorL.blue() * ampL + m_controls->m_colorR.blue() * ampR); } else { - float ampL = pow(left, gamma_correction); + float ampL = std::pow(left, gamma_correction); // make mono color brighter to compensate for the fact it is not summed return qRgb(m_controls->m_colorMonoW.red() * ampL, m_controls->m_colorMonoW.green() * ampL, @@ -576,9 +577,9 @@ float SaProcessor::freqToXPixel(float freq, unsigned int width) const if (m_controls->m_logXModel.value()) { if (freq <= 1) {return 0;} - float min = log10(getFreqRangeMin()); - float range = log10(getFreqRangeMax()) - min; - return (log10(freq) - min) / range * width; + float min = std::log10(getFreqRangeMin()); + float range = std::log10(getFreqRangeMax()) - min; + return (std::log10(freq) - min) / range * width; } else { @@ -594,10 +595,10 @@ float SaProcessor::xPixelToFreq(float x, unsigned int width) const { if (m_controls->m_logXModel.value()) { - float min = log10(getFreqRangeMin()); - float max = log10(getFreqRangeMax()); + float min = std::log10(getFreqRangeMin()); + float max = std::log10(getFreqRangeMax()); float range = max - min; - return pow(10, min + x / width * range); + return fastPow10f(min + x / width * range); } else { @@ -662,8 +663,8 @@ float SaProcessor::ampToYPixel(float amplitude, unsigned int height) const else { // linear scale: convert returned ranges from dB to linear scale - float max = pow(10, getAmpRangeMax() / 10); - float range = pow(10, getAmpRangeMin() / 10) - max; + float max = fastPow10f(getAmpRangeMax() / 10); + float range = fastPow10f(getAmpRangeMin() / 10) - max; return (amplitude - max) / range * height; } } @@ -683,8 +684,8 @@ float SaProcessor::yPixelToAmp(float y, unsigned int height) const else { // linear scale: convert returned ranges from dB to linear scale - float max = pow(10, getAmpRangeMax() / 10); - float range = pow(10, getAmpRangeMin() / 10) - max; + float max = fastPow10f(getAmpRangeMax() / 10); + float range = fastPow10f(getAmpRangeMin() / 10) - max; return max + range * (y / height); } } diff --git a/plugins/SpectrumAnalyzer/SaSpectrumView.cpp b/plugins/SpectrumAnalyzer/SaSpectrumView.cpp index 2d15da7f4..e8d4ff8e0 100644 --- a/plugins/SpectrumAnalyzer/SaSpectrumView.cpp +++ b/plugins/SpectrumAnalyzer/SaSpectrumView.cpp @@ -38,6 +38,7 @@ #include "MainWindow.h" #include "SaControls.h" #include "SaProcessor.h" +#include "lmms_math.h" #ifdef SA_DEBUG #include @@ -668,7 +669,7 @@ std::vector> SaSpectrumView::makeLogFreqTics(int low } } // also insert denser series if high and low values are close - if ((log10(high) - log10(low) < 2) && (i * b[j] >= low && i * b[j] <= high)) + if ((std::log10(high) - std::log10(low) < 2) && (i * b[j] >= low && i * b[j] <= high)) { if (i * b[j] < 1500) { @@ -729,11 +730,11 @@ std::vector> SaSpectrumView::makeLogAmpTics(int lo // to the sizeHint() (denser scale for bigger window). if ((high - low) < 20 * ((float)height() / sizeHint().height())) { - increment = pow(10, 0.3); // 3 dB steps when really zoomed in + increment = fastPow10f(0.3f); // 3 dB steps when really zoomed in } else if (high - low < 45 * ((float)height() / sizeHint().height())) { - increment = pow(10, 0.6); // 6 dB steps when sufficiently zoomed in + increment = fastPow10f(0.6f); // 6 dB steps when sufficiently zoomed in } else { @@ -742,11 +743,11 @@ std::vector> SaSpectrumView::makeLogAmpTics(int lo // Generate n dB increments, start checking at -90 dB. Limits are tweaked // just a little bit to make sure float comparisons do not miss edges. - for (float i = 0.000000001f; 10 * log10(i) <= (high + 0.001); i *= increment) + for (float i = 0.000000001f; 10 * std::log10(i) <= (high + 0.001); i *= increment) { - if (10 * log10(i) >= (low - 0.001)) + if (10 * std::log10(i) >= (low - 0.001)) { - result.emplace_back(i, std::to_string((int)std::round(10 * log10(i)))); + result.emplace_back(i, std::to_string((int)std::round(10 * std::log10(i)))); } } return result; @@ -766,8 +767,8 @@ std::vector> SaSpectrumView::makeLinearAmpTics(int float split = (float)height() / sizeHint().height() >= 1.5 ? 10.0 : 5.0; // convert limits to linear scale - float lin_low = pow(10, low / 10.0); - float lin_high = pow(10, high / 10.0); + float lin_low = fastPow10f(low / 10.0); + float lin_high = fastPow10f(high / 10.0); // Linear scale will vary widely, so instead of trying to craft extra nice // multiples, just generate a few evenly spaced increments across the range, diff --git a/plugins/TripleOscillator/TripleOscillator.cpp b/plugins/TripleOscillator/TripleOscillator.cpp index f04cee818..61a6c4919 100644 --- a/plugins/TripleOscillator/TripleOscillator.cpp +++ b/plugins/TripleOscillator/TripleOscillator.cpp @@ -175,9 +175,8 @@ void OscillatorObject::updateVolume() void OscillatorObject::updateDetuningLeft() { - m_detuningLeft = powf( 2.0f, ( (float)m_coarseModel.value() * 100.0f - + (float)m_fineLeftModel.value() ) / 1200.0f ) - / Engine::audioEngine()->outputSampleRate(); + m_detuningLeft = std::exp2((m_coarseModel.value() * 100.0f + m_fineLeftModel.value()) / 1200.0f) + / Engine::audioEngine()->outputSampleRate(); } @@ -185,9 +184,8 @@ void OscillatorObject::updateDetuningLeft() void OscillatorObject::updateDetuningRight() { - m_detuningRight = powf( 2.0f, ( (float)m_coarseModel.value() * 100.0f - + (float)m_fineRightModel.value() ) / 1200.0f ) - / Engine::audioEngine()->outputSampleRate(); + m_detuningRight = std::exp2((m_coarseModel.value() * 100.0f + m_fineRightModel.value()) / 1200.0f) + / Engine::audioEngine()->outputSampleRate(); } diff --git a/plugins/Watsyn/Watsyn.cpp b/plugins/Watsyn/Watsyn.cpp index 2749b2daf..6ce1beced 100644 --- a/plugins/Watsyn/Watsyn.cpp +++ b/plugins/Watsyn/Watsyn.cpp @@ -132,9 +132,9 @@ void WatsynObject::renderOutput( fpp_t _frames ) // if phase mod, add to phases if( m_amod == MOD_PM ) { - A1_lphase = fmodf( A1_lphase + A2_L * PMOD_AMT, WAVELEN ); + A1_lphase = std::fmod(A1_lphase + A2_L * PMOD_AMT, WAVELEN); if( A1_lphase < 0 ) A1_lphase += WAVELEN; - A1_rphase = fmodf( A1_rphase + A2_R * PMOD_AMT, WAVELEN ); + A1_rphase = std::fmod(A1_rphase + A2_R * PMOD_AMT, WAVELEN); if( A1_rphase < 0 ) A1_rphase += WAVELEN; } // A1 @@ -166,9 +166,9 @@ void WatsynObject::renderOutput( fpp_t _frames ) // if phase mod, add to phases if( m_bmod == MOD_PM ) { - B1_lphase = fmodf( B1_lphase + B2_L * PMOD_AMT, WAVELEN ); + B1_lphase = std::fmod(B1_lphase + B2_L * PMOD_AMT, WAVELEN); if( B1_lphase < 0 ) B1_lphase += WAVELEN; - B1_rphase = fmodf( B1_rphase + B2_R * PMOD_AMT, WAVELEN ); + B1_rphase = std::fmod(B1_rphase + B2_R * PMOD_AMT, WAVELEN); if( B1_rphase < 0 ) B1_rphase += WAVELEN; } // B1 @@ -222,9 +222,9 @@ void WatsynObject::renderOutput( fpp_t _frames ) for( int i = 0; i < NUM_OSCS; i++ ) { m_lphase[i] += ( static_cast( WAVELEN ) / ( m_samplerate / ( m_nph->frequency() * m_parent->m_lfreq[i] ) ) ); - m_lphase[i] = fmodf( m_lphase[i], WAVELEN ); + m_lphase[i] = std::fmod(m_lphase[i], WAVELEN); m_rphase[i] += ( static_cast( WAVELEN ) / ( m_samplerate / ( m_nph->frequency() * m_parent->m_rfreq[i] ) ) ); - m_rphase[i] = fmodf( m_rphase[i], WAVELEN ); + m_rphase[i] = std::fmod(m_rphase[i], WAVELEN); } } @@ -596,32 +596,32 @@ void WatsynInstrument::updateVolumes() void WatsynInstrument::updateFreqA1() { // calculate frequencies - m_lfreq[A1_OSC] = ( a1_mult.value() / 8 ) * powf( 2, a1_ltune.value() / 1200 ); - m_rfreq[A1_OSC] = ( a1_mult.value() / 8 ) * powf( 2, a1_rtune.value() / 1200 ); + m_lfreq[A1_OSC] = (a1_mult.value() / 8) * std::exp2(a1_ltune.value() / 1200); + m_rfreq[A1_OSC] = (a1_mult.value() / 8) * std::exp2(a1_rtune.value() / 1200); } void WatsynInstrument::updateFreqA2() { // calculate frequencies - m_lfreq[A2_OSC] = ( a2_mult.value() / 8 ) * powf( 2, a2_ltune.value() / 1200 ); - m_rfreq[A2_OSC] = ( a2_mult.value() / 8 ) * powf( 2, a2_rtune.value() / 1200 ); + m_lfreq[A2_OSC] = (a2_mult.value() / 8) * std::exp2(a2_ltune.value() / 1200); + m_rfreq[A2_OSC] = (a2_mult.value() / 8) * std::exp2(a2_rtune.value() / 1200); } void WatsynInstrument::updateFreqB1() { // calculate frequencies - m_lfreq[B1_OSC] = ( b1_mult.value() / 8 ) * powf( 2, b1_ltune.value() / 1200 ); - m_rfreq[B1_OSC] = ( b1_mult.value() / 8 ) * powf( 2, b1_rtune.value() / 1200 ); + m_lfreq[B1_OSC] = (b1_mult.value() / 8) * std::exp2(b1_ltune.value() / 1200); + m_rfreq[B1_OSC] = (b1_mult.value() / 8) * std::exp2(b1_rtune.value() / 1200); } void WatsynInstrument::updateFreqB2() { // calculate frequencies - m_lfreq[B2_OSC] = ( b2_mult.value() / 8 ) * powf( 2, b2_ltune.value() / 1200 ); - m_rfreq[B2_OSC] = ( b2_mult.value() / 8 ) * powf( 2, b2_rtune.value() / 1200 ); + m_lfreq[B2_OSC] = (b2_mult.value() / 8) * std::exp2(b2_ltune.value() / 1200); + m_rfreq[B2_OSC] = (b2_mult.value() / 8) * std::exp2(b2_rtune.value() / 1200); } diff --git a/plugins/Xpressive/ExprSynth.cpp b/plugins/Xpressive/ExprSynth.cpp index cd2cfca5c..715bf453c 100644 --- a/plugins/Xpressive/ExprSynth.cpp +++ b/plugins/Xpressive/ExprSynth.cpp @@ -511,7 +511,7 @@ struct harmonic_cent { static inline float process(float x) { - return powf(2, x / 1200); + return std::exp2(x / 1200); } }; static freefunc1 harmonic_cent_func; @@ -519,7 +519,7 @@ struct harmonic_semitone { static inline float process(float x) { - return powf(2, x / 12); + return std::exp2(x / 12); } }; static freefunc1 harmonic_semitone_func; diff --git a/src/core/AutomationClip.cpp b/src/core/AutomationClip.cpp index dc496fa04..6d99abcc1 100644 --- a/src/core/AutomationClip.cpp +++ b/src/core/AutomationClip.cpp @@ -647,8 +647,7 @@ float AutomationClip::valueAt( timeMap::const_iterator v, int offset ) const float m1 = OUTTAN(v) * numValues * m_tension; float m2 = INTAN(v + 1) * numValues * m_tension; - auto t2 = pow(t, 2); - auto t3 = pow(t, 3); + auto t2 = t * t, t3 = t2 * t; return (2 * t3 - 3 * t2 + 1) * OUTVAL(v) + (t3 - 2 * t2 + t) * m1 + (-2 * t3 + 3 * t2) * INVAL(v + 1) diff --git a/src/core/DrumSynth.cpp b/src/core/DrumSynth.cpp index 5421886f8..85c2a1d17 100644 --- a/src/core/DrumSynth.cpp +++ b/src/core/DrumSynth.cpp @@ -42,7 +42,6 @@ namespace lmms { using namespace std; // const int Fs = 44100; -const float TwoPi = 6.2831853f; const int MAX = 0; const int ENV = 1; const int PNT = 2; @@ -172,37 +171,19 @@ void DrumSynth::GetEnv(int env, const char* sec, const char* key, QString ini) float DrumSynth::waveform(float ph, int form) { - float w; - - switch (form) - { - case 0: - w = static_cast(sin(fmod(ph, TwoPi))); - break; // sine - case 1: - w = static_cast(fabs(2.0f * static_cast(sin(fmod(0.5f * ph, TwoPi))) - 1.f)); - break; // sine^2 - case 2: - while (ph < TwoPi) - { - ph += TwoPi; - } - w = 0.6366197f * static_cast(fmod(ph, TwoPi) - 1.f); // tri - if (w > 1.f) - { - w = 2.f - w; - } - break; - case 3: - w = ph - TwoPi * static_cast(static_cast(ph / TwoPi)); // saw - w = (0.3183098f * w) - 1.f; - break; - default: - w = (sin(fmod(ph, TwoPi)) > 0.0) ? 1.f : -1.f; - break; // square - } - - return w; + // sine + if (form == 0) { return std::sin(ph); } + // sine^2 + if (form == 1) { return std::abs(2.f * std::sin(0.5f * ph)) - 1.f; } + // sawtooth with range [0, 1], used to generate triangle, sawtooth, and square + auto ph_tau = ph / numbers::tau_v; + auto saw01 = ph_tau - std::floor(ph_tau); + // triangle + if (form == 2) { return 1.f - 4.f * std::abs(saw01 - 0.5f); } + // sawtooth + if (form == 3) { return 2.f * saw01 - 1.f; } + // square + return (saw01 < 0.5f) ? 1.f : -1.f; } int DrumSynth::GetPrivateProfileString( @@ -434,7 +415,7 @@ int DrumSynth::GetDSFileSamples(QString dsfile, int16_t*& wave, int channels, sa { a = 1.f; b = -NT / 50.f; - c = static_cast(fabs(static_cast(NT))) / 100.f; + c = std::abs(static_cast(NT)) / 100.f; g = NL; } @@ -448,19 +429,19 @@ int DrumSynth::GetDSFileSamples(QString dsfile, int16_t*& wave, int channels, sa sliLev[0] = GetPrivateProfileInt(sec, "Level", 128, dsfile); TL = static_cast(sliLev[0] * sliLev[0]) * mem_t; GetEnv(1, sec, "Envelope", dsfile); - F1 = MasterTune * TwoPi * GetPrivateProfileFloat(sec, "F1", 200.0, dsfile) / Fs; - if (fabs(F1) < 0.001f) + F1 = MasterTune * numbers::tau_v * GetPrivateProfileFloat(sec, "F1", 200.0, dsfile) / Fs; + if (std::abs(F1) < 0.001f) { F1 = 0.001f; // to prevent overtone ratio div0 } - F2 = MasterTune * TwoPi * GetPrivateProfileFloat(sec, "F2", 120.0, dsfile) / Fs; + F2 = MasterTune * numbers::tau_v * GetPrivateProfileFloat(sec, "F2", 120.0, dsfile) / Fs; TDroopRate = GetPrivateProfileFloat(sec, "Droop", 0.f, dsfile); if (TDroopRate > 0.f) { TDroopRate = fastPow10f((TDroopRate - 20.0f) / 30.0f); TDroopRate = TDroopRate * -4.f / envData[1][MAX]; TDroop = 1; - F2 = F1 + ((F2 - F1) / (1.f - static_cast(exp(TDroopRate * envData[1][MAX])))); + F2 = F1 + ((F2 - F1) / (1.f - std::exp(TDroopRate * envData[1][MAX]))); ddF = F1 - F2; } else @@ -479,8 +460,8 @@ int DrumSynth::GetDSFileSamples(QString dsfile, int16_t*& wave, int channels, sa GetEnv(3, sec, "Envelope1", dsfile); GetEnv(4, sec, "Envelope2", dsfile); OMode = GetPrivateProfileInt(sec, "Method", 2, dsfile); - OF1 = MasterTune * TwoPi * GetPrivateProfileFloat(sec, "F1", 200.0, dsfile) / Fs; - OF2 = MasterTune * TwoPi * GetPrivateProfileFloat(sec, "F2", 120.0, dsfile) / Fs; + OF1 = MasterTune * numbers::tau_v * GetPrivateProfileFloat(sec, "F1", 200.0, dsfile) / Fs; + OF2 = MasterTune * numbers::tau_v * GetPrivateProfileFloat(sec, "F2", 120.0, dsfile) / Fs; OW1 = GetPrivateProfileInt(sec, "Wave1", 0, dsfile); OW2 = GetPrivateProfileInt(sec, "Wave2", 0, dsfile); OBal2 = static_cast(GetPrivateProfileInt(sec, "Param", 50, dsfile)); @@ -508,8 +489,8 @@ int DrumSynth::GetDSFileSamples(QString dsfile, int16_t*& wave, int channels, sa OcQ = OcA * OcA; OcF = (1.8f - 0.7f * OcQ) * 0.92f; // multiply by env 2 OcA *= 1.0f + 4.0f * OBal1; // level is a compromise! - Ocf1 = TwoPi / OF1; - Ocf2 = TwoPi / OF2; + Ocf1 = numbers::tau_v / OF1; + Ocf2 = numbers::tau_v / OF2; for (i = 0; i < 6; i++) { Oc[i][0] = Oc[i][1] = Ocf1 + (Ocf2 - Ocf1) * 0.2f * static_cast(i); @@ -521,12 +502,12 @@ int DrumSynth::GetDSFileSamples(QString dsfile, int16_t*& wave, int channels, sa BON = chkOn[3]; sliLev[3] = GetPrivateProfileInt(sec, "Level", 128, dsfile); BL = static_cast(sliLev[3] * sliLev[3]) * mem_b; - BF = MasterTune * TwoPi * GetPrivateProfileFloat(sec, "F", 1000.0, dsfile) / Fs; - BPhi = TwoPi / 8.f; + BF = MasterTune * numbers::tau_v * GetPrivateProfileFloat(sec, "F", 1000.0, dsfile) / Fs; + BPhi = numbers::tau_v / 8.f; GetEnv(5, sec, "Envelope", dsfile); BFStep = GetPrivateProfileInt(sec, "dF", 50, dsfile); BQ = static_cast(BFStep); - BQ = BQ * BQ / (10000.f - 6600.f * (static_cast(sqrt(BF)) - 0.19f)); + BQ = BQ * BQ / (10000.f - 6600.f * (std::sqrt(BF) - 0.19f)); BFStep = 1 + static_cast((40.f - (BFStep / 2.5f)) / (BQ + 1.f + (1.f * BF))); strcpy(sec, "NoiseBand2"); @@ -534,12 +515,12 @@ int DrumSynth::GetDSFileSamples(QString dsfile, int16_t*& wave, int channels, sa BON2 = chkOn[4]; sliLev[4] = GetPrivateProfileInt(sec, "Level", 128, dsfile); BL2 = static_cast(sliLev[4] * sliLev[4]) * mem_b; - BF2 = MasterTune * TwoPi * GetPrivateProfileFloat(sec, "F", 1000.0, dsfile) / Fs; - BPhi2 = TwoPi / 8.f; + BF2 = MasterTune * numbers::tau_v * GetPrivateProfileFloat(sec, "F", 1000.0, dsfile) / Fs; + BPhi2 = numbers::tau_v / 8.f; GetEnv(6, sec, "Envelope", dsfile); BFStep2 = GetPrivateProfileInt(sec, "dF", 50, dsfile); BQ2 = static_cast(BFStep2); - BQ2 = BQ2 * BQ2 / (10000.f - 6600.f * (static_cast(sqrt(BF2)) - 0.19f)); + BQ2 = BQ2 * BQ2 / (10000.f - 6600.f * (std::sqrt(BF2) - 0.19f)); BFStep2 = 1 + static_cast((40 - (BFStep2 / 2.5)) / (BQ2 + 1 + (1 * BF2))); // read distortion parameters @@ -659,7 +640,7 @@ int DrumSynth::GetDSFileSamples(QString dsfile, int16_t*& wave, int channels, sa { for (t = tpos; t <= tplus; t++) { - phi[t - tpos] = F2 + (ddF * static_cast(exp(t * TDroopRate))); + phi[t - tpos] = F2 + (ddF * std::exp(t * TDroopRate)); } } else @@ -681,7 +662,7 @@ int DrumSynth::GetDSFileSamples(QString dsfile, int16_t*& wave, int channels, sa UpdateEnv(1, t); } Tphi = Tphi + phi[totmp]; - DF[totmp] += TL * envData[1][ENV] * static_cast(sin(fmod(Tphi, TwoPi))); // overflow? + DF[totmp] += TL * envData[1][ENV] * std::sin(std::fmod(Tphi, numbers::tau_v)); // overflow? } if (t >= envData[1][MAX]) { @@ -714,7 +695,7 @@ int DrumSynth::GetDSFileSamples(QString dsfile, int16_t*& wave, int channels, sa } BPhi = BPhi + BF + BQ * BdF; botmp = t - tpos; - DF[botmp] = DF[botmp] + static_cast(cos(fmod(BPhi, TwoPi))) * envData[5][ENV] * BL; + DF[botmp] = DF[botmp] + std::cos(std::fmod(BPhi, numbers::tau_v)) * envData[5][ENV] * BL; } if (t >= envData[5][MAX]) { @@ -740,7 +721,7 @@ int DrumSynth::GetDSFileSamples(QString dsfile, int16_t*& wave, int channels, sa } BPhi2 = BPhi2 + BF2 + BQ2 * BdF2; botmp = t - tpos; - DF[botmp] = DF[botmp] + static_cast(cos(fmod(BPhi2, TwoPi))) * envData[6][ENV] * BL2; + DF[botmp] = DF[botmp] + std::cos(std::fmod(BPhi2, numbers::tau_v)) * envData[6][ENV] * BL2; } if (t >= envData[6][MAX]) { diff --git a/src/core/LadspaManager.cpp b/src/core/LadspaManager.cpp index e4d472bd1..481b52a2e 100644 --- a/src/core/LadspaManager.cpp +++ b/src/core/LadspaManager.cpp @@ -436,8 +436,8 @@ float LadspaManager::getDefaultSetting( const ladspa_key_t & _plugin, if( LADSPA_IS_HINT_LOGARITHMIC ( hintDescriptor ) ) { - return( exp( log( portRangeHint->LowerBound ) * 0.75 + - log( portRangeHint->UpperBound ) * 0.25 ) ); + return std::exp(std::log(portRangeHint->LowerBound) + * 0.75 + std::log(portRangeHint->UpperBound) * 0.25); } else { @@ -448,8 +448,7 @@ float LadspaManager::getDefaultSetting( const ladspa_key_t & _plugin, if( LADSPA_IS_HINT_LOGARITHMIC ( hintDescriptor ) ) { - return( sqrt( portRangeHint->LowerBound - * portRangeHint->UpperBound ) ); + return std::sqrt(portRangeHint->LowerBound * portRangeHint->UpperBound); } else { @@ -460,8 +459,8 @@ float LadspaManager::getDefaultSetting( const ladspa_key_t & _plugin, if( LADSPA_IS_HINT_LOGARITHMIC ( hintDescriptor ) ) { - return( exp( log( portRangeHint->LowerBound ) * 0.25 + - log( portRangeHint->UpperBound ) * 0.75 ) ); + return std::exp(std::log(portRangeHint->LowerBound) + * 0.25 + std::log(portRangeHint->UpperBound) * 0.75); } else { diff --git a/src/core/Microtuner.cpp b/src/core/Microtuner.cpp index 46d83017f..59f550141 100644 --- a/src/core/Microtuner.cpp +++ b/src/core/Microtuner.cpp @@ -102,10 +102,10 @@ float Microtuner::keyToFreq(int key, int userBaseNote) const // Compute frequency of the middle note and return the final frequency const double octaveRatio = intervals[octaveDegree].getRatio(); - const float middleFreq = (keymap->getBaseFreq() / pow(octaveRatio, (baseScaleOctave + baseKeymapOctave))) - / intervals[baseScaleDegree].getRatio(); + const float middleFreq = (keymap->getBaseFreq() / std::pow(octaveRatio, baseScaleOctave + baseKeymapOctave)) + / intervals[baseScaleDegree].getRatio(); - return middleFreq * intervals[scaleDegree].getRatio() * pow(octaveRatio, keymapOctave + scaleOctave); + return middleFreq * intervals[scaleDegree].getRatio() * std::pow(octaveRatio, keymapOctave + scaleOctave); } int Microtuner::octaveSize() const diff --git a/src/core/MixHelpers.cpp b/src/core/MixHelpers.cpp index 01ea0386e..c10e4c50c 100644 --- a/src/core/MixHelpers.cpp +++ b/src/core/MixHelpers.cpp @@ -71,7 +71,7 @@ bool isSilent( const SampleFrame* src, int frames ) for( int i = 0; i < frames; ++i ) { - if( fabsf( src[i][0] ) >= silenceThreshold || fabsf( src[i][1] ) >= silenceThreshold ) + if (std::abs(src[i][0]) >= silenceThreshold || std::abs(src[i][1]) >= silenceThreshold) { return false; } diff --git a/src/core/NotePlayHandle.cpp b/src/core/NotePlayHandle.cpp index 7d649e1dd..e2aa02ddc 100644 --- a/src/core/NotePlayHandle.cpp +++ b/src/core/NotePlayHandle.cpp @@ -532,8 +532,8 @@ void NotePlayHandle::updateFrequency() if (m_instrumentTrack->isKeyMapped(transposedKey)) { const auto frequency = m_instrumentTrack->m_microtuner.keyToFreq(transposedKey, baseNote); - m_frequency = frequency * powf(2.f, (detune + instrumentPitch / 100) / 12.f); - m_unpitchedFrequency = frequency * powf(2.f, detune / 12.f); + m_frequency = frequency * std::exp2((detune + instrumentPitch / 100) / 12.f); + m_unpitchedFrequency = frequency * std::exp2(detune / 12.f); } else { @@ -544,8 +544,8 @@ void NotePlayHandle::updateFrequency() { // default key mapping and 12-TET frequency computation with default 440 Hz base note frequency const float pitch = (key() - baseNote + masterPitch + detune) / 12.0f; - m_frequency = DefaultBaseFreq * powf(2.0f, pitch + instrumentPitch / (100 * 12.0f)); - m_unpitchedFrequency = DefaultBaseFreq * powf(2.0f, pitch); + m_frequency = DefaultBaseFreq * std::exp2(pitch + instrumentPitch / (100 * 12.0f)); + m_unpitchedFrequency = DefaultBaseFreq * std::exp2(pitch); } for (auto it : m_subNotes) diff --git a/src/core/Oscillator.cpp b/src/core/Oscillator.cpp index 6c3d51643..82d6dfe81 100644 --- a/src/core/Oscillator.cpp +++ b/src/core/Oscillator.cpp @@ -142,8 +142,8 @@ void Oscillator::generateTriangleWaveTable(int bands, sample_t* table, int first { for (int n = firstBand | 1; n <= bands; n += 2) { - table[i] += (n & 2 ? -1.0f : 1.0f) / powf(n, 2.0f) * - std::sin(numbers::tau_v * n * i / (float)OscillatorConstants::WAVETABLE_LENGTH) / (numbers::pi_sqr_v / 8); + table[i] += (n & 2 ? -1.0f : 1.0f) / (n * n) * + std::sin(numbers::tau_v * n * i / (float)OscillatorConstants::WAVETABLE_LENGTH) / (numbers::pi_sqr_v / 8.0f); } } } diff --git a/src/core/Scale.cpp b/src/core/Scale.cpp index 93279f2bc..6f5c8a59c 100644 --- a/src/core/Scale.cpp +++ b/src/core/Scale.cpp @@ -36,7 +36,7 @@ Interval::Interval(float cents) : m_denominator(0), m_cents(cents) { - m_ratio = powf(2.f, m_cents / 1200.f); + m_ratio = std::exp2(m_cents / 1200.f); } Interval::Interval(uint32_t numerator, uint32_t denominator) : @@ -68,7 +68,7 @@ void Interval::loadSettings(const QDomElement &element) m_denominator = element.attribute("den", "0").toULong(); m_cents = element.attribute("cents", "0").toDouble(); if (m_denominator) {m_ratio = static_cast(m_numerator) / m_denominator;} - else {m_ratio = powf(2.f, m_cents / 1200.f);} + else { m_ratio = std::exp2(m_cents / 1200.f); } } diff --git a/src/core/audio/AudioSoundIo.cpp b/src/core/audio/AudioSoundIo.cpp index 1d63ada3a..851592018 100644 --- a/src/core/audio/AudioSoundIo.cpp +++ b/src/core/audio/AudioSoundIo.cpp @@ -152,7 +152,7 @@ AudioSoundIo::AudioSoundIo( bool & outSuccessful, AudioEngine * _audioEngine ) : break; } if (closestSupportedSampleRate == -1 || - abs(range->max - currentSampleRate) < abs(closestSupportedSampleRate - currentSampleRate)) + std::abs(range->max - currentSampleRate) < std::abs(closestSupportedSampleRate - currentSampleRate)) { closestSupportedSampleRate = range->max; } diff --git a/src/core/lv2/Lv2Proc.cpp b/src/core/lv2/Lv2Proc.cpp index 7cd9d3a50..e656f0cf1 100644 --- a/src/core/lv2/Lv2Proc.cpp +++ b/src/core/lv2/Lv2Proc.cpp @@ -591,7 +591,7 @@ void Lv2Proc::createPort(std::size_t portNum) // make multiples of 0.01 (or 0.1 for larger values) float minStep = (stepSize >= 1.0f) ? 0.1f : 0.01f; - stepSize -= fmodf(stepSize, minStep); + stepSize -= std::fmod(stepSize, minStep); stepSize = std::max(stepSize, minStep); ctrl->m_connectedModel.reset( diff --git a/src/gui/GuiApplication.cpp b/src/gui/GuiApplication.cpp index 31b989a92..8c674112d 100644 --- a/src/gui/GuiApplication.cpp +++ b/src/gui/GuiApplication.cpp @@ -253,7 +253,7 @@ QFont GuiApplication::getWin32SystemFont() { // height is in pixels, convert to points HDC hDC = GetDC( nullptr ); - pointSize = MulDiv( abs( pointSize ), 72, GetDeviceCaps( hDC, LOGPIXELSY ) ); + pointSize = MulDiv(std::abs(pointSize), 72, GetDeviceCaps(hDC, LOGPIXELSY)); ReleaseDC( nullptr, hDC ); } diff --git a/src/gui/clips/ClipView.cpp b/src/gui/clips/ClipView.cpp index 9eb6acb6b..09dc79607 100644 --- a/src/gui/clips/ClipView.cpp +++ b/src/gui/clips/ClipView.cpp @@ -1414,7 +1414,7 @@ TimePos ClipView::draggedClipPos( QMouseEvent * me ) endQ = endQ - m_clip->length(); // Select the position closest to actual position - if ( abs(newPos - startQ) < abs(newPos - endQ) ) newPos = startQ; + if (std::abs(newPos - startQ) < std::abs(newPos - endQ)) { newPos = startQ; } else newPos = endQ; } else @@ -1457,7 +1457,7 @@ TimePos ClipView::quantizeSplitPos( TimePos midiPos, bool shiftMode ) const TimePos rightOff = m_clip->length() - midiPos; const TimePos rightPos = m_clip->length() - rightOff.quantize( snapSize ); //...whichever gives a position closer to the cursor - if ( abs(leftPos - midiPos) < abs(rightPos - midiPos) ) { return leftPos; } + if (std::abs(leftPos - midiPos) < std::abs(rightPos - midiPos)) { return leftPos; } else { return rightPos; } } else diff --git a/src/gui/editors/AutomationEditor.cpp b/src/gui/editors/AutomationEditor.cpp index ad7d11bd0..e3867e7ab 100644 --- a/src/gui/editors/AutomationEditor.cpp +++ b/src/gui/editors/AutomationEditor.cpp @@ -1630,7 +1630,7 @@ void AutomationEditor::wheelEvent(QWheelEvent * we ) } // FIXME: Reconsider if determining orientation is necessary in Qt6. - else if(abs(we->angleDelta().x()) > abs(we->angleDelta().y())) // scrolling is horizontal + else if (std::abs(we->angleDelta().x()) > std::abs(we->angleDelta().y())) // scrolling is horizontal { adjustLeftRightScoll(we->angleDelta().x()); } diff --git a/src/gui/editors/PianoRoll.cpp b/src/gui/editors/PianoRoll.cpp index 4700372ce..387a10ab4 100644 --- a/src/gui/editors/PianoRoll.cpp +++ b/src/gui/editors/PianoRoll.cpp @@ -2813,7 +2813,7 @@ void PianoRoll::dragNotes(int x, int y, bool alt, bool shift, bool ctrl) TimePos mousePosQ = mousePos.quantize(static_cast(quantization()) / DefaultTicksPerBar); TimePos mousePosEndQ = mousePosEnd.quantize(static_cast(quantization()) / DefaultTicksPerBar); - bool snapEnd = abs(mousePosEndQ - mousePosEnd) < abs(mousePosQ - mousePos); + bool snapEnd = std::abs(mousePosEndQ - mousePosEnd) < std::abs(mousePosQ - mousePos); // Set the offset noteOffset = snapEnd @@ -3878,7 +3878,7 @@ void PianoRoll::wheelEvent(QWheelEvent * we ) } // FIXME: Reconsider if determining orientation is necessary in Qt6. - else if(abs(we->angleDelta().x()) > abs(we->angleDelta().y())) // scrolling is horizontal + else if (std::abs(we->angleDelta().x()) > std::abs(we->angleDelta().y())) // scrolling is horizontal { adjustLeftRightScoll(we->angleDelta().x()); } diff --git a/src/gui/instrument/PianoView.cpp b/src/gui/instrument/PianoView.cpp index aeeb1fbbc..88bb48332 100644 --- a/src/gui/instrument/PianoView.cpp +++ b/src/gui/instrument/PianoView.cpp @@ -777,12 +777,12 @@ IntModel* PianoView::getNearestMarker(int key, QString* title) const int first = m_piano->instrumentTrack()->firstKey(); const int last = m_piano->instrumentTrack()->lastKey(); - if (abs(key - base) < abs(key - first) && abs(key - base) < abs(key - last)) + if (std::abs(key - base) < std::abs(key - first) && std::abs(key - base) < std::abs(key - last)) { if (title) {*title = tr("Base note");} return m_piano->instrumentTrack()->baseNoteModel(); } - else if (abs(key - first) < abs(key - last)) + else if (std::abs(key - first) < std::abs(key - last)) { if (title) {*title = tr("First note");} return m_piano->instrumentTrack()->firstKeyModel(); diff --git a/src/gui/widgets/Graph.cpp b/src/gui/widgets/Graph.cpp index 0781d4f11..4e06e2f1a 100644 --- a/src/gui/widgets/Graph.cpp +++ b/src/gui/widgets/Graph.cpp @@ -735,7 +735,7 @@ void graphModel::clearInvisible() void graphModel::drawSampleAt( int x, float val ) { //snap to the grid - val -= ( m_step != 0.0 ) ? fmod( val, m_step ) * m_step : 0; + val -= (m_step != 0.0) ? std::fmod(val, m_step) * m_step : 0; // boundary crop x = qMax( 0, qMin( length()-1, x ) ); diff --git a/src/gui/widgets/Knob.cpp b/src/gui/widgets/Knob.cpp index 2f7812993..7aa676953 100644 --- a/src/gui/widgets/Knob.cpp +++ b/src/gui/widgets/Knob.cpp @@ -313,8 +313,8 @@ void Knob::setTextColor( const QColor & c ) QLineF Knob::calculateLine( const QPointF & _mid, float _radius, float _innerRadius ) const { const float rarc = m_angle * numbers::pi_v / 180.0; - const float ca = cos( rarc ); - const float sa = -sin( rarc ); + const float ca = std::cos(rarc); + const float sa = -std::sin(rarc); return QLineF( _mid.x() - sa*_innerRadius, _mid.y() - ca*_innerRadius, _mid.x() - sa*_radius, _mid.y() - ca*_radius ); diff --git a/src/gui/widgets/LcdFloatSpinBox.cpp b/src/gui/widgets/LcdFloatSpinBox.cpp index 37d262e4b..4b476bc0c 100644 --- a/src/gui/widgets/LcdFloatSpinBox.cpp +++ b/src/gui/widgets/LcdFloatSpinBox.cpp @@ -43,6 +43,7 @@ #include "GuiApplication.h" #include "FontHelper.h" #include "MainWindow.h" +#include "lmms_math.h" namespace lmms::gui { @@ -109,7 +110,7 @@ void LcdFloatSpinBox::layoutSetup(const QString &style) void LcdFloatSpinBox::update() { - const int digitValue = std::pow(10.f, m_fractionDisplay.numDigits()); + const int digitValue = fastPow10f(m_fractionDisplay.numDigits()); float value = model()->value(); int fraction = std::abs(std::round((value - static_cast(value)) * digitValue)); if (fraction == digitValue)