Added linear interpolation , with help from Vesa

This commit is contained in:
dave
2014-11-18 20:38:39 +00:00
parent 932d7905ba
commit e0c10e030b
3 changed files with 28 additions and 14 deletions

View File

@@ -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] );

View File

@@ -25,12 +25,15 @@
#include "stereodelay.h"
#include <cstdlib>
#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 )];
}

View File

@@ -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