From 653fd332f551625dbac7d8a5e2854dc3d579f5db Mon Sep 17 00:00:00 2001 From: curlymorphic Date: Mon, 1 May 2017 19:57:02 +0100 Subject: [PATCH] Remove glitching from the Flanger and Delay plugins The previous delay code was incorrectly not utalising the whole buffer, causing glitches when incressing the delay time, due to outputting incorrect data, This was apparent when using the lfo in the Delay and Flanger plugins. This has been rectified. The read index is now offset from the write index. and the complete buffer is used in a circular fashon. Flanger - resolved issue where the lfo could create negative delay lengths --- plugins/Delay/StereoDelay.cpp | 18 ++++++++++-------- plugins/Delay/StereoDelay.h | 2 +- plugins/Flanger/FlangerEffect.cpp | 4 ++-- plugins/Flanger/MonoDelay.cpp | 12 ++++++------ plugins/Flanger/MonoDelay.h | 2 +- 5 files changed, 20 insertions(+), 18 deletions(-) diff --git a/plugins/Delay/StereoDelay.cpp b/plugins/Delay/StereoDelay.cpp index 327dfda0331..d25f6b52b18 100644 --- a/plugins/Delay/StereoDelay.cpp +++ b/plugins/Delay/StereoDelay.cpp @@ -36,7 +36,7 @@ StereoDelay::StereoDelay( int maxTime, int sampleRate ) m_maxLength = maxTime * sampleRate; m_length = m_maxLength; - m_index = 0; + m_writeIndex = 0; m_feedback = 0.0f; setSampleRate( sampleRate ); } @@ -57,13 +57,13 @@ StereoDelay::~StereoDelay() void StereoDelay::tick( sampleFrame frame ) { - m_index = ( int )m_length > 0 - ? ( m_index + 1 ) % ( int ) m_length - : m_index; - float lOut = m_buffer[ m_index ][ 0 ]; - float rOut = m_buffer[ m_index ] [1 ]; - m_buffer[ m_index ][ 0 ] = frame[ 0 ] + ( lOut * m_feedback ); - m_buffer[ m_index ][ 1 ] = frame[ 1 ] + ( rOut * m_feedback ); + m_writeIndex = ( m_writeIndex + 1 ) % ( int )m_maxLength; + int readIndex = m_writeIndex - m_length; + if (readIndex < 0 ) { readIndex += m_maxLength; } + float lOut = m_buffer[ readIndex ][ 0 ]; + float rOut = m_buffer[ readIndex ] [1 ]; + m_buffer[ m_writeIndex ][ 0 ] = frame[ 0 ] + ( lOut * m_feedback ); + m_buffer[ m_writeIndex ][ 1 ] = frame[ 1 ] + ( rOut * m_feedback ); frame[ 0 ] = lOut; frame[ 1 ] = rOut; } @@ -71,6 +71,8 @@ void StereoDelay::tick( sampleFrame frame ) + + void StereoDelay::setSampleRate( int sampleRate ) { if( m_buffer ) diff --git a/plugins/Delay/StereoDelay.h b/plugins/Delay/StereoDelay.h index 4886149dcb8..a0dbdc22064 100644 --- a/plugins/Delay/StereoDelay.h +++ b/plugins/Delay/StereoDelay.h @@ -52,7 +52,7 @@ class StereoDelay sampleFrame* m_buffer; int m_maxLength; float m_length; - int m_index; + int m_writeIndex; float m_feedback; float m_maxTime; }; diff --git a/plugins/Flanger/FlangerEffect.cpp b/plugins/Flanger/FlangerEffect.cpp index f9d55bb602c..33ad8081b96 100644 --- a/plugins/Flanger/FlangerEffect.cpp +++ b/plugins/Flanger/FlangerEffect.cpp @@ -107,8 +107,8 @@ bool FlangerEffect::processAudioBuffer( sampleFrame *buf, const fpp_t frames ) dryS[0] = buf[f][0]; dryS[1] = buf[f][1]; m_lfo->tick(&leftLfo, &rightLfo); - m_lDelay->setLength( ( float )length + ( amplitude * leftLfo ) ); - m_rDelay->setLength( ( float )length+ ( amplitude * rightLfo ) ); + m_lDelay->setLength( ( float )length + amplitude * (leftLfo+1.0) ); + m_rDelay->setLength( ( float )length + amplitude * (rightLfo+1.0) ); if(invertFeedback) { m_lDelay->tick( &buf[f][1] ); diff --git a/plugins/Flanger/MonoDelay.cpp b/plugins/Flanger/MonoDelay.cpp index 534f0bcf80d..fc63d57d1be 100644 --- a/plugins/Flanger/MonoDelay.cpp +++ b/plugins/Flanger/MonoDelay.cpp @@ -34,7 +34,7 @@ MonoDelay::MonoDelay( int maxTime , int sampleRate ) m_maxLength = maxTime * sampleRate; m_length = m_maxLength; - m_index = 0; + m_writeIndex = 0; m_feedback = 0.0f; setSampleRate( sampleRate ); } @@ -54,11 +54,11 @@ MonoDelay::~MonoDelay() void MonoDelay::tick( sample_t* sample ) { - m_index = ( int )m_length > 0 - ? ( m_index + 1 ) % ( int )m_length - : m_index; - float out = m_buffer[ m_index ]; - m_buffer[ m_index ] = *sample + ( out * m_feedback ); + m_writeIndex = ( m_writeIndex + 1 ) % ( int )m_maxLength; + int readIndex = m_writeIndex - m_length; + if (readIndex < 0 ) { readIndex += m_maxLength; } + float out = m_buffer[ readIndex ]; + m_buffer[ m_writeIndex ] = *sample + ( out * m_feedback ); *sample = out; } diff --git a/plugins/Flanger/MonoDelay.h b/plugins/Flanger/MonoDelay.h index 8b06bff1bae..52898bfe45d 100644 --- a/plugins/Flanger/MonoDelay.h +++ b/plugins/Flanger/MonoDelay.h @@ -52,7 +52,7 @@ class MonoDelay sample_t* m_buffer; int m_maxLength; float m_length; - int m_index; + int m_writeIndex; float m_feedback; float m_maxTime; };