From b166f11ffd91e2abd36b370228603423dd5e6524 Mon Sep 17 00:00:00 2001 From: Paul Giblock Date: Tue, 8 Jul 2008 14:34:41 +0000 Subject: [PATCH] Initial lb303 (no compat), fixed auto-detect, fix knob drawing git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@1298 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 17 + configure.in | 1 + plugins/Makefile.am | 1 + plugins/lb303/Makefile.am | 48 ++ plugins/lb303/README | 87 +++ plugins/lb303/artwork.png | Bin 0 -> 84733 bytes plugins/lb303/lb303.cpp | 845 +++++++++++++++++++++++ plugins/lb303/lb303.h | 277 ++++++++ plugins/lb303/logo.png | Bin 0 -> 3468 bytes src/gui/controller_connection_dialog.cpp | 3 +- src/gui/widgets/knob.cpp | 2 +- 11 files changed, 1279 insertions(+), 2 deletions(-) create mode 100644 plugins/lb303/Makefile.am create mode 100644 plugins/lb303/README create mode 100644 plugins/lb303/artwork.png create mode 100644 plugins/lb303/lb303.cpp create mode 100644 plugins/lb303/lb303.h create mode 100644 plugins/lb303/logo.png diff --git a/ChangeLog b/ChangeLog index a29145577..f0c558fe3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2008-07-08 Paul Giblock + + * plugins/lb303: + * plugins/lb303/lb303.cpp: + * plugins/lb303/lb303.h: + * plugins/lb303/Makefile.am: + * plugins/Makefile.am: + * configure.in: + First version of lb303, NO backward compatability YET + + * src/gui/controller_connection_dialog.cpp: + Fix MIDI AutoDetect + + * src/gui/widgets/knob.cpp: + Fix occationally missing line after instantiation + 2008-07-07 Paul Giblock * src/gui/controller_connection_dialog.cpp: @@ -11,6 +27,7 @@ - Initial support for pitch-bend, doesn't work during slide. - Next version will probably be the first lb303 - Cleanup, fixed dropped-notes + - Fix pitch-bend while sliding 2008-07-07 Tobias Doerffel diff --git a/configure.in b/configure.in index 2f28d6501..49b23b8af 100644 --- a/configure.in +++ b/configure.in @@ -695,6 +695,7 @@ AC_CONFIG_FILES([Makefile plugins/ladspa_effect/caps/Makefile plugins/ladspa_effect/tap/Makefile plugins/lb302/Makefile + plugins/lb303/Makefile plugins/live_tool/Makefile plugins/midi_import/Makefile plugins/organic/Makefile diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 459887f6f..aafa7bdf2 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -23,6 +23,7 @@ SUBDIRS = \ ladspa_browser \ ladspa_effect \ lb302 \ + lb303 \ live_tool \ midi_import \ organic \ diff --git a/plugins/lb303/Makefile.am b/plugins/lb303/Makefile.am new file mode 100644 index 000000000..db1231e0c --- /dev/null +++ b/plugins/lb303/Makefile.am @@ -0,0 +1,48 @@ +AUTOMAKE_OPTIONS = foreign 1.4 + +PLUGIN_NAME = lb303 + + +INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/src/gui -I. + + +AM_CXXFLAGS := $(AM_CXXFLAGS) $(QT_CXXFLAGS) -DPLUGIN_NAME="$(PLUGIN_NAME)" + + +%.moc: ./%.h + $(MOC) -o $@ $< + + +MOC_FILES = ./lb303.moc + +if BUILD_WIN32 +DLL=$(PLUGIN_NAME).dll + +$(DLL): lib$(PLUGIN_NAME).la + $(CXX) *.o -L$(top_srcdir) -llmms-imp -shared -Wl,-no-undefined -o $@ $(QT_LDADD) && $(STRIP) $@ + +install-exec-hook: $(DLL) + cp $< $(pkglibdir) + rm $(pkglibdir)/lib$(PLUGIN_NAME).a $(pkglibdir)/lib$(PLUGIN_NAME).la +else +DLL= +endif + +BUILT_SOURCES = $(MOC_FILES) ./embedded_resources.h $(DLL) +EMBEDDED_RESOURCES = $(wildcard *png) + +./embedded_resources.h: $(EMBEDDED_RESOURCES) + $(BIN2RES) $(EMBEDDED_RESOURCES) > $@ + +EXTRA_DIST = $(EMBEDDED_RESOURCES) + + +CLEANFILES = $(MOC_FILES) ./embedded_resources.h + + + +pkglib_LTLIBRARIES= liblb303.la + +liblb303_la_SOURCES = lb303.cpp lb303.h + +$(liblb303_la_SOURCES): ./embedded_resources.h diff --git a/plugins/lb303/README b/plugins/lb303/README new file mode 100644 index 000000000..2a8058e56 --- /dev/null +++ b/plugins/lb303/README @@ -0,0 +1,87 @@ +LB303 Bass Synth - Known bugs, issues, and missing features +----------------------------------------------------------- + +2007.02.03 - First release +-------------------------- + +Important note, in the current incarnation there are many behaviors, +constants, and other items that will be changed. This will result +in a change of the instrument's timbre and functionality. Therefore, +it would be wise to not make any masterpieces with the synth at +this point in time. + +BUG: + Fix the awful clicking cause by adjacent notes. This problem seems + to be caused by 'unexhausted buffers' That is, the problem manifests + itself to a greater degree when the user "buffer size" configuration + is increased to over 1024 frames or so. The problem is much less + noticable when the buffer size is set to 64 frames. + +BUG: + The synth does not make accomodations for sampling rates other than + 44100. This should be easy to fix, but I haven't gotten around to + it; nor do I have the means to test it. + +BUG: + I get segfaults now and then. Granted, I've rarely used LMMS + without also using LB302, so I do not know if the problem is actually + in the Bass Synth. I have gotten the backtraces a few times: + ... + mixer::renderNextBuffer() + mixer::nextAudioBuffer() + QOBject::activate_signal() + ??() + + and + + ... + instrumentTrack::play() + notePlayHandle() + instrumentTrack::processOutEvent() + fadeButton::activate() + QSingleShotTimer::start() + qStartTimer() + qKillTimer() + QGList::insertAt() + +TODO: + Add accent feature. This isn't as bad as it sounds, but will require + some tweaking to get right. + +TODO: + LB302 contains code for a short fixed-length default decay. If a + released note is using a user-defined VCA from the instrument + panel, then LB302 should not do anything special. However, if no + envelope is specified, then LB302 should request enough release-frames + in order to apply the built-in exponential decay. + +TODO: + The original TB303's square wave is not 50% duty cycle. The peaks are + supposed to slope down slightly. It would be nice to be able to + configure this. In fact, each waveform could have a parameter knob to + change some aspect of the wave. See lb302.cpp:643 for more info. + +TODO: + Must decide on proper action to take when a slide note is interrupted + by another slide note. Right now, the slide-from frequency is always + replaced with the prior note. However, we may wish to maintain the + current frequency in order to make the sound more continuous. + +TODO: + The default filter's distortion could use some work. + effectLib::distortion<> gets the job done, but the coefficients need + to more closely match that of lb302Filter3Pole's tanh distortion. + +TODO: + Slide decay needs a better knob mapping. sqrt()? lb302.cpp:588 + +TODO: + Consider making the slide trigger set the note to slide TO as opposed + to the note to slide FROM. I originally did FROM in order to match + the real 303. However, TO may be more intuitive. + +TODO: + Various code refactoring, as well as precomputing some values. + +TODO: + Remove one of the sawtooth waveforms in favor of the other? diff --git a/plugins/lb303/artwork.png b/plugins/lb303/artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..c124bcd7c5a63cd469904fe26e0f68bc238587df GIT binary patch literal 84733 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
  • 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 literal 0 HcmV?d00001 diff --git a/plugins/lb303/lb303.cpp b/plugins/lb303/lb303.cpp new file mode 100644 index 000000000..d0e40bba9 --- /dev/null +++ b/plugins/lb303/lb303.cpp @@ -0,0 +1,845 @@ +/* + * lb303.cpp - implementation of class lb303 which is a bass synth attempting + * to emulate the Roland TB303 bass synth + * + * Copyright (c) 2006-2008 Paul Giblock + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * lb303FilterIIR2 is based on the gsyn filter code by Andy Sloane. + * + * lb303Filter3Pole is based on the TB303 instrument written by + * Josep M Comajuncosas for the CSounds library + * + * 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 + +#include "lb303.h" +#include "engine.h" +#include "instrument_play_handle.h" +#include "instrument_track.h" +#include "knob.h" +#include "note_play_handle.h" +#include "templates.h" +#include "audio_port.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embed.cpp" +#include "lb303.moc" + + +// Envelope Recalculation period +#define ENVINC 64 + +// +// New config +// +#define LB_24_IGNORE_ENVELOPE +#define LB_FILTERED +//#define LB_DECAY +//#define LB_24_RES_TRICK + +#define LB_DIST_RATIO 4.0 +#define LB_24_VOL_ADJUST 3.0 +//#define LB_DECAY_NOTES + +#define LB_DEBUG + +#ifdef LB_DEBUG +#include +#endif + +// +// Old config +// + + +//#define engine::getMixer()->processingSampleRate() 44100.0f + + +extern "C" +{ + +plugin::descriptor PLUGIN_EXPORT lb303_plugin_descriptor = +{ + STRINGIFY_PLUGIN_NAME( PLUGIN_NAME ), + "LB303", + QT_TRANSLATE_NOOP( "pluginBrowser", + "Incomplete monophonic immitation tb303" ), + "Paul Giblock ", + 0x0100, + plugin::Instrument, + new pluginPixmapLoader( "logo" ), + NULL +}; + +} + +// +// lb303Filter +// + +lb303Filter::lb303Filter(lb303FilterKnobState* p_fs) : + fs(p_fs), + vcf_c0(0), + vcf_e0(0), + vcf_e1(0) +{ +}; + + +void lb303Filter::recalc() +{ + vcf_e1 = exp(6.109 + 1.5876*(fs->envmod) + 2.1553*(fs->cutoff) - 1.2*(1.0-(fs->reso))); + vcf_e0 = exp(5.613 - 0.8*(fs->envmod) + 2.1553*(fs->cutoff) - 0.7696*(1.0-(fs->reso))); + vcf_e0*=M_PI/engine::getMixer()->processingSampleRate(); + vcf_e1*=M_PI/engine::getMixer()->processingSampleRate(); + vcf_e1 -= vcf_e0; + + vcf_rescoeff = exp(-1.20 + 3.455*(fs->reso)); +}; + + +void lb303Filter::envRecalc() +{ + vcf_c0 *= fs->envdecay; // Filter Decay. vcf_decay is adjusted for Hz and ENVINC + // vcf_rescoeff = exp(-1.20 + 3.455*(fs->reso)); moved above +}; + + +void lb303Filter::playNote() +{ + vcf_c0 = vcf_e1; +} + + +// +// lb303FilterIIR2 +// + +lb303FilterIIR2::lb303FilterIIR2(lb303FilterKnobState* p_fs) : + lb303Filter(p_fs), + vcf_d1(0), + vcf_d2(0), + vcf_a(0), + vcf_b(0), + vcf_c(1) +{ + + m_dist = new effectLib::distortion<>( 1.0, 1.0f); + +}; + + +lb303FilterIIR2::~lb303FilterIIR2() +{ + delete m_dist; +} + + +void lb303FilterIIR2::recalc() +{ + lb303Filter::recalc(); + //m_dist->setThreshold(0.5+(fs->dist*2.0)); + m_dist->setThreshold(fs->dist*75.0); +}; + + +void lb303FilterIIR2::envRecalc() +{ + float k, w; + + lb303Filter::envRecalc(); + + w = vcf_e0 + vcf_c0; // e0 is adjusted for Hz and doesn't need ENVINC + k = exp(-w/vcf_rescoeff); // Does this mean c0 is inheritantly? + + vcf_a = 2.0*cos(2.0*w) * k; + vcf_b = -k*k; + vcf_c = 1.0 - vcf_a - vcf_b; +} + + +float lb303FilterIIR2::process(const float& samp) +{ + float ret = vcf_a*vcf_d1 + vcf_b*vcf_d2 + vcf_c*samp; + // Delayed samples for filter + vcf_d2 = vcf_d1; + vcf_d1 = ret; + + if(fs->dist > 0) + ret=m_dist->nextSample(ret); + + // output = IIR2 + dry + return ret; +} + + +// +// lb303Filter3Pole +// + +lb303Filter3Pole::lb303Filter3Pole(lb303FilterKnobState *p_fs) : + lb303Filter(p_fs), + ay1(0), + ay2(0), + aout(0), + lastin(0) +{ +}; + + +void lb303Filter3Pole::recalc() +{ + // DO NOT CALL BASE CLASS + vcf_e0 = 0.000001; + vcf_e1 = 1.0; +} + + +// TODO: Try using k instead of vcf_reso +void lb303Filter3Pole::envRecalc() +{ + float w,k; + float kfco; + + lb303Filter::envRecalc(); + + // e0 is adjusted for Hz and doesn't need ENVINC + w = vcf_e0 + vcf_c0; + k = (fs->cutoff > 0.975)?0.975:fs->cutoff; + kfco = 50.f + (k)*((2300.f-1600.f*(fs->envmod))+(w) * + (700.f+1500.f*(k)+(1500.f+(k)*(engine::getMixer()->processingSampleRate()/2.f-6000.f)) * + (fs->envmod)) ); + //+iacc*(.3+.7*kfco*kenvmod)*kaccent*kaccurve*2000 + + +#ifdef LB_24_IGNORE_ENVELOPE + // kfcn = fs->cutoff; + kfcn = 2.0 * kfco / engine::getMixer()->processingSampleRate(); +#else + kfcn = w; +#endif + kp = ((-2.7528*kfcn + 3.0429)*kfcn + 1.718)*kfcn - 0.9984; + kp1 = kp+1.0; + kp1h = 0.5*kp1; +#ifdef LB_24_RES_TRICK + k = exp(-w/vcf_rescoeff); + kres = (((k))) * (((-2.7079*kp1 + 10.963)*kp1 - 14.934)*kp1 + 8.4974); +#else + kres = (((fs->reso))) * (((-2.7079*kp1 + 10.963)*kp1 - 14.934)*kp1 + 8.4974); +#endif + value = 1.0+( (fs->dist) *(1.5 + 2.0*kres*(1.0-kfcn))); // ENVMOD was DIST +} + + +float lb303Filter3Pole::process(const float& samp) +{ + float ax1 = lastin; + float ay11 = ay1; + float ay31 = ay2; + lastin = (samp) - tanh(kres*aout); + ay1 = kp1h * (lastin+ax1) - kp*ay1; + ay2 = kp1h * (ay1 + ay11) - kp*ay2; + aout = kp1h * (ay2 + ay31) - kp*aout; + + return tanh(aout*value)*LB_24_VOL_ADJUST/(1.0+fs->dist); +} + + +// +// LBSynth +// + +lb303Synth::lb303Synth( instrumentTrack * _instrumentTrack ) : + instrument( _instrumentTrack, &lb303_plugin_descriptor ), + vcf_cut_knob( 0.75f, 0.0f, 1.5f, 0.005f, this, tr( "VCF Cutoff Frequency" ) ), + vcf_res_knob( 0.75f, 0.0f, 1.25f, 0.005f, this, tr( "VCF Resonance" ) ), + vcf_mod_knob( 0.1f, 0.0f, 1.0f, 0.005f, this, tr( "VCF Envelope Mod" ) ), + vcf_dec_knob( 0.1f, 0.0f, 1.0f, 0.005f, this, tr( "VCF Envelope Decay" ) ), + dist_knob( 0.0f, 0.0f, 1.0f, 0.01f, this, tr( "Distortion" ) ), + wave_knob( 0.0f, 0.0f, 5.0f, 1.0f, this, tr( "Waveform" ) ), + slide_dec_knob( 0.6f, 0.0f, 1.0f, 0.005f, this, tr( "Slide Decay" ) ), + slideToggle( FALSE, this, tr( "Slide" ) ), + accentToggle( FALSE, this, tr( "Accent" ) ), + deadToggle( FALSE, this, tr( "Dead" ) ), + db24Toggle( FALSE, this, tr( "24dB/oct Filter" ) ) + +{ + + connect( engine::getMixer(), SIGNAL( sampleRateChanged( ) ), + this, SLOT ( filterChanged( ) ) ); + + connect( &vcf_cut_knob, SIGNAL( dataChanged( ) ), + this, SLOT ( filterChanged( ) ) ); + + connect( &vcf_res_knob, SIGNAL( dataChanged( ) ), + this, SLOT ( filterChanged( ) ) ); + + connect( &vcf_mod_knob, SIGNAL( dataChanged( ) ), + this, SLOT ( filterChanged( ) ) ); + + connect( &vcf_dec_knob, SIGNAL( dataChanged( ) ), + this, SLOT ( filterChanged( ) ) ); + + connect( &db24Toggle, SIGNAL( dataChanged( ) ), + this, SLOT ( db24Toggled( ) ) ); + + connect( &dist_knob, SIGNAL( dataChanged( ) ), + this, SLOT ( filterChanged( ))); + + + // SYNTH + + vco_inc = 0.0; + vco_c = 0; + vco_k = 0; + + vco_slide = 0; vco_slideinc = 0; + vco_slidebase = 0; + + fs.cutoff = 0; + fs.envmod = 0; + fs.reso = 0; + fs.envdecay = 0; + fs.dist = 0; + + vcf_envpos = ENVINC; + + // Start VCA on an attack. + vca_mode = 3; + vca_a = 0; + + //vca_attack = 1.0 - 0.94406088; + vca_attack = 1.0 - 0.96406088; + vca_decay = 0.99897516; + + vco_shape = SAWTOOTH; + + // Experimenting with a0 between original (0.5) and 1.0 + vca_a0 = 0.5; + vca_a = 9; + vca_mode = 3; + + vcf = new lb303FilterIIR2(&fs); + + sample_cnt = 0; + release_frame = 1<<24; + catch_frame = 0; + catch_decay = 0; + + recalcFilter(); + + last_offset = 0; + + new_freq = -1; + current_freq = -1; + delete_freq = -1; + + instrumentPlayHandle * iph = new instrumentPlayHandle( this ); + engine::getMixer()->addPlayHandle( iph ); + + filterChanged(); +} + + +lb303Synth::~lb303Synth() +{ + delete vcf; +} + + +void lb303Synth::saveSettings( QDomDocument & _doc, + QDomElement & _this ) +{ + vcf_cut_knob.saveSettings( _doc, _this, "vcf_cut" ); + vcf_res_knob.saveSettings( _doc, _this, "vcf_res" ); + vcf_mod_knob.saveSettings( _doc, _this, "vcf_mod" ); + vcf_dec_knob.saveSettings( _doc, _this, "vcf_dec" ); + + wave_knob.saveSettings( _doc, _this, "shape"); + dist_knob.saveSettings( _doc, _this, "dist"); + slide_dec_knob.saveSettings( _doc, _this, "slide_dec"); + + slideToggle.saveSettings( _doc, _this, "slide"); + deadToggle.saveSettings( _doc, _this, "dead"); + db24Toggle.saveSettings( _doc, _this, "db24"); +} + + +void lb303Synth::loadSettings( const QDomElement & _this ) +{ + vcf_cut_knob.loadSettings( _this, "vcf_cut" ); + vcf_res_knob.loadSettings( _this, "vcf_res" ); + vcf_mod_knob.loadSettings( _this, "vcf_mod" ); + vcf_dec_knob.loadSettings( _this, "vcf_dec" ); + + dist_knob.loadSettings( _this, "dist"); + wave_knob.loadSettings( _this, "shape"); + slide_dec_knob.loadSettings( _this, "slide_dec"); + + slideToggle.loadSettings( _this, "slide"); + deadToggle.loadSettings( _this, "dead"); + db24Toggle.loadSettings( _this, "db24"); + + filterChanged(); +} + +// TODO: Split into one function per knob. envdecay doesn't require +// recalcFilter. +void lb303Synth::filterChanged( void ) +{ + fs.cutoff = vcf_cut_knob.value(); + fs.reso = vcf_res_knob.value(); + fs.envmod = vcf_mod_knob.value(); + fs.dist = LB_DIST_RATIO*dist_knob.value(); + + float d = 0.2 + (2.3*vcf_dec_knob.value()); + + d *= engine::getMixer()->processingSampleRate(); // d *= smpl rate + fs.envdecay = pow(0.1, 1.0/d * ENVINC); // decay is 0.1 to the 1/d * ENVINC + // vcf_envdecay is now adjusted for both + // sampling rate and ENVINC + recalcFilter(); +} + + +void lb303Synth::db24Toggled( void ) +{ + delete vcf; + if(db24Toggle.value()) { + vcf = new lb303Filter3Pole(&fs); + } + else { + vcf = new lb303FilterIIR2(&fs); + } + recalcFilter(); +} + + + +QString lb303Synth::nodeName( void ) const +{ + return( lb303_plugin_descriptor.name ); +} + + +void lb303Synth::recalcFilter() +{ + vcf->recalc(); + + vcf_envpos = ENVINC; // Trigger filter update in process() +} + +inline int MIN(int a, int b) { + return (aprocessingSampleRate(); // TODO: Use actual sampling rate. +} + +int lb303Synth::process(sampleFrame *outbuf, const Uint32 size) +{ + unsigned int i; + float w; + float samp; + + if( delete_freq == current_freq ) { + // Normal release + delete_freq = -1; + vca_mode = 1; + } + + if( new_freq > 0.0f ) { + lb303Note note; + note.vco_inc = GET_INC( true_freq ); + note.dead = deadToggle.value(); + initNote(¬e); + + current_freq = new_freq; + + new_freq = -1.0f; + } + + + + // TODO: NORMAL RELEASE + // vca_mode = 1; + + for(i=0;i= ENVINC) { + vcf->envRecalc(); + + vcf_envpos = 0; + + if (vco_slide) { + vco_inc=vco_slidebase-vco_slide; + // Calculate coeff from dec_knob on knob change. + vco_slide*= 0.9+(slide_dec_knob.value()*0.0999); // TODO: Adjust for Hz and ENVINC + + } + } + + + sample_cnt++; + vcf_envpos++; + + int decay_frames = 128; + + // update vco + vco_c += vco_inc; + + if(vco_c > 0.5) + vco_c -= 1.0; + + /*LB303 + if (catch_decay > 0) { + if (catch_decay < decay_frames) { + catch_decay++; + } + }*/ + + switch(int(rint(wave_knob.value()))) { + case 0: vco_shape = SAWTOOTH; break; + case 1: vco_shape = INVERTED_SAWTOOTH; break; + case 2: vco_shape = TRIANGLE; break; + case 3: vco_shape = SQUARE; break; + case 4: vco_shape = ROUND_SQUARE; break; + case 5: vco_shape = MOOG; break; + default: vco_shape = SAWTOOTH; break; + } + + // add vco_shape_param the changes the shape of each curve. + // merge sawtooths with triangle and square with round square? + switch (vco_shape) { + case SAWTOOTH: // p0: curviness of line + vco_k = vco_c; // Is this sawtooth backwards? + break; + + case INVERTED_SAWTOOTH: // p0: curviness of line + vco_k = -vco_c; // Is this sawtooth backwards? + break; + + case TRIANGLE: // p0: duty rev.saw<->triangle<->saw p1: curviness + vco_k = (vco_c*2.0)+0.5; + if (vco_k>0.5) + vco_k = 1.0- vco_k; + break; + + case SQUARE: // p0: slope of top + vco_k = (vco_c<0)?0.5:-0.5; + break; + + case ROUND_SQUARE: // p0: width of round + vco_k = (vco_c<0)?(sqrtf(1-(vco_c*vco_c*4))-0.5):-0.5; + break; + + case MOOG: // Maybe the fall should be exponential/sinsoidal instead of quadric. + // [-0.5, 0]: Rise, [0,0.25]: Slope down, [0.25,0.5]: Low + vco_k = (vco_c*2.0)+0.5; + if (vco_k>1.0) { + vco_k = -0.5 ; + } + else if (vco_k>0.5) { + w = 2.0*(vco_k-0.5)-1.0; + vco_k = 0.5 - sqrtf(1.0-(w*w)); + } + vco_k *= 2.0; // MOOG wave gets filtered away + break; + } + + // Write out samples. + samp = vcf->process(vco_k) * vca_a; + + /* + float releaseFrames = desiredReleaseFrames(); + samp *= (releaseFrames - catch_decay)/releaseFrames; + */ + //LB303 samp *= (float)(decay_frames - catch_decay)/(float)decay_frames; + + for(int c=0; c=release_frame) { + vca_mode=1; + } + */ + + // Handle Envelope + if(vca_mode==0) { + vca_a+=(vca_a0-vca_a)*vca_attack; + if(sample_cnt>=0.5*engine::getMixer()->processingSampleRate()) + vca_mode = 2; + } + else if(vca_mode == 1) { + vca_a *= vca_decay; + + // the following line actually speeds up processing + if(vca_a < (1/65536.0)) { + vca_a = 0; + vca_mode = 3; + } + } + + } + return 1; +} + + +/* Prepares the active LB303 note. I separated this into a function because it + * needs to be called onplayNote() when a new note is started. It also needs + * to be called from process() when a prior edge-to-edge note is done releasing. + */ + +void lb303Synth::initNote( lb303Note *n) +{ + catch_decay = 0; + + vco_inc = n->vco_inc; + + // Always reset vca on non-dead notes, and + // Only reset vca on decaying(decayed) and never-played + if(n->dead == 0 || (vca_mode==1 || vca_mode==3)) { + //printf(" good\n"); + sample_cnt = 0; + vca_mode = 0; + // LB303: + //vca_a = 0; + } + else { + vca_mode = 2; + } + + // Initiate Slide + // TODO: Break out into function, should be called again on detuneChanged + if (vco_slideinc) { + vco_slide = vco_inc-vco_slideinc; // Slide amount + vco_slidebase = vco_inc; // The REAL frequency + vco_slideinc = 0; // reset from-note + } + else { + vco_slide = 0; + } + // End break-out + + // Slide-from note, save inc for next note + if (slideToggle.value()) { + vco_slideinc = vco_inc; // May need to equal vco_slidebase+vco_slide if last note slid + } + + + recalcFilter(); + + if(n->dead ==0){ + // Swap next two blocks?? + vcf->playNote(); + // Ensure envelope is recalculated + vcf_envpos = ENVINC; + + // Double Check + //vca_mode = 0; + //vca_a = 0.0; + } +} + + +void lb303Synth::playNote( notePlayHandle * _n, bool, + sampleFrame * _working_buffer ) +{ + if( _n->arpBaseNote() ) + { + //return; + } + + // Currently have release/decay disabled + // Start the release decay if this is the first release period. + //if (_n->released() && catch_decay == 0) + // catch_decay = 1; + + bool decay_note = false; + + release_frame = _n->framesLeft() - desiredReleaseFrames(); + + + if(deadToggle.value() == 0 && decay_note) { + } + /// Start a new note. + else if( _n->totalFramesPlayed() == 0 ) { + new_freq = _n->unpitchedFrequency(); + true_freq = _n->frequency(); + _n->m_pluginData = this; + } + + // Check for slide + if( _n->unpitchedFrequency() == current_freq ) { + true_freq = _n->frequency(); + + if( slideToggle.value() ) { + vco_slidebase = GET_INC( true_freq ); // The REAL frequency + } + else { + vco_inc = GET_INC( true_freq ); + } + } +} + + + +void lb303Synth::play( bool _try_parallelizing, + sampleFrame * _working_buffer ) +{ + //printf("."); + const fpp_t frames = engine::getMixer()->framesPerPeriod(); + + process( _working_buffer, frames); + getInstrumentTrack()->processAudioBuffer( _working_buffer, frames, + NULL ); +} + + + +void lb303Synth::deleteNotePluginData( notePlayHandle * _n ) +{ + //printf("GONE\n"); + if( _n->unpitchedFrequency() == current_freq ) + { + delete_freq = current_freq; + } +} + + +pluginView * lb303Synth::instantiateView( QWidget * _parent ) +{ + return( new lb303SynthView( this, _parent ) ); +} + + +lb303SynthView::lb303SynthView( instrument * _instrument, QWidget * _parent ) : + instrumentView( _instrument, _parent ) +{ + // GUI + m_vcfCutKnob = new knob( knobBright_26, this ); + m_vcfCutKnob->move( 75, 130 ); + m_vcfCutKnob->setHintText( tr( "Cutoff Freq:" ) + " ", "" ); + m_vcfCutKnob->setLabel( tr("CUT") ); + + m_vcfResKnob = new knob( knobBright_26, this ); + m_vcfResKnob->move( 120, 130 ); + m_vcfResKnob->setHintText( tr( "Resonance:" ) + " ", "" ); + m_vcfResKnob->setLabel( tr("RES") ); + + m_vcfModKnob = new knob( knobBright_26, this ); + m_vcfModKnob->move( 165, 130 ); + m_vcfModKnob->setHintText( tr( "Env Mod:" ) + " ", "" ); + m_vcfModKnob->setLabel( tr("ENV MOD") ); + + m_vcfDecKnob = new knob( knobBright_26, this ); + m_vcfDecKnob->move( 210, 130 ); + m_vcfDecKnob->setHintText( tr( "Decay:" ) + " ", "" ); + m_vcfDecKnob->setLabel( tr("DEC") ); + + m_slideToggle = new ledCheckBox( "Slide", this ); + m_slideToggle->move( 10, 180 ); + + m_accentToggle = new ledCheckBox( "Accent", this ); + m_accentToggle->move( 10, 200 ); + m_accentToggle->setDisabled(true); + + m_deadToggle = new ledCheckBox( "Dead", this ); + m_deadToggle->move( 10, 220 ); + + m_db24Toggle = new ledCheckBox( "24dB/oct", this ); + m_db24Toggle->setWhatsThis( + tr( "303-es-que, 24dB/octave, 3 pole filter" ) ); + m_db24Toggle->move( 10, 150); + + + m_slideDecKnob = new knob( knobBright_26, this ); + m_slideDecKnob->move( 210, 75 ); + m_slideDecKnob->setHintText( tr( "Slide Decay:" ) + " ", "" ); + m_slideDecKnob->setLabel( tr( "SLIDE")); + + m_distKnob = new knob( knobBright_26, this ); + m_distKnob->move( 210, 190 ); + m_distKnob->setHintText( tr( "DIST:" ) + " ", "" ); + m_distKnob->setLabel( tr( "DIST")); + + + m_waveKnob = new knob( knobBright_26, this ); + m_waveKnob->move( 120, 75 ); + m_waveKnob->setHintText( tr( "WAVE:" ) + " ", "" ); + m_waveKnob->setLabel( tr( "WAVE")); + + + setAutoFillBackground( TRUE ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( + "artwork" ) ); + setPalette( pal ); +} + + +lb303SynthView::~lb303SynthView() +{ +} + + +void lb303SynthView::modelChanged( void ) +{ + lb303Synth * syn = castModel(); + + m_vcfCutKnob->setModel( &syn->vcf_cut_knob ); + m_vcfResKnob->setModel( &syn->vcf_res_knob ); + m_vcfDecKnob->setModel( &syn->vcf_dec_knob ); + m_vcfModKnob->setModel( &syn->vcf_mod_knob ); + m_slideDecKnob->setModel( &syn->slide_dec_knob ); + + m_distKnob->setModel( &syn->dist_knob ); + m_waveKnob->setModel( &syn->wave_knob ); + + m_slideToggle->setModel( &syn->slideToggle ); + m_accentToggle->setModel( &syn->accentToggle ); + m_deadToggle->setModel( &syn->deadToggle ); + m_db24Toggle->setModel( &syn->db24Toggle ); +} + + + +extern "C" +{ + +// neccessary for getting instance out of shared lib +plugin * PLUGIN_EXPORT lmms_plugin_main( model *, void * _data ) +{ + + return( new lb303Synth( + static_cast( _data ) ) ); +} + + +} + + diff --git a/plugins/lb303/lb303.h b/plugins/lb303/lb303.h new file mode 100644 index 000000000..107f708dc --- /dev/null +++ b/plugins/lb303/lb303.h @@ -0,0 +1,277 @@ +/* + * lb303.h - declaration of class lb303 which is a bass synth attempting to + * emulate the Roland TB303 bass synth + * + * Copyright (c) 2006-2008 Paul Giblock + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * lb303FilterIIR2 is based on the gsyn filter code by Andy Sloane. + * + * lb303Filter3Pole is based on the TB303 instrument written by + * Josep M Comajuncosas for the CSounds library + * + * 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 _LB303_H_ +#define _LB303_H_ + +#include "effect_lib.h" +#include "instrument.h" +#include "instrument_view.h" +#include "led_checkbox.h" +#include "knob.h" +#include "mixer.h" + +class lb303SynthView; +class notePlayHandle; + +class lb303FilterKnobState +{ + public: + float cutoff; + float reso; + float envmod; + float envdecay; + float dist; +}; + + +class lb303Filter +{ + public: + lb303Filter(lb303FilterKnobState* p_fs); + virtual ~lb303Filter() {}; + + virtual void recalc(); + virtual void envRecalc(); + virtual float process(const float& samp)=0; + virtual void playNote(); + + protected: + lb303FilterKnobState *fs; + + // Filter Decay + float vcf_c0; // c0=e1 on retrigger; c0*=ed every sample; cutoff=e0+c0 + float vcf_e0, // e0 and e1 for interpolation + vcf_e1; + float vcf_rescoeff; // Resonance coefficient [0.30,9.54] +}; + +class lb303FilterIIR2 : public lb303Filter +{ + public: + lb303FilterIIR2(lb303FilterKnobState* p_fs); + virtual ~lb303FilterIIR2(); + + virtual void recalc(); + virtual void envRecalc(); + virtual float process(const float& samp); + + protected: + float vcf_d1, // d1 and d2 are added back into the sample with + vcf_d2; // vcf_a and b as coefficients. IIR2 resonance + // loop. + + // IIR2 Coefficients for mixing dry and delay. + float vcf_a, // Mixing coefficients for the final sound. + vcf_b, // + vcf_c; + + effectLib::monoToStereoAdaptor > * m_dist_fx; + effectLib::distortion<> * m_dist; +}; + + +class lb303Filter3Pole : public lb303Filter +{ + public: + lb303Filter3Pole(lb303FilterKnobState* p_fs); + + //virtual void recalc(); + virtual void envRecalc(); + virtual void recalc(); + virtual float process(const float& samp); + + protected: + float kfcn, + kp, + kp1, + kp1h, + kres; + float ay1, + ay2, + aout, + lastin, + value; +}; + + + +class lb303Note +{ +public: + float vco_inc; + bool dead; +}; + + +class lb303Synth : public instrument +{ + Q_OBJECT +public: + lb303Synth( instrumentTrack * _channel_track ); + virtual ~lb303Synth(); + + virtual void play( bool _try_parallelizing, + sampleFrame * _working_buffer ); + virtual void playNote( notePlayHandle * _n, bool _try_parallelizing, + sampleFrame * _working_buffer ); + virtual void deleteNotePluginData( notePlayHandle * _n ); + + + virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); + virtual void loadSettings( const QDomElement & _this ); + + virtual QString nodeName( void ) const; + + virtual bool supportsParallelizing( void ) const + { + return( FALSE ); + } + + virtual f_cnt_t desiredReleaseFrames( void ) const + { + return 0; //4048; + } + + virtual pluginView * instantiateView( QWidget * _parent ); + +private: + + void initNote(lb303Note *note); + + +private: + knobModel vcf_cut_knob; + knobModel vcf_res_knob; + knobModel vcf_mod_knob; + knobModel vcf_dec_knob; + + knobModel vco_fine_detune_knob; + + knobModel dist_knob; + knobModel wave_knob; + knobModel slide_dec_knob; + + boolModel slideToggle; + boolModel accentToggle; + boolModel deadToggle; + boolModel db24Toggle; + + +public slots: + void filterChanged( void ); + void detuneChanged( void ); + void db24Toggled( void ); + +private: + // Oscillator + float vco_inc, // Sample increment for the frequency. Creates Sawtooth. + vco_k, // Raw oscillator sample [-0.5,0.5] + vco_c; // Raw oscillator sample [-0.5,0.5] + + float vco_slide, //* Current value of slide exponential curve. Nonzero=sliding + vco_slideinc, //* Slide base to use in next node. Nonzero=slide next note + vco_slidebase; //* The base vco_inc while sliding. + + float vco_detune; + + enum vco_shape_t { SAWTOOTH, INVERTED_SAWTOOTH, SQUARE, TRIANGLE, MOOG, ROUND_SQUARE }; + vco_shape_t vco_shape; + + // User settings + lb303FilterKnobState fs; + lb303Filter *vcf; + + int release_frame; + + + // More States + int vcf_envpos; // Update counter. Updates when >= ENVINC + + float vca_attack, // Amp attack + vca_decay, // Amp decay + vca_a0, // Initial amplifier coefficient + vca_a; // Amplifier coefficient. + + // Envelope State + int vca_mode; // 0: attack, 1: decay, 2: idle, 3: never played + + // My hacks + int sample_cnt; + + int last_offset; + + int catch_frame; + int catch_decay; + + float new_freq; + float current_freq; + float delete_freq; + float true_freq; + + void recalcFilter(); + + int process(sampleFrame *outbuf, const Uint32 size); + + friend class lb303SynthView; + +} ; + + +class lb303SynthView : public instrumentView +{ +public: + lb303SynthView( instrument * _instrument, + QWidget * _parent ); + virtual ~lb303SynthView(); + +private: + virtual void modelChanged( void ); + + knob * m_vcfCutKnob; + knob * m_vcfResKnob; + knob * m_vcfDecKnob; + knob * m_vcfModKnob; + + knob * m_vcoFineDetuneKnob; + + knob * m_distKnob; + knob * m_waveKnob; + knob * m_slideDecKnob; + + ledCheckBox * m_slideToggle; + ledCheckBox * m_accentToggle; + ledCheckBox * m_deadToggle; + ledCheckBox * m_db24Toggle; + +} ; + +#endif diff --git a/plugins/lb303/logo.png b/plugins/lb303/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..22c99d1e46e1c58aa1642a6283a27aa00ae57fd7 GIT binary patch literal 3468 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 us?~zldrawImage( 0, 0, m_cache ); return;