From ee3c9a13332a4e37d1d61c170edf5ed4e24f07b7 Mon Sep 17 00:00:00 2001 From: Dave French Date: Tue, 10 Feb 2015 13:47:17 +0000 Subject: [PATCH] Added a XY pad to the Delay Pluging. also added a volume control, and smothed the delay time input changes, to improve audio. --- plugins/Delay/CMakeLists.txt | 2 +- plugins/Delay/DelayControls.cpp | 7 +- plugins/Delay/DelayControls.h | 7 +- plugins/Delay/DelayControlsDialog.cpp | 88 ++++++++++++++++++++++++-- plugins/Delay/DelayControlsDialog.h | 20 ++++++ plugins/Delay/DelayEffect.cpp | 20 +++++- plugins/Delay/DelayEffect.h | 2 + plugins/Delay/StereoDelay.cpp | 2 +- plugins/Delay/artwork.png | Bin 9620 -> 14151 bytes 9 files changed, 138 insertions(+), 10 deletions(-) diff --git a/plugins/Delay/CMakeLists.txt b/plugins/Delay/CMakeLists.txt index 13c9ebb7f..ceb7ceb4a 100644 --- a/plugins/Delay/CMakeLists.txt +++ b/plugins/Delay/CMakeLists.txt @@ -1,3 +1,3 @@ INCLUDE(BuildPlugin) -BUILD_PLUGIN(delay DelayEffect.cpp DelayControls.cpp DelayControlsDialog.cpp Lfo.cpp StereoDelay.cpp MOCFILES DelayControls.h EMBEDDED_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.png") +BUILD_PLUGIN(delay DelayEffect.cpp DelayControls.cpp DelayControlsDialog.cpp Lfo.cpp StereoDelay.cpp MOCFILES DelayControls.h DelayControlsDialog.h ../Eq/EqFader.h EMBEDDED_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.png") diff --git a/plugins/Delay/DelayControls.cpp b/plugins/Delay/DelayControls.cpp index 604fd8e46..f8241b95e 100644 --- a/plugins/Delay/DelayControls.cpp +++ b/plugins/Delay/DelayControls.cpp @@ -35,9 +35,12 @@ DelayControls::DelayControls( DelayEffect* effect ): m_delayTimeModel( 0.5, 0.01, 20.0, 0.0001, 20000.0, this, tr( "Delay Samples" )) , m_feedbackModel(0.0f,0.0f,1.0f,0.01f,this,tr( "Feedback" ) ), m_lfoTimeModel(2.0, 0.01, 20.0, 0.0001, 20000.0, this, tr( "Lfo Frequency" ) ), - m_lfoAmountModel(0.0, 0.0, 2.0, 0.0001, 2000.0, this, tr ( "Lfo Amount" ) ) + m_lfoAmountModel(0.0, 0.0, 2.0, 0.0001, 2000.0, this, tr ( "Lfo Amount" ) ), + m_outGainModel( 0.0, -60.0, 20.0, 0.01, this, tr( "Output gain" ) ) { connect( Engine::mixer(), SIGNAL( sampleRateChanged() ), this, SLOT( changeSampleRate() ) ); + m_outPeakL = 0.0; + m_outPeakR = 0.0; } @@ -49,6 +52,7 @@ void DelayControls::loadSettings( const QDomElement &_this ) m_feedbackModel.loadSettings( _this, "FeebackAmount" ); m_lfoTimeModel.loadSettings( _this , "LfoFrequency"); m_lfoAmountModel.loadSettings( _this, "LfoAmount"); + m_outGainModel.loadSettings( _this, "OutGain" ); } @@ -60,6 +64,7 @@ void DelayControls::saveSettings( QDomDocument& doc, QDomElement& _this ) m_feedbackModel.saveSettings( doc, _this ,"FeebackAmount" ); m_lfoTimeModel.saveSettings( doc, _this, "LfoFrequency" ); m_lfoAmountModel.saveSettings( doc, _this ,"LfoAmount" ); + m_outGainModel.saveSettings( doc, _this, "OutGain" ); } diff --git a/plugins/Delay/DelayControls.h b/plugins/Delay/DelayControls.h index 4e4fb4f75..1cd987152 100644 --- a/plugins/Delay/DelayControls.h +++ b/plugins/Delay/DelayControls.h @@ -48,13 +48,17 @@ public: return "Delay"; } virtual int controlCount(){ - return 4; + return 5; } virtual EffectControlDialog* createView() { return new DelayControlsDialog( this ); } + float m_outPeakL; + float m_outPeakR; + + private slots: void changeSampleRate(); @@ -64,6 +68,7 @@ private: FloatModel m_feedbackModel; TempoSyncKnobModel m_lfoTimeModel; TempoSyncKnobModel m_lfoAmountModel; + FloatModel m_outGainModel; friend class DelayControlsDialog; friend class DelayEffect; diff --git a/plugins/Delay/DelayControlsDialog.cpp b/plugins/Delay/DelayControlsDialog.cpp index ed45ec363..7da0cf49f 100644 --- a/plugins/Delay/DelayControlsDialog.cpp +++ b/plugins/Delay/DelayControlsDialog.cpp @@ -26,6 +26,9 @@ #include "DelayControls.h" #include "embed.h" #include "TempoSyncKnob.h" +#include "../Eq/EqFader.h" +#include +#include @@ -37,37 +40,112 @@ DelayControlsDialog::DelayControlsDialog( DelayControls *controls ) : QPalette pal; pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); setPalette( pal ); - setFixedSize( 200, 75 ); + setFixedSize( 300, 200 ); TempoSyncKnob* sampleDelayKnob = new TempoSyncKnob( knobBright_26, this ); - sampleDelayKnob->move( 20,10 ); + sampleDelayKnob->move( 13,10 ); sampleDelayKnob->setVolumeKnob( false ); sampleDelayKnob->setModel( &controls->m_delayTimeModel ); sampleDelayKnob->setLabel( tr( "Delay" ) ); sampleDelayKnob->setHintText( tr( "Delay Time" ) + " ", " s" ); Knob * feedbackKnob = new Knob( knobBright_26, this ); - feedbackKnob->move( 63,10 ); + feedbackKnob->move( 13, 55 ); feedbackKnob->setVolumeKnob( true) ; feedbackKnob->setModel( &controls->m_feedbackModel); feedbackKnob->setLabel( tr( "Regen" ) ); feedbackKnob->setHintText( tr ( "Feedback Amount" ) + " " , "" ); TempoSyncKnob * lfoFreqKnob = new TempoSyncKnob( knobBright_26, this ); - lfoFreqKnob->move( 106,10 ); + lfoFreqKnob->move( 13, 100 ); lfoFreqKnob->setVolumeKnob( false ); lfoFreqKnob->setModel( &controls->m_lfoTimeModel ); lfoFreqKnob->setLabel( tr( "Rate" ) ); lfoFreqKnob->setHintText( tr ( "Lfo") + " ", " s" ); TempoSyncKnob * lfoAmtKnob = new TempoSyncKnob( knobBright_26, this ); - lfoAmtKnob->move( 150,10 ); + lfoAmtKnob->move( 13, 145 ); lfoAmtKnob->setVolumeKnob( false ); lfoAmtKnob->setModel( &controls->m_lfoAmountModel ); lfoAmtKnob->setLabel( tr( "Lfo" ) ); lfoAmtKnob->setHintText( tr ( "Lfo Amt" ) + " " , " s" ); + EqFader * outFader = new EqFader( &controls->m_outGainModel,tr( "Out Gain" ), + this, &controls->m_outPeakL, &controls->m_outPeakR ); + outFader->setMaximumHeight( 196 ); + outFader->move( 263, 42 ); + outFader->setDisplayConversion( false ); + outFader->setHintText( tr( "Gain" ), "dBv" ); + XyPad * pad = new XyPad( this, &controls->m_feedbackModel, &controls->m_delayTimeModel ); + pad->resize( 196, 196 ); + pad->move( 50, 2 ); } + + +XyPad::XyPad(QWidget *parent, FloatModel *xModel, FloatModel *yModel) : + QWidget( parent ), + m_xModel( xModel ), + m_yModel( yModel ), + m_acceptInput( false ) +{ + connect( m_xModel, SIGNAL( dataChanged() ) , this, SLOT( update() ) ); + connect( m_yModel, SIGNAL( dataChanged() ) , this, SLOT( update() ) ); +} + + + + +void XyPad::paintEvent(QPaintEvent *event) +{ + QPainter painter( this ); + //Draw Frequecy maker lines + painter.setPen( QPen( QColor( 200, 200, 200, 200 ), 8, Qt::SolidLine, Qt::RoundCap, Qt::BevelJoin ) ); + float xRange = m_xModel->maxValue() - m_xModel->minValue(); + float xInc = xRange / width(); + int xPos = ( m_xModel->value() - m_xModel->minValue() ) / xInc; + + float yRange = m_yModel->maxValue() - m_yModel->minValue(); + float yInc = yRange / height(); + int yPos = ( m_yModel->value() - m_yModel->minValue() ) / yInc; + + painter.drawPoint( xPos, yPos ); +} + + + + +void XyPad::mousePressEvent(QMouseEvent *event) +{ + m_acceptInput = true; +} + + + + +void XyPad::mouseReleaseEvent(QMouseEvent *event) +{ + m_acceptInput = false; +} + + + + +void XyPad::mouseMoveEvent(QMouseEvent *event) +{ + if( m_acceptInput && (event->x() >= 0) && ( event->x() < width() ) + && ( event->y() >= 0) && ( event->y() < height() ) ) + { + //set xmodel + float xRange = m_xModel->maxValue() - m_xModel->minValue(); + float xInc = xRange / width(); + m_xModel->setValue( m_xModel->minValue() + ( event->x() * xInc ) ); + + //set ymodel + float yRange = m_yModel->maxValue() - m_yModel->minValue(); + float yInc = yRange / height(); + m_yModel->setValue( m_yModel->minValue() + ( event->y() * yInc ) ); + } +} diff --git a/plugins/Delay/DelayControlsDialog.h b/plugins/Delay/DelayControlsDialog.h index 9afe1d7c7..386c97052 100644 --- a/plugins/Delay/DelayControlsDialog.h +++ b/plugins/Delay/DelayControlsDialog.h @@ -26,6 +26,7 @@ #define DELAYCONTROLSDIALOG_H #include "EffectControlDialog.h" +#include "AutomatableModel.h" class DelayControls; @@ -38,4 +39,23 @@ public: } }; +class XyPad : public QWidget +{ + Q_OBJECT +public: + XyPad( QWidget *parent = 0, FloatModel *xModel = 0, FloatModel *yModel = 0 ); + ~XyPad() {} + +protected: + virtual void paintEvent ( QPaintEvent * event ); + virtual void mousePressEvent(QMouseEvent * event ); + virtual void mouseReleaseEvent(QMouseEvent * event); + virtual void mouseMoveEvent(QMouseEvent * event); + +private: + FloatModel *m_xModel; + FloatModel *m_yModel; + bool m_acceptInput; +}; + #endif // DELAYCONTROLSDIALOG_H diff --git a/plugins/Delay/DelayEffect.cpp b/plugins/Delay/DelayEffect.cpp index b4d2d0082..aa01a49d0 100644 --- a/plugins/Delay/DelayEffect.cpp +++ b/plugins/Delay/DelayEffect.cpp @@ -25,6 +25,7 @@ #include "DelayEffect.h" #include "Engine.h" #include "embed.cpp" +#include "interpolation.h" extern "C" @@ -53,6 +54,7 @@ DelayEffect::DelayEffect( Model* parent, const Plugin::Descriptor::SubPluginFeat m_delay = 0; m_delay = new StereoDelay( 20, Engine::mixer()->processingSampleRate() ); m_lfo = new Lfo( Engine::mixer()->processingSampleRate() ); + m_outGain = 1.0; } @@ -87,18 +89,34 @@ bool DelayEffect::processAudioBuffer( sampleFrame* buf, const fpp_t frames ) m_lfo->setFrequency( 1.0 / m_delayControls.m_lfoTimeModel.value() ); m_delay->setFeedback( m_delayControls.m_feedbackModel.value() ); sample_t dryS[2]; + float lPeak = 0.0; + float rPeak = 0.0; + if( m_delayControls.m_outGainModel.isValueChanged() ) + { + m_outGain = dbvToAmp( m_delayControls.m_outGainModel.value() ); + } for( fpp_t f = 0; f < frames; ++f ) { + m_currentLength = linearInterpolate( length, m_currentLength, 0.9999 ); dryS[0] = buf[f][0]; dryS[1] = buf[f][1]; - m_delay->setLength( ( float )length + ( amplitude * ( float )m_lfo->tick() ) ); + m_delay->setLength( ( float )m_currentLength + ( amplitude * ( float )m_lfo->tick() ) ); m_delay->tick( buf[f] ); + buf[f][0] *= m_outGain; + buf[f][1] *= m_outGain; + + lPeak = buf[f][0] > lPeak ? buf[f][0] : lPeak; + rPeak = buf[f][1] > rPeak ? buf[f][1] : rPeak; + buf[f][0] = ( d * dryS[0] ) + ( w * buf[f][0] ); buf[f][1] = ( d * dryS[1] ) + ( w * buf[f][1] ); outSum += buf[f][0]*buf[f][0] + buf[f][1]*buf[f][1]; } checkGate( outSum / frames ); + m_delayControls.m_outPeakL = lPeak; + m_delayControls.m_outPeakR = rPeak; + return isRunning(); } diff --git a/plugins/Delay/DelayEffect.h b/plugins/Delay/DelayEffect.h index f51b08f62..b98a19e70 100644 --- a/plugins/Delay/DelayEffect.h +++ b/plugins/Delay/DelayEffect.h @@ -46,6 +46,8 @@ private: DelayControls m_delayControls; StereoDelay* m_delay; Lfo* m_lfo; + float m_outGain; + float m_currentLength; }; #endif // DELAYEFFECT_H diff --git a/plugins/Delay/StereoDelay.cpp b/plugins/Delay/StereoDelay.cpp index 98f9b95da..21e637740 100644 --- a/plugins/Delay/StereoDelay.cpp +++ b/plugins/Delay/StereoDelay.cpp @@ -74,7 +74,7 @@ void StereoDelay::tick( sampleFrame frame ) 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; + m_index = ( m_index + 1) % (int) m_maxLength; } diff --git a/plugins/Delay/artwork.png b/plugins/Delay/artwork.png index 459c1c5441df100a14163542700c3f4ec6040b9e..2ac7a2f7496d910b711bd0e112cc12d75812ef16 100644 GIT binary patch literal 14151 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 q9@Bd(oSm-BJhZsFW+cdjEg1zgp4& literal 9620 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