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) diff --git a/data/locale/de.qm b/data/locale/de.qm index 5834e2539..353543c22 100644 Binary files a/data/locale/de.qm and b/data/locale/de.qm differ 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 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 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" ) ) { diff --git a/plugins/LadspaEffect/swh/imp_1199.c b/plugins/LadspaEffect/swh/imp_1199.c index ec1b35028..a5c7d3876 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) +#else inline void impulse2freq(int id, float *imp, unsigned int length, fftw_real *out) +#endif { fftw_real impulse_time[MAX_FFT_LENGTH]; #ifdef FFTW3 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/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()); } // ------------------------------------------------------------------- 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..27fe026ad 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 - 1; + 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 diff --git a/plugins/lb302/lb302.cpp b/plugins/lb302/lb302.cpp index 2f02dffc3..d73bcb96e 100644 --- a/plugins/lb302/lb302.cpp +++ b/plugins/lb302/lb302.cpp @@ -780,16 +780,18 @@ 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(); process( _working_buffer, frames ); instrumentTrack()->processAudioBuffer( _working_buffer, frames, NULL ); - release_frame = 0; +// release_frame = 0; //removed for issue # 1432 } 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); } 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; 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 ); 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: 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 ); 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; } 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() ) 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; isubWindowList() ) + { + connect( subWindow, SIGNAL( windowStateChanged(Qt::WindowStates,Qt::WindowStates) ), this, SLOT( resetWindowTitle() ) ); + } } 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" 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;