From 2405a6a25e7f763633ec3a2602c3465b49887638 Mon Sep 17 00:00:00 2001 From: Vesa Date: Tue, 11 Feb 2014 15:19:04 +0200 Subject: [PATCH] Waveshaper, first working version... --- plugins/waveshaper/artwork.png | Bin 12823 -> 11507 bytes plugins/waveshaper/waveshaper.cpp | 68 ++++++++++--- plugins/waveshaper/waveshaper.h | 23 +++-- .../waveshaper/waveshaper_control_dialog.cpp | 42 ++++---- .../waveshaper/waveshaper_control_dialog.h | 12 ++- plugins/waveshaper/waveshaper_controls.cpp | 93 +++++++++++------- plugins/waveshaper/waveshaper_controls.h | 36 +++---- 7 files changed, 168 insertions(+), 106 deletions(-) diff --git a/plugins/waveshaper/artwork.png b/plugins/waveshaper/artwork.png index 23e2be7b34a2762a9d72d1e1e85a1e9aaa43fb5c..ba6d952ea3f896dfa1fba24dfbce3bc1f94880ea 100644 GIT binary patch literal 11507 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 X&wXgr*p~?W2M3(Iw6avWgrV>MYdPk{ diff --git a/plugins/waveshaper/waveshaper.cpp b/plugins/waveshaper/waveshaper.cpp index 9ac55de81..16e3ced56 100644 --- a/plugins/waveshaper/waveshaper.cpp +++ b/plugins/waveshaper/waveshaper.cpp @@ -1,7 +1,7 @@ /* - * bass_booster.cpp - bass-booster-effect-plugin + * waveshaper.cpp - waveshaper effect-plugin * - * * Copyright * (c) 2006-2008 Vesa Kivimäki + * * Copyright * (c) 2014 Vesa Kivimäki * Copyright (c) 2006-2009 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net @@ -24,8 +24,8 @@ */ -#include "bass_booster.h" - +#include "waveshaper.h" +#include #include "embed.cpp" @@ -35,10 +35,10 @@ extern "C" Plugin::Descriptor PLUGIN_EXPORT waveshaper_plugin_descriptor = { STRINGIFY( PLUGIN_NAME ), - "BassBooster Effect", + "Waveshaper Effect", QT_TRANSLATE_NOOP( "pluginBrowser", - "plugin for boosting bass" ), - "Tobias Doerffel ", + "plugin for waveshaping" ), + "Vesa Kivimäki ", 0x0100, Plugin::Effect, new PluginPixmapLoader( "logo" ), @@ -50,25 +50,24 @@ Plugin::Descriptor PLUGIN_EXPORT waveshaper_plugin_descriptor = -bassBoosterEffect::bassBoosterEffect( Model * _parent, +waveShaperEffect::waveShaperEffect( Model * _parent, const Descriptor::SubPluginFeatures::Key * _key ) : Effect( &waveshaper_plugin_descriptor, _parent, _key ), - m_bbFX( effectLib::fastBassBoost( 70.0f, 1.0f, 2.8f ) ), - m_bbControls( this ) + m_wsControls( this ) { } -bassBoosterEffect::~bassBoosterEffect() +waveShaperEffect::~waveShaperEffect() { } -bool bassBoosterEffect::processAudioBuffer( sampleFrame * _buf, +bool waveShaperEffect::processAudioBuffer( sampleFrame * _buf, const fpp_t _frames ) { if( !isEnabled() || !isRunning () ) @@ -76,14 +75,55 @@ bool bassBoosterEffect::processAudioBuffer( sampleFrame * _buf, return( false ); } +// variables for effect + int i = 0; + float lookup; + float frac; + float posneg; + double out_sum = 0.0; const float d = dryLevel(); const float w = wetLevel(); for( fpp_t f = 0; f < _frames; ++f ) { sample_t s[2] = { _buf[f][0], _buf[f][1] }; - m_bbFX.nextSample( s[0], s[1] ); +// apply input gain + s[0] *= m_wsControls.m_inputModel.value(); + s[1] *= m_wsControls.m_inputModel.value(); + +// start effect + + for ( i=0; i <= 1; ++i ) + { + lookup = fabsf( s[i] ) * 100.0f; + posneg = s[i] < 0 ? -1.0f : 1.0f; + + if ( lookup < 1 ) + { + frac = lookup - truncf(lookup); + s[i] = frac * m_wsControls.m_wavegraphModel.samples()[0] * posneg; + } + else + if ( lookup < 100 ) + { + frac = lookup - truncf(lookup); + s[i] = + (( (1.0f-frac) * m_wsControls.m_wavegraphModel.samples()[ (int)truncf(lookup) - 1 ] ) + + ( frac * m_wsControls.m_wavegraphModel.samples()[ (int)truncf(lookup) ] )) + * posneg; + } + else + { + s[i] *= m_wsControls.m_wavegraphModel.samples()[99]; + } + } + +// apply output gain + s[0] *= m_wsControls.m_outputModel.value(); + s[1] *= m_wsControls.m_outputModel.value(); + +// mix wet/dry signals _buf[f][0] = d * _buf[f][0] + w * s[0]; _buf[f][1] = d * _buf[f][1] + w * s[1]; @@ -105,7 +145,7 @@ extern "C" // necessary for getting instance out of shared lib Plugin * PLUGIN_EXPORT lmms_plugin_main( Model * _parent, void * _data ) { - return( new bassBoosterEffect( _parent, + return( new waveShaperEffect( _parent, static_cast( _data ) ) ); } diff --git a/plugins/waveshaper/waveshaper.h b/plugins/waveshaper/waveshaper.h index 90d8f2a55..016cab4de 100644 --- a/plugins/waveshaper/waveshaper.h +++ b/plugins/waveshaper/waveshaper.h @@ -1,7 +1,7 @@ /* - * bass_booster.h - bass-booster-effect-plugin + * waveshaper.h - bass-booster-effect-plugin * - * * Copyright * (c) 2006-2008 Vesa Kivimäki + * * Copyright * (c) 2014 Vesa Kivimäki * Copyright (c) 2006-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net @@ -24,8 +24,8 @@ */ -#ifndef _BASS_BOOSTER_H -#define _BASS_BOOSTER_H +#ifndef _WAVESHAPER_H +#define _WAVESHAPER_H #include "Effect.h" #include "effect_lib.h" @@ -33,27 +33,26 @@ -class bassBoosterEffect : public Effect +class waveShaperEffect : public Effect { public: - bassBoosterEffect( Model * _parent, + waveShaperEffect( Model * _parent, const Descriptor::SubPluginFeatures::Key * _key ); - virtual ~bassBoosterEffect(); + virtual ~waveShaperEffect(); virtual bool processAudioBuffer( sampleFrame * _buf, const fpp_t _frames ); virtual EffectControls * controls() { - return( &m_bbControls ); + return( &m_wsControls ); } private: - effectLib::monoToStereoAdaptor m_bbFX; + + waveShaperControls m_wsControls; - bassBoosterControls m_bbControls; - - friend class bassBoosterControls; + friend class waveShaperControls; } ; diff --git a/plugins/waveshaper/waveshaper_control_dialog.cpp b/plugins/waveshaper/waveshaper_control_dialog.cpp index d7b16b232..b00dc3cd8 100644 --- a/plugins/waveshaper/waveshaper_control_dialog.cpp +++ b/plugins/waveshaper/waveshaper_control_dialog.cpp @@ -1,7 +1,7 @@ /* * waveshaper_control_dialog.cpp - control-dialog for waveshaper-effect * - * Copyright * (c) 2006-2008 Vesa Kivimäki + * Copyright * (c) 2014 Vesa Kivimäki * Copyright * (c) 2006-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net @@ -29,11 +29,12 @@ #include "waveshaper_control_dialog.h" #include "waveshaper_controls.h" #include "embed.h" +#include "graph.h" -bassBoosterControlDialog::bassBoosterControlDialog( - bassBoosterControls * _controls ) : +waveShaperControlDialog::waveShaperControlDialog( + waveShaperControls * _controls ) : EffectControlDialog( _controls ) { setAutoFillBackground( true ); @@ -41,34 +42,33 @@ bassBoosterControlDialog::bassBoosterControlDialog( pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); setPalette( pal ); - setFixedSize( 120, 104 ); + setFixedSize( 120, 200 ); QVBoxLayout * tl = new QVBoxLayout( this ); tl->addSpacing( 30 ); + graph * waveGraph = new graph( this, graph::LinearStyle ); + waveGraph -> setModel( &_controls -> m_wavegraphModel ); + waveGraph -> setAutoFillBackground( true ); + + tl -> addWidget( waveGraph ); + QHBoxLayout * l = new QHBoxLayout; - knob * freqKnob = new knob( knobBright_26, this); - freqKnob->setModel( &_controls->m_freqModel ); - freqKnob->setLabel( tr( "FREQ" ) ); - freqKnob->setHintText( tr( "Frequency:" ) + " ", "Hz" ); + knob * inputKnob = new knob( knobBright_26, this); + inputKnob->setModel( &_controls->m_inputModel ); + inputKnob->setLabel( tr( "INPUT" ) ); + inputKnob->setHintText( tr( "Input gain:" ) + " ", "" ); - knob * gainKnob = new knob( knobBright_26, this ); - gainKnob->setModel( &_controls->m_gainModel ); - gainKnob->setLabel( tr( "GAIN" ) ); - gainKnob->setHintText( tr( "Gain:" ) + " ", "" ); + knob * outputKnob = new knob( knobBright_26, this ); + outputKnob->setModel( &_controls->m_outputModel ); + outputKnob->setLabel( tr( "OUTPUT" ) ); + outputKnob->setHintText( tr( "Output gain:" ) + " ", "" ); - knob * ratioKnob = new knob( knobBright_26, this ); - ratioKnob->setModel( &_controls->m_ratioModel ); - ratioKnob->setLabel( tr( "RATIO" ) ); - ratioKnob->setHintText( tr( "Ratio:" ) + " ", "" ); - - l->addWidget( freqKnob ); - l->addWidget( gainKnob ); - l->addWidget( ratioKnob ); + l->addWidget( inputKnob ); + l->addWidget( outputKnob ); tl->addLayout( l ); setLayout( tl ); } - diff --git a/plugins/waveshaper/waveshaper_control_dialog.h b/plugins/waveshaper/waveshaper_control_dialog.h index fe11fd5e0..6fb974ebf 100644 --- a/plugins/waveshaper/waveshaper_control_dialog.h +++ b/plugins/waveshaper/waveshaper_control_dialog.h @@ -1,7 +1,7 @@ /* * waveshaper_control_dialog.h - control-dialog for waveshaper-effect * - * * Copyright * (c) 2006-2008 Vesa Kivimäki + * * Copyright * (c) 2014 Vesa Kivimäki * Copyright (c) 2006-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net @@ -29,17 +29,19 @@ #include "EffectControlDialog.h" -class bassBoosterControls; +class waveShaperControls; -class bassBoosterControlDialog : public EffectControlDialog +class waveShaperControlDialog : public EffectControlDialog { public: - bassBoosterControlDialog( bassBoosterControls * _controls ); - virtual ~bassBoosterControlDialog() + waveShaperControlDialog( waveShaperControls * _controls ); + virtual ~waveShaperControlDialog() { } +private: + } ; #endif diff --git a/plugins/waveshaper/waveshaper_controls.cpp b/plugins/waveshaper/waveshaper_controls.cpp index c675ea044..6455c9653 100644 --- a/plugins/waveshaper/waveshaper_controls.cpp +++ b/plugins/waveshaper/waveshaper_controls.cpp @@ -1,7 +1,7 @@ /* * waveshaper_controls.cpp - controls for waveshaper-effect * - * Copyright * (c) 2006-2008 Vesa Kivimäki + * Copyright * (c) 2014 Vesa Kivimäki * Copyright (c) 2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net @@ -27,84 +27,103 @@ #include #include "waveshaper_controls.h" -#include "bass_booster.h" +#include "waveshaper.h" +#include "graph.h" -bassBoosterControls::bassBoosterControls( bassBoosterEffect * _eff ) : +waveShaperControls::waveShaperControls( waveShaperEffect * _eff ) : EffectControls( _eff ), m_effect( _eff ), - m_freqModel( 100.0f, 50.0f, 200.0f, 1.0f, this, tr( "Frequency" ) ), - m_gainModel( 1.0f, 0.1f, 5.0f, 0.05f, this, tr( "Gain" ) ), - m_ratioModel( 2.0f, 0.1f, 10.0f, 0.1f, this, tr( "Ratio" ) ) + m_inputModel( 1.0f, 0.0f, 2.0f, 0.01f, this, tr( "Input gain" ) ), + m_outputModel( 1.0f, 0.0f, 2.0f, 0.01f, this, tr( "Output gain" ) ), + m_wavegraphModel( 0.0f, 1.0f, 100, this ) { - connect( &m_freqModel, SIGNAL( dataChanged() ), - this, SLOT( changeFrequency() ) ); + connect( &m_inputModel, SIGNAL( dataChanged() ), + this, SLOT( changeInput() ) ); - connect( &m_gainModel, SIGNAL( dataChanged() ), - this, SLOT( changeGain() ) ); + connect( &m_outputModel, SIGNAL( dataChanged() ), + this, SLOT( changeOutput() ) ); - connect( &m_ratioModel, SIGNAL( dataChanged() ), - this, SLOT( changeRatio() ) ); + connect( &m_wavegraphModel, SIGNAL( samplesChanged( int, int ) ), + this, SLOT( samplesChanged( int, int ) ) ); - connect( engine::mixer(), SIGNAL( sampleRateChanged() ), - this, SLOT( changeFrequency() ) ); - changeFrequency(); - changeGain(); - changeRatio(); + changeInput(); + changeOutput(); + setDefaultShape(); + } -void bassBoosterControls::changeFrequency() +void waveShaperControls::changeInput() { - const sample_t fac = engine::mixer()->processingSampleRate() / - 44100.0f; - m_effect->m_bbFX.leftFX().setFrequency( m_freqModel.value() * fac ); - m_effect->m_bbFX.rightFX().setFrequency( m_freqModel.value() * fac ); } -void bassBoosterControls::changeGain() +void waveShaperControls::changeOutput() { - m_effect->m_bbFX.leftFX().setGain( m_gainModel.value() ); - m_effect->m_bbFX.rightFX().setGain( m_gainModel.value() ); } -void bassBoosterControls::changeRatio() -{ - m_effect->m_bbFX.leftFX().setRatio( m_ratioModel.value() ); - m_effect->m_bbFX.rightFX().setRatio( m_ratioModel.value() ); +void waveShaperControls::samplesChanged( int _begin, int _end) +{ } -void bassBoosterControls::loadSettings( const QDomElement & _this ) +void waveShaperControls::loadSettings( const QDomElement & _this ) { - m_freqModel.setValue( _this.attribute( "freq" ).toFloat() ); - m_gainModel.setValue( _this.attribute( "gain" ).toFloat() ); - m_ratioModel.setValue( _this.attribute( "ratio" ).toFloat() ); +//load input, output knobs + m_inputModel.setValue( _this.attribute( "inputGain" ).toFloat() ); + m_outputModel.setValue( _this.attribute( "outputGain" ).toFloat() ); + +//load waveshape + int size = 0; + char * dst = 0; + base64::decode( _this.attribute( "waveShape"), &dst, &size ); + + m_wavegraphModel.setSamples( (float*) dst ); + delete[] dst; + } -void bassBoosterControls::saveSettings( QDomDocument & _doc, +void waveShaperControls::saveSettings( QDomDocument & _doc, QDomElement & _this ) { - _this.setAttribute( "freq", m_freqModel.value() ); - _this.setAttribute( "gain", m_gainModel.value() ); - _this.setAttribute( "ratio", m_ratioModel.value() ); +//save input, output knobs + _this.setAttribute( "inputGain", m_inputModel.value() ); + _this.setAttribute( "outputGain", m_outputModel.value() ); + +//save waveshape + QString sampleString; + base64::encode( (const char *)m_wavegraphModel.samples(), + m_wavegraphModel.length() * sizeof(float), sampleString ); + _this.setAttribute( "waveShape", sampleString ); + } +void waveShaperControls::setDefaultShape() +{ + float shp [100] = { }; + for ( int i = 0; i<100; i++) + { + shp[i] = ((float)i + 1.0f) / 100.0f; + } + + m_wavegraphModel.setLength( 100 ); + m_wavegraphModel.setSamples( (float*)&shp ); +} #include "moc_waveshaper_controls.cxx" diff --git a/plugins/waveshaper/waveshaper_controls.h b/plugins/waveshaper/waveshaper_controls.h index f8b818939..e69436b7c 100644 --- a/plugins/waveshaper/waveshaper_controls.h +++ b/plugins/waveshaper/waveshaper_controls.h @@ -1,7 +1,7 @@ /* * waveshaper_controls.h - controls for waveshaper-effect * - * Copyright * (c) 2006-2008 Vesa Kivimäki + * Copyright * (c) 2014 Vesa Kivimäki * Copyright (c) 2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net @@ -29,17 +29,17 @@ #include "EffectControls.h" #include "waveshaper_control_dialog.h" #include "knob.h" +#include "graph.h" + +class waveShaperEffect; -class bassBoosterEffect; - - -class bassBoosterControls : public EffectControls +class waveShaperControls : public EffectControls { Q_OBJECT public: - bassBoosterControls( bassBoosterEffect * _eff ); - virtual ~bassBoosterControls() + waveShaperControls( waveShaperEffect * _eff ); + virtual ~waveShaperControls() { } @@ -49,6 +49,8 @@ public: { return( "waveshapercontrols" ); } + + virtual void setDefaultShape(); virtual int controlCount() { @@ -57,23 +59,23 @@ public: virtual EffectControlDialog * createView() { - return( new bassBoosterControlDialog( this ) ); + return( new waveShaperControlDialog( this ) ); } private slots: - void changeFrequency(); - void changeGain(); - void changeRatio(); - + void changeInput(); + void changeOutput(); + void samplesChanged( int, int ); private: - bassBoosterEffect * m_effect; - FloatModel m_freqModel; - FloatModel m_gainModel; - FloatModel m_ratioModel; + waveShaperEffect * m_effect; + FloatModel m_inputModel; + FloatModel m_outputModel; + graphModel m_wavegraphModel; - friend class bassBoosterControlDialog; + friend class waveShaperControlDialog; + friend class waveShaperEffect; } ;