Skip to content

Commit

Permalink
Upgrade the Flanger effect (LMMS#5873)
Browse files Browse the repository at this point in the history
Updates QuadratureLfo and moves to include/

Co-authored-by: Hyunjin Song <tteu.ingog@gmail.com>
Co-authored-by: Dave French <dave.french3@googlemail.com>
  • Loading branch information
3 people committed Jan 24, 2021
1 parent 4107bc0 commit 1879bb9
Show file tree
Hide file tree
Showing 8 changed files with 69 additions and 62 deletions.
40 changes: 27 additions & 13 deletions plugins/Flanger/QuadratureLfo.h → include/QuadratureLfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,51 +30,65 @@
class QuadratureLfo
{
public:
QuadratureLfo( int sampleRate );
~QuadratureLfo()
QuadratureLfo( int sampleRate ) :
m_frequency(0),
m_phase(0),
m_offset(D_PI / 2)
{
setSampleRate(sampleRate);
}

~QuadratureLfo() = default;

inline void setFrequency( double frequency )
{
if( frequency < 0 || frequency > ( m_samplerate / 2.0 ) || frequency == m_frequency )
if( frequency < 0 || frequency > m_samplerate / 2.0 || frequency == m_frequency )
{
return;
}
m_frequency = frequency;
m_increment = m_frequency * m_twoPiOverSr;

if( m_phase >= F_2PI )
{
m_phase -= F_2PI;
}
}




inline void restart()
{
m_phase = 0;
}




inline void setSampleRate ( int samplerate )
{
m_samplerate = samplerate;
m_twoPiOverSr = F_2PI / samplerate;
m_increment = m_frequency * m_twoPiOverSr;
}

void tick( float *s, float *c );

inline void setOffset( double offsetVal )
{
m_offset = offsetVal;
}


void tick( float *l, float *r )
{
*l = sinf( m_phase );
*r = sinf( m_phase + m_offset );
m_phase += m_increment;

while (m_phase >= D_2PI)
{
m_phase -= D_2PI;
}
}

private:
double m_frequency;
double m_phase;
double m_increment;
double m_twoPiOverSr;
double m_offset;
int m_samplerate;

};
Expand Down
6 changes: 5 additions & 1 deletion plugins/Flanger/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
INCLUDE(BuildPlugin)

BUILD_PLUGIN(flanger FlangerEffect.cpp FlangerControls.cpp FlangerControlsDialog.cpp Noise.cpp QuadratureLfo.cpp MonoDelay.cpp MOCFILES FlangerControls.h FlangerControlsDialog.h EMBEDDED_RESOURCES artwork.png logo.png)
BUILD_PLUGIN(
flanger FlangerEffect.cpp FlangerControls.cpp FlangerControlsDialog.cpp Noise.cpp MonoDelay.cpp
MOCFILES FlangerControls.h FlangerControlsDialog.h
EMBEDDED_RESOURCES artwork.png logo.png
)
23 changes: 17 additions & 6 deletions plugins/Flanger/FlangerControls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,19 @@
FlangerControls::FlangerControls( FlangerEffect *effect ) :
EffectControls ( effect ),
m_effect ( effect ),
m_delayTimeModel(0.001, 0.0001, 0.050, 0.0001, this, tr( "Delay samples" ) ) ,
m_lfoFrequencyModel( 0.25, 0.01, 60, 0.0001, 60000.0 ,this, tr( "LFO frequency" ) ),
m_lfoAmountModel( 0.0, 0.0, 0.0025 , 0.0001 , this , tr( "Seconds" ) ),
m_feedbackModel( 0.0 , 0.0 , 1.0 , 0.0001, this, tr( "Regen" ) ),
m_whiteNoiseAmountModel( 0.0 , 0.0 , 0.05 , 0.0001, this, tr( "Noise" ) ),
m_invertFeedbackModel ( false , this, tr( "Invert" ) )
m_delayTimeModel(0.001, 0.0001, 0.050, 0.0001, this, tr( "Delay samples" ) ),
m_lfoFrequencyModel( 0.25, 0.01, 60, 0.0001, 60000.0, this, tr( "LFO frequency" ) ),
m_lfoAmountModel( 0.0, 0.0, 0.0025, 0.0001, this, tr( "Seconds" ) ),
m_lfoPhaseModel( 90.0, 0.0, 360.0, 0.0001, this, tr( "Stereo Phase" ) ),
m_feedbackModel( 0.0, -1.0, 1.0, 0.0001, this, tr( "Regen" ) ),
m_whiteNoiseAmountModel( 0.0, 0.0, 0.05, 0.0001, this, tr( "Noise" ) ),
m_invertFeedbackModel ( false, this, tr( "Invert" ) )

{
connect( Engine::mixer(), SIGNAL( sampleRateChanged() ), this, SLOT( changedSampleRate() ) );
connect( Engine::getSong(), SIGNAL( playbackStateChanged() ), this, SLOT( changedPlaybackState() ) );

connect( &m_lfoPhaseModel, SIGNAL( dataChanged() ), this, SLOT( updatePhase() ) );
}


Expand All @@ -54,6 +57,7 @@ void FlangerControls::loadSettings( const QDomElement &_this )
m_delayTimeModel.loadSettings( _this, "DelayTimeSamples" );
m_lfoFrequencyModel.loadSettings( _this, "LfoFrequency" );
m_lfoAmountModel.loadSettings( _this, "LfoAmount" );
m_lfoPhaseModel.loadSettings( _this, "LfoPhase" );
m_feedbackModel.loadSettings( _this, "Feedback" );
m_whiteNoiseAmountModel.loadSettings( _this, "WhiteNoise" );
m_invertFeedbackModel.loadSettings( _this, "Invert" );
Expand All @@ -68,6 +72,7 @@ void FlangerControls::saveSettings( QDomDocument &doc, QDomElement &parent )
m_delayTimeModel.saveSettings( doc , parent, "DelayTimeSamples" );
m_lfoFrequencyModel.saveSettings( doc, parent , "LfoFrequency" );
m_lfoAmountModel.saveSettings( doc, parent , "LfoAmount" );
m_lfoPhaseModel.saveSettings( doc, parent , "LfoPhase" );
m_feedbackModel.saveSettings( doc, parent, "Feedback" ) ;
m_whiteNoiseAmountModel.saveSettings( doc, parent , "WhiteNoise" ) ;
m_invertFeedbackModel.saveSettings( doc, parent, "Invert" );
Expand All @@ -88,3 +93,9 @@ void FlangerControls::changedPlaybackState()
{
m_effect->restartLFO();
}


void FlangerControls::updatePhase()
{
m_effect->updatePhase();
}
4 changes: 3 additions & 1 deletion plugins/Flanger/FlangerControls.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ class FlangerControls : public EffectControls
}
virtual int controlCount()
{
return 5;
return 7;
}
virtual EffectControlDialog* createView()
{
Expand All @@ -58,12 +58,14 @@ class FlangerControls : public EffectControls
private slots:
void changedSampleRate();
void changedPlaybackState();
void updatePhase();

private:
FlangerEffect* m_effect;
FloatModel m_delayTimeModel;
TempoSyncKnobModel m_lfoFrequencyModel;
FloatModel m_lfoAmountModel;
FloatModel m_lfoPhaseModel;
FloatModel m_feedbackModel;
FloatModel m_whiteNoiseAmountModel;
BoolModel m_invertFeedbackModel;
Expand Down
13 changes: 10 additions & 3 deletions plugins/Flanger/FlangerControlsDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ FlangerControlsDialog::FlangerControlsDialog( FlangerControls *controls ) :
QPalette pal;
pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) );
setPalette( pal );
setFixedSize( 195, 75 );
setFixedSize( 233, 75 );

Knob* delayKnob = new Knob( knobBright_26, this );
delayKnob->move( 10,10 );
Expand All @@ -61,15 +61,22 @@ FlangerControlsDialog::FlangerControlsDialog( FlangerControls *controls ) :
lfoAmtKnob->setLabel( tr( "AMNT" ) );
lfoAmtKnob->setHintText( tr( "Amount:" ) , "" );

Knob * lfoPhaseKnob = new Knob( knobBright_26, this );
lfoPhaseKnob->move( 123,10 );
lfoPhaseKnob->setVolumeKnob( false );
lfoPhaseKnob->setModel( &controls->m_lfoPhaseModel );
lfoPhaseKnob->setLabel( tr( "PHASE" ) );
lfoPhaseKnob->setHintText( tr( "Phase:" ) , "" );

Knob * feedbackKnob = new Knob( knobBright_26, this );
feedbackKnob->move( 122,10 );
feedbackKnob->move( 160,10 );
feedbackKnob->setVolumeKnob( true) ;
feedbackKnob->setModel( &controls->m_feedbackModel );
feedbackKnob->setLabel( tr( "FDBK" ) );
feedbackKnob->setHintText( tr( "Feedback amount:" ) , "" );

Knob * whiteNoiseKnob = new Knob( knobBright_26, this );
whiteNoiseKnob->move( 156,10 );
whiteNoiseKnob->move( 196,10 );
whiteNoiseKnob->setVolumeKnob( true) ;
whiteNoiseKnob->setModel( &controls->m_whiteNoiseAmountModel );
whiteNoiseKnob->setLabel( tr( "NOISE" ) );
Expand Down
6 changes: 6 additions & 0 deletions plugins/Flanger/FlangerEffect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,12 @@ void FlangerEffect::restartLFO()
}


void FlangerEffect::updatePhase()
{
m_lfo->setOffset( m_flangerControls.m_lfoPhaseModel.value() / 180 * D_PI );
}




extern "C"
Expand Down
1 change: 1 addition & 0 deletions plugins/Flanger/FlangerEffect.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ class FlangerEffect : public Effect
return &m_flangerControls;
}
void changeSampleRate();
void updatePhase();
void restartLFO();

private:
Expand Down
38 changes: 0 additions & 38 deletions plugins/Flanger/QuadratureLfo.cpp

This file was deleted.

0 comments on commit 1879bb9

Please sign in to comment.