From 5d900c7a9959e816512ea88310806c8c23460f9b Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Wed, 20 Dec 2006 00:07:20 +0000 Subject: [PATCH] new kicker-plugin and extended effect-lib git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@442 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 24 ++ Makefile.am | 3 +- configure.in | 12 +- include/effect_lib.h | 135 +++++++++- include/sweep_oscillator.h | 80 ++++++ plugins/Makefile.am | 1 + plugins/kicker/Makefile.am | 33 +++ plugins/kicker/artwork.png | Bin 0 -> 10148 bytes plugins/kicker/kicker.cpp | 253 ++++++++++++++++++ plugins/kicker/kicker.h | 67 +++++ plugins/kicker/logo.png | Bin 0 -> 2433 bytes .../plucked_string_synth.cpp | 8 +- .../plucked_string_synth.h | 2 +- 13 files changed, 606 insertions(+), 12 deletions(-) create mode 100644 include/sweep_oscillator.h create mode 100644 plugins/kicker/Makefile.am create mode 100644 plugins/kicker/artwork.png create mode 100644 plugins/kicker/kicker.cpp create mode 100644 plugins/kicker/kicker.h create mode 100644 plugins/kicker/logo.png diff --git a/ChangeLog b/ChangeLog index 486de7229..6bdd9366e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,27 @@ +2006-12-20 Tobias Doerffel + + * plugins/kicker/kicker.h: + * plugins/kicker/kicker.cpp: + * plugins/kicker/logo.png: + * plugins/kicker/artwork.png: + * plugins/kicker/Makefile.am: + * plugins/Makefile.am: + * configure.in: + added Kicker-plugin, a versatile kick- & bassdrum-synthesizer + + * include/sweep_oscillator.h: + added simple sweep-oscillator-class + + * include/effect_lib.h: + - added foldbackDistortion-class + - added process()-methods to monoBase- and stereoBase-class + - added bypass-classes for mono and stereo + - added effect-chaining-class + + * configure.in: + fail if -fomit-frame-pointer is found in compiler-flags and + VST-support is not disabled + 2006-12-19 Javier Serrano Polo * include/tool.h: diff --git a/Makefile.am b/Makefile.am index 8a3494938..4317c60b4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -350,7 +350,8 @@ lmms_SOURCES = \ $(srcdir)/include/rack_view.h \ $(srcdir)/include/effect_select_dialog.h \ $(srcdir)/include/dummy_effect.h \ - $(srcdir)/include/ladspa-1.1.h \ + $(srcdir)/include/ladspa-1.1.h \ + $(srcdir)/include/sweep_oscillator.h \ $(srcdir)/include/meter_dialog.h \ $(srcdir)/include/qxembed.h \ $(srcdir)/include/xqmap.h diff --git a/configure.in b/configure.in index a37f87b66..cec09fe78 100644 --- a/configure.in +++ b/configure.in @@ -2,8 +2,8 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.50) -AC_INIT(lmms, 0.2.1-svn20061219, lmms-devel/at/lists/dot/sf/dot/net) -AM_INIT_AUTOMAKE(lmms, 0.2.1-svn20061219) +AC_INIT(lmms, 0.2.1-svn20061220, lmms-devel/at/lists/dot/sf/dot/net) +AM_INIT_AUTOMAKE(lmms, 0.2.1-svn20061220) AM_CONFIG_HEADER(config.h) @@ -32,8 +32,6 @@ if test "x$build_win32" = "xtrue" ; then AC_MSG_RESULT([Win32, will enable support for it]) AC_DEFINE(BUILD_WIN32) AC_DEFINE(WIN32) - #WIN32_DEFINES="-D_WIN32_WINNT=Windows2000" - #AC_SUBST(WIN32_DEFINES) build_linux="false" build_win32="true" else @@ -211,10 +209,13 @@ AM_CONDITIONAL(HAVE_LIBJACK, test ! -z "$HAVE_JACK_JACK_H") # check for proper WINE-installation and existing Steinberg headers AC_ARG_WITH(vst, AS_HELP_STRING([--without-vst], - [enable support for builtin VST-plugin-hosting]), , [ with_vst=yes ]) + [disable support for builtin VST-plugin-hosting]), , [ with_vst=yes ]) AH_TEMPLATE(HAVE_VST_AEFFECTX_H, [Define to 1 if you have the header file.]) if test "x$with_vst" = "xyes" ; then + if echo $CFLAGS $CXXFLAGS | grep "fomit-frame-pointer" > /dev/null ; then + AC_MSG_ERROR([*** passing -fomit-frame-pointer as compiler-flag will break LMMS' VST-support so either disable VST-support using --without-vst or remove it from compiler-flags]) + fi ORIG_CFLAGS=$CFLAGS ORIG_CPPFLAGS=$CPPFLAGS CFLAGS="$CFLAGS -I./include" @@ -557,6 +558,7 @@ AC_CONFIG_FILES([Makefile plugins/bass_booster/Makefile plugins/bit_invader/Makefile plugins/flp_import/Makefile + plugins/kicker/Makefile plugins/ladspa_base/Makefile plugins/ladspa_effect/Makefile plugins/ladspa_effect/caps/Makefile diff --git a/include/effect_lib.h b/include/effect_lib.h index a2895b5aa..56d0bdce2 100644 --- a/include/effect_lib.h +++ b/include/effect_lib.h @@ -29,31 +29,58 @@ #include "templates.h" #include "types.h" + namespace effectLib { + + template class monoBypass; + template class stereoBypass; + + template class monoBase { public: typedef SAMPLE sampleType; + typedef monoBypass bypassType; + virtual ~monoBase() { } virtual SAMPLE nextSample( const SAMPLE _in ) const = 0; + virtual void process( SAMPLE * * _buf, + const f_cnt_t _frames ) const + { + for( f_cnt_t f = 0; f < _frames; ++f ) + { + _buf[f][0] = nextSample( _buf[f][0] ); + } + } } ; template class stereoBase { public: + typedef SAMPLE sampleType; + typedef stereoBypass bypassType; + virtual ~stereoBase() { } - typedef SAMPLE sampleType; virtual void nextSample( SAMPLE & _in_left, SAMPLE & _in_right ) const = 0; + virtual void process( SAMPLE * * _buf, + const f_cnt_t _frames ) const + { + for( f_cnt_t f = 0; f < _frames; ++f ) + { + nextSample( _buf[f][0], _buf[f][1] ); + } + } } ; + template class monoToStereoAdaptor : public stereoBase { @@ -119,6 +146,69 @@ namespace effectLib } ; + template + class monoBypass : public monoBase + { + public: + virtual SAMPLE nextSample( const SAMPLE _in ) const + { + return( _in ); + } + } ; + + + template + class stereoBypass : public stereoBase + { + public: + virtual void nextSample( SAMPLE &, SAMPLE & ) const + { + } + } ; + + + /* convenient class to build up static FX-chains, for example + + using namespace effectLib; + chain >, + chain, + monoToStereoAdaptor > > > + fxchain( bassBoost<>( 60.0, 1.0, 4.0f ), + chain, + monoToStereoAdaptor > >( + stereoEnhancer<>( 1.0 ), + foldbackDistortion<>( 1.0f, 1.0f ) ) ); + + // now you can do simple calls such as which will process a bass-boost-, + // stereo-enhancer- and foldback-distortion-effect on your buffer + fx_chain.process( (sample_t * *) buf, frames ); +*/ + + template + class chain : public FX0::bypassType + { + public: + typedef typename FX0::sampleType sampleType; + chain( const FX0 & _fx0, const FX1 & _fx1 = FX1() ) : + m_FX0( _fx0 ), + m_FX1( _fx1 ) + { + } + + virtual void process( sampleType * * _buf, + const f_cnt_t _frames ) const + { + m_FX0.process( _buf, _frames ); + m_FX1.process( _buf, _frames ); + } + + private: + FX0 m_FX0; + FX1 m_FX1; + } ; + + + template inline SAMPLE saturate( const SAMPLE _x ) { @@ -184,6 +274,49 @@ namespace effectLib } ; + template + class foldbackDistortion : public monoBase + { + public: + foldbackDistortion( const float _threshold, + const float _gain ) : + m_threshold( _threshold ), + m_gain( _gain ) + { + } + + virtual SAMPLE nextSample( const SAMPLE _in ) const + { + if( _in >= m_threshold || _in < -m_threshold ) + { + return( ( fabsf( fabsf( + fmodf( _in - m_threshold, + m_threshold*4 ) ) - + m_threshold*2 ) - + m_threshold ) * + m_gain ); + } + return( _in * m_gain ); + } + + void setThreshold( const float _threshold ) + { + m_threshold = _threshold; + } + + void setGain( const float _gain ) + { + m_gain = _gain; + } + + + private: + float m_threshold; + float m_gain; + + } ; + + template class stereoEnhancer : public stereoBase { diff --git a/include/sweep_oscillator.h b/include/sweep_oscillator.h new file mode 100644 index 000000000..db128bbce --- /dev/null +++ b/include/sweep_oscillator.h @@ -0,0 +1,80 @@ +/* + * sweep_oscillator.h - sweep-oscillator + * + * Copyright (c) 2006 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 + * 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 _SWEEP_OSCILLATOR_H +#define _SWEEP_OSCILLATOR_H + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "oscillator.h" +#include "effect_lib.h" + + +template > +class sweepOscillator +{ +public: + sweepOscillator( const FX & _fx = FX() ) : + m_phase( 0.0f ), + m_FX( _fx ) + { + } + + virtual ~sweepOscillator() + { + } + + void update( sampleFrame * _ab, const fpab_t _frames, + const float _freq1, const float _freq2, + const float _sample_rate ) + { + const float df = _freq2 - _freq1; + for( fpab_t frame = 0; frame < _frames; ++frame ) + { + sample_t s = oscillator::sinSample( m_phase ); + for( ch_cnt_t ch = 0; ch < DEFAULT_CHANNELS; ++ch ) + { + _ab[frame][ch] = s; + } + m_FX.nextSample( _ab[frame][0], _ab[frame][1] ); + m_phase += ( _freq1 + ( frame * df / _frames ) ) / + _sample_rate; + } + } + + +private: + float m_phase; + FX m_FX; + + inline sample_t getSample( const float _sample ); + inline void FASTCALL recalcPhase( void ); + +} ; + + +#endif diff --git a/plugins/Makefile.am b/plugins/Makefile.am index e6a050dc9..9d45b8285 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -15,6 +15,7 @@ SUBDIRS = \ bass_booster \ bit_invader \ flp_import \ + kicker \ $(LADSPA_DIRS) \ live_tool \ midi_import \ diff --git a/plugins/kicker/Makefile.am b/plugins/kicker/Makefile.am new file mode 100644 index 000000000..99d0d53c7 --- /dev/null +++ b/plugins/kicker/Makefile.am @@ -0,0 +1,33 @@ +AUTOMAKE_OPTIONS = foreign 1.4 + + +INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/src/lib -I. + + +AM_CXXFLAGS := $(AM_CXXFLAGS) $(QT_CXXFLAGS) -DPLUGIN_NAME="kicker" + + +%.moc: ./%.h + $(MOC) -o $@ $< + + +MOC_FILES = ./kicker.moc + +BUILT_SOURCES = $(MOC_FILES) ./embedded_resources.h +EMBEDDED_RESOURCES = $(wildcard *png) + +./embedded_resources.h: $(EMBEDDED_RESOURCES) + $(BIN2RES) $(EMBEDDED_RESOURCES) > $@ + +EXTRA_DIST = $(EMBEDDED_RESOURCES) + + +CLEANFILES = $(MOC_FILES) ./embedded_resources.h + + + +pkglib_LTLIBRARIES= libkicker.la + +libkicker_la_SOURCES = kicker.cpp kicker.h + +$(libkicker_la_SOURCES): ./embedded_resources.h diff --git a/plugins/kicker/artwork.png b/plugins/kicker/artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..17087a79e635f1d9eb21373672fac874f8380314 GIT binary patch literal 10148 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 + * + * 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. + * + */ + + +#include "qt3support.h" + +#ifdef QT4 + +#include +#include + +#else + +#include +#include + +#endif + + +#include "kicker.h" +#include "instrument_track.h" +#include "note_play_handle.h" +#include "sweep_oscillator.h" +#include "buffer_allocator.h" +#include "knob.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embed.cpp" + + +extern "C" +{ + +plugin::descriptor kicker_plugin_descriptor = +{ + STRINGIFY_PLUGIN_NAME( PLUGIN_NAME ), + "Kicker", + QT_TRANSLATE_NOOP( "pluginBrowser", + "versatile kick- & bassdrum-synthesizer" ), + "Tobias Doerffel ", + 0x0100, + plugin::Instrument, + new QPixmap( PLUGIN_NAME::getIconPixmap( "logo" ) ), + NULL +} ; + +} + + +kickerInstrument::kickerInstrument( instrumentTrack * _instrument_track ) : + instrument( _instrument_track, &kicker_plugin_descriptor ) +{ + QVBoxLayout * vl = new QVBoxLayout( this ); + QHBoxLayout * hl = new QHBoxLayout; + m_startFreqKnob = new knob( knobDark_28, this, tr( "Start frequency" ), + eng(), _instrument_track ); + m_startFreqKnob->setRange( 40.0f, 1000.0f, 1.0f ); + m_startFreqKnob->setInitValue( 150.0f ); + m_startFreqKnob->setLabel( tr( "START" ) ); + m_startFreqKnob->setHintText( tr( "Start frequency:" ) + " ", "Hz" ); + + m_endFreqKnob = new knob( knobDark_28, this, tr( "End frequency" ), + eng(), _instrument_track ); + m_endFreqKnob->setRange( 40.0f, 1000.0f, 1.0f ); + m_endFreqKnob->setInitValue( 40.0f ); + m_endFreqKnob->setLabel( tr( "END" ) ); + m_endFreqKnob->setHintText( tr( "End frequency:" ) + " ", "Hz" ); + + m_decayKnob = new knob( knobDark_28, this, tr( "Decay" ), + eng(), _instrument_track ); + m_decayKnob->setRange( 5.0f, 1000.0f, 1.0f ); + m_decayKnob->setInitValue( 120.0f ); + m_decayKnob->setLabel( tr( "DECAY" ) ); + m_decayKnob->setHintText( tr( "Decay:" ) + " ", "ms" ); + + m_distKnob = new knob( knobDark_28, this, tr( "Distortion" ), + eng(), _instrument_track ); + m_distKnob->setRange( 0.00f, 0.99f, 0.01f ); + m_distKnob->setInitValue( 0.1f ); + m_distKnob->setLabel( tr( "DIST" ) ); + m_distKnob->setHintText( tr( "Distortion:" ) + " ", "" ); + + m_gainKnob = new knob( knobDark_28, this, tr( "Gain" ), + eng(), _instrument_track ); + m_gainKnob->setRange( 0.1f, 5.0f, 0.05f ); + m_gainKnob->setInitValue( 1.0f ); + m_gainKnob->setLabel( tr( "GAIN" ) ); + m_gainKnob->setHintText( tr( "Gain:" ) + " ", "" ); + + hl->addWidget( m_startFreqKnob ); + hl->addWidget( m_endFreqKnob ); + hl->addWidget( m_decayKnob ); + hl->addWidget( m_distKnob ); + hl->addWidget( m_gainKnob ); + + vl->addLayout( hl ); +#ifdef QT4 + setAutoFillBackground( TRUE ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( + "artwork" ) ); + setPalette( pal ); +#else + setErasePixmap( PLUGIN_NAME::getIconPixmap( "artwork" ) ); +#endif +} + + + + +kickerInstrument::~kickerInstrument() +{ +} + + + + +void kickerInstrument::saveSettings( QDomDocument & _doc, + QDomElement & _this ) +{ + m_startFreqKnob->saveSettings( _doc, _this, "startfreq" ); + m_endFreqKnob->saveSettings( _doc, _this, "endfreq" ); + m_decayKnob->saveSettings( _doc, _this, "decay" ); + m_distKnob->saveSettings( _doc, _this, "dist" ); + m_gainKnob->saveSettings( _doc, _this, "gain" ); +} + + + + +void kickerInstrument::loadSettings( const QDomElement & _this ) +{ + m_startFreqKnob->loadSettings( _this, "startfreq" ); + m_endFreqKnob->loadSettings( _this, "endfreq" ); + m_decayKnob->loadSettings( _this, "decay" ); + m_distKnob->loadSettings( _this, "dist" ); + m_gainKnob->loadSettings( _this, "gain" ); +} + + + + +QString kickerInstrument::nodeName( void ) const +{ + return( kicker_plugin_descriptor.name ); +} + + + +typedef effectLib::foldbackDistortion<> distFX; +typedef sweepOscillator > sweepOsc; + + +void kickerInstrument::playNote( notePlayHandle * _n, bool ) +{ + const float decfr = m_decayKnob->value() * + eng()->getMixer()->sampleRate() / 1000.0f; + const f_cnt_t tfp = _n->totalFramesPlayed(); + + if ( tfp == 0 ) + { + _n->m_pluginData = new sweepOsc( + distFX( 1.0f-m_distKnob->value(), + m_gainKnob->value() ) ); + } + else if( tfp > decfr && !_n->released() ) + { + _n->noteOff(); + } + + //const float freq = getInstrumentTrack()->frequency( _n ) / 2; + const float fdiff = m_endFreqKnob->value() - m_startFreqKnob->value(); + const fpab_t frames = _n->released() ? + tMin( desiredReleaseFrames()-_n->releaseFramesDone(), + eng()->getMixer()->framesPerAudioBuffer() ) + : + eng()->getMixer()->framesPerAudioBuffer(); + const float f1 = m_startFreqKnob->value() + tfp * fdiff / decfr; + const float f2 = m_startFreqKnob->value() + (frames+tfp-1)*fdiff/decfr; + + sampleFrame * buf = bufferAllocator::alloc( frames ); + + + sweepOsc * so = static_cast( _n->m_pluginData ); + so->update( buf, frames, f1, f2, eng()->getMixer()->sampleRate() ); + + if( _n->released() ) + { + for( fpab_t f = 0; f < frames; ++f ) + { + const float fac = 1.0f - + (float)( _n->releaseFramesDone()+f ) / + desiredReleaseFrames(); + for( ch_cnt_t ch = 0; ch < DEFAULT_CHANNELS; ++ch ) + { + buf[f][ch] *= fac; + } + } + } + + getInstrumentTrack()->processAudioBuffer( buf, frames, _n ); + + bufferAllocator::free( buf ); +} + + + +void kickerInstrument::deleteNotePluginData( notePlayHandle * _n ) +{ + delete static_cast( _n->m_pluginData ); +} + + + + + + + +extern "C" +{ + +// neccessary for getting instance out of shared lib +plugin * lmms_plugin_main( void * _data ) +{ + return( new kickerInstrument( + static_cast( _data ) ) ); +} + + +} + + diff --git a/plugins/kicker/kicker.h b/plugins/kicker/kicker.h new file mode 100644 index 000000000..2d9782f2d --- /dev/null +++ b/plugins/kicker/kicker.h @@ -0,0 +1,67 @@ +/* + * kicker.h - bassdrum-synthesizer + * + * Copyright (c) 2006 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 + * 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_H +#define _KICKER_H + +#include "instrument.h" + + +class notePlayHandle; +class knob; + + +class kickerInstrument : public instrument +{ +public: + kickerInstrument( instrumentTrack * _instrument_track ); + virtual ~kickerInstrument(); + + virtual void FASTCALL playNote( notePlayHandle * _n, + bool _try_parallelizing ); + virtual void FASTCALL deleteNotePluginData( notePlayHandle * _n ); + + + virtual void FASTCALL saveSettings( QDomDocument & _doc, + QDomElement & _parent ); + virtual void FASTCALL loadSettings( const QDomElement & _this ); + + virtual QString nodeName( void ) const; + + virtual f_cnt_t desiredReleaseFrames( void ) const + { + return( 512 ); + } + +private: + knob * m_startFreqKnob; + knob * m_endFreqKnob; + knob * m_decayKnob; + knob * m_distKnob; + knob * m_gainKnob; +} ; + + +#endif diff --git a/plugins/kicker/logo.png b/plugins/kicker/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8cb2718f4c118841db773e023383fd181be0a247 GIT binary patch literal 2433 zcmV-{34Zp8P)h^}mj{m1oZk4WNlQy-#E20n)pwe&*~6(_8%g{77E;>k2$hEj9SkDf(Te!N?}V41 zfQ{jP%*z5=F;tDqGjb#>)K;5SGho7n_}xe9#u{PorcrWu*Xy!s)hbCzNs*kK9C5qd zaz6C*^hj+@jZ}ZIR=mGRl(r}1#W&R=ZVho0eSHokt6)k$u5-B?#5cnt-U)`3!r>v4 ze;XFok2k_~+pd=9pLtl4l9Gh8RxN-mUc6WaLswUq_SF0CnY6OSXju7H{KZS zualF%{asX4L`O%*xkK&qF?a4<4jec@OZGz28n&Tyg)v5Z$Y~8xG5BYz`qmMp{&1Q=l zbGzLvS+WGj?0mWn3(5*u70RliU!h^S-hy?$jo78J*zU4n`CbevUIU9FR34%(L`4A{ zIPVVJ13BZav3#EyKgBd7Jn+B+%$qllmX;Q3Yir5P&1LrN*@K$l2$K+Sw>FEtz6Z)3l#=Jg6ImRD^ysJ5N8vGun=jF5d0!YccU3`!pd`@aR3GGf_b*v zY??}5L~Cm+bLPy64nWP#LvjM~@$uYz^UZw}P)c#b4L1<<+R;jOBjInzhtEb?v(Ciy zm_+;$OxM|n9u%Y)o_lr>^8wJVgqdBFCJ+o+$jr>Vs03``!i8vBbe)lvl|@EI25GrB zafTR_O+&LO2n*eR>Z1F-ZhCk15;_th;*H=I>I-4fa(I0x?=)eY==M0fvk(!bxm26v2#~3@$vEf3Ro-_g2CW$;A^ z;W&367mKng0^53U!tWNqicg{Oq7;aPq^qa14Zq(%u#l#)Wy=;09Xf>D?M6hR$lL99 zVq;_bo$GKoXm4*nYmTay(6JD;4QA!Du=-LIK1Q%x8pb;G?2?ia7A#oMuh9DS>v1}r zl$DiXwOWadjU_KHj|medux8B~;^N}Y>zzCv4+#kgDCHusqn9sXO#=ikN$Iu|-YCr< zEh|>6=-0N3ii%|X`0sSfjI2*Q`Fcpe9F z$8(Ifmwuin1qB7-a=E0vyQ^K6s-};wlNRrZKE#|( zr*w674eB=M&YdgMrX)(;$7xcLZ8SV~k?Fz(;U|#cOw*5eH;$6Js`tb+&2Nb{H#ZMT zzN4dEUVM72_}@*D^3i(D3m4K7xm1`8afJpOJP*a2hqq3Xo!eiP^71k{c<|tW#5+6N zq@j9~G=4l)yvyPupK5Gf3aS6qFEqb~8Mh>8`MC>hxBDhqwfzB&th~9TXH8>N)>tIc zg^Dy_)_;XwT1;=znLy3H-onp9vhEdd{?B}3S_Gq)!jIEq)lKm^MqW&cmZl69V|GP4 zdK=7!_9pXaU4+j!!p;MOv<-(bjA0Dp{|o;Fq@yPWm#9Cx00000NkvXXu0mjfNvfeV literal 0 HcmV?d00001 diff --git a/plugins/plucked_string_synth/plucked_string_synth.cpp b/plugins/plucked_string_synth/plucked_string_synth.cpp index 8b8b4db16..1791bba5d 100644 --- a/plugins/plucked_string_synth/plucked_string_synth.cpp +++ b/plugins/plucked_string_synth/plucked_string_synth.cpp @@ -69,18 +69,18 @@ plugin::descriptor pluckedstringsynth_plugin_descriptor = // TODO: make this synth stereo for better better spacial (room) feeling and // add distortion -pluckedStringSynth::pluckedStringSynth( instrumentTrack * _channel_track ) : - instrument( _channel_track, &pluckedstringsynth_plugin_descriptor ) +pluckedStringSynth::pluckedStringSynth( instrumentTrack * _instrument_track ) : + instrument( _instrument_track, &pluckedstringsynth_plugin_descriptor ) { m_pickKnob = new knob( knobDark_28, this, tr( "Pick position" ), - eng(), _channel_track ); + eng(), _instrument_track ); m_pickKnob->setRange( 0.0f, 0.5f, 0.005f ); m_pickKnob->setInitValue( 0.0f ); m_pickKnob->move( 86, 134 ); m_pickKnob->setHintText( tr( "Pick position:" ) + " ", "" ); m_pickupKnob = new knob( knobDark_28, this, tr( "Pickup position" ), - eng(), _channel_track ); + eng(), _instrument_track ); m_pickupKnob->setRange( 0.0f, 0.5f, 0.005f ); m_pickupKnob->setInitValue( 0.05f ); m_pickupKnob->move( 138, 134 ); diff --git a/plugins/plucked_string_synth/plucked_string_synth.h b/plugins/plucked_string_synth/plucked_string_synth.h index 51c27b31e..a88a0f08c 100644 --- a/plugins/plucked_string_synth/plucked_string_synth.h +++ b/plugins/plucked_string_synth/plucked_string_synth.h @@ -194,7 +194,7 @@ private: class pluckedStringSynth : public instrument { public: - pluckedStringSynth( instrumentTrack * _channel_track ); + pluckedStringSynth( instrumentTrack * _instrument_track ); virtual ~pluckedStringSynth(); virtual void FASTCALL playNote( notePlayHandle * _n,