From 1ffe1c073391ca80ae2bc0f83cd8103232c5903a Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Thu, 5 Feb 2009 13:17:21 +0000 Subject: [PATCH] simplified formulas for calculating envelope array resulting in about 3x performance with traditional FPU code; loops now can be vectorized by GCC 4.4 git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms/stable-0.4@2003 0778d3d1-df1d-0410-868b-ea421aaaa00d --- src/core/envelope_and_lfo_parameters.cpp | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/core/envelope_and_lfo_parameters.cpp b/src/core/envelope_and_lfo_parameters.cpp index f18c257b7b..b487cef9ef 100644 --- a/src/core/envelope_and_lfo_parameters.cpp +++ b/src/core/envelope_and_lfo_parameters.cpp @@ -245,10 +245,11 @@ inline void envelopeAndLFOParameters::fillLFOLevel( float * _buf, } fpp_t offset = 0; + const float lafI = 1.0f / m_lfoAttackFrames; for( ; offset < _frames && _frame < m_lfoAttackFrames; ++offset, ++_frame ) { - *_buf++ = m_lfoShapeData[offset] * _frame / m_lfoAttackFrames; + *_buf++ = m_lfoShapeData[offset] * _frame * lafI; } for( ; offset < _frames; ++offset ) { @@ -411,39 +412,44 @@ void envelopeAndLFOParameters::updateSampleVars( void ) m_pahdEnv = new sample_t[m_pahdFrames]; m_rEnv = new sample_t[m_rFrames]; + const float aa = m_amountAdd; for( f_cnt_t i = 0; i < predelay_frames; ++i ) { - m_pahdEnv[i] = m_amountAdd; + m_pahdEnv[i] = aa; } f_cnt_t add = predelay_frames; + const float afI = ( 1.0f / attack_frames ) * m_amount; for( f_cnt_t i = 0; i < attack_frames; ++i ) { - m_pahdEnv[add + i] = ( (float)i / attack_frames ) * - m_amount + m_amountAdd; + m_pahdEnv[add+i] = i * afI + aa; } add += attack_frames; + const float amsum = m_amount + m_amountAdd; for( f_cnt_t i = 0; i < hold_frames; ++i ) { - m_pahdEnv[add + i] = m_amount + m_amountAdd; + m_pahdEnv[add + i] = amsum; } add += hold_frames; + const float dfI = (1.0 / decay_frames)*(m_sustainLevel-1)*m_amount; for( f_cnt_t i = 0; i < decay_frames; ++i ) { +/* m_pahdEnv[add + i] = ( m_sustainLevel + ( 1.0f - (float)i / decay_frames ) * ( 1.0f - m_sustainLevel ) ) * m_amount + m_amountAdd; +*/ + m_pahdEnv[add + i] = amsum + i*dfI; } + const float rfI = ( 1.0f / m_rFrames ) * m_amount; for( f_cnt_t i = 0; i < m_rFrames; ++i ) { - m_rEnv[i] = ( (float)( m_rFrames - i ) / m_rFrames - // * m_sustainLevel - ) * m_amount; + m_rEnv[i] = (float)( m_rFrames - i ) * rfI; } // save this calculation in real-time-part