Dualfilter updates, add double precision versions of LMMS constants
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -62,8 +62,6 @@ public:
|
||||
|
||||
|
||||
private slots:
|
||||
void updateFilter1();
|
||||
void updateFilter2();
|
||||
void updateFilters();
|
||||
|
||||
private:
|
||||
|
||||
Reference in New Issue
Block a user