From a494f4b1602e950f11dcd34492e32d66ce85d880 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. (cherry picked from commit 9615ceabd5457a6c0d70f6beba444629154767b1) --- plugins/peak_controller_effect/artwork.png | Bin 7368 -> 6377 bytes .../peak_controller_effect.cpp | 40 ++++++++++++++---- .../peak_controller_effect.h | 1 + .../peak_controller_effect_control_dialog.cpp | 12 ++++-- .../peak_controller_effect_control_dialog.h | 4 +- .../peak_controller_effect_controls.cpp | 8 ++-- .../peak_controller_effect_controls.h | 10 +++-- 7 files changed, 55 insertions(+), 20 deletions(-) diff --git a/plugins/peak_controller_effect/artwork.png b/plugins/peak_controller_effect/artwork.png index d6f09d4fe1a768a0ea0405d8d6be8572c50ba5c7..51ab2be9f0dda0e98d59c13c1eca1b22306dca7d 100644 GIT binary patch literal 6377 zcmWmI3pi8%gx%$-`PxQ&USz zOIus}=+UD(Iy$<#x_Wwg$BrG-*Vi{NFgSkv_=yuI3=Iv@Xta@$k+HGy$&)8B7>tRD ziK(fnnHj*$+#FzTVF9qfVgXnj4uHes0eDMGfTficz{=VhU~OXqu(1W$0&MN<0Cx5O zdw{)zy`2M42Y`d4gT14pgQKIPlM}#+KmZU-9cZU8rTcYwQx z2f)J<;0f^b^7QZm>ILvReHw7u+Z*8R;{)*V^#%BzIRiN3=LhgRdlqo^+®e}8~~ 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 literal 7368 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 - * + * 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, @@ -61,6 +62,8 @@ PeakControllerEffect::PeakControllerEffect( const Descriptor::SubPluginFeatures::Key * _key ) : Effect( &peakcontrollereffect_plugin_descriptor, _parent, _key ), m_peakControls( this ), + m_lastSample( 0 ), + m_lastRMS( -1 ), m_autoController( NULL ) { m_autoController = new PeakController( engine::getSong(), this ); @@ -91,10 +94,9 @@ bool PeakControllerEffect::processAudioBuffer( sampleFrame * _buf, // audio with this effect if( !isEnabled() || !isRunning() ) { - return( FALSE ); + return false; } - // RMS: double sum = 0; for( int i = 0; i < _frames; ++i ) @@ -110,12 +112,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,8 +151,7 @@ extern "C" Plugin * PLUGIN_EXPORT lmms_plugin_main( Model * _parent, void * _data ) { return new PeakControllerEffect( _parent, - static_cast( - _data ) ); + static_cast( _data ) ); } } diff --git a/plugins/peak_controller_effect/peak_controller_effect.h b/plugins/peak_controller_effect/peak_controller_effect.h index 86dd216b9..56a81c58a 100644 --- a/plugins/peak_controller_effect/peak_controller_effect.h +++ b/plugins/peak_controller_effect/peak_controller_effect.h @@ -54,6 +54,7 @@ private: PeakControllerEffectControls m_peakControls; 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 6372e2339..b16f666e7 100644 --- a/plugins/peak_controller_effect/peak_controller_effect_control_dialog.cpp +++ b/plugins/peak_controller_effect/peak_controller_effect_control_dialog.cpp @@ -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_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 095c17828..5e95bd654 100644 --- a/plugins/peak_controller_effect/peak_controller_effect_control_dialog.h +++ b/plugins/peak_controller_effect/peak_controller_effect_control_dialog.h @@ -42,13 +42,15 @@ public: { } + protected: knob * m_baseKnob; knob * m_amountKnob; + 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 c10c46cfd..5fc009801 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 @@ /* - * peak_controller_effect_controls.cpp - controls for PeakController 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, 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 36eabf690..7a8111795 100644 --- a/plugins/peak_controller_effect/peak_controller_effect_controls.h +++ b/plugins/peak_controller_effect/peak_controller_effect_controls.h @@ -2,7 +2,8 @@ * peak_controller_EffectControls.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 @@ -44,12 +45,12 @@ public: virtual void loadSettings( const QDomElement & _this ); inline virtual QString nodeName() const { - return( "peakcontrollereffectcontrols" ); + return "peakcontrollereffectcontrols"; } virtual int controlCount() { - return( 1 ); + return 1; } virtual EffectControlDialog * createView() { @@ -62,6 +63,7 @@ private: FloatModel m_baseModel; FloatModel m_amountModel; + FloatModel m_attackModel; FloatModel m_decayModel; BoolModel m_muteModel; @@ -71,4 +73,4 @@ private: } ; -#endif +#endif