From 60ad2c8aa0582e4453aa4b4bac8e24e79c678871 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stian=20J=C3=B8rgensrud?= Date: Thu, 11 Dec 2014 00:24:52 +0100 Subject: [PATCH 01/23] New SnareMarch preset and updated KickPower The snare sounds like it would be used for marching. If you can make it brighter without making it sound funny, please do... The kick was too dark for general purpose. Shortened it, raised it in the frequency range and added more noise. --- .../Kicker/{Kick power.xpf => KickPower.xpf} | 20 +-- data/presets/Kicker/SnareMarch.xpf | 161 ++++++++++++++++++ 2 files changed, 171 insertions(+), 10 deletions(-) rename data/presets/Kicker/{Kick power.xpf => KickPower.xpf} (54%) create mode 100644 data/presets/Kicker/SnareMarch.xpf diff --git a/data/presets/Kicker/Kick power.xpf b/data/presets/Kicker/KickPower.xpf similarity index 54% rename from data/presets/Kicker/Kick power.xpf rename to data/presets/Kicker/KickPower.xpf index b4e1daba3..27259ce25 100644 --- a/data/presets/Kicker/Kick power.xpf +++ b/data/presets/Kicker/KickPower.xpf @@ -1,20 +1,20 @@ - + - + - + - - - - + + + + - - - + + + diff --git a/data/presets/Kicker/SnareMarch.xpf b/data/presets/Kicker/SnareMarch.xpf new file mode 100644 index 000000000..d4d1ad0db --- /dev/null +++ b/data/presets/Kicker/SnareMarch.xpf @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 73cad09968d35ee6c7f2bb11dcad7e8428cb7188 Mon Sep 17 00:00:00 2001 From: Vesa V Date: Sat, 13 Dec 2014 13:05:50 +0200 Subject: [PATCH 02/23] Update FxMixer.cpp prevent double adding of jobs --- src/core/FxMixer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/FxMixer.cpp b/src/core/FxMixer.cpp index 7a21acb92..7f78afc9f 100644 --- a/src/core/FxMixer.cpp +++ b/src/core/FxMixer.cpp @@ -99,7 +99,7 @@ inline void FxChannel::processed() void FxChannel::incrementDeps() { m_dependenciesMet.ref(); - if( m_dependenciesMet >= m_receives.size() ) + if( m_dependenciesMet >= m_receives.size() && ! m_queued ) { m_queued = true; MixerWorkerThread::addJob( this ); From a8924a34dd08b75d6020f5aea78242531120455e Mon Sep 17 00:00:00 2001 From: tresf Date: Sat, 13 Dec 2014 11:27:14 -0500 Subject: [PATCH 03/23] Check major/minor version before setting theme directory --- src/core/config_mgr.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/core/config_mgr.cpp b/src/core/config_mgr.cpp index 411de79d5..93f286345 100644 --- a/src/core/config_mgr.cpp +++ b/src/core/config_mgr.cpp @@ -289,7 +289,13 @@ void configManager::loadConfigFile() node = node.nextSibling(); } - if( value( "paths", "artwork" ) != "" ) + // don't use dated theme folders as they break the UI (i.e. 0.4 != 1.0, etc) + bool use_artwork_path = + root.attribute( "version" ).startsWith( + QString::number( LMMS_VERSION_MAJOR ) + "." + + QString::number( LMMS_VERSION_MINOR ) ); + + if( use_artwork_path && value( "paths", "artwork" ) != "" ) { m_artworkDir = value( "paths", "artwork" ); if( !QDir( m_artworkDir ).exists() ) From a182a3e8cc9c512906aee38f1b8e067f31447198 Mon Sep 17 00:00:00 2001 From: Tres Finocchiaro Date: Sat, 13 Dec 2014 12:11:31 -0500 Subject: [PATCH 04/23] Fix scroll bar gap Closes #1437 --- src/tracks/InstrumentTrack.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index bc9728e36..20b737444 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -86,7 +86,7 @@ const char * volume_help = QT_TRANSLATE_NOOP( "InstrumentTrack", const int INSTRUMENT_WIDTH = 254; const int INSTRUMENT_HEIGHT = INSTRUMENT_WIDTH; -const int PIANO_HEIGHT = 84; +const int PIANO_HEIGHT = 82; const int INSTRUMENT_WINDOW_CACHE_SIZE = 8; From e6ae2be65a5f3cd55d055be52ad0348ec3586604 Mon Sep 17 00:00:00 2001 From: Tres Finocchiaro Date: Sat, 13 Dec 2014 12:19:20 -0500 Subject: [PATCH 05/23] Bump DualFilter high cutoff to 20k Closes #1395. --- plugins/DualFilter/DualFilterControls.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/DualFilter/DualFilterControls.cpp b/plugins/DualFilter/DualFilterControls.cpp index 344a34ca0..df295c39f 100644 --- a/plugins/DualFilter/DualFilterControls.cpp +++ b/plugins/DualFilter/DualFilterControls.cpp @@ -39,7 +39,7 @@ DualFilterControls::DualFilterControls( DualFilterEffect* effect ) : m_enabled1Model( true, this, tr( "Filter 1 enabled" ) ), m_filter1Model( this, tr( "Filter 1 type" ) ), - m_cut1Model( 7000.0f, 1.0f, 14000.0f, 1.0f, this, tr( "Cutoff 1 frequency" ) ), + m_cut1Model( 7000.0f, 1.0f, 20000.0f, 1.0f, this, tr( "Cutoff 1 frequency" ) ), m_res1Model( 0.5, basicFilters<0>::minQ(), 10.0, 0.01, this, tr( "Q/Resonance 1" ) ), m_gain1Model( 100.0f, 0.0f, 200.0f, 0.1f, this, tr( "Gain 1" ) ), @@ -47,7 +47,7 @@ DualFilterControls::DualFilterControls( DualFilterEffect* effect ) : m_enabled2Model( true, this, tr( "Filter 2 enabled" ) ), m_filter2Model( this, tr( "Filter 2 type" ) ), - m_cut2Model( 7000.0f, 1.0f, 14000.0f, 1.0f, this, tr( "Cutoff 2 frequency" ) ), + m_cut2Model( 7000.0f, 1.0f, 20000.0f, 1.0f, this, tr( "Cutoff 2 frequency" ) ), m_res2Model( 0.5, basicFilters<0>::minQ(), 10.0, 0.01, this, tr( "Q/Resonance 2" ) ), m_gain2Model( 100.0f, 0.0f, 200.0f, 0.1f, this, tr( "Gain 2" ) ) { From f27ea7bc2b97b58b0165e03df7c28c10ab2296c9 Mon Sep 17 00:00:00 2001 From: Dave French Date: Mon, 15 Dec 2014 21:40:58 +0000 Subject: [PATCH 06/23] Proposed fix for #1432 LB302 preset preview audio cut-off --- plugins/lb302/lb302.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/lb302/lb302.cpp b/plugins/lb302/lb302.cpp index 2f02dffc3..e3e2628c6 100644 --- a/plugins/lb302/lb302.cpp +++ b/plugins/lb302/lb302.cpp @@ -789,7 +789,7 @@ void lb302Synth::play( sampleFrame * _working_buffer ) process( _working_buffer, frames ); instrumentTrack()->processAudioBuffer( _working_buffer, frames, NULL ); - release_frame = 0; +// release_frame = 0; //removed for issue # 1432 } From 8d3637e754f734235c2163860d6a482da6c5f96f Mon Sep 17 00:00:00 2001 From: Dave French Date: Mon, 15 Dec 2014 15:54:05 +0000 Subject: [PATCH 07/23] Proposed fix for #1411 Crash on LB302 preset preview . --- plugins/lb302/lb302.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/lb302/lb302.cpp b/plugins/lb302/lb302.cpp index 2f02dffc3..dfc54e005 100644 --- a/plugins/lb302/lb302.cpp +++ b/plugins/lb302/lb302.cpp @@ -780,10 +780,12 @@ void lb302Synth::processNote( NotePlayHandle * _n ) void lb302Synth::play( sampleFrame * _working_buffer ) { + m_notesMutex.lock(); while( ! m_notes.isEmpty() ) { processNote( m_notes.takeFirst() ); }; + m_notesMutex.unlock(); const fpp_t frames = engine::mixer()->framesPerPeriod(); From 8b2ce06da8c255b0ef8075717182f3aab3cee9a7 Mon Sep 17 00:00:00 2001 From: Dave French Date: Tue, 16 Dec 2014 16:41:08 +0000 Subject: [PATCH 08/23] Proposed fix for 1450 Mem leak in sample-track --- src/core/SampleBuffer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/SampleBuffer.cpp b/src/core/SampleBuffer.cpp index 2db7e26fa..6941c6da9 100644 --- a/src/core/SampleBuffer.cpp +++ b/src/core/SampleBuffer.cpp @@ -942,6 +942,7 @@ void SampleBuffer::visualize( QPainter & _p, const QRect & _dr, _p.drawPolyline( l, nb_frames / fpp ); _p.drawPolyline( r, nb_frames / fpp ); delete[] l; + delete[] r; } From 91063ab7d2eeaee29545fafdc989f666ab23642d Mon Sep 17 00:00:00 2001 From: falkTX Date: Tue, 16 Dec 2014 19:40:02 +0000 Subject: [PATCH 09/23] Update Carla plugin to latest API --- plugins/carlabase/carla.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/plugins/carlabase/carla.cpp b/plugins/carlabase/carla.cpp index ad3d92019..db14178a2 100644 --- a/plugins/carlabase/carla.cpp +++ b/plugins/carlabase/carla.cpp @@ -251,16 +251,16 @@ intptr_t CarlaInstrument::handleDispatcher(const NativeHostDispatcherOpcode opco switch (opcode) { - case HOST_OPCODE_NULL: + case NATIVE_HOST_OPCODE_NULL: break; - case HOST_OPCODE_UPDATE_PARAMETER: - case HOST_OPCODE_UPDATE_MIDI_PROGRAM: - case HOST_OPCODE_RELOAD_PARAMETERS: - case HOST_OPCODE_RELOAD_MIDI_PROGRAMS: - case HOST_OPCODE_RELOAD_ALL: + case NATIVE_HOST_OPCODE_UPDATE_PARAMETER: + case NATIVE_HOST_OPCODE_UPDATE_MIDI_PROGRAM: + case NATIVE_HOST_OPCODE_RELOAD_PARAMETERS: + case NATIVE_HOST_OPCODE_RELOAD_MIDI_PROGRAMS: + case NATIVE_HOST_OPCODE_RELOAD_ALL: // nothing break; - case HOST_OPCODE_UI_UNAVAILABLE: + case NATIVE_HOST_OPCODE_UI_UNAVAILABLE: handleUiClosed(); break; } @@ -459,7 +459,7 @@ PluginView* CarlaInstrument::instantiateView(QWidget* parent) void CarlaInstrument::sampleRateChanged() { - fDescriptor->dispatcher(fHandle, PLUGIN_OPCODE_SAMPLE_RATE_CHANGED, 0, 0, nullptr, handleGetSampleRate()); + fDescriptor->dispatcher(fHandle, NATIVE_PLUGIN_OPCODE_SAMPLE_RATE_CHANGED, 0, 0, nullptr, handleGetSampleRate()); } // ------------------------------------------------------------------- From f2ab783db9443f3cba62867db29aa9fdcacf2a09 Mon Sep 17 00:00:00 2001 From: falkTX Date: Tue, 16 Dec 2014 19:40:31 +0000 Subject: [PATCH 10/23] Fix build when using old linux systems --- src/gui/PianoRoll.cpp | 5 +++++ src/gui/plugin_browser.cpp | 2 ++ 2 files changed, 7 insertions(+) diff --git a/src/gui/PianoRoll.cpp b/src/gui/PianoRoll.cpp index 2b454b381..266a1415a 100644 --- a/src/gui/PianoRoll.cpp +++ b/src/gui/PianoRoll.cpp @@ -70,6 +70,11 @@ #include "text_float.h" +#if QT_VERSION < 0x040800 +#define MiddleButton MidButton +#endif + + typedef AutomationPattern::timeMap timeMap; diff --git a/src/gui/plugin_browser.cpp b/src/gui/plugin_browser.cpp index 9827ce2e7..95ec8b42a 100644 --- a/src/gui/plugin_browser.cpp +++ b/src/gui/plugin_browser.cpp @@ -28,6 +28,8 @@ #include #include +#include // for std::sort + #include "plugin_browser.h" #include "embed.h" #include "debug.h" From f65ec076034f8ce6b96e39832655242e96f9404b Mon Sep 17 00:00:00 2001 From: Tres Finocchiaro Date: Tue, 16 Dec 2014 15:32:20 -0500 Subject: [PATCH 11/23] Bump version --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5fbbd979a..e30f417b8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,7 +15,7 @@ INCLUDE(FindPkgConfig) SET(VERSION_MAJOR "1") SET(VERSION_MINOR "0") -SET(VERSION_PATCH "99") +SET(VERSION_PATCH "100") #SET(VERSION_SUFFIX "") SET(VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") IF(VERSION_SUFFIX) From da6fd6ef5cd72d98a29cd83cac9d0b2dcb69433a Mon Sep 17 00:00:00 2001 From: Vesa V Date: Tue, 16 Dec 2014 23:00:14 +0200 Subject: [PATCH 12/23] Update opl2instrument.cpp --- plugins/opl2/opl2instrument.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/opl2/opl2instrument.cpp b/plugins/opl2/opl2instrument.cpp index bb64c901b..88166ab39 100644 --- a/plugins/opl2/opl2instrument.cpp +++ b/plugins/opl2/opl2instrument.cpp @@ -497,7 +497,7 @@ void opl2instrument::loadPatch(unsigned char inst[14]) { void opl2instrument::tuneEqual(int center, float Hz) { float tmp; for(int n=0; n<128; ++n) { - tmp = Hz*pow( 2, ( n - center ) / 12.0 + pitchbend / 1200.0 ); + tmp = Hz*pow( 2.0, ( n - center ) * ( 1.0 / 12.0 ) + pitchbend * ( 1.0 / 1200.0 ) ); fnums[n] = Hz2fnum( tmp ); } } @@ -505,7 +505,7 @@ void opl2instrument::tuneEqual(int center, float Hz) { // Find suitable F number in lowest possible block int opl2instrument::Hz2fnum(float Hz) { for(int block=0; block<8; ++block) { - unsigned int fnum = Hz * pow(2, 20-block) / 49716; + unsigned int fnum = Hz * pow( 2.0, 20.0 - (double)block ) * ( 1.0 / 49716.0 ); if(fnum<1023) { return fnum + (block << 10); } From 347b5a121dc369757a32dbdd46e0bc6ea48985f8 Mon Sep 17 00:00:00 2001 From: Vesa V Date: Tue, 16 Dec 2014 23:02:00 +0200 Subject: [PATCH 13/23] Update papu_instrument.cpp --- plugins/papu/papu_instrument.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/papu/papu_instrument.cpp b/plugins/papu/papu_instrument.cpp index 0b45eacad..8a3d387c9 100644 --- a/plugins/papu/papu_instrument.cpp +++ b/plugins/papu/papu_instrument.cpp @@ -360,11 +360,11 @@ void papuInstrument::playNote( NotePlayHandle * _n, //PRNG Frequency = (1048576 Hz / (ratio + 1)) / 2 ^ (shiftclockfreq + 1) char sopt=0; char ropt=1; - float fopt = 524288.0 / ( ropt * pow( 2, sopt+1 ) ); + float fopt = 524288.0 / ( ropt * pow( 2.0, sopt + 1.0 ) ); float f; for ( char s=0; s<16; s++ ) for ( char r=0; r<8; r++ ) { - f = 524288.0 / ( r * pow( 2, s+1 ) ); + f = 524288.0 / ( r * pow( 2.0, s + 1.0 ) ); if( fabs( freq-fopt ) > fabs( freq-f ) ) { fopt = f; ropt = r; From d21f0a7114b8afccf2acb2f726b2e1df790b8ee5 Mon Sep 17 00:00:00 2001 From: Daniel Winzen Date: Mon, 15 Dec 2014 21:08:16 +0100 Subject: [PATCH 14/23] Remove RackView widget before deleting the ChannelView Fixes the following two errors I spotted using valgrind: When deleting a channel; ==936== Invalid read of size 8 ==936== at 0x56FA1D: FxMixerView::deleteChannel(int) (FxMixerView.cpp:374) ==936== by 0x60E9A79: QMetaObject::activate(QObject*, QMetaObject const*, int, void**) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.6) ==936== by 0x5216BF1: QAction::triggered(bool) (in /usr/lib/x86_64-linux-gnu/libQtGui.so.4.8.6) ==936== by 0x52185C2: QAction::activate(QAction::ActionEvent) (in /usr/lib/x86_64-linux-gnu/libQtGui.so.4.8.6) ==936== Address 0x14d51b90 is 32 bytes inside a block of size 40 free'd ==936== at 0x4C2C2E0: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==936== by 0x56F9ED: FxMixerView::deleteChannel(int) (FxMixerView.cpp:370) ==936== by 0x60E9A79: QMetaObject::activate(QObject*, QMetaObject const*, int, void**) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.6) ==936== by 0x5216BF1: QAction::triggered(bool) (in /usr/lib/x86_64-linux-gnu/libQtGui.so.4.8.6) When loading a new project after adding some channels: ==936== Invalid read of size 8 ==936== at 0x570785: FxMixerView::refreshDisplay() (FxMixerView.cpp:202) ==936== by 0x4B590E: Song::clearProject() (Song.cpp:740) ==936== by 0x4B7885: Song::createNewProject() (Song.cpp:817) ==936== by 0x60E9A79: QMetaObject::activate(QObject*, QMetaObject const*, int, void**) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.6) ==936== Address 0x56a12ab0 is 32 bytes inside a block of size 40 free'd ==936== at 0x4C2C2E0: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==936== by 0x57075B: FxMixerView::refreshDisplay() (FxMixerView.cpp:201) ==936== by 0x4B590E: Song::clearProject() (Song.cpp:740) ==936== by 0x4B7885: Song::createNewProject() (Song.cpp:817) --- src/gui/FxMixerView.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/gui/FxMixerView.cpp b/src/gui/FxMixerView.cpp index 8948e8474..f750bbc76 100644 --- a/src/gui/FxMixerView.cpp +++ b/src/gui/FxMixerView.cpp @@ -194,11 +194,12 @@ void FxMixerView::refreshDisplay() for( int i = 1; iremoveWidget(m_fxChannelViews[i]->m_fxLine); + m_racksLayout->removeWidget( m_fxChannelViews[i]->m_rackView ); delete m_fxChannelViews[i]->m_fader; delete m_fxChannelViews[i]->m_muteBtn; delete m_fxChannelViews[i]->m_fxLine; + delete m_fxChannelViews[i]->m_rackView; delete m_fxChannelViews[i]; - m_racksLayout->removeWidget( m_fxChannelViews[i]->m_rackView ); } m_channelAreaWidget->adjustSize(); @@ -343,15 +344,14 @@ void FxMixerView::deleteChannel(int index) // delete the view chLayout->removeWidget(m_fxChannelViews[index]->m_fxLine); + m_racksLayout->removeWidget( m_fxChannelViews[index]->m_rackView ); delete m_fxChannelViews[index]->m_fader; delete m_fxChannelViews[index]->m_muteBtn; delete m_fxChannelViews[index]->m_fxLine; + delete m_fxChannelViews[index]->m_rackView; delete m_fxChannelViews[index]; m_channelAreaWidget->adjustSize(); - // delete the fx rack - m_racksLayout->removeWidget( m_fxChannelViews[index]->m_rackView ); - // make sure every channel knows what index it is for(int i=0; i Date: Wed, 17 Dec 2014 12:59:36 -0500 Subject: [PATCH 15/23] better naming consistency with windows builds i.e. `LMMS 1.1.0.dmg` will now be `lmms-1.1.0-mac10.7.dmg` --- data/scripts/create_apple_dmg.sh.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/scripts/create_apple_dmg.sh.in b/data/scripts/create_apple_dmg.sh.in index eb77b75bb..508b455da 100644 --- a/data/scripts/create_apple_dmg.sh.in +++ b/data/scripts/create_apple_dmg.sh.in @@ -16,10 +16,11 @@ DMG_BACKGROUND_IMG="dmg_branding.png" cp "@CMAKE_SOURCE_DIR@/data/${DMG_BACKGROUND_IMG}" . # you should not need to change these +OS_VER=`sw_vers -productVersion|cut -d"." -f1-2` APP_LOWERCASE=$(echo $APP_NAME|tr '[:upper:]' '[:lower:]') APP_EXE="${APP_NAME}.app/Contents/MacOS/${APP_LOWERCASE}" -VOL_NAME="${APP_NAME} ${VERSION}" # volume name will be "SuperCoolApp 1.0.0" +VOL_NAME="${APP_LOWERCASE}-${VERSION}-mac${OS_VER}" # volume name will be "SuperCoolApp 1.0.0" DMG_TMP="${VOL_NAME}-temp.dmg" DMG_FINAL="${VOL_NAME}.dmg" # final DMG name will be "SuperCoolApp 1.0.0.dmg" STAGING_DIR="./Install" # we copy all our stuff into this dir From 448b783e8bfac1e1d9537e984ea41f59eeb55ca3 Mon Sep 17 00:00:00 2001 From: tresf Date: Wed, 17 Dec 2014 13:43:14 -0500 Subject: [PATCH 16/23] Fix compilation on Xcode 4.6 --- plugins/LadspaEffect/swh/imp_1199.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/LadspaEffect/swh/imp_1199.c b/plugins/LadspaEffect/swh/imp_1199.c index ec1b35028..05a59c565 100644 --- a/plugins/LadspaEffect/swh/imp_1199.c +++ b/plugins/LadspaEffect/swh/imp_1199.c @@ -74,7 +74,11 @@ static fftw_real *real_in, *real_out, *comp_in, *comp_out; unsigned int fft_length[IMPULSES]; +#ifdef __clang__ +void impulse2freq(int id, float *imp, unsigned int length, fftw_real *out) +#elif inline void impulse2freq(int id, float *imp, unsigned int length, fftw_real *out) +#endif { fftw_real impulse_time[MAX_FFT_LENGTH]; #ifdef FFTW3 From 3c5d940561258e747024643f5ebe13a06235777a Mon Sep 17 00:00:00 2001 From: Tres Finocchiaro Date: Wed, 17 Dec 2014 14:20:58 -0500 Subject: [PATCH 17/23] Fix ifdef typo leftover from clang fix --- plugins/LadspaEffect/swh/imp_1199.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/LadspaEffect/swh/imp_1199.c b/plugins/LadspaEffect/swh/imp_1199.c index 05a59c565..a5c7d3876 100644 --- a/plugins/LadspaEffect/swh/imp_1199.c +++ b/plugins/LadspaEffect/swh/imp_1199.c @@ -76,7 +76,7 @@ unsigned int fft_length[IMPULSES]; #ifdef __clang__ void impulse2freq(int id, float *imp, unsigned int length, fftw_real *out) -#elif +#else inline void impulse2freq(int id, float *imp, unsigned int length, fftw_real *out) #endif { From 0891c5358243f0346636561f7195b2b42e2ec835 Mon Sep 17 00:00:00 2001 From: Daniel Winzen Date: Wed, 17 Dec 2014 21:01:26 +0100 Subject: [PATCH 18/23] More memory fixes This fixes memory leaks in ZASF and Controller. It also sets an uninitalised variable in audio_file_processor. --- plugins/audio_file_processor/audio_file_processor.cpp | 1 + plugins/zynaddsubfx/LocalZynAddSubFx.cpp | 1 + src/core/Controller.cpp | 3 +++ 3 files changed, 5 insertions(+) diff --git a/plugins/audio_file_processor/audio_file_processor.cpp b/plugins/audio_file_processor/audio_file_processor.cpp index fcdb6931d..5b5f1d4e1 100644 --- a/plugins/audio_file_processor/audio_file_processor.cpp +++ b/plugins/audio_file_processor/audio_file_processor.cpp @@ -740,6 +740,7 @@ AudioFileProcessorWaveView::AudioFileProcessorWaveView( QWidget * _parent, int _ m_to( m_sampleBuffer.frames() ), m_last_from( 0 ), m_last_to( 0 ), + m_last_amp( 0 ), m_startKnob( 0 ), m_endKnob( 0 ), m_loopKnob( 0 ), diff --git a/plugins/zynaddsubfx/LocalZynAddSubFx.cpp b/plugins/zynaddsubfx/LocalZynAddSubFx.cpp index ac126c380..7bb7e7640 100644 --- a/plugins/zynaddsubfx/LocalZynAddSubFx.cpp +++ b/plugins/zynaddsubfx/LocalZynAddSubFx.cpp @@ -89,6 +89,7 @@ LocalZynAddSubFx::LocalZynAddSubFx() : LocalZynAddSubFx::~LocalZynAddSubFx() { delete m_master; + delete m_ioEngine; if( --s_instanceCount == 0 ) { diff --git a/src/core/Controller.cpp b/src/core/Controller.cpp index 6d0fc1a6f..671f3f3a2 100644 --- a/src/core/Controller.cpp +++ b/src/core/Controller.cpp @@ -173,8 +173,11 @@ Controller * Controller::create( ControllerTypes _ct, Model * _parent ) if( dummy ) c = dummy; else + { c = new Controller( DummyController, NULL, QString() ); + dummy = c; + } break; case Controller::LfoController: From f7741f184f83e6b9e2f081d39efffb2c499962f6 Mon Sep 17 00:00:00 2001 From: Daniel Winzen Date: Thu, 18 Dec 2014 20:58:12 +0100 Subject: [PATCH 19/23] German translation update --- data/locale/de.qm | Bin 299164 -> 302180 bytes data/locale/de.ts | 159 +++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 144 insertions(+), 15 deletions(-) diff --git a/data/locale/de.qm b/data/locale/de.qm index 5834e25392f6b4df48a22b2d42b5d2dc502dfa72..353543c22e1b3aec37ab3d10b9842529b2afd96b 100644 GIT binary patch delta 18140 zcmb`v2Ur!!y7&85RrksPRLmkODyWzfW|W|U2m%I-Bn2fX!8GbJVHOosj2KZ71CCbV&e{84z4n>C&w2Jf_qq4`W}e~K-D`Dq^;`AEsx?bi6nnI@n5D(e$kK(c zmdra-sr>$aEB4-LOVn~O5mhFBBMGcZboVq^9p`hwMntbBf{nofunE!YWYC@H-5}6| zc+4iSE%AZ&U^_4X^aSUCUf_GshxnioL>A#e^wN$@j1wR$`OS^ ze6uPN^=v_;g9JfVH`zva%mJM9VHlFWhl$7MDim#gBZ}TZ%)-VJ#pDq`|BGm_2Shmz zYzOWo`fVyPjhgtjNxN}XC`lk?UQ&AzWI*X*} z-*7#Sq{%VFtKsu0z9eou0auZ*;C?G7Pa-L8B8i|tlGcpC5F{& zmfDka?I%$Wp-@!Iw(-_*8}Cmb>3TL%(sD4L=uRV&p4TPTKZc~&6@t-#Ck}#1G90wg z{ya$^F$rfUXBZ_%OP#JHSHMU#@*&wViNxuvB-bbbLBx^VFqN3uf#k;hh?gx!a+7OB zU(bU#h`!e$*&EX#Ayy$PQIh2LjYzb5OLB*v#H)NH*$@4?K3AdSfcAouiGR-~xhqDI z7Ly!ZmMl^gBgq3T#7e%gv3ygKr{Kou1cjpYY?7x<#GKqu@^no0xSu4?SVp490g}@k zAkf<+FKkble_`S^Pw@xd6*h^J}VUO+)3V^Z6OgdhU7gk zT;;VS?@c91UIgurBGJZ=fZ+J0a{3H#<{9BsW*fZQ%?mW z!4ss;$9)0yNiz@{-lYR+cf}B!HjVUU?vkW^LniC_%t};zl;s&w>@+Gd%F0GmuI@|X z_eW8MkFcm`lWn~Ai>i#SM~q8g1JI9Ljs+5ry-zMbpkSX`Q;qq~BsM!y4a`lkc?Q+k zEujNLsfKkb1mr0c_PwZPP0ZE2CR7uW6nQJDrey}c7&w}0E;tHqp_+JOv85N)_Q9K^ zx1>5Mf0F8Vq=tn#L?`A^qyB#oHAtk!6|+dR|3QsYR+7*#avuO~eN&a(2SH2U3?TP= z(98p4soCjB63-*31tdtXUQ^4S`21}ywS=VTb$zn5vL3v1r8ZW+&!jd#FjqA#$jkVX z#G_B-wIGy4-*V(V>L~FA@#HiA2obxjkaej{J~>yQ`mW^j7$&1@MQT57AhdNCwa-L{ zhE}HbJGbI`FtsoEMWRI!wf}P@2|o`TgT`8@{g>Z~4f#eLnja?mFpxULZNm*yZR{IN z9jhN9@p?6NtT`UWvn6$`vzUZ)I(2N(2H!hD9d}KI_LZ}7)e8XbzH&fz1W?ZYUb+Yw@Q$|)2ruTsFelO(P! zq@d9rP+va~TJSZEg2uunS$=p^(714-A5$nO7tV2sCk4wm|9OXkYriM@_>zJ{(V-_@ zDLD5MKEFW0h1;NJ)&Iev6#VCK*pEC4350*Dzmh`w%_C7=Z{v&m6fzJVI$@bYR-zMi z4Tqh2vPhwYXM-ntic`+@t09Z@K_FLgJjk_i4r-KW7F_3)z5I#&Jnm}@;C z5wMy<2Vv}cytOg1Ifbr+0Xg}ILieV_vY9CKNCNRmYZOZS6!jF4Oj-){95@YjWHa?r zfz1o4cVjK_avQ1lw{;|`%2FSzHqDQxK2bwR^d>M7Y(o9USY{AEJOT$ZNDMkk5!3r1 z&{;|m@BK-5U#DoDOssDkiitiz?AK0;Il7gY`*(%>;9m-bWjiI7TS5H6F%W^!!%E;5 za1@9@=;1X=vKlbe7)q9`2I~MNV~CkrqGXF6mPo&ohPH&wxBo)J=FB5D$$^GtU<^IW z(x}mkh%dcOqf3Mk&sa-iepG?zpV7E=%}ErbQEKz@#4AM5tiA~UI*+1x=N6LKpFs=k z=fW-wqXmmb!ntmy#XhOT^;N+u#LY*+$HYyJWLfO3VD@Pv}!^jiB|_`_0UrwzZ;7J85{fTcfT4-+!L_BXX7)5N!M=*uh!mf0v$y(U> zPjvK!D{-&Abi7G1k}B<`GtXj3RE?+eJE8xhkI=;{uxx%m6>{&5bZsq6wUh_KR7;=f zR+~T)y<+KB=Xh{C-Dhbe9{SOXZumUP;!1CS^C7lqI=vkQW~R{F(O`xrz4z=!>|`JM zvNQuRY%-%#9npbtOf&TxNe=c*8(u)dKh?$%H>R%+Q|o+;8GaTczM&s87K1u&$YsWM ztw_}F%8J*)oRSVPhs`yi6}=S-3wy#!r^FLqyq=YfNygZjS%p`HM5S_AWv4PE$|kbP zT`mxdKE&#DO(Xt7Rw#^9S^Z6EL^r3fCU%u!K^w3p3B^b(S(DcW|oHK%dxTFQ`RXYm_*N&tn>2j#3wXWC{ZUCP&bPhEn~s*PhyeNSl2f{Nh+Sr zdX(5itX?e^+FU|AMK*>dvwro4L;q)$XZ;?%C$^v`3$xDh65cG#dcOD@i+OjMxW5mJ zE3=RIx`k|r5u)7qgAHq1m!$H)vk@7Xbp8|ANHk38E!l6bcEq-hVHQ0kTB9i&yA38h z?F$GKKD#cPcy|m*b$!^(gjU2o7)!rwNg;7=3dSeQ1I??E$2Ya^!Zv0FUvwWD`kJ!aa?CS{=Ni~g}nsy{H z=Mm={D-fSK-^R2oF2WjMGX3J(sjzU>A9MS)S4isGl2Ep4~ZwM_?VFxyED!B_$_$Doiq95(p8DiUdksAc|AI&)3ayB{8K3UzY(+{l?eLwXz0ZHy@mK zny-Jc6O{wO^J~^d=C+J)_bo+Y1cAW6T8zi6LIbjp#xc`=4q{3QPV6eeA4CH}E! zE8Oc|g+i6gzZ^Y^+QTWqPTnL@YPCYCHxnWWLuaqIv2%ZgQeaylvVIbG+ay#yvWd+K z6skXVA*Q?}ib=(xO~ZtP#WNjI?G;fn4S~V*08yrD5iw0WQ6Z%Ri90() z!Yff#-wfr01EOxd)yQb-in(eMIM|7{?Vo4si8tQ0KbanbPo928i-iKZPNpd|28 zG;>AF=iFShXo1Q5=WNk>EFoX3XplA#ULyOETBBpv9A}1#? zC{`lgd5(xJ>xlBsOA#CWjwt@ULRS2;h&@&w+ObU}yv6lFWfU^|h9V{BILcWrV)(*B z1R}%5@MX}dNkL-xesE3)F)BNhc$Vdhav(-D6Qe8V5Km|&M$bo8<(pZI-VT0`7h}ew zDzoIY81o$JHrrKrN@&AS+SRZ^Wj&vK3NjXs**^9_$LV-B; zLY-0(d>;e43T=Q_%#55O|RLK+;#yfDqkg44-52i_7q9c%NYYDeM>?7P!Gv`1!I#` zMzSjo8$D!~RIEo1f=rE6BDg*AJ5MEty_mgE%Snpb&U`9W$e4H;ZbG5qk<@G)3Z;vONX=&V zLE$r5YTgVk;>R(mMGKikyNWh;sUvw9U?*B#le|4z5k1S2I&PGSg{MotXKs*4uPt?Q zE+WxCTk13`8TCz9sndA`sr?-#MLm-~N&y}367#5`Q0QVMi}ix=4wC|h)F!D+fz)MO zZTRISlA@<66{K$4?vN@{T5)h&zK3qu-KKeae_sm zL}^k)MMPBNk4usIP&lhv(txpzh|g*+MISgvEXBbh#iafQ)A>poI1)V$Zy*g)Api;g zD8+t4w0g`SC4T8hWQdc7jfp~ysD(6a{83_SRSNlsCJKdlxsCo_3MJ<<(r|QC6!nxw zEJ3i^=ADfJLi$aYLE^$HY1A1F!u$@)qzUe4N#sA4Cceo+)O$stFbucRcak(&4-43* zr8L>clc@iAY07XInh%wvsWpC*RC=g1En^L_V*N5wOVzdve<)4cm;yuTWaHQ@Y5Lm5 zM6)I;N+kW=QG3jU!3Cl@@f^g9OaU#>2}L@_G9eiXD5TWzi#v z9*9x3|UVitd^9U_77q_%UUJ@p4 zAC8D^1FgP+_ys^E1n^}9(stxMIY%)8-aD3c^_#(N2(q-#~k?K8RfQQHm^|hD2VfWo?d&5kQ$6ImzHmjq z^5uGsijzbZlia|r8Q!qG++dRvv5#X>E02OV?H0$`54M(D zZ^j(?D$8CYHxX@pBYWrdK?%xaWB7KteNzl++%~!6yw!;KViZcf4$A>iKZyk&lLIsN zz(-b*0~f=vS{gl*1AoFy6qb{_-1LW!`XG1JPD2V9BZnruCbnUT9J=l(g5f)IuXeSG zru33~dBSj3pCyNRVUcJ`O*!ml4b-fH<*-L~#7+;9!+uqQy?YB*Cbq7D93F_sZXF6p zfhf?d%a{A_fB`>IT^=wX4Ep~vO*!B%zsS)XhNZ$RIoiDe+)JVf)8KI0&tgy$!D_(_b>xgdFT0$fT&o}B6dU*vbl#$b1O(jcf~ z`F-*fUzFtT3|7dpFUwQ%kUV!EA{po{?95!;rl!C$H|mj`)Wpg~EJaq2wGauh~74MC25C?Q~QHLYvzd zd0oz(jm0D9lk!GO>pWt+_Q`qq$ymo2Am{CXPa8T^{yi_Ac)ert*27sui;BzJ$~q7$ z6)W%DRTVMm6C3AiSX_p@=g6NVR{bUK+YhbSitkOSY7PkV(BPnjWGPKQEdTNcP?Qv8YPtdNmm5u5*7zUmIcqPi?!ZPAEG zzf~bCUD8Ik1vb{rR>+6?Dip(gY$w@^!grjfq6YB>4^O46k4( zzr}(z`?|#ht6Kja@*alQCag;IBS z6|MCr9vG!k^*M_?=7P%b69y!@t4;xhV z7WW~k@f=m72}P)7e^WL74Hj{8fU4O5bm+)wRkK%VM877fT71NVJMCAsbiD~XU{ome zid40hdJ?OBLgn!;4Enz;6$j|qvSX^Yy-~GWt_ClH?N#lL*1&8}QYbq0urYX#jjzL1 zKC7_6-}Q;gw_GGq;#HNedl@*VLn^+O%+xeTvS>WX6?|5nIJl};;brMdEgHa4_w(w6&->&LGwx# zTO4jUP_K$>`-XUAMOESeM-rw9s-#A{NZ8L*jr|aZMz4%A&G-ft|Ux zUNx?|C5L#TUNtUH5IdQzN)0H5+3u{6)w*S4oliD4uBw`3&G?3dsV1kpAy}TJno?yR z7H;ROW_V*#B_34Gh`vN(-A+|{#!FNKTdC6Lg45TkGS1#0DQK>0`FyBvxe}`7xwYXl zI;xgitOpV9s+GC$ZiZDLdZvp}WxGE`aQt1By&Zabql_wNCgOvxKWyxqsmj&EAn6~e zHm0{C?is1tv=Q+_SA!~VKb+Lh(W>8@z?;r=w=vCIwQ~zhb8_%M_?K$WSUjimBbDX2 z%UG;kT~{4Hj9k@jgX+Yq$tWwTRVPazvx|09o%Fo{!_h=_(GD@-@X4x6Y9vxUAF6KD zpNJw`bJZ^+e_8kWK6Oh?^SP4w<4)UG1aFhFmQpdRG)u? z#3m=Ge$@R!%;0TN{ajFon5nm#W38I;xoUX`EZ&!aYIWjS;w^WnH3M*dtU#?h3N`z) znp*b>!RPiXYJ+uwM5?d0laPSTovF67mYzHg*%)w9UDgQ!M*cZ<*&bOWxqMZZJKPq< zy83Es9Ko9IQOM6({;(ZfKdi2nh;aGn7gL2~tb<@!p zV%K*N@2MkxYcmtDozmd9CC_Y#fu5P{UAWW!5?eP}= zd!?1>-~n~pKJf3W7+4u>t8Q0)8X}$p>JIz&6W!zLj(Lp`H*`|_4}>o$RzsoGb%8oy zFXD-vE7gJ4_Et>*)5*eC9Z`3&Hn>^_(co%tb;!C7ME;i)^1#z-YXHL3p6Z?(;hf@J z)xEmIutbznhn2Cq(FN)-YlEvNgXrMu6Y6kld)ZnL?PYgVN0i-1;$4zD;sTbIvSQTH z-jL+48|vteT@n93U8;`p@P`_`QOEp_5NTwRI@a4nb@zfjQT(^3k=4J+v;O=T462whWc3j+X$yK6f%QBeXREb#A?y%W06ydYK~K1 zZS94iGDLlIIHKIw`)qvESA9Px7_s6v_0uP)Q(SjYKhGKulboWEmD-|yk#+&Q5ODh8_95x+qFZyE_3!?-bDBi%BQh@Y!b1?h+$MQGITa9?31jZWB+ z_;y~STmL&rJ@;$$_Yn3kxTvw{??E4zBx>y5L$A+&(%3h{jgOr*#dpGx>~E?mz87Ba z)GowUG9gPNO|Ltc10SL_eV+6o$xx&T|CB`HmzyS{wTyIGrHS%Frn6?U zCMp+(XHYd86WVJAdLqM#ir2(7oJRcn6;1q*D_Hr>)C>)Ji2_X-%_!e_D8yueABd$^ z)r^foBz5yI&A8&(kmyIvxC$Sznt$6*Gj0JsxaFalAR}XGm9Cl4{0i0`YiLrPQFUL@ zQ!{DVK9cCFX7c5qM6LWaQ&wRGH~gYzYETv8D<)~Cw{M3W07tGm_lN9 zf6cauMI`$5(`+Bxkwnd{njKC15j*sUX2-Gv7G%Fknq6g~uf{r>f)VSnx9+4uUe#Hl zc$TawIR1qw!%tK2xDSbzy)=6QFejqsX!dQ8h_OAI1L>Hwkia1<8&bK`nnOE};`4ig1@xT4&2@Em18`t!q;mUaXw9#O;;?{LEYU{%8G=>2;@apAwTZ9d3MG#p z+Ceu^puOp#jcxh@L%KjaxYlFh>4Dn8t1$$xMrxD2g7E@vwZj}?%4^wKlmi|yLOXnJ zI!x~+?eHI~QQ0Waj#?ECTYptMc6uw~8+$91ynMCe+>x>ks;ixtx)O1Jls5J2KBC%9 zwNvIeAl&Yzo$_KCiR)vuGuy(XceUpQ?11?~OvCy9sTY9E_!L$ph6Y*<(Oc!(ph>KWQM`meB{_S$#95MR_b zYd`n0>i@cr$^rjSq)^!PwXw6KLdl~*`xRdl-%_>TH{Bu%&(;12fhBYstYc^Gk*sdk z@kfx%4p*I2Wh-LFRGst%iOHD=oi-UU#VPSGp>l zjw1d~U9GFK6l1eKR9Ce;B9!M-bX6~HL;C$gSN&cI5^L7zYKCPYvgxFA3m8oNTC}cC z8k~!pudZnqq}9Pp=Uy=t6%wIyZ}STKFsJL9^+oKsKSk$p;2^QAncyMtl&-Da5M)|f z5W(s)ADvfq?6>7lw(GnnjUb--Qs;ZR7tysiUBIzI6buV>UHaT5zOtS!C=2IH`{;sq z^&_g3qzk@gM_dlob#D$I5N6PIw=NkKIqQ1YH4)!&UDqcgirBcZy1s#BNL)Uvi)?{6 zFXf_8JPp@H?LsNHrK7IDr34;4MCkel&qL&6ryJm0mAFr`E-ri%i46|ABo`Bw4}a=X zN+S-Ka7H(5Ec}1xVBN5^j#$^|tsB0h2IfLB-K0ycVVLZ6Gjy<&FAgbW`u@5Z)hnT- z6ROMb9!R2elrGa#hl1u^g}h6=&SJeFs%%y+h#J3i3#LJBB6{l(c3Zd-JFcETXs?5*2V0B6J2>Gn-uMXd8T zh5S$@-M;q+G3!5o2uNbq>h>Rm|K8e8xBvcI7?M}I{eL{bwt*1cf&GwRlMA{-JMg(f zqVCu@7i>vO(4Bk?2|Z}3D_pw?zQw33%+JFM?9`o_E0fq_anPMQQb>~13*G6C82cM_ zb(cJ^z&%FjF5CGd!g;5=JYy?FSE#!_9d9c9bvHMGF(Yh@o36Vx4h_3+*4-U>7CSW# z>K^t_CH|+I?tOk1@vld8@2~AcTArf&FxH9Kg&5t(i3syI|DhKr3*i5&Y}4z;UqS)l zh~9)%e45@&Z-4ha32Lh^RuWaN!fbuHzAzw5kLt_6#!$_Ar!S9n4l(fxc>k<)s_R`n9ih$-|Z@ruTJ)+!)`Uckg;1KDXOr1-jYAL<@MPyE~h5BaL z|6t)hTlC(84-ng~*8A_kqWa!8`p$7h*pYQiA5^^~Zrq{|3XVqr@l4;-?g|>%uJ3j0 z3O-LzDCnZT_X7kfZ8ZA6`}+~^GesY92x=MK)W+Cm`Y10>eC=#~98xmj(apwy0ahaZ zA1?H9=V2O`G}9*;gOL;-*QcCphD|aX^i$3|5sxdWpL!n_aE4w#-5Dmc%oF|ebd*%) zx6;or!!Fdy($Bg2lO#4yKR-Q(#ICveg>I+^^jM=`vc-rZbX)zh){tnwW%_I^%us}E zW6EOv+IN;h)MkF^bJF(_YgbOc!Gbqlwpzcb>mo$KC-hslA=vz*8dw=j12LQb_z1$X zJ?Nv~HVd0$>_YVg6MAB$r;UEklrGp65UW3QuRd0K&)695sz0n*NZfQsf21kO^yQQE zN7@(Q#V_iQSrFSXA3y!E{HBQ6j_c2mBa!bI{h3b)Mk^fFUu^i8_%DP0QYJ(jTU~!C z4`cZAFa53hu;pKR=x?=vTCLisP-?qW|8ygK$DW(|q9BB3?$h-zdO(uPS}SDUt_pdz z&H7K)g^n#3^_EYsYLd8kQ2&#~V1+i-pgVk&SaDy4;%OCwQS+F@(hP$=ayUuvZYVXc zHqrdb3R&9<3We^WjXt9dzPKM_KGuV8Sk07+z3Gt}t5oH*-is5wJNw7kATUcHJ!@mghYtMUnX!V-nd ze!syjGLppNGX}T6ULxjW2Df)bB*Nnjb<4vLRd}LM>NDCH|sK8)E4C6AK6iPea&Ltc-B2Awq>YQu$5BI%PUE-xD8jh5~NPPU=aMEro zYEvZ*C#Sqa`d`6N_%)6As6fN1$3evZ`e8UrH<7JRHeBkFg3K@5a7DS^!Ekpz-q7W$ z;Scv|Bz!;H*yXn2k2{D0CZ!r4J}XONMis-eJ*!BZ`)qj8+hRiWy~^Ha0JA9JkzhzRx&uv_H1I6f;f=!LMqx zON>*4pk&K$8K=*>3?CM4oIT?x3A?olC9l`UgdKU4Nf!BxMc?dsX4QZTdm88!*&_B zhu$F8_@QyvAMr#!H;j8cClD_--gxLI;v%n>#*^F8&Iyz8eBdHf^)fpfFWk6GEUB~c z%2aovfJF*<*J8$N?;Bt_af$JUYb)Xn-Wl(UBIxf+qD7Cv~d>%R#kztJS)rK)7297j-U6hJNwP_|+@;-?d^G)jPM6%H5jVAT+ z0AiQNf|rTgCz&)K5g@JYVA3IpmfXIW^s`qJ%RFz=XTKvpeTPZ^4Ciynq<;l2dSWtL znqgIMtI58EwP8O~@i9=h$@fjAx?q>{@OGwB{TWFj-c&k%4DsO>Q|X)-)W{x~$~rnC z1)RU!dO)o05`{wF+eV*HCdZQ}Q7n%zIo|k5l+wynsXQi4-KwTaSSH}-GfmDd;5VuLrC zTAj4Oa?h)3YV{lqIZQBlDmUIU`5b+Wec2C80eK5i-)w9Oe9($$eN$5x&2SXm$rNIx zp_!?hm8N7e8dWu|@U4L5fE@~@ z-p5UwT8}01{Ie;q#S{|e;-+1$u#m@I*?1}6v}emfsBv}E{w|mU*LRtY_j5<7+F)Z~ zdDDpnXG!wzY_goQy9@PmGhOixBJpdK>1H=fvb&c|H_wlR@2YIN{X|PFzKQ96F}&H4 zs-{1RpCx|EY~z*7riU{FNIW}ddSqQ(tJ===_&p-S=c`Ol3lI}m^)~&P0jD(dmFbxP zle(IUioxU$4Ko#$0uxVIOfRga^3Y<_+n#rcS1d5Se|wUs!UWToiHN@AHKwmvOqW7$ zn7K|y)Zg7~7}XP7?AqWj;=wb`O$xg~UmuuT zJ9fa*QERiuXQYNX9w1V~obl$i-H{sR90rjZu9wX1J`6y}dCTm1u@$yMMVLMBFeF;H z&0fXvpz1Bm9q!yEv9YGPW6VC(KTFv-f2g_Br~(+QuRqLz)(5Qj0`Y+LlgwSL4_JR3 z!~=3Q=8$TrbDY^|?tT$*PmA{EP-6v>D%CLe9FEm|wU@c)hV>+=PMLc@L|&9z(cDMt zg^KV~b3Y>_y4cGcW^F&W1Bmu>r zm)3wO4IN@*RA=+DzQ?g&p^AB3#wJXj66SSt!NlLp8=LrIt6P+Ln-*H2-DBQ%9bWGE zpXQy_9I?yU+k7ay1F>-x%}4z95v}kwA2Zp*3!X4vtPL-_Ws~`8PG}1}_>lRAFhNvb z%r{RUy(oXr{KwjdB<7VjKRmV-yL_ISAFUcgLVwNttZWCUWuW&h1IqVOxWAPS>68ceYiMM>mDL%~EENgru|auknW z^qHr zi2ra`$;^XCS;fk-(s%23iYrI|)o0I`u-JqF)}Cj~c~QCk-|woky=!nxT-5(|6IHXm zZfQDU;FAP}-u6g3f|8G%g{W}Lcd3O%+_p~;o_e_b48{yTze^f;B zgdrPt4B5cW7PEI~8x|iK8xt3k92M!*1rsQ9$U)|`1&s;VQ!r|cy{=I>-2x@bL8KBhW!-W2GoJ%R1;p7sZ;G_sI zDP{2Bgv8{3KdKG?mnZ#mdWE4kNq9&Yg`*Gu{ZW><5z4cYl!=s(k~}!&KRl}qb;NkI zBVXm6{(0Y( zkNF#u5bxw0^B+1;8;&3d|5~SOXSgEkRQT^&6a;}MDH;^_udmrTD9FjB^WdoXf2d2) zh@|8wtm|9tkmY|WN}Io*^6%8-|I2fotk3iyl6IVdVQ8BQ?C hseeMEQ`LIb_O!`i;s0V`+s$d}?L#%NBk_RJU?*@I*cm(kb^*VE zuEa<9f!)A|L>AGJs4$C2bSC<*Eto)bED1bBbo>kWo#@0?BB?0`XbScL^S}TMP!^no zb6;>8@lUJ3c{pDU&d2BLz&P*^xEX8(?jjNV72J#S8Dt^p5V1xXxNsU5j)B*S2UY`r z5VOZa$Zd#*9#$wW;4S5z#DltnCy5F^5UEwfXg8=P#_EGwVtg`)7bHIuM+t+BZ|67G|+`e*H0m909n8}Ykp24 zpMa$pdWLv#35CM>F;Ota{?nW&B%Qb=2h%a3Bc`wg*cqHeG%J#rlu3O5d19WcNYum9 z+^7g%1zkzFVk-ZeN}?NPuJ8{DH}Jn7Bs`zs^YP#Za1Dvokgc~vNgMz_^d<2HOY-3w zNdxAQ=-Ef1MfCR|X?Qc@RnL$#atbk*n+kdLIwS?pB3?}iB%I2Z<{K!7U_a zU;r!Uz9A`Q0jB;SNn2+SA5)-Eg4{@{H%a_En548&60KuwbW0>D;{j2>BP1P&!1~X> zZ#^J-atYjo4_YZ?Wrr!`MY}-!ARjk8QWL@onY}3ytvN^1?LR~VghEkGZ{yXsHs*aN z=}rn})fddb?+ZzK(}-9=6_P&q;P=I##fK#JSh*mnK9Kaa7SU2ilC}GZGzUm7Srd|M zvT^Vyk}G3r>g#Q6{EOr&lS!QaNpjuN#B0bTH;W*q&mp@JdQ>E4_~tNtXr4a5?}klX`Load%c(k&&~Clo@68}^0a_`ygHu0WD~ z1CmEsh?UxEqy1Zw7pGvHuOu&703i(}ISNugY9GnbNhJFGLvl*PczIw zAPMKaB%j3%Cl!%u<_x0WUrBBBg+2HJ4uCyqMrt$8c@e314u^2J14n?fEu_xC4|}{M z&8T-oz1>KAIE2{3(WEc`fW+StWU`(|aw-+}8Y;7ZN-Jzg6&t-Hp8td@e}!p1Utr_4 zK&m;rG1TiY2y6M5k;A!O#7A}|hu=`;&qY*sbuAJ*T&XUERqU|rp}I#Us98O#YZVU9 zK!rkgn(Ebq^rj7>dYDR)cAn}*<9l9Bs9r)AIFjn&jm6Gza_WXRiK#*jRbC|38AZ)< zwi9K!Q}dC~^`?`kMb$(SodT%El+7eq5IF}yecu+4^Ju88O=*?Ld6t{V-~asiHS8shySYA5aG?KlY#wzkNvj-b1cN*nomDq-Q@8DTB=&ewx91O`{}I%E$td`r@T$~39#1ssHg!L=4<8(% z?nnNTXyHxWU(JNENwu-Z3+i6Hm)N*;a%*#j=u=g48@nIhe{W;|BjjG^EQuH8$-Uk@ zSkt!T-f$g>%HPS|r2`3XCvra=Ni_bdjnN6@u{j+2eOyoBPLh8SDrap6hiHd(xpYY*C zKiX2CG zZ!dVrCY#B37|eOKi8emrO8k?CYn;H1PdjmP$<@ziNh4C zhvCtTrKxRU+l?z|+KN@g<_(}}aahB)b17{0TH^7YXm)8|;!BM*=XXsK*(M6#)`mpJ zK8k2liMahwS~heAQO_`1bpM~-J^JpvU zOd@U|ZF@R}`0RMvc^}1DmUrsA?W+G zx^z7chOEaQg}jq1-A-)`pAZN(1$WWi4!tZSe6Q2pp5w6QmFN+RA#vvvz3qoD_&=ae zv$_#mJ%&DofpLB5(`;~AZ7S;0kJ#C-RJ}+XAqE03&)evv|$AOjkw;u5cXKei0gV|3R z2fepr6+%L>cFkDj_c=u6wzC@5%9AK{ht=qPjac9`*0663@fV{N3e|hoWOoeF?Y69? zT@7MmU$K_sOOjX>!<=VlkjU%CoEM)#WOSdkv8)|OR0{`rI-$$N%@vuaN z;>&5~-6#=m*@yYae=xJ{S>KO;NYZ36%Yf3mi8Xl4{Mtwu$lFH00yfP00E_3bVb6+) zt#o1jRw*|>VE)$g_sX{{QORN^|D5eK1jugGR% zT#EU`W;xms`?oB!=rN53oDVObnYay5=+FF?>ainE+u5Wcjk>{?3)64(2&yfsyb z%6wvZyJ7pU9AkO!%8=xCl-(Ivmx#|~`K@4(YFX^qeYp&Y;buuxOR>`90Sw&&ph_<$X%GuCG7Edgyojf?D=>s!Hr$)Wg9F}sRrz&^?^0( z*sIQ+h=#zpL^WzjHV zxue;S3nr4PHQ?0BokWy7=esHsU--+$#S$0(O-ZEJ;@U`9wwkkfiPSujJO=a1rwwq^ zZoGP00}^GP@me+giNCE54hQFg6TyezB(m^#?YKiGOzX|r3MJEW?r4vxU$BPPKfRyG zH(4Pc7t5V4-6S?<0B;rt6a1(;cRra%VpJG!t*=6?RYl%rGV;L^Wq3CWgssy;?q>ab zTp8~D5Hqk+@ZRI!V#coXp$(4{#oge;Yvx&qf6wG&ijb@Itjxz%dw>}5KRzj{Hl#I$ zhi=az9^=NRXJwMOXV2%%#8O=t%IEEICb4fXUu0jK_!7YvO?*Za)W^n6Fb$Ar&`)SBjNH7Pqosc1>d&9kwo|jzAX-%@6Wfb1m`X1 z+g5`Mn(!TO50O|A!ZYeQ5o_zi4|tR#FXpckW=z7& zPT?mV_mW7g#m^QZ3n~}I&!2iiY^pD}Ty}0pl2dh_+X8wWvytbvTTWt5sErZCuN~b@ zyyXOby;~|W*T)K(=?uTV9nwAaxI$I}*NeZOxG$lIbSe*!_}1sq1hd68{i)>?%|PQiw%05vs?B z5i{-=C8bg@!It%+OqWuhYTPXaNIl=#bogfBF6-m+tiNOP6h%$DH!TCB8i#$b0oeo6Rs)^BKB;p>9 zVoZf9sNcL3V}d^ujkb~5MT#-!DnVu{i1D9rJ-C!YW_&HCY(Gy@_wHi)nj8ci55)8& zXp`lzn0^9W@~;R>@q_*+47DDRn6y#MuCX1Zl4LP^HOeL5&WhOwz~Y)>&b;Nw*Tcn} zH&COcIdZy(B2rv~(@GIb&O+GE6^W?cwNUM_7t2Fs;!k`;?Ad;BN)JUs&Ev#3 z99Af`>Ms&zd?p@UTWn}#IZXUhRk7jxWD;wqisUMo!muKd>;%rr70KV=s2EN+gk-Blgr>f!Hrp9I6EAo>NvF=?J^B>byAi629cZ7aOnL z630Hm$+=G!XB?{&e*{__YvAB0E;NQv2(St0A(C zuJf=I*Tp5v1+3{=k?YNI-AP>e_bG{_i{hFGV#Xmk;#%5#5{Dm(8!cWVeHx{ZciJIt zry|jLw-!XA^X{Rr+*v)C*isVtDlqDp$oDu&B6O=L$c4#l?jZ_pEkGK+Ox%kfMSM*s zao^ONL~N*dR)8GP&Q3gE1%vZPC0=cSa5c>rh4-!JL&Tdki6qtNC%(Ug;h`7eZx8~P z0j`qVDS>#|SV>XG=n#vf=;LA!N#9lwKYBtk=V3|4SR}hrFv+83C4_@TxRpy$^E70XDjYNV9ZtBraW$!Y*qNzR#8BJLjShp_3MT zOl(H1;}Yuu3HgDIUEWBG^ssn-pQOdpVNgEak|OK=A<4K}S`xRFn7K?`UO6YrlmuzX zt|<`yJR4{Ck)l#j@Q!v?$ZHl#F*{KnUOH1+k!-b3#Zv67a1zBqQi5A15~^x8p7c@3 zm(^A%_CA)9f@h)}*+L8pE4Thg&Yofb$b z229w8Invg{e~2c_()NivNchD{X)&MRm5ag8BzDyY5jN}^3KoOb&wqef;4kpIl(vkM z*j*2VDDEBts=yVX20RODkvQ%Ch65d(SY0VCAqPe9HVTDnzKx#tHa=b`rM-rC9ydlI zD;Y1P{j{E!QOHWVNIPd9K?b-|+L>_`{F*{agM6+4I*-Ip?g8$rge**M~o zbfA=_6Aa*a>A-YEWT6A41Iu9WihQL5UjvB+*-4of;nP~>NSWW9iOr6dj_q?G{(hx& zJPS^*?>XssPA;)BcGB^@mBeeUm2&Qzh_<9j7hN|KeaVt8r@SNH__vhXqym&jqmWk* zk**{maC)>rx@vJa2^UaSx@~DrBD%kHhZ@5t)dZV>qon&?P^;cNL%P2p4NkEtc$dUj zo%Aq106b@MqRc4imv?8-Rr)pbDFUAX(ytLXKi*KL zzPk~vPmtL!M*Kk)kc0kU3DhAHK;)+P@5=He%*e~JvNjYRVe<*uun~#W^wJ82eSO*3 z0r5wcJ*G`UtI zxP+rFa_#hYL66gENPAO=p z+&m#S@__3pt|&Kdj=<@QWxm|ht~K8Dn%s1EHDaIaQR5Cok=r1*ybBhOmRsIO5$$`D z+-k>ZRQZbJ_Wwdgz8;ZXXYM9S-zs-aA3~ycsEvav$=zFFNrNiL?yHhX*j-U5^?E9M z2mT?}YnI$AJ`;BBj@)Y<463C`qTK6G7u2Ax%6+vq&cOTZf7MR|BHL~h9j z5QUaxPkH1)1W;#s$U#9!q+S*&wD4C$bF-YT1CnewjUwZ%qUMjXC$Wo zD^KmHC$V>hJhlHSV)I?V4CsHm!SeKMtj&eP^6c?&Aw#>%5gp-sx;ohCnItb94K*x3 zSzhch7}fmR3fZPH^5S$P!To2*(U;~Sx9uUvbj=`ftFF9!S{0Hijh0tz+)ez%6dNzK zmgA$5UUap{YY0ws?ln0v#}YuIsG^)y3R3%PpuDjnoM*42@}}Od2!6N7n?5~xOMaNCoyX+MQ@n^8ZjvoZ!W4T=zU2%9)F)dYj~M*ax9!tJ-opU@a&U)|&{ zvmc{Ic2oX(J`yo~0QyKoi;3Q|OO1Pqax#o^SF*!n2vKULZBwtl3Y&fxzmsFL`gb+U$tg1R4G3+_D zs-`PiN0G->b*5$!FJpOXJ1F*1In+H!yh^^R-t(Fy4w_VrW1;t-{8f$D4I!!C9#!-C zg+$t)sur_g0e4JMwGP4q9dDv){XT~1R~wbfSKQdGpQ^260rY;dLaEmRReNb5v3j#r z9Y6aMTQ?HKgRM(dbsCJKn`PZA99$>1-ci*#t1hJ6L80h+!bYzeHa@?t>b7MxQQsFT z59ji5&kib2XD4EHqf}l=&ZyR3QuWlHM0+q+)$6q*@$B`gUe+6~9|huu>(f-dyF%|D z4g-gS$H9s4{|}OJFbNm9s<-ut*1rMqKpPsU`m7p2{ML0@-GQtU7DuyF9)u;r}DQ4R~4)Ltq-zc9EbeSH;G?L$$7|Dt0BfXt63THyG8KbxrbwuEvlUxOnj@lp+^4W z>!z~gH(7wJ{DbPQ^#SBgss}4ErDI;I-udLB2^OIG6dHmWRe9B?OYKN%+(h;5MJP$# z%&PCRFjMpQseU&qMtk9>>Q6#L*!YraZfzC+byLd|VZgptRjViE5_j&U)&$}F%y_jf z3)*vkom%$|G31^f7PZ0Jx1g75I|+%?($8u;Yl*0hgN^R3)D@~BQ24jGy25}&lB!ft zS3HB5@7GJUH6CEiCo1IG-E6$>sQzaXqTbU@)phjNak6Z5&r>^?ZlZ26Q|k$14gtrSQ|gu*%cCqf zL)~gN*0#1v-NrtPMD9{`n@55~i!y4LeSMI4VL*Ao}1+wVUG%lKT~ z@e|x};xI54+@$U_1n%0B_yh+vh$YojcdoMpA=VVN+ldp%3G) zu2Awgr1n0B_+Wo)bua6HNh3fEn3SUKZ5=S_1&HxB)=~Rzb0hM)p^$ryP+Q{(CW_Sq zcfr?$JWvnnkHQHXdP(hH-s%?rsQs-2ZVU!7;KuFh;no2+7J?XXQ$2M+h2tb%y;28U zL(3=riaNL}rt(*eI@le%GVYgDhjjFU_H0#$>_wzA%|Sh;s|h=XKB>n#;oLu7J?$h+ z_ulpD8T#7j{CHZ4!bvSpb)?mc1r1WKcmg4b^;gK+4OFkzBKGtAsg94eZWkD;UONgx zST{qx_V6mysB_d-cT8(@)hA2BPOR^xKG(1v60I2ZxhD4z6~`%Lnp5g?gP*|PS5}`J z5lK`pTz#v(E9#<0)dkZn@cV_eaA0MY`q6eD#C+-MmoHFXxS6AVlQ<8p-th`q>5=NU zG1s8SZPcF@yAoUQpZe=!2w6r)^|vP2R#GZl{VnbZ(conYnWdik`wjS#jos8gf?gB9 z6Q};II!!EejQY=xpDPK>_0gfBVy{tu z#t*X&Yjnbn#79?+ZpU7dydP@x4-vkv+y_D(6Z&ZEilEn*Drrizw*D?(Q|b`x$I-W% zQpe!T?s#d+=dUHHLOD&q#_lc(rSe-f4aVU6^Dk(c1|wex_EX4A%{0woGcZ%NG;IpdmKgCs z)2-ne)XJSS-KL{-6zgfx^r`|AyUtP5N5F)3Hf#E{fDm;Zt?A=4hxm;@8ef(Jw;QIA z)qibc)AE{rx%fQ1sit3XDlxfGGw42KpzywC$P2h@uG0+vHW{JaW=%kQ8E*WjCeRfL zOVV3SU>Xe1h-e#wExR?Nx*${WS82vJTY_k|jb_}$JYs`-Xr}gghaDLfO_;|jG)g7# z3$gG5&D=mlNVhj?!b_!KO4BsqmA}C4GEI1b_4-%Md>M&H%kP@`ZSr7Zmun(wJ;MuL z)htYc_I&lwEV}uJsGXN)@fI{zEkj0WBKy=NzV?kKs(WWRh1)g`SfYt;1a~_@(nMdu zK!>hqV*g!;@<9#F%G_~?-8yUHV<0QDnrY&Zps-E96$;HM8@r8EDA^ZlHcGK1ww}~% zZMTWonwH>ZFiEp5G6owbDpu6&+ItvMX|GBDK7!cre>Hoq$Y`3q2B(mSyrkK`ppe9X zbD9Hl-C-fiYYw&=M(p?u&A}vOI)V9`!xf;W+Gm<0Gj?E)+Z=_wTBbtr;I-z+`C_8w zOmpP<5Ln97noMuVLf{I`@tqPjPW+juIT;IS?Ke?#8eKf9cu8~mP!@hLTp_PLMw7Gs z3*75F8wdZR$@zK%-40jH#eh~YNG8q28-r2n%C^xXUvsr8W@y-N&Gnyw#G|@v9&JIO z(r3Nq(e3ZVKOWaS>G_UC`*xaVV-f%J4>vV0o@bD#bYAmn04lQOKWctQ!zWBQq?Oiy zr=qlmT`(Y_`?RHvRzsDft#ln7+HU`8Yb9%m>UYsPwvyqz!nJi@KSSf?g4U_|IAYa* zX`9wTZh7LSwnZci&X=~@Rtxb!|BX~AG)=XwEVv+*%hWo%qpjC zsk~HQ+rbxaGGL*$Tf`cajQVQbLIq5gAB;X&<$WGun6_u5cbAH2af?X)Ve;SN~}`Op&D=__Ml za&Ks-|4t_Uw3;?-%W&BEDDB*+cEq=yQ7E+@tqpfZ>J{`{yC7mS!uUXoHsZ%|BBxf` z#Vg7X@BUu9v=eN&=M8Pl+87ci?rLK%K`TmWwW~WdCdnM7UHuv+`Fw3{!biB_?orxx z+aXjR^R?@aVzCRY6vt_$> zPi!=7wzEPu=cRVf4orE+2<_pj6|nX%wTHV($OlGik50=adevTg$^&cbb3=Q&U^DSo zIX1qYrpM)lV|DCWe@g=imD%7*^; z>a2Zkx<|~hw~dXSYoAZ7LabJI?MM9&;@_reKmSD_QD=(w`yl9fa*RU$-dmy2X4%+% zfkLT8f%XT!CqDep{@Q()Xn30Tw=XQ-Keu!&w*+#`5jy@1GqTr9C)L~s{oim&Clw>H z$g$UHLz@uaa#p9?hwOFGW1U?O+^~d;uGB1NV#Z`$%?((J6pOBQB?KU^s_AOq*pF=a zx312^(j+!r)YbD(B)Z3S4ZJ51znZIS7z5u?mvpUqBgyp)(m7X+fUwupId^zZtWgJD z>!G>u|A+4CI-Wd5Z0$JkG`LgO$!;Q82qG9==b&?~gQEGPO1iEKXJE>FbRL%m!9CZ| zd7sN6{-u$w_mBs~*Tw7lB;tJaS)I?}VMNs@>wIq85vNbO{%v652PNzJTRS)p*XRZ} zG7;a?PB$dZ5=d-LbKM9RylJWX3dOzKy1>IIwYFHG8(A7R92KG)>9dO1)GS?4t=hyp z8+2ob?AHnC+QaZn z)kW)I2@9twWSWY)XiJ^yD800)t=QxGjOQld$E@NY@KwZKTXh*# z*leNh^g(=HLZ>?y?f^B-v*@y)V~TF?)#aq_hRr{%%gIQ`gH+L7Tq&bc(OP%$Yz{WX z7o6-A7lx(EC69squYrn2wH{N*oLmNka)ZGoo zxX%CT9?Z-o%ATrwIx+&SsW@FxMj~p$mb$v4+s9GUy{r2&w;Hj_O!svG;`g)}dXasE zsOEmXZr%+NJ6`KeXrj}i_xchKicmn@rY~6*#i;Xs`ietgC)Uo?SNfoXw;Z6ag!Y42 z;-atO=8VqGaeWP^M8p&M`dYe4c!3i7dbg^;PR!Fc&=(O|)+OkhDsg{?zGdV}Z10(^ zcfO8{D8!;~jr|9_vzxx_gp~(hq)u0K|Eme&~r|#Qm!215QI7{Sy^hMBqk!perZ7@vD9; zQZ3Q?n2m0iZJZdQAA1!Ra8(2SWTOxKe3*Vpc5CcO*{NTAwHon}Vfx5Nuyhd<^-;B8 z8OyHIN5!H7vMgC2ZH7IlpQvAP3*&zMs$U(uoy7jb`ZW!Z-ut%Guis;Y{=eL&PikL; z27|0mLBoUs{?AF?`qa-k(279)_SoaZ+F#Z0wBU``576)KyB3{|+4_C^5kwY5gEhb+ z5W;+S5C}td_pE;ZGHgkaXX-N-_a?efU4Qx^vf$oLZ5+5ve@0_jgRNpy^k-Y4d|o0> zf3`cSSCd-l&mmT0U6}q{2L9GyLYV$CRUz`2qrdzO!DY#(`s>Y}BZ{4*zY&iq4P2_f zk&dM+8m7P71Sb2_3H@CcXw!yL3Z<6E^e=b8Hyr${FYJRzt3?O>+X0xtbw&EO796ln z50neMMmPO8YXf5UBK^1b^-#Beq5s1|pq`Ztx-(hC>`0-wmtZhzo!^*i@gQdpqI1(3g47L85fu8d` zL+zvt;?H^*99|(Z`ZC|(SQ#_1R&A);eW|@!DEUvmw~fI42MRLztoY{WYjq zzA&^rgFxbzi@{~;M@)4IL)*4Ph?g8|Xq$~qjg_g~5g%%@KabtTT9SuZ;m; z8ocX_B60JDq3@qkB(V_&|41|}xYiJ$f^1ZYjN8!kA4}QqhJfp6EA;7V2zb4n_}J45 zC3PLch)WpG*GnNUpQ2Fko`#T+VZ^RIG>o(I)-6M53S>RZ-4L2)BysnSA#5HbAn2$e zTI+~X^l8J=OVIw`%?vT$A-cCq8e(_n5*ZE|*7|Zd+tx1$8hStD~j!H-x|)AdqBK&CBxbBScx}v4B2-3 z&@jGe$X@&zrKanKoF6g7ryMj~eBOun^8iCG6(IReHQX351)1DJL!R~evwsZ_R^tt8 zxELNgFCpPN#Ks<-43F=_>(9$JJbhh(L`0CZFWJ?OgFmJ=phzzW7lHu>LK=i&+4S$2akQik$N|R3$ z&zx+O>tRMN1{qa;xg_59GaC0*A=Z7YvBWkcWa`$&Qj>OI50A=N&XVGbDX(jEXx#w~ zlMJK72)wb=5u?*Zh+ghbVBJ|6+&)O5U=GH9!!Vv`WbAk15mAjSqu&eM_{LA;AYKNdUB+nf4_`&1TCvf;2)m4X zE-(&9<|oeYFb157Lu9rIEFjWFDP#@S+t|EVp_ra$7a9O>;2rrCx!)OiWX~;W^al(>D#Gbb?PFM=QXkwhO9DM0$48z}V zP%kfISb-CX_gjtOiJxJoUfJ04f-!s}&Rb44E|~3wF5YxwWFIKi+K$GkWjEofDjSza zXQ4oAR4BEvGp^Z(PESatab26&MCbl7Zpg1fJjb%um}rgm(;gdB7ogAiHwJ79J~8en zc0zVuMxo@KXxuY$2@GT%Em}0sZ_gTAn6RR2z_~jF8nqWNqcpOo;d}C&p`Pj)) z!Fc));-3zA#_R(a=TxZiYOl4}4VhuQmj8g*1j(2e=?rJ=LH7vaX=dl~Z` z+YxUVWqc$Gp|1hPM^Si_(aVjGtZy{l(fIV>W#V>QjV~I)3?&9Blv@2XzVVAh1Q=s{ zzjF?WfJeq3Ya@sm+M8I}N9YXcP3jbQ`!B;y>hs>juG)h)QEWHrO`5L=gf>4m>5vRd zHOrgy%hB74+hfwFe1;RPY|_8R`Lf3*{d;ird6U`F8d*SjQ;E_T_{k|#x!%|`9Qxf< zZX`qe^VDQNZVvWwJ~!EK4?%6~iK#*r*vB|ug{*xqg+e-GCG@}JU{jUsY!u0}O;z&$ zKpj7us#k)LG^%Z?j%q&7{%xw|0w-y{Z2Bi>H&H^2smYcv#G}`nn$-^^8r96ydP_IV zP(xGet>Cx|rZ%$+uy^mh$;Gh~HVFrq+GXPbRuq`py}>x9*QPGY@A6IEvMkSuHI6rV zr>{X>vW2PFlXgT~-An zT5aiG7ZxkZw8^6~lHbY-rQR=1yW7vj)Q&Z!<4-1qW`^moBP`%aUmGu1G-d8NMcnIz z>HIKfl$0mg=swSMAt9HfHseiK>>fb98kq9B_CXZz(Nxe6vUIb%so?5NFy3_Ug%(Y^ zHzv!Yk~6SBp}_RGR4(zeQ*6A_+Vpg(H}aA$rf1gPR_)HF=S7J0p4gjS9`Pcn!bsDr zI5?XLzNXg#9Fu7(EQzHYf8JDB4jkiTdaGDMX8JVn0r85xO+}xwi7L-G6)!+69W>7L z1FdVRXR*c1b?{z4j++f(1F^$A%WPbM224Pq*{*pE(W-9dvOVx%b6cD3Qz9Vs9n2LU z{Xt;W(p-b(p|QHmTq`h!SWjWDGapORBi`)rW;gMsj%J6?*b=j8o7u7Hf5g3On_K4e zgIdlsx3A(xq-k&N_#FvevLzn}$na7sm^<}HhLX%!e71| zX>8t57Z$V6Z5xMVn3IN{$6B91YTg#N8^SZwylo{o`muReOAqWQt6<)*h4hOW=KXiz z#m;UpANr>X3bH%Rr&HXB&Aw?q+v7MABDU E0KZqp8~^|S diff --git a/data/locale/de.ts b/data/locale/de.ts index a7d84072f..167686614 100644 --- a/data/locale/de.ts +++ b/data/locale/de.ts @@ -654,6 +654,63 @@ Wenn Sie daran interessiert sind LMMS in eine andere Sprache zu übersetzen oder Plugin entfe&rnen + + DelayControls + + Delay Samples + Samples verzögern + + + Feedback + Rückkopplung + + + Lfo Frequency + LFO-Frequenz + + + Lfo Amount + LFO-Stärke + + + + DelayControlsDialog + + Delay + Verzögerung + + + Delay Time + Verzögerungszeit + + + Regen + + + + Feedback Amount + Rückkopplungsstärke + + + Rate + Rate + + + Lfo + LFO + + + Lfo Amt + LFO-Stärke + + + + DetuningHelper + + Note detuning + Noten-Verstimmung + + DualFilterControlDialog @@ -780,6 +837,13 @@ Wenn Sie daran interessiert sind LMMS in eine andere Sprache zu übersetzen oder Vokalformant-Filter + + DummyEffect + + NOT FOUND + NICHT GEFUNDEN + + Effect @@ -3294,7 +3358,7 @@ Bitte besuchen Sie http://lmms.sf.net/wiki für Dokumentationen über LMMS. Bandlimited Ramp wave - + Bandbegrenzte Sägezahnwelle Bandlimited Square wave @@ -3330,7 +3394,7 @@ Bitte besuchen Sie http://lmms.sf.net/wiki für Dokumentationen über LMMS. Digital Ramp wave - + Digitale Sägezahnwelle Digital Square wave @@ -3350,7 +3414,7 @@ Bitte besuchen Sie http://lmms.sf.net/wiki für Dokumentationen über LMMS. Ramp wave - + Sägezahnwelle Square wave @@ -4085,6 +4149,21 @@ Grund: »%2« LMMS Plugin %1 hat keinen Plugin-Deskriptor namens %2! + + PluginBrowser + + Instrument plugins + Instrument-Plugins + + + Instrument browser + Instrument-Browser + + + Drag an instrument into either the Song-Editor, the Beat+Bassline Editor or into an existing instrument track. + Ziehen Sie ein Instrument entweder in den Song-Editor, den Beat+Bassline-Editor oder in eine existierende Instrumentspur. + + ProjectRenderer @@ -6990,10 +7069,6 @@ Doppelklicken auf eines der Plugins zeigt Informaitonen über die Ports an. pluginBrowser - - Instrument plugins - Instrument-Plugins - VST-host for using VST(i)-plugins within LMMS VST-Host zum Benutzen von VST(i)-Plugins innerhalb von LMMS @@ -7056,14 +7131,6 @@ This chip was used in the Commodore 64 computer. Emulation des MOS6581 und MOS8580 SID Chips. Dieser Chip wurde in Commodore 64 Computern genutzt. - - Instrument browser - Instrument-Browser - - - Drag an instrument into either the Song-Editor, the Beat+Bassline Editor or into an existing instrument track. - Ziehen Sie ein Instrument entweder in den Song-Editor, den Beat+Bassline-Editor oder in eine existierende Instrumentspur. - Player for SoundFont files Wiedergabe von SoundFont-Dateien @@ -7148,6 +7215,10 @@ Dieser Chip wurde in Commodore 64 Computern genutzt. Carla Patchbay Instrument Carla Patchbay Instrument + + A native delay plugin + Ein natives Verzögerung-Plugin + projectNotes @@ -7476,6 +7547,57 @@ Latenz: %2 ms Wiedergabe-Courser im AudioFileProcessor anzeigen + + setupWidget + + OSS (Open Sound System) + OSS (Open Sound System) + + + SDL (Simple DirectMedia Layer) + SDL (Simple DirectMedia Layer) + + + ALSA-Sequencer (Advanced Linux Sound Architecture) + ALSA-Sequencer (Advanced Linux Sound Architecture) + + + JACK (JACK Audio Connection Kit) + JACK (JACK Audio Connection Kit) + + + ALSA Raw-MIDI (Advanced Linux Sound Architecture) + ALSA Raw-MIDI (Advanced Linux Sound Architecture) + + + PulseAudio (bad latency!) + PulseAudio (Schlechte Latenz!) + + + Dummy (no sound output) + Dummy (Keine Soundausgabe) + + + Dummy (no MIDI support) + Dummy (Keine MIDI-Unterstützung) + + + WinMM MIDI + WinMM MIDI + + + OSS Raw-MIDI (Open Sound System) + OSS Raw-MIDI (Open Sound System) + + + ALSA (Advanced Linux Sound Architecture) + ALSA (Advanced Linux Sound Architecture) + + + PortAudio + PortAudio + + sf2Instrument @@ -7902,6 +8024,13 @@ Latenz: %2 ms Rechts-nach-rechts + + tabWidget + + Settings for %1 + Einstellungen für %1 + + timeLine From 2ee8f1445c91743b8ea10ece2361429fe0011048 Mon Sep 17 00:00:00 2001 From: Daniel Winzen Date: Sun, 21 Dec 2014 10:12:12 +0100 Subject: [PATCH 20/23] reset window title every time we change the state of a subwindow to show the correct title When maximizing a subwindow it remembers the title the mainwindow had before and resets it after unmaximizing/closing. As the title might have changed due to a project switch, we have to reset the title again as it would else show an incorrect/old title. --- src/gui/MainWindow.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index f476ec70d..fa7b38c00 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -529,6 +529,11 @@ void MainWindow::finalize() setupDialog sd( setupDialog::AudioSettings ); sd.exec(); } + // reset window title every time we change the state of a subwindow to show the correct title + foreach( QMdiSubWindow * subWindow, workspace()->subWindowList() ) + { + connect( subWindow, SIGNAL( windowStateChanged(Qt::WindowStates,Qt::WindowStates) ), this, SLOT( resetWindowTitle() ) ); + } } From 5172acb1e3bccc061224ba9459691ce4136ab946 Mon Sep 17 00:00:00 2001 From: Dave French Date: Sun, 21 Dec 2014 14:19:48 +0000 Subject: [PATCH 21/23] Proposed fix for 1049 VST knobs won't remember settings --- plugins/vst_base/VstPlugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/vst_base/VstPlugin.cpp b/plugins/vst_base/VstPlugin.cpp index 4e3f0d1bc..8e7632ca4 100644 --- a/plugins/vst_base/VstPlugin.cpp +++ b/plugins/vst_base/VstPlugin.cpp @@ -415,7 +415,7 @@ void VstPlugin::setParameterDump( const QMap & _pdump ) { ( *it ).section( ':', 0, 0 ).toInt(), "", - ( *it ).section( ':', 1, 1 ).toFloat() + ( *it ).section( ':', 2, -1 ).toFloat() } ; m.addInt( item.index ); m.addString( item.shortLabel ); From a0d07db8f1a0f13e107559ea16b725d8b7a4893d Mon Sep 17 00:00:00 2001 From: Dave French Date: Mon, 22 Dec 2014 19:29:41 +0000 Subject: [PATCH 22/23] Delay Clear buffer on load, correct use of interpolation, reformat --- plugins/delay/delaycontrols.cpp | 34 +++++----- plugins/delay/delaycontrols.h | 52 +++++++------- plugins/delay/delaycontrolsdialog.cpp | 63 +++++++++-------- plugins/delay/delaycontrolsdialog.h | 8 +-- plugins/delay/delayeffect.cpp | 98 +++++++++++++-------------- plugins/delay/delayeffect.h | 22 +++--- plugins/delay/lfo.cpp | 10 +-- plugins/delay/lfo.h | 58 ++++++++-------- plugins/delay/stereodelay.cpp | 69 ++++++++++--------- plugins/delay/stereodelay.h | 42 ++++++------ 10 files changed, 231 insertions(+), 225 deletions(-) diff --git a/plugins/delay/delaycontrols.cpp b/plugins/delay/delaycontrols.cpp index afcb0f76d..72f43f300 100644 --- a/plugins/delay/delaycontrols.cpp +++ b/plugins/delay/delaycontrols.cpp @@ -30,14 +30,14 @@ #include "song.h" DelayControls::DelayControls( DelayEffect* effect ): - EffectControls( effect ), - m_effect ( effect ), - m_delayTimeModel( 0.5, 0.01, 20.0, 0.0001, 20000.0, this, tr( "Delay Samples" )) , - m_feedbackModel(0.0f,0.0f,1.0f,0.01f,this,tr( "Feedback" ) ), - m_lfoTimeModel(2.0, 0.01, 20.0, 0.0001, 20000.0, this, tr( "Lfo Frequency" ) ), - m_lfoAmountModel(0.0, 0.0, 2.0, 0.0001, 2000.0, this, tr ( "Lfo Amount" ) ) + EffectControls( effect ), + m_effect ( effect ), + m_delayTimeModel( 0.5, 0.01, 20.0, 0.0001, 20000.0, this, tr( "Delay Samples" )) , + m_feedbackModel(0.0f,0.0f,1.0f,0.01f,this,tr( "Feedback" ) ), + m_lfoTimeModel(2.0, 0.01, 20.0, 0.0001, 20000.0, this, tr( "Lfo Frequency" ) ), + m_lfoAmountModel(0.0, 0.0, 2.0, 0.0001, 2000.0, this, tr ( "Lfo Amount" ) ) { - connect( engine::mixer(), SIGNAL( sampleRateChanged() ), this, SLOT( changeSampleRate() ) ); + connect( engine::mixer(), SIGNAL( sampleRateChanged() ), this, SLOT( changeSampleRate() ) ); } @@ -45,10 +45,10 @@ DelayControls::DelayControls( DelayEffect* effect ): void DelayControls::loadSettings( const QDomElement &_this ) { - m_delayTimeModel.loadSettings(_this, "DelayTimeSamples" ); - m_feedbackModel.loadSettings( _this, "FeebackAmount" ); - m_lfoTimeModel.loadSettings( _this , "LfoFrequency"); - m_lfoAmountModel.loadSettings( _this, "LfoAmount"); + m_delayTimeModel.loadSettings(_this, "DelayTimeSamples" ); + m_feedbackModel.loadSettings( _this, "FeebackAmount" ); + m_lfoTimeModel.loadSettings( _this , "LfoFrequency"); + m_lfoAmountModel.loadSettings( _this, "LfoAmount"); } @@ -56,17 +56,15 @@ void DelayControls::loadSettings( const QDomElement &_this ) void DelayControls::saveSettings( QDomDocument& doc, QDomElement& _this ) { - m_delayTimeModel.saveSettings( doc, _this, "DelayTimeSamples" ); - m_feedbackModel.saveSettings( doc, _this ,"FeebackAmount" ); - m_lfoTimeModel.saveSettings( doc, _this, "LfoFrequency" ); - m_lfoAmountModel.saveSettings( doc, _this ,"LfoAmount" ); + m_delayTimeModel.saveSettings( doc, _this, "DelayTimeSamples" ); + m_feedbackModel.saveSettings( doc, _this ,"FeebackAmount" ); + m_lfoTimeModel.saveSettings( doc, _this, "LfoFrequency" ); + m_lfoAmountModel.saveSettings( doc, _this ,"LfoAmount" ); } void DelayControls::changeSampleRate() { - m_effect->changeSampleRate(); + m_effect->changeSampleRate(); } - -#include "moc_delaycontrols.cxx" diff --git a/plugins/delay/delaycontrols.h b/plugins/delay/delaycontrols.h index 76dacc811..9b682b5b5 100644 --- a/plugins/delay/delaycontrols.h +++ b/plugins/delay/delaycontrols.h @@ -35,38 +35,38 @@ class DelayEffect; class DelayControls : public EffectControls { - Q_OBJECT + Q_OBJECT public: - DelayControls( DelayEffect* effect ); - virtual ~DelayControls() - { - } - virtual void saveSettings( QDomDocument& doc, QDomElement& parent ); - virtual void loadSettings( const QDomElement& _this ); - inline virtual QString nodeName() const - { - return "Delay"; - } - virtual int controlCount(){ - return 4; - } - virtual EffectControlDialog* createView() - { - return new DelayControlsDialog( this ); - } + DelayControls( DelayEffect* effect ); + virtual ~DelayControls() + { + } + virtual void saveSettings( QDomDocument& doc, QDomElement& parent ); + virtual void loadSettings( const QDomElement& _this ); + inline virtual QString nodeName() const + { + return "Delay"; + } + virtual int controlCount(){ + return 4; + } + virtual EffectControlDialog* createView() + { + return new DelayControlsDialog( this ); + } private slots: - void changeSampleRate(); + void changeSampleRate(); private: - DelayEffect* m_effect; - TempoSyncKnobModel m_delayTimeModel; - FloatModel m_feedbackModel; - TempoSyncKnobModel m_lfoTimeModel; - TempoSyncKnobModel m_lfoAmountModel; + DelayEffect* m_effect; + TempoSyncKnobModel m_delayTimeModel; + FloatModel m_feedbackModel; + TempoSyncKnobModel m_lfoTimeModel; + TempoSyncKnobModel m_lfoAmountModel; - friend class DelayControlsDialog; - friend class DelayEffect; + friend class DelayControlsDialog; + friend class DelayEffect; }; #endif // DELAYCONTROLS_H diff --git a/plugins/delay/delaycontrolsdialog.cpp b/plugins/delay/delaycontrolsdialog.cpp index 00c46b105..67d817c63 100644 --- a/plugins/delay/delaycontrolsdialog.cpp +++ b/plugins/delay/delaycontrolsdialog.cpp @@ -31,41 +31,44 @@ DelayControlsDialog::DelayControlsDialog( DelayControls *controls ) : - EffectControlDialog( controls ) + EffectControlDialog( controls ) { - setAutoFillBackground( true ); - QPalette pal; - pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); - setPalette( pal ); - setFixedSize( 200, 75 ); + setAutoFillBackground( true ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); + setPalette( pal ); + setFixedSize( 200, 75 ); - TempoSyncKnob* sampleDelayKnob = new TempoSyncKnob( knobBright_26, this ); - sampleDelayKnob->move( 20,10 ); - sampleDelayKnob->setVolumeKnob( false ); - sampleDelayKnob->setModel( &controls->m_delayTimeModel ); - sampleDelayKnob->setLabel( tr( "Delay" ) ); - sampleDelayKnob->setHintText( tr( "Delay Time" ) + " ", " s" ); + TempoSyncKnob* sampleDelayKnob = new TempoSyncKnob( knobBright_26, this ); + sampleDelayKnob->move( 20,10 ); + sampleDelayKnob->setVolumeKnob( false ); + sampleDelayKnob->setModel( &controls->m_delayTimeModel ); + sampleDelayKnob->setLabel( tr( "Delay" ) ); + sampleDelayKnob->setHintText( tr( "Delay Time" ) + " ", " s" ); - knob * feedbackKnob = new knob( knobBright_26, this ); - feedbackKnob->move( 63,10 ); - feedbackKnob->setVolumeKnob( true) ; - feedbackKnob->setModel( &controls->m_feedbackModel); - feedbackKnob->setLabel( tr( "Regen" ) ); - feedbackKnob->setHintText( tr ( "Feedback Amount" ) + " " , "" ); + knob * feedbackKnob = new knob( knobBright_26, this ); + feedbackKnob->move( 63,10 ); + feedbackKnob->setVolumeKnob( true) ; + feedbackKnob->setModel( &controls->m_feedbackModel); + feedbackKnob->setLabel( tr( "Regen" ) ); + feedbackKnob->setHintText( tr ( "Feedback Amount" ) + " " , "" ); - TempoSyncKnob * lfoFreqKnob = new TempoSyncKnob( knobBright_26, this ); - lfoFreqKnob->move( 106,10 ); - lfoFreqKnob->setVolumeKnob( false ); - lfoFreqKnob->setModel( &controls->m_lfoTimeModel ); - lfoFreqKnob->setLabel( tr( "Rate" ) ); - lfoFreqKnob->setHintText( tr ( "Lfo") + " ", " s" ); + TempoSyncKnob * lfoFreqKnob = new TempoSyncKnob( knobBright_26, this ); + lfoFreqKnob->move( 106,10 ); + lfoFreqKnob->setVolumeKnob( false ); + lfoFreqKnob->setModel( &controls->m_lfoTimeModel ); + lfoFreqKnob->setLabel( tr( "Rate" ) ); + lfoFreqKnob->setHintText( tr ( "Lfo") + " ", " s" ); - TempoSyncKnob * lfoAmtKnob = new TempoSyncKnob( knobBright_26, this ); - lfoAmtKnob->move( 150,10 ); - lfoAmtKnob->setVolumeKnob( false ); - lfoAmtKnob->setModel( &controls->m_lfoAmountModel ); - lfoAmtKnob->setLabel( tr( "Lfo" ) ); - lfoAmtKnob->setHintText( tr ( "Lfo Amt" ) + " " , " s" ); + TempoSyncKnob * lfoAmtKnob = new TempoSyncKnob( knobBright_26, this ); + lfoAmtKnob->move( 150,10 ); + lfoAmtKnob->setVolumeKnob( false ); + lfoAmtKnob->setModel( &controls->m_lfoAmountModel ); + lfoAmtKnob->setLabel( tr( "Lfo" ) ); + lfoAmtKnob->setHintText( tr ( "Lfo Amt" ) + " " , " s" ); } + + +#include "moc_delaycontrols.cxx" diff --git a/plugins/delay/delaycontrolsdialog.h b/plugins/delay/delaycontrolsdialog.h index ae3730098..9afe1d7c7 100644 --- a/plugins/delay/delaycontrolsdialog.h +++ b/plugins/delay/delaycontrolsdialog.h @@ -32,10 +32,10 @@ class DelayControls; class DelayControlsDialog : public EffectControlDialog { public: - DelayControlsDialog( DelayControls* controls ); - virtual ~DelayControlsDialog() - { - } + DelayControlsDialog( DelayControls* controls ); + virtual ~DelayControlsDialog() + { + } }; #endif // DELAYCONTROLSDIALOG_H diff --git a/plugins/delay/delayeffect.cpp b/plugins/delay/delayeffect.cpp index bb1cad259..0e73f230a 100644 --- a/plugins/delay/delayeffect.cpp +++ b/plugins/delay/delayeffect.cpp @@ -32,27 +32,27 @@ extern "C" Plugin::Descriptor PLUGIN_EXPORT delay_plugin_descriptor = { - STRINGIFY( PLUGIN_NAME ), - "Delay", - QT_TRANSLATE_NOOP( "pluginBrowser", "A native delay plugin" ), - "Dave French ", - 0x0100, - Plugin::Effect, - new PluginPixmapLoader( "logo" ), - NULL, - NULL + STRINGIFY( PLUGIN_NAME ), + "Delay", + QT_TRANSLATE_NOOP( "pluginBrowser", "A native delay plugin" ), + "Dave French ", + 0x0100, + Plugin::Effect, + new PluginPixmapLoader( "logo" ), + NULL, + NULL } ; DelayEffect::DelayEffect( Model* parent, const Plugin::Descriptor::SubPluginFeatures::Key* key ) : - Effect( &delay_plugin_descriptor, parent, key ), - m_delayControls( this ) + Effect( &delay_plugin_descriptor, parent, key ), + m_delayControls( this ) { - m_delay = 0; - m_delay = new StereoDelay( 20, engine::mixer()->processingSampleRate() ); - m_lfo = new Lfo( engine::mixer()->processingSampleRate() ); + m_delay = 0; + m_delay = new StereoDelay( 20, engine::mixer()->processingSampleRate() ); + m_lfo = new Lfo( engine::mixer()->processingSampleRate() ); } @@ -60,14 +60,14 @@ DelayEffect::DelayEffect( Model* parent, const Plugin::Descriptor::SubPluginFeat DelayEffect::~DelayEffect() { - if( m_delay ) - { - delete m_delay; - } - if( m_lfo ) - { - delete m_lfo; - } + if( m_delay ) + { + delete m_delay; + } + if( m_lfo ) + { + delete m_lfo; + } } @@ -75,37 +75,37 @@ DelayEffect::~DelayEffect() bool DelayEffect::processAudioBuffer( sampleFrame* buf, const fpp_t frames ) { - if( !isEnabled() || !isRunning () ) - { - return( false ); - } - double outSum = 0.0; - const float d = dryLevel(); - const float w = wetLevel(); - const float length = m_delayControls.m_delayTimeModel.value() * engine::mixer()->processingSampleRate(); - const float amplitude = m_delayControls.m_lfoAmountModel.value() * engine::mixer()->processingSampleRate(); - m_lfo->setFrequency( 1.0 / m_delayControls.m_lfoTimeModel.value() ); - m_delay->setFeedback( m_delayControls.m_feedbackModel.value() ); - sample_t dryS[2]; - for( fpp_t f = 0; f < frames; ++f ) - { - dryS[0] = buf[f][0]; - dryS[1] = buf[f][1]; - m_delay->setLength( ( float )length + ( amplitude * ( float )m_lfo->tick() ) ); - m_delay->tick( buf[f] ); + if( !isEnabled() || !isRunning () ) + { + return( false ); + } + double outSum = 0.0; + const float d = dryLevel(); + const float w = wetLevel(); + const float length = m_delayControls.m_delayTimeModel.value() * engine::mixer()->processingSampleRate(); + const float amplitude = m_delayControls.m_lfoAmountModel.value() * engine::mixer()->processingSampleRate(); + m_lfo->setFrequency( 1.0 / m_delayControls.m_lfoTimeModel.value() ); + m_delay->setFeedback( m_delayControls.m_feedbackModel.value() ); + sample_t dryS[2]; + for( fpp_t f = 0; f < frames; ++f ) + { + dryS[0] = buf[f][0]; + dryS[1] = buf[f][1]; + m_delay->setLength( ( float )length + ( amplitude * ( float )m_lfo->tick() ) ); + m_delay->tick( buf[f] ); - buf[f][0] = ( d * dryS[0] ) + ( w * buf[f][0] ); - buf[f][1] = ( d * dryS[1] ) + ( w * buf[f][1] ); - outSum += buf[f][0]*buf[f][0] + buf[f][1]*buf[f][1]; - } - checkGate( outSum / frames ); - return isRunning(); + buf[f][0] = ( d * dryS[0] ) + ( w * buf[f][0] ); + buf[f][1] = ( d * dryS[1] ) + ( w * buf[f][1] ); + outSum += buf[f][0]*buf[f][0] + buf[f][1]*buf[f][1]; + } + checkGate( outSum / frames ); + return isRunning(); } void DelayEffect::changeSampleRate() { - m_lfo->setSampleRate( engine::mixer()->processingSampleRate() ); - m_delay->setSampleRate( engine::mixer()->processingSampleRate() ); + m_lfo->setSampleRate( engine::mixer()->processingSampleRate() ); + m_delay->setSampleRate( engine::mixer()->processingSampleRate() ); } @@ -117,7 +117,7 @@ extern "C" //needed for getting plugin out of shared lib Plugin * PLUGIN_EXPORT lmms_plugin_main( Model* parent, void* data ) { - return new DelayEffect( parent , static_cast( data ) ); + return new DelayEffect( parent , static_cast( data ) ); } }} diff --git a/plugins/delay/delayeffect.h b/plugins/delay/delayeffect.h index aa0d6e697..21aa31b5e 100644 --- a/plugins/delay/delayeffect.h +++ b/plugins/delay/delayeffect.h @@ -33,19 +33,19 @@ class DelayEffect : public Effect { public: - DelayEffect(Model* parent , const Descriptor::SubPluginFeatures::Key* key ); - virtual ~DelayEffect(); - virtual bool processAudioBuffer( sampleFrame* buf, const fpp_t frames ); - virtual EffectControls* controls() - { - return &m_delayControls; - } - void changeSampleRate(); + DelayEffect(Model* parent , const Descriptor::SubPluginFeatures::Key* key ); + virtual ~DelayEffect(); + virtual bool processAudioBuffer( sampleFrame* buf, const fpp_t frames ); + virtual EffectControls* controls() + { + return &m_delayControls; + } + void changeSampleRate(); private: - DelayControls m_delayControls; - StereoDelay* m_delay; - Lfo* m_lfo; + DelayControls m_delayControls; + StereoDelay* m_delay; + Lfo* m_lfo; }; #endif // DELAYEFFECT_H diff --git a/plugins/delay/lfo.cpp b/plugins/delay/lfo.cpp index 3ae34e65b..8936bd186 100644 --- a/plugins/delay/lfo.cpp +++ b/plugins/delay/lfo.cpp @@ -30,8 +30,8 @@ Lfo::Lfo( int samplerate ) { - m_samplerate = samplerate; - m_twoPiOverSr = F_2PI / samplerate; + m_samplerate = samplerate; + m_twoPiOverSr = F_2PI / samplerate; } @@ -39,8 +39,8 @@ Lfo::Lfo( int samplerate ) float Lfo::tick() { - float output = sinf( m_phase ); - m_phase += m_increment; + float output = sinf( m_phase ); + m_phase += m_increment; - return output; + return output; } diff --git a/plugins/delay/lfo.h b/plugins/delay/lfo.h index 92b340485..3c307723a 100644 --- a/plugins/delay/lfo.h +++ b/plugins/delay/lfo.h @@ -30,50 +30,50 @@ class Lfo { public: - Lfo( int samplerate ); - ~Lfo() - { - } + Lfo( int samplerate ); + ~Lfo() + { + } - inline void setFrequency( double frequency ) - { - if( frequency < 0 || frequency > ( m_samplerate / 2.0 ) || frequency == m_frequency ) - { - return; - } - m_frequency = frequency; - m_increment = m_frequency * m_twoPiOverSr; + inline void setFrequency( double frequency ) + { + if( frequency < 0 || frequency > ( m_samplerate / 2.0 ) || frequency == m_frequency ) + { + return; + } + m_frequency = frequency; + m_increment = m_frequency * m_twoPiOverSr; - if( m_phase >= F_2PI ) - { - m_phase -= F_2PI; - } - } + if( m_phase >= F_2PI ) + { + m_phase -= F_2PI; + } + } - inline void setSampleRate ( int samplerate ) - { - m_samplerate = samplerate; - m_twoPiOverSr = F_2PI / samplerate; - m_increment = m_frequency * m_twoPiOverSr; - } + inline void setSampleRate ( int samplerate ) + { + m_samplerate = samplerate; + m_twoPiOverSr = F_2PI / samplerate; + m_increment = m_frequency * m_twoPiOverSr; + } - float tick(); + float tick(); private: - double m_frequency; - double m_phase; - double m_increment; - double m_twoPiOverSr; - int m_samplerate; + double m_frequency; + double m_phase; + double m_increment; + double m_twoPiOverSr; + int m_samplerate; }; #endif // LFO_H diff --git a/plugins/delay/stereodelay.cpp b/plugins/delay/stereodelay.cpp index 5c641c087..95e038c89 100644 --- a/plugins/delay/stereodelay.cpp +++ b/plugins/delay/stereodelay.cpp @@ -31,14 +31,14 @@ StereoDelay::StereoDelay( int maxTime, int sampleRate ) { - m_buffer = 0; - m_maxTime = maxTime; - m_maxLength = maxTime * sampleRate; - m_length = m_maxLength; + m_buffer = 0; + m_maxTime = maxTime; + m_maxLength = maxTime * sampleRate; + m_length = m_maxLength; - m_index = 0; - m_feedback = 0.0f; - setSampleRate( sampleRate ); + m_index = 0; + m_feedback = 0.0f; + setSampleRate( sampleRate ); } @@ -46,10 +46,10 @@ StereoDelay::StereoDelay( int maxTime, int sampleRate ) StereoDelay::~StereoDelay() { - if( m_buffer ) - { - delete m_buffer; - } + if( m_buffer ) + { + delete m_buffer; + } } @@ -57,24 +57,24 @@ StereoDelay::~StereoDelay() void StereoDelay::tick( sampleFrame frame ) { - m_buffer[m_index][0] = frame[0]; - m_buffer[m_index][1] = frame[1]; + m_buffer[m_index][0] = frame[0]; + m_buffer[m_index][1] = frame[1]; - int readIndex = m_index - ( int )m_length; - if( readIndex < 0 ) - { - readIndex += m_maxLength; - } - float fract = fraction( m_length ); - frame[0] = linearInterpolate( m_buffer[readIndex][0] , - m_buffer[( readIndex+1) % m_maxLength][0], fract ); - frame[1] = linearInterpolate( m_buffer[readIndex][1] , - m_buffer[( readIndex+1) % m_maxLength][1], fract ); + int readIndex = m_index - ( int )m_length; + if( readIndex < 0 ) + { + readIndex += m_maxLength; + } + float fract = 1.0f - fraction( m_length ); + frame[0] = linearInterpolate( m_buffer[readIndex][0] , + m_buffer[( readIndex+1) % m_maxLength][0], fract ); + frame[1] = linearInterpolate( m_buffer[readIndex][1] , + m_buffer[( readIndex+1) % m_maxLength][1], fract ); - m_buffer[m_index][0] += frame[0] * m_feedback; - m_buffer[m_index][1] += frame[1] * m_feedback; + m_buffer[m_index][0] += frame[0] * m_feedback; + m_buffer[m_index][1] += frame[1] * m_feedback; - m_index = ( m_index + 1) % m_maxLength; + m_index = ( m_index + 1) % m_maxLength; } @@ -82,13 +82,18 @@ void StereoDelay::tick( sampleFrame frame ) void StereoDelay::setSampleRate( int sampleRate ) { - if( m_buffer ) - { - delete m_buffer; - } + if( m_buffer ) + { + delete m_buffer; + } - - m_buffer = new sampleFrame[( int )( sampleRate * m_maxTime )]; + int bufferSize = ( int )( sampleRate * m_maxTime ); + m_buffer = new sampleFrame[bufferSize]; + for( int i = 0 ; i < bufferSize ; i++) + { + m_buffer[i][0] = 0.0; + m_buffer[i][1] = 0.0; + } } diff --git a/plugins/delay/stereodelay.h b/plugins/delay/stereodelay.h index d1d7457ae..6485b283b 100644 --- a/plugins/delay/stereodelay.h +++ b/plugins/delay/stereodelay.h @@ -30,31 +30,31 @@ class StereoDelay { public: - StereoDelay( int maxLength, int sampleRate ); - ~StereoDelay(); - inline void setLength( float length ) - { - if( length <= m_maxLength && length >= 0 ) - { - m_length = length; - } - } + StereoDelay( int maxLength, int sampleRate ); + ~StereoDelay(); + inline void setLength( float length ) + { + if( length <= m_maxLength && length >= 0 ) + { + m_length = length; + } + } - inline void setFeedback( float feedback ) - { - m_feedback = feedback; - } + inline void setFeedback( float feedback ) + { + m_feedback = feedback; + } - void tick( sampleFrame frame ); - void setSampleRate( int sampleRate ); + void tick( sampleFrame frame ); + void setSampleRate( int sampleRate ); private: - sampleFrame* m_buffer; - int m_maxLength; - float m_length; - int m_index; - float m_feedback; - float m_maxTime; + sampleFrame* m_buffer; + int m_maxLength; + float m_length; + int m_index; + float m_feedback; + float m_maxTime; }; #endif // STEREODELAY_H From 6aae0e6897c25f67d4b6a9d2f2b343475763f4cc Mon Sep 17 00:00:00 2001 From: Dave French Date: Tue, 23 Dec 2014 09:17:16 +0000 Subject: [PATCH 23/23] change as of issue 1474 --- plugins/delay/stereodelay.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/delay/stereodelay.cpp b/plugins/delay/stereodelay.cpp index 95e038c89..27fe026ad 100644 --- a/plugins/delay/stereodelay.cpp +++ b/plugins/delay/stereodelay.cpp @@ -60,7 +60,7 @@ void StereoDelay::tick( sampleFrame frame ) m_buffer[m_index][0] = frame[0]; m_buffer[m_index][1] = frame[1]; - int readIndex = m_index - ( int )m_length; + int readIndex = m_index - ( int )m_length - 1; if( readIndex < 0 ) { readIndex += m_maxLength;