From a4f070793976c1ce0868ac0dafe36c67083ced69 Mon Sep 17 00:00:00 2001 From: Hannu Haahti Date: Fri, 28 Mar 2014 03:46:28 +0200 Subject: [PATCH 1/9] slope param for kicker --- plugins/kicker/KickerOsc.h | 88 ++++++++++++++++++++++++++++++++++++++ plugins/kicker/kicker.cpp | 31 ++++++++++---- plugins/kicker/kicker.h | 2 + 3 files changed, 113 insertions(+), 8 deletions(-) create mode 100644 plugins/kicker/KickerOsc.h diff --git a/plugins/kicker/KickerOsc.h b/plugins/kicker/KickerOsc.h new file mode 100644 index 000000000..4069b940c --- /dev/null +++ b/plugins/kicker/KickerOsc.h @@ -0,0 +1,88 @@ +/* + * KickerOsc.h - alternative sweeping oscillator + * + * Copyright (c) 2006-2014 Tobias Doerffel + * Copyright (c) 2014 Hannu Haahti + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + +#ifndef KICKER_OSC_H +#define KICKER_OSC_H + +#include "DspEffectLibrary.h" +#include "Oscillator.h" + + +template +class KickerOsc +{ +public: + KickerOsc( const FX & fx, const float start, const float end, const float slope, const float length ) : + m_phase( 0.25f ), + m_startFreq( start ), + m_endFreq( end ), + m_slope( slope ), + m_length( length ), + m_FX( fx ), + m_counter( 0 ), + m_freq( start ) + { + } + + virtual ~KickerOsc() + { + } + + void update( sampleFrame* buf, const fpp_t frames, const float sampleRate ) + { + for( fpp_t frame = 0; frame < frames; ++frame ) + { + //~ if( m_counter > m_length ) + //~ { + //~ buf[frame][0] = 0.0f; + //~ buf[frame][1] = 0.0f; + //~ continue; + //~ } + const sample_t s = Oscillator::sinSample( m_phase ); + buf[frame][0] = s; + buf[frame][1] = s; + m_FX.nextSample( buf[frame][0], buf[frame][1] ); + m_phase += m_freq / sampleRate; + m_freq = m_endFreq + ( ( m_startFreq - m_endFreq ) * ( 1 - powf( m_counter / m_length, m_slope ) ) ); + ++m_counter; + } + } + + +private: + float m_phase; + const float m_startFreq; + const float m_endFreq; + const float m_slope; + const float m_length; + FX m_FX; + + fpp_t m_counter; + float m_freq; + +}; + + +#endif diff --git a/plugins/kicker/kicker.cpp b/plugins/kicker/kicker.cpp index c04f69edb..68c32ae7c 100644 --- a/plugins/kicker/kicker.cpp +++ b/plugins/kicker/kicker.cpp @@ -31,7 +31,7 @@ #include "InstrumentTrack.h" #include "knob.h" #include "NotePlayHandle.h" -#include "SweepOscillator.h" +#include "KickerOsc.h" #include "embed.cpp" @@ -62,7 +62,8 @@ kickerInstrument::kickerInstrument( InstrumentTrack * _instrument_track ) : m_endFreqModel( 40.0f, 5.0f, 1000.0f, 1.0f, this, tr( "End frequency" ) ), m_decayModel( 120.0f, 5.0f, 1000.0f, 1.0f, this, tr( "Decay" ) ), m_distModel( 0.8f, 0.0f, 100.0f, 0.1f, this, tr( "Distortion" ) ), - m_gainModel( 1.0f, 0.1f, 5.0f, 0.05f, this, tr( "Gain" ) ) + m_gainModel( 1.0f, 0.1f, 5.0f, 0.05f, this, tr( "Gain" ) ), + m_slopeModel( 0.5f, 0.001f, 1.0f, 0.001f, this, tr( "Slope" ) ) { } @@ -84,6 +85,7 @@ void kickerInstrument::saveSettings( QDomDocument & _doc, m_decayModel.saveSettings( _doc, _this, "decay" ); m_distModel.saveSettings( _doc, _this, "dist" ); m_gainModel.saveSettings( _doc, _this, "gain" ); + m_slopeModel.saveSettings( _doc, _this, "slope" ); } @@ -96,6 +98,7 @@ void kickerInstrument::loadSettings( const QDomElement & _this ) m_decayModel.loadSettings( _this, "decay" ); m_distModel.loadSettings( _this, "dist" ); m_gainModel.loadSettings( _this, "gain" ); + m_slopeModel.loadSettings( _this, "slope" ); } @@ -110,7 +113,7 @@ QString kickerInstrument::nodeName() const //typedef DspEffectLibrary::foldbackDistortion<> DistFX; typedef DspEffectLibrary::Distortion DistFX; -typedef SweepOscillator > SweepOsc; +typedef KickerOsc > SweepOsc; void kickerInstrument::playNote( NotePlayHandle * _n, @@ -124,7 +127,11 @@ void kickerInstrument::playNote( NotePlayHandle * _n, { _n->m_pluginData = new SweepOsc( DistFX( m_distModel.value(), - m_gainModel.value() ) ); + m_gainModel.value() ), + m_startFreqModel.value(), + m_endFreqModel.value(), + m_slopeModel.value(), + decfr ); } else if( tfp > decfr && !_n->isReleased() ) { @@ -132,7 +139,7 @@ void kickerInstrument::playNote( NotePlayHandle * _n, } //const float freq = instrumentTrack()->frequency( _n ) / 2; - const float fdiff = m_endFreqModel.value() - m_startFreqModel.value(); + //~ const float fdiff = m_endFreqModel.value() - m_startFreqModel.value(); /* const fpp_t frames = _n->isReleased() ? tMax( tMin( desiredReleaseFrames() - _n->releaseFramesDone(), @@ -140,12 +147,15 @@ void kickerInstrument::playNote( NotePlayHandle * _n, : engine::mixer()->framesPerAudioBuffer();*/ const fpp_t frames = _n->framesLeftForCurrentPeriod(); - const float f1 = m_startFreqModel.value() + tfp * fdiff / decfr; - const float f2 = m_startFreqModel.value() + (frames+tfp-1)*fdiff/decfr; + //~ const float slopePoint = powf( fdiff / decfr, 1 + m_slopeModel.value() * 6 ); + + //~ const float f1 = m_startFreqModel.value() + tfp * ((fdiff/decfr) * slopePoint); + //~ const float f2 = m_startFreqModel.value() + (frames+tfp-1) * ((fdiff/decfr) * slopePoint); + SweepOsc * so = static_cast( _n->m_pluginData ); - so->update( _working_buffer, frames, f1, f2, + so->update( _working_buffer, frames, engine::mixer()->processingSampleRate() ); if( _n->isReleased() ) @@ -219,6 +229,10 @@ kickerInstrumentView::kickerInstrumentView( Instrument * _instrument, m_gainKnob->setHintText( tr( "Gain:" ) + " ", "" ); m_gainKnob->move( 203, 124 ); + m_slopeKnob = new kickerKnob( this ); + m_slopeKnob->setHintText( tr( "Slope:" ) + " ", "" ); + m_slopeKnob->move( 203, 164 ); + setAutoFillBackground( true ); QPalette pal; pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( @@ -244,6 +258,7 @@ void kickerInstrumentView::modelChanged() m_decayKnob->setModel( &k->m_decayModel ); m_distKnob->setModel( &k->m_distModel ); m_gainKnob->setModel( &k->m_gainModel ); + m_slopeKnob->setModel( &k->m_slopeModel ); } diff --git a/plugins/kicker/kicker.h b/plugins/kicker/kicker.h index f6633b07e..b1b5e2403 100644 --- a/plugins/kicker/kicker.h +++ b/plugins/kicker/kicker.h @@ -66,6 +66,7 @@ private: FloatModel m_decayModel; FloatModel m_distModel; FloatModel m_gainModel; + FloatModel m_slopeModel; friend class kickerInstrumentView; @@ -88,6 +89,7 @@ private: knob * m_decayKnob; knob * m_distKnob; knob * m_gainKnob; + knob * m_slopeKnob; } ; From f53ecdf023201659219afbd454d5fa695e476bfe Mon Sep 17 00:00:00 2001 From: Hannu Haahti Date: Fri, 28 Mar 2014 16:03:48 +0200 Subject: [PATCH 2/9] kicker: click param --- plugins/kicker/KickerOsc.h | 13 ++++++++----- plugins/kicker/kicker.cpp | 17 +++++++++++++---- plugins/kicker/kicker.h | 2 ++ 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/plugins/kicker/KickerOsc.h b/plugins/kicker/KickerOsc.h index 4069b940c..d559ee6f4 100644 --- a/plugins/kicker/KickerOsc.h +++ b/plugins/kicker/KickerOsc.h @@ -34,8 +34,8 @@ template class KickerOsc { public: - KickerOsc( const FX & fx, const float start, const float end, const float slope, const float length ) : - m_phase( 0.25f ), + KickerOsc( const FX & fx, const float start, const float end, const float offset, const float slope, const float length ) : + m_phase( offset ), m_startFreq( start ), m_endFreq( end ), m_slope( slope ), @@ -65,7 +65,10 @@ public: buf[frame][1] = s; m_FX.nextSample( buf[frame][0], buf[frame][1] ); m_phase += m_freq / sampleRate; - m_freq = m_endFreq + ( ( m_startFreq - m_endFreq ) * ( 1 - powf( m_counter / m_length, m_slope ) ) ); + + const double change = ( m_counter < m_length ) ? ( ( m_startFreq - m_endFreq ) * ( 1 - powf( m_counter / m_length, m_slope ) ) ) : 0; + //~ qDebug( "%f (%f) [%lu, %f]", change, powf( m_counter / m_length, m_slope ), m_counter, m_length ); + m_freq = m_endFreq + change; ++m_counter; } } @@ -79,8 +82,8 @@ private: const float m_length; FX m_FX; - fpp_t m_counter; - float m_freq; + unsigned long m_counter; + double m_freq; }; diff --git a/plugins/kicker/kicker.cpp b/plugins/kicker/kicker.cpp index 68c32ae7c..76027f8ef 100644 --- a/plugins/kicker/kicker.cpp +++ b/plugins/kicker/kicker.cpp @@ -63,6 +63,7 @@ kickerInstrument::kickerInstrument( InstrumentTrack * _instrument_track ) : m_decayModel( 120.0f, 5.0f, 1000.0f, 1.0f, this, tr( "Decay" ) ), m_distModel( 0.8f, 0.0f, 100.0f, 0.1f, this, tr( "Distortion" ) ), m_gainModel( 1.0f, 0.1f, 5.0f, 0.05f, this, tr( "Gain" ) ), + m_clickModel( 1.0f, 0.0f, 1.0f, 0.1f, this, tr( "Click" ) ), m_slopeModel( 0.5f, 0.001f, 1.0f, 0.001f, this, tr( "Slope" ) ) { } @@ -85,6 +86,7 @@ void kickerInstrument::saveSettings( QDomDocument & _doc, m_decayModel.saveSettings( _doc, _this, "decay" ); m_distModel.saveSettings( _doc, _this, "dist" ); m_gainModel.saveSettings( _doc, _this, "gain" ); + m_clickModel.saveSettings( _doc, _this, "click" ); m_slopeModel.saveSettings( _doc, _this, "slope" ); } @@ -98,6 +100,7 @@ void kickerInstrument::loadSettings( const QDomElement & _this ) m_decayModel.loadSettings( _this, "decay" ); m_distModel.loadSettings( _this, "dist" ); m_gainModel.loadSettings( _this, "gain" ); + m_clickModel.loadSettings( _this, "gain" ); m_slopeModel.loadSettings( _this, "slope" ); } @@ -130,6 +133,7 @@ void kickerInstrument::playNote( NotePlayHandle * _n, m_gainModel.value() ), m_startFreqModel.value(), m_endFreqModel.value(), + m_clickModel.value() * 0.25f, m_slopeModel.value(), decfr ); } @@ -160,11 +164,11 @@ void kickerInstrument::playNote( NotePlayHandle * _n, if( _n->isReleased() ) { - const float rfd = _n->releaseFramesDone(); - const float drf = desiredReleaseFrames(); + const float done = _n->releaseFramesDone(); + const float desired = desiredReleaseFrames(); for( fpp_t f = 0; f < frames; ++f ) { - const float fac = 1.0f - ( rfd+f ) / drf; + const float fac = ( done+f < desired ) ? ( 1.0f - ( ( done+f ) / desired ) ) : 0; _working_buffer[f][0] *= fac; _working_buffer[f][1] *= fac; } @@ -229,9 +233,13 @@ kickerInstrumentView::kickerInstrumentView( Instrument * _instrument, m_gainKnob->setHintText( tr( "Gain:" ) + " ", "" ); m_gainKnob->move( 203, 124 ); + m_clickKnob = new kickerKnob( this ); + m_clickKnob->setHintText( tr( "Click:" ) + " ", "" ); + m_clickKnob->move( 203, 164 ); + m_slopeKnob = new kickerKnob( this ); m_slopeKnob->setHintText( tr( "Slope:" ) + " ", "" ); - m_slopeKnob->move( 203, 164 ); + m_slopeKnob->move( 203, 204 ); setAutoFillBackground( true ); QPalette pal; @@ -258,6 +266,7 @@ void kickerInstrumentView::modelChanged() m_decayKnob->setModel( &k->m_decayModel ); m_distKnob->setModel( &k->m_distModel ); m_gainKnob->setModel( &k->m_gainModel ); + m_clickKnob->setModel( &k->m_clickModel ); m_slopeKnob->setModel( &k->m_slopeModel ); } diff --git a/plugins/kicker/kicker.h b/plugins/kicker/kicker.h index b1b5e2403..02007e22a 100644 --- a/plugins/kicker/kicker.h +++ b/plugins/kicker/kicker.h @@ -66,6 +66,7 @@ private: FloatModel m_decayModel; FloatModel m_distModel; FloatModel m_gainModel; + FloatModel m_clickModel; FloatModel m_slopeModel; friend class kickerInstrumentView; @@ -89,6 +90,7 @@ private: knob * m_decayKnob; knob * m_distKnob; knob * m_gainKnob; + knob * m_clickKnob; knob * m_slopeKnob; } ; From 172cffa3c5dfdbf0876b7739d32b0eed6f7e40e1 Mon Sep 17 00:00:00 2001 From: Hannu Haahti Date: Fri, 28 Mar 2014 17:26:06 +0200 Subject: [PATCH 3/9] kicker: envelope slope --- plugins/kicker/KickerOsc.h | 20 ++++++++++---------- plugins/kicker/fastpow.h | 20 ++++++++++++++++++++ plugins/kicker/kicker.cpp | 21 +++++++++++++++------ plugins/kicker/kicker.h | 2 ++ 4 files changed, 47 insertions(+), 16 deletions(-) create mode 100644 plugins/kicker/fastpow.h diff --git a/plugins/kicker/KickerOsc.h b/plugins/kicker/KickerOsc.h index d559ee6f4..2dbfd19f6 100644 --- a/plugins/kicker/KickerOsc.h +++ b/plugins/kicker/KickerOsc.h @@ -29,16 +29,19 @@ #include "DspEffectLibrary.h" #include "Oscillator.h" +#include "fastpow.h" + template class KickerOsc { public: - KickerOsc( const FX & fx, const float start, const float end, const float offset, const float slope, const float length ) : + KickerOsc( const FX & fx, const float start, const float end, const float offset, const float slope, const float env, const float length ) : m_phase( offset ), m_startFreq( start ), m_endFreq( end ), m_slope( slope ), + m_env( env ), m_length( length ), m_FX( fx ), m_counter( 0 ), @@ -54,19 +57,15 @@ public: { for( fpp_t frame = 0; frame < frames; ++frame ) { - //~ if( m_counter > m_length ) - //~ { - //~ buf[frame][0] = 0.0f; - //~ buf[frame][1] = 0.0f; - //~ continue; - //~ } + const double gain = ( 1 - fastPow( ( m_counter < m_length ) ? m_counter / m_length : 1, m_env ) ); + //~ qDebug( "%f", gain ); const sample_t s = Oscillator::sinSample( m_phase ); - buf[frame][0] = s; - buf[frame][1] = s; + buf[frame][0] = s * gain; + buf[frame][1] = s * gain; m_FX.nextSample( buf[frame][0], buf[frame][1] ); m_phase += m_freq / sampleRate; - const double change = ( m_counter < m_length ) ? ( ( m_startFreq - m_endFreq ) * ( 1 - powf( m_counter / m_length, m_slope ) ) ) : 0; + const double change = ( m_counter < m_length ) ? ( ( m_startFreq - m_endFreq ) * ( 1 - fastPow( m_counter / m_length, m_slope ) ) ) : 0; //~ qDebug( "%f (%f) [%lu, %f]", change, powf( m_counter / m_length, m_slope ), m_counter, m_length ); m_freq = m_endFreq + change; ++m_counter; @@ -79,6 +78,7 @@ private: const float m_startFreq; const float m_endFreq; const float m_slope; + const float m_env; const float m_length; FX m_FX; diff --git a/plugins/kicker/fastpow.h b/plugins/kicker/fastpow.h new file mode 100644 index 000000000..145388d3f --- /dev/null +++ b/plugins/kicker/fastpow.h @@ -0,0 +1,20 @@ + +#ifndef FASTPOW_H +#define FASTPOW_H + +/* + * source: + * http://martin.ankerl.com/2007/10/04/optimized-pow-approximation-for-java-and-c-c/ + */ + +double fastPow(double a, double b) { + union { + double d; + int x[2]; + } u = { a }; + u.x[1] = (int)(b * (u.x[1] - 1072632447) + 1072632447); + u.x[0] = 0; + return u.d; +} + +#endif diff --git a/plugins/kicker/kicker.cpp b/plugins/kicker/kicker.cpp index 76027f8ef..7f0948059 100644 --- a/plugins/kicker/kicker.cpp +++ b/plugins/kicker/kicker.cpp @@ -60,11 +60,12 @@ kickerInstrument::kickerInstrument( InstrumentTrack * _instrument_track ) : Instrument( _instrument_track, &kicker_plugin_descriptor ), m_startFreqModel( 150.0f, 5.0f, 1000.0f, 1.0f, this, tr( "Start frequency" ) ), m_endFreqModel( 40.0f, 5.0f, 1000.0f, 1.0f, this, tr( "End frequency" ) ), - m_decayModel( 120.0f, 5.0f, 1000.0f, 1.0f, this, tr( "Decay" ) ), + m_decayModel( 440.0f, 5.0f, 2000.0f, 1.0f, this, tr( "Decay" ) ), m_distModel( 0.8f, 0.0f, 100.0f, 0.1f, this, tr( "Distortion" ) ), m_gainModel( 1.0f, 0.1f, 5.0f, 0.05f, this, tr( "Gain" ) ), - m_clickModel( 1.0f, 0.0f, 1.0f, 0.1f, this, tr( "Click" ) ), - m_slopeModel( 0.5f, 0.001f, 1.0f, 0.001f, this, tr( "Slope" ) ) + m_envModel( 0.163f, 0.01f, 1.0f, 0.001f, this, tr( "Env" ) ), + m_clickModel( 0.4f, 0.0f, 1.0f, 0.05f, this, tr( "Click" ) ), + m_slopeModel( 0.06f, 0.001f, 1.0f, 0.001f, this, tr( "Slope" ) ) { } @@ -86,6 +87,7 @@ void kickerInstrument::saveSettings( QDomDocument & _doc, m_decayModel.saveSettings( _doc, _this, "decay" ); m_distModel.saveSettings( _doc, _this, "dist" ); m_gainModel.saveSettings( _doc, _this, "gain" ); + m_envModel.saveSettings( _doc, _this, "env" ); m_clickModel.saveSettings( _doc, _this, "click" ); m_slopeModel.saveSettings( _doc, _this, "slope" ); } @@ -100,7 +102,8 @@ void kickerInstrument::loadSettings( const QDomElement & _this ) m_decayModel.loadSettings( _this, "decay" ); m_distModel.loadSettings( _this, "dist" ); m_gainModel.loadSettings( _this, "gain" ); - m_clickModel.loadSettings( _this, "gain" ); + m_envModel.loadSettings( _this, "env" ); + m_clickModel.loadSettings( _this, "click" ); m_slopeModel.loadSettings( _this, "slope" ); } @@ -135,6 +138,7 @@ void kickerInstrument::playNote( NotePlayHandle * _n, m_endFreqModel.value(), m_clickModel.value() * 0.25f, m_slopeModel.value(), + m_envModel.value(), decfr ); } else if( tfp > decfr && !_n->isReleased() ) @@ -233,13 +237,17 @@ kickerInstrumentView::kickerInstrumentView( Instrument * _instrument, m_gainKnob->setHintText( tr( "Gain:" ) + " ", "" ); m_gainKnob->move( 203, 124 ); + m_envKnob = new kickerKnob( this ); + m_envKnob->setHintText( tr( "Env:" ) + " ", "" ); + m_envKnob->move( 203, 204 ); + m_clickKnob = new kickerKnob( this ); m_clickKnob->setHintText( tr( "Click:" ) + " ", "" ); - m_clickKnob->move( 203, 164 ); + m_clickKnob->move( 12, 204 ); m_slopeKnob = new kickerKnob( this ); m_slopeKnob->setHintText( tr( "Slope:" ) + " ", "" ); - m_slopeKnob->move( 203, 204 ); + m_slopeKnob->move( 59, 204 ); setAutoFillBackground( true ); QPalette pal; @@ -266,6 +274,7 @@ void kickerInstrumentView::modelChanged() m_decayKnob->setModel( &k->m_decayModel ); m_distKnob->setModel( &k->m_distModel ); m_gainKnob->setModel( &k->m_gainModel ); + m_envKnob->setModel( &k->m_envModel ); m_clickKnob->setModel( &k->m_clickModel ); m_slopeKnob->setModel( &k->m_slopeModel ); } diff --git a/plugins/kicker/kicker.h b/plugins/kicker/kicker.h index 02007e22a..78944da47 100644 --- a/plugins/kicker/kicker.h +++ b/plugins/kicker/kicker.h @@ -66,6 +66,7 @@ private: FloatModel m_decayModel; FloatModel m_distModel; FloatModel m_gainModel; + FloatModel m_envModel; FloatModel m_clickModel; FloatModel m_slopeModel; @@ -90,6 +91,7 @@ private: knob * m_decayKnob; knob * m_distKnob; knob * m_gainKnob; + knob * m_envKnob; knob * m_clickKnob; knob * m_slopeKnob; From f1f6c71aa1000de5554eca9721f0ef75243adeb4 Mon Sep 17 00:00:00 2001 From: Hannu Haahti Date: Fri, 28 Mar 2014 20:36:11 +0200 Subject: [PATCH 4/9] kicker: noise option + artwork --- plugins/kicker/KickerOsc.h | 6 ++-- plugins/kicker/artwork.png | Bin 40329 -> 8769 bytes plugins/kicker/kicker.cpp | 58 ++++++++++++++++++++++--------------- plugins/kicker/kicker.h | 2 ++ 4 files changed, 40 insertions(+), 26 deletions(-) diff --git a/plugins/kicker/KickerOsc.h b/plugins/kicker/KickerOsc.h index 2dbfd19f6..440fa5837 100644 --- a/plugins/kicker/KickerOsc.h +++ b/plugins/kicker/KickerOsc.h @@ -36,10 +36,11 @@ template class KickerOsc { public: - KickerOsc( const FX & fx, const float start, const float end, const float offset, const float slope, const float env, const float length ) : + KickerOsc( const FX & fx, const float start, const float end, const float noise, const float offset, const float slope, const float env, const float length ) : m_phase( offset ), m_startFreq( start ), m_endFreq( end ), + m_noise( noise ), m_slope( slope ), m_env( env ), m_length( length ), @@ -59,7 +60,7 @@ public: { const double gain = ( 1 - fastPow( ( m_counter < m_length ) ? m_counter / m_length : 1, m_env ) ); //~ qDebug( "%f", gain ); - const sample_t s = Oscillator::sinSample( m_phase ); + const sample_t s = Oscillator::sinSample( m_phase ) + ( Oscillator::noiseSample( 0 ) * gain * gain * m_noise ); buf[frame][0] = s * gain; buf[frame][1] = s * gain; m_FX.nextSample( buf[frame][0], buf[frame][1] ); @@ -77,6 +78,7 @@ private: float m_phase; const float m_startFreq; const float m_endFreq; + const float m_noise; const float m_slope; const float m_env; const float m_length; diff --git a/plugins/kicker/artwork.png b/plugins/kicker/artwork.png index 12a56504448b60f544dbc854a9b846b6b727e2ee..4d583bb4fd03f3c3296ba49cca6b65d68a8f6b12 100644 GIT binary patch literal 8769 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 INbBo=0K-ICxBvhE literal 40329 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 tr( "Start frequency:" ) + " ", "Hz" ); - m_startFreqKnob->move( 12, 124 ); + m_startFreqKnob->move( 15, 100 ); m_endFreqKnob = new kickerKnob( this ); m_endFreqKnob->setHintText( tr( "End frequency:" ) + " ", "Hz" ); - m_endFreqKnob->move( 59, 124 ); - - m_decayKnob = new kickerKnob( this ); - m_decayKnob->setHintText( tr( "Decay:" ) + " ", "ms" ); - m_decayKnob->move( 107, 124 ); - - m_distKnob = new kickerKnob( this ); - m_distKnob->setHintText( tr( "Distortion:" ) + " ", "" ); - m_distKnob->move( 155, 124 ); - - m_gainKnob = new kickerKnob( this ); - m_gainKnob->setHintText( tr( "Gain:" ) + " ", "" ); - m_gainKnob->move( 203, 124 ); - - m_envKnob = new kickerKnob( this ); - m_envKnob->setHintText( tr( "Env:" ) + " ", "" ); - m_envKnob->move( 203, 204 ); - - m_clickKnob = new kickerKnob( this ); - m_clickKnob->setHintText( tr( "Click:" ) + " ", "" ); - m_clickKnob->move( 12, 204 ); + m_endFreqKnob->move( 60, 100 ); m_slopeKnob = new kickerKnob( this ); m_slopeKnob->setHintText( tr( "Slope:" ) + " ", "" ); - m_slopeKnob->move( 59, 204 ); + m_slopeKnob->move( 105, 100 ); + + m_gainKnob = new kickerKnob( this ); + m_gainKnob->setHintText( tr( "Gain:" ) + " ", "" ); + m_gainKnob->move( 15, 155 ); + + m_decayKnob = new kickerKnob( this ); + m_decayKnob->setHintText( tr( "Length:" ) + " ", "ms" ); + m_decayKnob->move( 60, 155 ); + + m_envKnob = new kickerKnob( this ); + m_envKnob->setHintText( tr( "Env:" ) + " ", "" ); + m_envKnob->move( 105, 155 ); + + m_noiseKnob = new kickerKnob( this ); + m_noiseKnob->setHintText( tr( "Noise:" ) + " ", "" ); + m_noiseKnob->move( 200, 45 ); + + m_distKnob = new kickerKnob( this ); + m_distKnob->setHintText( tr( "Distortion:" ) + " ", "" ); + m_distKnob->move( 200, 100 ); + + m_clickKnob = new kickerKnob( this ); + m_clickKnob->setHintText( tr( "Click:" ) + " ", "" ); + m_clickKnob->move( 200, 155 ); + setAutoFillBackground( true ); QPalette pal; @@ -275,6 +284,7 @@ void kickerInstrumentView::modelChanged() m_distKnob->setModel( &k->m_distModel ); m_gainKnob->setModel( &k->m_gainModel ); m_envKnob->setModel( &k->m_envModel ); + m_noiseKnob->setModel( &k->m_noiseModel ); m_clickKnob->setModel( &k->m_clickModel ); m_slopeKnob->setModel( &k->m_slopeModel ); } diff --git a/plugins/kicker/kicker.h b/plugins/kicker/kicker.h index 78944da47..db17e642c 100644 --- a/plugins/kicker/kicker.h +++ b/plugins/kicker/kicker.h @@ -67,6 +67,7 @@ private: FloatModel m_distModel; FloatModel m_gainModel; FloatModel m_envModel; + FloatModel m_noiseModel; FloatModel m_clickModel; FloatModel m_slopeModel; @@ -92,6 +93,7 @@ private: knob * m_distKnob; knob * m_gainKnob; knob * m_envKnob; + knob * m_noiseKnob; knob * m_clickKnob; knob * m_slopeKnob; From 8d987aabd466459ddc0dc07770dfb7a04e5ff09b Mon Sep 17 00:00:00 2001 From: Hannu Haahti Date: Fri, 28 Mar 2014 21:04:22 +0200 Subject: [PATCH 5/9] kicker: noise improvements, decay -> length --- plugins/kicker/KickerOsc.h | 2 +- plugins/kicker/kicker.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/kicker/KickerOsc.h b/plugins/kicker/KickerOsc.h index 440fa5837..fe370c6b5 100644 --- a/plugins/kicker/KickerOsc.h +++ b/plugins/kicker/KickerOsc.h @@ -60,7 +60,7 @@ public: { const double gain = ( 1 - fastPow( ( m_counter < m_length ) ? m_counter / m_length : 1, m_env ) ); //~ qDebug( "%f", gain ); - const sample_t s = Oscillator::sinSample( m_phase ) + ( Oscillator::noiseSample( 0 ) * gain * gain * m_noise ); + const sample_t s = ( Oscillator::sinSample( m_phase ) * ( 1 - m_noise ) ) + ( Oscillator::noiseSample( 0 ) * gain * gain * m_noise ); buf[frame][0] = s * gain; buf[frame][1] = s * gain; m_FX.nextSample( buf[frame][0], buf[frame][1] ); diff --git a/plugins/kicker/kicker.cpp b/plugins/kicker/kicker.cpp index ab2459b72..4b9078aa0 100644 --- a/plugins/kicker/kicker.cpp +++ b/plugins/kicker/kicker.cpp @@ -60,7 +60,7 @@ kickerInstrument::kickerInstrument( InstrumentTrack * _instrument_track ) : Instrument( _instrument_track, &kicker_plugin_descriptor ), m_startFreqModel( 150.0f, 5.0f, 1000.0f, 1.0f, this, tr( "Start frequency" ) ), m_endFreqModel( 40.0f, 5.0f, 1000.0f, 1.0f, this, tr( "End frequency" ) ), - m_decayModel( 440.0f, 5.0f, 2000.0f, 1.0f, this, tr( "Decay" ) ), + m_decayModel( 440.0f, 5.0f, 2000.0f, 1.0f, this, tr( "Length" ) ), m_distModel( 0.8f, 0.0f, 100.0f, 0.1f, this, tr( "Distortion" ) ), m_gainModel( 1.0f, 0.1f, 5.0f, 0.05f, this, tr( "Gain" ) ), m_envModel( 0.163f, 0.01f, 1.0f, 0.001f, this, tr( "Env" ) ), @@ -139,7 +139,7 @@ void kickerInstrument::playNote( NotePlayHandle * _n, m_gainModel.value() ), m_startFreqModel.value(), m_endFreqModel.value(), - m_noiseModel.value(), + m_noiseModel.value() * m_noiseModel.value(), m_clickModel.value() * 0.25f, m_slopeModel.value(), m_envModel.value(), From 0967d91f44374738c88236e36b26c253a5ea0b09 Mon Sep 17 00:00:00 2001 From: Hannu Haahti Date: Sat, 29 Mar 2014 00:01:56 +0200 Subject: [PATCH 6/9] paranoid --- plugins/kicker/fastpow.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/kicker/fastpow.h b/plugins/kicker/fastpow.h index 145388d3f..48fd83c03 100644 --- a/plugins/kicker/fastpow.h +++ b/plugins/kicker/fastpow.h @@ -2,6 +2,8 @@ #ifndef FASTPOW_H #define FASTPOW_H +#include + /* * source: * http://martin.ankerl.com/2007/10/04/optimized-pow-approximation-for-java-and-c-c/ @@ -10,9 +12,9 @@ double fastPow(double a, double b) { union { double d; - int x[2]; + int32_t x[2]; } u = { a }; - u.x[1] = (int)(b * (u.x[1] - 1072632447) + 1072632447); + u.x[1] = (int32_t)(b * (u.x[1] - 1072632447) + 1072632447); u.x[0] = 0; return u.d; } From 29c2d3fb1a54f4e65a9f657f76239070bd363281 Mon Sep 17 00:00:00 2001 From: Hannu Haahti Date: Sat, 29 Mar 2014 00:48:34 +0200 Subject: [PATCH 7/9] kicker: possible to play notes too --- plugins/kicker/artwork.png | Bin 8769 -> 9016 bytes plugins/kicker/kicker.cpp | 19 ++++++++++++++++--- plugins/kicker/kicker.h | 13 ++++++++++++- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/plugins/kicker/artwork.png b/plugins/kicker/artwork.png index 4d583bb4fd03f3c3296ba49cca6b65d68a8f6b12..463ea0efe6deff2d9784f9a94ec2a1d3d5305318 100644 GIT binary patch literal 9016 zcmdU#XEH{;e(truC@Dxk!l%N=!oqqaEAw6jIG^7h zcsRiS&>bC7;B*fvA*+T5{Q2OSh63LoILc^4f!`x;k2?}f$sWK(N*75j7gYyy7k49P zGc0#^_cvDdHc%5IN3%B$&KAjN5h^UK=UB4u#nn7gc9EVQY8d3{!Ko=1cj6AUHlF`` znY+PQFW964%#?|lLg&<#-`h-lC@Lv&ZD3V&z`*Htu9#-zO6oi&a-Nct;sbpNc>exv zyv(=P59E4;rekF#CVNHvK0kc_oPH_gckB^NpWM$>;3(CB;V7}{+P52I+J?m_5h^xV zQb$cJk*^r=<};zpNYKcg2aUu+&&A0laOpQCHb33d$D{q0L6C|4*yV-G+yCc(v^YQe z2yZl@K6&m-80~voiHDik?fWN~_HDDA(%P?7-t3Z|d|Xkc(W##C>$&T6sQ%kwu!w3& zB8F+X=#g^orTLe&?x`o#XwFRk?PVA;H7#1803N+GaoX6tFGZGKL1yO=I;Ju<1-HkI zd=$yz;^u!(Kh%bp@A>!HXZ5r<&s*&g`D{hTgBLdCYfqV{w7s1{3ZeE~x&sIrXRMp& zV0*tsw*j&$iB$a$0dL;(e@x`wN_scn1@4JrhB7d#pqznWcX{Wcr&f2;D;y*6B6_o) zNz$e^I)h+T63yUlJ}>$%ZsxY1O|oZI^FY@cnONME@)R;%L&{n?lq&*B%UH$9v%-y^ z81raCfLo9U5#o*M!GLMiU)@FJG@Reo>De}$`1hKcrf%N9*YdjzivIJ7X*l=aPfSNL z@$1`iBSD*4I|EfythNx|+xqR#=Y~ME=1$u;2@^6EiC7gzgF@Vt%} zf2H*GEu$~c+0E78+XDjTZSz#Cr>c~sBU|E+VOv_FqIl0J=GQjza&jxqMP1(!g8jGB zXbEv=;g>NfJGMGHI$lkw3Zuru5~9F-+8Q(jMH~;L@357(&>izh@=?1*+Tqw#SY)Pg zQ%*OxtUd$xdLsR}#1Y1Zw|CKms&X?%r7f?Hs*HmL-MY{SYciVC$!QL@ z08`UYQ*uY^IaH6B>Fj8S^0ib-@$0gAczTl1k^IWU#`Ve$dNT%epn9uDmy7Zt&fMIb zqX13I!67oMGcBmHSc4UV!3d<18?S7wbvEd@cIQKi3}&U>g;J9UB5sGYaV5>0A|Ykx zeA<%dut=J2YhTb_>XmAqqGnUgSMSXUO>&7q`y{UWvAyG4Yq~UqwGPu+#?qRnv4T-= zK5LlLfED_NeY+44m}~FN>%5=eM4VpQ<6u)G$~LB=U;U70Sm)5|IXs=mHe62;{2Uyz zV$V|vy>R1FOldO&fuKV)#>>l=R#rw6VNXd{*O(`(ibnx^8BZ0agmygAD%rKL;nih} zkW(<9MwJ~6={j((#p_~$>KjOiDe&69O=+=_5$v^I@!ec@gZD8uEwU@0dSraAE6M-wp$P%n1iJhV>+9iPb7%1h9uTyG)OeqRzU>jwHm){U45ut1>*ilJ z`}v_^i+2pJ(rJq7m1PiBq?U-tCi!ED zUP&8|PpA+g#+O`=KeY$k-A17}6XgNhe<}9j4i-N@KQKw5zYLX%HMO$|oF2h1mkDx* zlkT@Q%;-1|rL8Fri-q@^8edG7B(S9?B==ti5m?#VcNu~lm!~+XsHp{^=RC~d3(8i% zLs_8d=_(t|rf}y{^)h`*#`h32zGNo>8d?KAvsx`nYuje}0Wu;YDrzdyM}j?6`gonZ ze0&D5#Ngn5v3Vs(nTznJoos?kg8$1UVu3&%{1O)alEDbih$Qpx-?POfvmAKs*X=@U+cQa1T0vPiDZar$ zQTN$ZI_ju25horFHdsLU^;KzOaY@GKjWnM)(WW=4!Fh~U6&pV*WJPNJT1iN}D{ZuO zQs(5~@ca^ZL3Hxg0tQjjBduB=ZsTt|E$p9R-SMd~elkrtz0EI0bPqY!-8@uzsr-ZU4NU6tW?0x1kKAJs_XT z{pI(AFZ#arI@VOPle-zRYbE09fnsbgf;AVe!SCM(yEaMrmPRttowd?{V{!~FG;=%C zOoF=(+rv4C$>y)p?1K2xyiWux6--&Cv=_+9D7%_**O$pR5xZ3CYwE?me(be+$pNV~ zc{(GaEyb7Ks7f1r`Q%GI>Kmv2mlKE>ot^1zt2HFiLR0Ryx{9YW9{cl<-lUdTc`|My z@KKQszGrgbAGXffu#5f>vWR*40(YO_*kn6J_I6QF4*768ADmy8MP1F!X zywgBV0n5DJmGJmZ`iG->u+Bg++xkX_04hw)6x7x>;@`3$$0kgxG= zp;D`1r_G5ejQ!}~=%0${yg%^pB%r9OEWJ^*NFUNK(p;QWROT^K#Io}tL9GS2U9D!p zY}E{=rr2ODJYzf`D3c58`~IfD3&wt;r=e2lF_>0dW;UTd@lU;|n~b5zxrySk&NOcB ziI%ShyXQLQ{Tz+w65xvSFkIM0yy$=0RY1o5r>?g2xISmTGUOm*Z#FKtB;);7n0P}94mjc7uJJi!v`p1dZJ4io{b2|*TB{MS`a3OVI zPDD;uiwXypfd!75n%dK|S1t^3-vc;t9m(S+B`2R5cQUA3`&AgnvTzSmV8dYPnvIqQ z3NL*U!H{dXdhmvDaNa1vL_X;qUMN`%$=R@%s4$N~^`W#u#&6*jM?X z8P*J}|D{@k)#E&bKG{R@->o~;Aliq7XZVkP4iDEH^u@T77EF+^pEU0bnoZ%yZB1)f znoKA6lNRLQ-uhQz^M`01z%guf>)u7{BxLtd(Pk7BB)(gqUF%AgT0w0fcZKY#YDm`$ zynjBao`wQ~U@IgF`O|Y?ei-T`&aWW#egE3iBOdLXfok#qXvXywsP7(#=~3$wtJ%(wsP{ZWtuHObgaAX zi8iJq^zlZ$SL5aX4_zPERB-=g*&l4R23xZl^!=DGH1b--943_C}A3zl)ak zxuxj#_xJhbf3(f3QF>0Q0@3&2`1t4a(xRT7okJZ|G7JZ4%H?$Pj);>@jE+A$I-ptP z`g*%)d}4yrY=);9=F`*Hv#9}i`Y5U zhl3j#$|)zzz)Oq>1)vV`;NMe$nuna|0iJ!QUEHbBMR z!CoT=YZe8IZi_PMNV<;(3SVmj#OP}=F{9aATgBQ9F`O&iv5ip1BXlD{Z125lUzz^? zzWjpH^(Ei9UKJ__(OX^-v7#=Vx$+g2+;*z^M!&+kErATAE6!YB2>{~Per9#X@76FNcJuOG2P;2)j~m+h>au2_>gG98 zaw8S6B@_-3P8$M2K6a+7JD4P#Ff4ZY&3(Zuym&yqxw&Qfbhj==%riz2e5r(45e&n* z>N#Dg+U@7KBSXU-%t+3`@RBR0FAN{?tN2gMV-{8xN1;^Pi$l4rtn3F5ty52%Au<=J zDt@19K?gSdFr}o0bo8u<7XNNLM#jT!ds5B;-iaT+C6m#Pi+C^x(+>KqEl5zl2Pki$U%RWsk)vpD*Rlk#o zfDFHDy<(Tjj-E-P!ioUv2u~C>FZ_vqcX6t!Y@i@+U=Y$z87Wn~fe01#+;uj2hmF!G zV{qJ1AiF}lH)GCGYTpx@uKn8D{D0C4ES@(s7f0-0UlkM-WHz3+vt^s*opnua zHM7#KG4b(aKr{{o{PGtkr>HXsZM zA_oV869>!B?`E>3xbFkNJ6hN1Ceax`2se{Z(ikI0>Rd%>>DOCxhxL=88*Y4ASXl+# zd^PJBnHsmQ!_STqf!NpT^VbORt6-0)meAk!VvYRrFoFIn<%*6jBg1Q_ZqZY{8aLfd z^P#lC@vX62m+?LNyV88wMSXiD?5JE$P4C!Zq3bW~eJ?`5`SY^_v-Yp-r$C6|Oe3R& z6lW3GA$`a43Sd+v2po#YaRdUJn1u36NC+-Ypg-`Sw-FV9F(4HAz;r{j2*aZ+j;AUL zZ{EPZG&KqHE2Q)Qir+0NnVrm+&y{7Qv0d2tZ#jxvT~!s@yQQb@rCK?aG%VK9-ydF& zD#Kj_mNd7$xd(5zhf+Ud_7rbI@c?I-uCSvvy1IBGXh{r&hymb1IH@8NkgficAGhj_ zI`nLYYEAA~H+b;3?`IQO`tBs}&dO2<#$+rSIuED41~K6Q7FeuN#FFruPOjS#o(@ zkk>Oj*tz9$I10Wg@YsVXJAc5hco(t^*m{czu4L_rsy8nmk0B40=W&$ZPryOKJD0s2 zTEUK=X7}m?0V-}jJ(&gKow}Er*^k0$<6oQWZqr1bhDyW}Zo(fweyne3Fyc$rw@Dh> zKRV3=CcY~e=d~`}94GM3&8JUp7roZpiShzEI+k0D9YzQH83h%it{@%|Q|Rnob1V>a z2#AQHE$r1!D1amqtbPJHfc&O{}eiNL5KGTqp@iOq7_VzCZx?V z_dcGm)qOzqUT>J2_aV>-r&vQD-NV%v*sf`L}9#Is<+6 zinbFL;6b;_m1fSb99IZ+0l>fyUOyc89k{0cq=C^!_|xQ`p&pG^POs;i8sWH6gDnXS z%wvt0b2UwM`=>R}R1hOoE7`o$Re5oeQE!Y-ng#WJ(YNaLWSwh!2s3Y*qGMk9BT>lW z@s}r$n=a=71zTG(E3O*YsH;(kBl_l0C|>06y(Mu?NRytdkv3=e0xT|KZVcbe4M;Ny znp?7QH2=M8v}A-VHDawkn5!C&c71uYO+b)P-UC_}1(CP5^(*>MQvPq~o1Gv>GfWV6 zX|vNIXed7IXAs}EuMvJ;)oNX7p@`xQp?S_G59|7MWnjuX;V@PLd`hGa5DH(v0-n2pU zG@Z-pW!F2viO0OkD>+(cmC?r z=D&kJZs;(Rz6$0%X-AM-?jT828`2LXJ^tarRzc^tTQP+Qgz<1elgiVw=~zq+8>&b4 zpYGx+{8ZJ;95RPENiyRqFoEZF!$qH+qn~$5c7`E>CY`oJ;IW+BnlY)-ku4IbCKM<5 zO)MtkKvzwmPdI$5awi)Jqzng=M62o3H5e1o*4!51Tx=#=}UlDkq??xSk8xsG*` zHTO_HpFC#I2K=*JKJjCJd!_L;{N$aawd?zEQ4Vh?Wvzr616%pi8Lg9CAzeP$XsxSo zK1-R(PYrd?rvT(B{hVC;7c#RQtFjY2@)SV!n|MAVEw`LjOQ!4jB><_P#^7yl&2Y6( z()IOOc%9-Y$ADF`QEt8x@>L&9HoQX|y(LmgO%)kZa}gU+JqR+<+>~2!RwEF4o7fV7 z@vdD#ZFP?L2R2<^-n##Wd;H0N;X5Lyj^)P7OH2{s0OEHY{<)djdWYAim7lgK4|fT> z1E>fD0F9P9sflla19xX%0GaWswi7!2;k(|PABUn#JJZYzP7SgzJdr`fEzvoH00qJ?Gg#e!-y~y3@?ymhQr~deraiGh43^>AkT+~XA4%J zdh|pHTw$&m-$GW1Kmm?UjeCU+14&RodaHYj z-T`()+V=tQV&doqKmSBD?-?>PqhtRAl z%TFGAplT3+0RH`mx(m=CCTrc#n&JxzO3jDS$d;+K`-S&mN-jJ_;EMsw(Z?BT>4&f|0jC|UsN)>hXlz{PosegGtho^@-Mzzu zc6IVv9s*xXx+|@aLcr$34|jzALmHmYzP=9{e&@__PoM6_r*k{dQFcegI$hQ;UlrCy zp*Qvv?FNHnNo;Ja^UG{fkKed$D%IN059pS)1S9P&WNg{64Cd#xhW3VWaqi!W<4Od? zqGP5;K1D>kMB`5Am+WW0ku{R?A!qQ=wPOw<7fhq=OQq#CbL*o6-RC=^#_9a)l&Qv4=EnvAcjpG z>iq%T2ecrV65q8{O|asjXl~Bs^E*_|S3EG88koNJEf;4l)^Kg;M&W2-Kd{|#vNszt zwnY!-Cr6zHYAfW$a_1>1+c~5v)AKWi^z_I8<^;&!(vpa5>8~#JvrasssnCs~JC5te zR_CXCiuMX$vsyaBEo(2jFSvT0y{M?zS*XGd=@1{9uG+mmK|G>t4^__o+kJCgMpbf` z8uoN`eHG;M z8xP?3q6w+IX?%j)4UW7hY*O;4OV5ZG&jp`@$`QDst843STZVe)rwg$>ZfyR)e(e&z z{8H54-}?d}XTY}`>8f-}H0M|<0l1=|@#*z#PEMvS5OFz{)(ew?rR1y!#Y zENRrF`)*0{VTbfr+q#CB^aR|um!Tw%qvpO2f{D@MJ`#6FysY<6@1#F!@{~- zaQiL*JSQgzuv;KN?GxcWH(HfJ+)PZ4FYace?YzH#^FCqATw0=t>~hnkS>C?oKSh}~ zOP;$W-G;e?DW08cvu?_nu2p_R&7N;joEa~ZBay;x-+p}mIkO>E!+Q>QXf?ZT4-z?S zTDZ-66NM0|8ff6Or2$!t#b{|zqCAbD&krL6q)dZ4;VG~=X`(2ybbfZEUeqJtn*xNa z;I8hmxw!#EssPLNS)uxz??x&QFW*1GBr1Jy$b53H;qttqd&aJ`VD~zN&iN5+pug8> zw@{t-&7O-8bLI3c2z)s?{|>};_}RJ5EgbUj@r;a*|CYWvM?6g!7I2Grz>oaBq9_{F zu~ctLPzVeMkW2$zoXnoB1`?6(X=02D&8rgE*Vo-HcHW|tE%L@(`*!o%J30c-&(9Uu zZ9o)y7dreO)8y67%$l$x&BKGbj--*23#K3nP~u?fwXplzQ4akChrgXIu#vSo;`M1a zkIXqk&hIm@C_M+F*d_K|3PG>q*A|5ItFZL3t(`v$4g3;>TnE2-4^9r2Cbg@|y}V-1 z2l+*PU#AeKzP^1|!t_Vs|Hp4l{LfzZXuH8>8xpta*mzR{yyb!=E2;3lRKhUee*q}+ B`D6e9 literal 8769 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 INbBo=0K-ICxBvhE diff --git a/plugins/kicker/kicker.cpp b/plugins/kicker/kicker.cpp index 4b9078aa0..feecc34e5 100644 --- a/plugins/kicker/kicker.cpp +++ b/plugins/kicker/kicker.cpp @@ -66,7 +66,9 @@ kickerInstrument::kickerInstrument( InstrumentTrack * _instrument_track ) : m_envModel( 0.163f, 0.01f, 1.0f, 0.001f, this, tr( "Env" ) ), m_noiseModel( 0.0f, 0.0f, 1.0f, 0.01f, this, tr( "Noise" ) ), m_clickModel( 0.4f, 0.0f, 1.0f, 0.05f, this, tr( "Click" ) ), - m_slopeModel( 0.06f, 0.001f, 1.0f, 0.001f, this, tr( "Slope" ) ) + m_slopeModel( 0.06f, 0.001f, 1.0f, 0.001f, this, tr( "Slope" ) ), + m_startNoteModel( false, this, tr( "Start from note" ) ), + m_endNoteModel( false, this, tr( "End to note" ) ) { } @@ -92,6 +94,8 @@ void kickerInstrument::saveSettings( QDomDocument & _doc, m_noiseModel.saveSettings( _doc, _this, "noise" ); m_clickModel.saveSettings( _doc, _this, "click" ); m_slopeModel.saveSettings( _doc, _this, "slope" ); + m_startNoteModel.saveSettings( _doc, _this, "startnote" ); + m_endNoteModel.saveSettings( _doc, _this, "endnote" ); } @@ -108,6 +112,8 @@ void kickerInstrument::loadSettings( const QDomElement & _this ) m_noiseModel.loadSettings( _this, "noise" ); m_clickModel.loadSettings( _this, "click" ); m_slopeModel.loadSettings( _this, "slope" ); + m_startNoteModel.loadSettings( _this, "startnote" ); + m_endNoteModel.loadSettings( _this, "endnote" ); } @@ -137,8 +143,8 @@ void kickerInstrument::playNote( NotePlayHandle * _n, _n->m_pluginData = new SweepOsc( DistFX( m_distModel.value(), m_gainModel.value() ), - m_startFreqModel.value(), - m_endFreqModel.value(), + m_startNoteModel.value() ? _n->frequency() : m_startFreqModel.value(), + m_endNoteModel.value() ? _n->frequency() : m_endFreqModel.value(), m_noiseModel.value() * m_noiseModel.value(), m_clickModel.value() * 0.25f, m_slopeModel.value(), @@ -257,6 +263,11 @@ kickerInstrumentView::kickerInstrumentView( Instrument * _instrument, m_clickKnob->setHintText( tr( "Click:" ) + " ", "" ); m_clickKnob->move( 200, 155 ); + m_startNoteToggle = new ledCheckBox( "", this ); + m_startNoteToggle->move( 24, 79 ); + + m_endNoteToggle = new ledCheckBox( "", this ); + m_endNoteToggle->move( 69, 79 ); setAutoFillBackground( true ); QPalette pal; @@ -287,6 +298,8 @@ void kickerInstrumentView::modelChanged() m_noiseKnob->setModel( &k->m_noiseModel ); m_clickKnob->setModel( &k->m_clickModel ); m_slopeKnob->setModel( &k->m_slopeModel ); + m_startNoteToggle->setModel( &k->m_startNoteModel ); + m_endNoteToggle->setModel( &k->m_endNoteModel ); } diff --git a/plugins/kicker/kicker.h b/plugins/kicker/kicker.h index db17e642c..ca126c7e6 100644 --- a/plugins/kicker/kicker.h +++ b/plugins/kicker/kicker.h @@ -30,6 +30,7 @@ #include "Instrument.h" #include "InstrumentView.h" #include "knob.h" +#include "led_checkbox.h" class kickerInstrumentView; @@ -46,12 +47,16 @@ public: sampleFrame * _working_buffer ); virtual void deleteNotePluginData( NotePlayHandle * _n ); - virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); virtual void loadSettings( const QDomElement & _this ); virtual QString nodeName() const; + virtual Flags flags() const + { + return IsNotBendable; + } + virtual f_cnt_t desiredReleaseFrames() const { return( 512 ); @@ -71,6 +76,9 @@ private: FloatModel m_clickModel; FloatModel m_slopeModel; + BoolModel m_startNoteModel; + BoolModel m_endNoteModel; + friend class kickerInstrumentView; } ; @@ -97,6 +105,9 @@ private: knob * m_clickKnob; knob * m_slopeKnob; + ledCheckBox * m_startNoteToggle; + ledCheckBox * m_endNoteToggle; + } ; From b4421700fac3c7248864ec6675a7c93416c14eb0 Mon Sep 17 00:00:00 2001 From: Hannu Haahti Date: Sat, 29 Mar 2014 01:21:44 +0200 Subject: [PATCH 8/9] kicker: some cleanup --- plugins/kicker/KickerOsc.h | 2 -- plugins/kicker/kicker.cpp | 23 ++++------------------- plugins/kicker/kicker.h | 3 ++- 3 files changed, 6 insertions(+), 22 deletions(-) diff --git a/plugins/kicker/KickerOsc.h b/plugins/kicker/KickerOsc.h index fe370c6b5..edcdcf5e5 100644 --- a/plugins/kicker/KickerOsc.h +++ b/plugins/kicker/KickerOsc.h @@ -59,7 +59,6 @@ public: for( fpp_t frame = 0; frame < frames; ++frame ) { const double gain = ( 1 - fastPow( ( m_counter < m_length ) ? m_counter / m_length : 1, m_env ) ); - //~ qDebug( "%f", gain ); const sample_t s = ( Oscillator::sinSample( m_phase ) * ( 1 - m_noise ) ) + ( Oscillator::noiseSample( 0 ) * gain * gain * m_noise ); buf[frame][0] = s * gain; buf[frame][1] = s * gain; @@ -67,7 +66,6 @@ public: m_phase += m_freq / sampleRate; const double change = ( m_counter < m_length ) ? ( ( m_startFreq - m_endFreq ) * ( 1 - fastPow( m_counter / m_length, m_slope ) ) ) : 0; - //~ qDebug( "%f (%f) [%lu, %f]", change, powf( m_counter / m_length, m_slope ), m_counter, m_length ); m_freq = m_endFreq + change; ++m_counter; } diff --git a/plugins/kicker/kicker.cpp b/plugins/kicker/kicker.cpp index feecc34e5..655d41dd1 100644 --- a/plugins/kicker/kicker.cpp +++ b/plugins/kicker/kicker.cpp @@ -1,7 +1,8 @@ /* - * kicker.cpp - bassdrum-synthesizer + * kicker.cpp - drum synthesizer * * Copyright (c) 2006-2009 Tobias Doerffel + * Copyright (c) 2014 Hannu Haahti * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -44,7 +45,7 @@ Plugin::Descriptor PLUGIN_EXPORT kicker_plugin_descriptor = STRINGIFY( PLUGIN_NAME ), "Kicker", QT_TRANSLATE_NOOP( "pluginBrowser", - "Versatile kick- & bassdrum-synthesizer" ), + "Versatile drum synthesizer" ), "Tobias Doerffel ", 0x0100, Plugin::Instrument, @@ -126,7 +127,6 @@ QString kickerInstrument::nodeName() const -//typedef DspEffectLibrary::foldbackDistortion<> DistFX; typedef DspEffectLibrary::Distortion DistFX; typedef KickerOsc > SweepOsc; @@ -156,25 +156,10 @@ void kickerInstrument::playNote( NotePlayHandle * _n, _n->noteOff(); } - //const float freq = instrumentTrack()->frequency( _n ) / 2; - //~ const float fdiff = m_endFreqModel.value() - m_startFreqModel.value(); -/* const fpp_t frames = _n->isReleased() ? - tMax( tMin( desiredReleaseFrames() - - _n->releaseFramesDone(), - engine::mixer()->framesPerAudioBuffer() ), 0 ) - : - engine::mixer()->framesPerAudioBuffer();*/ const fpp_t frames = _n->framesLeftForCurrentPeriod(); - //~ const float slopePoint = powf( fdiff / decfr, 1 + m_slopeModel.value() * 6 ); - - //~ const float f1 = m_startFreqModel.value() + tfp * ((fdiff/decfr) * slopePoint); - //~ const float f2 = m_startFreqModel.value() + (frames+tfp-1) * ((fdiff/decfr) * slopePoint); - - SweepOsc * so = static_cast( _n->m_pluginData ); - so->update( _working_buffer, frames, - engine::mixer()->processingSampleRate() ); + so->update( _working_buffer, frames, engine::mixer()->processingSampleRate() ); if( _n->isReleased() ) { diff --git a/plugins/kicker/kicker.h b/plugins/kicker/kicker.h index ca126c7e6..8253becf8 100644 --- a/plugins/kicker/kicker.h +++ b/plugins/kicker/kicker.h @@ -1,5 +1,6 @@ /* - * kicker.h - bassdrum-synthesizer + * kicker.h - drum synthesizer + * Copyright (c) 2014 Hannu Haahti * * Copyright (c) 2006-2008 Tobias Doerffel * From 09630f1d56bad555b6467403e37f716bd0d1b4a3 Mon Sep 17 00:00:00 2001 From: Hannu Haahti Date: Sat, 29 Mar 2014 21:18:01 +0200 Subject: [PATCH 9/9] kicker: reordered knobs --- plugins/kicker/artwork.png | Bin 9016 -> 9021 bytes plugins/kicker/kicker.cpp | 18 +++++++++--------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/plugins/kicker/artwork.png b/plugins/kicker/artwork.png index 463ea0efe6deff2d9784f9a94ec2a1d3d5305318..59c0e19416b1dbc84eef7b6cd9a981c0350919be 100644 GIT binary patch literal 9021 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 literal 9016 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 B`D6e9 diff --git a/plugins/kicker/kicker.cpp b/plugins/kicker/kicker.cpp index 655d41dd1..5bbd35a10 100644 --- a/plugins/kicker/kicker.cpp +++ b/plugins/kicker/kicker.cpp @@ -236,17 +236,17 @@ kickerInstrumentView::kickerInstrumentView( Instrument * _instrument, m_envKnob->setHintText( tr( "Env:" ) + " ", "" ); m_envKnob->move( 105, 155 ); - m_noiseKnob = new kickerKnob( this ); - m_noiseKnob->setHintText( tr( "Noise:" ) + " ", "" ); - m_noiseKnob->move( 200, 45 ); - - m_distKnob = new kickerKnob( this ); - m_distKnob->setHintText( tr( "Distortion:" ) + " ", "" ); - m_distKnob->move( 200, 100 ); - m_clickKnob = new kickerKnob( this ); m_clickKnob->setHintText( tr( "Click:" ) + " ", "" ); - m_clickKnob->move( 200, 155 ); + m_clickKnob->move( 200, 45 ); + + m_noiseKnob = new kickerKnob( this ); + m_noiseKnob->setHintText( tr( "Noise:" ) + " ", "" ); + m_noiseKnob->move( 200, 100 ); + + m_distKnob = new kickerKnob( this ); + m_distKnob->setHintText( tr( "Dist:" ) + " ", "" ); + m_distKnob->move( 200, 155 ); m_startNoteToggle = new ledCheckBox( "", this ); m_startNoteToggle->move( 24, 79 );