diff --git a/plugins/delay/delayeffect.cpp b/plugins/delay/delayeffect.cpp index f011151a5..939cae7e2 100644 --- a/plugins/delay/delayeffect.cpp +++ b/plugins/delay/delayeffect.cpp @@ -91,7 +91,7 @@ bool DelayEffect::processAudioBuffer( sampleFrame* buf, const fpp_t frames ) { dryS[0] = buf[f][0]; dryS[1] = buf[f][1]; - m_delay->setLength( length * m_lfo->tick() ); + m_delay->setLength( ( float )length * ( float )m_lfo->tick() ); m_delay->tick( buf[f] ); buf[f][0] = ( d * dryS[0] ) + ( w * buf[f][0] ); diff --git a/plugins/delay/stereodelay.cpp b/plugins/delay/stereodelay.cpp index 4a7c5b081..5c641c087 100644 --- a/plugins/delay/stereodelay.cpp +++ b/plugins/delay/stereodelay.cpp @@ -25,12 +25,15 @@ #include "stereodelay.h" #include #include "lmms_basics.h" +#include "interpolation.h" +#include "lmms_math.h" -StereoDelay::StereoDelay( int maxLength, int sampleRate ) +StereoDelay::StereoDelay( int maxTime, int sampleRate ) { m_buffer = 0; - m_maxLength = maxLength * sampleRate; + m_maxTime = maxTime; + m_maxLength = maxTime * sampleRate; m_length = m_maxLength; m_index = 0; @@ -52,16 +55,26 @@ StereoDelay::~StereoDelay() -sampleFrame oldFrame; void StereoDelay::tick( sampleFrame frame ) { - oldFrame[0] = m_buffer[m_index][0]; - oldFrame[1] = m_buffer[m_index][1]; - m_buffer[m_index][0] = frame[0] + ( oldFrame[0] * m_feedback ); - m_buffer[m_index][1] = frame[1] + ( oldFrame[1] * m_feedback ); - frame[0] = oldFrame[0]; - frame[1] = oldFrame[1]; - m_index = m_index + 1 < m_length ? m_index + 1 : 0; + m_buffer[m_index][0] = frame[0]; + m_buffer[m_index][1] = frame[1]; + + int readIndex = m_index - ( int )m_length; + if( readIndex < 0 ) + { + readIndex += m_maxLength; + } + float fract = fraction( m_length ); + frame[0] = linearInterpolate( m_buffer[readIndex][0] , + m_buffer[( readIndex+1) % m_maxLength][0], fract ); + frame[1] = linearInterpolate( m_buffer[readIndex][1] , + m_buffer[( readIndex+1) % m_maxLength][1], fract ); + + m_buffer[m_index][0] += frame[0] * m_feedback; + m_buffer[m_index][1] += frame[1] * m_feedback; + + m_index = ( m_index + 1) % m_maxLength; } @@ -75,7 +88,7 @@ void StereoDelay::setSampleRate( int sampleRate ) } - m_buffer = new sampleFrame[sampleRate * m_maxLength]; + m_buffer = new sampleFrame[( int )( sampleRate * m_maxTime )]; } diff --git a/plugins/delay/stereodelay.h b/plugins/delay/stereodelay.h index cc174e32b..d1d7457ae 100644 --- a/plugins/delay/stereodelay.h +++ b/plugins/delay/stereodelay.h @@ -32,7 +32,7 @@ class StereoDelay public: StereoDelay( int maxLength, int sampleRate ); ~StereoDelay(); - inline void setLength( int length ) + inline void setLength( float length ) { if( length <= m_maxLength && length >= 0 ) { @@ -51,9 +51,10 @@ public: private: sampleFrame* m_buffer; int m_maxLength; - int m_length; + float m_length; int m_index; float m_feedback; + float m_maxTime; }; #endif // STEREODELAY_H