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 459c1c544..2ac7a2f74 100644 Binary files a/plugins/Delay/artwork.png and b/plugins/Delay/artwork.png differ