From bd00ecfdc3c741adff5efe535ab702309f50d16e Mon Sep 17 00:00:00 2001 From: Vesa Date: Sun, 16 Nov 2014 18:47:01 +0200 Subject: [PATCH] Dualfilter updates, add double precision versions of LMMS constants --- include/lmms_constants.h | 15 +++++--- plugins/DualFilter/DualFilter.cpp | 44 ++++++++++++++--------- plugins/DualFilter/DualFilterControls.cpp | 23 ++---------- plugins/DualFilter/DualFilterControls.h | 2 -- 4 files changed, 40 insertions(+), 44 deletions(-) diff --git a/include/lmms_constants.h b/include/lmms_constants.h index 27ea3f2aa..629db886c 100644 --- a/include/lmms_constants.h +++ b/include/lmms_constants.h @@ -25,10 +25,15 @@ #ifndef LMMS_CONSTANTS_H #define LMMS_CONSTANTS_H -const float F_PI = 3.1415926535f; -const float F_E = 2.718281828459045f; -const float F_2PI = 2*F_PI; -const float F_PI_2 = F_PI*0.5; +const double D_PI = 3.14159265358979323846; +const double D_2PI = D_PI * 2.0; +const double D_PI_2 = D_PI * 0.5; +const double D_E = 2.71828182845904523536; + +const float F_PI = (float) D_PI; +const float F_2PI = (float) D_2PI; +const float F_PI_2 = (float) D_PI_2; +const float F_E = (float) D_E; + #endif - diff --git a/plugins/DualFilter/DualFilter.cpp b/plugins/DualFilter/DualFilter.cpp index 47655291d..22036930c 100644 --- a/plugins/DualFilter/DualFilter.cpp +++ b/plugins/DualFilter/DualFilter.cpp @@ -55,7 +55,7 @@ DualFilterEffect::DualFilterEffect( Model* parent, const Descriptor::SubPluginFe { m_filter1 = new basicFilters<2>( engine::mixer()->processingSampleRate() ); m_filter2 = new basicFilters<2>( engine::mixer()->processingSampleRate() ); - + // ensure filters get updated m_filter1changed = true; m_filter2changed = true; @@ -84,25 +84,41 @@ bool DualFilterEffect::processAudioBuffer( sampleFrame* buf, const fpp_t frames const float d = dryLevel(); const float w = wetLevel(); - m_filter1->setFilterType( m_dfControls.m_filter1Model.value() ); - m_filter2->setFilterType( m_dfControls.m_filter2Model.value() ); - + if( m_dfControls.m_filter1Model.isValueChanged() ) + { + m_filter1->setFilterType( m_dfControls.m_filter1Model.value() ); + m_filter1changed = true; + } + if( m_dfControls.m_filter2Model.isValueChanged() ) + { + m_filter2->setFilterType( m_dfControls.m_filter2Model.value() ); + m_filter2changed = true; + } + const bool enabled1 = m_dfControls.m_enabled1Model.value(); const bool enabled2 = m_dfControls.m_enabled2Model.value(); - // recalculate only when necessary - if( enabled1 && m_filter1changed ) + // recalculate only when necessary: either cut/res is changed, or the changed-flag is set (filter type or samplerate changed) + if( ( enabled1 && ( m_dfControls.m_cut1Model.isValueChanged() || + m_dfControls.m_res1Model.isValueChanged() ) ) || m_filter1changed ) { m_filter1->calcFilterCoeffs( m_dfControls.m_cut1Model.value(), m_dfControls.m_res1Model.value() ); m_filter1changed = false; } - if( enabled2 && m_filter2changed ) + if( ( enabled2 && ( m_dfControls.m_cut2Model.isValueChanged() || + m_dfControls.m_res2Model.isValueChanged() ) ) || m_filter2changed ) { m_filter2->calcFilterCoeffs( m_dfControls.m_cut2Model.value(), m_dfControls.m_res2Model.value() ); m_filter2changed = false; } - + // get mix amounts for wet signals of both filters + const float mix2 = ( ( m_dfControls.m_mixModel.value() + 1.0f ) * 0.5f ); + const float mix1 = 1.0f - mix2; + + const float gain1 = m_dfControls.m_gain1Model.value() * 0.01f; + const float gain2 = m_dfControls.m_gain2Model.value() * 0.01f; + // buffer processing loop for( fpp_t f = 0; f < frames; ++f ) { @@ -110,10 +126,6 @@ bool DualFilterEffect::processAudioBuffer( sampleFrame* buf, const fpp_t frames sample_t s1[2] = { buf[f][0], buf[f][1] }; // filter 1 sample_t s2[2] = { buf[f][0], buf[f][1] }; // filter 2 - // get mix amounts for wet signals of both filters - const float mix1 = 1.0f - ( ( m_dfControls.m_mixModel.value( f ) + 1.0f ) / 2.0f ); - const float mix2 = ( ( m_dfControls.m_mixModel.value( f ) + 1.0f ) / 2.0f ); - // update filter 1 if( enabled1 ) { @@ -121,8 +133,8 @@ bool DualFilterEffect::processAudioBuffer( sampleFrame* buf, const fpp_t frames s1[1] = m_filter1->update( s1[1], 1 ); // apply gain - s1[0] *= ( m_dfControls.m_gain1Model.value( f ) / 100.0f ); - s1[1] *= ( m_dfControls.m_gain1Model.value( f ) / 100.0f ); + s1[0] *= gain1; + s1[1] *= gain1; // apply mix s[0] += ( s1[0] * mix1 ); @@ -136,8 +148,8 @@ bool DualFilterEffect::processAudioBuffer( sampleFrame* buf, const fpp_t frames s2[1] = m_filter2->update( s2[1], 1 ); //apply gain - s2[0] *= ( m_dfControls.m_gain2Model.value( f ) / 100.0f ); - s2[1] *= ( m_dfControls.m_gain2Model.value( f ) / 100.0f ); + s2[0] *= gain2; + s2[1] *= gain2; // apply mix s[0] += ( s2[0] * mix2 ); diff --git a/plugins/DualFilter/DualFilterControls.cpp b/plugins/DualFilter/DualFilterControls.cpp index 73d86b48e..344a34ca0 100644 --- a/plugins/DualFilter/DualFilterControls.cpp +++ b/plugins/DualFilter/DualFilterControls.cpp @@ -51,14 +51,6 @@ DualFilterControls::DualFilterControls( DualFilterEffect* effect ) : m_res2Model( 0.5, basicFilters<0>::minQ(), 10.0, 0.01, this, tr( "Q/Resonance 2" ) ), m_gain2Model( 100.0f, 0.0f, 200.0f, 0.1f, this, tr( "Gain 2" ) ) { - connect( &m_filter1Model, SIGNAL( dataChanged() ), this, SLOT( updateFilter1() ) ); - connect( &m_cut1Model, SIGNAL( dataChanged() ), this, SLOT( updateFilter1() ) ); - connect( &m_res1Model, SIGNAL( dataChanged() ), this, SLOT( updateFilter1() ) ); - - connect( &m_filter2Model, SIGNAL( dataChanged() ), this, SLOT( updateFilter2() ) ); - connect( &m_cut2Model, SIGNAL( dataChanged() ), this, SLOT( updateFilter2() ) ); - connect( &m_res2Model, SIGNAL( dataChanged() ), this, SLOT( updateFilter2() ) ); - m_filter1Model.addItem( tr( "LowPass" ), new PixmapLoader( "filter_lp" ) ); m_filter1Model.addItem( tr( "HiPass" ), new PixmapLoader( "filter_hp" ) ); m_filter1Model.addItem( tr( "BandPass csg" ), new PixmapLoader( "filter_bp" ) ); @@ -96,17 +88,6 @@ DualFilterControls::DualFilterControls( DualFilterEffect* effect ) : -void DualFilterControls::updateFilter1() -{ - m_effect->m_filter1changed = true; -} - -void DualFilterControls::updateFilter2() -{ - m_effect->m_filter2changed = true; -} - - void DualFilterControls::updateFilters() { // swap filters to new ones @@ -118,8 +99,8 @@ void DualFilterControls::updateFilters() // flag filters as needing recalculation - updateFilter1(); - updateFilter2(); + m_effect->m_filter1changed = true; + m_effect->m_filter2changed = true; } diff --git a/plugins/DualFilter/DualFilterControls.h b/plugins/DualFilter/DualFilterControls.h index df66aac3b..65953ba91 100644 --- a/plugins/DualFilter/DualFilterControls.h +++ b/plugins/DualFilter/DualFilterControls.h @@ -62,8 +62,6 @@ public: private slots: - void updateFilter1(); - void updateFilter2(); void updateFilters(); private: