Added a XY pad to the Delay Pluging. also added a volume control, and smothed the delay time input changes, to improve audio.

This commit is contained in:
Dave French
2015-02-10 13:47:17 +00:00
parent fde014b9a5
commit ee3c9a1333
9 changed files with 138 additions and 10 deletions

View File

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

View File

@@ -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" );
}

View File

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

View File

@@ -26,6 +26,9 @@
#include "DelayControls.h"
#include "embed.h"
#include "TempoSyncKnob.h"
#include "../Eq/EqFader.h"
#include <QMouseEvent>
#include <QPainter>
@@ -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 ) );
}
}

View File

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

View File

@@ -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();
}

View File

@@ -46,6 +46,8 @@ private:
DelayControls m_delayControls;
StereoDelay* m_delay;
Lfo* m_lfo;
float m_outGain;
float m_currentLength;
};
#endif // DELAYEFFECT_H

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 14 KiB