Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
rewrite amplifier plugin style
  • Loading branch information
LostRobotMusic committed Nov 17, 2023
commit a900c4f91a78e6b7508fc7dfb0af4c6101b25e3b
90 changes: 26 additions & 64 deletions plugins/Amplifier/Amplifier.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@ extern "C"

Plugin::Descriptor PLUGIN_EXPORT amplifier_plugin_descriptor =
{
LMMS_STRINGIFY( PLUGIN_NAME ),
LMMS_STRINGIFY(PLUGIN_NAME),
"Amplifier",
QT_TRANSLATE_NOOP( "PluginBrowser", "A native amplifier plugin" ),
QT_TRANSLATE_NOOP("PluginBrowser", "A native amplifier plugin"),
"Vesa Kivimäki <contact/dot/diizy/at/nbl/dot/fi>",
0x0100,
Plugin::Type::Effect,
Expand All @@ -50,99 +50,61 @@ Plugin::Descriptor PLUGIN_EXPORT amplifier_plugin_descriptor =
}



AmplifierEffect::AmplifierEffect( Model* parent, const Descriptor::SubPluginFeatures::Key* key ) :
Effect( &amplifier_plugin_descriptor, parent, key ),
m_ampControls( this )
AmplifierEffect::AmplifierEffect(Model* parent, const Descriptor::SubPluginFeatures::Key* key) :
Effect(&amplifier_plugin_descriptor, parent, key),
m_ampControls(this)
{
}








bool AmplifierEffect::processAudioBuffer( sampleFrame* buf, const fpp_t frames )
bool AmplifierEffect::processAudioBuffer(sampleFrame* buf, const fpp_t frames)
{
if( !isEnabled() || !isRunning () )
{
return( false );
}
if (!isEnabled() || !isRunning()) { return(false); }

double outSum = 0.0;
const float d = dryLevel();
const float w = wetLevel();

const ValueBuffer * volBuf = m_ampControls.m_volumeModel.valueBuffer();
const ValueBuffer * volumeBuf = m_ampControls.m_volumeModel.valueBuffer();
const ValueBuffer * panBuf = m_ampControls.m_panModel.valueBuffer();
const ValueBuffer * leftBuf = m_ampControls.m_leftModel.valueBuffer();
const ValueBuffer * rightBuf = m_ampControls.m_rightModel.valueBuffer();

for( fpp_t f = 0; f < frames; ++f )
for (fpp_t f = 0; f < frames; ++f)
{
// qDebug( "offset %d, value %f", f, m_ampControls.m_volumeModel.value( f ) );

auto s = std::array{buf[f][0], buf[f][1]};

// vol knob
if( volBuf )
{
s[0] *= volBuf->value( f ) * 0.01f;
s[1] *= volBuf->value( f ) * 0.01f;
}
else
{
s[0] *= m_ampControls.m_volumeModel.value() * 0.01f;
s[1] *= m_ampControls.m_volumeModel.value() * 0.01f;
}

// convert pan values to left/right values
const float pan = panBuf
? panBuf->value( f )
: m_ampControls.m_panModel.value();
const float left1 = pan <= 0
? 1.0
: 1.0 - pan * 0.01f;
const float right1 = pan >= 0
? 1.0
: 1.0 + pan * 0.01f;

// second stage amplification
const float left2 = leftBuf
? leftBuf->value( f )
: m_ampControls.m_leftModel.value();
const float right2 = rightBuf
? rightBuf->value( f )
: m_ampControls.m_rightModel.value();

s[0] *= left1 * left2 * 0.01;
s[1] *= right1 * right2 * 0.01;
const float volume = (volumeBuf ? volumeBuf->value(f) : m_ampControls.m_volumeModel.value()) * 0.01f;
const float pan = (panBuf ? panBuf->value(f) : m_ampControls.m_panModel.value()) * 0.01f;
const float left = (leftBuf ? leftBuf->value(f) : m_ampControls.m_leftModel.value()) * 0.01f;
const float right = (rightBuf ? rightBuf->value(f) : m_ampControls.m_rightModel.value()) * 0.01f;

const float left2 = pan <= 0 ? 1.0 : 1.0 - pan;
const float right2 = pan >= 0 ? 1.0 : 1.0 + pan;

sample_t s[2] = {buf[f][0], buf[f][1]};

s[0] *= volume * left * left2;
s[1] *= volume * right * right2;

buf[f][0] = d * buf[f][0] + w * s[0];
buf[f][1] = d * buf[f][1] + w * s[1];
outSum += buf[f][0] * buf[f][0] + buf[f][1] * buf[f][1];
}

checkGate( outSum / frames );
checkGate(outSum / frames);

return isRunning();
}





extern "C"
{

// necessary for getting instance out of shared lib
PLUGIN_EXPORT Plugin * lmms_plugin_main( Model* parent, void* data )
PLUGIN_EXPORT Plugin * lmms_plugin_main(Model* parent, void* data)
{
return new AmplifierEffect( parent, static_cast<const Plugin::Descriptor::SubPluginFeatures::Key *>( data ) );
return new AmplifierEffect(parent, static_cast<const Plugin::Descriptor::SubPluginFeatures::Key *>(data));
}

}

} // namespace lmms
} // namespace lmms
10 changes: 3 additions & 7 deletions plugins/Amplifier/Amplifier.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
*
*/


#ifndef AMPLIFIER_H
#define AMPLIFIER_H

Expand All @@ -36,23 +35,20 @@ namespace lmms
class AmplifierEffect : public Effect
{
public:
AmplifierEffect( Model* parent, const Descriptor::SubPluginFeatures::Key* key );
AmplifierEffect(Model* parent, const Descriptor::SubPluginFeatures::Key* key);
~AmplifierEffect() override = default;
bool processAudioBuffer( sampleFrame* buf, const fpp_t frames ) override;
bool processAudioBuffer(sampleFrame* buf, const fpp_t frames) override;

EffectControls* controls() override
{
return &m_ampControls;
}


private:
AmplifierControls m_ampControls;

friend class AmplifierControls;

} ;

};

} // namespace lmms

Expand Down
59 changes: 22 additions & 37 deletions plugins/Amplifier/AmplifierControlDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,53 +23,38 @@
*
*/


#include "AmplifierControlDialog.h"
#include "AmplifierControls.h"
#include "embed.h"
#include "Knob.h"


namespace lmms::gui
{


AmplifierControlDialog::AmplifierControlDialog( AmplifierControls* controls ) :
EffectControlDialog( controls )
AmplifierControlDialog::AmplifierControlDialog(AmplifierControls* controls) :
EffectControlDialog(controls)
{
setAutoFillBackground( true );
setAutoFillBackground(true);
QPalette pal;
pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) );
setPalette( pal );
setFixedSize( 100, 110 );

auto volumeKnob = new Knob(KnobType::Bright26, this);
volumeKnob -> move( 16, 10 );
volumeKnob -> setVolumeKnob( true );
volumeKnob->setModel( &controls->m_volumeModel );
volumeKnob->setLabel( tr( "VOL" ) );
volumeKnob->setHintText( tr( "Volume:" ) , "%" );

auto panKnob = new Knob(KnobType::Bright26, this);
panKnob -> move( 57, 10 );
panKnob->setModel( &controls->m_panModel );
panKnob->setLabel( tr( "PAN" ) );
panKnob->setHintText( tr( "Panning:" ) , "" );

auto leftKnob = new Knob(KnobType::Bright26, this);
leftKnob -> move( 16, 65 );
leftKnob -> setVolumeKnob( true );
leftKnob->setModel( &controls->m_leftModel );
leftKnob->setLabel( tr( "LEFT" ) );
leftKnob->setHintText( tr( "Left gain:" ) , "%" );

auto rightKnob = new Knob(KnobType::Bright26, this);
rightKnob -> move( 57, 65 );
rightKnob -> setVolumeKnob( true );
rightKnob->setModel( &controls->m_rightModel );
rightKnob->setLabel( tr( "RIGHT" ) );
rightKnob->setHintText( tr( "Right gain:" ) , "%" );
pal.setBrush(backgroundRole(), PLUGIN_NAME::getIconPixmap("artwork"));
setPalette(pal);
setFixedSize(100, 110);

makeKnob(16, 10, tr("VOL"), tr("Volume:"), "%", &controls->m_volumeModel, true);
makeKnob(57, 10, tr("PAN"), tr("Panning:"), "%", &controls->m_panModel, false);
makeKnob(16, 65, tr("LEFT"), tr("Left gain:"), "%", &controls->m_leftModel, true);
makeKnob(57, 65, tr("RIGHT"), tr("Right gain:"), "%", &controls->m_rightModel, true);
}

Knob* AmplifierControlDialog::makeKnob(int x, int y, const QString& label, const QString& hintText, const QString& unit, FloatModel* model, bool isVolume)
{
Knob* newKnob = new Knob(KnobType::Bright26, this);
newKnob->move(x, y);
newKnob->setModel(model);
newKnob->setLabel(label);
newKnob->setHintText(hintText, unit);
newKnob->setVolumeKnob(isVolume);
return newKnob;
}

} // namespace lmms::gui
} // namespace lmms::gui
12 changes: 7 additions & 5 deletions plugins/Amplifier/AmplifierControlDialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,20 +32,22 @@ namespace lmms
{

class AmplifierControls;

class FloatModel;

namespace gui
{

class Knob;

class AmplifierControlDialog : public EffectControlDialog
{
Q_OBJECT
public:
AmplifierControlDialog( AmplifierControls* controls );
AmplifierControlDialog(AmplifierControls* controls);
~AmplifierControlDialog() override = default;

} ;

Knob* makeKnob(int x, int y, const QString& label, const QString& hintText, const QString& unit, FloatModel* model, bool isVolume);
};

} // namespace gui

Expand Down
53 changes: 17 additions & 36 deletions plugins/Amplifier/AmplifierControls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
*
*/


#include <QDomElement>

#include "AmplifierControls.h"
Expand All @@ -32,51 +31,33 @@
namespace lmms
{

AmplifierControls::AmplifierControls( AmplifierEffect* effect ) :
EffectControls( effect ),
m_effect( effect ),
m_volumeModel( 100.0f, 0.0f, 200.0f, 0.1f, this, tr( "Volume" ) ),
m_panModel( 0.0f, -100.0f, 100.0f, 0.1f, this, tr( "Panning" ) ),
m_leftModel( 100.0f, 0.0f, 200.0f, 0.1f, this, tr( "Left gain" ) ),
m_rightModel( 100.0f, 0.0f, 200.0f, 0.1f, this, tr( "Right gain" ) )
AmplifierControls::AmplifierControls(AmplifierEffect* effect) :
EffectControls(effect),
m_effect(effect),
m_volumeModel(100.0f, 0.0f, 200.0f, 0.1f, this, tr("Volume")),
m_panModel(0.0f, -100.0f, 100.0f, 0.1f, this, tr("Panning")),
m_leftModel(100.0f, 0.0f, 200.0f, 0.1f, this, tr("Left gain")),
m_rightModel(100.0f, 0.0f, 200.0f, 0.1f, this, tr("Right gain"))
{
/* connect( &m_volumeModel, SIGNAL( dataChanged() ), this, SLOT( changeControl() ) );
connect( &m_panModel, SIGNAL( dataChanged() ), this, SLOT( changeControl() ) );
connect( &m_leftModel, SIGNAL( dataChanged() ), this, SLOT( changeControl() ) );
connect( &m_rightModel, SIGNAL( dataChanged() ), this, SLOT( changeControl() ) );*/
}




void AmplifierControls::changeControl()
void AmplifierControls::loadSettings(const QDomElement& parent)
{
// engine::getSong()->setModified();
m_volumeModel.loadSettings(parent, "volume");
m_panModel.loadSettings(parent, "pan");
m_leftModel.loadSettings(parent, "left");
m_rightModel.loadSettings(parent, "right");
}




void AmplifierControls::loadSettings( const QDomElement& _this )
void AmplifierControls::saveSettings(QDomDocument& doc, QDomElement& parent)
{
m_volumeModel.loadSettings( _this, "volume" );
m_panModel.loadSettings( _this, "pan" );
m_leftModel.loadSettings( _this, "left" );
m_rightModel.loadSettings( _this, "right" );
}




void AmplifierControls::saveSettings( QDomDocument& doc, QDomElement& _this )
{
m_volumeModel.saveSettings( doc, _this, "volume" );
m_panModel.saveSettings( doc, _this, "pan" );
m_leftModel.saveSettings( doc, _this, "left" );
m_rightModel.saveSettings( doc, _this, "right" );
m_volumeModel.saveSettings(doc, parent, "volume");
m_panModel.saveSettings(doc, parent, "pan");
m_leftModel.saveSettings(doc, parent, "left");
m_rightModel.saveSettings(doc, parent, "right");
}


} // namespace lmms


Loading