From 9615ceabd5457a6c0d70f6beba444629154767b1 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 23 Aug 2009 19:14:19 +0200 Subject: [PATCH] PeakController: initial work on attack- and decay-support The decay knob didn't actually do anything before. Now it's useful together with newly introduced attack knob. One can do much better sidechaining now without disturbing artifacts due to too responsive volume changes. --- plugins/peak_controller_effect/artwork.png | Bin 5242 -> 8785 bytes .../peak_controller_effect.cpp | 47 +++++++++++++----- .../peak_controller_effect.h | 1 + .../peak_controller_effect_control_dialog.cpp | 18 ++++--- .../peak_controller_effect_control_dialog.h | 12 +++-- .../peak_controller_effect_controls.cpp | 8 +-- .../peak_controller_effect_controls.h | 20 ++++---- 7 files changed, 72 insertions(+), 34 deletions(-) diff --git a/plugins/peak_controller_effect/artwork.png b/plugins/peak_controller_effect/artwork.png index a307cb8627a4058e5bc4eae53320fdc1626368d5..a045982b6985662beaa904c37f857d111c0a7f76 100644 GIT binary patch literal 8785 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 z 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 diff --git a/plugins/peak_controller_effect/peak_controller_effect.cpp b/plugins/peak_controller_effect/peak_controller_effect.cpp index ce96a3e9d..4e5200b2b 100644 --- a/plugins/peak_controller_effect/peak_controller_effect.cpp +++ b/plugins/peak_controller_effect/peak_controller_effect.cpp @@ -2,7 +2,8 @@ * peak_controller_effect.cpp - PeakController effect plugin * * Copyright (c) 2008 Paul Giblock - * + * Copyright (c) 2009 Tobias Doerffel + * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * * This program is free software; you can redistribute it and/or @@ -39,7 +40,7 @@ plugin::descriptor PLUGIN_EXPORT peakcontrollereffect_plugin_descriptor = STRINGIFY( PLUGIN_NAME ), "Peak Controller", QT_TRANSLATE_NOOP( "pluginBrowser", - "Plugin for controlling knobs with sound peaks" ), + "Plugin for controlling knobs with sound peaks" ), "Paul Giblock ", 0x0100, plugin::Effect, @@ -62,6 +63,8 @@ peakControllerEffect::peakControllerEffect( effect( &peakcontrollereffect_plugin_descriptor, _parent, _key ), m_effectId( ++PeakController::s_lastEffectId ), m_peakControls( this ), + m_lastSample( 0 ), + m_lastRMS( -1 ), m_autoController( NULL ) { m_autoController = new PeakController( engine::getSong(), this ); @@ -87,15 +90,14 @@ bool peakControllerEffect::processAudioBuffer( sampleFrame * _buf, const fpp_t _frames ) { peakControllerEffectControls & c = m_peakControls; - - // This appears to be used for determining whether or not to continue processing - // audio with this effect + + // This appears to be used for determining whether or not to continue + // processing audio with this effect if( !isEnabled() || !isRunning() ) { - return( FALSE ); + return false; } - // RMS: double sum = 0; for( int i = 0; i < _frames; ++i ) @@ -111,12 +113,33 @@ bool peakControllerEffect::processAudioBuffer( sampleFrame * _buf, } } - m_lastSample = c.m_baseModel.value() + c.m_amountModel.value() * - sqrtf( sum / _frames ); + float curRMS = sqrtf( sum / _frames ); + const float origRMS = curRMS; + if( m_lastRMS < 0 ) + { + m_lastRMS = curRMS; + } + const float v = ( curRMS >= m_lastRMS ) ? + c.m_attackModel.value() : + c.m_decayModel.value(); + const float a = sqrtf( sqrtf( v ) ); + curRMS = (1-a)*curRMS + a*m_lastRMS; + + m_lastSample = c.m_baseModel.value() + c.m_amountModel.value()*curRMS; + m_lastRMS = curRMS; + + // on greater buffer sizes our LP is updated less frequently, therfore + // replay a certain number of passes so the LP state is as if it was + // updated N times with buffer-size 1/N + const int timeOversamp = (4*_frames) / DEFAULT_BUFFER_SIZE-1; + for( int i = 0; i < timeOversamp; ++i ) + { + m_lastRMS = (1-a)*origRMS + a*m_lastRMS; + } //checkGate( out_sum / _frames ); - return( isRunning() ); + return isRunning(); } @@ -128,9 +151,9 @@ extern "C" // neccessary for getting instance out of shared lib plugin * PLUGIN_EXPORT lmms_plugin_main( model * _parent, void * _data ) { - return( new peakControllerEffect( _parent, + return new peakControllerEffect( _parent, static_cast( - _data ) ) ); + _data ) ); } } diff --git a/plugins/peak_controller_effect/peak_controller_effect.h b/plugins/peak_controller_effect/peak_controller_effect.h index 8e2ce664b..94c38b99a 100644 --- a/plugins/peak_controller_effect/peak_controller_effect.h +++ b/plugins/peak_controller_effect/peak_controller_effect.h @@ -55,6 +55,7 @@ private: friend class peakControllerEffectControls; float m_lastSample; + float m_lastRMS; Controller * m_autoController; } ; diff --git a/plugins/peak_controller_effect/peak_controller_effect_control_dialog.cpp b/plugins/peak_controller_effect/peak_controller_effect_control_dialog.cpp index 3ca1f483a..136b20e6c 100644 --- a/plugins/peak_controller_effect/peak_controller_effect_control_dialog.cpp +++ b/plugins/peak_controller_effect/peak_controller_effect_control_dialog.cpp @@ -1,5 +1,6 @@ /* - * stereomatrix_control_dialog.cpp - control dialog for stereoMatrix-effect + * peak_controller_effect_control_dialog.cpp - control dialog for + * peakControllerEffect * * Copyright (c) 2008 Paul Giblock * @@ -30,7 +31,6 @@ #include "peak_controller_effect_control_dialog.h" #include "peak_controller_effect_controls.h" #include "knob.h" -#include "tempo_sync_knob.h" #include "led_checkbox.h" #include "embed.h" @@ -39,12 +39,12 @@ peakControllerEffectControlDialog::peakControllerEffectControlDialog( peakControllerEffectControls * _controls ) : effectControlDialog( _controls ) { - setAutoFillBackground( TRUE ); + setAutoFillBackground( true ); QPalette pal; pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); setPalette( pal ); - setFixedSize( 120, 104 ); + setFixedSize( 144, 110 ); QVBoxLayout * tl = new QVBoxLayout( this ); tl->addSpacing( 25 ); @@ -61,13 +61,19 @@ peakControllerEffectControlDialog::peakControllerEffectControlDialog( m_amountKnob->setModel( &_controls->m_amountModel ); m_amountKnob->setHintText( tr( "Modulation amount:" ) + " ", "" ); - m_decayKnob = new tempoSyncKnob( knobBright_26, this ); + m_attackKnob = new knob( knobBright_26, this ); + m_attackKnob->setLabel( tr( "ATTACK" ) ); + m_attackKnob->setModel( &_controls->m_attackModel ); + m_attackKnob->setHintText( tr( "Attack:" ) + " ", "" ); + + m_decayKnob = new knob( knobBright_26, this ); m_decayKnob->setLabel( tr( "DECAY" ) ); m_decayKnob->setModel( &_controls->m_decayModel ); - m_decayKnob->setHintText( tr( "Release decay (not implemented):" ) + " ", "" ); + m_decayKnob->setHintText( tr( "Release:" ) + " ", "" ); l->addWidget( m_baseKnob ); l->addWidget( m_amountKnob ); + l->addWidget( m_attackKnob ); l->addWidget( m_decayKnob ); tl->addLayout( l ); diff --git a/plugins/peak_controller_effect/peak_controller_effect_control_dialog.h b/plugins/peak_controller_effect/peak_controller_effect_control_dialog.h index a1c56db51..2aab3f5fe 100644 --- a/plugins/peak_controller_effect/peak_controller_effect_control_dialog.h +++ b/plugins/peak_controller_effect/peak_controller_effect_control_dialog.h @@ -1,5 +1,6 @@ /* - * stereomatrix_control_dialog.h - control dialog for stereoMatrix-effect + * peak_controller_effect_control_dialog.h - control dialog for + * peakControllerEffect * * Copyright (c) 2008 Paul Giblock * @@ -36,18 +37,21 @@ class ledCheckBox; class peakControllerEffectControlDialog : public effectControlDialog { public: - peakControllerEffectControlDialog( peakControllerEffectControls * _controls ); + peakControllerEffectControlDialog( + peakControllerEffectControls * _controls ); virtual ~peakControllerEffectControlDialog() { } + protected: knob * m_baseKnob; knob * m_amountKnob; - tempoSyncKnob * m_decayKnob; + knob * m_attackKnob; + knob * m_decayKnob; ledCheckBox * m_muteLed; -}; +} ; #endif diff --git a/plugins/peak_controller_effect/peak_controller_effect_controls.cpp b/plugins/peak_controller_effect/peak_controller_effect_controls.cpp index 11e49c13b..8e49e1d74 100644 --- a/plugins/peak_controller_effect/peak_controller_effect_controls.cpp +++ b/plugins/peak_controller_effect/peak_controller_effect_controls.cpp @@ -1,7 +1,8 @@ /* - * stereomatrix_controls.cpp - controls for stereoMatrix-effect + * peak_controller_effect_controls.cpp - controls for peakController effect * * Copyright (c) 2008 Paul Giblock + * Copyright (c) 2009 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -36,8 +37,9 @@ peakControllerEffectControls( peakControllerEffect * _eff ) : m_effect( _eff ), m_baseModel( 0.5, 0.0, 1.0, 0.001, this, tr( "Base value" ) ), m_amountModel( 1.0, -1.0, 1.0, 0.005, this, tr( "Modulation amount" ) ), - m_decayModel( 0.1, 0.01, 5.0, 0.0001, 20000.0, this, tr( "Release decay" ) ), - m_muteModel( FALSE, this, tr( "Mute output" ) ) + m_attackModel( 0, 0, 0.999, 0.001, this, tr( "Attack" ) ), + m_decayModel( 0, 0, 0.999, 0.001, this, tr( "Release" ) ), + m_muteModel( false, this, tr( "Mute output" ) ) { } diff --git a/plugins/peak_controller_effect/peak_controller_effect_controls.h b/plugins/peak_controller_effect/peak_controller_effect_controls.h index 1a9e0b70f..b1791311c 100644 --- a/plugins/peak_controller_effect/peak_controller_effect_controls.h +++ b/plugins/peak_controller_effect/peak_controller_effect_controls.h @@ -1,8 +1,9 @@ /* - * stereomatrix_controls.h - controls for stereoMatrix-effect + * peak_controller_effect_controls.h - controls for peakController effect * * Copyright (c) 2008 Paul Giblock - * + * Copyright (c) 2009 Tobias Doerffel + * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * * This program is free software; you can redistribute it and/or @@ -35,7 +36,7 @@ class peakControllerEffectControls : public effectControls { Q_OBJECT public: - peakControllerEffectControls( peakControllerEffect( * _eff ) ); + peakControllerEffectControls( peakControllerEffect * _eff ); virtual ~peakControllerEffectControls() { } @@ -44,14 +45,14 @@ public: virtual void loadSettings( const QDomElement & _this ); inline virtual QString nodeName( void ) const { - return( "peakcontrollereffectcontrols" ); + return "peakcontrollereffectcontrols"; } virtual int getControlCount( void ) { - return( 1 ); + return 1; } - + virtual effectControlDialog * createView( void ) { return new peakControllerEffectControlDialog( this ); @@ -63,13 +64,14 @@ private: floatModel m_baseModel; floatModel m_amountModel; - tempoSyncKnobModel m_decayModel; + floatModel m_attackModel; + floatModel m_decayModel; boolModel m_muteModel; - + friend class peakControllerEffectControlDialog; friend class peakControllerEffect; } ; -#endif +#endif