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;