diff --git a/.travis.yml b/.travis.yml
index c75b12b7e..4dd7576f8 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -24,7 +24,7 @@ deploy:
provider: releases
api_key:
secure: d4a+x4Gugpss7JK2DcHjyBZDmEFFh4iVfKDfITSD50T6Mc6At4LMgojvEu+6qT6IyOY2vm3UVT6fhyeuWDTRDwW9tfFlaHVA0h8aTRD+eAXOA7pQ8rEMwQO3+WCKuKTfEqUkpL4wxhww8dpkv54tqeIs0S4TBqz9tk8UhzU7XbE=
- file: lmms-*-win*.exe
+ file: lmms-${TRAVIS_TAG:1}-$TARGET_OS.exe
on:
tags: true
all_branches: true
diff --git a/data/locale/en.ts b/data/locale/en.ts
index c8a242512..ad6b6829c 100644
--- a/data/locale/en.ts
+++ b/data/locale/en.ts
@@ -42,11 +42,11 @@ If you're interested in translating LMMS in another language or want to imp
- <html><head/><body><p><a href="http://lmms.sourceforge.net"><span style=" text-decoration: underline; color:#0000ff;">http://lmms.sourceforge.net</span></a></p></body></html>
+ LMMS
- LMMS
+ <html><head/><body><p><a href="http://lmms.io"><span style=" text-decoration: underline; color:#0000ff;">http://lmms.io</span></a></p></body></html>
@@ -651,6 +651,60 @@ If you're interested in translating LMMS in another language or want to imp
+
+ DelayControls
+
+ Delay Samples
+
+
+
+ Feedback
+
+
+
+ Lfo Frequency
+
+
+
+ Lfo Amount
+
+
+
+
+ DelayControlsDialog
+
+ Delay
+
+
+
+ Delay Time Samples:
+
+
+
+ Feedback
+
+
+
+ Feedback Amount:
+
+
+
+ Lfo Hz
+
+
+
+ Lfo Hz:
+
+
+
+ Lfo Amt
+
+
+
+ Lfo Amt:
+
+
+DualFilterControlDialog
@@ -7016,6 +7070,10 @@ This chip was used in the Commodore 64 computer.
A NES-like synthesizer
+
+ A native delay plugin
+
+ projectNotes
diff --git a/data/locale/it.qm b/data/locale/it.qm
index 3b28aa03c..a65af6f4e 100644
Binary files a/data/locale/it.qm and b/data/locale/it.qm differ
diff --git a/data/locale/it.ts b/data/locale/it.ts
index fd87d49b4..f9f464cac 100644
--- a/data/locale/it.ts
+++ b/data/locale/it.ts
@@ -2741,7 +2741,7 @@ Visitare http://lmms.sf.net/wiki per la documentazione di LMMS.
E&xport tracks...
- E&sporta traccie...
+ E&sporta tracce...LMMS (*.mmp *.mmpz)
diff --git a/include/plugin_browser.h b/include/plugin_browser.h
index 2a8f84ba4..91c26918d 100644
--- a/include/plugin_browser.h
+++ b/include/plugin_browser.h
@@ -35,30 +35,40 @@
class trackContainer;
-class pluginBrowser : public SideBarWidget
+class PluginBrowser : public SideBarWidget
{
Q_OBJECT
public:
- pluginBrowser( QWidget * _parent );
- virtual ~pluginBrowser();
+ PluginBrowser( QWidget * _parent );
+ virtual ~PluginBrowser();
private:
- Plugin::DescriptorList m_pluginDescriptors;
-
QWidget * m_view;
-
-} ;
+};
-class pluginDescWidget : public QWidget
+class PluginDescList : public QWidget
{
Q_OBJECT
public:
- pluginDescWidget( const Plugin::Descriptor & _pd, QWidget * _parent );
- virtual ~pluginDescWidget();
+ PluginDescList(QWidget* parent);
+
+private:
+ Plugin::DescriptorList m_pluginDescriptors;
+};
+
+
+
+
+class PluginDescWidget : public QWidget
+{
+ Q_OBJECT
+public:
+ PluginDescWidget( const Plugin::Descriptor & _pd, QWidget * _parent );
+ virtual ~PluginDescWidget();
protected:
@@ -81,7 +91,7 @@ private:
bool m_mouseOver;
int m_targetHeight;
-} ;
+};
#endif
diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt
index 8311c4fa6..1ba586768 100644
--- a/plugins/CMakeLists.txt
+++ b/plugins/CMakeLists.txt
@@ -5,6 +5,7 @@ ADD_SUBDIRECTORY(bit_invader)
ADD_SUBDIRECTORY(carlabase)
ADD_SUBDIRECTORY(carlapatchbay)
ADD_SUBDIRECTORY(carlarack)
+ADD_SUBDIRECTORY(delay)
ADD_SUBDIRECTORY(DualFilter)
ADD_SUBDIRECTORY(dynamics_processor)
ADD_SUBDIRECTORY(flp_import)
diff --git a/plugins/delay/CMakeLists.txt b/plugins/delay/CMakeLists.txt
new file mode 100644
index 000000000..0663b9458
--- /dev/null
+++ b/plugins/delay/CMakeLists.txt
@@ -0,0 +1,3 @@
+INCLUDE(BuildPlugin)
+
+BUILD_PLUGIN(delay delayeffect.cpp delaycontrols.cpp delaycontrolsdialog.cpp lfo.cpp stereodelay.cpp MOCFILES delaycontrols.h EMBEDDED_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.png")
diff --git a/plugins/delay/artwork.png b/plugins/delay/artwork.png
new file mode 100644
index 000000000..459c1c544
Binary files /dev/null and b/plugins/delay/artwork.png differ
diff --git a/plugins/delay/delaycontrols.cpp b/plugins/delay/delaycontrols.cpp
new file mode 100644
index 000000000..fb86834c7
--- /dev/null
+++ b/plugins/delay/delaycontrols.cpp
@@ -0,0 +1,72 @@
+/*
+ * delaycontrols.cpp - definition of DelayControls class.
+ *
+ * Copyright (c) 2014 David French
+ *
+ * This file is part of LMMS - http://lmms.io
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program (see COPYING); if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ */
+
+#include
+
+#include "delaycontrols.h"
+#include "delayeffect.h"
+#include "engine.h"
+#include "song.h"
+
+DelayControls::DelayControls( DelayEffect* effect ):
+ EffectControls( effect ),
+ m_effect ( effect ),
+ m_delayTimeModel( 2.0, 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.0f,0.0f,0.1f,0.0001f, this, tr ( "Lfo Amount" ) )
+{
+ connect( engine::mixer(), SIGNAL( sampleRateChanged() ), this, SLOT( changeSampleRate() ) );
+}
+
+
+
+
+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");
+}
+
+
+
+
+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" );
+}
+
+
+
+void DelayControls::changeSampleRate()
+{
+ m_effect->changeSampleRate();
+}
+
+#include "moc_delaycontrols.cxx"
diff --git a/plugins/delay/delaycontrols.h b/plugins/delay/delaycontrols.h
new file mode 100644
index 000000000..fe7b3c3e9
--- /dev/null
+++ b/plugins/delay/delaycontrols.h
@@ -0,0 +1,72 @@
+/*
+ * delaycontrols.h - declaration of DelayControl class.
+ *
+ * Copyright (c) 2014 David French
+ *
+ * This file is part of LMMS - http://lmms.io
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program (see COPYING); if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ */
+
+#ifndef DELAYCONTROLS_H
+#define DELAYCONTROLS_H
+
+#include "EffectControls.h"
+#include "knob.h"
+#include "delaycontrolsdialog.h"
+
+
+
+class DelayEffect;
+
+class DelayControls : public EffectControls
+{
+ 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 );
+ }
+
+private slots:
+ void changeSampleRate();
+
+private:
+ DelayEffect* m_effect;
+ TempoSyncKnobModel m_delayTimeModel;
+ FloatModel m_feedbackModel;
+ TempoSyncKnobModel m_lfoTimeModel;
+ FloatModel m_lfoAmountModel;
+
+ friend class DelayControlsDialog;
+ friend class DelayEffect;
+};
+
+#endif // DELAYCONTROLS_H
diff --git a/plugins/delay/delaycontrolsdialog.cpp b/plugins/delay/delaycontrolsdialog.cpp
new file mode 100644
index 000000000..1f5746d02
--- /dev/null
+++ b/plugins/delay/delaycontrolsdialog.cpp
@@ -0,0 +1,70 @@
+/*
+ * delaycontrolsdialog.cpp - definition of DelayControlsDialog class.
+ *
+ * Copyright (c) 2014 David French
+ *
+ * This file is part of LMMS - http://lmms.io
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program (see COPYING); if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ */
+
+#include "delaycontrolsdialog.h"
+#include "delaycontrols.h"
+#include "embed.h"
+#include "TempoSyncKnob.h"
+
+
+
+
+DelayControlsDialog::DelayControlsDialog( DelayControls *controls ) :
+ EffectControlDialog( controls )
+{
+ 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 Seconds:" ) + " ", "" );
+
+ 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 Seconds:" ) + " ", "" );
+
+ knob * lfoAmtKnob = new knob( knobBright_26, this );
+ lfoAmtKnob->move( 150,10 );
+ lfoAmtKnob->setVolumeKnob( true );
+ lfoAmtKnob->setModel( &controls->m_lfoAmountModel );
+ lfoAmtKnob->setLabel( tr( "Lfo" ) );
+ lfoAmtKnob->setHintText( tr ( "Lfo Amt:" ) + " ", "" );
+
+}
diff --git a/plugins/delay/delaycontrolsdialog.h b/plugins/delay/delaycontrolsdialog.h
new file mode 100644
index 000000000..ae3730098
--- /dev/null
+++ b/plugins/delay/delaycontrolsdialog.h
@@ -0,0 +1,41 @@
+/*
+ * delaycontrolsdialog.h - declaration of DelayControlsDialog class.
+ *
+ * Copyright (c) 2014 David French
+ *
+ * This file is part of LMMS - http://lmms.io
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program (see COPYING); if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ */
+
+#ifndef DELAYCONTROLSDIALOG_H
+#define DELAYCONTROLSDIALOG_H
+
+#include "EffectControlDialog.h"
+
+class DelayControls;
+
+class DelayControlsDialog : public EffectControlDialog
+{
+public:
+ DelayControlsDialog( DelayControls* controls );
+ virtual ~DelayControlsDialog()
+ {
+ }
+};
+
+#endif // DELAYCONTROLSDIALOG_H
diff --git a/plugins/delay/delayeffect.cpp b/plugins/delay/delayeffect.cpp
new file mode 100644
index 000000000..939cae7e2
--- /dev/null
+++ b/plugins/delay/delayeffect.cpp
@@ -0,0 +1,124 @@
+/*
+ * delayeffect.cpp - definition of the DelayEffect class. The Delay Plugin
+ *
+ * Copyright (c) 2014 David French
+ *
+ * This file is part of LMMS - http://lmms.io
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program (see COPYING); if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ */
+
+#include "delayeffect.h"
+#include "engine.h"
+#include "embed.cpp"
+
+
+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
+} ;
+
+
+
+
+DelayEffect::DelayEffect( Model* parent, const Plugin::Descriptor::SubPluginFeatures::Key* key ) :
+ 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() );
+}
+
+
+
+
+DelayEffect::~DelayEffect()
+{
+ if( m_delay )
+ {
+ delete m_delay;
+ }
+ if( m_lfo )
+ {
+ delete m_lfo;
+ }
+}
+
+
+
+
+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();
+ m_lfo->setAmplitude( m_delayControls.m_lfoAmountModel.value() );
+ 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 * ( 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();
+}
+
+void DelayEffect::changeSampleRate()
+{
+ m_lfo->setSampleRate( engine::mixer()->processingSampleRate() );
+ m_delay->setSampleRate( engine::mixer()->processingSampleRate() );
+}
+
+
+
+
+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 ) );
+}
+
+}}
+
diff --git a/plugins/delay/delayeffect.h b/plugins/delay/delayeffect.h
new file mode 100644
index 000000000..aa0d6e697
--- /dev/null
+++ b/plugins/delay/delayeffect.h
@@ -0,0 +1,51 @@
+/*
+ * delayeffect.h - declaration of DelayEffect class, the Delay plugin
+ *
+ * Copyright (c) 2014 David French
+ *
+ * This file is part of LMMS - http://lmms.io
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program (see COPYING); if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ */
+
+#ifndef DELAYEFFECT_H
+#define DELAYEFFECT_H
+
+#include "Effect.h"
+#include "delaycontrols.h"
+#include "lfo.h"
+#include "stereodelay.h"
+
+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();
+
+private:
+ DelayControls m_delayControls;
+ StereoDelay* m_delay;
+ Lfo* m_lfo;
+};
+
+#endif // DELAYEFFECT_H
diff --git a/plugins/delay/lfo.cpp b/plugins/delay/lfo.cpp
new file mode 100644
index 000000000..f0b84a089
--- /dev/null
+++ b/plugins/delay/lfo.cpp
@@ -0,0 +1,52 @@
+/*
+ * lfo.cpp - defination of Lfo class.
+ *
+ * Copyright (c) 2014 David French
+ *
+ * This file is part of LMMS - http://lmms.io
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program (see COPYING); if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ */
+
+#include "lfo.h"
+#include "lmms_math.h"
+
+
+
+
+Lfo::Lfo( int samplerate )
+{
+ m_samplerate = samplerate;
+ m_twoPiOverSr = F_2PI / samplerate;
+}
+
+
+
+
+float Lfo::tick()
+{
+ float output = sinf( m_phase );
+ m_phase += m_increment;
+
+ if( m_amplitude > 0.0001 )
+ {
+ return ( ( output * m_amplitude + 1.0 ) * 0.5 ) ;
+ } else
+ {
+ return 1;
+ }
+}
diff --git a/plugins/delay/lfo.h b/plugins/delay/lfo.h
new file mode 100644
index 000000000..105c137b7
--- /dev/null
+++ b/plugins/delay/lfo.h
@@ -0,0 +1,92 @@
+/*
+ * lfo.h - declaration of Lfo class, a simple sine lfo
+ *
+ * Copyright (c) 2014 David French
+ *
+ * This file is part of LMMS - http://lmms.io
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program (see COPYING); if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ */
+
+#ifndef LFO_H
+#define LFO_H
+
+#include "lmms_math.h"
+
+class Lfo
+{
+public:
+ 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;
+
+ if( m_phase >= F_2PI )
+ {
+ m_phase -= F_2PI;
+ }
+ }
+
+
+
+
+ inline void setAmplitude( float amplitude )
+ {
+ if( amplitude < 0.0 || amplitude > 1.0 )
+ {
+ return;
+ }
+ m_amplitude = amplitude;
+ }
+
+
+
+
+ inline void setSampleRate ( int samplerate )
+ {
+ m_samplerate = samplerate;
+ m_twoPiOverSr = F_2PI / samplerate;
+ m_increment = m_frequency * m_twoPiOverSr;
+ }
+
+
+
+
+ float tick();
+
+private:
+ double m_frequency;
+ double m_phase;
+ double m_increment;
+ double m_amplitude;
+ double m_twoPiOverSr;
+ int m_samplerate;
+};
+
+#endif // LFO_H
diff --git a/plugins/delay/logo.png b/plugins/delay/logo.png
new file mode 100644
index 000000000..89e9f3680
Binary files /dev/null and b/plugins/delay/logo.png differ
diff --git a/plugins/delay/stereodelay.cpp b/plugins/delay/stereodelay.cpp
new file mode 100644
index 000000000..5c641c087
--- /dev/null
+++ b/plugins/delay/stereodelay.cpp
@@ -0,0 +1,98 @@
+/*
+ * stereodelay.cpp - defination of StereoDelay class.
+ *
+ * Copyright (c) 2014 David French
+ *
+ * This file is part of LMMS - http://lmms.io
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program (see COPYING); if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ */
+
+#include "stereodelay.h"
+#include
+#include "lmms_basics.h"
+#include "interpolation.h"
+#include "lmms_math.h"
+
+
+StereoDelay::StereoDelay( int maxTime, int sampleRate )
+{
+ m_buffer = 0;
+ m_maxTime = maxTime;
+ m_maxLength = maxTime * sampleRate;
+ m_length = m_maxLength;
+
+ m_index = 0;
+ m_feedback = 0.0f;
+ setSampleRate( sampleRate );
+}
+
+
+
+
+StereoDelay::~StereoDelay()
+{
+ if( m_buffer )
+ {
+ delete m_buffer;
+ }
+}
+
+
+
+
+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;
+ 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 );
+
+ 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;
+}
+
+
+
+
+void StereoDelay::setSampleRate( int sampleRate )
+{
+ if( m_buffer )
+ {
+ delete m_buffer;
+ }
+
+
+ m_buffer = new sampleFrame[( int )( sampleRate * m_maxTime )];
+}
+
+
+
+
+
+
diff --git a/plugins/delay/stereodelay.h b/plugins/delay/stereodelay.h
new file mode 100644
index 000000000..d1d7457ae
--- /dev/null
+++ b/plugins/delay/stereodelay.h
@@ -0,0 +1,60 @@
+/*
+ * stereodelay.h - declaration of StereoDelay class.
+ *
+ * Copyright (c) 2014 David French
+ *
+ * This file is part of LMMS - http://lmms.io
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program (see COPYING); if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ */
+
+#ifndef STEREODELAY_H
+#define STEREODELAY_H
+
+#include "lmms_basics.h"
+
+class StereoDelay
+{
+public:
+ 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;
+ }
+
+ 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;
+};
+
+#endif // STEREODELAY_H
diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp
index 343c0fff7..cc1812094 100644
--- a/src/gui/MainWindow.cpp
+++ b/src/gui/MainWindow.cpp
@@ -94,7 +94,7 @@ MainWindow::MainWindow() :
splitter->setChildrenCollapsible( false );
QString wdir = ConfigManager::inst()->workingDir();
- sideBar->appendTab( new pluginBrowser( splitter ) );
+ sideBar->appendTab( new PluginBrowser( splitter ) );
sideBar->appendTab( new FileBrowser(
ConfigManager::inst()->userProjectsDir() + "*" +
ConfigManager::inst()->factoryProjectsDir(),
diff --git a/src/gui/plugin_browser.cpp b/src/gui/plugin_browser.cpp
index bb50e330c..294a67432 100644
--- a/src/gui/plugin_browser.cpp
+++ b/src/gui/plugin_browser.cpp
@@ -43,7 +43,7 @@ bool pluginBefore( const Plugin::Descriptor& d1, const Plugin::Descriptor& d2 )
-pluginBrowser::pluginBrowser( QWidget * _parent ) :
+PluginBrowser::PluginBrowser( QWidget * _parent ) :
SideBarWidget( tr( "Instrument plugins" ),
embed::getIconPixmap( "plugins" ).transformed( QTransform().rotate( 90 ) ), _parent )
{
@@ -65,29 +65,20 @@ pluginBrowser::pluginBrowser( QWidget * _parent ) :
m_view );
hint->setFont( pointSize<8>( hint->font() ) );
hint->setWordWrap( true );
- view_layout->addWidget( hint );
- Plugin::getDescriptorsOfAvailPlugins( m_pluginDescriptors );
- qSort( m_pluginDescriptors.begin(), m_pluginDescriptors.end(), pluginBefore );
+ QScrollArea* scrollarea = new QScrollArea( m_view );
+ PluginDescList* descList = new PluginDescList( m_view );
+ scrollarea->setWidget(descList);
+ scrollarea->setWidgetResizable(true);
- for( Plugin::DescriptorList::ConstIterator it = m_pluginDescriptors.begin();
- it != m_pluginDescriptors.end(); ++it )
- {
- if( it->type == Plugin::Instrument )
- {
- pluginDescWidget * p = new pluginDescWidget( *it, m_view );
- p->show();
- view_layout->addWidget( p );
- }
- }
- view_layout->addStretch();
- show();
+ view_layout->addWidget(hint);
+ view_layout->addWidget(scrollarea);
}
-pluginBrowser::~pluginBrowser()
+PluginBrowser::~PluginBrowser()
{
}
@@ -96,8 +87,36 @@ pluginBrowser::~pluginBrowser()
+PluginDescList::PluginDescList(QWidget *parent) :
+ QWidget(parent)
+{
+ QVBoxLayout* layout = new QVBoxLayout(this);
-pluginDescWidget::pluginDescWidget( const Plugin::Descriptor & _pd,
+ Plugin::getDescriptorsOfAvailPlugins( m_pluginDescriptors );
+ std::sort(m_pluginDescriptors.begin(), m_pluginDescriptors.end(), pluginBefore);
+
+
+ for(Plugin::DescriptorList::const_iterator it = m_pluginDescriptors.constBegin();
+ it != m_pluginDescriptors.constEnd(); it++)
+ {
+ if( it->type == Plugin::Instrument )
+ {
+ PluginDescWidget* p = new PluginDescWidget( *it, this );
+ p->show();
+ layout->addWidget(p);
+ }
+ }
+
+ setLayout(layout);
+ layout->addStretch();
+}
+
+
+
+
+
+
+PluginDescWidget::PluginDescWidget( const Plugin::Descriptor & _pd,
QWidget * _parent ) :
QWidget( _parent ),
m_updateTimer( this ),
@@ -115,14 +134,14 @@ pluginDescWidget::pluginDescWidget( const Plugin::Descriptor & _pd,
-pluginDescWidget::~pluginDescWidget()
+PluginDescWidget::~PluginDescWidget()
{
}
-void pluginDescWidget::paintEvent( QPaintEvent * )
+void PluginDescWidget::paintEvent( QPaintEvent * )
{
const QColor fill_color = m_mouseOver ? QColor( 224, 224, 224 ) :
QColor( 192, 192, 192 );
@@ -152,7 +171,7 @@ void pluginDescWidget::paintEvent( QPaintEvent * )
QRect br;
p.drawText( 10 + logo_size.width(), 20, width() - 58 - 5, 999,
Qt::TextWordWrap,
- pluginBrowser::tr( m_pluginDescriptor.description ),
+ PluginBrowser::tr( m_pluginDescriptor.description ),
&br );
if( m_mouseOver )
{
@@ -165,7 +184,7 @@ void pluginDescWidget::paintEvent( QPaintEvent * )
-void pluginDescWidget::enterEvent( QEvent * _e )
+void PluginDescWidget::enterEvent( QEvent * _e )
{
m_mouseOver = true;
m_targetHeight = height() + 1;
@@ -176,7 +195,7 @@ void pluginDescWidget::enterEvent( QEvent * _e )
-void pluginDescWidget::leaveEvent( QEvent * _e )
+void PluginDescWidget::leaveEvent( QEvent * _e )
{
m_mouseOver = false;
m_targetHeight = 24;
@@ -187,7 +206,7 @@ void pluginDescWidget::leaveEvent( QEvent * _e )
-void pluginDescWidget::mousePressEvent( QMouseEvent * _me )
+void PluginDescWidget::mousePressEvent( QMouseEvent * _me )
{
if( _me->button() == Qt::LeftButton )
{
@@ -200,7 +219,7 @@ void pluginDescWidget::mousePressEvent( QMouseEvent * _me )
-void pluginDescWidget::updateHeight()
+void PluginDescWidget::updateHeight()
{
if( m_targetHeight > height() )
{
diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp
index 604090433..bf610839c 100644
--- a/src/tracks/InstrumentTrack.cpp
+++ b/src/tracks/InstrumentTrack.cpp
@@ -1279,7 +1279,14 @@ InstrumentTrackWindow::InstrumentTrackWindow( InstrumentTrackView * _itv ) :
flags |= Qt::MSWindowsFixedSizeDialogHint;
flags &= ~Qt::WindowMaximizeButtonHint;
subWin->setWindowFlags( flags );
- subWin->setWindowIcon( embed::getIconPixmap( "instrument_track" ) );
+
+ // Hide the Size and Maximize options from the system menu
+ // since the dialog size is fixed.
+ QMenu * systemMenu = subWin->systemMenu();
+ systemMenu->actions().at( 2 )->setVisible( false ); // Size
+ systemMenu->actions().at( 4 )->setVisible( false ); // Maximize
+
+ subWin->setWindowIcon( embed::getIconPixmap( "instrument_track" ) );
subWin->setFixedSize( subWin->size() );
subWin->hide();
}