From ce6dc80c9ecaa2c2e624606cea1d7a8a041f9955 Mon Sep 17 00:00:00 2001 From: "Raine M. Ekman" Date: Fri, 17 Jan 2014 23:21:54 +0200 Subject: [PATCH 001/110] OpulenZ: new logo, some refactoring. --- plugins/opl2/logo.png | Bin 285 -> 3195 bytes plugins/opl2/opl2instrument.cpp | 92 ++++++++++++++++++-------------- plugins/opl2/opl2instrument.h | 3 ++ 3 files changed, 55 insertions(+), 40 deletions(-) diff --git a/plugins/opl2/logo.png b/plugins/opl2/logo.png index 913056fe22bd0dd1bcff8862a35b3b0b9ef55e6f..fab0301603f15125e7cc98c5a9bfc13e4b658744 100644 GIT binary patch delta 3176 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 diff --git a/plugins/opl2/opl2instrument.cpp b/plugins/opl2/opl2instrument.cpp index 0117d1650..323945738 100644 --- a/plugins/opl2/opl2instrument.cpp +++ b/plugins/opl2/opl2instrument.cpp @@ -1,7 +1,7 @@ /* * OPL2 FM synth * - * Copyright (c) 2013 Raine M. Ekman + * Copyright (c) 2014 Raine M. Ekman * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -27,6 +27,8 @@ // - Velocity (and aftertouch) sensitivity // - in FM mode: OP2 level, add mode: OP1 and OP2 levels // - .sbi (or similar) file loading into models +// - RT safety = get rid of mutex = make emulator code thread-safe + // - Extras: // - double release: first release is in effect until noteoff (heard if percussive sound), // second is switched in just before key bit cleared (is this useful???) @@ -213,8 +215,15 @@ opl2instrument::opl2instrument( InstrumentTrack * _instrument_track ) : MOD_CON( trem_depth_mdl ); } +opl2instrument::~opl2instrument() { + delete theEmulator; + engine::mixer()->removePlayHandles( instrumentTrack() ); + delete [] renderbuffer; +} + // Samplerate changes when choosing oversampling, so this is more or less mandatory void opl2instrument::reloadEmulator() { + delete theEmulator; emulatorMutex.lock(); theEmulator = new CTemuopl(engine::mixer()->processingSampleRate(), true, false); theEmulator->init(); @@ -236,36 +245,45 @@ bool opl2instrument::handleMidiEvent( const midiEvent & _me, // - what to do when voices run out and so on... // - mono mode // - int key; + int key, vel; static int lastvoice=0; - if( _me.m_type == MidiNoteOn && !isMuted() ) { - // to get us in line with MIDI - key = _me.key() +12; - for(int i=lastvoice+1; i!=lastvoice; ++i,i%=9) { - if( voiceNote[i] == OPL2_VOICE_FREE ) { - theEmulator->write(0xA0+i, fnums[key] & 0xff); - theEmulator->write(0xB0+i, 32 + ((fnums[key] & 0x1f00) >> 8) ); - // printf("%d: %d %d\n", key, (fnums[key] & 0x1c00) >> 10, fnums[key] & 0x3ff); - voiceNote[i] = key; - // printf("Voice %d on\n",i); - lastvoice=i; - break; - } - } - } else if( _me.m_type == MidiNoteOff ) { - key = _me.key() +12; - for(int i=0; i<9; ++i) { - if( voiceNote[i] == key ) { - theEmulator->write(0xA0+i, fnums[key] & 0xff); - theEmulator->write(0xB0+i, (fnums[key] & 0x1f00) >> 8 ); - voiceNote[i] = OPL2_VOICE_FREE; - } - } - } else { - printf("Midi event type %d\n",_me.m_type); - // 224 - pitch wheel - // 160 - aftertouch? - } + switch(_me.m_type) { + case MidiNoteOn: + if( !isMuted() ) { + // to get us in line with MIDI + key = _me.key() +12; + vel = _me.velocity(); + for(int i=lastvoice+1; i!=lastvoice; ++i,i%=9) { + if( voiceNote[i] == OPL2_VOICE_FREE ) { + theEmulator->write(0xA0+i, fnums[key] & 0xff); + theEmulator->write(0xB0+i, 32 + ((fnums[key] & 0x1f00) >> 8) ); + voiceNote[i] = key; + lastvoice=i; + break; + } + } + } + break; + case MidiNoteOff: + key = _me.key() +12; + for(int i=0; i<9; ++i) { + if( voiceNote[i] == key ) { + theEmulator->write(0xA0+i, fnums[key] & 0xff); + theEmulator->write(0xB0+i, (fnums[key] & 0x1f00) >> 8 ); + voiceNote[i] = OPL2_VOICE_FREE; + } + } + break; + case MidiKeyPressure: + key = _me.key() +12; + vel = _me.velocity(); + break; + case MidiPitchBend: + printf("TODO: Pitch bend\n"); + break; + default: + printf("Midi event type %d\n",_me.m_type); + } emulatorMutex.unlock(); return true; } @@ -338,7 +356,6 @@ void opl2instrument::saveSettings( QDomDocument & _doc, QDomElement & _this ) void opl2instrument::loadSettings( const QDomElement & _this ) { - printf("loadSettings!\n"); op1_a_mdl.loadSettings( _this, "op1_a" ); op1_d_mdl.loadSettings( _this, "op1_d" ); op1_s_mdl.loadSettings( _this, "op1_s" ); @@ -375,9 +392,6 @@ void opl2instrument::loadSettings( const QDomElement & _this ) // Load a preset in binary form void opl2instrument::loadPatch(unsigned char inst[14]) { const unsigned int adlib_opadd[] = {0x00, 0x01, 0x02, 0x08, 0x09, 0x0A, 0x10, 0x11, 0x12}; - // Set all voices - printf("%02x %02x %02x %02x %02x ",inst[0],inst[1],inst[2],inst[3],inst[4]); - printf("%02x %02x %02x %02x %02x %02x\n",inst[5],inst[6],inst[7],inst[8],inst[9],inst[10]); emulatorMutex.lock(); for(int v=0; v<9; ++v) { @@ -400,7 +414,6 @@ void opl2instrument::tuneEqual(int center, float Hz) { for(int n=0; n<128; ++n) { float tmp = Hz*pow(2, (n-center)/12.0); fnums[n] = Hz2fnum( tmp ); - //printf("%d: %d %d %f\n", n, (fnums[n] & 0x1c00) >> 10, fnums[n] & 0x3ff,tmp); } } @@ -418,7 +431,6 @@ int opl2instrument::Hz2fnum(float Hz) { // Load one of the default patches void opl2instrument::loadGMPatch() { unsigned char *inst = midi_fm_instruments[m_patchModel.value()]; - // printf("loadGMPatch: %d ", m_patchModel.value()); loadPatch(inst); } @@ -429,7 +441,6 @@ void opl2instrument::loadGMPatch() { // Update patch from the models to the chip emulation void opl2instrument::updatePatch() { - printf("updatePatch()\n"); unsigned char *inst = midi_fm_instruments[0]; inst[0] = ( op1_trem_mdl.value() ? 128 : 0 ) + ( op1_vib_mdl.value() ? 64 : 0 ) + @@ -558,9 +569,9 @@ opl2instrumentView::opl2instrumentView( Instrument * _instrument, pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); setPalette( pal ); - - - +} +opl2instrumentView::~opl2instrumentView() { + // Nobody else seems to delete their knobs and buttons? } void opl2instrumentView::modelChanged() @@ -610,4 +621,5 @@ void opl2instrumentView::modelChanged() } + #include "moc_opl2instrument.cxx" diff --git a/plugins/opl2/opl2instrument.h b/plugins/opl2/opl2instrument.h index 6933d7479..a02088167 100644 --- a/plugins/opl2/opl2instrument.h +++ b/plugins/opl2/opl2instrument.h @@ -40,6 +40,8 @@ class opl2instrument : public Instrument Q_OBJECT public: opl2instrument( InstrumentTrack * _instrument_track ); + virtual ~opl2instrument(); + virtual QString nodeName() const; virtual PluginView * instantiateView( QWidget * _parent ); @@ -121,6 +123,7 @@ class opl2instrumentView : public InstrumentView Q_OBJECT public: opl2instrumentView( Instrument * _instrument, QWidget * _parent ); + virtual ~opl2instrumentView(); lcdSpinBox *m_patch; void modelChanged(); From f073c6d11b95a93faa373879cfed96c76d2cbc8f Mon Sep 17 00:00:00 2001 From: Lukas W Date: Wed, 22 Jan 2014 17:07:50 +0100 Subject: [PATCH 002/110] Added two standard paths to file open/save dialog In particular Desktop and Downloads have been added. Also introduced a new function to create a file dialog in order to prevent code duplication. --- include/MainWindow.h | 2 ++ src/gui/MainWindow.cpp | 63 ++++++++++++++++++++++++++++-------------- 2 files changed, 44 insertions(+), 21 deletions(-) diff --git a/include/MainWindow.h b/include/MainWindow.h index 6335c6401..ae71003b8 100644 --- a/include/MainWindow.h +++ b/include/MainWindow.h @@ -36,6 +36,7 @@ class QAction; class QDomElement; class QGridLayout; class QMdiArea; +class QFileDialog; class configManager; class PluginView; @@ -99,6 +100,7 @@ public slots: } void createNewProject( void ); void createNewProjectFromTemplate( QAction * _idx ); + QFileDialog* newFileDialog( const QString & caption = QString(), const QString & directory = QString(), const QString & filter = QString() ); void openProject( void ); bool saveProject( void ); bool saveProjectAs( void ); diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 30fa8d925..211f76620 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -24,6 +24,7 @@ #include +#include #include #include #include @@ -681,26 +682,47 @@ void MainWindow::createNewProjectFromTemplate( QAction * _idx ) +QFileDialog* MainWindow::newFileDialog( const QString& caption, const QString& directory, const QString& filter ) +{ + QFileDialog* fd = new QFileDialog( this, caption, directory, filter); +#if QT_VERSION >= 0x040806 + fd->setOption( QFileDialog::DontUseCustomDirectoryIcons ); +#endif + + QList urls = fd->sidebarUrls(); + urls << QUrl::fromLocalFile( QDesktopServices::storageLocation( QDesktopServices::DesktopLocation ) ); + // Find downloads directory + QDir downloadDir( QDir::homePath() + "/Downloads" ); + if (! downloadDir.exists()) + downloadDir = QDesktopServices::storageLocation( QDesktopServices::DocumentsLocation ) + "/Downloads"; + if (downloadDir.exists()) + urls << QUrl::fromLocalFile( downloadDir.absolutePath() ); + fd->setSidebarUrls(urls); + + return fd; +} + + + void MainWindow::openProject( void ) { if( mayChangeProject() ) { - QFileDialog ofd( this, tr( "Open project" ), "", + QFileDialog* ofd = newFileDialog( tr( "Open project" ), "", tr( "MultiMedia Project (*.mmp *.mmpz *.xml)" ) ); -#if QT_VERSION >= 0x040806 - ofd.setOption( QFileDialog::DontUseCustomDirectoryIcons ); -#endif - ofd.setDirectory( configManager::inst()->userProjectsDir() ); - ofd.setFileMode( QFileDialog::ExistingFiles ); - if( ofd.exec () == QDialog::Accepted && - !ofd.selectedFiles().isEmpty() ) + + ofd->setDirectory( configManager::inst()->userProjectsDir() ); + ofd->setFileMode( QFileDialog::ExistingFiles ); + if( ofd->exec () == QDialog::Accepted && + !ofd->selectedFiles().isEmpty() ) { setCursor( Qt::WaitCursor ); engine::getSong()->loadProject( - ofd.selectedFiles()[0] ); + ofd->selectedFiles()[0] ); setCursor( Qt::ArrowCursor ); } + delete ofd; } } @@ -751,32 +773,31 @@ bool MainWindow::saveProject( void ) bool MainWindow::saveProjectAs( void ) { - QFileDialog sfd( this, tr( "Save project" ), "", + QFileDialog* sfd = newFileDialog( tr( "Save project" ), "", tr( "MultiMedia Project (*.mmp *.mmpz);;" "MultiMedia Project Template (*.mpt)" ) ); -#if QT_VERSION >= 0x040806 - sfd.setOption( QFileDialog::DontUseCustomDirectoryIcons ); -#endif - sfd.setAcceptMode( QFileDialog::AcceptSave ); - sfd.setFileMode( QFileDialog::AnyFile ); + sfd->setAcceptMode( QFileDialog::AcceptSave ); + sfd->setFileMode( QFileDialog::AnyFile ); QString f = engine::getSong()->projectFileName(); if( f != "" ) { - sfd.setDirectory( QFileInfo( f ).absolutePath() ); - sfd.selectFile( QFileInfo( f ).fileName() ); + sfd->setDirectory( QFileInfo( f ).absolutePath() ); + sfd->selectFile( QFileInfo( f ).fileName() ); } else { - sfd.setDirectory( configManager::inst()->userProjectsDir() ); + sfd->setDirectory( configManager::inst()->userProjectsDir() ); } - if( sfd.exec () == QFileDialog::Accepted && - !sfd.selectedFiles().isEmpty() && sfd.selectedFiles()[0] != "" ) + if( sfd->exec () == QFileDialog::Accepted && + !sfd->selectedFiles().isEmpty() && sfd->selectedFiles()[0] != "" ) { engine::getSong()->guiSaveProjectAs( - sfd.selectedFiles()[0] ); + sfd->selectedFiles()[0] ); + delete sfd; return( TRUE ); } + delete sfd; return( FALSE ); } From 9a9a867e7d3997b64332f3e75adbfd985dd187c1 Mon Sep 17 00:00:00 2001 From: "Raine M. Ekman" Date: Wed, 22 Jan 2014 20:57:02 +0200 Subject: [PATCH 003/110] Added pitch bend --- plugins/opl2/opl2instrument.cpp | 40 ++++++++++++++++++++++----------- plugins/opl2/opl2instrument.h | 6 ++++- 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/plugins/opl2/opl2instrument.cpp b/plugins/opl2/opl2instrument.cpp index 323945738..dd8fda55a 100644 --- a/plugins/opl2/opl2instrument.cpp +++ b/plugins/opl2/opl2instrument.cpp @@ -23,9 +23,8 @@ */ // TODO: -// - Pitch bend // - Velocity (and aftertouch) sensitivity -// - in FM mode: OP2 level, add mode: OP1 and OP2 levels +// * in FM mode: OP2 level, add mode: OP1 and OP2 levels // - .sbi (or similar) file loading into models // - RT safety = get rid of mutex = make emulator code thread-safe @@ -163,12 +162,14 @@ opl2instrument::opl2instrument( InstrumentTrack * _instrument_track ) : frameCount = engine::mixer()->framesPerPeriod(); renderbuffer = new short[frameCount]; - // Some kind of sane default + // Some kind of sane defaults + pitchbend = 0; tuneEqual(69, 440); for(int i=1; i<9; ++i) { voiceNote[i] = OPL2_VOICE_FREE; } + connect( engine::mixer(), SIGNAL( sampleRateChanged() ), this, SLOT( reloadEmulator() ) ); // Connect knobs @@ -239,18 +240,12 @@ bool opl2instrument::handleMidiEvent( const midiEvent & _me, const midiTime & _time ) { emulatorMutex.lock(); - // Real dummy version... Should at least add: - // - smarter voice allocation: - // - reuse same note, now we have round robin-ish - // - what to do when voices run out and so on... - // - mono mode - // - int key, vel; + int key, vel, tmp_pb; static int lastvoice=0; switch(_me.m_type) { case MidiNoteOn: if( !isMuted() ) { - // to get us in line with MIDI + // to get us in line with MIDI(?) key = _me.key() +12; vel = _me.velocity(); for(int i=lastvoice+1; i!=lastvoice; ++i,i%=9) { @@ -258,6 +253,7 @@ bool opl2instrument::handleMidiEvent( const midiEvent & _me, theEmulator->write(0xA0+i, fnums[key] & 0xff); theEmulator->write(0xB0+i, 32 + ((fnums[key] & 0x1f00) >> 8) ); voiceNote[i] = key; + velocities[key] = vel; lastvoice=i; break; } @@ -273,13 +269,30 @@ bool opl2instrument::handleMidiEvent( const midiEvent & _me, voiceNote[i] = OPL2_VOICE_FREE; } } + velocities[key] = 0; break; case MidiKeyPressure: key = _me.key() +12; vel = _me.velocity(); + if( velocities[key] != 0) { + velocities[key] = vel; + } break; case MidiPitchBend: - printf("TODO: Pitch bend\n"); + // Update fnumber table + tmp_pb = (2*BEND_CENTS)*((float)_me.m_data.m_param[0]/16383)-BEND_CENTS; + if( tmp_pb != pitchbend ) { + pitchbend = tmp_pb; + tuneEqual(69, 440.0); + } + // Update pitch of sounding notes + for( int i=0; i<9; ++i ) { + if( voiceNote[i] != OPL2_VOICE_FREE ) { + theEmulator->write(0xA0+i, fnums[voiceNote[i] ] & 0xff); + theEmulator->write(0xB0+i, 32 + ((fnums[voiceNote[i]] & 0x1f00) >> 8) ); + } + } + // printf("Pitch bend: %d\n", pitchbend); break; default: printf("Midi event type %d\n",_me.m_type); @@ -411,8 +424,9 @@ void opl2instrument::loadPatch(unsigned char inst[14]) { } void opl2instrument::tuneEqual(int center, float Hz) { + float tmp; for(int n=0; n<128; ++n) { - float tmp = Hz*pow(2, (n-center)/12.0); + tmp = Hz*pow( 2, ( n - center ) / 12.0 + pitchbend / 1200.0 ); fnums[n] = Hz2fnum( tmp ); } } diff --git a/plugins/opl2/opl2instrument.h b/plugins/opl2/opl2instrument.h index a02088167..7c81ba192 100644 --- a/plugins/opl2/opl2instrument.h +++ b/plugins/opl2/opl2instrument.h @@ -109,9 +109,13 @@ private: fpp_t frameCount; short *renderbuffer; int voiceNote[9]; - int heldNotes[128]; + // 0 - no note, >0 - note on velocity + int velocities[128]; // These include both octave and Fnumber int fnums[128]; + // in cents, range defaults to +/-100 cents (should this be changeable?) + int pitchbend; + #define BEND_CENTS 100 int Hz2fnum(float Hz); static QMutex emulatorMutex; From 3b8214bab8f0cee407f2b4b11e0b503212f6e06a Mon Sep 17 00:00:00 2001 From: Wong Cho Ching Date: Fri, 24 Jan 2014 18:39:00 +0800 Subject: [PATCH 004/110] Loop marker: Changed tooltip text. --- src/core/timeline.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/core/timeline.cpp b/src/core/timeline.cpp index d392ff8c4..121fd525e 100644 --- a/src/core/timeline.cpp +++ b/src/core/timeline.cpp @@ -301,13 +301,20 @@ void timeLine::mousePressEvent( QMouseEvent* event ) m_loopPos[( m_action == MoveLoopBegin ) ? 0 : 1] = t; } - if( m_action == MoveLoopBegin || m_action == MoveLoopEnd ) + if( m_action == MoveLoopBegin ) { delete m_hint; m_hint = textFloat::displayMessage( tr( "Hint" ), tr( "Press to disable magnetic loop points." ), embed::getIconPixmap( "hint" ), 0 ); } + else if( m_action == MoveLoopEnd ) + { + delete m_hint; + m_hint = textFloat::displayMessage( tr( "Hint" ), + tr( "Hold + to move the begin loop point; Press to disable magnetic loop points." ), + embed::getIconPixmap( "hint" ), 0 ); + } mouseMoveEvent( event ); } From b136eee5735eb4f9251a8a67b30384959de7cbca Mon Sep 17 00:00:00 2001 From: wongcc966422 Date: Fri, 24 Jan 2014 19:26:34 +0800 Subject: [PATCH 005/110] Update timeline.cpp --- src/core/timeline.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/timeline.cpp b/src/core/timeline.cpp index 121fd525e..74d754eba 100644 --- a/src/core/timeline.cpp +++ b/src/core/timeline.cpp @@ -312,7 +312,7 @@ void timeLine::mousePressEvent( QMouseEvent* event ) { delete m_hint; m_hint = textFloat::displayMessage( tr( "Hint" ), - tr( "Hold + to move the begin loop point; Press to disable magnetic loop points." ), + tr( "Hold to move the begin loop point; Press to disable magnetic loop points." ), embed::getIconPixmap( "hint" ), 0 ); } From 0bbfd907aec3235f31aad494b16d450d2b2fee4b Mon Sep 17 00:00:00 2001 From: Lukas W Date: Wed, 22 Jan 2014 22:10:52 +0100 Subject: [PATCH 006/110] MainWindow: Moved FileDialog to own subclass --- include/FileDialog.h | 40 +++++++++++++++++++++++ include/MainWindow.h | 2 -- src/gui/MainWindow.cpp | 59 +++++++++------------------------- src/gui/dialogs/FileDialog.cpp | 57 ++++++++++++++++++++++++++++++++ 4 files changed, 113 insertions(+), 45 deletions(-) create mode 100644 include/FileDialog.h create mode 100644 src/gui/dialogs/FileDialog.cpp diff --git a/include/FileDialog.h b/include/FileDialog.h new file mode 100644 index 000000000..4a0c678ce --- /dev/null +++ b/include/FileDialog.h @@ -0,0 +1,40 @@ +/* + * FileDialog.h - declaration of class FileDialog + * + * Copyright (c) 2014 Lukas W + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 FILEDIALOG_H +#define FILEDIALOG_H + +#include + +class FileDialog : public QFileDialog +{ + Q_OBJECT +public: + explicit FileDialog( QWidget *parent = 0, const QString &caption = QString(), + const QString &directory = QString(), + const QString &filter = QString() ); +}; + +#endif // FILEDIALOG_HPP diff --git a/include/MainWindow.h b/include/MainWindow.h index ae71003b8..6335c6401 100644 --- a/include/MainWindow.h +++ b/include/MainWindow.h @@ -36,7 +36,6 @@ class QAction; class QDomElement; class QGridLayout; class QMdiArea; -class QFileDialog; class configManager; class PluginView; @@ -100,7 +99,6 @@ public slots: } void createNewProject( void ); void createNewProjectFromTemplate( QAction * _idx ); - QFileDialog* newFileDialog( const QString & caption = QString(), const QString & directory = QString(), const QString & filter = QString() ); void openProject( void ); bool saveProject( void ); bool saveProjectAs( void ); diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 211f76620..d23d9b5a5 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -24,12 +24,10 @@ #include -#include #include #include #include #include -#include #include #include #include @@ -63,6 +61,7 @@ #include "ProjectJournal.h" #include "AutomationEditor.h" #include "templates.h" +#include "FileDialog.h" @@ -682,47 +681,23 @@ void MainWindow::createNewProjectFromTemplate( QAction * _idx ) -QFileDialog* MainWindow::newFileDialog( const QString& caption, const QString& directory, const QString& filter ) -{ - QFileDialog* fd = new QFileDialog( this, caption, directory, filter); -#if QT_VERSION >= 0x040806 - fd->setOption( QFileDialog::DontUseCustomDirectoryIcons ); -#endif - - QList urls = fd->sidebarUrls(); - urls << QUrl::fromLocalFile( QDesktopServices::storageLocation( QDesktopServices::DesktopLocation ) ); - // Find downloads directory - QDir downloadDir( QDir::homePath() + "/Downloads" ); - if (! downloadDir.exists()) - downloadDir = QDesktopServices::storageLocation( QDesktopServices::DocumentsLocation ) + "/Downloads"; - if (downloadDir.exists()) - urls << QUrl::fromLocalFile( downloadDir.absolutePath() ); - fd->setSidebarUrls(urls); - - return fd; -} - - - - void MainWindow::openProject( void ) { if( mayChangeProject() ) { - QFileDialog* ofd = newFileDialog( tr( "Open project" ), "", + FileDialog ofd( this, tr( "Open project" ), "", tr( "MultiMedia Project (*.mmp *.mmpz *.xml)" ) ); - ofd->setDirectory( configManager::inst()->userProjectsDir() ); - ofd->setFileMode( QFileDialog::ExistingFiles ); - if( ofd->exec () == QDialog::Accepted && - !ofd->selectedFiles().isEmpty() ) + ofd.setDirectory( configManager::inst()->userProjectsDir() ); + ofd.setFileMode( QFileDialog::ExistingFiles ); + if( ofd.exec () == QDialog::Accepted && + !ofd.selectedFiles().isEmpty() ) { setCursor( Qt::WaitCursor ); engine::getSong()->loadProject( - ofd->selectedFiles()[0] ); + ofd.selectedFiles()[0] ); setCursor( Qt::ArrowCursor ); } - delete ofd; } } @@ -773,31 +748,29 @@ bool MainWindow::saveProject( void ) bool MainWindow::saveProjectAs( void ) { - QFileDialog* sfd = newFileDialog( tr( "Save project" ), "", + FileDialog sfd( this, tr( "Save project" ), "", tr( "MultiMedia Project (*.mmp *.mmpz);;" "MultiMedia Project Template (*.mpt)" ) ); - sfd->setAcceptMode( QFileDialog::AcceptSave ); - sfd->setFileMode( QFileDialog::AnyFile ); + sfd.setAcceptMode( QFileDialog::AcceptSave ); + sfd.setFileMode( QFileDialog::AnyFile ); QString f = engine::getSong()->projectFileName(); if( f != "" ) { - sfd->setDirectory( QFileInfo( f ).absolutePath() ); - sfd->selectFile( QFileInfo( f ).fileName() ); + sfd.setDirectory( QFileInfo( f ).absolutePath() ); + sfd.selectFile( QFileInfo( f ).fileName() ); } else { - sfd->setDirectory( configManager::inst()->userProjectsDir() ); + sfd.setDirectory( configManager::inst()->userProjectsDir() ); } - if( sfd->exec () == QFileDialog::Accepted && - !sfd->selectedFiles().isEmpty() && sfd->selectedFiles()[0] != "" ) + if( sfd.exec () == QFileDialog::Accepted && + !sfd.selectedFiles().isEmpty() && sfd.selectedFiles()[0] != "" ) { engine::getSong()->guiSaveProjectAs( - sfd->selectedFiles()[0] ); - delete sfd; + sfd.selectedFiles()[0] ); return( TRUE ); } - delete sfd; return( FALSE ); } diff --git a/src/gui/dialogs/FileDialog.cpp b/src/gui/dialogs/FileDialog.cpp new file mode 100644 index 000000000..d506a8209 --- /dev/null +++ b/src/gui/dialogs/FileDialog.cpp @@ -0,0 +1,57 @@ +/* + * FileDialog.cpp - implementation of class FileDialog + * + * Copyright (c) 2014 Lukas W + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 +#include + +#include "FileDialog.h" + + + + + +FileDialog::FileDialog( QWidget *parent, const QString &caption, + const QString &directory, const QString &filter ) : + QFileDialog( parent, caption, directory, filter ) +{ +#if QT_VERSION >= 0x040806 + setOption( QFileDialog::DontUseCustomDirectoryIcons ); +#endif + + // Add additional locations to the sidebar + QList urls = sidebarUrls(); + urls << QUrl::fromLocalFile( QDesktopServices::storageLocation( QDesktopServices::DesktopLocation ) ); + // Find downloads directory + QDir downloadDir( QDir::homePath() + "/Downloads" ); + if ( ! downloadDir.exists() ) + downloadDir = QDesktopServices::storageLocation( QDesktopServices::DocumentsLocation ) + "/Downloads"; + if ( downloadDir.exists() ) + urls << QUrl::fromLocalFile( downloadDir.absolutePath() ); + setSidebarUrls(urls); +} + + +#include "moc_FileDialog.cxx" From 2e7bfe17e65de963214184157cb878d77dc5a1cf Mon Sep 17 00:00:00 2001 From: Lukas W Date: Wed, 22 Jan 2014 22:24:24 +0100 Subject: [PATCH 007/110] Update code to use FileInfo instead of QFileInfo Also removed all blocks similar to ``` #if QT_VERSION >= 0x040806 filedialog.setOption( QFileDialog::DontUseCustomDirectoryIcons ); #endif ``` as this now takes place in the new subclass's constructor. --- plugins/patman/patman.cpp | 9 +++------ plugins/sf2_player/sf2_player.cpp | 9 +++------ plugins/vestige/vestige.cpp | 9 +++------ plugins/vst_base/VstPlugin.cpp | 18 ++++++------------ src/core/SampleBuffer.cpp | 10 ++++------ src/core/song.cpp | 20 +++++++------------- src/gui/MainWindow.cpp | 4 ++-- src/gui/setup_dialog.cpp | 25 ++++++++++--------------- src/tracks/InstrumentTrack.cpp | 8 ++++---- 9 files changed, 42 insertions(+), 70 deletions(-) diff --git a/plugins/patman/patman.cpp b/plugins/patman/patman.cpp index a5a588b21..b2cdc9d1b 100644 --- a/plugins/patman/patman.cpp +++ b/plugins/patman/patman.cpp @@ -25,7 +25,6 @@ #include "patman.h" -#include #include #include #include @@ -39,6 +38,7 @@ #include "song.h" #include "string_pair_drag.h" #include "tooltip.h" +#include "FileDialog.h" #include "embed.cpp" @@ -508,11 +508,8 @@ PatmanView::~PatmanView() void PatmanView::openFile( void ) { - QFileDialog ofd( NULL, tr( "Open patch file" ) ); -#if QT_VERSION >= 0x040806 - ofd.setOption( QFileDialog::DontUseCustomDirectoryIcons ); -#endif - ofd.setFileMode( QFileDialog::ExistingFiles ); + FileDialog ofd( NULL, tr( "Open patch file" ) ); + ofd.setFileMode( FileDialog::ExistingFiles ); QStringList types; types << tr( "Patch-Files (*.pat)" ); diff --git a/plugins/sf2_player/sf2_player.cpp b/plugins/sf2_player/sf2_player.cpp index 2467e717c..9091cafef 100644 --- a/plugins/sf2_player/sf2_player.cpp +++ b/plugins/sf2_player/sf2_player.cpp @@ -27,9 +27,9 @@ #include #include #include -#include #include +#include "FileDialog.h" #include "sf2_player.h" #include "engine.h" #include "InstrumentTrack.h" @@ -1044,11 +1044,8 @@ void sf2InstrumentView::showFileDialog() { sf2Instrument * k = castModel(); - QFileDialog ofd( NULL, tr( "Open SoundFont file" ) ); -#if QT_VERSION >= 0x040806 - ofd.setOption( QFileDialog::DontUseCustomDirectoryIcons ); -#endif - ofd.setFileMode( QFileDialog::ExistingFiles ); + FileDialog ofd( NULL, tr( "Open SoundFont file" ) ); + ofd.setFileMode( FileDialog::ExistingFiles ); QStringList types; types << tr( "SoundFont2 Files (*.sf2)" ); diff --git a/plugins/vestige/vestige.cpp b/plugins/vestige/vestige.cpp index 0cee1a4aa..2f9239881 100644 --- a/plugins/vestige/vestige.cpp +++ b/plugins/vestige/vestige.cpp @@ -25,7 +25,6 @@ #include "vestige.h" #include -#include #include #include #include @@ -43,6 +42,7 @@ #include "string_pair_drag.h" #include "text_float.h" #include "tooltip.h" +#include "FileDialog.h" #include "embed.cpp" @@ -615,10 +615,7 @@ void VestigeInstrumentView::modelChanged() void VestigeInstrumentView::openPlugin() { - QFileDialog ofd( NULL, tr( "Open VST-plugin" ) ); -#if QT_VERSION >= 0x040806 - ofd.setOption( QFileDialog::DontUseCustomDirectoryIcons ); -#endif + FileDialog ofd( NULL, tr( "Open VST-plugin" ) ); QString dir; if( m_vi->m_pluginDLL != "" ) @@ -631,7 +628,7 @@ void VestigeInstrumentView::openPlugin() } // change dir to position of previously opened file ofd.setDirectory( dir ); - ofd.setFileMode( QFileDialog::ExistingFiles ); + ofd.setFileMode( FileDialog::ExistingFiles ); // set filters QStringList types; diff --git a/plugins/vst_base/VstPlugin.cpp b/plugins/vst_base/VstPlugin.cpp index 8e331829b..5ed6164a4 100644 --- a/plugins/vst_base/VstPlugin.cpp +++ b/plugins/vst_base/VstPlugin.cpp @@ -24,7 +24,6 @@ #include "VstPlugin.h" -#include #include #include #include @@ -49,6 +48,7 @@ #include "MainWindow.h" #include "song.h" #include "templates.h" +#include "FileDialog.h" #include @@ -510,12 +510,9 @@ bool VstPlugin::processMessage( const message & _m ) void VstPlugin::openPreset( ) { - QFileDialog ofd( NULL, tr( "Open Preset" ), "", + FileDialog ofd( NULL, tr( "Open Preset" ), "", tr( "Vst Plugin Preset (*.fxp *.fxb)" ) ); -#if QT_VERSION >= 0x040806 - ofd.setOption( QFileDialog::DontUseCustomDirectoryIcons ); -#endif - ofd.setFileMode( QFileDialog::ExistingFiles ); + ofd.setFileMode( FileDialog::ExistingFiles ); if( ofd.exec () == QDialog::Accepted && !ofd.selectedFiles().isEmpty() ) { @@ -571,19 +568,16 @@ void VstPlugin::savePreset( ) QString presName = currentProgramName().isEmpty() ? tr(": default") : currentProgramName(); presName.replace(tr("\""), tr("'")); // QFileDialog unable to handle double quotes properly - QFileDialog sfd( NULL, tr( "Save Preset" ), presName.section(": ", 1, 1) + tr(".fxp"), + FileDialog sfd( NULL, tr( "Save Preset" ), presName.section(": ", 1, 1) + tr(".fxp"), tr( "Vst Plugin Preset (*.fxp *.fxb)" ) ); -#if QT_VERSION >= 0x040806 - sfd.setOption( QFileDialog::DontUseCustomDirectoryIcons ); -#endif if( p_name != "" ) // remember last directory { sfd.setDirectory( QFileInfo( p_name ).absolutePath() ); } - sfd.setAcceptMode( QFileDialog::AcceptSave ); - sfd.setFileMode( QFileDialog::AnyFile ); + sfd.setAcceptMode( FileDialog::AcceptSave ); + sfd.setFileMode( FileDialog::AnyFile ); if( sfd.exec () == QDialog::Accepted && !sfd.selectedFiles().isEmpty() && sfd.selectedFiles()[0] != "" ) { diff --git a/src/core/SampleBuffer.cpp b/src/core/SampleBuffer.cpp index 3308faf60..c9cd28499 100644 --- a/src/core/SampleBuffer.cpp +++ b/src/core/SampleBuffer.cpp @@ -30,7 +30,6 @@ #include #include #include -#include #include #include @@ -61,6 +60,8 @@ #include "interpolation.h" #include "templates.h" +#include "FileDialog.h" + SampleBuffer::SampleBuffer( const QString & _audio_file, bool _is_base64_data ) : @@ -829,10 +830,7 @@ void SampleBuffer::visualize( QPainter & _p, const QRect & _dr, QString SampleBuffer::openAudioFile() const { - QFileDialog ofd( NULL, tr( "Open audio file" ) ); -#if QT_VERSION >= 0x040806 - ofd.setOption( QFileDialog::DontUseCustomDirectoryIcons ); -#endif + FileDialog ofd( NULL, tr( "Open audio file" ) ); QString dir; if( !m_audioFile.isEmpty() ) @@ -855,7 +853,7 @@ QString SampleBuffer::openAudioFile() const } // change dir to position of previously opened file ofd.setDirectory( dir ); - ofd.setFileMode( QFileDialog::ExistingFiles ); + ofd.setFileMode( FileDialog::ExistingFiles ); // set filters QStringList types; diff --git a/src/core/song.cpp b/src/core/song.cpp index a2c5457aa..a32f453d7 100644 --- a/src/core/song.cpp +++ b/src/core/song.cpp @@ -25,7 +25,6 @@ #include #include #include -#include #include #include @@ -47,6 +46,7 @@ #include "ImportFilter.h" #include "InstrumentTrack.h" #include "MainWindow.h" +#include "FileDialog.h" #include "MidiClient.h" #include "mmp.h" #include "note_play_handle.h" @@ -1310,7 +1310,7 @@ bool song::guiSaveProjectAs( const QString & _file_name ) void song::importProject() { - QFileDialog ofd( NULL, tr( "Import file" ), + FileDialog ofd( NULL, tr( "Import file" ), configManager::inst()->userProjectsDir(), tr("MIDI sequences") + " (*.mid *.midi *.rmi);;" + @@ -1320,11 +1320,8 @@ void song::importProject() " (*.h2song);;" + tr("All file types") + " (*.*)"); -#if QT_VERSION >= 0x040806 - ofd.setOption( QFileDialog::DontUseCustomDirectoryIcons ); -#endif - ofd.setFileMode( QFileDialog::ExistingFiles ); + ofd.setFileMode( FileDialog::ExistingFiles ); if( ofd.exec () == QDialog::Accepted && !ofd.selectedFiles().isEmpty() ) { ImportFilter::import( ofd.selectedFiles()[0], this ); @@ -1377,13 +1374,10 @@ void song::exportProject(bool multiExport) return; } - QFileDialog efd( engine::mainWindow() ); -#if QT_VERSION >= 0x040806 - efd.setOption( QFileDialog::DontUseCustomDirectoryIcons ); -#endif + FileDialog efd( engine::mainWindow() ); if (multiExport) { - efd.setFileMode( QFileDialog::Directory); + efd.setFileMode( FileDialog::Directory); efd.setWindowTitle( tr( "Select directory for writing exported tracks..." ) ); if( !m_fileName.isEmpty() ) { @@ -1392,7 +1386,7 @@ void song::exportProject(bool multiExport) } else { - efd.setFileMode( QFileDialog::AnyFile ); + efd.setFileMode( FileDialog::AnyFile ); int idx = 0; QStringList types; while( __fileEncodeDevices[idx].m_fileFormat != @@ -1417,7 +1411,7 @@ void song::exportProject(bool multiExport) efd.setWindowTitle( tr( "Select file for project-export..." ) ); } - efd.setAcceptMode( QFileDialog::AcceptSave ); + efd.setAcceptMode( FileDialog::AcceptSave ); if( efd.exec() == QDialog::Accepted && diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index d23d9b5a5..82a8a6169 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -689,7 +689,7 @@ void MainWindow::openProject( void ) tr( "MultiMedia Project (*.mmp *.mmpz *.xml)" ) ); ofd.setDirectory( configManager::inst()->userProjectsDir() ); - ofd.setFileMode( QFileDialog::ExistingFiles ); + ofd.setFileMode( FileDialog::ExistingFiles ); if( ofd.exec () == QDialog::Accepted && !ofd.selectedFiles().isEmpty() ) { @@ -764,7 +764,7 @@ bool MainWindow::saveProjectAs( void ) sfd.setDirectory( configManager::inst()->userProjectsDir() ); } - if( sfd.exec () == QFileDialog::Accepted && + if( sfd.exec () == FileDialog::Accepted && !sfd.selectedFiles().isEmpty() && sfd.selectedFiles()[0] != "" ) { engine::getSong()->guiSaveProjectAs( diff --git a/src/gui/setup_dialog.cpp b/src/gui/setup_dialog.cpp index dcda537de..0b0526aee 100644 --- a/src/gui/setup_dialog.cpp +++ b/src/gui/setup_dialog.cpp @@ -23,7 +23,6 @@ */ #include -#include #include #include #include @@ -46,6 +45,7 @@ #include "tooltip.h" #include "led_checkbox.h" #include "lcd_spinbox.h" +#include "FileDialog.h" // platform-specific audio-interface-classes @@ -1056,13 +1056,8 @@ void setupDialog::toggleOneInstrumentTrackWindow( bool _enabled ) void setupDialog::openWorkingDir() { - QString new_dir = QFileDialog::getExistingDirectory( this, - tr( "Choose LMMS working directory" ), - m_workingDir -#if QT_VERSION >= 0x040806 - , QFileDialog::DontUseCustomDirectoryIcons -#endif - ); + QString new_dir = FileDialog::getExistingDirectory( this, + tr( "Choose LMMS working directory" ), m_workingDir ); if( new_dir != QString::null ) { m_wdLineEdit->setText( new_dir ); @@ -1082,7 +1077,7 @@ void setupDialog::setWorkingDir( const QString & _wd ) void setupDialog::openVSTDir() { - QString new_dir = QFileDialog::getExistingDirectory( this, + QString new_dir = FileDialog::getExistingDirectory( this, tr( "Choose your VST-plugin directory" ), m_vstDir ); if( new_dir != QString::null ) @@ -1104,7 +1099,7 @@ void setupDialog::setVSTDir( const QString & _vd ) void setupDialog::openArtworkDir() { - QString new_dir = QFileDialog::getExistingDirectory( this, + QString new_dir = FileDialog::getExistingDirectory( this, tr( "Choose artwork-theme directory" ), m_artworkDir ); if( new_dir != QString::null ) @@ -1126,7 +1121,7 @@ void setupDialog::setArtworkDir( const QString & _ad ) void setupDialog::openFLDir() { - QString new_dir = QFileDialog::getExistingDirectory( this, + QString new_dir = FileDialog::getExistingDirectory( this, tr( "Choose FL Studio installation directory" ), m_flDir ); if( new_dir != QString::null ) @@ -1140,7 +1135,7 @@ void setupDialog::openFLDir() void setupDialog::openLADSPADir() { - QString new_dir = QFileDialog::getExistingDirectory( this, + QString new_dir = FileDialog::getExistingDirectory( this, tr( "Choose LADSPA plugin directory" ), m_ladDir ); if( new_dir != QString::null ) @@ -1163,7 +1158,7 @@ void setupDialog::openLADSPADir() void setupDialog::openSTKDir() { #ifdef LMMS_HAVE_STK - QString new_dir = QFileDialog::getExistingDirectory( this, + QString new_dir = FileDialog::getExistingDirectory( this, tr( "Choose STK rawwave directory" ), m_stkDir ); if( new_dir != QString::null ) @@ -1179,7 +1174,7 @@ void setupDialog::openSTKDir() void setupDialog::openDefaultSoundfont() { #ifdef LMMS_HAVE_FLUIDSYNTH - QString new_file = QFileDialog::getOpenFileName( this, + QString new_file = FileDialog::getOpenFileName( this, tr( "Choose default SoundFont" ), m_defaultSoundfont, "SoundFont2 Files (*.sf2)" ); @@ -1212,7 +1207,7 @@ void setupDialog::openBackgroundArtwork() QString dir = ( m_backgroundArtwork.isEmpty() ) ? m_artworkDir : m_backgroundArtwork; - QString new_file = QFileDialog::getOpenFileName( this, + QString new_file = FileDialog::getOpenFileName( this, tr( "Choose background artwork" ), dir, "Image Files (" + fileTypes + ")" ); diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index f9c3ad9a1..41db524ed 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -38,6 +37,7 @@ #include #include +#include "FileDialog.h" #include "InstrumentTrack.h" #include "AudioPort.h" #include "AutomationPattern.h" @@ -1462,7 +1462,7 @@ void InstrumentTrackWindow::modelChanged() void InstrumentTrackWindow::saveSettingsBtnClicked() { - QFileDialog sfd( this, tr( "Save preset" ), "", + FileDialog sfd( this, tr( "Save preset" ), "", tr( "XML preset file (*.xpf)" ) ); QString preset_root = configManager::inst()->userPresetsDir(); @@ -1475,9 +1475,9 @@ void InstrumentTrackWindow::saveSettingsBtnClicked() QDir( preset_root ).mkdir( m_track->instrumentName() ); } - sfd.setAcceptMode( QFileDialog::AcceptSave ); + sfd.setAcceptMode( FileDialog::AcceptSave ); sfd.setDirectory( preset_root + m_track->instrumentName() ); - sfd.setFileMode( QFileDialog::AnyFile ); + sfd.setFileMode( FileDialog::AnyFile ); if( sfd.exec () == QDialog::Accepted && !sfd.selectedFiles().isEmpty() && sfd.selectedFiles()[0] != "" ) From 5c186eba0e96a8248cc22c3a1e8edfff62382560 Mon Sep 17 00:00:00 2001 From: Lukas W Date: Fri, 24 Jan 2014 15:33:50 +0100 Subject: [PATCH 008/110] Add new class VersionedSaveDialog A file save dialog (inherits FileDialog) that provides buttons to increment or decrement a version which is appended to the file name. (e.g. "MyProject-01.mmpz") --- include/FileDialog.h | 2 + include/VersionedSaveDialog.h | 53 +++++++++ src/gui/MainWindow.cpp | 5 +- src/gui/dialogs/FileDialog.cpp | 8 ++ src/gui/dialogs/VersionedSaveDialog.cpp | 139 ++++++++++++++++++++++++ 5 files changed, 204 insertions(+), 3 deletions(-) create mode 100644 include/VersionedSaveDialog.h create mode 100644 src/gui/dialogs/VersionedSaveDialog.cpp diff --git a/include/FileDialog.h b/include/FileDialog.h index 4a0c678ce..ddc231546 100644 --- a/include/FileDialog.h +++ b/include/FileDialog.h @@ -35,6 +35,8 @@ public: explicit FileDialog( QWidget *parent = 0, const QString &caption = QString(), const QString &directory = QString(), const QString &filter = QString() ); + + void clearSelection(); }; #endif // FILEDIALOG_HPP diff --git a/include/VersionedSaveDialog.h b/include/VersionedSaveDialog.h new file mode 100644 index 000000000..8041f00f1 --- /dev/null +++ b/include/VersionedSaveDialog.h @@ -0,0 +1,53 @@ +/* + * VersionedSaveDialog.h - declaration of class VersionedSaveDialog, a file save + * dialog that provides buttons to increment or decrement a version which is + * appended to the file name. (e.g. "MyProject-01.mmpz") + * + * Copyright (c) 2014 Lukas W + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 VERSIONEDSAVEDIALOG_H +#define VERSIONEDSAVEDIALOG_H + +#include "FileDialog.h" + +class QLineEdit; + + +class VersionedSaveDialog : public FileDialog +{ + Q_OBJECT +public: + explicit VersionedSaveDialog( QWidget *parent = 0, + const QString &caption = QString(), + const QString &directory = QString(), + const QString &filter = QString() ); + + // Returns true if file name was changed, returns false if it wasn't + static bool changeFileNameVersion( QString &fileName, bool increment ); + +public slots: + void incrementVersion(); + void decrementVersion(); +}; + +#endif // VERSIONEDSAVEDIALOG_H diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 82a8a6169..002237f63 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -62,6 +62,7 @@ #include "AutomationEditor.h" #include "templates.h" #include "FileDialog.h" +#include "VersionedSaveDialog.h" @@ -748,11 +749,9 @@ bool MainWindow::saveProject( void ) bool MainWindow::saveProjectAs( void ) { - FileDialog sfd( this, tr( "Save project" ), "", + VersionedSaveDialog sfd( this, tr( "Save project" ), "", tr( "MultiMedia Project (*.mmp *.mmpz);;" "MultiMedia Project Template (*.mpt)" ) ); - sfd.setAcceptMode( QFileDialog::AcceptSave ); - sfd.setFileMode( QFileDialog::AnyFile ); QString f = engine::getSong()->projectFileName(); if( f != "" ) { diff --git a/src/gui/dialogs/FileDialog.cpp b/src/gui/dialogs/FileDialog.cpp index d506a8209..6e57329c1 100644 --- a/src/gui/dialogs/FileDialog.cpp +++ b/src/gui/dialogs/FileDialog.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include "FileDialog.h" @@ -53,5 +54,12 @@ FileDialog::FileDialog( QWidget *parent, const QString &caption, setSidebarUrls(urls); } +void FileDialog::clearSelection() +{ + static QListView *view = findChild(); + Q_ASSERT( view ); + view->clearSelection(); +} + #include "moc_FileDialog.cxx" diff --git a/src/gui/dialogs/VersionedSaveDialog.cpp b/src/gui/dialogs/VersionedSaveDialog.cpp new file mode 100644 index 000000000..c52f47dc2 --- /dev/null +++ b/src/gui/dialogs/VersionedSaveDialog.cpp @@ -0,0 +1,139 @@ +/* + * VersionedSaveDialog.cpp - implementation of class VersionedSaveDialog + * + * Copyright (c) 2014 Lukas W + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 +#include +#include + +#include "VersionedSaveDialog.h" + + + + +VersionedSaveDialog::VersionedSaveDialog( QWidget *parent, + const QString &caption, + const QString &directory, + const QString &filter ) : + FileDialog(parent, caption, directory, filter) +{ + setAcceptMode( QFileDialog::AcceptSave ); + setFileMode( QFileDialog::AnyFile ); + + // Create + and - buttons + QPushButton *plusButton( new QPushButton( "+", this) ); + plusButton->setToolTip( tr( "Increment version number" ) ); + QPushButton *minusButton( new QPushButton( "-", this ) ); + minusButton->setToolTip( tr( "Decrement version number" ) ); + plusButton->setFixedWidth( plusButton->fontMetrics().width( "+" ) + 30 ); + minusButton->setFixedWidth( minusButton->fontMetrics().width( "+" ) + 30 ); + + // Add buttons to grid layout. For doing this, remove the lineEdit and + // replace it with a HBox containing lineEdit and the buttons. + QGridLayout *layout = dynamic_cast( this->layout() ); + QWidget *lineEdit = findChild(); + layout->removeWidget( lineEdit ); + + QHBoxLayout* hLayout( new QHBoxLayout() ); + hLayout->addWidget( lineEdit ); + hLayout->addWidget( plusButton ); + hLayout->addWidget( minusButton ); + layout->addLayout( hLayout, 2, 1 ); + + // Connect + and - buttons + connect( plusButton, SIGNAL( clicked() ), this, SLOT( incrementVersion() )); + connect( minusButton, SIGNAL( clicked() ), this, SLOT( decrementVersion() )); +} + + + + +bool VersionedSaveDialog::changeFileNameVersion(QString &fileName, bool increment ) +{ + static QRegExp regexp( "-\\d+(\\.\\w+)?$" ); + + int idx = regexp.indexIn( fileName ); + // For file names without extension (no ".mmpz") + int insertIndex = fileName.lastIndexOf( '.' ); + if ( insertIndex < idx+1 ) + insertIndex = fileName.size(); + + if ( idx == -1 ) + { + // Can't decrement if there is no version number + if ( increment == false ) + return false; + else + fileName.insert( insertIndex, "-01" ); + } + else + { + // Find current version number + QString number = fileName.mid( idx+1, insertIndex - idx - 1 ); + bool ok; + ushort version = number.toUShort( &ok ); + Q_ASSERT( ok ); + + // Can't decrement 0 + if ( !increment and version == 0 ) + return false; + // Replace version number + version = increment ? version + 1 : version - 1; + QString newnumber = QString( "%1" ).arg( version, 2, 10, QChar( '0' ) ); + + fileName.replace( idx+1, number.length(), newnumber ); + } + return true; +} + + + + +void VersionedSaveDialog::incrementVersion() +{ + const QStringList& selected = selectedFiles(); + if ( selected.size() != 1 ) + return; + QString file = selected[0]; + changeFileNameVersion( file, true ); + clearSelection(); + selectFile( file ); +} + + + + +void VersionedSaveDialog::decrementVersion() +{ + const QStringList& selected = selectedFiles(); + if ( selected.size() != 1 ) + return; + QString file = selected[0]; + changeFileNameVersion( file, false ); + clearSelection(); + selectFile( file ); +} + +#include "moc_VersionedSaveDialog.cxx" From 84a6d0bf021e2a35628c39daaa8a67f594843ba1 Mon Sep 17 00:00:00 2001 From: Lukas W Date: Fri, 24 Jan 2014 15:45:13 +0100 Subject: [PATCH 009/110] Add "Save as new version" action to project menu Use Shortcut Ctrl+Alt+S. Part of issue #86 --- include/MainWindow.h | 1 + src/gui/MainWindow.cpp | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/include/MainWindow.h b/include/MainWindow.h index 6335c6401..8a10f1351 100644 --- a/include/MainWindow.h +++ b/include/MainWindow.h @@ -102,6 +102,7 @@ public slots: void openProject( void ); bool saveProject( void ); bool saveProjectAs( void ); + bool saveProjectAsNewVersion( void ); void showSettingsDialog( void ); void aboutLMMS( void ); void help( void ); diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 002237f63..682be6868 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -243,6 +243,10 @@ void MainWindow::finalize( void ) this, SLOT( saveProject() ), Qt::CTRL + Qt::Key_S ); + project_menu->addAction( embed::getIconPixmap( "project_save" ), + tr( "Save as new &version" ), + this, SLOT( saveProjectAsNewVersion() ), + Qt::CTRL + Qt::ALT + Qt::Key_S ); project_menu->addAction( embed::getIconPixmap( "project_saveas" ), tr( "Save &As..." ), this, SLOT( saveProjectAs() ), @@ -776,6 +780,24 @@ bool MainWindow::saveProjectAs( void ) +bool MainWindow::saveProjectAsNewVersion( void ) +{ + QString fileName = engine::getSong()->projectFileName(); + if( fileName == "" ) + { + return saveProjectAs(); + } + else + { + VersionedSaveDialog::changeFileNameVersion( fileName, true ); + engine::getSong()->guiSaveProjectAs( fileName ); + return true; + } +} + + + + void MainWindow::showSettingsDialog( void ) { setupDialog sd; From c45aafc748e94582df6e19b4563497b352f46815 Mon Sep 17 00:00:00 2001 From: Wong Cho Ching Date: Fri, 24 Jan 2014 22:55:32 +0800 Subject: [PATCH 010/110] Make LFO controller accept custom waveforms --- include/LfoController.h | 9 ++ include/SampleBuffer.h | 3 +- include/graph.h | 2 +- plugins/bit_invader/bit_invader.cpp | 93 ++++++++++--------- plugins/bit_invader/bit_invader.h | 16 ++-- .../triple_oscillator/TripleOscillator.cpp | 3 +- plugins/vibed/vibed.cpp | 6 +- src/core/LfoController.cpp | 16 +++- src/core/SampleBuffer.cpp | 17 ++++ src/gui/LfoControllerDialog.cpp | 33 +++++-- src/gui/widgets/graph.cpp | 19 ++++ 11 files changed, 147 insertions(+), 70 deletions(-) diff --git a/include/LfoController.h b/include/LfoController.h index 45118e9e1..59bea8689 100644 --- a/include/LfoController.h +++ b/include/LfoController.h @@ -75,6 +75,8 @@ protected: sample_t (*m_sampleFunction)( const float ); +private: + SampleBuffer * m_userDefSampleBuffer; protected slots: void updateSampleFunction(); @@ -107,6 +109,13 @@ protected: automatableButtonGroup * m_waveBtnGrp; automatableButtonGroup * m_multiplierBtnGrp; + +private: + pixmapButton * m_userWaveBtn; + +private slots: + void askUserDefWave(); + } ; #endif diff --git a/include/SampleBuffer.h b/include/SampleBuffer.h index cd5a243e1..e42d3690e 100644 --- a/include/SampleBuffer.h +++ b/include/SampleBuffer.h @@ -172,7 +172,8 @@ public: return m_data; } - QString openAudioFile() const; + QString openAudioFile() const; + QString openAndSetAudioFile(); QString & toBase64( QString & _dst ) const; diff --git a/include/graph.h b/include/graph.h index 9be552f33..20437996e 100644 --- a/include/graph.h +++ b/include/graph.h @@ -151,7 +151,7 @@ public slots: void setWaveToSaw(); void setWaveToSquare(); void setWaveToNoise(); - //void setWaveToUser( ); + QString setWaveToUser( ); void smooth(); void normalize(); diff --git a/plugins/bit_invader/bit_invader.cpp b/plugins/bit_invader/bit_invader.cpp index df588eeb4..080c424f3 100644 --- a/plugins/bit_invader/bit_invader.cpp +++ b/plugins/bit_invader/bit_invader.cpp @@ -243,7 +243,7 @@ void bitInvader::normalize() const float f = fabsf( samples[i] ); if (f > max) { max = f; } } - normalizeFactor = 1.0 / max; + m_normalizeFactor = 1.0 / max; } @@ -270,7 +270,7 @@ void bitInvader::playNote( notePlayHandle * _n, } else { - factor = normalizeFactor; + factor = m_normalizeFactor; } _n->m_pluginData = new bSynth( @@ -350,69 +350,69 @@ bitInvaderView::bitInvaderView( Instrument * _instrument, m_graph->setPalette( pal ); - sinWaveBtn = new pixmapButton( this, tr( "Sine wave" ) ); - sinWaveBtn->move( 188, 120 ); - sinWaveBtn->setActiveGraphic( embed::getIconPixmap( + m_sinWaveBtn = new pixmapButton( this, tr( "Sine wave" ) ); + m_sinWaveBtn->move( 188, 120 ); + m_sinWaveBtn->setActiveGraphic( embed::getIconPixmap( "sin_wave_active" ) ); - sinWaveBtn->setInactiveGraphic( embed::getIconPixmap( + m_sinWaveBtn->setInactiveGraphic( embed::getIconPixmap( "sin_wave_inactive" ) ); - toolTip::add( sinWaveBtn, + toolTip::add( m_sinWaveBtn, tr( "Click for a sine-wave." ) ); - triangleWaveBtn = new pixmapButton( this, tr( "Triangle wave" ) ); - triangleWaveBtn->move( 188, 136 ); - triangleWaveBtn->setActiveGraphic( + m_triangleWaveBtn = new pixmapButton( this, tr( "Triangle wave" ) ); + m_triangleWaveBtn->move( 188, 136 ); + m_triangleWaveBtn->setActiveGraphic( embed::getIconPixmap( "triangle_wave_active" ) ); - triangleWaveBtn->setInactiveGraphic( + m_triangleWaveBtn->setInactiveGraphic( embed::getIconPixmap( "triangle_wave_inactive" ) ); - toolTip::add( triangleWaveBtn, + toolTip::add( m_triangleWaveBtn, tr( "Click here for a triangle-wave." ) ); - sawWaveBtn = new pixmapButton( this, tr( "Saw wave" ) ); - sawWaveBtn->move( 188, 152 ); - sawWaveBtn->setActiveGraphic( embed::getIconPixmap( + m_sawWaveBtn = new pixmapButton( this, tr( "Saw wave" ) ); + m_sawWaveBtn->move( 188, 152 ); + m_sawWaveBtn->setActiveGraphic( embed::getIconPixmap( "saw_wave_active" ) ); - sawWaveBtn->setInactiveGraphic( embed::getIconPixmap( + m_sawWaveBtn->setInactiveGraphic( embed::getIconPixmap( "saw_wave_inactive" ) ); - toolTip::add( sawWaveBtn, + toolTip::add( m_sawWaveBtn, tr( "Click here for a saw-wave." ) ); - sqrWaveBtn = new pixmapButton( this, tr( "Square wave" ) ); - sqrWaveBtn->move( 188, 168 ); - sqrWaveBtn->setActiveGraphic( embed::getIconPixmap( + m_sqrWaveBtn = new pixmapButton( this, tr( "Square wave" ) ); + m_sqrWaveBtn->move( 188, 168 ); + m_sqrWaveBtn->setActiveGraphic( embed::getIconPixmap( "square_wave_active" ) ); - sqrWaveBtn->setInactiveGraphic( embed::getIconPixmap( + m_sqrWaveBtn->setInactiveGraphic( embed::getIconPixmap( "square_wave_inactive" ) ); - toolTip::add( sqrWaveBtn, + toolTip::add( m_sqrWaveBtn, tr( "Click here for a square-wave." ) ); - whiteNoiseWaveBtn = new pixmapButton( this, + m_whiteNoiseWaveBtn = new pixmapButton( this, tr( "White noise wave" ) ); - whiteNoiseWaveBtn->move( 188, 184 ); - whiteNoiseWaveBtn->setActiveGraphic( + m_whiteNoiseWaveBtn->move( 188, 184 ); + m_whiteNoiseWaveBtn->setActiveGraphic( embed::getIconPixmap( "white_noise_wave_active" ) ); - whiteNoiseWaveBtn->setInactiveGraphic( + m_whiteNoiseWaveBtn->setInactiveGraphic( embed::getIconPixmap( "white_noise_wave_inactive" ) ); - toolTip::add( whiteNoiseWaveBtn, + toolTip::add( m_whiteNoiseWaveBtn, tr( "Click here for white-noise." ) ); - usrWaveBtn = new pixmapButton( this, tr( "User defined wave" ) ); - usrWaveBtn->move( 188, 200 ); - usrWaveBtn->setActiveGraphic( embed::getIconPixmap( + m_usrWaveBtn = new pixmapButton( this, tr( "User defined wave" ) ); + m_usrWaveBtn->move( 188, 200 ); + m_usrWaveBtn->setActiveGraphic( embed::getIconPixmap( "usr_wave_active" ) ); - usrWaveBtn->setInactiveGraphic( embed::getIconPixmap( + m_usrWaveBtn->setInactiveGraphic( embed::getIconPixmap( "usr_wave_inactive" ) ); - toolTip::add( usrWaveBtn, + toolTip::add( m_usrWaveBtn, tr( "Click here for a user-defined shape." ) ); - smoothBtn = new pixmapButton( this, tr( "Smooth" ) ); - smoothBtn->move( 35, 200 ); - smoothBtn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + m_smoothBtn = new pixmapButton( this, tr( "Smooth" ) ); + m_smoothBtn->move( 35, 200 ); + m_smoothBtn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( "smooth" ) ); - smoothBtn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + m_smoothBtn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "smooth" ) ); - smoothBtn->setChecked( true ); - toolTip::add( smoothBtn, + m_smoothBtn->setChecked( true ); + toolTip::add( m_smoothBtn, tr( "Click here to smooth waveform." ) ); @@ -426,20 +426,20 @@ bitInvaderView::bitInvaderView( Instrument * _instrument, m_normalizeToggle->move( 55, 100 ); - connect( sinWaveBtn, SIGNAL (clicked () ), + connect( m_sinWaveBtn, SIGNAL (clicked () ), this, SLOT ( sinWaveClicked() ) ); - connect( triangleWaveBtn, SIGNAL ( clicked () ), + connect( m_triangleWaveBtn, SIGNAL ( clicked () ), this, SLOT ( triangleWaveClicked() ) ); - connect( sawWaveBtn, SIGNAL (clicked () ), + connect( m_sawWaveBtn, SIGNAL (clicked () ), this, SLOT ( sawWaveClicked() ) ); - connect( sqrWaveBtn, SIGNAL ( clicked () ), + connect( m_sqrWaveBtn, SIGNAL ( clicked () ), this, SLOT ( sqrWaveClicked() ) ); - connect( whiteNoiseWaveBtn, SIGNAL ( clicked () ), + connect( m_whiteNoiseWaveBtn, SIGNAL ( clicked () ), this, SLOT ( noiseWaveClicked() ) ); - connect( usrWaveBtn, SIGNAL ( clicked () ), + connect( m_usrWaveBtn, SIGNAL ( clicked () ), this, SLOT ( usrWaveClicked() ) ); - connect( smoothBtn, SIGNAL ( clicked () ), + connect( m_smoothBtn, SIGNAL ( clicked () ), this, SLOT ( smoothClicked() ) ); connect( m_interpolationToggle, SIGNAL( toggled( bool ) ), @@ -514,6 +514,9 @@ void bitInvaderView::noiseWaveClicked() void bitInvaderView::usrWaveClicked() { + QString fileName = m_graph->model()->setWaveToUser(); + toolTip::add( m_usrWaveBtn, fileName ); + engine::getSong()->setModified(); /* m_graph->model()->setWaveToNoise(); engine::getSong()->setModified(); diff --git a/plugins/bit_invader/bit_invader.h b/plugins/bit_invader/bit_invader.h index c38eb6b41..7a3217b47 100644 --- a/plugins/bit_invader/bit_invader.h +++ b/plugins/bit_invader/bit_invader.h @@ -99,7 +99,7 @@ private: BoolModel m_interpolation; BoolModel m_normalize; - float normalizeFactor; + float m_normalizeFactor; oscillator * m_osc; @@ -136,13 +136,13 @@ private: virtual void modelChanged(); knob * m_sampleLengthKnob; - pixmapButton * sinWaveBtn; - pixmapButton * triangleWaveBtn; - pixmapButton * sqrWaveBtn; - pixmapButton * sawWaveBtn; - pixmapButton * whiteNoiseWaveBtn; - pixmapButton * smoothBtn; - pixmapButton * usrWaveBtn; + pixmapButton * m_sinWaveBtn; + pixmapButton * m_triangleWaveBtn; + pixmapButton * m_sqrWaveBtn; + pixmapButton * m_sawWaveBtn; + pixmapButton * m_whiteNoiseWaveBtn; + pixmapButton * m_smoothBtn; + pixmapButton * m_usrWaveBtn; static QPixmap * s_artwork; diff --git a/plugins/triple_oscillator/TripleOscillator.cpp b/plugins/triple_oscillator/TripleOscillator.cpp index ae8510bab..20a017989 100644 --- a/plugins/triple_oscillator/TripleOscillator.cpp +++ b/plugins/triple_oscillator/TripleOscillator.cpp @@ -138,10 +138,9 @@ OscillatorObject::~OscillatorObject() void OscillatorObject::oscUserDefWaveDblClick() { - QString af = m_sampleBuffer->openAudioFile(); + QString af = m_sampleBuffer->openAndSetAudioFile(); if( af != "" ) { - m_sampleBuffer->setAudioFile( af ); // TODO: //toolTip::add( m_usrWaveBtn, m_sampleBuffer->audioFile() ); } diff --git a/plugins/vibed/vibed.cpp b/plugins/vibed/vibed.cpp index 7464e1daa..7872db7ca 100644 --- a/plugins/vibed/vibed.cpp +++ b/plugins/vibed/vibed.cpp @@ -728,9 +728,9 @@ void vibedView::noiseWaveClicked() void vibedView::usrWaveClicked() { - // TODO: load file - //m_graph->model()->setWaveToUser(); - //engine::getSongEditor()->setModified(); + QString fileName = m_graph->model()->setWaveToUser(); + toolTip::add( m_usrWaveBtn, fileName ); + engine::getSong()->setModified(); } diff --git a/src/core/LfoController.cpp b/src/core/LfoController.cpp index a189d500e..fa14c8b2d 100644 --- a/src/core/LfoController.cpp +++ b/src/core/LfoController.cpp @@ -49,7 +49,8 @@ LfoController::LfoController( Model * _parent ) : m_duration( 1000 ), m_phaseCorrection( 0 ), m_phaseOffset( 0 ), - m_sampleFunction( &Oscillator::sinSample ) + m_sampleFunction( &Oscillator::sinSample ), + m_userDefSampleBuffer( new SampleBuffer ) { connect( &m_waveModel, SIGNAL( dataChanged() ), @@ -61,6 +62,7 @@ LfoController::LfoController( Model * _parent ) : LfoController::~LfoController() { + sharedObject::unref( m_userDefSampleBuffer ); m_baseModel.disconnect( this ); m_speedModel.disconnect( this ); m_amountModel.disconnect( this ); @@ -164,7 +166,9 @@ float LfoController::value( int _offset ) // 44100 frames/sec return m_baseModel.value() + ( m_amountModel.value() * - m_sampleFunction(sampleFrame) + ( m_sampleFunction != NULL ? + m_sampleFunction(sampleFrame): + m_userDefSampleBuffer->userWaveSample(sampleFrame) ) / 2.0f ); } @@ -196,6 +200,14 @@ void LfoController::updateSampleFunction() case Oscillator::WhiteNoise: m_sampleFunction = &Oscillator::noiseSample; break; + case Oscillator::UserDefinedWave: + m_sampleFunction = NULL; + /*TODO: If C++11 is allowed, should change the type of + m_sampleFunction be std::function + and use the line below: + */ + //m_sampleFunction = &(m_userDefSampleBuffer->userWaveSample) + break; } } diff --git a/src/core/SampleBuffer.cpp b/src/core/SampleBuffer.cpp index 3308faf60..63f3a5993 100644 --- a/src/core/SampleBuffer.cpp +++ b/src/core/SampleBuffer.cpp @@ -894,6 +894,23 @@ QString SampleBuffer::openAudioFile() const } + + +QString SampleBuffer::openAndSetAudioFile() +{ + QString fileName = this->openAudioFile(); + + if(!fileName.isEmpty()) + { + this->setAudioFile( fileName ); + } + + return fileName; +} + + + + #undef LMMS_HAVE_FLAC_STREAM_ENCODER_H /* not yet... */ #undef LMMS_HAVE_FLAC_STREAM_DECODER_H diff --git a/src/gui/LfoControllerDialog.cpp b/src/gui/LfoControllerDialog.cpp index 05458085e..f9c151d70 100644 --- a/src/gui/LfoControllerDialog.cpp +++ b/src/gui/LfoControllerDialog.cpp @@ -178,15 +178,17 @@ LfoControllerDialog::LfoControllerDialog( Controller * _model, QWidget * _parent toolTip::add( white_noise_btn, tr( "Click here for white-noise." ) ); - pixmapButton * uwb = new pixmapButton( this, NULL ); - uwb->move( CD_LFO_SHAPES_X + 45, CD_LFO_SHAPES_Y + 15 ); - uwb->setActiveGraphic( embed::getIconPixmap( + m_userWaveBtn = new pixmapButton( this, NULL ); + m_userWaveBtn->move( CD_LFO_SHAPES_X + 45, CD_LFO_SHAPES_Y + 15 ); + m_userWaveBtn->setActiveGraphic( embed::getIconPixmap( "usr_wave_active" ) ); - uwb->setInactiveGraphic( embed::getIconPixmap( + m_userWaveBtn->setInactiveGraphic( embed::getIconPixmap( "usr_wave_inactive" ) ); - uwb->setEnabled( false ); - toolTip::add( uwb, tr( "Click here for a user-defined " - "shape." ) ); + connect( m_userWaveBtn, + SIGNAL( doubleClicked() ), + this, SLOT( askUserDefWave() ) ); + toolTip::add( m_userWaveBtn, + tr( "Click here for a user-defined shape." ) ); m_waveBtnGrp = new automatableButtonGroup( this ); m_waveBtnGrp->addButton( sin_wave_btn ); @@ -196,7 +198,7 @@ LfoControllerDialog::LfoControllerDialog( Controller * _model, QWidget * _parent m_waveBtnGrp->addButton( moog_saw_wave_btn ); m_waveBtnGrp->addButton( exp_wave_btn ); m_waveBtnGrp->addButton( white_noise_btn ); - m_waveBtnGrp->addButton( uwb ); + m_waveBtnGrp->addButton( m_userWaveBtn ); pixmapButton * x1 = new pixmapButton( this, NULL ); @@ -240,11 +242,26 @@ LfoControllerDialog::LfoControllerDialog( Controller * _model, QWidget * _parent LfoControllerDialog::~LfoControllerDialog() { + m_userWaveBtn->disconnect( this ); //delete m_subWindow; } +void LfoControllerDialog::askUserDefWave() +{ + SampleBuffer * sampleBuffer = dynamic_cast(this->model())-> + m_userDefSampleBuffer; + QString fileName = sampleBuffer->openAndSetAudioFile(); + if( fileName.isEmpty() == false ) + { + // TODO: + toolTip::add( m_userWaveBtn, sampleBuffer->audioFile() ); + } +} + + + void LfoControllerDialog::contextMenuEvent( QContextMenuEvent * ) { /* diff --git a/src/gui/widgets/graph.cpp b/src/gui/widgets/graph.cpp index 538bb2544..9a4347647 100644 --- a/src/gui/widgets/graph.cpp +++ b/src/gui/widgets/graph.cpp @@ -482,6 +482,25 @@ void graphModel::setWaveToNoise() emit samplesChanged( 0, length() - 1 ); }; +QString graphModel::setWaveToUser() +{ + SampleBuffer * sampleBuffer = new SampleBuffer; + QString fileName = sampleBuffer->openAndSetAudioFile(); + if( fileName.isEmpty() == false ) + { + for( int i = 0; i < length(); i++ ) + { + m_samples[i] = sampleBuffer->userWaveSample( + i / static_cast( length() ) ); + } + } + + sharedObject::unref( sampleBuffer ); + + emit samplesChanged( 0, length() - 1 ); + return fileName; +}; + void graphModel::smooth() From 9237a1d015e320e85a2e50988170ea0c744ec8d3 Mon Sep 17 00:00:00 2001 From: Wong Cho Ching Date: Fri, 24 Jan 2014 23:10:18 +0800 Subject: [PATCH 011/110] Tooltip: Changed tooltip text of LFOControllDialog of custom waveform --- src/gui/LfoControllerDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/LfoControllerDialog.cpp b/src/gui/LfoControllerDialog.cpp index f9c151d70..3aa9f7c0a 100644 --- a/src/gui/LfoControllerDialog.cpp +++ b/src/gui/LfoControllerDialog.cpp @@ -188,7 +188,7 @@ LfoControllerDialog::LfoControllerDialog( Controller * _model, QWidget * _parent SIGNAL( doubleClicked() ), this, SLOT( askUserDefWave() ) ); toolTip::add( m_userWaveBtn, - tr( "Click here for a user-defined shape." ) ); + tr( "Click here for a user-defined shape.\nDouble click to pick a file." ) ); m_waveBtnGrp = new automatableButtonGroup( this ); m_waveBtnGrp->addButton( sin_wave_btn ); From 453290f1b963249a591ba47d8fc466e17bf2a8b1 Mon Sep 17 00:00:00 2001 From: Lukas W Date: Fri, 24 Jan 2014 16:18:04 +0100 Subject: [PATCH 012/110] About window: Make homepage link clickable --- src/gui/dialogs/about_dialog.ui | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/gui/dialogs/about_dialog.ui b/src/gui/dialogs/about_dialog.ui index b795fd0f8..e7f1bcb5b 100644 --- a/src/gui/dialogs/about_dialog.ui +++ b/src/gui/dialogs/about_dialog.ui @@ -1,3 +1,4 @@ + AboutDialog @@ -151,7 +152,7 @@ - http://lmms.sourceforge.net + <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> true From e94cec5ffc9027ca6202e60cc70c67e4655430c9 Mon Sep 17 00:00:00 2001 From: Lukas W Date: Fri, 24 Jan 2014 17:42:37 +0100 Subject: [PATCH 013/110] About window: Update copyright year to 2014 --- src/gui/dialogs/about_dialog.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/dialogs/about_dialog.ui b/src/gui/dialogs/about_dialog.ui index e7f1bcb5b..39c1974b9 100644 --- a/src/gui/dialogs/about_dialog.ui +++ b/src/gui/dialogs/about_dialog.ui @@ -126,7 +126,7 @@ - Copyright (c) 2004-2013, LMMS developers + Copyright (c) 2004-2014, LMMS developers true From da65f629e2f674a2a7b08957bfdc2745cf57c394 Mon Sep 17 00:00:00 2001 From: Lukas W Date: Fri, 24 Jan 2014 19:28:13 +0100 Subject: [PATCH 014/110] #67: Add list of all committers to about window --- CMakeLists.txt | 13 ++++++++++++- src/gui/about_dialog.cpp | 18 +++++++++++++++--- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 92e5d6b67..47c051617 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -346,7 +346,18 @@ FILE(GLOB_RECURSE lmms_SOURCES ${CMAKE_SOURCE_DIR}/src/*.cpp) SET(lmms_MOC ${lmms_INCLUDES}) -SET(lmms_EMBEDDED_RESOURCES ${CMAKE_SOURCE_DIR}/AUTHORS ${CMAKE_SOURCE_DIR}/COPYING) +# Get list of all committers from git history, ordered by number of commits +FIND_PACKAGE(Git) +IF(GIT_FOUND) + SET(CONTRIBUTORS ${CMAKE_BINARY_DIR}/CONTRIBUTORS) + EXECUTE_PROCESS( + COMMAND ${GIT_EXECUTABLE} shortlog -sne + COMMAND cut -c8- + OUTPUT_FILE ${CONTRIBUTORS} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) +ENDIF(GIT_FOUND) + +SET(lmms_EMBEDDED_RESOURCES ${CMAKE_SOURCE_DIR}/AUTHORS ${CMAKE_SOURCE_DIR}/COPYING ${CONTRIBUTORS}) QT4_WRAP_CPP(lmms_MOC_out ${lmms_MOC} OPTIONS -nw) QT4_WRAP_UI(lmms_UI_out ${lmms_UI}) diff --git a/src/gui/about_dialog.cpp b/src/gui/about_dialog.cpp index 41a502696..cd9cca16c 100644 --- a/src/gui/about_dialog.cpp +++ b/src/gui/about_dialog.cpp @@ -79,7 +79,19 @@ aboutDialog::aboutDialog() : authorLabel->setPlainText( embed::getText( "AUTHORS" ) ); licenseLabel->setPlainText( embed::getText( "COPYING" ) ); + + QString contText = embed::getText( "CONTRIBUTORS" ); + if ( contText.length() >= 2 ) + { + QWidget *widget = new QWidget(); + QVBoxLayout *layout = new QVBoxLayout(); + QTextEdit *contWidget = new QTextEdit(); + contWidget->setReadOnly(true); + contWidget->setText( contText ); + + layout->addWidget( new QLabel( tr("Contributors ordered by number of commits:"), this ) ); + layout->addWidget( contWidget ); + widget->setLayout( layout ); + tabWidget->insertTab( 2, widget, tr("Involved") ); + } } - - - From b1835c99d3847ca8c6968bfc46f21d3751a83f2d Mon Sep 17 00:00:00 2001 From: Lukas W Date: Fri, 24 Jan 2014 20:02:11 +0100 Subject: [PATCH 015/110] Travis: Set build mode to RelWithDebInfo This may lead to build errors, as variables that are only used in asserts will get optimized out and because of -Werror being set (unused variables). --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 92aa8a9d8..b16a73e8e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,4 +3,4 @@ compiler: gcc before_install: sudo apt-get update install: sudo apt-get install libqt4-dev libsndfile-dev fftw3-dev libvorbis-dev libogg-dev libasound2-dev libjack-dev libsdl-dev libsamplerate0-dev libstk0-dev libfluidsynth-dev portaudio19-dev wine-dev g++-multilib before_script: mkdir build && cd build -script: cmake .. && make -j8 +script: cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo .. && make -j8 From 67382654eb27c6402393f257d67da584dc2a70eb Mon Sep 17 00:00:00 2001 From: "Raine M. Ekman" Date: Fri, 24 Jan 2014 22:37:36 +0200 Subject: [PATCH 016/110] OpulenZ: added velocity & aftertouch, cleaned up some unneeded code --- plugins/opl2/CMakeLists.txt | 2 +- plugins/opl2/adlibemu.c | 608 -------------------------------- plugins/opl2/adlibemu.h | 26 -- plugins/opl2/kemuopl.h | 61 ---- plugins/opl2/opl2instrument.cpp | 1 - 5 files changed, 1 insertion(+), 697 deletions(-) delete mode 100644 plugins/opl2/adlibemu.c delete mode 100644 plugins/opl2/adlibemu.h delete mode 100644 plugins/opl2/kemuopl.h diff --git a/plugins/opl2/CMakeLists.txt b/plugins/opl2/CMakeLists.txt index 0b9bd32cd..981ec53a3 100644 --- a/plugins/opl2/CMakeLists.txt +++ b/plugins/opl2/CMakeLists.txt @@ -1,3 +1,3 @@ INCLUDE(BuildPlugin) -BUILD_PLUGIN(OPL2 opl2instrument.cpp opl2instrument.h opl.h kemuopl.h adlibemu.c adlibemu.h fmopl.c fmopl.h temuopl.cpp temuopl.h MOCFILES opl2instrument.h EMBEDDED_RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.png) \ No newline at end of file +BUILD_PLUGIN(OPL2 opl2instrument.cpp opl2instrument.h opl.h fmopl.c fmopl.h temuopl.cpp temuopl.h MOCFILES opl2instrument.h EMBEDDED_RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.png) \ No newline at end of file diff --git a/plugins/opl2/adlibemu.c b/plugins/opl2/adlibemu.c deleted file mode 100644 index 9aac3a6fc..000000000 --- a/plugins/opl2/adlibemu.c +++ /dev/null @@ -1,608 +0,0 @@ -/* - * ADLIBEMU.C - * Copyright (C) 1998-2001 Ken Silverman - * Ken Silverman's official web site: "http://www.advsys.net/ken" - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* -This file is a digital Adlib emulator for OPL2 and possibly OPL3 - -Features that could be added in a future version: -- Amplitude and Frequency Vibrato Bits (not hard, but a big speed hit) -- Global Keyboard Split Number Bit (need to research this one some more) -- 2nd Adlib chip for OPL3 (simply need to make my cell array bigger) -- Advanced connection modes of OPL3 (Just need to add more "docell" cases) -- L/R Stereo bits of OPL3 (Need adlibgetsample to return stereo) - -Features that aren't worth supporting: -- Anything related to adlib timers&interrupts (Sorry - I always used IRQ0) -- Composite sine wave mode (CSM) (Supported only on ancient cards) - -I'm not sure about a few things in my code: -- Attack curve. What function is this anyway? I chose to use an order-3 - polynomial to approximate but this doesn't seem right. -- Attack/Decay/Release constants - my constants may not be exact -- What should ADJUSTSPEED be? -- Haven't verified that Global Keyboard Split Number Bit works yet -- Some of the drums don't always sound right. It's pretty hard to guess - the exact waveform of drums when you look at random data which is - slightly randomized due to digital ADC recording. -- Adlib seems to have a lot more treble than my emulator does. I'm not - sure if this is simply unfixable due to the sound blaster's different - filtering on FM and digital playback or if it's a serious bug in my - code. -*/ - -#include -#include - -#if !defined(max) && !defined(__cplusplus) -#define max(a,b) (((a) > (b)) ? (a) : (b)) -#endif -#if !defined(min) && !defined(__cplusplus) -#define min(a,b) (((a) < (b)) ? (a) : (b)) -#endif - -#define PI 3.141592653589793 -#define MAXCELLS 18 -#define WAVPREC 2048 - -static float AMPSCALE=(8192.0); -#define FRQSCALE (49716/512.0) - -//Constants for Ken's Awe32, on a PII-266 (Ken says: Use these for KSM's!) -#define MODFACTOR 4.0 //How much of modulator cell goes into carrier -#define MFBFACTOR 1.0 //How much feedback goes back into modulator -#define ADJUSTSPEED 0.75 //0<=x<=1 Simulate finite rate of change of state - -//Constants for Ken's Awe64G, on a P-133 -//#define MODFACTOR 4.25 //How much of modulator cell goes into carrier -//#define MFBFACTOR 0.5 //How much feedback goes back into modulator -//#define ADJUSTSPEED 0.85 //0<=x<=1 Simulate finite rate of change of state - -typedef struct -{ - float val, t, tinc, vol, sustain, amp, mfb; - float a0, a1, a2, a3, decaymul, releasemul; - short *waveform; - long wavemask; - void (*cellfunc)(void *, float); - unsigned char flags, dum0, dum1, dum2; -} celltype; - -static long numspeakers, bytespersample; -static float recipsamp; -static celltype cell[MAXCELLS]; -static signed short wavtable[WAVPREC*3]; -static float kslmul[4] = {0.0,0.5,0.25,1.0}; -static float frqmul[16] = {.5,1,2,3,4,5,6,7,8,9,10,10,12,12,15,15}, nfrqmul[16]; -static unsigned char adlibreg[256], ksl[8][16]; -static unsigned char modulatorbase[9] = {0,1,2,8,9,10,16,17,18}; -static unsigned char odrumstat = 0; -static unsigned char base2cell[22] = {0,1,2,0,1,2,0,0,3,4,5,3,4,5,0,0,6,7,8,6,7,8}; - -float lvol[9] = {1,1,1,1,1,1,1,1,1}; //Volume multiplier on left speaker -float rvol[9] = {1,1,1,1,1,1,1,1,1}; //Volume multiplier on right speaker -long lplc[9] = {0,0,0,0,0,0,0,0,0}; //Samples to delay on left speaker -long rplc[9] = {0,0,0,0,0,0,0,0,0}; //Samples to delay on right speaker - -long nlvol[9], nrvol[9]; -long nlplc[9], nrplc[9]; -long rend = 0; -#define FIFOSIZ 256 -static float *rptr[9], *nrptr[9]; -static float rbuf[9][FIFOSIZ*2]; -static float snd[FIFOSIZ*2]; - -#ifndef USING_ASM -#define _inline -#endif - -#ifdef USING_ASM -static _inline void ftol (float f, long *a) -{ - _asm - { - mov eax, a - fld f - fistp dword ptr [eax] - } -} -#else -static void ftol(float f, long *a) { - *a=f; -} -#endif - -#define ctc ((celltype *)c) //A rare attempt to make code easier to read! -void docell4 (void *c, float modulator) { } -void docell3 (void *c, float modulator) -{ - long i; - - ftol(ctc->t+modulator,&i); - ctc->t += ctc->tinc; - ctc->val += (ctc->amp*ctc->vol*((float)ctc->waveform[i&ctc->wavemask])-ctc->val)*ADJUSTSPEED; -} -void docell2 (void *c, float modulator) -{ - long i; - - ftol(ctc->t+modulator,&i); - - void *amp_void = &ctc->amp; - long *amp_long = (long *)amp_void; - if (*amp_long <= 0x37800000) - { - ctc->amp = 0; - ctc->cellfunc = docell4; - } - ctc->amp *= ctc->releasemul; - - ctc->t += ctc->tinc; - ctc->val += (ctc->amp*ctc->vol*((float)ctc->waveform[i&ctc->wavemask])-ctc->val)*ADJUSTSPEED; -} -void docell1 (void *c, float modulator) -{ - long i; - - ftol(ctc->t+modulator,&i); - - void *amp_void = &ctc->amp; - long *amp_long = (long *)amp_void; - void *sustain_void = &ctc->sustain; - long *sustain_long = (long *)sustain_void; - if (*amp_long <= *sustain_long) - { - if (ctc->flags&32) - { - ctc->amp = ctc->sustain; - ctc->cellfunc = docell3; - } - else - ctc->cellfunc = docell2; - } - else - ctc->amp *= ctc->decaymul; - - ctc->t += ctc->tinc; - ctc->val += (ctc->amp*ctc->vol*((float)ctc->waveform[i&ctc->wavemask])-ctc->val)*ADJUSTSPEED; -} -void docell0 (void *c, float modulator) -{ - long i; - - ftol(ctc->t+modulator,&i); - - ctc->amp = ((ctc->a3*ctc->amp + ctc->a2)*ctc->amp + ctc->a1)*ctc->amp + ctc->a0; - void *amp_void = &ctc->amp; - long *amp_long = (long *)amp_void; - if (*amp_long > 0x3f800000) - { - ctc->amp = 1; - ctc->cellfunc = docell1; - } - - ctc->t += ctc->tinc; - ctc->val += (ctc->amp*ctc->vol*((float)ctc->waveform[i&ctc->wavemask])-ctc->val)*ADJUSTSPEED; -} - - -static long waveform[8] = {WAVPREC,WAVPREC>>1,WAVPREC,(WAVPREC*3)>>2,0,0,(WAVPREC*5)>>2,WAVPREC<<1}; -static long wavemask[8] = {WAVPREC-1,WAVPREC-1,(WAVPREC>>1)-1,(WAVPREC>>1)-1,WAVPREC-1,((WAVPREC*3)>>2)-1,WAVPREC>>1,WAVPREC-1}; -static long wavestart[8] = {0,WAVPREC>>1,0,WAVPREC>>2,0,0,0,WAVPREC>>3}; -static float attackconst[4] = {1/2.82624,1/2.25280,1/1.88416,1/1.59744}; -static float decrelconst[4] = {1/39.28064,1/31.41608,1/26.17344,1/22.44608}; -void cellon (long i, long j, celltype *c, unsigned char iscarrier) -{ - long frn, oct, toff; - float f; - - frn = ((((long)adlibreg[i+0xb0])&3)<<8) + (long)adlibreg[i+0xa0]; - oct = ((((long)adlibreg[i+0xb0])>>2)&7); - toff = (oct<<1) + ((frn>>9)&((frn>>8)|(((adlibreg[8]>>6)&1)^1))); - if (!(adlibreg[j+0x20]&16)) toff >>= 2; - - f = pow(2.0,(adlibreg[j+0x60]>>4)+(toff>>2)-1)*attackconst[toff&3]*recipsamp; - c->a0 = .0377*f; c->a1 = 10.73*f+1; c->a2 = -17.57*f; c->a3 = 7.42*f; - f = -7.4493*decrelconst[toff&3]*recipsamp; - c->decaymul = pow(2.0,f*pow(2.0,(adlibreg[j+0x60]&15)+(toff>>2))); - c->releasemul = pow(2.0,f*pow(2.0,(adlibreg[j+0x80]&15)+(toff>>2))); - c->wavemask = wavemask[adlibreg[j+0xe0]&7]; - c->waveform = &wavtable[waveform[adlibreg[j+0xe0]&7]]; - if (!(adlibreg[1]&0x20)) c->waveform = &wavtable[WAVPREC]; - c->t = wavestart[adlibreg[j+0xe0]&7]; - c->flags = adlibreg[j+0x20]; - c->cellfunc = docell0; - c->tinc = (float)(frn<vol = pow(2.0,((float)(adlibreg[j+0x40]&63) + - (float)kslmul[adlibreg[j+0x40]>>6]*ksl[oct][frn>>6]) * -.125 - 14); - c->sustain = pow(2.0,(float)(adlibreg[j+0x80]>>4) * -.5); - if (!iscarrier) c->amp = 0; - c->mfb = pow(2.0,((adlibreg[i+0xc0]>>1)&7)+5)*(WAVPREC/2048.0)*MFBFACTOR; - if (!(adlibreg[i+0xc0]&14)) c->mfb = 0; - c->val = 0; -} - -//This function (and bug fix) written by Chris Moeller -void cellfreq (signed long i, signed long j, celltype *c) -{ - long frn, oct; - - frn = ((((long)adlibreg[i+0xb0])&3)<<8) + (long)adlibreg[i+0xa0]; - oct = ((((long)adlibreg[i+0xb0])>>2)&7); - - c->tinc = (float)(frn<vol = pow(2.0,((float)(adlibreg[j+0x40]&63) + - (float)kslmul[adlibreg[j+0x40]>>6]*ksl[oct][frn>>6]) * -.125 - 14); -} - -static long initfirstime = 0; -void adlibinit (long dasamplerate, long danumspeakers, long dabytespersample) -{ - long i, j, frn, oct; - - memset((void *)adlibreg,0,sizeof(adlibreg)); - memset((void *)cell,0,sizeof(celltype)*MAXCELLS); - memset((void *)rbuf,0,sizeof(rbuf)); - rend = 0; odrumstat = 0; - - for(i=0;i=0;i--) nfrqmul[i] = frqmul[i]*recipsamp*FRQSCALE*(WAVPREC/2048.0); - - if (!initfirstime) - { - initfirstime = 1; - - for(i=0;i<(WAVPREC>>1);i++) - { - wavtable[i] = - wavtable[(i<<1) +WAVPREC] = (signed short)(16384*sin((float)((i<<1) )*PI*2/WAVPREC)); - wavtable[(i<<1)+1+WAVPREC] = (signed short)(16384*sin((float)((i<<1)+1)*PI*2/WAVPREC)); - } - for(i=0;i<(WAVPREC>>3);i++) - { - wavtable[i+(WAVPREC<<1)] = wavtable[i+(WAVPREC>>3)]-16384; - wavtable[i+((WAVPREC*17)>>3)] = wavtable[i+(WAVPREC>>2)]+16384; - } - - //[table in book]*8/3 - ksl[7][0] = 0; ksl[7][1] = 24; ksl[7][2] = 32; ksl[7][3] = 37; - ksl[7][4] = 40; ksl[7][5] = 43; ksl[7][6] = 45; ksl[7][7] = 47; - ksl[7][8] = 48; for(i=9;i<16;i++) ksl[7][i] = i+41; - for(j=6;j>=0;j--) - for(i=0;i<16;i++) - { - oct = (long)ksl[j+1][i]-8; if (oct < 0) oct = 0; - ksl[j][i] = (unsigned char)oct; - } - } - else - { - for(i=0;i<9;i++) - { - frn = ((((long)adlibreg[i+0xb0])&3)<<8) + (long)adlibreg[i+0xa0]; - oct = ((((long)adlibreg[i+0xb0])>>2)&7); - cell[i].tinc = (float)(frn< (odrumstat&16)) //BassDrum - { - cellon(6,16,&cell[6],0); - cellon(6,19,&cell[15],1); - cell[15].vol *= 2; - } - if ((v&8) > (odrumstat&8)) //Snare - { - cellon(16,20,&cell[16],0); - cell[16].tinc *= 2*(nfrqmul[adlibreg[17+0x20]&15] / nfrqmul[adlibreg[20+0x20]&15]); - if (((adlibreg[20+0xe0]&7) >= 3) && ((adlibreg[20+0xe0]&7) <= 5)) cell[16].vol = 0; - cell[16].vol *= 2; - } - if ((v&4) > (odrumstat&4)) //TomTom - { - cellon(8,18,&cell[8],0); - cell[8].vol *= 2; - } - if ((v&2) > (odrumstat&2)) //Cymbal - { - cellon(17,21,&cell[17],0); - - cell[17].wavemask = wavemask[5]; - cell[17].waveform = &wavtable[waveform[5]]; - cell[17].tinc *= 16; cell[17].vol *= 2; - - //cell[17].waveform = &wavtable[WAVPREC]; cell[17].wavemask = 0; - //if (((adlibreg[21+0xe0]&7) == 0) || ((adlibreg[21+0xe0]&7) == 6)) - // cell[17].waveform = &wavtable[(WAVPREC*7)>>2]; - //if (((adlibreg[21+0xe0]&7) == 2) || ((adlibreg[21+0xe0]&7) == 3)) - // cell[17].waveform = &wavtable[(WAVPREC*5)>>2]; - } - if ((v&1) > (odrumstat&1)) //Hihat - { - cellon(7,17,&cell[7],0); - if (((adlibreg[17+0xe0]&7) == 1) || ((adlibreg[17+0xe0]&7) == 4) || - ((adlibreg[17+0xe0]&7) == 5) || ((adlibreg[17+0xe0]&7) == 7)) cell[7].vol = 0; - if ((adlibreg[17+0xe0]&7) == 6) { cell[7].wavemask = 0; cell[7].waveform = &wavtable[(WAVPREC*7)>>2]; } - } - - odrumstat = v; - } - else if (((unsigned)(i-0x40) < (unsigned)22) && ((i&7) < 6)) - { - if ((i&7) < 3) // Modulator - cellfreq(base2cell[i-0x40],i-0x40,&cell[base2cell[i-0x40]]); - else // Carrier - cellfreq(base2cell[i-0x40],i-0x40,&cell[base2cell[i-0x40]+9]); - } - else if ((unsigned)(i-0xa0) < (unsigned)9) - { - cellfreq(i-0xa0,modulatorbase[i-0xa0],&cell[i-0xa0]); - cellfreq(i-0xa0,modulatorbase[i-0xa0]+3,&cell[i-0xa0+9]); - } - else if ((unsigned)(i-0xb0) < (unsigned)9) - { - if ((v&32) > (tmp&32)) - { - cellon(i-0xb0,modulatorbase[i-0xb0],&cell[i-0xb0],0); - cellon(i-0xb0,modulatorbase[i-0xb0]+3,&cell[i-0xb0+9],1); - } - else if ((v&32) < (tmp&32)) - cell[i-0xb0].cellfunc = cell[i-0xb0+9].cellfunc = docell2; - cellfreq(i-0xb0,modulatorbase[i-0xb0],&cell[i-0xb0]); - cellfreq(i-0xb0,modulatorbase[i-0xb0]+3,&cell[i-0xb0+9]); - } - - //outdata(i,v); -} - -#ifdef USING_ASM -static long fpuasm; -static float fakeadd = 8388608.0+128.0; -static _inline void clipit8 (float f, long a) -{ - _asm - { - mov edi, a - fld dword ptr f - fadd dword ptr fakeadd - fstp dword ptr fpuasm - mov eax, fpuasm - test eax, 0x007fff00 - jz short skipit - shr eax, 16 - xor eax, -1 - skipit: mov byte ptr [edi], al - } -} - -static _inline void clipit16 (float f, long a) -{ - _asm - { - mov eax, a - fld dword ptr f - fist word ptr [eax] - cmp word ptr [eax], 0x8000 - jne short skipit2 - fst dword ptr [fpuasm] - cmp fpuasm, 0x80000000 - sbb word ptr [eax], 0 - skipit2: fstp st - } -} -#else -static void clipit8(float f,unsigned char *a) { - f/=256.0; - f+=128.0; - if (f>254.5) *a=255; - else if (f<0.5) *a=0; - else *a=f; -} - -static void clipit16(float f,short *a) { - if (f>32766.5) *a=32767; - else if (f<-32767.5) *a=-32768; - else *a=f; -} -#endif - -void adlibsetvolume(int i) { - AMPSCALE=i; -} - -void adlibgetsample (unsigned char *sndptr, long numbytes) -{ - long i, j, k=0, ns, endsamples, rptrs, numsamples; - celltype *cptr; - float f; - short *sndptr2=(short *)sndptr; - - numsamples = (numbytes>>(numspeakers+bytespersample-2)); - - if (bytespersample == 1) f = AMPSCALE/256.0; else f = AMPSCALE; - if (numspeakers == 1) - { - nlvol[0] = lvol[0]*f; - for(i=0;i<9;i++) rptr[i] = &rbuf[0][0]; - rptrs = 1; - } - else - { - rptrs = 0; - for(i=0;i<9;i++) - { - if ((!i) || (lvol[i] != lvol[i-1]) || (rvol[i] != rvol[i-1]) || - (lplc[i] != lplc[i-1]) || (rplc[i] != rplc[i-1])) - { - nlvol[rptrs] = lvol[i]*f; - nrvol[rptrs] = rvol[i]*f; - nlplc[rptrs] = rend-min(max(lplc[i],0),FIFOSIZ); - nrplc[rptrs] = rend-min(max(rplc[i],0),FIFOSIZ); - rptrs++; - } - rptr[i] = &rbuf[rptrs-1][0]; - } - } - - - //CPU time used to be somewhat less when emulator was only mono! - // Because of no delay fifos! - - for(ns=0;ns>1)-1)); //Snare - (cell[7].cellfunc)((void *)&cell[7],k&(WAVPREC-1)); //Hihat - (cell[17].cellfunc)((void *)&cell[17],k&((WAVPREC>>3)-1)); //Cymbal - (cell[8].cellfunc)((void *)&cell[8],0.0); //TomTom - nrptr[7][i] += cell[7].val + cell[16].val; - nrptr[8][i] += cell[8].val + cell[17].val; - } - } - } - for(j=9-1;j>=0;j--) - { - if ((adlibreg[0xbd]&0x20) && (j >= 6) && (j < 9)) continue; - - cptr = &cell[j]; k = j; - if (adlibreg[0xc0+k]&1) - { - if ((cptr[9].cellfunc == docell4) && (cptr->cellfunc == docell4)) continue; - for(i=0;icellfunc)((void *)cptr,cptr->val*cptr->mfb); - (cptr->cellfunc)((void *)&cptr[9],0); - nrptr[j][i] += cptr[9].val + cptr->val; - } - } - else - { - if (cptr[9].cellfunc == docell4) continue; - for(i=0;icellfunc)((void *)cptr,cptr->val*cptr->mfb); - (cptr[9].cellfunc)((void *)&cptr[9],cptr->val*WAVPREC*MODFACTOR); - nrptr[j][i] += cptr[9].val; - } - } - } - - if (numspeakers == 1) - { - if (bytespersample == 1) - { - for(i=endsamples-1;i>=0;i--) - clipit8(nrptr[0][i]*nlvol[0],sndptr+1); - } - else - { - for(i=endsamples-1;i>=0;i--) - clipit16(nrptr[0][i]*nlvol[0],sndptr2+i); - } - } - else - { - memset((void *)snd,0,endsamples*sizeof(float)*2); - for(j=0;j=0;i--) - clipit8(snd[i],sndptr+i); - } - else - { - for(i=(endsamples<<1)-1;i>=0;i--) - clipit16(snd[i],sndptr2+i); - } - } - - sndptr = sndptr+(numspeakers*endsamples); - sndptr2 = sndptr2+(numspeakers*endsamples); - rend = ((rend+endsamples)&(FIFOSIZ*2-1)); - } -} diff --git a/plugins/opl2/adlibemu.h b/plugins/opl2/adlibemu.h deleted file mode 100644 index 8600d787d..000000000 --- a/plugins/opl2/adlibemu.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * ADLIBEMU.H - * Copyright (C) 1998-2001 Ken Silverman - * Ken Silverman's official web site: "http://www.advsys.net/ken" - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -void adlibinit(long dasamplerate,long danumspeakers,long dabytespersample); -void adlib0(long i,long v); -void adlibgetsample(void *sndptr,long numbytes); -void adlibsetvolume(int i); -void randoinsts(); -extern float lvol[9],rvol[9],lplc[9],rplc[9]; diff --git a/plugins/opl2/kemuopl.h b/plugins/opl2/kemuopl.h deleted file mode 100644 index d2ca6e288..000000000 --- a/plugins/opl2/kemuopl.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Adplug - Replayer for many OPL2/OPL3 audio file formats. - * Copyright (C) 1999 - 2005 Simon Peter, , et al. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * kemuopl.h - Emulated OPL using Ken Silverman's emulator, by Simon Peter - * - */ - -#ifndef H_ADPLUG_KEMUOPL -#define H_ADPLUG_KEMUOPL - -#include "opl.h" -extern "C" { -#include "adlibemu.h" -} - -class CKemuopl: public Copl -{ -public: - CKemuopl(int rate, bool bit16, bool usestereo) - : use16bit(bit16), stereo(usestereo) - { - adlibinit(rate, usestereo ? 2 : 1, bit16 ? 2 : 1); - currType = TYPE_OPL2; - }; - - void update(short *buf, int samples) - { - if(use16bit) samples *= 2; - if(stereo) samples *= 2; - adlibgetsample(buf, samples); - } - - // template methods - void write(int reg, int val) - { - if(currChip == 0) - adlib0(reg, val); - }; - - void init() {}; - -private: - bool use16bit,stereo; -}; - -#endif diff --git a/plugins/opl2/opl2instrument.cpp b/plugins/opl2/opl2instrument.cpp index 1ce116c1a..ab94eb834 100644 --- a/plugins/opl2/opl2instrument.cpp +++ b/plugins/opl2/opl2instrument.cpp @@ -54,7 +54,6 @@ #include "opl.h" #include "temuopl.h" -#include "kemuopl.h" #include "embed.cpp" #include "math.h" From ac54fcdac2c055070b2e0c16dbfde137cb8ce342 Mon Sep 17 00:00:00 2001 From: Lukas W Date: Fri, 24 Jan 2014 22:04:37 +0100 Subject: [PATCH 017/110] Fix some warnings --- CMakeLists.txt | 1 + include/debug.h | 8 +++++--- plugins/midi_import/portsmf/allegro.cpp | 9 +++++---- plugins/midi_import/portsmf/allegro.h | 2 +- plugins/midi_import/portsmf/allegrord.cpp | 2 +- plugins/midi_import/portsmf/allegrosmfrd.cpp | 2 +- plugins/midi_import/portsmf/allegrowr.cpp | 2 +- 7 files changed, 15 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 92e5d6b67..33834d041 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -335,6 +335,7 @@ CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/plugins/zynaddsubfx/zynaddsubfx.rc.in ${CMAKE SET(WERROR_FLAGS "-Wall -Werror -Werror=unused-function -Wno-sign-compare -Wno-strict-overflow") SET(CMAKE_C_FLAGS "-O2 -g ${WERROR_FLAGS} ${CMAKE_C_FLAGS}") SET(CMAKE_CXX_FLAGS "-O2 -g -fno-exceptions ${WERROR_FLAGS} ${CMAKE_CXX_FLAGS}") +set(CMAKE_C_FLAGS_DEBUG "-DLMMS_DEBUG") # people simply updating git will still have this and mess up build with it diff --git a/include/debug.h b/include/debug.h index 1b2b3b2bc..64b1a8886 100644 --- a/include/debug.h +++ b/include/debug.h @@ -31,10 +31,12 @@ // set whether debug-stuff (like messages on the console, asserts and other // additional range-checkings) should be compiled -/*#ifdef LMMS_DEBUG*/ -#include +#ifdef LMMS_DEBUG + #include +#else + #define assert(x) ((void)(x)) +#endif #include -/*#endif*/ #endif diff --git a/plugins/midi_import/portsmf/allegro.cpp b/plugins/midi_import/portsmf/allegro.cpp index d193a3c9d..c05f279e9 100644 --- a/plugins/midi_import/portsmf/allegro.cpp +++ b/plugins/midi_import/portsmf/allegro.cpp @@ -9,7 +9,7 @@ 04 apr 03 -- fixed bug in add_track that caused infinite loop */ -#include "assert.h" +#include "debug.h" #include "stdlib.h" #include "stdio.h" #include "string.h" @@ -727,8 +727,8 @@ void Alg_event_list::set_start_time(Alg_event *event, double t) // For Alg_track, change the time and move the event to the right place // For Alg_seq, find the track and do the update there - long index, i; - Alg_track_ptr track_ptr; + long index = 0, i; + Alg_track_ptr track_ptr = Alg_track_ptr(); if (type == 'e') { // this is an Alg_event_list // make sure the owner has not changed its event set assert(events_owner && @@ -2283,6 +2283,7 @@ Alg_track_ptr Alg_seq::track(int i) } +#pragma GCC diagnostic ignored "-Wreturn-type" // ok not to return a value here Alg_event_ptr &Alg_seq::operator[](int i) { int ntracks = track_list.length(); @@ -2296,7 +2297,7 @@ Alg_event_ptr &Alg_seq::operator[](int i) } tr++; } - assert(false); // out of bounds + assert(false); // out of bounds } diff --git a/plugins/midi_import/portsmf/allegro.h b/plugins/midi_import/portsmf/allegro.h index 51a7b29c0..e83d4b463 100644 --- a/plugins/midi_import/portsmf/allegro.h +++ b/plugins/midi_import/portsmf/allegro.h @@ -48,7 +48,7 @@ #ifndef __ALLEGRO__ #define __ALLEGRO__ -#include +#include "debug.h" #include "lmmsconfig.h" diff --git a/plugins/midi_import/portsmf/allegrord.cpp b/plugins/midi_import/portsmf/allegrord.cpp index 9d6b9f2c1..7a1f5beed 100644 --- a/plugins/midi_import/portsmf/allegrord.cpp +++ b/plugins/midi_import/portsmf/allegrord.cpp @@ -1,4 +1,4 @@ -#include "assert.h" +#include "debug.h" #include "stdlib.h" #include "string.h" #include "ctype.h" diff --git a/plugins/midi_import/portsmf/allegrosmfrd.cpp b/plugins/midi_import/portsmf/allegrosmfrd.cpp index 813ecd79f..49e2ef03e 100644 --- a/plugins/midi_import/portsmf/allegrosmfrd.cpp +++ b/plugins/midi_import/portsmf/allegrosmfrd.cpp @@ -3,7 +3,7 @@ #include "stdlib.h" #include "stdio.h" #include "string.h" -#include "assert.h" +#include "debug.h" #include #include #include "allegro.h" diff --git a/plugins/midi_import/portsmf/allegrowr.cpp b/plugins/midi_import/portsmf/allegrowr.cpp index f4a76f18a..3b266f84c 100644 --- a/plugins/midi_import/portsmf/allegrowr.cpp +++ b/plugins/midi_import/portsmf/allegrowr.cpp @@ -1,6 +1,6 @@ // allegrowr.cpp -- write sequence to an Allegro file (text) -#include "assert.h" +#include "debug.h" #include "stdlib.h" #include #include From 4200662e9878746b1f40cc7c4225272361d0932a Mon Sep 17 00:00:00 2001 From: Lukas W Date: Fri, 24 Jan 2014 22:38:11 +0100 Subject: [PATCH 018/110] Plugin browser: Sort plugins by display name --- src/gui/plugin_browser.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/gui/plugin_browser.cpp b/src/gui/plugin_browser.cpp index 1ecdebbb8..649f36add 100644 --- a/src/gui/plugin_browser.cpp +++ b/src/gui/plugin_browser.cpp @@ -35,6 +35,13 @@ #include "string_pair_drag.h" +bool pluginBefore( const Plugin::Descriptor& d1, const Plugin::Descriptor& d2 ) +{ + return qstricmp( d1.displayName, d2.displayName ) < 0 ? true : false; +} + + + pluginBrowser::pluginBrowser( QWidget * _parent ) : SideBarWidget( tr( "Instrument plugins" ), @@ -61,6 +68,7 @@ pluginBrowser::pluginBrowser( QWidget * _parent ) : view_layout->addWidget( hint ); Plugin::getDescriptorsOfAvailPlugins( m_pluginDescriptors ); + qSort( m_pluginDescriptors.begin(), m_pluginDescriptors.end(), pluginBefore ); for( Plugin::DescriptorList::ConstIterator it = m_pluginDescriptors.begin(); it != m_pluginDescriptors.end(); ++it ) From 5dd38f0685b932beb3445e16f5e75adb9303d346 Mon Sep 17 00:00:00 2001 From: unfa Date: Fri, 24 Jan 2014 22:42:39 +0100 Subject: [PATCH 019/110] Added unfa-Static.mmpz to /data/projects/CoolSongs and updatet LICENSES.txt file there. --- data/projects/CoolSongs/LICENSES.TXT | 4 ++++ data/projects/CoolSongs/unfa-Spoken.mmpz | Bin 0 -> 208180 bytes 2 files changed, 4 insertions(+) create mode 100644 data/projects/CoolSongs/unfa-Spoken.mmpz diff --git a/data/projects/CoolSongs/LICENSES.TXT b/data/projects/CoolSongs/LICENSES.TXT index f97d85007..1fad84a91 100644 --- a/data/projects/CoolSongs/LICENSES.TXT +++ b/data/projects/CoolSongs/LICENSES.TXT @@ -65,3 +65,7 @@ * Zakarra-59_Degrees.mmpz - Artistic 2.0 - http://lmms.sourceforge.net/lsp/index.php?action=show&file=1059 + +* unfa-Spoken.mmpz + - CC (by-nc) + - http://lmms.sourceforge.net/lsp/index.php?action=show&file=4929 diff --git a/data/projects/CoolSongs/unfa-Spoken.mmpz b/data/projects/CoolSongs/unfa-Spoken.mmpz new file mode 100644 index 0000000000000000000000000000000000000000..35c5c4b245613bcffc29571e6392c0cef5a206cd GIT binary patch literal 208180 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 literal 0 HcmV?d00001 From 2aeecda9ad79d35ed44c5e94b19af73050c9c3e3 Mon Sep 17 00:00:00 2001 From: Lukas W Date: Fri, 24 Jan 2014 23:54:21 +0100 Subject: [PATCH 020/110] Controllers Naming: Prevent duplicate names For this, iterate through all given names and use the next name that's available. --- src/core/Controller.cpp | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/core/Controller.cpp b/src/core/Controller.cpp index 41bff4dcc..d1260fd35 100644 --- a/src/core/Controller.cpp +++ b/src/core/Controller.cpp @@ -3,6 +3,7 @@ * remote-control of AutomatableModels * * Copyright (c) 2008 Paul Giblock + * Copyright (c) 2014 Lukas W * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -53,8 +54,30 @@ Controller::Controller( ControllerTypes _type, Model * _parent, if( _type != DummyController && _type != MidiController ) { s_controllers.append( this ); - m_name = QString( tr( "Controller %1" ) ) - .arg( s_controllers.size() ); + // Determine which name to use + for ( uint i=s_controllers.size(); ; i++ ) + { + QString new_name = QString( tr( "Controller %1" ) ) + .arg( i ); + + // Check if name is already in use + bool name_used = false; + QVector::const_iterator it; + for ( it = s_controllers.constBegin(); + it != s_controllers.constEnd(); ++it ) + { + if ( (*it)->name() == new_name ) + { + name_used = true; + break; + } + } + if ( ! name_used ) + { + m_name = new_name; + break; + } + } } } From c12afd53d500d922233b633eaf876ef09f0cca40 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sat, 25 Jan 2014 00:04:00 +0100 Subject: [PATCH 021/110] FileDialog: added music folder and working directory to sidebar --- src/gui/dialogs/FileDialog.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/gui/dialogs/FileDialog.cpp b/src/gui/dialogs/FileDialog.cpp index 6e57329c1..ba25bf80e 100644 --- a/src/gui/dialogs/FileDialog.cpp +++ b/src/gui/dialogs/FileDialog.cpp @@ -22,18 +22,15 @@ * */ - #include #include #include #include +#include "config_mgr.h" #include "FileDialog.h" - - - FileDialog::FileDialog( QWidget *parent, const QString &caption, const QString &directory, const QString &filter ) : QFileDialog( parent, caption, directory, filter ) @@ -51,9 +48,15 @@ FileDialog::FileDialog( QWidget *parent, const QString &caption, downloadDir = QDesktopServices::storageLocation( QDesktopServices::DocumentsLocation ) + "/Downloads"; if ( downloadDir.exists() ) urls << QUrl::fromLocalFile( downloadDir.absolutePath() ); + + urls << QUrl::fromLocalFile( QDesktopServices::storageLocation( QDesktopServices::MusicLocation ) ); + urls << QUrl::fromLocalFile( configManager::inst()->workingDir() ); + setSidebarUrls(urls); } + + void FileDialog::clearSelection() { static QListView *view = findChild(); From ddf63cb924abc6f6aefea74a727dcf07de552b18 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sat, 25 Jan 2014 01:09:39 +0100 Subject: [PATCH 022/110] ComboBox: added sizeHint() + coding style --- include/combobox.h | 32 +++++++++++++++++--------------- src/gui/widgets/combobox.cpp | 20 ++++++++++++++++++-- 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/include/combobox.h b/include/combobox.h index d4d432640..76bb36163 100644 --- a/include/combobox.h +++ b/include/combobox.h @@ -1,7 +1,7 @@ /* - * combobox.h - class comboBox, a very cool combo-box + * combobox.h - class ComboBox, a combo box view for models * - * Copyright (c) 2006-2008 Tobias Doerffel + * Copyright (c) 2006-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -38,31 +38,33 @@ class EXPORT comboBox : public QWidget, public IntModelView { Q_OBJECT public: - comboBox( QWidget * _parent, const QString & _name = QString() ); + comboBox( QWidget* parent = NULL, const QString& name = QString() ); virtual ~comboBox(); - ComboBoxModel * model() + ComboBoxModel* model() { - return( castModel() ); + return castModel(); } - const ComboBoxModel * model() const + const ComboBoxModel* model() const { - return( castModel() ); + return castModel(); } + virtual QSize sizeHint() const; + protected: - virtual void contextMenuEvent( QContextMenuEvent * _me ); - virtual void mousePressEvent( QMouseEvent * _me ); - virtual void paintEvent( QPaintEvent * _pe ); - virtual void wheelEvent( QWheelEvent * _we ); + virtual void contextMenuEvent( QContextMenuEvent* event ); + virtual void mousePressEvent( QMouseEvent* event ); + virtual void paintEvent( QPaintEvent* event ); + virtual void wheelEvent( QWheelEvent* event ); private: - static QPixmap * s_background; - static QPixmap * s_arrow; - static QPixmap * s_arrowSelected; + static QPixmap* s_background; + static QPixmap* s_arrow; + static QPixmap* s_arrowSelected; QMenu m_menu; @@ -70,7 +72,7 @@ private: private slots: - void setItem( QAction * _item ); + void setItem( QAction* item ); } ; diff --git a/src/gui/widgets/combobox.cpp b/src/gui/widgets/combobox.cpp index 9244344b9..c78e59ff7 100644 --- a/src/gui/widgets/combobox.cpp +++ b/src/gui/widgets/combobox.cpp @@ -1,7 +1,7 @@ /* - * combobox.cpp - implementation of LMMS-combobox + * combobox.cpp - implementation of LMMS combobox * - * Copyright (c) 2006-2011 Tobias Doerffel + * Copyright (c) 2006-2014 Tobias Doerffel * Copyright (c) 2008-2009 Paul Giblock * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net @@ -88,6 +88,22 @@ comboBox::~comboBox() +QSize comboBox::sizeHint() const +{ + int maxTextWidth = 0; + for( int i = 0; i < model()->size(); ++i ) + { + int w = fontMetrics().width( model()->itemText( i ) ); + if( w > maxTextWidth ) + { + maxTextWidth = w; + } + } + + return QSize( 32 + maxTextWidth, 22 ); +} + + void comboBox::contextMenuEvent( QContextMenuEvent * _me ) { From 730ba403cdaa71e9708ed1765800cc11dc800a92 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sat, 25 Jan 2014 01:10:25 +0100 Subject: [PATCH 023/110] TempoSyncKnob, Knob: allow construction without parent --- include/TempoSyncKnob.h | 5 ++--- include/knob.h | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/include/TempoSyncKnob.h b/include/TempoSyncKnob.h index 6f54089f0..964d77cf4 100644 --- a/include/TempoSyncKnob.h +++ b/include/TempoSyncKnob.h @@ -2,7 +2,7 @@ * TempoSyncKnob.h - adds bpm to ms conversion for knob class * * Copyright (c) 2005-2008 Danny McRae - * Copyright (c) 2009 Tobias Doerffel + * Copyright (c) 2009-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -38,8 +38,7 @@ class EXPORT TempoSyncKnob : public knob { Q_OBJECT public: - TempoSyncKnob( int _knob_num, QWidget * _parent, - const QString & _name = QString() ); + TempoSyncKnob( int knobNum, QWidget* parent = NULL, const QString& name = QString() ); virtual ~TempoSyncKnob(); const QString & syncDescription(); diff --git a/include/knob.h b/include/knob.h index c2e6873f6..b459663b2 100644 --- a/include/knob.h +++ b/include/knob.h @@ -60,7 +60,7 @@ class EXPORT knob : public QWidget, public FloatModelView Q_PROPERTY(QColor outerColor READ outerColor WRITE setOuterColor) mapPropertyFromModel(bool,isVolumeKnob,setVolumeKnob,m_volumeKnob); public: - knob( int _knob_num, QWidget * _parent, const QString & _name = QString() ); + knob( int _knob_num, QWidget * _parent = NULL, const QString & _name = QString() ); virtual ~knob(); // TODO: remove From c6b7ccd9f77f84e5f28b057c922fece11e3caebb Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sat, 25 Jan 2014 01:10:47 +0100 Subject: [PATCH 024/110] InstrumentFunctionViews: manage widgets using layouts --- include/InstrumentFunctionViews.h | 8 +- src/gui/widgets/InstrumentFunctionViews.cpp | 119 ++++++++++---------- src/tracks/InstrumentTrack.cpp | 16 ++- 3 files changed, 77 insertions(+), 66 deletions(-) diff --git a/include/InstrumentFunctionViews.h b/include/InstrumentFunctionViews.h index 3b4334147..29bb0640a 100644 --- a/include/InstrumentFunctionViews.h +++ b/include/InstrumentFunctionViews.h @@ -1,7 +1,7 @@ /* * InstrumentFunctionViews.h - views for instrument-functions-tab * - * Copyright (c) 2004-2009 Tobias Doerffel + * Copyright (c) 2004-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -44,7 +44,7 @@ class ChordCreatorView : public QWidget, public ModelView { Q_OBJECT public: - ChordCreatorView( ChordCreator * _cc, QWidget * _parent ); + ChordCreatorView( ChordCreator* cc, QWidget* parent = NULL ); virtual ~ChordCreatorView(); @@ -67,7 +67,7 @@ class ArpeggiatorView : public QWidget, public ModelView { Q_OBJECT public: - ArpeggiatorView( Arpeggiator * _arp, QWidget * _parent ); + ArpeggiatorView( Arpeggiator* arp, QWidget* parent = NULL ); virtual ~ArpeggiatorView(); @@ -81,8 +81,6 @@ private: TempoSyncKnob * m_arpTimeKnob; knob * m_arpGateKnob; - QLabel * m_arpDirectionLbl; - comboBox * m_arpDirectionComboBox; comboBox * m_arpModeComboBox; diff --git a/src/gui/widgets/InstrumentFunctionViews.cpp b/src/gui/widgets/InstrumentFunctionViews.cpp index 1e8e29ad3..543d9c6c4 100644 --- a/src/gui/widgets/InstrumentFunctionViews.cpp +++ b/src/gui/widgets/InstrumentFunctionViews.cpp @@ -23,6 +23,7 @@ */ #include +#include #include "InstrumentFunctions.h" #include "InstrumentFunctionViews.h" @@ -37,44 +38,37 @@ #include "tooltip.h" - -const int CHORDS_GROUPBOX_X = 4; -const int CHORDS_GROUPBOX_Y = 5; -const int CHORDS_GROUPBOX_WIDTH = 242; -const int CHORDS_GROUPBOX_HEIGHT = 65; -const int ARP_GROUPBOX_X = CHORDS_GROUPBOX_X; -const int ARP_GROUPBOX_Y = 10 + CHORDS_GROUPBOX_Y + CHORDS_GROUPBOX_HEIGHT; -const int ARP_GROUPBOX_WIDTH = CHORDS_GROUPBOX_WIDTH; -const int ARP_GROUPBOX_HEIGHT = 240 - ARP_GROUPBOX_Y; - - - -ChordCreatorView::ChordCreatorView( ChordCreator * _cc, QWidget * _parent ) : - QWidget( _parent ), +ChordCreatorView::ChordCreatorView( ChordCreator* cc, QWidget* parent ) : + QWidget( parent ), ModelView( NULL, this ), - m_cc( _cc ), - m_chordsGroupBox( new groupBox( tr( "CHORDS" ), this ) ), - m_chordsComboBox( new comboBox( m_chordsGroupBox ) ), - m_chordRangeKnob( new knob( knobBright_26, m_chordsGroupBox ) ) + m_cc( cc ), + m_chordsGroupBox( new groupBox( tr( "STACKING" ) ) ), + m_chordsComboBox( new comboBox() ), + m_chordRangeKnob( new knob( knobBright_26 ) ) { - move( CHORDS_GROUPBOX_X, CHORDS_GROUPBOX_Y ); - setFixedSize( 250, CHORDS_GROUPBOX_HEIGHT ); - m_chordsGroupBox->setGeometry( 0, 0, CHORDS_GROUPBOX_WIDTH, - CHORDS_GROUPBOX_HEIGHT ); + QHBoxLayout* topLayout = new QHBoxLayout( this ); + topLayout->setMargin( 0 ); + topLayout->addWidget( m_chordsGroupBox ); + QGridLayout* mainLayout = new QGridLayout( m_chordsGroupBox ); + mainLayout->setContentsMargins( 8, 18, 8, 8 ); + mainLayout->setColumnStretch( 0, 1 ); + mainLayout->setHorizontalSpacing( 20 ); + mainLayout->setVerticalSpacing( 1 ); - m_chordsComboBox->setGeometry( 10, 25, 140, 22 ); - + QLabel* chordLabel = new QLabel( tr( "Chord:" ) ); + chordLabel->setFont( pointSize<8>( chordLabel->font() ) ); m_chordRangeKnob->setLabel( tr( "RANGE" ) ); - m_chordRangeKnob->move( 164, 24 ); - m_chordRangeKnob->setHintText( tr( "Chord range:" ) + " ", " " + - tr( "octave(s)" ) ); + m_chordRangeKnob->setHintText( tr( "Chord range:" ) + " ", " " + tr( "octave(s)" ) ); m_chordRangeKnob->setWhatsThis( tr( "Use this knob for setting the chord range in octaves. " "The selected chord will be played within specified " "number of octaves." ) ); + mainLayout->addWidget( chordLabel, 0, 0 ); + mainLayout->addWidget( m_chordsComboBox, 1, 0 ); + mainLayout->addWidget( m_chordRangeKnob, 0, 1, 2, 1, Qt::AlignHCenter ); } @@ -102,22 +96,27 @@ void ChordCreatorView::modelChanged() -ArpeggiatorView::ArpeggiatorView( Arpeggiator * _arp, QWidget * _parent ) : - QWidget( _parent ), +ArpeggiatorView::ArpeggiatorView( Arpeggiator* arp, QWidget* parent ) : + QWidget( parent ), ModelView( NULL, this ), - m_a( _arp ), - m_arpGroupBox( new groupBox( tr( "ARPEGGIO" ), this ) ), - m_arpComboBox( new comboBox( m_arpGroupBox) ), - m_arpRangeKnob( new knob( knobBright_26, m_arpGroupBox ) ), - m_arpTimeKnob( new TempoSyncKnob( knobBright_26, m_arpGroupBox ) ), - m_arpGateKnob( new knob( knobBright_26, m_arpGroupBox ) ), - m_arpDirectionComboBox( new comboBox( m_arpGroupBox ) ), - m_arpModeComboBox( new comboBox( m_arpGroupBox ) ) + m_a( arp ), + m_arpGroupBox( new groupBox( tr( "ARPEGGIO" ) ) ), + m_arpComboBox( new comboBox() ), + m_arpRangeKnob( new knob( knobBright_26 ) ), + m_arpTimeKnob( new TempoSyncKnob( knobBright_26 ) ), + m_arpGateKnob( new knob( knobBright_26 ) ), + m_arpDirectionComboBox( new comboBox() ), + m_arpModeComboBox( new comboBox() ) { - move( ARP_GROUPBOX_X, ARP_GROUPBOX_Y ); - setFixedSize( 250, ARP_GROUPBOX_HEIGHT ); - m_arpGroupBox->setGeometry( 0, 0, ARP_GROUPBOX_WIDTH, - ARP_GROUPBOX_HEIGHT ); + QHBoxLayout* topLayout = new QHBoxLayout( this ); + topLayout->setMargin( 0 ); + topLayout->addWidget( m_arpGroupBox ); + + QGridLayout* mainLayout = new QGridLayout( m_arpGroupBox ); + mainLayout->setContentsMargins( 8, 18, 8, 8 ); + mainLayout->setColumnStretch( 0, 1 ); + mainLayout->setHorizontalSpacing( 20 ); + mainLayout->setVerticalSpacing( 1 ); m_arpGroupBox->setWhatsThis( tr( "An arpeggio is a method playing (especially plucked) " @@ -130,13 +129,8 @@ ArpeggiatorView::ArpeggiatorView( Arpeggiator * _arp, QWidget * _parent ) : "possible chords, you can select." ) ); - m_arpComboBox->setGeometry( 10, 25, 140, 22 ); - - m_arpRangeKnob->setLabel( tr( "RANGE" ) ); - m_arpRangeKnob->move( 164, 24 ); - m_arpRangeKnob->setHintText( tr( "Arpeggio range:" ) + " ", " " + - tr( "octave(s)" ) ); + m_arpRangeKnob->setHintText( tr( "Arpeggio range:" ) + " ", " " + tr( "octave(s)" ) ); m_arpRangeKnob->setWhatsThis( tr( "Use this knob for setting the arpeggio range in octaves. " "The selected arpeggio will be played within specified " @@ -144,9 +138,7 @@ ArpeggiatorView::ArpeggiatorView( Arpeggiator * _arp, QWidget * _parent ) : m_arpTimeKnob->setLabel( tr( "TIME" ) ); - m_arpTimeKnob->move( 164, 70 ); - m_arpTimeKnob->setHintText( tr( "Arpeggio time:" ) + " ", " " + - tr( "ms" ) ); + m_arpTimeKnob->setHintText( tr( "Arpeggio time:" ) + " ", " " + tr( "ms" ) ); m_arpTimeKnob->setWhatsThis( tr( "Use this knob for setting the arpeggio time in " "milliseconds. The arpeggio time specifies how long " @@ -154,7 +146,6 @@ ArpeggiatorView::ArpeggiatorView( Arpeggiator * _arp, QWidget * _parent ) : m_arpGateKnob->setLabel( tr( "GATE" ) ); - m_arpGateKnob->move( 204, 70 ); m_arpGateKnob->setHintText( tr( "Arpeggio gate:" ) + " ", tr( "%" ) ); m_arpGateKnob->setWhatsThis( tr( "Use this knob for setting the arpeggio gate. The " @@ -162,18 +153,28 @@ ArpeggiatorView::ArpeggiatorView( Arpeggiator * _arp, QWidget * _parent ) : "arpeggio-tone that should be played. With this you " "can make cool staccato arpeggios." ) ); - m_arpDirectionLbl = new QLabel( tr( "Direction:" ), m_arpGroupBox ); - m_arpDirectionLbl->setGeometry( 10, 60, 64, 10 ); - m_arpDirectionLbl->setFont( pointSize<8>( m_arpDirectionLbl->font() ) ); + QLabel* arpChordLabel = new QLabel( tr( "Chord:" ) ); + arpChordLabel->setFont( pointSize<8>( arpChordLabel->font() ) ); - m_arpDirectionComboBox->setGeometry( 10, 74, 140, 22 ); + QLabel* arpDirectionLabel = new QLabel( tr( "Direction:" ) ); + arpDirectionLabel->setFont( pointSize<8>( arpDirectionLabel->font() ) ); + QLabel* arpModeLabel = new QLabel( tr( "Mode:" ) ); + arpModeLabel->setFont( pointSize<8>( arpModeLabel->font() ) ); - QLabel * mode_lbl = new QLabel( tr( "Mode:" ), m_arpGroupBox ); - mode_lbl->setGeometry( 10, 110, 64, 10 ); - mode_lbl->setFont( pointSize<8>( mode_lbl->font() ) ); + mainLayout->addWidget( arpChordLabel, 0, 0 ); + mainLayout->addWidget( m_arpComboBox, 1, 0 ); + mainLayout->addWidget( arpDirectionLabel, 3, 0 ); + mainLayout->addWidget( m_arpDirectionComboBox, 4, 0 ); + mainLayout->addWidget( arpModeLabel, 6, 0 ); + mainLayout->addWidget( m_arpModeComboBox, 7, 0 ); - m_arpModeComboBox->setGeometry( 10, 124, 128, 22 ); + mainLayout->addWidget( m_arpRangeKnob, 0, 1, 2, 1, Qt::AlignHCenter ); + mainLayout->addWidget( m_arpTimeKnob, 3, 1, 2, 1, Qt::AlignHCenter ); + mainLayout->addWidget( m_arpGateKnob, 6, 1, 2, 1, Qt::AlignHCenter ); + + mainLayout->setRowMinimumHeight( 2, 10 ); + mainLayout->setRowMinimumHeight( 5, 10 ); } diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index 1e46f54a1..2b15cceca 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -1351,10 +1351,22 @@ InstrumentTrackWindow::InstrumentTrackWindow( InstrumentTrackView * _itv ) : // create tab-widgets m_ssView = new InstrumentSoundShapingView( m_tabWidget ); + + // FUNC tab QWidget* instrumentFunctions = new QWidget( m_tabWidget ); - m_chordView = new ChordCreatorView( &m_track->m_chordCreator, instrumentFunctions ); - m_arpView= new ArpeggiatorView( &m_track->m_arpeggiator, instrumentFunctions ); + QVBoxLayout* instrumentFunctionsLayout = new QVBoxLayout( instrumentFunctions ); + instrumentFunctionsLayout->setMargin( 5 ); + m_chordView = new ChordCreatorView( &m_track->m_chordCreator ); + m_arpView= new ArpeggiatorView( &m_track->m_arpeggiator ); + + instrumentFunctionsLayout->addWidget( m_chordView ); + instrumentFunctionsLayout->addWidget( m_arpView ); + instrumentFunctionsLayout->addStretch(); + + // MIDI tab m_midiView = new InstrumentMidiIOView( m_tabWidget ); + + // FX tab m_effectView = new EffectRackView( m_track->m_audioPort.effects(), m_tabWidget ); m_tabWidget->addTab( m_ssView, tr( "ENV/LFO" ), 1 ); From dc63bb28fdecb16b0d5397c7fcc026f0fd395232 Mon Sep 17 00:00:00 2001 From: Hannu Haahti Date: Sat, 25 Jan 2014 02:11:57 +0200 Subject: [PATCH 025/110] added a demo song and reorganized LICENSES.TXT alphabetically --- data/projects/CoolSongs/Greippi-ardudar.mmpz | Bin 0 -> 8826 bytes data/projects/CoolSongs/LICENSES.TXT | 12 ++++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 data/projects/CoolSongs/Greippi-ardudar.mmpz diff --git a/data/projects/CoolSongs/Greippi-ardudar.mmpz b/data/projects/CoolSongs/Greippi-ardudar.mmpz new file mode 100644 index 0000000000000000000000000000000000000000..17ff90dfde4b5a3f20cbf4f912b9343745256668 GIT binary patch literal 8826 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 literal 0 HcmV?d00001 diff --git a/data/projects/CoolSongs/LICENSES.TXT b/data/projects/CoolSongs/LICENSES.TXT index 1fad84a91..94b95d9ed 100644 --- a/data/projects/CoolSongs/LICENSES.TXT +++ b/data/projects/CoolSongs/LICENSES.TXT @@ -13,6 +13,10 @@ * Farbro-Tectonic.mmpz - CC (by) - http://lmms.sourceforge.net/lsp/index.php?action=show&file=1327 + +* Greippi-ardudar.mmpz + - CC (by-sa) + - http://lmms.sourceforge.net/lsp/index.php?action=show&file=4916 * Impulslogik-Zen.mmpz - Artistic 2.0 @@ -53,6 +57,10 @@ * TameAnderson-MakeMe.mmpz - Artistic 2.0 - http://lmms.sourceforge.net/lsp/index.php?action=show&file=1060 + +* unfa-Spoken.mmpz + - CC (by-nc) + - http://lmms.sourceforge.net/lsp/index.php?action=show&file=4929 * Zakarra-MainstreamMemory.mmpz - Artistic 2.0 @@ -65,7 +73,3 @@ * Zakarra-59_Degrees.mmpz - Artistic 2.0 - http://lmms.sourceforge.net/lsp/index.php?action=show&file=1059 - -* unfa-Spoken.mmpz - - CC (by-nc) - - http://lmms.sourceforge.net/lsp/index.php?action=show&file=4929 From ec45c381c3e81c37897a023917b3daf1adc3911e Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sat, 25 Jan 2014 01:27:28 +0100 Subject: [PATCH 026/110] Renamed instrument function classes and instances Arpeggiator got InstrumentFunctionArpeggio and ChordCreator got InstrumentFunctionNoteStacking. All related views and instances have been renamed for better consistency. --- data/locale/ca.ts | 4 +- data/locale/cs.ts | 4 +- data/locale/de.ts | 4 +- data/locale/en.ts | 4 +- data/locale/es.ts | 4 +- data/locale/fa.ts | 4 +- data/locale/fr.ts | 4 +- data/locale/gl.ts | 4 +- data/locale/it.ts | 4 +- data/locale/ja.ts | 4 +- data/locale/ko.ts | 4 +- data/locale/nl.ts | 4 +- data/locale/pl.ts | 4 +- data/locale/pt_br.ts | 4 +- data/locale/ru.ts | 4 +- data/locale/sv.ts | 4 +- include/InstrumentFunctionViews.h | 20 +- include/InstrumentFunctions.h | 16 +- include/InstrumentTrack.h | 16 +- plugins/flp_import/FlpImport.cpp | 20 +- src/core/InstrumentFunctions.cpp | 220 ++++++++++---------- src/core/note_play_handle.cpp | 9 +- src/gui/piano_roll.cpp | 14 +- src/gui/widgets/InstrumentFunctionViews.cpp | 16 +- src/tracks/InstrumentTrack.cpp | 32 +-- 25 files changed, 212 insertions(+), 215 deletions(-) diff --git a/data/locale/ca.ts b/data/locale/ca.ts index 3295f82ec..d0ff53fa9 100644 --- a/data/locale/ca.ts +++ b/data/locale/ca.ts @@ -488,7 +488,7 @@ If you're interested in translating LMMS in another language or want to imp - ChordCreator + InstrumentFunctionNoteStacking octave octava @@ -855,7 +855,7 @@ If you're interested in translating LMMS in another language or want to imp - ChordCreatorView + InstrumentFunctionNoteStackingView CHORDS ACORDS diff --git a/data/locale/cs.ts b/data/locale/cs.ts index 1118a1643..af6a41d67 100644 --- a/data/locale/cs.ts +++ b/data/locale/cs.ts @@ -488,7 +488,7 @@ If you're interested in translating LMMS in another language or want to imp - ChordCreator + InstrumentFunctionNoteStacking octave oktáva @@ -855,7 +855,7 @@ If you're interested in translating LMMS in another language or want to imp - ChordCreatorView + InstrumentFunctionNoteStackingView CHORDS AKORDY diff --git a/data/locale/de.ts b/data/locale/de.ts index cdeb4810d..3ee513bcf 100644 --- a/data/locale/de.ts +++ b/data/locale/de.ts @@ -488,7 +488,7 @@ If you're interested in translating LMMS in another language or want to imp - ChordCreator + InstrumentFunctionNoteStacking octave Oktave @@ -855,7 +855,7 @@ If you're interested in translating LMMS in another language or want to imp - ChordCreatorView + InstrumentFunctionNoteStackingView CHORDS AKKORDE diff --git a/data/locale/en.ts b/data/locale/en.ts index 8ed3172cb..20e29f33f 100644 --- a/data/locale/en.ts +++ b/data/locale/en.ts @@ -488,7 +488,7 @@ If you're interested in translating LMMS in another language or want to imp - ChordCreator + InstrumentFunctionNoteStacking octave @@ -855,7 +855,7 @@ If you're interested in translating LMMS in another language or want to imp - ChordCreatorView + InstrumentFunctionNoteStackingView CHORDS diff --git a/data/locale/es.ts b/data/locale/es.ts index b0a0e2e90..a986f5af0 100644 --- a/data/locale/es.ts +++ b/data/locale/es.ts @@ -488,7 +488,7 @@ If you're interested in translating LMMS in another language or want to imp - ChordCreator + InstrumentFunctionNoteStacking octave Octava @@ -855,7 +855,7 @@ If you're interested in translating LMMS in another language or want to imp - ChordCreatorView + InstrumentFunctionNoteStackingView CHORDS diff --git a/data/locale/fa.ts b/data/locale/fa.ts index b84820ea8..2c7fec6d5 100644 --- a/data/locale/fa.ts +++ b/data/locale/fa.ts @@ -488,7 +488,7 @@ If you're interested in translating LMMS in another language or want to imp - ChordCreator + InstrumentFunctionNoteStacking octave نت @@ -855,7 +855,7 @@ If you're interested in translating LMMS in another language or want to imp - ChordCreatorView + InstrumentFunctionNoteStackingView CHORDS diff --git a/data/locale/fr.ts b/data/locale/fr.ts index 8ca35588f..e45aca6d1 100644 --- a/data/locale/fr.ts +++ b/data/locale/fr.ts @@ -488,7 +488,7 @@ If you're interested in translating LMMS in another language or want to imp - ChordCreator + InstrumentFunctionNoteStacking octave octave @@ -855,7 +855,7 @@ If you're interested in translating LMMS in another language or want to imp - ChordCreatorView + InstrumentFunctionNoteStackingView CHORDS ACCORDS diff --git a/data/locale/gl.ts b/data/locale/gl.ts index 546ed3698..21d411161 100644 --- a/data/locale/gl.ts +++ b/data/locale/gl.ts @@ -501,7 +501,7 @@ Se lle interesa traducir o LMMS a outro idioma ou desexa mellorar as traducións - ChordCreator + InstrumentFunctionNoteStacking octave oitava @@ -872,7 +872,7 @@ Se lle interesa traducir o LMMS a outro idioma ou desexa mellorar as traducións - ChordCreatorView + InstrumentFunctionNoteStackingView CHORDS ACORDES diff --git a/data/locale/it.ts b/data/locale/it.ts index 95df96983..ccbac12ec 100644 --- a/data/locale/it.ts +++ b/data/locale/it.ts @@ -488,7 +488,7 @@ If you're interested in translating LMMS in another language or want to imp - ChordCreator + InstrumentFunctionNoteStacking octave ottava @@ -855,7 +855,7 @@ If you're interested in translating LMMS in another language or want to imp - ChordCreatorView + InstrumentFunctionNoteStackingView CHORDS ACCORDI diff --git a/data/locale/ja.ts b/data/locale/ja.ts index 275e35a97..fe1255193 100644 --- a/data/locale/ja.ts +++ b/data/locale/ja.ts @@ -488,7 +488,7 @@ If you're interested in translating LMMS in another language or want to imp - ChordCreator + InstrumentFunctionNoteStacking octave @@ -855,7 +855,7 @@ If you're interested in translating LMMS in another language or want to imp - ChordCreatorView + InstrumentFunctionNoteStackingView CHORDS diff --git a/data/locale/ko.ts b/data/locale/ko.ts index 584eb9eb5..a18db80cf 100644 --- a/data/locale/ko.ts +++ b/data/locale/ko.ts @@ -488,7 +488,7 @@ If you're interested in translating LMMS in another language or want to imp - ChordCreator + InstrumentFunctionNoteStacking octave 옥타브 @@ -855,7 +855,7 @@ If you're interested in translating LMMS in another language or want to imp - ChordCreatorView + InstrumentFunctionNoteStackingView CHORDS diff --git a/data/locale/nl.ts b/data/locale/nl.ts index de0acab03..a1c52d034 100644 --- a/data/locale/nl.ts +++ b/data/locale/nl.ts @@ -488,7 +488,7 @@ If you're interested in translating LMMS in another language or want to imp - ChordCreator + InstrumentFunctionNoteStacking octave oktaaf @@ -855,7 +855,7 @@ If you're interested in translating LMMS in another language or want to imp - ChordCreatorView + InstrumentFunctionNoteStackingView CHORDS AKKOORDEN diff --git a/data/locale/pl.ts b/data/locale/pl.ts index f3d438f20..0f399180c 100644 --- a/data/locale/pl.ts +++ b/data/locale/pl.ts @@ -494,7 +494,7 @@ Zauważone błędy i propozycje zmian tłumaczenia proszę zgłaszać na e-mail: - ChordCreator + InstrumentFunctionNoteStacking octave @@ -861,7 +861,7 @@ Zauważone błędy i propozycje zmian tłumaczenia proszę zgłaszać na e-mail: - ChordCreatorView + InstrumentFunctionNoteStackingView CHORDS AKORDY diff --git a/data/locale/pt_br.ts b/data/locale/pt_br.ts index 1ea74f00c..c01038992 100644 --- a/data/locale/pt_br.ts +++ b/data/locale/pt_br.ts @@ -488,7 +488,7 @@ If you're interested in translating LMMS in another language or want to imp - ChordCreator + InstrumentFunctionNoteStacking octave oitava @@ -855,7 +855,7 @@ If you're interested in translating LMMS in another language or want to imp - ChordCreatorView + InstrumentFunctionNoteStackingView CHORDS ACORDE diff --git a/data/locale/ru.ts b/data/locale/ru.ts index d55cdfc58..90ac1ea1c 100644 --- a/data/locale/ru.ts +++ b/data/locale/ru.ts @@ -492,7 +492,7 @@ If you're interested in translating LMMS in another language or want to imp - ChordCreator + InstrumentFunctionNoteStacking octave Октава @@ -859,7 +859,7 @@ If you're interested in translating LMMS in another language or want to imp - ChordCreatorView + InstrumentFunctionNoteStackingView CHORDS АККОРД diff --git a/data/locale/sv.ts b/data/locale/sv.ts index 1e1749a4e..1cd1b56c5 100644 --- a/data/locale/sv.ts +++ b/data/locale/sv.ts @@ -488,7 +488,7 @@ If you're interested in translating LMMS in another language or want to imp - ChordCreator + InstrumentFunctionNoteStacking octave oktav @@ -855,7 +855,7 @@ If you're interested in translating LMMS in another language or want to imp - ChordCreatorView + InstrumentFunctionNoteStackingView CHORDS diff --git a/include/InstrumentFunctionViews.h b/include/InstrumentFunctionViews.h index 29bb0640a..2a370468a 100644 --- a/include/InstrumentFunctionViews.h +++ b/include/InstrumentFunctionViews.h @@ -35,23 +35,23 @@ class groupBox; class knob; class TempoSyncKnob; -class Arpeggiator; -class ChordCreator; +class InstrumentFunctionArpeggio; +class InstrumentFunctionNoteStacking; -class ChordCreatorView : public QWidget, public ModelView +class InstrumentFunctionNoteStackingView : public QWidget, public ModelView { Q_OBJECT public: - ChordCreatorView( ChordCreator* cc, QWidget* parent = NULL ); - virtual ~ChordCreatorView(); + InstrumentFunctionNoteStackingView( InstrumentFunctionNoteStacking* cc, QWidget* parent = NULL ); + virtual ~InstrumentFunctionNoteStackingView(); private: virtual void modelChanged(); - ChordCreator * m_cc; + InstrumentFunctionNoteStacking * m_cc; groupBox * m_chordsGroupBox; comboBox * m_chordsComboBox; @@ -63,18 +63,18 @@ private: -class ArpeggiatorView : public QWidget, public ModelView +class InstrumentFunctionArpeggioView : public QWidget, public ModelView { Q_OBJECT public: - ArpeggiatorView( Arpeggiator* arp, QWidget* parent = NULL ); - virtual ~ArpeggiatorView(); + InstrumentFunctionArpeggioView( InstrumentFunctionArpeggio* arp, QWidget* parent = NULL ); + virtual ~InstrumentFunctionArpeggioView(); private: virtual void modelChanged(); - Arpeggiator * m_a; + InstrumentFunctionArpeggio * m_a; groupBox * m_arpGroupBox; comboBox * m_arpComboBox; knob * m_arpRangeKnob; diff --git a/include/InstrumentFunctions.h b/include/InstrumentFunctions.h index b26460494..14b1ae618 100644 --- a/include/InstrumentFunctions.h +++ b/include/InstrumentFunctions.h @@ -37,7 +37,7 @@ class notePlayHandle; -class ChordCreator : public Model, public JournallingObject +class InstrumentFunctionNoteStacking : public Model, public JournallingObject { Q_OBJECT @@ -48,8 +48,8 @@ private: typedef int8_t ChordSemiTones [MAX_CHORD_POLYPHONY]; public: - ChordCreator( Model * _parent ); - virtual ~ChordCreator(); + InstrumentFunctionNoteStacking( Model * _parent ); + virtual ~InstrumentFunctionNoteStacking(); void processNote( notePlayHandle * _n ); @@ -149,14 +149,14 @@ private: FloatModel m_chordRangeModel; - friend class ChordCreatorView; + friend class InstrumentFunctionNoteStackingView; } ; -class Arpeggiator : public Model, public JournallingObject +class InstrumentFunctionArpeggio : public Model, public JournallingObject { Q_OBJECT public: @@ -169,8 +169,8 @@ public: NumArpDirections } ; - Arpeggiator( Model * _parent ); - virtual ~Arpeggiator(); + InstrumentFunctionArpeggio( Model * _parent ); + virtual ~InstrumentFunctionArpeggio(); void processNote( notePlayHandle * _n ); @@ -203,7 +203,7 @@ private: friend class FlpImport; friend class InstrumentTrack; - friend class ArpeggiatorView; + friend class InstrumentFunctionArpeggioView; } ; diff --git a/include/InstrumentTrack.h b/include/InstrumentTrack.h index 7df268b82..3514b0aa7 100644 --- a/include/InstrumentTrack.h +++ b/include/InstrumentTrack.h @@ -39,8 +39,8 @@ class QLineEdit; template class QQueue; -class ArpeggiatorView; -class ChordCreatorView; +class InstrumentFunctionArpeggioView; +class InstrumentFunctionNoteStackingView; class EffectRackView; class InstrumentSoundShapingView; class fadeButton; @@ -162,9 +162,9 @@ public: return &m_piano; } - bool isArpeggiatorEnabled() const + bool isArpeggioEnabled() const { - return m_arpeggiator.m_arpEnabledModel.value(); + return m_arpeggio.m_arpEnabledModel.value(); } // simple helper for removing midiport-XML-node when loading presets @@ -238,8 +238,8 @@ private: Instrument * m_instrument; InstrumentSoundShaping m_soundShaping; - Arpeggiator m_arpeggiator; - ChordCreator m_chordCreator; + InstrumentFunctionArpeggio m_arpeggio; + InstrumentFunctionNoteStacking m_noteStacking; Piano m_piano; @@ -402,8 +402,8 @@ private: tabWidget * m_tabWidget; PluginView * m_instrumentView; InstrumentSoundShapingView * m_ssView; - ChordCreatorView * m_chordView; - ArpeggiatorView * m_arpView; + InstrumentFunctionNoteStackingView* m_noteStackingView; + InstrumentFunctionArpeggioView* m_arpeggioView; InstrumentMidiIOView * m_midiView; EffectRackView * m_effectView; diff --git a/plugins/flp_import/FlpImport.cpp b/plugins/flp_import/FlpImport.cpp index 63f0dc881..c374595f8 100644 --- a/plugins/flp_import/FlpImport.cpp +++ b/plugins/flp_import/FlpImport.cpp @@ -1,5 +1,5 @@ /* - * flp_import.cpp - support for importing FLP-files + * FlpImport.cpp - support for importing FLP-files * * Copyright (c) 2006-2014 Tobias Doerffel * @@ -464,7 +464,7 @@ struct FL_Channel : public FL_Plugin filterCut( 10000 ), filterRes( 0.1 ), filterEnabled( false ), - arpDir( Arpeggiator::ArpDirUp ), + arpDir( InstrumentFunctionArpeggio::ArpDirUp ), arpRange( 0 ), selectedArp( 0 ), arpTime( 100 ), @@ -603,14 +603,14 @@ bool FlpImport::tryImport( TrackContainer* tc ) basicFilters<>::NumFilters+basicFilters<>::LowPass } ; - const Arpeggiator::ArpDirections mappedArpDir[] = + const InstrumentFunctionArpeggio::ArpDirections mappedArpDir[] = { - Arpeggiator::ArpDirUp, - Arpeggiator::ArpDirUp, - Arpeggiator::ArpDirDown, - Arpeggiator::ArpDirUpAndDown, - Arpeggiator::ArpDirUpAndDown, - Arpeggiator::ArpDirRandom + InstrumentFunctionArpeggio::ArpDirUp, + InstrumentFunctionArpeggio::ArpDirUp, + InstrumentFunctionArpeggio::ArpDirDown, + InstrumentFunctionArpeggio::ArpDirUpAndDown, + InstrumentFunctionArpeggio::ArpDirUpAndDown, + InstrumentFunctionArpeggio::ArpDirRandom } ; QMap mappedPluginTypes; @@ -1519,7 +1519,7 @@ else } } - Arpeggiator * arp = &t->m_arpeggiator; + InstrumentFunctionArpeggio * arp = &t->m_arpeggio; arp->m_arpDirectionModel.setValue( it->arpDir ); arp->m_arpRangeModel.setValue( it->arpRange ); arp->m_arpModel.setValue( it->selectedArp ); diff --git a/src/core/InstrumentFunctions.cpp b/src/core/InstrumentFunctions.cpp index f6ef44715..1de453df8 100644 --- a/src/core/InstrumentFunctions.cpp +++ b/src/core/InstrumentFunctions.cpp @@ -33,111 +33,111 @@ -ChordCreator::ChordTable::Init ChordCreator::ChordTable::s_initTable[] = +InstrumentFunctionNoteStacking::ChordTable::Init InstrumentFunctionNoteStacking::ChordTable::s_initTable[] = { - { QT_TRANSLATE_NOOP( "ChordCreator", "octave" ), { 0, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Major" ), { 0, 4, 7, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Majb5" ), { 0, 4, 6, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "minor" ), { 0, 3, 7, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "minb5" ), { 0, 3, 6, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "sus2" ), { 0, 2, 7, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "sus4" ), { 0, 5, 7, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "aug" ), { 0, 4, 8, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "augsus4" ), { 0, 5, 8, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "tri" ), { 0, 3, 6, 9, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "octave" ), { 0, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Major" ), { 0, 4, 7, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Majb5" ), { 0, 4, 6, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "minor" ), { 0, 3, 7, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "minb5" ), { 0, 3, 6, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "sus2" ), { 0, 2, 7, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "sus4" ), { 0, 5, 7, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "aug" ), { 0, 4, 8, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "augsus4" ), { 0, 5, 8, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "tri" ), { 0, 3, 6, 9, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "6" ), { 0, 4, 7, 9, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "6sus4" ), { 0, 5, 7, 9, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "6add9" ), { 0, 4, 7, 9, 14, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "m6" ), { 0, 3, 7, 9, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "m6add9" ), { 0, 3, 7, 9, 14, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "6" ), { 0, 4, 7, 9, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "6sus4" ), { 0, 5, 7, 9, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "6add9" ), { 0, 4, 7, 9, 14, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "m6" ), { 0, 3, 7, 9, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "m6add9" ), { 0, 3, 7, 9, 14, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "7" ), { 0, 4, 7, 10, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "7sus4" ), { 0, 5, 7, 10, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "7#5" ), { 0, 4, 8, 10, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "7b5" ), { 0, 4, 6, 10, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "7#9" ), { 0, 4, 7, 10, 15, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "7b9" ), { 0, 4, 7, 10, 13, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "7#5#9" ), { 0, 4, 8, 10, 15, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "7#5b9" ), { 0, 4, 8, 10, 13, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "7b5b9" ), { 0, 4, 6, 10, 13, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "7add11" ), { 0, 4, 7, 10, 17, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "7add13" ), { 0, 4, 7, 10, 21, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "7#11" ), { 0, 4, 7, 10, 18, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Maj7" ), { 0, 4, 7, 11, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Maj7b5" ), { 0, 4, 6, 11, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Maj7#5" ), { 0, 4, 8, 11, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Maj7#11" ), { 0, 4, 7, 11, 18, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Maj7add13" ), { 0, 4, 7, 11, 21, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "m7" ), { 0, 3, 7, 10, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "m7b5" ), { 0, 3, 6, 10, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "m7b9" ), { 0, 3, 7, 10, 13, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "m7add11" ), { 0, 3, 7, 10, 17, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "m7add13" ), { 0, 3, 7, 10, 21, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "m-Maj7" ), { 0, 3, 7, 11, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "m-Maj7add11" ), { 0, 3, 7, 11, 17, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "m-Maj7add13" ), { 0, 3, 7, 11, 21, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "7" ), { 0, 4, 7, 10, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "7sus4" ), { 0, 5, 7, 10, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "7#5" ), { 0, 4, 8, 10, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "7b5" ), { 0, 4, 6, 10, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "7#9" ), { 0, 4, 7, 10, 15, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "7b9" ), { 0, 4, 7, 10, 13, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "7#5#9" ), { 0, 4, 8, 10, 15, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "7#5b9" ), { 0, 4, 8, 10, 13, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "7b5b9" ), { 0, 4, 6, 10, 13, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "7add11" ), { 0, 4, 7, 10, 17, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "7add13" ), { 0, 4, 7, 10, 21, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "7#11" ), { 0, 4, 7, 10, 18, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Maj7" ), { 0, 4, 7, 11, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Maj7b5" ), { 0, 4, 6, 11, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Maj7#5" ), { 0, 4, 8, 11, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Maj7#11" ), { 0, 4, 7, 11, 18, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Maj7add13" ), { 0, 4, 7, 11, 21, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "m7" ), { 0, 3, 7, 10, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "m7b5" ), { 0, 3, 6, 10, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "m7b9" ), { 0, 3, 7, 10, 13, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "m7add11" ), { 0, 3, 7, 10, 17, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "m7add13" ), { 0, 3, 7, 10, 21, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "m-Maj7" ), { 0, 3, 7, 11, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "m-Maj7add11" ), { 0, 3, 7, 11, 17, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "m-Maj7add13" ), { 0, 3, 7, 11, 21, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "9" ), { 0, 4, 7, 10, 14, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "9sus4" ), { 0, 5, 7, 10, 14, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "add9" ), { 0, 4, 7, 14, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "9#5" ), { 0, 4, 8, 10, 14, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "9b5" ), { 0, 4, 6, 10, 14, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "9#11" ), { 0, 4, 7, 10, 14, 18, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "9b13" ), { 0, 4, 7, 10, 14, 20, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Maj9" ), { 0, 4, 7, 11, 14, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Maj9sus4" ), { 0, 5, 7, 11, 15, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Maj9#5" ), { 0, 4, 8, 11, 14, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Maj9#11" ), { 0, 4, 7, 11, 14, 18, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "m9" ), { 0, 3, 7, 10, 14, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "madd9" ), { 0, 3, 7, 14, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "m9b5" ), { 0, 3, 6, 10, 14, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "m9-Maj7" ), { 0, 3, 7, 11, 14, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "9" ), { 0, 4, 7, 10, 14, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "9sus4" ), { 0, 5, 7, 10, 14, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "add9" ), { 0, 4, 7, 14, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "9#5" ), { 0, 4, 8, 10, 14, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "9b5" ), { 0, 4, 6, 10, 14, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "9#11" ), { 0, 4, 7, 10, 14, 18, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "9b13" ), { 0, 4, 7, 10, 14, 20, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Maj9" ), { 0, 4, 7, 11, 14, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Maj9sus4" ), { 0, 5, 7, 11, 15, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Maj9#5" ), { 0, 4, 8, 11, 14, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Maj9#11" ), { 0, 4, 7, 11, 14, 18, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "m9" ), { 0, 3, 7, 10, 14, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "madd9" ), { 0, 3, 7, 14, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "m9b5" ), { 0, 3, 6, 10, 14, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "m9-Maj7" ), { 0, 3, 7, 11, 14, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "11" ), { 0, 4, 7, 10, 14, 17, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "11b9" ), { 0, 4, 7, 10, 13, 17, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Maj11" ), { 0, 4, 7, 11, 14, 17, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "m11" ), { 0, 3, 7, 10, 14, 17, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "m-Maj11" ), { 0, 3, 7, 11, 14, 17, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "11" ), { 0, 4, 7, 10, 14, 17, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "11b9" ), { 0, 4, 7, 10, 13, 17, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Maj11" ), { 0, 4, 7, 11, 14, 17, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "m11" ), { 0, 3, 7, 10, 14, 17, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "m-Maj11" ), { 0, 3, 7, 11, 14, 17, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "13" ), { 0, 4, 7, 10, 14, 21, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "13#9" ), { 0, 4, 7, 10, 15, 21, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "13b9" ), { 0, 4, 7, 10, 13, 21, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "13b5b9" ), { 0, 4, 6, 10, 13, 21, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Maj13" ), { 0, 4, 7, 11, 14, 21, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "m13" ), { 0, 3, 7, 10, 14, 21, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "m-Maj13" ), { 0, 3, 7, 11, 14, 21, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "13" ), { 0, 4, 7, 10, 14, 21, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "13#9" ), { 0, 4, 7, 10, 15, 21, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "13b9" ), { 0, 4, 7, 10, 13, 21, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "13b5b9" ), { 0, 4, 6, 10, 13, 21, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Maj13" ), { 0, 4, 7, 11, 14, 21, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "m13" ), { 0, 3, 7, 10, 14, 21, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "m-Maj13" ), { 0, 3, 7, 11, 14, 21, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Major" ), { 0, 2, 4, 5, 7, 9, 11, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Harmonic minor" ), { 0, 2, 3, 5, 7, 8, 11, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Melodic minor" ), { 0, 2, 3, 5, 7, 9, 11, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Whole tone" ), { 0, 2, 4, 6, 8, 10, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Diminished" ), { 0, 2, 3, 5, 6, 8, 9, 11, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Major pentatonic" ), { 0, 2, 4, 7, 9, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Minor pentatonic" ), { 0, 3, 5, 7, 10, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Jap in sen" ), { 0, 1, 5, 7, 10, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Major bebop" ), { 0, 2, 4, 5, 7, 8, 9, 11, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Dominant bebop" ), { 0, 2, 4, 5, 7, 9, 10, 11, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Blues" ), { 0, 3, 5, 6, 7, 10, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Arabic" ), { 0, 1, 4, 5, 7, 8, 11, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Enigmatic" ), { 0, 1, 4, 6, 8, 10, 11, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Neopolitan" ), { 0, 1, 3, 5, 7, 9, 11, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Neopolitan minor" ), { 0, 1, 3, 5, 7, 8, 11, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Hungarian minor" ), { 0, 2, 3, 6, 7, 8, 11, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Dorian" ), { 0, 2, 3, 5, 7, 9, 10, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Phrygolydian" ), { 0, 1, 3, 5, 7, 8, 10, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Lydian" ), { 0, 2, 4, 6, 7, 9, 11, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Mixolydian" ), { 0, 2, 4, 5, 7, 9, 10, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Aeolian" ), { 0, 2, 3, 5, 7, 8, 10, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Locrian" ), { 0, 1, 3, 5, 6, 8, 10, -1 } }, - { QT_TRANSLATE_NOOP( "ChordCreator", "Minor" ), { 0, 2, 3, 5, 7, 8, 10, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Major" ), { 0, 2, 4, 5, 7, 9, 11, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Harmonic minor" ), { 0, 2, 3, 5, 7, 8, 11, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Melodic minor" ), { 0, 2, 3, 5, 7, 9, 11, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Whole tone" ), { 0, 2, 4, 6, 8, 10, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Diminished" ), { 0, 2, 3, 5, 6, 8, 9, 11, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Major pentatonic" ), { 0, 2, 4, 7, 9, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Minor pentatonic" ), { 0, 3, 5, 7, 10, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Jap in sen" ), { 0, 1, 5, 7, 10, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Major bebop" ), { 0, 2, 4, 5, 7, 8, 9, 11, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Dominant bebop" ), { 0, 2, 4, 5, 7, 9, 10, 11, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Blues" ), { 0, 3, 5, 6, 7, 10, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Arabic" ), { 0, 1, 4, 5, 7, 8, 11, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Enigmatic" ), { 0, 1, 4, 6, 8, 10, 11, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Neopolitan" ), { 0, 1, 3, 5, 7, 9, 11, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Neopolitan minor" ), { 0, 1, 3, 5, 7, 8, 11, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Hungarian minor" ), { 0, 2, 3, 6, 7, 8, 11, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Dorian" ), { 0, 2, 3, 5, 7, 9, 10, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Phrygolydian" ), { 0, 1, 3, 5, 7, 8, 10, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Lydian" ), { 0, 2, 4, 6, 7, 9, 11, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Mixolydian" ), { 0, 2, 4, 5, 7, 9, 10, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Aeolian" ), { 0, 2, 3, 5, 7, 8, 10, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Locrian" ), { 0, 1, 3, 5, 6, 8, 10, -1 } }, + { QT_TRANSLATE_NOOP( "InstrumentFunctionNoteStacking", "Minor" ), { 0, 2, 3, 5, 7, 8, 10, -1 } }, } ; -ChordCreator::Chord::Chord( const char * n, const ChordSemiTones & semi_tones ) : - m_name( ChordCreator::tr( n ) ) +InstrumentFunctionNoteStacking::Chord::Chord( const char * n, const ChordSemiTones & semi_tones ) : + m_name( InstrumentFunctionNoteStacking::tr( n ) ) { for( m_size = 0; m_size < MAX_CHORD_POLYPHONY; m_size++ ) { @@ -153,7 +153,7 @@ ChordCreator::Chord::Chord( const char * n, const ChordSemiTones & semi_tones ) -bool ChordCreator::Chord::hasSemiTone( int8_t semi_tone ) const +bool InstrumentFunctionNoteStacking::Chord::hasSemiTone( int8_t semi_tone ) const { for( int i = 0; i < size(); ++i ) { @@ -168,7 +168,7 @@ bool ChordCreator::Chord::hasSemiTone( int8_t semi_tone ) const -ChordCreator::ChordTable::ChordTable() : +InstrumentFunctionNoteStacking::ChordTable::ChordTable() : QVector() { for( int i = 0; @@ -182,7 +182,7 @@ ChordCreator::ChordTable::ChordTable() : -const ChordCreator::Chord & ChordCreator::ChordTable::getByName( const QString & name, bool is_scale ) const +const InstrumentFunctionNoteStacking::Chord & InstrumentFunctionNoteStacking::ChordTable::getByName( const QString & name, bool is_scale ) const { for( int i = 0; i < size(); i++ ) { @@ -197,7 +197,7 @@ const ChordCreator::Chord & ChordCreator::ChordTable::getByName( const QString & -ChordCreator::ChordCreator( Model * _parent ) : +InstrumentFunctionNoteStacking::InstrumentFunctionNoteStacking( Model * _parent ) : Model( _parent, tr( "Chords" ) ), m_chordsEnabledModel( false, this ), m_chordsModel( this, tr( "Chord type" ) ), @@ -213,14 +213,14 @@ ChordCreator::ChordCreator( Model * _parent ) : -ChordCreator::~ChordCreator() +InstrumentFunctionNoteStacking::~InstrumentFunctionNoteStacking() { } -void ChordCreator::processNote( notePlayHandle * _n ) +void InstrumentFunctionNoteStacking::processNote( notePlayHandle * _n ) { const int base_note_key = _n->key(); const ChordTable & chord_table = ChordTable::getInstance(); @@ -229,9 +229,7 @@ void ChordCreator::processNote( notePlayHandle * _n ) // at the same time we only add sub-notes if nothing of the note was // played yet, because otherwise we would add chord-subnotes every // time an audio-buffer is rendered... - if( ( ( _n->isTopNote() && - _n->instrumentTrack()->isArpeggiatorEnabled() == false ) || - _n->isPartOfArpeggio() ) && + if( ( ( _n->isTopNote() && _n->instrumentTrack()->isArpeggioEnabled() == false ) || _n->isPartOfArpeggio() ) && _n->totalFramesPlayed() == 0 && m_chordsEnabledModel.value() == true ) { @@ -282,7 +280,7 @@ void ChordCreator::processNote( notePlayHandle * _n ) -void ChordCreator::saveSettings( QDomDocument & _doc, QDomElement & _this ) +void InstrumentFunctionNoteStacking::saveSettings( QDomDocument & _doc, QDomElement & _this ) { m_chordsEnabledModel.saveSettings( _doc, _this, "chord-enabled" ); m_chordsModel.saveSettings( _doc, _this, "chord" ); @@ -292,7 +290,7 @@ void ChordCreator::saveSettings( QDomDocument & _doc, QDomElement & _this ) -void ChordCreator::loadSettings( const QDomElement & _this ) +void InstrumentFunctionNoteStacking::loadSettings( const QDomElement & _this ) { m_chordsEnabledModel.loadSettings( _this, "chord-enabled" ); m_chordsModel.loadSettings( _this, "chord" ); @@ -305,7 +303,7 @@ void ChordCreator::loadSettings( const QDomElement & _this ) -Arpeggiator::Arpeggiator( Model * _parent ) : +InstrumentFunctionArpeggio::InstrumentFunctionArpeggio( Model * _parent ) : Model( _parent, tr( "Arpeggio" ) ), m_arpEnabledModel( false ), m_arpModel( this, tr( "Arpeggio type" ) ), @@ -317,7 +315,7 @@ Arpeggiator::Arpeggiator( Model * _parent ) : m_arpDirectionModel( this, tr( "Arpeggio direction" ) ), m_arpModeModel( this, tr( "Arpeggio mode" ) ) { - const ChordCreator::ChordTable & chord_table = ChordCreator::ChordTable::getInstance(); + const InstrumentFunctionNoteStacking::ChordTable & chord_table = InstrumentFunctionNoteStacking::ChordTable::getInstance(); for( int i = 0; i < chord_table.size(); ++i ) { m_arpModel.addItem( chord_table[i].getName() ); @@ -339,14 +337,14 @@ Arpeggiator::Arpeggiator( Model * _parent ) : -Arpeggiator::~Arpeggiator() +InstrumentFunctionArpeggio::~InstrumentFunctionArpeggio() { } -void Arpeggiator::processNote( notePlayHandle * _n ) +void InstrumentFunctionArpeggio::processNote( notePlayHandle * _n ) { const int base_note_key = _n->key(); if( _n->isTopNote() == false || @@ -375,7 +373,7 @@ void Arpeggiator::processNote( notePlayHandle * _n ) } } - const ChordCreator::ChordTable & chord_table = ChordCreator::ChordTable::getInstance(); + const InstrumentFunctionNoteStacking::ChordTable & chord_table = InstrumentFunctionNoteStacking::ChordTable::getInstance(); const int cur_chord_size = chord_table[selected_arp].size(); const int range = (int)( cur_chord_size * m_arpRangeModel.value() ); const int total_range = range * cnphv.size(); @@ -512,7 +510,7 @@ void Arpeggiator::processNote( notePlayHandle * _n ) -void Arpeggiator::saveSettings( QDomDocument & _doc, QDomElement & _this ) +void InstrumentFunctionArpeggio::saveSettings( QDomDocument & _doc, QDomElement & _this ) { m_arpEnabledModel.saveSettings( _doc, _this, "arp-enabled" ); m_arpModel.saveSettings( _doc, _this, "arp" ); @@ -527,7 +525,7 @@ void Arpeggiator::saveSettings( QDomDocument & _doc, QDomElement & _this ) -void Arpeggiator::loadSettings( const QDomElement & _this ) +void InstrumentFunctionArpeggio::loadSettings( const QDomElement & _this ) { m_arpEnabledModel.loadSettings( _this, "arp-enabled" ); m_arpModel.loadSettings( _this, "arp" ); diff --git a/src/core/note_play_handle.cpp b/src/core/note_play_handle.cpp index 9654cde23..88482599c 100644 --- a/src/core/note_play_handle.cpp +++ b/src/core/note_play_handle.cpp @@ -2,7 +2,7 @@ * note_play_handle.cpp - implementation of class notePlayHandle, part of * rendering engine * - * Copyright (c) 2004-2012 Tobias Doerffel + * Copyright (c) 2004-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -101,7 +101,7 @@ notePlayHandle::notePlayHandle( InstrumentTrack * _it, setFrames( _frames ); - if( !isTopNote() || !instrumentTrack()->isArpeggiatorEnabled() ) + if( !isTopNote() || !instrumentTrack()->isArpeggioEnabled() ) { // send MIDI-note-on-event m_instrumentTrack->processOutEvent( midiEvent( MidiNoteOn, @@ -339,7 +339,7 @@ void notePlayHandle::noteOff( const f_cnt_t _s ) m_releaseFramesToDo = qMax( 0, // 10, m_instrumentTrack->m_soundShaping.releaseFrames() ); - if( !isTopNote() || !instrumentTrack()->isArpeggiatorEnabled() ) + if( !isTopNote() || !instrumentTrack()->isArpeggioEnabled() ) { // send MIDI-note-off-event m_instrumentTrack->processOutEvent( midiEvent( MidiNoteOff, @@ -387,8 +387,7 @@ float notePlayHandle::volumeLevel( const f_cnt_t _frame ) bool notePlayHandle::isArpeggioBaseNote() const { - return isTopNote() && ( m_partOfArpeggio || - m_instrumentTrack->isArpeggiatorEnabled() ); + return isTopNote() && ( m_partOfArpeggio || m_instrumentTrack->isArpeggioEnabled() ); } diff --git a/src/gui/piano_roll.cpp b/src/gui/piano_roll.cpp index 27ebbcace..0c854808d 100644 --- a/src/gui/piano_roll.cpp +++ b/src/gui/piano_roll.cpp @@ -520,7 +520,7 @@ pianoRoll::pianoRoll() : this, SLOT( quantizeChanged() ) ); - const ChordCreator::ChordTable & chord_table = ChordCreator::ChordTable::getInstance(); + const InstrumentFunctionNoteStacking::ChordTable & chord_table = InstrumentFunctionNoteStacking::ChordTable::getInstance(); // setup scale-stuff QLabel * scale_lbl = new QLabel( m_toolBar ); @@ -644,7 +644,7 @@ void pianoRoll::changeNoteEditMode( int i ) void pianoRoll::markSemiTone( int i ) { const int key = getKey( mapFromGlobal( m_semiToneMarkerMenu->pos() ).y() ); - const ChordCreator::Chord * chord = 0; + const InstrumentFunctionNoteStacking::Chord * chord = 0; switch( static_cast( i ) ) { @@ -665,13 +665,13 @@ void pianoRoll::markSemiTone( int i ) break; } case stmaMarkCurrentScale: - chord = & ChordCreator::ChordTable::getInstance() + chord = & InstrumentFunctionNoteStacking::ChordTable::getInstance() .getScaleByName( m_scaleModel.currentText() ); case stmaMarkCurrentChord: { if( ! chord ) { - chord = & ChordCreator::ChordTable::getInstance() + chord = & InstrumentFunctionNoteStacking::ChordTable::getInstance() .getChordByName( m_chordModel.currentText() ); } @@ -1602,7 +1602,7 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me ) new_note.setVolume( m_lastNoteVolume ); created_new_note = m_pattern->addNote( new_note ); - const ChordCreator::Chord & chord = ChordCreator::ChordTable::getInstance() + const InstrumentFunctionNoteStacking::Chord & chord = InstrumentFunctionNoteStacking::ChordTable::getInstance() .getChordByName( m_chordModel.currentText() ); if( ! chord.isEmpty() ) @@ -3855,10 +3855,10 @@ int pianoRoll::quantization() const void pianoRoll::updateSemiToneMarkerMenu() { - const ChordCreator::Chord & scale = ChordCreator::ChordTable::getInstance() + const InstrumentFunctionNoteStacking::Chord & scale = InstrumentFunctionNoteStacking::ChordTable::getInstance() .getScaleByName( m_scaleModel.currentText() ); - const ChordCreator::Chord & chord = ChordCreator::ChordTable::getInstance() + const InstrumentFunctionNoteStacking::Chord & chord = InstrumentFunctionNoteStacking::ChordTable::getInstance() .getChordByName( m_chordModel.currentText() ); emit semiToneMarkerMenuScaleSetEnabled( ! scale.isEmpty() ); diff --git a/src/gui/widgets/InstrumentFunctionViews.cpp b/src/gui/widgets/InstrumentFunctionViews.cpp index 543d9c6c4..e2305906e 100644 --- a/src/gui/widgets/InstrumentFunctionViews.cpp +++ b/src/gui/widgets/InstrumentFunctionViews.cpp @@ -38,7 +38,7 @@ #include "tooltip.h" -ChordCreatorView::ChordCreatorView( ChordCreator* cc, QWidget* parent ) : +InstrumentFunctionNoteStackingView::InstrumentFunctionNoteStackingView( InstrumentFunctionNoteStacking* cc, QWidget* parent ) : QWidget( parent ), ModelView( NULL, this ), m_cc( cc ), @@ -74,7 +74,7 @@ ChordCreatorView::ChordCreatorView( ChordCreator* cc, QWidget* parent ) : -ChordCreatorView::~ChordCreatorView() +InstrumentFunctionNoteStackingView::~InstrumentFunctionNoteStackingView() { delete m_chordsGroupBox; } @@ -82,9 +82,9 @@ ChordCreatorView::~ChordCreatorView() -void ChordCreatorView::modelChanged() +void InstrumentFunctionNoteStackingView::modelChanged() { - m_cc = castModel(); + m_cc = castModel(); m_chordsGroupBox->setModel( &m_cc->m_chordsEnabledModel ); m_chordsComboBox->setModel( &m_cc->m_chordsModel ); m_chordRangeKnob->setModel( &m_cc->m_chordRangeModel ); @@ -96,7 +96,7 @@ void ChordCreatorView::modelChanged() -ArpeggiatorView::ArpeggiatorView( Arpeggiator* arp, QWidget* parent ) : +InstrumentFunctionArpeggioView::InstrumentFunctionArpeggioView( InstrumentFunctionArpeggio* arp, QWidget* parent ) : QWidget( parent ), ModelView( NULL, this ), m_a( arp ), @@ -180,7 +180,7 @@ ArpeggiatorView::ArpeggiatorView( Arpeggiator* arp, QWidget* parent ) : -ArpeggiatorView::~ArpeggiatorView() +InstrumentFunctionArpeggioView::~InstrumentFunctionArpeggioView() { delete m_arpGroupBox; } @@ -188,9 +188,9 @@ ArpeggiatorView::~ArpeggiatorView() -void ArpeggiatorView::modelChanged() +void InstrumentFunctionArpeggioView::modelChanged() { - m_a = castModel(); + m_a = castModel(); m_arpGroupBox->setModel( &m_a->m_arpEnabledModel ); m_arpComboBox->setModel( &m_a->m_arpModel ); m_arpRangeKnob->setModel( &m_a->m_arpRangeModel ); diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index 2b15cceca..a88f07fcb 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -108,8 +108,8 @@ InstrumentTrack::InstrumentTrack( TrackContainer* tc ) : m_effectChannelModel( 0, 0, NumFxChannels, this, tr( "FX channel" ) ), m_instrument( NULL ), m_soundShaping( this ), - m_arpeggiator( this ), - m_chordCreator( this ), + m_arpeggio( this ), + m_noteStacking( this ), m_piano( this ) { m_pitchModel.setCenterValue( 0 ); @@ -490,8 +490,8 @@ void InstrumentTrack::playNote( notePlayHandle * _n, { // arpeggio- and chord-widget has to do its work -> adding sub-notes // for chords/arpeggios - m_chordCreator.processNote( _n ); - m_arpeggiator.processNote( _n ); + m_noteStacking.processNote( _n ); + m_arpeggio.processNote( _n ); if( !_n->isArpeggioBaseNote() && m_instrument != NULL ) { @@ -782,8 +782,8 @@ void InstrumentTrack::saveTrackSpecificSettings( QDomDocument & _doc, _this.appendChild( i ); } m_soundShaping.saveState( _doc, _this ); - m_chordCreator.saveState( _doc, _this ); - m_arpeggiator.saveState( _doc, _this ); + m_noteStacking.saveState( _doc, _this ); + m_arpeggio.saveState( _doc, _this ); m_midiPort.saveState( _doc, _this ); m_audioPort.effects()->saveState( _doc, _this ); } @@ -842,13 +842,13 @@ void InstrumentTrack::loadTrackSpecificSettings( const QDomElement & _this ) { m_soundShaping.restoreState( node.toElement() ); } - else if( m_chordCreator.nodeName() == node.nodeName() ) + else if( m_noteStacking.nodeName() == node.nodeName() ) { - m_chordCreator.restoreState( node.toElement() ); + m_noteStacking.restoreState( node.toElement() ); } - else if( m_arpeggiator.nodeName() == node.nodeName() ) + else if( m_arpeggio.nodeName() == node.nodeName() ) { - m_arpeggiator.restoreState( node.toElement() ); + m_arpeggio.restoreState( node.toElement() ); } else if( m_midiPort.nodeName() == node.nodeName() ) { @@ -1356,11 +1356,11 @@ InstrumentTrackWindow::InstrumentTrackWindow( InstrumentTrackView * _itv ) : QWidget* instrumentFunctions = new QWidget( m_tabWidget ); QVBoxLayout* instrumentFunctionsLayout = new QVBoxLayout( instrumentFunctions ); instrumentFunctionsLayout->setMargin( 5 ); - m_chordView = new ChordCreatorView( &m_track->m_chordCreator ); - m_arpView= new ArpeggiatorView( &m_track->m_arpeggiator ); + m_noteStackingView = new InstrumentFunctionNoteStackingView( &m_track->m_noteStacking ); + m_arpeggioView = new InstrumentFunctionArpeggioView( &m_track->m_arpeggio ); - instrumentFunctionsLayout->addWidget( m_chordView ); - instrumentFunctionsLayout->addWidget( m_arpView ); + instrumentFunctionsLayout->addWidget( m_noteStackingView ); + instrumentFunctionsLayout->addWidget( m_arpeggioView ); instrumentFunctionsLayout->addStretch(); // MIDI tab @@ -1463,8 +1463,8 @@ void InstrumentTrackWindow::modelChanged() } m_ssView->setModel( &m_track->m_soundShaping ); - m_chordView->setModel( &m_track->m_chordCreator ); - m_arpView->setModel( &m_track->m_arpeggiator ); + m_noteStackingView->setModel( &m_track->m_noteStacking ); + m_arpeggioView->setModel( &m_track->m_arpeggio ); m_midiView->setModel( &m_track->m_midiPort ); m_effectView->setModel( m_track->m_audioPort.effects() ); updateName(); From f34be7bf16ec69310fa9cb26a4e64ad2aa0ebc23 Mon Sep 17 00:00:00 2001 From: Wong Cho Ching Date: Sat, 25 Jan 2014 11:34:41 +0800 Subject: [PATCH 027/110] Create dummy files --- plugins/sfxr/CMakeLists.txt | 3 + plugins/sfxr/artwork.png | Bin 0 -> 44968 bytes plugins/sfxr/logo.png | Bin 0 -> 1109 bytes plugins/sfxr/sfxr.cpp | 592 ++++++++++++++++++++++++++++++++++++ plugins/sfxr/sfxr.h | 157 ++++++++++ 5 files changed, 752 insertions(+) create mode 100644 plugins/sfxr/CMakeLists.txt create mode 100644 plugins/sfxr/artwork.png create mode 100644 plugins/sfxr/logo.png create mode 100644 plugins/sfxr/sfxr.cpp create mode 100644 plugins/sfxr/sfxr.h diff --git a/plugins/sfxr/CMakeLists.txt b/plugins/sfxr/CMakeLists.txt new file mode 100644 index 000000000..6d3f61a0c --- /dev/null +++ b/plugins/sfxr/CMakeLists.txt @@ -0,0 +1,3 @@ +INCLUDE(BuildPlugin) + +BUILD_PLUGIN(sfxr sfxr.cpp sfxr.h MOCFILES EMBEDDED_RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.png) diff --git a/plugins/sfxr/artwork.png b/plugins/sfxr/artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..3938592ca936dde89545f1d2f63b67ccbc74669c GIT binary patch literal 44968 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 C7=(xb literal 0 HcmV?d00001 diff --git a/plugins/sfxr/logo.png b/plugins/sfxr/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2e84cba5a1377f9a65f4b1db243846c05b713dab GIT binary patch literal 1109 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sjKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sf4NgXJQJvX>d|!Zim;!u4T!B&}8T|kM|KEoPYk)xzQWE4B z3=9-z7FITP4o)6kK7IiqVKH$DDQOv5Ie7&|WffI5bxkcDJ$(ZsV>5FbTRUercTX>G zAOC>Bppe+Ogv8|3w9MSR{F2i0iptu$=C+QmNmCXqHI%PT1Dem6$-r|AKVTYt_};w_U!NXB7K(*S6We|JSFoOiXsz8FdcnrTOt2&-)|dIM-^*%*&JceQt?Pec4@e;H|XO%RORm zJGWT29Px>-t+FOzYLvO;^eNcK04<`;f1yG=XO=pJT7uNUR(9=-MyZ|evNJ5+=Dl~Z4JU&4-aUTUP}up-@@>18x9vZm z`?`a3wX0b1{r8`b`8V%pdUGe>(P~!Sf0F`#aQn*cpRcO&&I6RsJzf1=);T3K0RVE& BY2^R_ literal 0 HcmV?d00001 diff --git a/plugins/sfxr/sfxr.cpp b/plugins/sfxr/sfxr.cpp new file mode 100644 index 000000000..080c424f3 --- /dev/null +++ b/plugins/sfxr/sfxr.cpp @@ -0,0 +1,592 @@ +/* + * bit_invader.cpp - instrument which uses a usereditable wavetable + * + * Copyright (c) 2006-2008 Andreas Brandmaier + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 "bit_invader.h" +#include "engine.h" +#include "graph.h" +#include "InstrumentTrack.h" +#include "knob.h" +#include "led_checkbox.h" +#include "note_play_handle.h" +#include "Oscillator.h" +#include "pixmap_button.h" +#include "song_editor.h" +#include "templates.h" +#include "tooltip.h" +#include "song.h" + +#include "embed.cpp" + +extern "C" +{ + +Plugin::Descriptor PLUGIN_EXPORT bitinvader_plugin_descriptor = +{ + STRINGIFY( PLUGIN_NAME ), + "BitInvader", + QT_TRANSLATE_NOOP( "pluginBrowser", + "Customizable wavetable synthesizer" ), + "Andreas Brandmaier ", + 0x0100, + Plugin::Instrument, + new PluginPixmapLoader( "logo" ), + NULL, + NULL +} ; + +} + + +bSynth::bSynth( float * _shape, int _length, notePlayHandle * _nph, bool _interpolation, + float _factor, const sample_rate_t _sample_rate ) : + sample_index( 0 ), + sample_realindex( 0 ), + nph( _nph ), + sample_length( _length ), + sample_rate( _sample_rate ), + interpolation( _interpolation) +{ + sample_shape = new float[sample_length]; + for (int i=0; i < _length; ++i) + { + sample_shape[i] = _shape[i] * _factor; + } +} + + +bSynth::~bSynth() +{ + delete[] sample_shape; +} + + +sample_t bSynth::nextStringSample() +{ + float sample_step = + static_cast( sample_length / ( sample_rate / nph->frequency() ) ); + + + // check overflow + while (sample_realindex >= sample_length) { + sample_realindex -= sample_length; + } + + sample_t sample; + + if (interpolation) { + + // find position in shape + int a = static_cast(sample_realindex); + int b; + if (a < (sample_length-1)) { + b = static_cast(sample_realindex+1); + } else { + b = 0; + } + + // Nachkommaanteil + float frac = sample_realindex - static_cast(sample_realindex); + + sample = sample_shape[a]*(1-frac) + sample_shape[b]*(frac); + + } else { + // No interpolation + sample_index = static_cast(sample_realindex); + sample = sample_shape[sample_index]; + } + + // progress in shape + sample_realindex += sample_step; + + return sample; +} + +/*********************************************************************** +* +* class BitInvader +* +* lmms - plugin +* +***********************************************************************/ + + +bitInvader::bitInvader( InstrumentTrack * _instrument_track ) : + Instrument( _instrument_track, &bitinvader_plugin_descriptor ), + m_sampleLength( 128, 8, 128, 1, this, tr( "Samplelength" ) ), + m_graph( -1.0f, 1.0f, 128, this ), + m_interpolation( false, this ), + m_normalize( false, this ) +{ + + m_graph.setWaveToSine(); + + connect( &m_sampleLength, SIGNAL( dataChanged( ) ), + this, SLOT( lengthChanged( ) ) ); + + connect( &m_graph, SIGNAL( samplesChanged( int, int ) ), + this, SLOT( samplesChanged( int, int ) ) ); + +} + + + + +bitInvader::~bitInvader() +{ +} + + + + +void bitInvader::saveSettings( QDomDocument & _doc, QDomElement & _this ) +{ + + // Save plugin version + _this.setAttribute( "version", "0.1" ); + + // Save sample length + m_sampleLength.saveSettings( _doc, _this, "sampleLength" ); + + // Save sample shape base64-encoded + QString sampleString; + base64::encode( (const char *)m_graph.samples(), + m_graph.length() * sizeof(float), sampleString ); + _this.setAttribute( "sampleShape", sampleString ); + + + // save LED normalize + m_interpolation.saveSettings( _doc, _this, "interpolation" ); + + // save LED + m_normalize.saveSettings( _doc, _this, "normalize" ); +} + + + + +void bitInvader::loadSettings( const QDomElement & _this ) +{ + // Load sample length + m_sampleLength.loadSettings( _this, "sampleLength" ); + + int sampleLength = (int)m_sampleLength.value(); + + // Load sample shape + int size = 0; + char * dst = 0; + base64::decode( _this.attribute( "sampleShape"), &dst, &size ); + + m_graph.setLength( sampleLength ); + m_graph.setSamples( (float*) dst ); + delete[] dst; + + // Load LED normalize + m_interpolation.loadSettings( _this, "interpolation" ); + // Load LED + m_normalize.loadSettings( _this, "normalize" ); + +} + + + + +void bitInvader::lengthChanged() +{ + m_graph.setLength( (int) m_sampleLength.value() ); + + normalize(); +} + + + + +void bitInvader::samplesChanged( int _begin, int _end ) +{ + normalize(); + //engine::getSongEditor()->setModified(); +} + + + + +void bitInvader::normalize() +{ + // analyze + float max = 0; + const float* samples = m_graph.samples(); + for(int i=0; i < m_graph.length(); i++) + { + const float f = fabsf( samples[i] ); + if (f > max) { max = f; } + } + m_normalizeFactor = 1.0 / max; +} + + + + +QString bitInvader::nodeName() const +{ + return( bitinvader_plugin_descriptor.name ); +} + + + + +void bitInvader::playNote( notePlayHandle * _n, + sampleFrame * _working_buffer ) +{ + if ( _n->totalFramesPlayed() == 0 || _n->m_pluginData == NULL ) + { + + float factor; + if( !m_normalize.value() ) + { + factor = 1.0f; + } + else + { + factor = m_normalizeFactor; + } + + _n->m_pluginData = new bSynth( + const_cast( m_graph.samples() ), + m_graph.length(), + _n, + m_interpolation.value(), factor, + engine::mixer()->processingSampleRate() ); + } + + const fpp_t frames = _n->framesLeftForCurrentPeriod(); + + bSynth * ps = static_cast( _n->m_pluginData ); + for( fpp_t frame = 0; frame < frames; ++frame ) + { + const sample_t cur = ps->nextStringSample(); + for( ch_cnt_t chnl = 0; chnl < DEFAULT_CHANNELS; ++chnl ) + { + _working_buffer[frame][chnl] = cur; + } + } + + applyRelease( _working_buffer, _n ); + + instrumentTrack()->processAudioBuffer( _working_buffer, frames, _n ); +} + + + + +void bitInvader::deleteNotePluginData( notePlayHandle * _n ) +{ + delete static_cast( _n->m_pluginData ); +} + + + + +PluginView * bitInvader::instantiateView( QWidget * _parent ) +{ + return( new bitInvaderView( this, _parent ) ); +} + + + + + + + +bitInvaderView::bitInvaderView( Instrument * _instrument, + QWidget * _parent ) : + InstrumentView( _instrument, _parent ) +{ + setAutoFillBackground( true ); + QPalette pal; + + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( + "artwork" ) ); + setPalette( pal ); + + m_sampleLengthKnob = new knob( knobDark_28, this ); + m_sampleLengthKnob->move( 10, 120 ); + m_sampleLengthKnob->setHintText( tr( "Sample Length" ) + " ", "" ); + + m_graph = new graph( this, graph::NearestStyle ); + m_graph->move(53,118); // 55,120 - 2px border + m_graph->setAutoFillBackground( true ); + + toolTip::add( m_graph, tr ( "Draw your own waveform here " + "by dragging your mouse on this graph." + )); + + + pal = QPalette(); + pal.setBrush( backgroundRole(), + PLUGIN_NAME::getIconPixmap("wavegraph") ); + m_graph->setPalette( pal ); + + + m_sinWaveBtn = new pixmapButton( this, tr( "Sine wave" ) ); + m_sinWaveBtn->move( 188, 120 ); + m_sinWaveBtn->setActiveGraphic( embed::getIconPixmap( + "sin_wave_active" ) ); + m_sinWaveBtn->setInactiveGraphic( embed::getIconPixmap( + "sin_wave_inactive" ) ); + toolTip::add( m_sinWaveBtn, + tr( "Click for a sine-wave." ) ); + + m_triangleWaveBtn = new pixmapButton( this, tr( "Triangle wave" ) ); + m_triangleWaveBtn->move( 188, 136 ); + m_triangleWaveBtn->setActiveGraphic( + embed::getIconPixmap( "triangle_wave_active" ) ); + m_triangleWaveBtn->setInactiveGraphic( + embed::getIconPixmap( "triangle_wave_inactive" ) ); + toolTip::add( m_triangleWaveBtn, + tr( "Click here for a triangle-wave." ) ); + + m_sawWaveBtn = new pixmapButton( this, tr( "Saw wave" ) ); + m_sawWaveBtn->move( 188, 152 ); + m_sawWaveBtn->setActiveGraphic( embed::getIconPixmap( + "saw_wave_active" ) ); + m_sawWaveBtn->setInactiveGraphic( embed::getIconPixmap( + "saw_wave_inactive" ) ); + toolTip::add( m_sawWaveBtn, + tr( "Click here for a saw-wave." ) ); + + m_sqrWaveBtn = new pixmapButton( this, tr( "Square wave" ) ); + m_sqrWaveBtn->move( 188, 168 ); + m_sqrWaveBtn->setActiveGraphic( embed::getIconPixmap( + "square_wave_active" ) ); + m_sqrWaveBtn->setInactiveGraphic( embed::getIconPixmap( + "square_wave_inactive" ) ); + toolTip::add( m_sqrWaveBtn, + tr( "Click here for a square-wave." ) ); + + m_whiteNoiseWaveBtn = new pixmapButton( this, + tr( "White noise wave" ) ); + m_whiteNoiseWaveBtn->move( 188, 184 ); + m_whiteNoiseWaveBtn->setActiveGraphic( + embed::getIconPixmap( "white_noise_wave_active" ) ); + m_whiteNoiseWaveBtn->setInactiveGraphic( + embed::getIconPixmap( "white_noise_wave_inactive" ) ); + toolTip::add( m_whiteNoiseWaveBtn, + tr( "Click here for white-noise." ) ); + + m_usrWaveBtn = new pixmapButton( this, tr( "User defined wave" ) ); + m_usrWaveBtn->move( 188, 200 ); + m_usrWaveBtn->setActiveGraphic( embed::getIconPixmap( + "usr_wave_active" ) ); + m_usrWaveBtn->setInactiveGraphic( embed::getIconPixmap( + "usr_wave_inactive" ) ); + toolTip::add( m_usrWaveBtn, + tr( "Click here for a user-defined shape." ) ); + + m_smoothBtn = new pixmapButton( this, tr( "Smooth" ) ); + m_smoothBtn->move( 35, 200 ); + m_smoothBtn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "smooth" ) ); + m_smoothBtn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "smooth" ) ); + m_smoothBtn->setChecked( true ); + toolTip::add( m_smoothBtn, + tr( "Click here to smooth waveform." ) ); + + + m_interpolationToggle = new ledCheckBox( "Interpolation", this, + tr( "Interpolation" ) ); + m_interpolationToggle->move( 55,80 ); + + + m_normalizeToggle = new ledCheckBox( "Normalize", this, + tr( "Normalize" ) ); + m_normalizeToggle->move( 55, 100 ); + + + connect( m_sinWaveBtn, SIGNAL (clicked () ), + this, SLOT ( sinWaveClicked() ) ); + connect( m_triangleWaveBtn, SIGNAL ( clicked () ), + this, SLOT ( triangleWaveClicked() ) ); + connect( m_sawWaveBtn, SIGNAL (clicked () ), + this, SLOT ( sawWaveClicked() ) ); + connect( m_sqrWaveBtn, SIGNAL ( clicked () ), + this, SLOT ( sqrWaveClicked() ) ); + connect( m_whiteNoiseWaveBtn, SIGNAL ( clicked () ), + this, SLOT ( noiseWaveClicked() ) ); + connect( m_usrWaveBtn, SIGNAL ( clicked () ), + this, SLOT ( usrWaveClicked() ) ); + + connect( m_smoothBtn, SIGNAL ( clicked () ), + this, SLOT ( smoothClicked() ) ); + + connect( m_interpolationToggle, SIGNAL( toggled( bool ) ), + this, SLOT ( interpolationToggled( bool ) ) ); + + connect( m_normalizeToggle, SIGNAL( toggled( bool ) ), + this, SLOT ( normalizeToggled( bool ) ) ); + +} + + + + +void bitInvaderView::modelChanged() +{ + bitInvader * b = castModel(); + + m_graph->setModel( &b->m_graph ); + m_sampleLengthKnob->setModel( &b->m_sampleLength ); + m_interpolationToggle->setModel( &b->m_interpolation ); + m_normalizeToggle->setModel( &b->m_normalize ); + +} + + + + +void bitInvaderView::sinWaveClicked() +{ + m_graph->model()->setWaveToSine(); + engine::getSong()->setModified(); +} + + + + +void bitInvaderView::triangleWaveClicked() +{ + m_graph->model()->setWaveToTriangle(); + engine::getSong()->setModified(); +} + + + + +void bitInvaderView::sawWaveClicked() +{ + m_graph->model()->setWaveToSaw(); + engine::getSong()->setModified(); +} + + + + +void bitInvaderView::sqrWaveClicked() +{ + m_graph->model()->setWaveToSquare(); + engine::getSong()->setModified(); +} + + + + +void bitInvaderView::noiseWaveClicked() +{ + m_graph->model()->setWaveToNoise(); + engine::getSong()->setModified(); +} + + + + +void bitInvaderView::usrWaveClicked() +{ + QString fileName = m_graph->model()->setWaveToUser(); + toolTip::add( m_usrWaveBtn, fileName ); + engine::getSong()->setModified(); + /* + m_graph->model()->setWaveToNoise(); + engine::getSong()->setModified(); + // zero sample_shape + for (int i = 0; i < sample_length; i++) + { + sample_shape[i] = 0; + } + + // load user shape + sampleBuffer buffer; + QString af = buffer.openAudioFile(); + if ( af != "" ) + { + buffer.setAudioFile( af ); + + // copy buffer data + sample_length = min( sample_length, static_cast( + buffer.frames() ) ); + for ( int i = 0; i < sample_length; i++ ) + { + sample_shape[i] = (float)*buffer.data()[i]; + } + } + + sampleChanged(); + */ +} + + + + +void bitInvaderView::smoothClicked() +{ + m_graph->model()->smooth(); + engine::getSong()->setModified(); +} + + + + +void bitInvaderView::interpolationToggled( bool value ) +{ + m_graph->setGraphStyle( value ? graph::LinearStyle : graph::NearestStyle); + engine::getSong()->setModified(); +} + + + + +void bitInvaderView::normalizeToggled( bool value ) +{ + engine::getSong()->setModified(); +} + + + + +extern "C" +{ + +// necessary for getting instance out of shared lib +Plugin * PLUGIN_EXPORT lmms_plugin_main( Model *, void * _data ) +{ + return( new bitInvader( static_cast( _data ) ) ); +} + + +} + + + +#include "moc_bit_invader.cxx" diff --git a/plugins/sfxr/sfxr.h b/plugins/sfxr/sfxr.h new file mode 100644 index 000000000..7a3217b47 --- /dev/null +++ b/plugins/sfxr/sfxr.h @@ -0,0 +1,157 @@ +/* + * bit_invader.h - declaration of class bitInvader and bSynth which + * are a wavetable synthesizer + * + * Copyright (c) 2006-2008 Andreas Brandmaier + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _BIT_INVADER_H +#define _BIT_INVADER_H + +#include "Instrument.h" +#include "InstrumentView.h" +#include "graph.h" +#include "knob.h" +#include "pixmap_button.h" +#include "led_checkbox.h" + +class oscillator; +class bitInvaderView; + +class bSynth +{ +public: + bSynth( float * sample, int length, notePlayHandle * _nph, + bool _interpolation, float factor, + const sample_rate_t _sample_rate ); + virtual ~bSynth(); + + sample_t nextStringSample(); + + +private: + int sample_index; + float sample_realindex; + float* sample_shape; + notePlayHandle* nph; + const int sample_length; + const sample_rate_t sample_rate; + + bool interpolation; + +} ; + +class bitInvader : public Instrument +{ + Q_OBJECT +public: + bitInvader(InstrumentTrack * _instrument_track ); + virtual ~bitInvader(); + + virtual void playNote( notePlayHandle * _n, + sampleFrame * _working_buffer ); + virtual void deleteNotePluginData( notePlayHandle * _n ); + + + virtual void saveSettings( QDomDocument & _doc, + QDomElement & _parent ); + virtual void loadSettings( const QDomElement & _this ); + + virtual QString nodeName() const; + + virtual f_cnt_t desiredReleaseFrames() const + { + return( 64 ); + } + + virtual PluginView * instantiateView( QWidget * _parent ); + +protected slots: + void lengthChanged(); + void samplesChanged( int, int ); + + void normalize(); + + +private: + FloatModel m_sampleLength; + graphModel m_graph; + + BoolModel m_interpolation; + BoolModel m_normalize; + + float m_normalizeFactor; + + oscillator * m_osc; + + friend class bitInvaderView; +} ; + + + +class bitInvaderView : public InstrumentView +{ + Q_OBJECT +public: + bitInvaderView( Instrument * _instrument, + QWidget * _parent ); + + virtual ~bitInvaderView() {}; + +protected slots: + //void sampleSizeChanged( float _new_sample_length ); + + void interpolationToggled( bool value ); + void normalizeToggled( bool value ); + + void sinWaveClicked(); + void triangleWaveClicked(); + void sqrWaveClicked(); + void sawWaveClicked(); + void noiseWaveClicked(); + void usrWaveClicked(); + + void smoothClicked( void ); + +private: + virtual void modelChanged(); + + knob * m_sampleLengthKnob; + pixmapButton * m_sinWaveBtn; + pixmapButton * m_triangleWaveBtn; + pixmapButton * m_sqrWaveBtn; + pixmapButton * m_sawWaveBtn; + pixmapButton * m_whiteNoiseWaveBtn; + pixmapButton * m_smoothBtn; + pixmapButton * m_usrWaveBtn; + + static QPixmap * s_artwork; + + graph * m_graph; + ledCheckBox * m_interpolationToggle; + ledCheckBox * m_normalizeToggle; + +} ; + + + +#endif From 5ffc36ea6838d457efd7675dba1d1419354fd381 Mon Sep 17 00:00:00 2001 From: Wong Cho Ching Date: Sat, 25 Jan 2014 11:45:55 +0800 Subject: [PATCH 028/110] Copied readme file and make it compile --- plugins/sfxr/readme.txt | 170 ++++++++++++++++++++++++++++++++++++++++ plugins/sfxr/sfxr.cpp | 13 ++- plugins/sfxr/sfxr.h | 13 +-- 3 files changed, 180 insertions(+), 16 deletions(-) create mode 100644 plugins/sfxr/readme.txt diff --git a/plugins/sfxr/readme.txt b/plugins/sfxr/readme.txt new file mode 100644 index 000000000..27882c77f --- /dev/null +++ b/plugins/sfxr/readme.txt @@ -0,0 +1,170 @@ +This is a port of sfxr to LMMS, ported by Wong Cho Ching. + +NOTE: Do NOT remove the MIT license below to prevent legal problem. +Original Readme File: + +(http://www.drpetter.se/project_sfxr.html) + +----------------------------- +sfxr - sound effect generator +----------------------------- + by DrPetter, 2007-12-14 + developed for LD48#10 +----------------------------- + + +Basic usage: + +Start the application, then hit +some of the buttons on the left +side to generate random sounds +matching the button descriptions. + +Press "Export .WAV" to save the +current sound as a WAV audio file. +Click the buttons below to change +WAV format in terms of bits per +sample and sample rate. + +If you find a sound that is sort +of interesting but not quite what +you want, you can drag some sliders +around until it sounds better. + +The Randomize button generates +something completely random. + +Mutate slightly alters the current +parameters to automatically create +a variation of the sound. + + + +Advanced usage: + +Figure out what each slider does and +use them to adjust particular aspects +of the current sound... + +Press the right mouse button on a slider +to reset it to a value of zero. + +Press Space or Enter to play the current sound. + +The Save/Load sound buttons allow saving +and loading of program parameters to work +on a sound over several sessions. + +Volume setting is saved with the sound and +exported to WAV. If you increase it too much +there's a risk of clipping. + +Some parameters influence the sound during +playback (particularly when using a non-zero +repeat speed), and dragging these sliders +can cause some interesting effects. +To record this you will need to use an external +recording application, for instance Audacity. +Set the recording source in that application +to "Wave", "Stereo Mix", "Mixed Output" or similar. + +Using an external sound editor to capture and edit +sound can also be used to string several sounds +together for more complex results. + +Parameter description: +- The top four buttons select base waveform +- First four parameters control the volume envelope + Attack is the beginning of the sound, + longer attack means a smoother start. + Sustain is how long the volume is held constant + before fading out. + Increase Sustain Punch to cause a popping + effect with increased (and falling) volume + during the sustain phase. + Decay is the fade-out time. +- Next six are for controlling the sound pitch or + frequency. + Start frequency is pretty obvious. Has a large + impact on the overall sound. + Min frequency represents a cutoff that stops all + sound if it's passed during a downward slide. + Slide sets the speed at which the frequency should + be swept (up or down). + Delta slide is the "slide of slide", or rate of change + in the slide speed. + Vibrato depth/speed makes for an oscillating + frequency effect at various strengths and rates. +- Then we have two parameters for causing an abrupt + change in pitch after a ceratin delay. + Amount is pitch change (up or down) + and Speed indicates time to wait before changing + the pitch. +- Following those are two parameters specific to the + squarewave waveform. + The duty cycle of a square describes its shape + in terms of how large the positive vs negative + sections are. It can be swept up or down by + changing the second parameter. +- Repeat speed, when not zero, causes the frequency + and duty parameters to be reset at regular intervals + while the envelope and filter continue unhindered. + This can make for some interesting pulsating effects. +- Phaser offset overlays a delayed copy of the audio + stream on top of itself, resulting in a kind of tight + reverb or sci-fi effect. + This parameter can also be swept like many others. +- Finally, the bottom five sliders control two filters + which are applied after all other effects. + The first one is a resonant lowpass filter which has + a sweepable cutoff frequency. + The other is a highpass filter which can be used to + remove undesired low frequency hum in "light" sounds. + + +---------------------- + + +License +------- + +Basically, I don't care what you do with it, anything goes. + +To please all the troublesome folks who request a formal license, +I attach the "MIT license" as follows: + +-- + +Copyright (c) 2007 Tomas Pettersson + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + + + +---------------------- + +http://www.drpetter.se + + drpetter@gmail.com + +---------------------- + diff --git a/plugins/sfxr/sfxr.cpp b/plugins/sfxr/sfxr.cpp index 080c424f3..246e9a907 100644 --- a/plugins/sfxr/sfxr.cpp +++ b/plugins/sfxr/sfxr.cpp @@ -1,7 +1,7 @@ /* - * bit_invader.cpp - instrument which uses a usereditable wavetable + * sfxr.cpp - port of sfxr to LMMS * - * Copyright (c) 2006-2008 Andreas Brandmaier + * Copyright (c) 2014 Wong Cho Ching * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -25,14 +25,13 @@ #include -#include "bit_invader.h" +#include "sfxr.h" #include "engine.h" #include "graph.h" #include "InstrumentTrack.h" #include "knob.h" #include "led_checkbox.h" #include "note_play_handle.h" -#include "Oscillator.h" #include "pixmap_button.h" #include "song_editor.h" #include "templates.h" @@ -47,10 +46,10 @@ extern "C" Plugin::Descriptor PLUGIN_EXPORT bitinvader_plugin_descriptor = { STRINGIFY( PLUGIN_NAME ), - "BitInvader", + "sfxr", QT_TRANSLATE_NOOP( "pluginBrowser", - "Customizable wavetable synthesizer" ), - "Andreas Brandmaier ", + "LMMS port of sfxr" ), + "Wong Cho Ching", 0x0100, Plugin::Instrument, new PluginPixmapLoader( "logo" ), diff --git a/plugins/sfxr/sfxr.h b/plugins/sfxr/sfxr.h index 7a3217b47..3b2320e80 100644 --- a/plugins/sfxr/sfxr.h +++ b/plugins/sfxr/sfxr.h @@ -1,8 +1,7 @@ /* - * bit_invader.h - declaration of class bitInvader and bSynth which - * are a wavetable synthesizer + * sfxr.h - declaration of classes of the LMMS sfxr plugin * - * Copyright (c) 2006-2008 Andreas Brandmaier + * Copyright (c) 2014 Wong Cho Ching * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -24,17 +23,15 @@ */ -#ifndef _BIT_INVADER_H -#define _BIT_INVADER_H +#ifndef _SFXR_H +#define _SFXR_H #include "Instrument.h" #include "InstrumentView.h" -#include "graph.h" #include "knob.h" #include "pixmap_button.h" #include "led_checkbox.h" -class oscillator; class bitInvaderView; class bSynth @@ -100,8 +97,6 @@ private: BoolModel m_normalize; float m_normalizeFactor; - - oscillator * m_osc; friend class bitInvaderView; } ; From cbc5fb56c93051732a74fae4f7bdaf3e68a1ded0 Mon Sep 17 00:00:00 2001 From: Jonathan Aquilina Date: Sat, 25 Jan 2014 13:44:45 +0100 Subject: [PATCH 029/110] Updating Authors file with new contributors --- AUTHORS | 48 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/AUTHORS b/AUTHORS index 9bdf47818..086d6c3a2 100644 --- a/AUTHORS +++ b/AUTHORS @@ -2,21 +2,25 @@ Tobias Doerffel Maintainer, main-development, artwork etc. +Jonathan Aquilina + + Project Manager + Paul Giblock - development + Development Danny McRae - development + Development Javier Serrano Polo - development + Development Andrew Kelley - development + Development Andreas Brandmaier @@ -24,12 +28,40 @@ Andreas Brandmaier Juan Fabián Simón - version 4.0 plugin artwork + Version 4.0 plugin artwork Sebastian Tilsch - recording of many samples + Recording of many samples -gabriel +Gabriel - additional artwork + Additional artwork + +Vesa Kivimäki + + UI Lead developer + +Gurjot Singh + + Developer + +Hannu Haahti + + Developer + +Uroš Maravić + + UI Developer + +Tobiasz Karoń (unfa) + + UI Developer + +Johannes Lorenz + + Developer + +Rubén Ibarra Pastor + + Developer From 4d306c3855244c38721805e28bd68a005026b24d Mon Sep 17 00:00:00 2001 From: Lukas W Date: Sat, 25 Jan 2014 11:32:03 +0100 Subject: [PATCH 030/110] Fix mismatched delete delete was called on memory allocated with malloc() which results in undefined behaviour. Fixed by using free() instead of delete. --- src/core/song.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/song.cpp b/src/core/song.cpp index a32f453d7..f49f1bb31 100644 --- a/src/core/song.cpp +++ b/src/core/song.cpp @@ -201,7 +201,7 @@ song::~song() } if( m_SncVSTplug != NULL ) { - delete m_SncVSTplug; + free( m_SncVSTplug ); m_SncVSTplug = NULL; } } From 3f26fdfbf1bc85b47067bb48a7d2e772817f76cf Mon Sep 17 00:00:00 2001 From: Lukas W Date: Sat, 25 Jan 2014 14:42:03 +0100 Subject: [PATCH 031/110] Update AUTHORS: Add Lukas W [skip ci] Adding myself to the author list somehow feels awkward. --- AUTHORS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/AUTHORS b/AUTHORS index 086d6c3a2..8650caad1 100644 --- a/AUTHORS +++ b/AUTHORS @@ -17,6 +17,10 @@ Danny McRae Javier Serrano Polo Development + +Lukas Wohlschläger + + Development Andrew Kelley From 5fb9afc15a15860991e82a3089a6e41c92e6f766 Mon Sep 17 00:00:00 2001 From: Wong Cho Ching Date: Sat, 25 Jan 2014 21:42:22 +0800 Subject: [PATCH 032/110] GUI Completed. --- data/themes/default/style.css | 8 + plugins/CMakeLists.txt | 1 + plugins/sfxr/CMakeLists.txt | 2 +- plugins/sfxr/artwork.png | Bin 44968 -> 27416 bytes plugins/sfxr/logo.png | Bin 1109 -> 433 bytes plugins/sfxr/sfxr.cpp | 943 +++++++++++++++++++++++----------- plugins/sfxr/sfxr.h | 214 ++++++-- 7 files changed, 811 insertions(+), 357 deletions(-) diff --git a/data/themes/default/style.css b/data/themes/default/style.css index 0d199ba12..5dde74977 100644 --- a/data/themes/default/style.css +++ b/data/themes/default/style.css @@ -472,6 +472,14 @@ sf2InstrumentView knob { qproperty-lineWidth: 2; } +sfxrInstrumentView knob { + color: #b06319; + qproperty-outerColor: rgb(194, 177, 145); + qproperty-innerRadius: 2; + qproperty-outerRadius: 10; + qproperty-lineWidth: 2; +} + opl2instrumentView knob { color: rgb(128,128,128); qproperty-outerColor: rgb(255,255,255); diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 0cbdc4359..6f315b792 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -15,6 +15,7 @@ ADD_SUBDIRECTORY(papu) ADD_SUBDIRECTORY(patman) ADD_SUBDIRECTORY(peak_controller_effect) ADD_SUBDIRECTORY(sf2_player) +ADD_SUBDIRECTORY(sfxr) ADD_SUBDIRECTORY(sid) ADD_SUBDIRECTORY(spectrum_analyzer) ADD_SUBDIRECTORY(stereo_enhancer) diff --git a/plugins/sfxr/CMakeLists.txt b/plugins/sfxr/CMakeLists.txt index 6d3f61a0c..2fe490d1e 100644 --- a/plugins/sfxr/CMakeLists.txt +++ b/plugins/sfxr/CMakeLists.txt @@ -1,3 +1,3 @@ INCLUDE(BuildPlugin) -BUILD_PLUGIN(sfxr sfxr.cpp sfxr.h MOCFILES EMBEDDED_RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.png) +BUILD_PLUGIN(sfxr sfxr.cpp sfxr.h MOCFILES sfxr.h EMBEDDED_RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.png) diff --git a/plugins/sfxr/artwork.png b/plugins/sfxr/artwork.png index 3938592ca936dde89545f1d2f63b67ccbc74669c..15f313d45f52d47f57f1de11380a09affc5216da 100644 GIT binary patch literal 27416 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

w+8L9Xn#y$vks44R_3 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 MPF=QA+9LRW06|YJcmMzZ literal 44968 zcmV)$K#sqOP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT2>}-v5CPB(J^%m!24YJ`L;(K) z{{a7>y{D4^0Iw)XL_t(|+U$L4kX^@hUiV$zKJ(rT1_KZTK+!TmYy_wzbU9*3iMA=y zq$sJ%<=DUND!HQAik(WO%8JTAvXoq^D7I`zwq(iC;wsCcol<0p5_hpAN0vm900@8- zNpKN}bq0f3-n{kR+xgBp-F@$SvyhB_v1;Cc!#D5U+qe7c?z5lM`p}{MI?!rNLkj1VI=CX_jfN@t$rBL)>Bvu2Nd#U!d_O2r~D=WkD1LftEkR zD9B8f8WZ5skeV?DAE%|bl%&HfGq^HPL7L(r=&6aL((>|BwOqxeVTc=oUawoPHwMX| zTrOic80P9~yIig$$q>Vj;u!a$SLI4&WqEmdWw}7$bu-MB6diEtLno{uXF& zMbN^T?c35cNoB;qD-4xUgFzp6Vuba29pChOJ;E*wCnqLKD8Bk*{*ALp?^De>}X-1)$0pa7x+Qp5Zxbwa%6Y{wsNo284j`M zLhMmopqVI954bD-W#qTvnc^4dj+X0rqVPFUE+RRa|2FuZMo4gHOy~e`z!N}Ifo%<% zf@YE-_IHGy;Twzs^OvAQ!vSu?HMkq^F%uXprYPeH!8LdaI**~0;<7wZpu}q6ZbVz4 zy%j-=XtyPaVj2*HwDEuuo{f6|1)9S+!CBB>^u1cGlxfdJ*Y4Vdy?%LquHWzD&TFo@ z=K8l?4-moKfC_qvy@(#5ZM13<1w=C8m|!Sj7zkl-ThHY4Msr9+h+l3_jh#p^UYc2^ zRz%3?&mp6aNmQYx+0~&5sHGsrx8TJ++zvj-#EOVbk|tpkf)5g2n6V_G1rlP)Q~VF4 zhR^^mab$=%K@>>wXGSE3xn2(O03u_NLS!lm*?i{-7a`mx6_@Nm_S3_ zUYA-ALhLQ5=8cI48o`#mcjL3JuB8r5a;Q@F&8p1}$=1y2Az*kU* zS39eC444si_RgIC9O82u7k~)JcF+EmxHt2#oqyBhoAq=p6?88(d7d&uX_b)tUm=z*PXE*Xv%ry3px#F#hJ`Bz8aaYupPZnpBM- zz_%$YF0#c{PJ8q?iBgu^%AQx&mX`59AqJWaTv|C(1U?Umyb$xE{XHNFG9=}x4_*wm z7_v)a2@&zo|3S}O;jNWV|EG!yMAx1cc}&3Uo4E{HLKNRc%r;6IaJ>S=|& z5fU3olXM9nBdVatKSG8rvH_Q>l?qzG)5~QtZvi9hepX=OD+>$gA4pU{jSN`Gqa{M> zS`d)YjoBi3J+hPy5h0l=vJAtTnwoy&pb_EJ0fDB;V$Gm+r88j4n6ozsni_jk5J_23 z-2(0PL8CpMI@^s%e&}(^wi{-SN?W9iSOD;0*6%eYo6v}f22`s+>IxbNqkgwX7ONoa zb~-)qAhtY30a&LAtgxt9dQ)N|7&ReVje?8`q+COl(IJbSnGT?EMR6!fnQ~@k5j)wl zXod+v?^LCv#DXBrCCFC-X)=JK14!^2Gd(>$4U7O8NEBv{Xja^Tc#mPTQcs40 zjP`E?;!1DvpXOgV4~ZrD;b&C z2vFwd>wqQ;6ax>u7&`W%ISz=ld*-Lpv+h=Cx=jS;NNdt4dnV6WUR;t*~qw+d+6~s?y zfvmb_vx)9)-#!aH2mQHt@gmkl!sa=dGxEO-1|Bpb2gW+Xm9yU!7rGTx6qyE9AmK9E zkU`6~KwA&ApjNM!Sb?Bz!lp_I>q%Th4>h5zKWvj1NIh>a(yzhn!~s#MRGEIHVi+m} zdTjVgSiWNqGnvN7vS7$pM!XWB8nz0v=~t9)W}`gXAOx~gQ&Uje!AzqN$`<6#B~oZe z-Jv)N=BGR(w~T`lZ&))MMep>M&jt9&Dw7jPL`z~eRtEoJjFbrUjl zma@eIk|)@86<^ltHC}K%wl?&Sn)Cm18S_|pw0!FZ#jn3lId+ZZ&k zshBhg-U<#nuaP4qK?G}L8aI4ZN5xUhWO$R3yf1_xB1A~P$s{xiJF2tT!Tzq-8;x3HcKfXCy+(baZYKJbE_kA$ z$UD;6*|Dcsykj^($p!;x`s|G(<%~@Sw0f95Ml^-xvWT!%R?5Li@!;11twf+Y z%7<6xui_ux{Or%Z9YPx(5B;5a4)6XjJay{1u}M09{J65-4|VkD&DMm>iyQPLR%}3E zfCJ`hkotgEsY22rI0r@xd{q`SYOOd3Yvo3>)dCa7HoNwky)}MaxpL*)`EyZRT3TLe zG#aw~#ZZkorXbRll^P49U1}3_Zu;E0*RVo}J~3n6KDz@f8^fqKCKeVJ21$Y?vN>pB zK%liITeS0&gqd%O8_@Y)Z_sQ~cq-YaV^F>--mtelBw2#uT^j-#IS^UEC7F;tCL~gm zeLdvJTZ-4U+8#7cP#LXK>%`$$bvD9pfi?zO)aiA}BTz0=v?sVjsjN6E0>3JiGRE1^ zjcTphz1l4*MmGAwtV627;IIucj;RoylWoL?mG!cXni-fm+qi8T4kD9C7F;$gh!sbX zIfCNs(0&k?NOU5npjsWQE-o!$O15p=M&Wy)Pt}llVkXQ&qO_rSMI0##b!MgA#-H1! zryKP;g;P&Wfkj@tc%fRYkO_=JTdfm^qLgY?G`rqXUN$|~&kdIi?0#W7~G^_Dy62Z?}MRCTd@iFs!&6JGbDz-J`b zKqpSv5iNw121t>m3o?-xLoybTx&xTlj!B*ia6n93$P%R33V_1w>?|quJP(*QaAd$& zD#Z|0!D=TbCPCYX1=nh5;nL+x*X_NIEpaOnMM%LoI8tvjM=-~BQoq@|&_R%9p{rh9bj>+OYa?=sJ z+y`WtA%f0YDrQ7tgZwQgP8>H@fH}JE9`GIq*`46c?0wMUs?eOWAf|ncxwE>8&n3SL zd$Pvb&BVkcx?QbQyS=W6o5bU?41?kTXuASdR+dZrg80bVQVK${ys|7x578v1Tg0X- z;8&R#-NeWKMnEGSt488+r@bo1X^|sAQ_(AY0zPfXf0@X_$|!p%u^vD-e2JqKJEDtx zDN=_#cE+VJ83rxb0&Oj5k!)O1EO0aSeV;Yo66X5)n~~$;Dl6HX+_&8$*}xb~}&>EBwOzwO2u6+8_)Q zjS1*IDf{+7W)>G0@gc5hHCy--;vGH#tR*tH4X3B3fhp#}n~*VKM8JBzlmG!0tG_|e z%H)nCr44+4a&l5xuLXKo7QXB(ec}yK;QrDn^DcDjvn89K&=yIUt>9x!7q zU|XP#fkuH4afx;zdMO$XxEneFCUtpkjyzYCyG0>sY6DU%l9PIquZ?aYt|ZP>P8`-c z4=17kpg=>01CH41Q`1vGe|~Nr3>h3yu|WWzQ$P|cDBM~=G1DCU1ep>l`~3Xem4$^) zXH|?&z^-1ScnpZ1#E#>5&+a{~W)q^~BJn$q7VTRLzcwKk}Zq1E>5tp<8q>ECaI^+ktZR( zHehlKw6&l`68XupT33v$6lfO5;3w@@UdHp#*6Pv{KDqU_Td|>+7MHLQpMU;&PpZL9 zq99a1#j7>d!ti5uNrd836;GHJhp_V2Sr8M6rXVq{4jrl9UF|?-;^c!=6gBecW?5@? z7Sqt}QXbmnxyx)6s{!9D^YaPo&^->R6BZ9rMA>EJwJvj15A8EFzHNG&X74(9D~MjX z6a!3&irWMk)Ws}Sxskx%GA^+Ni-|V%U72cL88Ro12iQi zj2+bE3IVv-(v*7KA9N@Hm2PY_Ca_3|jRqm!fc$I@nwayT_R(0B!pyP!nsK2E5*ygp zSZ<ywQYKay>SF=iQ^pBeMuD&v9*gE&$^j-r|~ST zE7&NB%@Eg};@koZTl~WkXxeJEz~exz!24LRTfr?r8CbLO9z(mq41pctvJwRlm98!> zf{9~Qb_bq{CqZcATtiYO zn1l48)?ldgdr0o9gvrL541-jHt{siRUSjt(m+}#dqS-)Cm0}4oRp}`+OR`id;23Mt z(i`=U{QgIc4~u73Ej=e1CM=9!=;z%0JXp;?{@?Fjx0hTMR~F_!{;`iM@(YG(q356Z z+-E-cn;%@?I+{m@OXUXjAO7RN2cUQ~CgPdQ&0Vf zLQs?RUBC3MU-^|^b(z@(ON~;W{F6`q?!WuJ+zh_~XeUmb`14PHinBce5KhozET!xA zUI)-V`jL;yh{ix0GdV0REj@kw>2Eyn^A zhOr-C{mHA3JodS$`^fMAC-MgHEgOM`7O>MUUb=YhwQ~*wz!PeT~M6a%9 z{k@A{M~@!;?C1Uxss;t_iN{KhOHdnFjz-;J{6H~#DY7aI2E)F}vmX($#u51h%-a@j! z{`%{2?=3%f%U^%#OXtp?=Wqi8ZDC;nq8leSg*K9&bGZaGa#2yVP9Ma3$lm6mYz`|) z%W4gvr%&LoC%^yX+A&MkH;GVTpl#A5IX|pT!0v1#c3&r2g&fqOi?&N|zC3*Rpy(*j z5YV;GY6m#tAzWd(yi9h-TIH_N}oK;}l z+y{U5sXvo1e)~hevvz0?KK$VG&;J;^6dDMLyo?FeDhWnF6DuqaCh&_6gPojgx~#0A zIAQfpLLEUo8&xsAh zu3mAYu=n}##~-sLz?df#LHo{kzjOZL`Ct3hU(?Q+{r>yj|AjAo0c}u`mtg|dkNvjN zZd=R!C};rWg%_T`;f8&8-Fa6LsF|7V@4ffEU;f*_feih=`|jI5v)wWjC6&t5LytTJ zB!S9@{>{I2vACQ#8|ZuPzULEv^xq>^+j#bZG0+}+?6EU1o%yW~{+5%-^VJWY@EgDJ zo1gou&;IbqCoO2~fx^;puG|_$8^=*XR#yl-ohYTsH~~@dz-G;2*bwi;j>~RQC0X9< zZgDAbX5To`+$stjKV)f`&3n&;%=7YC*Uw58Vvc}TQgjOFtZ;;oXxf0RSSIe=`E$=c zciPcmV`q`J9W9On`wu|aSh%_%s(oR@*yVrf^r;O^s9L@D+G{6IJ)+q5UWuIQsWc<@kXb+ufsWVu&P z7b%>44q$)z?t9kl^qDg+g3(KWd&U7{MbKV)`K9Mycpl5$@Bc%G4(;5r+8UKLSjik1Km{N6UbO$dV>g2^{3 zZ<`H-8e_vP%23R8%)aiBOIeWby$D(^O&A|oZ6NP0E-p!izZF}ZiA?O=KAyy{W04JZ z@7^t{l@lb43!SFl7%$%a{LlYON~Lq5L`8w)(Z?PYN@iE79sv!M8`7Qi2|Cbz=@;+( z^Y_dwV6DEKd!YI-(t}I7MZo z4jnq|h~F#n=9XLj1r!162y`)=GHrzvZ_b1Cv7|-Pq0~bUJ#_if=VyW-kX?5mYq#@o|DwnIZ>YaDq`c&KL3A8bMQYuOL z;BdXMaq<91>GK}W3iB=kee4BylP7j~zp0JMBsMb4ygV@WT3K19cpIR=aZpwebQ+-) zv&H9Cb^;VRK7K*^eBz03|M1BlL|mcMOADru$7K!DPC{5q-WhI+?dF^@n|T9PiM7sU znJs9dB^UUxC0-PEp>0f}Pb9@mtgI~IGpet`h3ax8Qro}@md?}SnvmROj2LRtnzp1*)UfJ$Ju%RBKYsTBJCWkUUm#T=EKk5wwh}Zb<5rq~MN$ zc6siy2TjcUEY_DMCnj6X7C3ypUXLgZ>Oy3*T2w|^FIfU5OmkR+6bj&tFkC-umt%A! z+lt<2>3ATG)hLxDt&Zj^C7#sTkjeEH9CXx}9C8{Xsn)AZY%=3HoulK$#p-C1lJZfQ zzp1Gy*?8VW;K@HpwHy@~g~6yf&&FR+DTE*_Mdgf2-Ik>+7RE+t@SG|kpxMjKXiPKh zlm2)bH81F4mXI{f124{;=DhiOeFCc0)x|}NkW+qy)I~9ugt0`}>~kkM z705^*+?vio3*)FPu}`Dcr-KI$Zl9e!d-g0O2jB_Na-pLDnikNkL*7zw4_ZdKOR>9B zJL8-icp;a~I29`wEDiL2nMcBAWGzMEN@v+8ZLJ0Ex#ynqph2d>hMb_F%LW!Y)HVr9 z!(~&`(^$+At@4mcdvI7U*Xj;bq$1u&N*72kgbn}h1nIHb}2Ntv-UunigZixr8xC1ths_yU2fIvWI*k zvc7WiMoJ!sOljrydd{3o#n2?zjOU?oB6?EDnW|9c0cE>3IN`TYA;;1Usod!dSfkvB zFA#efWi}||D=~P*lvkwYw8>=5=B{m3w?JwMiPKFC>cVPAK+A6%G3t|l&B+5o1zjl! z@u`It+d^q6D!UMp+&{22hRm4Z8A9mL@kSR7MO5Y4=T5))(u+{VT2s^YT0_bndC|^~ zOh)A7`Vr6$A3D5e&t6g6oS-odTEH~IDm!M}QNf~J=pvEF+1fa08?H1x1{#qD7HBOs z9|i5NKL5X#mzF$eK@@=Tw!0ndhf<{!uxo!}auT3nCDkC+_>>Q&jje!YeP8rEtlNU> zW;i8Mj|VVnXLRD=mP}rMb8G{DZGusahf5@9=`bxyM4;RO(LxID_cd$_ za-pUyNzXO4i+gphiaopc^f`&kFGtsT@dH@$DaoCdw3vc0!ww1#99O0gSu5rv58Ar^ zDNd0N3MC(MgC|zZM1zi|C@gg2X|1u&vM@i7KG|Kd}WU7sdu#7*l!V}H%4Qc(oW$o%>V@@zqZ z76IDteCWg0Y0BGF8vo{l4?OqdXN{K$M?nLn0|HPq$r$CTvv|<3OV6A+<3a0lbVE6g zw@q)Og585Yh-`&J%E0%a_5>V~WfGEg!MIbxmZmV{{L&F4o$Lm)MoD2s*y<>fsABED zY33*sn;?b8OW6gI*GKH`VxkGcpeVbGzbPdfNK%k+RZf1$>K_&G*STh9Y+zZ@Q0N60 zBbmyIB{!nbYs73VX^JGCr|w@SwWBjt1Z@o-vI-1@>@f=M!kIZV*Lo7HTx+b{N7Z}q zhK$g~{bRYL>GV4~%xett2^{Lwv!|Aqmuj`@;^N}ml{qjZh~Rle!XjvF2Y&RiN7aa% z(vBTVXZM~x<95a(XhIE(qtv+-OHwi9EDc+*&-dSfcJRQV{reB#-@*L{Arc=ta2TIJ z|K^ou3KCEb8rXZeTz>5FM~a_&&~Cf+)^fSzK_f%Uu%BrxvjkYJcH7X}msghn+92tJ z5CF|+^!!Uv(qh$&zGfajB)_l_> z#l=T%I&$>L&Er--tC{7MJfKDcC=iC}sci+W=wu2e01`mw%a9ex()kPL$T?fBjQQ=Y zt#CLL*-7Um7foS#NMK#yYecx(5VYirpyjDVdW4fx8E9uV@sg@s3vNaBqH$S;284;H zK&a4?PK$VE`wT6JovGRnSd*>&;Wh__L-L-dQ!ct}LRFrBdeDFsmd=lU^yJdg(z>9% z@80`ju0J!n`Rzqy#_sopPU%9W8~lHHdAU?7W5MCgdetQ|0ZkPJA%_+AYD`HdVXplY zK;sys@cTdbKKg9(5>Xa3NO!;R?mIkaG{8~}1m@=F78kE_1q8B4l82jY%Ke~FC|Ubd z(SXYelb{xi8(FgrDrdM7NFv;G9dS?U{38+8&|Iq zUEaHA&%PV>tz$W2xE_AwVX7-@WfSFNGj&1q;2_e>jG9ZGSdnoRDwp#t(a6rtQ3S2{ zXkAz!dXzfLd046F@y0sFRMCXWxeH(m2^SSA$O=|)*|TT&jr;cbDMxQko<8;3h4byz zc7HI4N-^$TrpUxa<7%N6L5qU0QLBRrfBT7VuM672g9mr*+GWk4Ye3t(ch7+X2XK>H*j;Tzk4j1Ir{VAPEn)!Q`#N{Skhzq z1}nuIINho2qr`z_F0X{yKbB3Z?CMvWB<^v@n=Z=k=y64rIsUA#Tri9i2??LuZ+q8m zx7}{tD1|^V{C?n@51b(9bJiaW#Yk`6t&Ws(DY#PZ%VE{Xik>`+90WQHbnMe-GY51L zv{8M+zGJ~B^%ieaU?G&EA4rW}XQA^!Buw4Gf_sBrp0!kf=ojy}6aR{lVfX+2S5{Zs z5KpBt3R#x<2uSU#Jr_XZM5GX${(Im1-tGVD_GYU&1{$9C{`)@gr~mU$yZ~JU?U(Pq zx2U6d8~W9&3*UI)>s_wC_|^aOcL(+#oSE5PoY}kYx*PxUh3sfNK>C|6|1~&9#2wDP zQw7kdT0Ga2`R+e{=dSnMU8~l{K!XB$`)#*>{hMC{XzlI_?rzj4G`q~GJj{Sq`vBy> zN=YFF;>)p3ZuD3UX)-A8#kFY}R4eAhap~WYn~uK0+@%vIkBjx`$l=`8dQ;)OU+#fe z^iySJdRNq0{&Ocx6-;K>!K5QciS*~8^(TlubsAANh@4a;1uPj)G zK_pzu??E=W8S4QkfL0Xwjg9-K_-8YEzJ{fj9Eo7WP9@KBfpz#}rM<)gb~?7!i?$#C z=;J4kUz)#6l)|Li^BkjDeR8X+02Nfa*Fd+|IdkU4Z$0?H zE3dwcm6jv}tpk^UI|5ot4u?>y47WV~_@npUd*52nuyw!jt$&c%V=`}q_E?Z4OQ@t; zM0}&$@1hxf^q(CZ3H7u>QzqqUAZ$N-a9Fx9Gk$&BBPn!H5SDTg+*T8}XV4MR4P0>&E?`^X7>dEl$})s}5yK?Ao@oy) z%i%EfRzlKkD9JF^VYU`DYi=4{p;itGW3l8&RoGlZ@N}AmRPxjYQCx~tsPe>O@jqEQ ztnyU zrg84a!ilQ7Ak|9w8R_2^Xd|G}DJ6M;l6z#3+0sV1df)z^k>aRaEhZHc-sOvPV}~RB zG;6)Jt;I3+;>+QmkSikxPES-^CQeCFj+_n!%GJPBHqx?aT2ZbDs4qFBY)NvOgSZqE zkL#|+acN>=5^qEz=Y}%x7mdoXxN_nwN1fDOP`rBqlQ5x zNjF$bY;vu#yIXPOaON`8r4dnbQ@!RGh&pT3uY6=W*Lg=3Ei>L5|mFB<0!xbKe4#!Koz8r zj&<6*T&j#>Z-%lF$;%x&i7{9Qv=N7&Hr9iqZDo6zTvxTzNaM29*p(Sc{HhRQB8q`E zk%^4LC!c14Yg8$(tU01%oYzRZ0%KdCtpP1^rzDxR6=1j_!XOKbE1x9i>}2a^E(%`j z3MqOt$a&3jk0e)> z?VeA69&#-!Z2hde+N;)To&?JAhirdIUGT2x@N8|xT~zmHebBtW*4H+&p<2qvR8j9a zD1E>=BBdy*G0#l6V0j>JFQRM8`*9_4PoffxQo)9ms=o{&}3!4808(Athc|q`^SU;xk99|k&7nRX&*q}F|I}OwZ#rOm@W22O; zt%ePXfmDYR7AOLp6k3TXS*M0a^(gIhAO?Q$=s~~F(FA!UJ%txbo+Haw;#3r_y*X$u zLdFXTbX*aWSUM+58cGw2vgSf?bX-MBHIKa-2g0FP*OUA&iKu01G&36%m9=)C+()_v z+IpbrqyPMXJI_^ONW5Q2`=~T7$}So-+6)I&m;kCd{X6&C#sBYWN>ei}Isu0(*pz6$ zh7!IKh^(h9L(&qjAvy(bXIICZ84io41$D>vT=*%UaH}K{6P&kFEn{1CI;#W9+X_o@ zg~iTHlCL>|EpX#iqmfYBr9P2e%!WK{0GhTr0GS*zN^(IEafGOt7YwJIqeqyzGVOCd z%3TN~EsJa@ClF{GPp7>@M}lK{jtdEJE+@i;?`dU&;ne+P-)`P zMh%92iUJOaT)ZjJ3{_bRx}A2ZQlT=7<eNC_LzFK;ZJ_Ch?#@rM z+{=|R)_Tl4l}}8Q{2ZlypqKHMREr81jwF#vif$`Xypm%7bsp>hT0&8BHdvewZLu}} zy&~aksK!?D_PP6HD`uOt>UBFMtb&NPCiK2SLdolZmYc1Nmb1Yqk5TEtutyaiD9vD4 zZ!|DZ{o$b7>tab&sRmFPpGa1Xk&G%T;6pYt&g&3Md8UaL1d=|lvP_NnXSP7w0JLbm zFc!U@kx`4~2<(LAJ!s|8U=Z#N`nkjwW3d~gq0bbO48uf@!USSjqm zDRfqh(FJ0YThvCd8rsMy;3iD-}fYa8sg(MhAM`0`pQN+2p=RiET>Q zlM=X4EgQ3H)^SK|2pXL*N~z_N?-!VXYEHKLLy8ik!n^?))Tp8qNp(?|5*50osAMHc zEvFS`a=NmdO2C00F0aEwTL>240&OGEqCBNRs{&h5g}TbcxGBZL29+_u!>YCFj_o_J z+?SV^Iijm0W6M&`TcMpL5}PmEXC*u_QE53EIdI>y?TL=uTjRAdtTZc9M$%kXbv2Fy z7Z2>Cr6s|fwI#N)iEWq}xOUmM1v{=yi?qa0Z2h6FY~xO3NI7T4SWD5H1WkmE!Jtn{ zO1Zpy_iph@My0sjZl_e8G_hx#WCp@ngZTcEuW&?0BQ z9m`G-8CtC=vOwn5G96+=X_{E^6O)r*F7-N9q`!FiqBtEgKC%z%xl*pB*+7Cv$V=)P z3}|b*Y^EU36lO|cbHj|7k0qDESZbDqnNo$sGq$bz{3c^fIdY6i%*uSKT*U@aj#OqX zNQJNv!}a$0_y?8wj5w|Umv%edfDhR!$7Ne4jU!&(ENIYkIGlBe$*Xd`^K!X@C%4_T$N7@wL5>x$rYhoxSuyKCoc5HV5^jO^MnDU%*|kIYPz0a%wzhnn z<3k*{Ol7GhQHZL>aiSgciOX}BL+I)BfKm`ZEHBmTwN`5?iUXhdAGibDQsS{TWWp86 z(sE=}p0KF$KyaJo#U#rViVaC-iMzz@Zhn#}WJ3nt80RX;6`~_;jZ2|Z#J%0cl(it~ zBQC;T(id`t=1qb&=nte&Bd6gKl{$anJcmF*q7Eq$IiOM~&B><3^!dDRiC`nMHwWB% z1!oJiHw9XF&9ytchgL)!*AKVnb^a%lj7$(Aq560H^&+#o}p{l%WL+)X5Wu8odxzfQ^oF<#e;XB6WCF(*I#Ww{S9hg`ygCqC4 zT`Db|W|uBqM%Nb?7r_wgwfgkbbgMZ9ia>GReL8}IGUAj@B^YWj^Z}mQdMdX-dlR5p zNjVRp_SNSCUqL~{G&}Y=Iiyk&q55Npi(?n##?EoHfIN)7c^FN5B5eHy6L{!*Oy#b zK<#3xV;N~eSJSeXPi%fk?C4}0SEHrpZT|@(Ew)sAvF9M zjDma=_8O1y8{A-H;Vf?$lh^n?=0KYYP{025Z`$JASXlVm+cXLg=M;!!CZow>InR6f zbMb`8Crz>ixi-mU*&9=WXFM9SeqWT2PmfJmAn{$U7D=!7HhsA`yL_9z5df5?Qp1fZ z;)3WAXyGt1DjOx>mAQu95Rr`M!bmF>~8s{MR13FTg1ULPJF5y0RBq)I?J zkTgoKudeW#-+ue8stVFKx9xN`&5{)NvtBN6x9io4DmQUVip{pgb85;uA$fc=8K2-S zSfXXt^Z7iX_)gV2F_zd#wd_5WaGx=;n>X8&PVa_jtu*ApMs3#tk8KdWs~WUzNBP_h zb3|@}FY4qRk48HzqkZSs-4<;OVK7svVSCPolqEu<@#N&=#~*+G1q1*hW(nx z>3Y3{1rdjhN24^&5FJroVY}^#!O!sBM$BaJxVC$29W`k9&2zMRmi3k$YQ)F5?H(aU z8#|1W8T>+gRk+i*S`F@t$`3{N&{H`sxPjdwh7p zrE$^A%d4}qb0dw%19*IV5QsiOVu7ID1jX;}e#c|L%Qov3w&wNK^-rIEzP`S~4cy<~ z&!}+Hu9r)r1i=b=Jp_EodcDFcNs_PUgn++0Z@vPheZ_qc?xgxW?8wRj_5djD8K<7= zt=+E-2rTVX1NKI-qqYt9ukFAXVQ@6sAsQ_)@&R8MViDA)2E|6nOdXMsu^bQc(aHF< zD9ZJE^V>iEft=v-;_~AB9BIVG`2}3vXgI?DlMHuX+TP2DFZav!ay%a6#@Ak7e6?O7 zlX#m>H=E63xxkO$Wh8DxA7))WO2bJ`t}H5wGnIvKVca<&#Z*H zX`L#gF9?K=85*gT&9nHfgqi@gpOpyz!~}md+Tj_Eb@#@{Si9Dj?@%{V_!iekcyV!o zH~;AgKH@EB6^7Ql+ZxK=Y8}2Y6k|TCBu+l`Z zDq6cAh6X$C>v~7L8k)w7y@WkzvBg`#xqB=YVoFKMTHl=Bs;z714=bm{Zet2ZqaC2p zl7GUYLBE6OekoFfswz`5?2YEL`C_?B;#6uj6r0TlLuAL(>FlRZKjONx=^G-j?P`ro z*(eJ?e*6KJ!hSVM`Qdmto=iF}^I}tyueELG(|JD3PbX)QfCZcN=JYhgaa9#%B>p-c z8!@x^HgpV7!JdpqutzW3ey?+(C(sxltS>q!K*pE1zQI;g* zo6Tm+)$#&CmcmB_SkF&S@FSeIbUZmvl+^Cm)QnHP%erd#S3WUGf%Y`d6*&l|aa{RX z2V+RI2{ET1*oONG8T-soN248_(KsV2H~={bNcvNdqpa8OFBc0AtCMw%jMZ73U@a#4 zvRck4c=`5%*dOMG-%PU+R*&y|`t%9zhD|kP+yRBaw>W_$NXu#Km)B>k73(-ZznGj% z)|=Jm`ZOE$a;`DV=Y&1xvgE(H%CTrsA6DtPlxMX3QaYQfXAdnUYhk z*N3T&Mmt2KC8CqWa??(ZknR0u6H9hW+*59g!;(l8dRgz^|JT1GXoQP|+jxC_#y0xl zEu|M8#jGH2)KSJ&6L?ceWy$DRE8*I%*W zrf<_9KYa=$jVT03fcL)g&&#$fL~JskyrX4KuHkH&9>gStQb}*T`kzf3Ag&cvSD40G zFN=hkuC|*E_1Si6AFi7n3(CqaU6u|8gTT+5VHt6lT3^tL6%`S{@@Ua8B5 zU-(&DcIo`2mTQ;$3NDVJ#Er?YKw-kJCe&z=Cr!*5Wu9d4hJ!&~kP5uCJZg{SwKei< zewH#en0_%|k`5?w(!2O6<=t@aZFw}>AsQ{dzPTj8Kumn4hG#jD!6coC&5YCIO`0aA zF^lC2?n0e`G|lj%Uw{13z+ec!aI63L{WlW@XAOYNjO1>|!muj561NI-cM}bbC)$zbW1VKHp^H7+&6H+oF}OGD}t|UQ?2V=T?H8gI zduDtz+F=?kc8vW>znhLsM|zRWiZuwxdD6Gp%k#_gk3W7w6lJ-`X1l>l5j8Fri@*Hx z3ygw|h0h4cWSe6VuWzpx7ni2siYsrZl11S;_}_=ehx7AuJS1$;`C^WD{kMPn@3077 zjKk^i>1nlI-CW;XU0&O+{dy2tgU9W+mEF)yr`g;B);Hcr-NoL%Snq__~qhAHASLGC5IKAYjVBOWDL&jq?9h@-(^eO4aC0WI2I z^%0}sXtYB#nr%&kwYgp2I8NtQf|8CW4XH*b#Y(=OI%x$y+nD|hCxq=N0#l-bPbn(f zXsfM%|KoRKXc~=1QYauGlMV3A8ZPGM_O{s4wGHwdkBy*+*_4HXULPBJOBxgQmT_6L zny1F}!Ux3qC0v6Lo;HSqw}_$KxT8#iNg#WPAy*-}ubi}oC+4o(8cunVjHt;`xwy7s zTuUtAX1!r%#>-Y_GNTVV8tveWmLN!CKwlYkW$XwnBUUGI5FoaK5v#h~tk(2S5>FH5 zc7;;}7d<&S!6zYALSpeYeS3O-MhInUhFk>m47lAzp676~R8x6+EDCB9VCfg<=Qs>V ztI+QuCc`RXg?G4~agqtC9Em0>4h<+*8&y1qCyjxIbjf9D72%3QyOA=OLe7))J5uf~ zaOQ-%AVugCQUw|xNh|h;Mz_yrQ`h*784iZldQ3$41dG|ZXitt8&Elic4$)}w`}a4- zhODs6DnyZyn8n(XR>TeWB!arJEm9IWEpGbcfV658e1BVV@$Bbm${H#yBcQnSfeSm5DkF z&7N?W8r70aGm4W~6F_BMc37vXCh;0}KJEgk71ATDVY6A|J2(=Ik=cN?mh&+)I~wf( zjh5KZ%Ab{ZeAlfFJ#cfsPxd`2Z6_ADKcf{$m>jG5e19K)xu?crl5niNm;G^fS8>Cw z@tS-v{NJTu(m8fBxxboLCPJ56Ha`lPQ0%T;1Z`tlVwzl^&p1U<|(k zJ^7k(=*QSvP64&SPM2ny)7A(bP5IYM5l5pPsL>MRu-?rfhE8`fu`I`HHt#6n zzsGs%HHvR+Z@J8ktd#Jd;6lf) zC3t6#ovw+$KoA2wBPHb!mq3?eGZ|@d;=8$8*Yi!1jh!^uk2JQlUz;{C17o$vOr=T< z&!Z5FueiU74XAvgiL}U;r+%^%e^F9W^70Ba-qqpH05`MJ%1=%BTZR&Bg1zIAfbTCE zu5)#c$8q=EoJ|WOtK)HGfhmL3u#DmuXry-)i3}8HIg*|po3pdl5mt=@v%X;$hZ!Q5 z3K^HTj%(T8uK@T~m^blFZ_RZejDQ>-mDPFJv=`-tIDKt`!;Vnk#`_lcWuk3H`O+u~EzRPs}=E9NAoheHJ$E-|#| zHQ$sac9rWWP1<{|WUkxG!Z`FgN@^sTcB4VZA2j3ZsOf>q_mV7{m`)4eY&!$Gv!k$L zgo*NiOiQgz1#5eTdfmVlo!VsD>hThs$7EKAF>bgd(Ln90mhr&?nl&xKud|cacNGih z!{t#egaFS3$&Su;)T4BpwaEAiDz)!D&|SOE(th!~*n8gWCGC9OJ&!;o?3lqHBD_LE zgE*|$&&Pb@P%%&&3=i|`cjxAUQ3j(?HUT`9;KHRh?)M^Jy(P_a(dx(AqH;>QySe%5 zW$vihKit258!?l%qo+?I_`pkb80V=2j1HvBkervgWE9uk9n*C+<^gXO0QQj)_zua|$| zvbq8viBCJ)+W3U{1~Ux}jbbBZ+iQ!t5?qGtf0-ayj%Ajvk-Wb&XwK(0r_uFG7zolq zG}2zf(=TmsM_5-QWRc&-Wp0WRQnt!#)I*}fy~K7HFUM~VLpV{K`mDpgsmGvEvA2u# zf6*z)!#mGPzKEi1Ma7d_0_Qj@&NL1_m>t?vTM(zipdz#y=6*cOE{my33L><>C)?hB z|Lfz*DM|`uDf4lM*JS`$4RG0HMh}BDOj%5!VhgT@q6>8ZZ~{Kf;X~sE7k6^}%{g6B zo6KdHH+?Rc;fmdK=%>QfN;i$#(QeMuiRifO_h8>nw@~HIypR@MM!=a~e9>@ZGr^)1}g}C)|j~brO-p)4oiPk6ANXKgk zsh`AJ2b-8E;nO8W7gQ_>NHtS7hD7m5msNmV>RAr* zFw#QRwsO1A-)_0SeC==Pi!6ry@cQ13CrW!Y;MSIjTGB8FK8n_j1N*8SyQ?GPN5(me zCDHYWPJ<|@2EA57g2Kp&8KtAXO~moT;Xf0$h|Kf9P0P>2>HLfcykSO9rYb1ptcudeDeOATKk)yT9x^KU@45X^0tPnlfWj`Z z2*u=u6)6}yQqmFWl~lseQ?LTB4-eP`v%D#Zyk?aq{kx5=uYNGetIhyR6nGlJMgEV9 z%R{%Z4mlg*Jl}4Sq~OdH@&#g7$0#REj)%&n^emQ-KlRc=qSvnhcHWG;u*S0#OBt{m zd}(M(E3i_WoNBwO(vQS8FgthjKM7UXW@YH9JH|At<#-lOAl=o^ys`K z!gC{;GrAzpoV?j?g~#tt&hBD0w%Rk3>MY-1UJCF7F3s6{FQfthkK|F@*2Dp})uA)} z{%@-o0a~u>pC!JAh9kG^mqD9NyY8WIu`iAJxCG)97wIGl0ztGyd}&0+)VSluA<4-Y z{A1Vq$Jf`-&&BEYNJyt+W=J>Hjl(LLz71qppV++Uad07`s-t-gZL*)O8$&pB-)jH7 z@DvSk8#bAB*y{wWp<8SEpp%$7${RqR_QYJ_g@`)3odxSpUtP1XOv}x3xsWDx0bGIF z%HkCdpVYS_ug{pqnMUBCnsd3Az<}&4R)o+>Zo#NBKFZ#EKDqluAGTdjHh(|X)p3`h z<>|nM7DTde^3=!cZPq;rcqpGCi&WEV#`aOBCDja7vS5w}Rh62lsVQ({OT5q}e!1Hd zq@&F>V2v9%JphvEKCZ|-x8&p#RUgiEP-HtOeJPJiHf^9nP{*y-szmZjpjV3emP4de ztB`>^hui4T`3PcRgm8`G9-HC!i&d-vXj(3Jvi4y z@sWBbY=E1Zj^ShVmb1te+$ku~SH58hztb$W%r`G6aJt*t1|QnHyMwa&GjYa!`fbr* z_75^6Mf)9_F~`Jh347ESYqvircNot7CAr*z5L;>T! zPfIqRquqtYj>0`8JT<-pH+j@>?^&p-`~LJ4$pM+(!{ym%9XU;BmsCjOUBgk*+*_#2LrM)oE|_CX`5;(0%p`TFLqU%Rr;-rOhmJ!_6{Qx zx*_e=%Fmi{H>$P*p-0`_yTaU={VdhDQ)5*+X|B^%{SWI#Car@VJ!Xi|DYo9#)choN zN}TG2CUGRyJe8B4fY;#Xou>hL^ie+rl@!qRKmdn)slMrqOkQC^kz}tPy6B(1m3##7 z*HtbAviIj>g();WeQ+?v$qPX+5x~|p6~=uS(5t7y6La_Q0B`}X__D~ex;tLQ&cN0A z&J#=5`boQf9L^G2tv||yjAIUUvy7LZ1cAR6O=okt48`bn$k;BajfeNn>-b=w?kbdq z0=}JpBBjDYpIk zq@^{mL9l6jx;b%eGwg%O$;kuFJ>BD!29q&m98IMo;0_8xQB-x zAEjEu*b2hrLmaru3&?x5!Hl~xQOwLe53h?Zu+1fQ5FF?kOOvGR&nJ6vaNO`Esi_7u z(wdV{PVONWO!BL&hgK&iIrE&u1a*{;AwM5!d+QQp@VMKVXK1LZsz`M@&83Z-K6B?x z9o@#n#LP(tLj(OxF?^`7JN*y1h_AAOkD>z&v-9G^#rn#pr*_CMFGWzG{SmB)2qi`_ z2pO3J{`Gef_lAu*OH8wzb7jUmzm5;-Ws{1qvV3;5XY@^o=%4XK-+hHH%q#i7ui!J0K2LELWIX`0ksTOCo^>5#nWgry&d{CG&|2Pw7aN5eD2u(_UxB-jM68ST-GDX zo;6LF&kqK3IVfcx7aHCm zneExXf0|>RU67g9N4zDAcWO@a*q=v}qN>^Ga}(rMiBQz(L~6fLG43}ee%&qc?39!> zKB)LS!^ixzFHRUv<@$W@dw=s~ko>LpR*%tTfYF&XR?2K&s0l)tki*Hz$#nOG;$=Vt zZEIIRTZB21fKNm~Y2>+i=zR??0%i!(zMxm z*$&M>%Ko^YFDHbGxnR>iZ8+aGF09aT-27ccyhwI#HmUl6SW|x$ZHyppjYrm=k>WqO zrwV^luWD{4X9%*ife);Is{J!iGq_miTmN8u%7U#;dlp8~tL)v%jP1|P*UQ8fFJp?U z*cd`q|Kr}4$=PNHErTcm4m7E`?VQ6(11izAIi(+1LT#oTuV~TP`* ze3mG)=xN!TIR$2*Rz>N7+e@SX$zlh{yB)>4JbW%p#c+zLl?tV_WJ}N768WG(o(>@A zW+<}EUh=)7q7numkijB)vegz7CWpT|D~FA)C2qUa!Hlkti+-2->pTd#hbeGl_CQ=Cyo^{1kJ{MXJxCIA8-7w^G6#4igfB(ruLxO_u)0VaKJcKITn<4k>(iscQEAT-s zyM=tdolKgae%t^GXK{a0YTowY@CJZu2jxPEOULcJ?3s^bJzqXQyu1WIMb&}MB`07) z*GxEa@(ggjN1(f|*q?^S$K~veI=cxzc6YX_uL1Gnhk03dE=>Wf;pkHX1ukL2iimz` z@|JXo#rV`QgPPoJ8Q)V-vqX*2g1(lPmR`B=R`0xGu1sEAYU4F?yIPs^czKU*Q;pMA`4iBGAv!PC z8IiO3WSNbA0RhdKA0#f9PgACOu|jEC6?F-j>c&b*M0RCFekxmJYcv=tF|)e}W+xWk z*z2^whn^#{n&-XDazQ9>`~VgvsPJ2t<11^t8~&47z$&LF6M>UWQY9&Vq$A6cAeP2v zAL}&Cri*EuWRNlTi;g=Z+O|C2Lp53e9@PtSlmn*t}Ujwzh^ixXF;f}Kt zYtkoTa$QvshtS%(QMXPMHY3?xGKdT3gC7TFrWHU)jQXSkR1VhpM_@O;Vbo8(r0+%a zHcekSgPEc0M&BHzw?X?T^5!cwD$_uukOlrHu3hVy zN!l;%3U}FOT!e^&iw=Z{WUjXu8cpFR9#P(*%&B`d4R~m|GW4|QQLcU=Ojfn&u`j7n z#~B?#3dZ7;Pm%}8_q=V=1Dme-8Z!ua2Kwq1<-2F~RJK&Hny)9KJ+0z*saT!3im=!X zLuP~?-$y&BYzm8n+<*Kb0^}F;tmKlbd549BubJUnVSUKOb|54Ic$P`Z*>)+cWjoqp zYlQ+3hd#ff_HIWf1x%od9F(XdD=U?%5q@Z2jNFXw?dd@*@A=H?qeO}%h>k8GQz)Du z5Q3FPPJzuF?~C%9GNdB!B1ZQcl|D2QV`MSN3V$BLc_T*<+HL*p|Xb-E#pY^9qd+RaT$?SfXJIE;zcD5=xhO1*O z&B$tD>L(t+#bJoO#%sk`BtRS50>8uvo(R`W+G?1kqBz{?Pe-E3v(WP ze+4S7$39Fj#;NxLS_~1O94S*e7v8_j%aed$#jV$^3j(b8q$%wv5Kh@9{HRjD(FG+U zIz`oSBtY7S8$>?h`$5>;o}Stn3BgvO#AWabm7iZdU*A{V<5x1tELNcV@GBy>HpDR? zZyy3Nvp#5^gf@})F&*9x`o16FN2#Rsrg?Xqw4TPPY`cW{W<)tje)6Sk;@WL77nG;X zB-Wt5i#e|ggOdlh9VY!9`hBK9VbMf6G7Dq%34Rb9h zc;X{3Bmcm?0-&@uIHrhOIlLvYqIRm+uC4uiT;PV?eSM?j1O5DZh|Gl4CFG+X8ddPQ zMaLik%6kX?pUd?_cRELt`;rbPq>{J;<1cKmU z4Yy)`WDE`xZC{t?8E*I+I|Plp~DjmPUp2S$=e@5 zd{^!jidjA>?nuVb*n838&;1iZo*zy#lc)(9hTg4o_LM_EeoaGk7~PzHn;HuGXHf@n zmXFw057kVlHzU6#E6h{I*iiMzgNtp4=E-o5XiZ4=A@sBQg*+r^n4C#V^AR$c8|-85 zxDdMCg&661Q*ZXaBRo^q7k`Z4e)i$Q*~R<&^T}!r+^bo;=5ola2aSYG^R9(M&yXH! zpC}8ieJiRZi+NwEDGA6##j-T6Z=c(lT}-V$uMnwdTFfK0<1iF>xT`}y)ewNv ztFwN9k1N0P&koU96%|^EMizY>(E!39v3ehrd%(XnO@d&StMBGFLVFaSH zB(?=iL8_#|uZW}T*8v;S(zV5Q7)EA&KV@)n58essZskw^MIBQ(z%RoC+EZYwJ!RY z$Ar@7K_?3{hSJ%6&EzuTMzNz4hr9=c`Nx4KiB;wSU)!_K z{_BPP?mrinas4Ibhj$)Dp|$`O)hS=dcMDjNu%-COlT!X<#?$;-O&#`C^aQiPK%Z2B zMW#z;-X%(?y;HovnXBy%?oUEqG_cpIp&V&ty)F1of9&C7XOct=;3hYA3vjPhrA!oE zZAN@oq(jN(4nM(8s~4UvKBR`tC2Jj(nB&lN=&KGZH>f=Ym9iIhN{JC71URGw{5ON) zxvUA!>66)sIu`?MtCB{$83AQl+ImqjV)mTB8KWf9Y6Fqa=x^m#^z9K!k6pX8f#%|X zGC`7Pm9*U-K9aImcQ8;YBmB=xG=LLzhHn;2Ax|s zLUQUpiTpnL>Ca^3^x;QcB3G&f4|V|ESLu}(_;>D9->iAtp86d-+q6nk5h(c{gC;IU zsS3JL&CY9Q zA>NajA>#YAStGmnNAnEA>hSu#h73tRb!Z8s6Uec@icdmHe6SPQSCS$u?fsj5IDfZa z9)I?hG*5gyZ?#;{F^X=rwIF*l+VmH>>I+706V>$FpO-;}>A=&OZ*PHP75 zo#H zp}!I=nVRGoVSh`qnpu{*tb^R=sE``@?78Rvb%wV9rZpS zmdf{us9j8H^+efI(Sk~S3_UDhYpFwdI>^STadNAouP6DNXNp)*AtjC{rySSmXV2Da z?_idqJ3QU%2}xm_ABOZ^+a(H&d_$}y+@ODLA@R8^az|_YpW|W_GuQ1l4#tr`W`Zk+ zmX6_QC5o$k(=Z^TkPa=YE!zo(-LUw*DnC?5y-7d@l0J74^B$Ki$vkC9nMN}u1%Mo> zb9^x8l3eURG1Mm!w6Jl(TIhc9^pVG_ch5LUw2XFkcA5yc1?*NLkUb{;Jn9p=)f;*)%CgRO z&;MD$oelDSNye1u2sHN~GcaA1U*VPDqlbq=?|%=!+c1!z_?4>iE#h#>9p`kCo@8G& zka^G|ES2;0z%t=z6V2MMps%@perxSJF2AazJ`dI9-zlF}BiI-nbhE5i#(H+{=CdW} zh~UzM?4VM2Zqj0~BruceQ%KTHQbK^Ai*BR-2>bo2J=c(HfK0lhanQx|Sld=8{=A!; zb1G{^6Ep@(?6!$3mBJytJ{yB8kiD6%v08PLP<-s1A?Lu*$cL|IrJ*Uw+}-bSYNrWk=tT&RwnuV5EZAp zcO5g1Jk|>%jxk$;NO#S_8pod<2I2i%`gP8AGh}!1xQ%CoSnKPYOse;l>K>*eB$i{_ z7wqyRZ(ue~c1cu2qmto@t`8EMDo~g8ixeD|HA3Y&f7!VV>=2sOoG7^Oautgmh#L8$ zvg@LF^kOkUO44$VQHF0Xvv?>|8B=dV&{IzZ%h`ck=rkQk!#t)QR)S42&-6EaJrl{A zMj^AS8B(Q6=Lo*buQ3ZiF>Ah9bVbWV8oP=@{>O{PhJz{@QDXWhHJKW;;coS4T^nd5 z*y|n#btJrdu6y(sZ?<1UXGp)KDzM9E_ec{HpN$yy==YIgi*El*3m5&9xoIt4AsrV^ z`&~sE?wgFHv)tmCSmEZV^nqo?tlevA*$En-Q=6J@8OE~oa7v?|M_;x~etl8#xAC;^ zuW83_Z$a=_7+HiicqCI-XcJK3C)ba`4SR|)O>Vf#JICHr?NqFwXZ_k}SUBS~XEs&6 znvbd1z`kX}4gOBnk`&~wPCb4i1t-xj-8IEts1&-u)tC<2aa&G8o9uz-W$8~sbgT3Y zNrgIkudEb-H{_`KP}EW)J{B_pLsIZTJ>=Jk7xWfPrAWS>j5>_#D=xr7W$;Bwhz*~AKRIQ57I>L3LRiM10$}K` zsEPQ!nQ-FwF3VG6sEJ`$D>;1QJ>yFzLhK4{Yl3dSFgU&ScvSq{&O$-j#d&s zZkolGu%W3@#qcK^p!SA;cVUu{nhV5UQe+h|O>(kwEOHPFjW)RjD-TjY7?G|tjdClF z+C^BQY|pV4o^SXjoEDE_4y!xCI*PVrH~H>#?i7oclK-D<709_ORSz2M9x@^YTYh4T ztox11GO*RtmNctagHkQw*<0Ry^lN=BjYDjTp|VN^FDO5Q-{wiCYIE%N^ZB;z^Yv>; z4Blb?ZNu$+GRG&ifh5QBk_2nyVs3pU(f#hPmNm!N>&_-KyV;Dd^<%F6*uh!W?y#u5 zd^B;6+9K(J5&5-)O#;d)N9_Gw(fX~+CMp2Fm5)mLZN8+?+_UgLLR(YV;6gcbHfiRl z-$AOK;t#gBB?n1K+gBx!eU}au934qr-o?+2n21oPahPXs!Cs-U`~49uXSsR2-|~qS zj}mVE*RryuDU#fKs$VG}Z4a<00@a(0B;1-xf4h|H82`l&nndS`5DaAGK(JNW9tzl} z0M1@76`G)_W^MfD5@WQiO`t0XYhR|&MTx2D-)XUIPzBVkV2IfmG)ESsR=vhbVdx_e zFih40>BDE>AN(10TSn3v+o?8xO zj<^iR+#->7J=P2jg15tc?9%N#yWfQG5J(@(15Z7t0Gt!S76qDv`0Fu{+d-?>0~K)@ zdWM*(a*Zcu6!36!^Kx~?o1=LBk$zPbnG!H}TFKCP*s>i^SpiYbIl+;m&_Fr(UX{N8 zL8n%8-;0U>+Xcs4Q9*}B2U?5kKeV7cW#Z^IH2F&7bU@pbX0iTJJv;tvZQcaak11zs z5ozTud6^q+$T4?fh!o<|Hl*vBWBZLmREnp^^Y4*A7x;P6{A&m(i3WbUX|#x5E>s*e zIyxLL^80Pv$kA#0=)JQfX~&a0Pis9X<>|RB?;bzQeWY-Eb8C;Rv%9NXP{^%95L>vm zM7sa~i57&X=pNpG)v?U3(X@uo;qpo?LGEf7Aw2FM7y@Yd`c=idtUEut>n*dYUsB!W zSMO9I%dG$qz(bz@3gDI}4<60&TAW>a6>{!h56`2c$M=g!OOH>VJz(_jZf;J_&Nie$ z*B^*UNIn%PC1^8ZyVY(;_}ieyV-tuoQm5$ z&!XhVvRKb!;L7XNp=1){=)w#sta8d3KG3bB*~`+(^UoixGyknDhe1;nF^a^Kjdux3 zWiFv@9Lt@?`#Kp?wC5x=rDr##=5-{)sF)Qu`j~nlr|wfIVt*o1RR_ZZ($boq&o$;m)acy|#v zg`)vR_AMPo0qDI4ZHH}@%DBBmy>-W~2dzjVBINSC- zBa~Z*x0{YFy0u@>-|tqf(oi@GNdAEdE9vIbbPs9hO<&q9S4iz=b9+Vl2VTS&>V#QB0q?s4LVq|sWjciXH71$lUCM)9B?=$gpI()MQXpraL$Vchv-XxSQCSDuCcSTSe9*ONi_(Q2fEGRZ@Di8vD=;Za|!PF#x*{bWcwKU%j5M z{QEnsv0WfluLvLhwB+lhQ{zAyj!%^y$ak=cLBeJ(p@9-MPDQoxHMYA7cV)<2wQZeAuu4Y%X^w)@tEmRmCAUBPVCT@{JPA@vMGx88Hu& z3Z^%Oz4^7r0ss9-Vry30&%sGe3$hf7Sa<0-Rh57H;A@(9h;oqwp$bQo`)<#m@ZyT~ zhtZ8Ip=>%rW>v9_lYh6ZK2ce1VqtxkoHtS9(v(gbD)XR5h=CD3OmXQs{?983EdDO} zF1Mjk9uOcL_!4E>@cw)M2K}16d3k<(-m<}jhb*p6$_3*6DDXFt;h`&kS9e>l!ynH_ zf{T5pKQ}z~tr=oc1%v-OG1^yl}!L3up=?0c+D-9NAxXydx2 zlGL*Sp3#zWWjfi{(e|RaN~J+f+qL?B-(n=v`G*%jZbU4@Vw;#aH!rWb zW3x0q?@HEy`)z1?Y_<3n{#T8`1w*SjQu;_W{ti0LmpQTAhn7Dobrx#)Dg1BZpG~0H#xAa9H|Sv+*BG}j&ZWES zWE&P{r1?X6CFvY5`%Z?FMkf(84#aO1dighO=neb6VLa|rqe%OXh@iRNBqQZm#5#1# zQOL$4=-39L0tPZc;0rKsy$8=3AF|kF&JSqDZ^Nb~N$qWQib+38KgtVu38o!$jW_7- z2ZIVVnw3AnY#u8-H?}aO6A9vr_Q2`-slBHKd`%+Ay}13;+hsqf-<_Y!<@&%j%IkeP z@Q=~|q7)i7H?}qmjW$u8~oiH2>jkL}^6KtVHf54Gs<%RH!v_ zG2`J`{vS|b)D{Z|gwRQ}TsokSPBK$!;(Rq*Lq=O68WHR9$H|7^ERq(Lc(rljSxj~@ z)g?2fNLR7wm~c1FJ4Kmgxe1a=MR)bHvPNdT?60S&f`57Oe>jE9MUj#2W$#?hBK(rz zzGWW5ltHU;&eYw|IwBvC4u4z54v7qnTK_}Kb|6Pu&#rSMXWxhK_TMg>o!MG0x6a+# zn+<=)4^vyvsiyWbB#r@aj|$IFj@q6imE34K?rqBRuP z!*1$<4)f8J0T);my=f_TiOJQB2HbUt-YEcM!|0^jWI*q%pF%<+6rm^9>WMMNxgT3P zP99&K>sQjj!&B2W8cGlD996rIm*<|S$tGC9J^}q{_03TAIB^WD2<4w>*&a5H zTq-O~g2oX`H&nkdpQPVGgs)IXOJWA7MJ6 zqS+YAIWDM7TgX_di!|VG+&3-rqnaod~r*Wg-FB7#it+@fUe~v`n@o1L%`ypLf2F&wkA$1O9 zKTT4WuuHb`^A-dm$pY`}Liro&vRe#M=h7S|vpj?O0jP>#6v9`F^O# z;AhovLXDTTmem}jS`9lfRp?Zacp3egC5&BypP1)3>Z4xMly|NFk_y8pbKVpqrDC0-(qEE=C(Fe2gzMC>~&5|-qmp`R#WlgJa&+G z%Wb5sPr`4|gAxt6F0yabvd**Py_()S`2HPUu#0E77?nSbg<5u`(Lh1~(+Uj4 z>#tA8x10S!$jHqH!O%3Lz8#{O5c6FV+X+;N;MwV5*1iLUIkU^i21#Dl5U|`t1*N$t zjrXgK41Nss&twny6VfAZgl_sJHI6Kz=0i`$wjQAlJPVbEbXr8>aR;pWl9E2PL8=&b zmI{9&b?s3=e|}+#Z6_By%&M_6jhI;5mQ89ET`Uip3u+Tx90hdBt_$OzlgpJF zG=-F$xkAs|m@w(KQJ{qZJ+QTwDKs#crdROSVj{t!(sK(!;t%Ql_C(yzG{Cm_U7+Ys z|1?lZvr?mWJqyg6KvU-`mN4Q}X*$=gC^_A>#LV(~Qk6;vj|dZZ33dN~BKCofeCc_r zUi~P=WG$om%V&_F)}e1)a_aQ^K&y?(s4ef7Z%(dOJ=HF0?Be1Zf}$uS{VuT>j?Pjw z&J-1LvEEZw*OD{A)>Cx4s&} zn|c&l82bs85~Z-#_#H=~zg_l+f<`0?vr+!PAr84xAAPW&pvSf~GQr-0RNHZFReFli z#-!>Z#v0y@6%Kg%*7f`9uB^c6>G%7q$e-hBR@0=UNyy3p!=h%U0@_aCzI9qk|M&H; z#nbIJ$M~5P_EH#}QWzZ$$~F@Lf+w@vYMiuQ0o_@}`^k|^2erk$d)hm;Fyi+Vi3+rF+`|s{ZLq=5K4qPWePPu4B+UZB|+ka9#J8X zN699%1+H3>I^ivQIFU6w4aCGGFwztA<{hhXk`(>hlqVm|oS3jKXc z@)-W!$HavY-QI}7gf27yxl4Q|zPPN8YEV$UBzvWlrmW?b@qs4CB#TfiO(vdzc?=F1 zmOP5tYm|G*|NpZJ>GgY2;!)yAQc^bB$(recf^#{M?!W&9XI24Tp}6OGLUXekco|@0 zPKl1KP*?nBL`G!jwDg3_OL2DQb-86ifgiz+Ze`D9&zp@6_F%^B1U0i~y<2cfT#Dc3 zo33>O-g+Qa-akyC5K_f*g&JEU$7h0hqL7)GeYwxeZ}RJEA;+&=sD zn`$2InHK1ZUOzmnjq-!dJ`WU2E2e0C#ad9RcZ}b5W5v8R0fpK+o@R9FEI|Ek|aW^r{=pgX~bQ_2p%p#VY|E5SypSja?^>Orz-Sm7X0{ zX!Tf>z}LP&Wqao>?i&cixKb%8Kp}pt(0G){LQ(aXqrvwst50|wKBmJerp=53J@Tw+ zz0kurIPNKh*YhCI?X4WmDL(#E>agv;o=rp{=c1z&J*?@4Iy37hbUiGW&RO2ue+lMk z`}es~af>BXNl6ZCudW-!q^#1O*n|SDFh&(5OP|%9uYZ;q&c1I@JorIP!V$iy=T z%*sW00c20O_+rk$r$gFy_FhhmAkQ;UoZws8p7W=5HBLNPkZ7lfdT5-^iYXFrGNyH? z(xp4Q9*yTu^o+aj?#PjUpwU?BwGyoKHR-Tf(D-t-u|R8Ml=|8w%G(z=uD*YNK)~0| zn|h#4I-oS{g?kyH5}*L|>czqv=F6lr*x>y!do}^jUYTp6!IF`^bJe zv-dGg9p}ij|E&@|42`fiqUtRO)Hb0>jX0r~F^fp#jcny3=jGim*dTZ_vXcBxhq~WD zSt#@!CM@+}f+hFPoqw>a$DFs|Y9BZL!n1(fW?@av24#vrK_^THv(sF=%zlDS#zM=g zFsEo1bwd8Z$FLobemqk`plnU~=W@vMI>ND&ji=1gIkW5T`nuPOA=ubEyJ_Frc2(&x z?S1Ri$6&KwnN0fv*SW)IJb3d0`JoAk8zAyP8g`Hp)aO_Vf+gsq$gHfmc;HW=CF66Q zk%&WQ-;7$+BfB+rI0JPe=FYgbtsDxZ&Q%N#OJ(D=Ry9Fh3(d}L{Eo`9lP~+Ag2|_d z!*?Z2^?`73QrUl*Ogs%P1cM8N7ZyfK~-ft=Sw)9-H z&)Nb7`S{2$Pm7){s|R`;I1@0#G?q!yhn0`7rkwceM&Zm8%w!VoeDE^1n4MH;cPw#4 z?O=C>!G+JjL8z;;q8^1ZL+yFZ*NWN(tf_UXqsA7-aWkI>Hx^^w z`#mrS{}g-aIixdOu{W!D$9f4sxFzY8#yQLpDa}f5FT&N@+s;Yf#Q$*RmBuF`etPz8 zs@HtTt)Omd>ejG~(}4M*qh_v-@B1yt(aF(y-1|D>@$#B+IjiZO)CCz&Y%!BF?Alwf z<`eC(kgjLA^8G&txIlu){y)e<^Iv2k6^tx+$!^JQY1Bp-Aw&D8J>KS^9~or*ACLv9 z(DCg`DQnLRwGMAc|6=h)`KC!lhy!gnJ0)Mix^eIyi_UopPEii^OK$L4ed%|nX&SD5 zt3t;t61!kvlkW)*(`7p0kAU_#xoNpt7NXhCw(xcR6c6r26iCX|1%D}e6qiP*F*fGW z$1iVHfiVSk2%>Vgw;H2lb|5X{#CW z7=_jZ2#t2ak(Y!SJ>%Q7L);n6cE%HwtaRb|HLC?l*q#*^`L#dmlmMx@Dk5a|2j0Qv zd9GqY%H$AD@2W!6rD?g7Y2wJ;BEZbGWG-lCW$Y)u%A5`?LWdh-8>!Xeeu0!x^eDm=T)tF>i1Jh(*(}DY=AIt<=7pt zm|EQuip`=!Q}M~SMCFXIz9zSPi2|zkcz?*VAA8A!QCQyE8MO{iC52bYyQW73x*}g< z)ta}vGdq#9t?Z?1_s%sO6Q-q0w|1UWuSS#CyYELT3W{*&pKqrDT|XnLX>gKJ%oCZN+3hB zy;ZIs1mK7F|Nfzrnd>K|J=k59_rI`(kf8q!TfqK{EvTv4)Om^ko%*hR1bM{1xiJa? zkR}M)x!5P@>B>BT-W-vYF%pGC>~AHwHq1j(C0&qbbFBvXyFwN zFgEOM?7mUB;Qj*=n7M<8jwnn+-Mg|3xm4lesO734N+o&B|`F>0Z^Q=-5ko zZS-cdbcneVVpS_T0yHIt6f>GhBz$SSVeAym48u9)xLVmsH0frPb3xxt!H*xhN_Fpj z50Gr0butQgDUjWmQw~j4%(;GoK->QtF6ZyI7)cJX#!x|GtqBjCsTQ|47olG$UpD`I ztAOvHv~}>%M2K=08~_R)Ixg2?SrzdWsW%IMXV_U&F%NcBoaTNq(H0U64hpT#O^~!v zXc*JQ%CF?B!wHsiT(Tqh$>o^SU7s~;9lO})u<;#;b zIu@@q_IMbDd-$w}Hbnr5K*_%$?DQRKz((z_gB=Yo2p_#4Oe6lT)mAqb#vS5SDG zKwPR23|dgZQ!c$YID4#&3FA&JS?M_R*t-bRPEA8-4Sl_=_;Cr3>hMp_6P;aMQDK!a zzcBtpT_KC~zPN~PjNG|qCfqv2yf$GVqr}3jIBLz3@(x0Sqb!?+4c+-=XOOHaALd(M z9Zr_L&<~=RGvPvpl_?}Cmo33hmb0JHSHW>oZHX}dF8Hu73HqMz`{7Y_hYpI%Q&H0? zE532#ne|tVVs2FQ$^)W(9lQJV{2P8Vy(#Ys+ShkiU$|2dA>m%Ken@sWrp{v z>(~qK6C4}WGkYE};4>zk5*1&xXr4D>Xs-LP&CB!r(dZ!57YRXifr*E~ZW6@ic71239Y{})D%#Ku$Sa8|hSjPJ%_3BY7x>Wf<|3DF zM%R{u`V`!f!{D~3Y>8gB-q{RKq)L)OJpFnYPSM3J-k{HDc;v)eVBZdN+LFjx?f}Gs z0QE_^-SKWa!G1mM#t)Cx*0hvdY ztRrh)9zJRcOjTgEq^26MMAa7G*)nGjito39+Ai&JjN<7Zt7}RWpy=qu2!8D!A5loM zsC9CpM0)dWp|WgekGZ9-7!xwnWZwey^x%c0gPjNm-342fTh}*yLP-gckZwV`JEXh2yBh(KRJyyQrMpw4Q&PISSu9dg;yD-Y zeO-G$&wbqQ%O_Z@<6P&QbIkD@e>R%Id&pYBR?r&c+}7IMTeuOAUS~BE^CN&yGO7;F zhDG0`6luLN2)bqzS2-*=*nufB6)*ozY4xBzPiBQTyVz7bOp{d`yCZh5tSroskwWj& zwsX z`n1?VE?Z=;`nz$pXvUIUbKlL4LWx`!6YG&e^`hYMBH`xy2bDmZ&4Yi9iSvr(GN<)b zm~GO_-O_}>xghf-7tXR#pFW>ccmnsG>gPFwZjwY)A2}{O7uK*C`&ax_o+uu$POkXy zA|Xq6!fNH8J@m+kzRKh`fsBO$EaH&DL~{sM4MDZDGUE3WJubt`9dDS(FuZcle({+0`iBXIwc z3yJ@d3-*9qaQI6u?9E0#$%U8ykqfpw-C~~i4|fkMJ9Ck9KUvYmBv{{}%9qYfRTH~8 z_5>DtELRuN(d>T%e*JOcGKLMU5V=4EkqcEg@$$te!N*SaBsinC4PLdq_|@lhSsiIy z>1yOc^F>?rz2vyx$-741p;qC#k*?UBAm)u!R#xg=kW>k98E^c`Yv|tXpRJv-DQlom zqeb4@=i*)))vn;WOX*j(h0!d2H4}!=sL7zQ2yVou5Z8j!*#MVp+UtmW_hTIxy=lXJ zxfiQC6EOC}Jw=g?pGIyEcWB@B_tRRsv3PZyXJLh*?li&|JWYx3fXMYiyoh;)d%_Fp zaw>$kO!(pS?2Hb-`J?Ea=$*ox16|Wbrqg9dMki~DDWj9O9Hnvv+*B^iJA~D0hjbNYEZx5HWsZMn`&j|V%KjH=}v-XA)P6t1_ zCmAq^dP|Ct-jWWu%BH~4ckU!@JwgxB=;p=63JWe}hMa1$Cj~Q$s z%{k&P8(B4)X=5whJ0U)^V=NX^SW@Xs`X2z9p*IG&<4H`=PZ~v6ldk_zokcgLFqrFnO9^7Edbzo;UOLPWZ zm-q8a!Mz@)Plq zqozL12#YQ#kv=I}XH)fUF4Iq}&IWZP+E!D6KJG-m3h8jpC3=yb9UEP}@QHsO-T4dE zoHV*9JdoUGfuU?EJ&V1JTDUERY{d1QQA!@}@WQ?uol&77YqKcVhmGRM>SRpG@G6r1)wWRFE`&hSW6TMThiC1=;#LW=T4KFIiVb)>cSsQWY2*?z~B;;L+gI#Un= z5jGlJ3%a_PX(DU#LPu)aa?o-x1zEaXqh7fN#yn!Na$J7tG@hU+1KO)fb<=8TdU>(DulJ+!g^0NY^wKW5%+RKRTwEegtHE=oHlA}SqXPRxSqtey_|g$Nl1Moh-_gx zDICQr+NM`bs6Z87EVnmHpxxm|mmL*PlF(aBZ8UndIg5|g)t7A6xRN^XH^Z5G4HJD< z__+}^ZsP5;$R^HON;$k#_Z&*OH6}E@7@y<1>DAj7QQ<}S;K}mv0}LEM7bTU$h}Z7PuH4a`s)Lb>R#B9MGhjH}GgHi;p0xiNt0Dn!PpVl(PRNG*N@@pwZ%D(Ex^fJ$=h%0LDkbIQ)&v+y$$dkQ0Sdo3-4WmI|Sv>O}@j?Tf)AQmWX~1hGgAZDUglo&07ZtS)8d zr1#K)?(5n=de$U!xuqbBCNS{~{2R2E?TF!S{9AFe5i?|CNyB!+&Yr2KCx?rGWKM(v zNxclVW$+Gz181?z>f1^M2OX{wdC4kq$lr9q#nUrKAY?V`l|V^Zky{;7J@qT&467dWe8QiW>yHnDj}NV0txO&6vg`2Ix~g8xew zHvdZ(e5L;{x==rhD>&g{9|55YIvxKI1TFNk!l3+6*k{Ss z5xBh`@KFweeAw_Pg#H1UUsF_Vz2*J7Vi%m<=q&@gXiw=7)(@#)l{@WOis0t(U?W8a zd}$-#4OOT7*-k5WBn}5-q&NTrNA%v>b#H>1|788S()*{vDh=fb^!$!s4YLw$Wi3Gf zI92-PIbqN5sB9-u#w}jCsmnif!Ra4#0p2Azvu671VfvtSQ355>{rB<@Uo&AR+pG?9 z)dD|LLEF6zhLMnBIJ8W%p80&}2s-)L!C~MJk7$p$a7OLYxE!fNYZKmt z!#%t^^W=A&P>PH{VUF&>)S>C{%aQ?8;!c_%lqkS zM&6Q$hJV`yJ=#~RUvuR8P4REt=R_ zrgK)8_a(mM+xf;3MQssNkdMRc#?``DTBEg1Dl^%c%~)UlbH~y)!%PXU`5Jn*{8;Y! zXa+;DfRX#tT?KR4(Ev2IuwXPWUPOYZb2T993vY$4&#RQ+F!uE!GF25EED0*P%QO+) zYiI`*t}rG6S*{vK?0QS9#;dC%rN4(Y(thm!7Y8)}=mZ6A~LX?e~&Ly6Byb=CrDinSwA=6jwaz?VoQX_uVr) z@CCJ;TjeD$3(G4Dslk`CbnG($_X7PRCXL`Be%&<5v2S8>So7Z1X#c_s91y&q{uf@T z|6lL|HUux=S;1XE@InIn-*~~Y|6h2);cvWPTNe+^cY4?a$3pNz@W1f_8080v>ccx3 zBdBh^2v~AtM!H!8 zc;U>lp{Bwin z?Dcp35!gi3obLWx^04r}5!It?W6WJNm>)AiogZ4ibzF4ICGYXZ1T{Sef4vTPYxy|& z!OH7YX4hQDrgUlnL04erPXnIUJ;!wgOaAvxo@v1{m}C)cy3si@^12!-QF+c7m#F%4 zN0S@-XkcccJo*0@Ua$u6LizuU7aAtXtshzbi5CpwyNvJwyb$m9gcn?&el0$a>kZ`q zUZ}(C9wAnBa}vC^l`q-#jLeA7cyT&uUH|R3hXkc(!N#*5%9mRF41G9XUlYO@$XAID z8rtLCA?eh`$Y-BW7w{oTBz~H#Wcl@C@l{1h29MDmM+0$HgqK)X7Js>ceb((McP?Ds zdVYyI-6s*A)F~IfK@QMIRV7}0a9u>7YCTGxtV2&__wmiiNfr;w6hl(F+RQ#(a`>{F zOwv}#!zCEnXBP}cVKDzm3|tz=hs!|l!j7tnBwMgDZiR)yKk&lFAG|Q~Kj8&-cts@; zOLuOVuKN@OFK|Htc;Oq>UwB~#8`vZN!3%OS|Hca~ixhw1g=Gj{0A1Yz%fc1)?4(4S zpH3>{3A;qe3f2fpKkeHL<=68eGT_J;MX?$YcS_SnwC=HNV`=sxR;P%JN zH(!DRVZ)9is5@DK%B+UTIZ(Np>1~@m28MIxO@2&kA7-dr*>QLVm0vvNm>buWon!l= zBO`?X?ekYP-2H^}Icp8N_eS|2MrL%Wq^Oi8B3xYIlWd>=`T?V_!=HP4SNDRrHtLis z`F9Dzp!)bJ z;`<{P?E2?JjO_{AL=e4TFbvTPwzFGM^Y$G7(F?9X{y3l)i1Z-A2*n9>$wPo%Fx!06 z3(mg)yHxV1-HNTLhgU{0_2$oqdhFyjn|t*lF?Ad#7SvkB7}->h64!# zx930;*wJ#ZPosg76q5m6vYCDiM!Vpld4@JA;n^N!G}yoRLXKp&Dc_foinVCstjrw; zhq+3tbo)jdO?0O@OD@?-+jqrg`t9*%ef!pd1wXaU6|JntOZ&TH1!T*X-ShkVZ(lbe zqA4^wp@>}Q3llFOjUH45fSY1A)^?swmv^YXM}5{e_hh=1(milsf%c}9CEZnH?`SmD z4;^Ba6%~w(h2nV8@F&;TBMTyin5rLshLuI@ zbIK=<<2-vI-X#?>@D7LmTgY18;Fxs4dURwAurC|4ENht+=(9F@0q3qrADT`iDP&kU zZyUtV z(3eyfk#x7t(D;%;^a{i$L7|!?wvg|5&MB2HZ4v-9m9Id}pL(@jPbOzME(ank zosD3Bac-PV)0G$WzLotP`|y)`8$P$wlCME!>*B(-owkbn^nBZEp7 zDaJ+<&DHbIW5x_m(g%7;o#R>_;N_8@g8>A4R@rwMH%P&qyi5Gk$7H*SdhJS*#WO^itI&!Ys52$)mEO zOqQLPBLHkK5xVuPalXGH0LA$9o0o@=bLe~IHGkPPlS#*rvWCwYCbX6lFRm7Zf^$=~ z{l7FgG*aAs!?^4w2{Fx-k;c-tRAGv>F<`P6r|PLQn#aUnDwzJz5e4iOoW;+(J8+Ju zoiP+Y87UkM7fsHW%@U|H&S8=t4PS44%HJ;m@A&&AJIM4rFmc|QqhC5+UH@2KCWPpP zI453An6WC@w}|);Ena$S`cB00KY9(h=JFSV`=cr3Po~1Rbvqxg(5{pScBP-w>cHy+ zw~-3VZ=vj`xpd5#)pXGd{lN<&NM9^IV*k+e$`6*(fNgoMul>3=kUFDqK9f?vA8Udm zs;F4>+geAUcgf5+R9y4ACzlGBZe9=*aDNTlPWsXc%LNrT_KG=@l}blaOLDUe>9Lnp zNn++O-S+!F!U~b=QY`g>KrlmlXj$!wwj5I8o6H+xbd@*GZOiuaa!f=s)Na|n59bCa zEWkWOp0xGq_7&gW_`BOegX*=F)s^<8Wp1*_;tqa---DHANymY66a~s(&E*@`hs!%l zL#3R>C^IhTx}DQP0$T{>Q^&L5f*^8XTP&$y%EIP*BPCV|ZEl@yUOCbRms{#b)}QGLNj_T zz%R&%eXf`4({>-BFle<*rB7>;T%q)?5qwtQCo|*tvN;j1DdZLDKIvF!E|9Qr7-AYG zWA}|q{*qgQh&{T7JIU;85vG`)Ods52r3U^4bf~Gu+rQj`4`jU=8LnVJWI`va(FNSX zg6a%>G@-M{cO)1Cc5|l|9yTl`B-)-zpZklkIWcrW#NQIoS%DYl)f>rdY&1Q}*Xy7~ zorzE&?xsur(>=UCoc?oM#1}y)$kDfpvyUoDjx$iA&oI@|#pn42LM668si*aFit>^f zXu=s~TT;wJ+``gI^GvkZ8_uD88Y+ra%(CuyxGtGJ$BoRTEmSGA8!BOWpPH|=5!FKz z9l5`nNMtV1aS}Tz20Ya1_7GtX^$7n2U9SY- z7G^<$50HR`z(AX|6MN21IY9a8>*|*Hm0ED?6*E9T{=Pfo`y#8V3xwdT7qvfv+YMiO zy-u4P@@iYQt2Eb`9QsnRP@wAwwbpzQov1f7U)DpFN~%_$;V{cJm78Qi8eL*b<>zCj zM@}VJ#5iYZ53mJG6uG%1`he+LJ;?ih%F^7!mGq#p{(yn{HdtVw1nkZgc;fxLD_tEZ zu`dhqkumDGF`TAXv5+DeA?(6fI5|1JRKhAk@HgbiSXo&iD@hxvsFE7SIqwBI2j*?w z-+z4IJ4CCs6~sez>g^AP=bN+T=QI{{kEc7CJ>}F;J@{QLHN7iI5uK`5Z~dKU z=2IC%F1es<;jqME3NQ;AoP1W2?5fWLvnsi%!)?N?qajAkRa9D)xy_%=q;30hqFh zE-c1UGLZHp7Ubie$zy}g%pS;Oe+T60%f6Y??f@_fGwxBBqsY+#XN!}D zPBcvtO!$6VkpmD<@n`$|{{8!W+ktv{`$Yyu2eIqgNNgv)-A_bz{okG$Yd4%X^Nf;7 zs||{-i&Nq~Be8ADCRGqpNl=+=@pN{(1F?!};Q#Cop`-(H^EwdHljIg*K8_gTk`WBcx ziKbw-<=8dSMIB~Q=o#x#DvbBQc_VZDE@|+g$#Y3jQk$ma+qQ?Z?(XAF+=Vu=zs$5b z)3c+U_0w^0j~)vc2wAvu^EGhnjE$iPZ2=-p`k%M&IPy!S-`!1)%~b>XD%O+q&HF?m zNm>ozpR&d@W&x$?=84gu+VXO+yS2z9G{!^DXl2@kIC|7E&v#GIxqGBa8P#c8NYFntxLd zO+wq-BmOLwgw&4B*=sGNhz|2&{Q&yRg(z-rU#Dkn7c zeUbiol+$qI?@Cu!e^rrG)M@h;F-X2b%)`3(Tf4U6NSo%<%N6{d-z9KyA z3qxe<(Awl3cyY^#ewM|v`?RPzezG%emU)w8g*B@Uy6}GGb zXqpG9v+^)_?Pf~N$GqqMeS>x7B}B(uPJpyDG|PI zH*@PyMz)UI;`qMdnrqiJ=`jN;?rE|%3Z1TM?NwT$o{w`x?>iW{Lv|B-PP2}yhp(j$ zhy_ssOkY{D6DxQYFlOsPMtIW^(6nK}c7AhSp8G6bczzsod15QPoUl&i5{n;(SkgtA z$-DpN@x1-fZ^T|;dF`R1qC&j;<&o9RH&wC{-6HM!&k_7@@`IOIRg(S|3+aGZPzyQ- z!~()kzIG+W@tp=9Q9HdoOs&nLdBPrXze!APUXsjrS*MtXx7EL!Drv`)OKG766T3o$ zaWDLMF;+{>Z@*5oO{+sG)uHg4{evvH3=bk$8+6eT0A#_%UH%%G9Fx*Xw%3U(cQFmW z>|*yO9MgMQAxq#Mcq1_75XX$beh96Xw9^q);;LG+Orj2EZFEQwDE*diQxsiASg%4X zci145&(gA>-&7cfl38^$c}t5Uy)5NUDAVb#^}^W)4#zI z5$W}KaBzFS2`e$mP^f7tsn7)#8z;q6cDC_w5+X%#4qJ;mI^T~J#S_<$?o)_y6(IJk zQ%Gs#CJMATRf5R?fz(XA^6n7da&d)cHaTj*4>j z#e0g=j+FkL*|VDjTy);vuC3bTC)EyDtIsCSL!Kv7{OCV0Vac>CB$xSsq}8y^^m#SW z>_)G@Gf1NWbz1%xPk(NA1)Z);yzwG784`|r6yc+qMyaGN>DY#ha0Pj9P~;vg7WwEFD?Sqmy_EQK)OP;RFyY9q71{H zMPn?&Z8he0LtaYoU;@@}TZ98wLDmuZ!nrp?G5HglVc|8xwnvt1LMO>)R-y|+*htr- zraYvFit0-^N@QPya&uM7q)KIui1y{(Yaah13)X@4+ZHF}2csbu%y3jl0TCrJ=}_&$ zJm2T-9dWtH%MO7Fl60cmisBm)`9aTvmp2~PiQY`E<9*?u(^)TGKyqB*&>xCEW_vef z4z&v(h0&Mlccf@en+T8v+ESwO#AWSZfGlurVCM26T%yhBIC&l)AM0S(=BztX)cf6m z!R$!66#E-r*Pa9G9J!jEgv|Gk4V606R=k6{q**{s5i`2Z7vIAfb>Bu+rZ)6WnCLeuqW*0l}z0~WSG7kIR&ZccxL1?5gQ ztj`UHn@N9xg?P&etVsBEAY-A<$S9nBO)>8szb=26aH~R@kCdU`^L+yJM_2w#Q%0do zXRYT=A7939Myat>(5rO?nj!5kM)t=8yXkRD-Ayx<7As9nvk)cb2b5O|Nmy<{(zWJa2@@6+G5SwDJcVv;QuSh7 zTl{se4-W8#Y&cr{(z^L8IZMN)$xsKvZOGtIO0`s|p&8i-s=EFX3yBc1V3zoKNgh+H z3+^gpr=*O>NfeT>z)QGA%`izw4oO&09~2m!Ttg{WCvKrjRMrMcL4N$Oh0{R70+n{^ z&}!rRNC7O8GrsO4vZ$7y?es_D6W;_O(rm}bX%D?+;u$R`Gn#!L8hcAWWAp6|Q;ryQ zp!bg#&TYkJKc1ThKQcJR%0^ zxZ^ZMLdZgij8)Egy|}Q*H0aIsG{bViJnGo<^UhO5)=;XQ(#zl9SBduwg3?p;gv0in zG2^DFxq5K+vY4^;fIG5KyvRgc)N;u=RV3nU`NIt!u9r!h`u5DBEwLv_rW7V81(Uc( zp@C!3A515&u2uu?yWL*VJ(_JcEHETb4$OHRF|U9TASnxjdwIMoIZi{ENpQ|Sfp zDfkWDu|+Y(s1<}Pj6+fu+%D)YN{7>VlWfkf5R%(9qGRTbb^QX!5EHu8#6Fy)+ z@HCu_7*RV!t;IeaGX;)Fa3(y-@}5^@8*-)tW z0k671^JHkFgN|<5BKRV1#g-?&GfA#;@p$IGtafn{NLtXk0g@Kpf_cdg(wd}9Zzlk> z@FpKt$VBEr4Vf|{sH%#$Kjyu&I`E#(5ob-F92&8QC1%T%b+o>_K`!(o1ELlxIBZ^v z@dHr{sns}{ta7Y&AIfLbYyq_J6|spnl)K`!7@?V~8EB-i7kMUB8k&ES`Wu>+hJqR> z*3a-mjY*3=GDs1d_zl|}!d%1v@*(+>#u_nU@z;+=?VPWp86{KGlcko@A{c=(cJ*wU z9C|?M1s;AhsP1fibfgeJ{R)^x-#~;S!FbNS(!ag!(yY7I1?0E~9rDeC!4~O8tyN9F$GjIh^2El(|2P1BA8`mRspMEnjC}OzWOVp z#RbW5-Af_ApLOVVGoc4z(*B9}p+1}6;8Ds7nF~4ivt%m=|n+0RY^AmN82?z-EI7xJC zAxp$=A);ba0l#$2$er*Fi6xLqwVY$7&&YRPlg*Lq0kkRP7<_zALMr>&>BMJO&>tEW zncp8@cu>L$DHMDVThl~1!NTf^6nY9yVQefG;IbM26S}7p^5TL^7f5<|eFDw!heD~UYpg9!qCnY8?S|M!c_kRE^ C7=(xb diff --git a/plugins/sfxr/logo.png b/plugins/sfxr/logo.png index 2e84cba5a1377f9a65f4b1db243846c05b713dab..a39e4e86572cd008bf410ed2c308453db3132261 100644 GIT binary patch delta 287 zcmV+)0pR}C2(bf@BxS%*OjJd$t*?xamH718s-lQUL^xGXK*hC_#)5g1&8X49oyoYDysV833kkokkhrOfx2TJ#n}D;Ug_w$Q!m*Lex|uaECHl#hhIVD& zt$uA)KH;!}W?4;>4h^XtZ-B^DsW~L5N#ijqE?5`ftscOqGytfGvcGu# z1F1)XdCdl}j&)H0D;iRS5hL=Y2?{fNWxUO_X5`$sO7JUcgF>hwupxlE>GWD3E2b&a lnHpA>R6kD|>-}XN1O~+D(&1t;wyyvH002ovPDHLkV1mqXhRpx~ delta 817 zcmV-11J3-h1JwwSBnkm@Qb$4nuFf3kk@_AI*a-m_6)c+(4)g#30Rm7=R7H`ISdpMf zk)TPDpcQ}r|Ns8*;H&@u0915RPE!B@0s{mE1_uZU3=Iws5E2s>7Z@5F9337XAR!|p zB_<~+Dl9H9FfubXH#|K)LqDVw zprtV%du9Lt00Cl4M?_VV1h_K*00L}DL_t(Y$Gv}+Yh#))6ow@r0wboKn-ee48&c~f ztGBk((QYzb?Yg#``~QDs1dt>suzl(I;N^tJW0I5iO`-5=A;j@dc>#!0F$hTnLVg~I zva0FO4_#Ab5#;3sQGpesXT!$}ezBFGfHSnjA1auj-1TS2^I@(1aAQIN;02)At7l?@l>jHL@UIAsX~wA3hD7 zlM`nUCrB)r3gH|!-1ts{odaE^4B&H*u9APh5BBJ8oeundUf+%AK9HTRIe13rNF&U> z+|RIM#5+xT3DwSUI`H!r+ciXcNdU5TXm-O+p6hWOjl$q0$4@}w>mFbIo!0mq< z8tJ?i?TNHGgl`^hLFV-21Ej;5(~}RZ#@7D=M@b;1mtGODAgch`M>J9zRsnJWq5}z? z%m(H?veQHXF6WEY`Y}TUULM!0#hmDI(5)ZNx_Er!aze*_dj9U-jB$@B{?<**<3Q+A zfQQ+@IW_}N+4>Sh2`SwXTLfd*3Y>kfq*tA(x7icFo;)JwCDs>xQw61Ry>qn>cv@T& z!vG2AO&Sif`q!Z)C7nGGkIuyPmMbQfo*S9o?p=V$Q@!2C!!Z*>+^4p>r-r}4E$fI0 vt3?)b-|zFrPlLY#?A%b|s|5}Il2P~zO&!0VB_!@h00000NkvXXu0mjfP~B|g diff --git a/plugins/sfxr/sfxr.cpp b/plugins/sfxr/sfxr.cpp index 246e9a907..2e942a6ab 100644 --- a/plugins/sfxr/sfxr.cpp +++ b/plugins/sfxr/sfxr.cpp @@ -1,5 +1,6 @@ /* * sfxr.cpp - port of sfxr to LMMS + * The original readme file of sfxr can be found in readme.txt in this directory. * * Copyright (c) 2014 Wong Cho Ching * @@ -19,9 +20,19 @@ * 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 + +#define rnd(n) (rand()%(n+1)) + +#define PI 3.14159265f + +float frnd(float range) +{ + return (float)rnd(10000)/10000*range; +} + #include @@ -43,7 +54,7 @@ extern "C" { -Plugin::Descriptor PLUGIN_EXPORT bitinvader_plugin_descriptor = +Plugin::Descriptor PLUGIN_EXPORT sfxr_plugin_descriptor = { STRINGIFY( PLUGIN_NAME ), "sfxr", @@ -60,7 +71,7 @@ Plugin::Descriptor PLUGIN_EXPORT bitinvader_plugin_descriptor = } -bSynth::bSynth( float * _shape, int _length, notePlayHandle * _nph, bool _interpolation, +SfxrSynth::SfxrSynth( float * _shape, int _length, notePlayHandle * _nph, bool _interpolation, float _factor, const sample_rate_t _sample_rate ) : sample_index( 0 ), sample_realindex( 0 ), @@ -77,18 +88,18 @@ bSynth::bSynth( float * _shape, int _length, notePlayHandle * _nph, bool _interp } -bSynth::~bSynth() +SfxrSynth::~SfxrSynth() { delete[] sample_shape; } -sample_t bSynth::nextStringSample() +sample_t SfxrSynth::nextStringSample() { - float sample_step = + float sample_step = static_cast( sample_length / ( sample_rate / nph->frequency() ) ); - + // check overflow while (sample_realindex >= sample_length) { sample_realindex -= sample_length; @@ -98,168 +109,195 @@ sample_t bSynth::nextStringSample() if (interpolation) { - // find position in shape - int a = static_cast(sample_realindex); + // find position in shape + int a = static_cast(sample_realindex); int b; if (a < (sample_length-1)) { b = static_cast(sample_realindex+1); } else { b = 0; } - + // Nachkommaanteil float frac = sample_realindex - static_cast(sample_realindex); - + sample = sample_shape[a]*(1-frac) + sample_shape[b]*(frac); } else { // No interpolation - sample_index = static_cast(sample_realindex); + sample_index = static_cast(sample_realindex); sample = sample_shape[sample_index]; } - + // progress in shape sample_realindex += sample_step; return sample; -} - -/*********************************************************************** -* -* class BitInvader -* -* lmms - plugin -* -***********************************************************************/ +} -bitInvader::bitInvader( InstrumentTrack * _instrument_track ) : - Instrument( _instrument_track, &bitinvader_plugin_descriptor ), - m_sampleLength( 128, 8, 128, 1, this, tr( "Samplelength" ) ), - m_graph( -1.0f, 1.0f, 128, this ), - m_interpolation( false, this ), - m_normalize( false, this ) + + +sfxrInstrument::sfxrInstrument( InstrumentTrack * _instrument_track ) : + Instrument( _instrument_track, &sfxr_plugin_descriptor ), + m_attModel(0.0f, this), + m_holdModel(0.3f, this), + m_susModel(0.0f, this), + m_decModel(0.4f, this), + + m_startFreqModel(0.3f, this), + m_minFreqModel(0.0f, this), + m_slideModel(0.0f, this), + m_dSlideModel(0.0f, this), + m_vibDepthModel(0.0f, this), + m_vibSpeedModel(0.0f, this), + + m_changeAmtModel(0.0f, this), + m_changeSpeedModel(0.0f, this), + + m_sqrDutyModel(0.0f, this), + m_sqrSweepModel(0.0f, this), + + m_repeatSpeedModel(0.0f, this), + + m_phaserOffsetModel(0.0f, this), + m_phaserSweepModel(0.0f, this), + + m_lpFilCutModel(1.0f, this), + m_lpFilCutSweepModel(0.0f, this), + m_lpFilResoModel(0.0f, this), + m_hpFilCutModel(0.0f, this), + m_hpFilCutSweepModel(0.0f, this), + m_waveFormModel( SQR_WAVE, 0, WAVES_NUM-1, this, tr( "Wave Form" ) ) { - - m_graph.setWaveToSine(); - + //TODO + /* connect( &m_sampleLength, SIGNAL( dataChanged( ) ), this, SLOT( lengthChanged( ) ) ); connect( &m_graph, SIGNAL( samplesChanged( int, int ) ), this, SLOT( samplesChanged( int, int ) ) ); - + */ } -bitInvader::~bitInvader() +sfxrInstrument::~sfxrInstrument() { } -void bitInvader::saveSettings( QDomDocument & _doc, QDomElement & _this ) +void sfxrInstrument::saveSettings( QDomDocument & _doc, QDomElement & _this ) { + _this.setAttribute( "version", "1" ); + m_attModel.saveSettings( _doc, _this, "att" ); + m_holdModel.saveSettings( _doc, _this, "hold" ); + m_susModel.saveSettings( _doc, _this, "sus" ); + m_decModel.saveSettings( _doc, _this, "dec" ); - // Save plugin version - _this.setAttribute( "version", "0.1" ); + m_startFreqModel.saveSettings( _doc, _this, "startFreq" ); + m_minFreqModel.saveSettings( _doc, _this, "minFreq" ); + m_slideModel.saveSettings( _doc, _this, "slide" ); + m_dSlideModel.saveSettings( _doc, _this, "dSlide" ); + m_vibDepthModel.saveSettings( _doc, _this, "vibDepth" ); + m_vibSpeedModel.saveSettings( _doc, _this, "vibSpeed" ); - // Save sample length - m_sampleLength.saveSettings( _doc, _this, "sampleLength" ); + m_changeAmtModel.saveSettings( _doc, _this, "changeAmt" ); + m_changeSpeedModel.saveSettings( _doc, _this, "changeSpeed" ); - // Save sample shape base64-encoded - QString sampleString; - base64::encode( (const char *)m_graph.samples(), - m_graph.length() * sizeof(float), sampleString ); - _this.setAttribute( "sampleShape", sampleString ); - + m_sqrDutyModel.saveSettings( _doc, _this, "sqrDuty" ); + m_sqrSweepModel.saveSettings( _doc, _this, "sqrSweep" ); - // save LED normalize - m_interpolation.saveSettings( _doc, _this, "interpolation" ); - - // save LED - m_normalize.saveSettings( _doc, _this, "normalize" ); + m_repeatSpeedModel.saveSettings( _doc, _this, "repeatSpeed" ); + + m_phaserOffsetModel.saveSettings( _doc, _this, "phaserOffset" ); + m_phaserSweepModel.saveSettings( _doc, _this, "phaserSweep" ); + + m_lpFilCutModel.saveSettings( _doc, _this, "lpFilCut" ); + m_lpFilCutSweepModel.saveSettings( _doc, _this, "lpFilCutSweep" ); + m_lpFilResoModel.saveSettings( _doc, _this, "lpFilReso" ); + m_hpFilCutModel.saveSettings( _doc, _this, "hpFilCut" ); + m_hpFilCutSweepModel.saveSettings( _doc, _this, "hpFilCutSweep" ); + + m_waveFormModel.saveSettings( _doc, _this, "waveForm" ); } -void bitInvader::loadSettings( const QDomElement & _this ) +void sfxrInstrument::loadSettings( const QDomElement & _this ) { - // Load sample length - m_sampleLength.loadSettings( _this, "sampleLength" ); - int sampleLength = (int)m_sampleLength.value(); + m_attModel.loadSettings(_this, "att" ); + m_holdModel.loadSettings( _this, "hold" ); + m_susModel.loadSettings( _this, "sus" ); + m_decModel.loadSettings( _this, "dec" ); - // Load sample shape - int size = 0; - char * dst = 0; - base64::decode( _this.attribute( "sampleShape"), &dst, &size ); + m_startFreqModel.loadSettings( _this, "startFreq" ); + m_minFreqModel.loadSettings( _this, "minFreq" ); + m_slideModel.loadSettings( _this, "slide" ); + m_dSlideModel.loadSettings( _this, "dSlide" ); + m_vibDepthModel.loadSettings( _this, "vibDepth" ); + m_vibSpeedModel.loadSettings( _this, "vibSpeed" ); - m_graph.setLength( sampleLength ); - m_graph.setSamples( (float*) dst ); - delete[] dst; + m_changeAmtModel.loadSettings( _this, "changeAmt" ); + m_changeSpeedModel.loadSettings( _this, "changeSpeed" ); - // Load LED normalize - m_interpolation.loadSettings( _this, "interpolation" ); - // Load LED - m_normalize.loadSettings( _this, "normalize" ); + m_sqrDutyModel.loadSettings( _this, "sqrDuty" ); + m_sqrSweepModel.loadSettings( _this, "sqrSweep" ); + + m_repeatSpeedModel.loadSettings( _this, "repeatSpeed" ); + + m_phaserOffsetModel.loadSettings( _this, "phaserOffset" ); + m_phaserSweepModel.loadSettings( _this, "phaserSweep" ); + + m_lpFilCutModel.loadSettings( _this, "lpFilCut" ); + m_lpFilCutSweepModel.loadSettings( _this, "lpFilCutSweep" ); + m_lpFilResoModel.loadSettings( _this, "lpFilReso" ); + m_hpFilCutModel.loadSettings( _this, "hpFilCut" ); + m_hpFilCutSweepModel.loadSettings( _this, "hpFilCutSweep" ); + + m_waveFormModel.loadSettings( _this, "waveForm" ); } -void bitInvader::lengthChanged() +void sfxrInstrument::samplesChanged( int _begin, int _end ) { - m_graph.setLength( (int) m_sampleLength.value() ); - - normalize(); -} - - - - -void bitInvader::samplesChanged( int _begin, int _end ) -{ - normalize(); + //TODO + //normalize(); //engine::getSongEditor()->setModified(); } -void bitInvader::normalize() +QString sfxrInstrument::nodeName() const { - // analyze - float max = 0; - const float* samples = m_graph.samples(); - for(int i=0; i < m_graph.length(); i++) - { - const float f = fabsf( samples[i] ); - if (f > max) { max = f; } - } - m_normalizeFactor = 1.0 / max; + return( sfxr_plugin_descriptor.name ); } -QString bitInvader::nodeName() const +f_cnt_t sfxrInstrument::desiredReleaseFrames() const { - return( bitinvader_plugin_descriptor.name ); + //TODO: check whether this disables + return 0; } - -void bitInvader::playNote( notePlayHandle * _n, +void sfxrInstrument::playNote( notePlayHandle * _n, sampleFrame * _working_buffer ) { - if ( _n->totalFramesPlayed() == 0 || _n->m_pluginData == NULL ) + //TODO + /*if ( _n->totalFramesPlayed() == 0 || _n->m_pluginData == NULL ) { float factor; @@ -272,7 +310,7 @@ void bitInvader::playNote( notePlayHandle * _n, factor = m_normalizeFactor; } - _n->m_pluginData = new bSynth( + _n->m_pluginData = new SfxrSynth( const_cast( m_graph.samples() ), m_graph.length(), _n, @@ -282,7 +320,7 @@ void bitInvader::playNote( notePlayHandle * _n, const fpp_t frames = _n->framesLeftForCurrentPeriod(); - bSynth * ps = static_cast( _n->m_pluginData ); + SfxrSynth * ps = static_cast( _n->m_pluginData ); for( fpp_t frame = 0; frame < frames; ++frame ) { const sample_t cur = ps->nextStringSample(); @@ -294,281 +332,588 @@ void bitInvader::playNote( notePlayHandle * _n, applyRelease( _working_buffer, _n ); - instrumentTrack()->processAudioBuffer( _working_buffer, frames, _n ); + instrumentTrack()->processAudioBuffer( _working_buffer, frames, _n );*/ } -void bitInvader::deleteNotePluginData( notePlayHandle * _n ) +void sfxrInstrument::deleteNotePluginData( notePlayHandle * _n ) { - delete static_cast( _n->m_pluginData ); + delete static_cast( _n->m_pluginData ); } -PluginView * bitInvader::instantiateView( QWidget * _parent ) +PluginView * sfxrInstrument::instantiateView( QWidget * _parent ) { - return( new bitInvaderView( this, _parent ) ); + return( new sfxrInstrumentView( this, _parent ) ); } +void sfxrInstrument::resetModels() +{ + m_attModel.reset(); + m_holdModel.reset(); + m_susModel.reset(); + m_decModel.reset(); + + m_startFreqModel.reset(); + m_minFreqModel.reset(); + m_slideModel.reset(); + m_dSlideModel.reset(); + m_vibDepthModel.reset(); + m_vibSpeedModel.reset(); + + m_changeAmtModel.reset(); + m_changeSpeedModel.reset(); + + m_sqrDutyModel.reset(); + m_sqrSweepModel.reset(); + + m_repeatSpeedModel.reset(); + + m_phaserOffsetModel.reset(); + m_phaserSweepModel.reset(); + + m_lpFilCutModel.reset(); + m_lpFilCutSweepModel.reset(); + m_lpFilResoModel.reset(); + m_hpFilCutModel.reset(); + m_hpFilCutSweepModel.reset(); + + m_waveFormModel.reset(); +} -bitInvaderView::bitInvaderView( Instrument * _instrument, + +class sfxrKnob : public knob +{ +public: + sfxrKnob( QWidget * _parent ) : + knob( knobStyled, _parent ) + { + setFixedSize( 20, 20 ); + setCenterPointX( 10.0 ); + setCenterPointY( 10.0 ); + setTotalAngle( 270.0 ); + setLineWidth( 1 ); + } +}; + + + + +#define createKnob(_knob, _x, _y, _name)\ + _knob = new sfxrKnob( this ); \ + _knob->setHintText( tr( _name ":" ), "" ); \ + _knob->move( _x, _y ); \ + toolTip::add( _knob, tr( _name ) ); + + + + +#define createButton(_button, _x, _y, _name, _resName)\ + _button = new pixmapButton( this, tr( "Sine wave" ) );\ + _button->move( _x, _y );\ + _button->setActiveGraphic( embed::getIconPixmap( _resName "_active" ) );\ + _button->setInactiveGraphic( embed::getIconPixmap( _resName "_inactive" ) );\ + toolTip::add( _button, tr( _name ) ); + + + + +#define createButtonLocalGraphic(_button, _x, _y, _name, _resName)\ + _button = new pixmapButton( this, tr( "Sine wave" ) );\ + _button->move( _x, _y );\ + _button->setActiveGraphic( PLUGIN_NAME::getIconPixmap( _resName "_active" ) );\ + _button->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( _resName "_inactive" ) );\ + toolTip::add( _button, tr( _name ) ); + + + + +sfxrInstrumentView::sfxrInstrumentView( Instrument * _instrument, QWidget * _parent ) : InstrumentView( _instrument, _parent ) { + srand(time(NULL)); setAutoFillBackground( true ); QPalette pal; - - pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( - "artwork" ) ); + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); setPalette( pal ); - - m_sampleLengthKnob = new knob( knobDark_28, this ); - m_sampleLengthKnob->move( 10, 120 ); - m_sampleLengthKnob->setHintText( tr( "Sample Length" ) + " ", "" ); - m_graph = new graph( this, graph::NearestStyle ); - m_graph->move(53,118); // 55,120 - 2px border - m_graph->setAutoFillBackground( true ); + createKnob(m_attKnob, KNOBS_BASE_X+KNOB_BLOCK_SIZE_X*0, KNOBS_BASE_Y+KNOB_BLOCK_SIZE_Y*0, "Attack Time"); + createKnob(m_holdKnob, KNOBS_BASE_X+KNOB_BLOCK_SIZE_X*1, KNOBS_BASE_Y+KNOB_BLOCK_SIZE_Y*0, "Sustain Time"); + createKnob(m_susKnob, KNOBS_BASE_X+KNOB_BLOCK_SIZE_X*2, KNOBS_BASE_Y+KNOB_BLOCK_SIZE_Y*0, "Sustain Punch"); + createKnob(m_decKnob, KNOBS_BASE_X+KNOB_BLOCK_SIZE_X*3, KNOBS_BASE_Y+KNOB_BLOCK_SIZE_Y*0, "Decay Time"); - toolTip::add( m_graph, tr ( "Draw your own waveform here " - "by dragging your mouse on this graph." - )); + createKnob(m_startFreqKnob, KNOBS_BASE_X+KNOB_BLOCK_SIZE_X*0, KNOBS_BASE_Y+KNOB_BLOCK_SIZE_Y*1, "Start Frequency"); + createKnob(m_minFreqKnob, KNOBS_BASE_X+KNOB_BLOCK_SIZE_X*1, KNOBS_BASE_Y+KNOB_BLOCK_SIZE_Y*1, "Min Frequency"); + createKnob(m_slideKnob, KNOBS_BASE_X+KNOB_BLOCK_SIZE_X*2, KNOBS_BASE_Y+KNOB_BLOCK_SIZE_Y*1, "Slide"); + createKnob(m_dSlideKnob, KNOBS_BASE_X+KNOB_BLOCK_SIZE_X*3, KNOBS_BASE_Y+KNOB_BLOCK_SIZE_Y*1, "Delta Slide"); + createKnob(m_vibDepthKnob, KNOBS_BASE_X+KNOB_BLOCK_SIZE_X*4, KNOBS_BASE_Y+KNOB_BLOCK_SIZE_Y*1, "Vibrato Depth"); + createKnob(m_vibSpeedKnob, KNOBS_BASE_X+KNOB_BLOCK_SIZE_X*5, KNOBS_BASE_Y+KNOB_BLOCK_SIZE_Y*1, "Vibrato Speed"); + + createKnob(m_changeAmtKnob, KNOBS_BASE_X+KNOB_BLOCK_SIZE_X*0, KNOBS_BASE_Y+KNOB_BLOCK_SIZE_Y*2, "Change Amount"); + createKnob(m_changeSpeedKnob, KNOBS_BASE_X+KNOB_BLOCK_SIZE_X*1, KNOBS_BASE_Y+KNOB_BLOCK_SIZE_Y*2, "Change Speed"); + + createKnob(m_sqrDutyKnob, KNOBS_BASE_X+KNOB_BLOCK_SIZE_X*3, KNOBS_BASE_Y+KNOB_BLOCK_SIZE_Y*2, "Squre Duty(Square wave only)"); + createKnob(m_sqrSpeedKnob, KNOBS_BASE_X+KNOB_BLOCK_SIZE_X*4, KNOBS_BASE_Y+KNOB_BLOCK_SIZE_Y*2, "Squre Sweep(Square wave only)"); + + createKnob(m_repeatSpeedKnob, KNOBS_BASE_X+KNOB_BLOCK_SIZE_X*0, KNOBS_BASE_Y+KNOB_BLOCK_SIZE_Y*3, "Repeat Speed"); + + createKnob(m_phaserOffsetKnob, KNOBS_BASE_X+KNOB_BLOCK_SIZE_X*2, KNOBS_BASE_Y+KNOB_BLOCK_SIZE_Y*3, "Phaser Offset"); + createKnob(m_phaserSweepKnob, KNOBS_BASE_X+KNOB_BLOCK_SIZE_X*3, KNOBS_BASE_Y+KNOB_BLOCK_SIZE_Y*3, "Phaser Sweep"); + + createKnob(m_lpFilCutKnob, KNOBS_BASE_X+KNOB_BLOCK_SIZE_X*0, KNOBS_BASE_Y+KNOB_BLOCK_SIZE_Y*4, "LP Filter Cutoff"); + createKnob(m_lpFilCutSweepKnob, KNOBS_BASE_X+KNOB_BLOCK_SIZE_X*1, KNOBS_BASE_Y+KNOB_BLOCK_SIZE_Y*4, "LP Filter Cutoff Sweep"); + createKnob(m_lpFilResoKnob, KNOBS_BASE_X+KNOB_BLOCK_SIZE_X*2, KNOBS_BASE_Y+KNOB_BLOCK_SIZE_Y*4, "LP Filter Resonance"); + createKnob(m_hpFilCutKnob, KNOBS_BASE_X+KNOB_BLOCK_SIZE_X*3, KNOBS_BASE_Y+KNOB_BLOCK_SIZE_Y*4, "HP Filter Cutoff"); + createKnob(m_hpFilCutSweepKnob, KNOBS_BASE_X+KNOB_BLOCK_SIZE_X*4, KNOBS_BASE_Y+KNOB_BLOCK_SIZE_Y*4, "HP Filter Cutoff Sweep"); + + createButton(m_sqrWaveBtn, KNOBS_BASE_X+WAVEFORM_BUTTON_WIDTH*0, WAVEFORM_BASE_Y, "Square Wave", "square_wave"); + createButton(m_sawWaveBtn, KNOBS_BASE_X+WAVEFORM_BUTTON_WIDTH*1, WAVEFORM_BASE_Y, "Saw Wave", "saw_wave"); + createButton(m_sinWaveBtn, KNOBS_BASE_X+WAVEFORM_BUTTON_WIDTH*2, WAVEFORM_BASE_Y, "Sine Wave", "sin_wave"); + createButton(m_noiseWaveBtn, KNOBS_BASE_X+WAVEFORM_BUTTON_WIDTH*3, WAVEFORM_BASE_Y, "Noise", "white_noise_wave"); + + m_waveBtnGroup = new automatableButtonGroup( this ); + m_waveBtnGroup->addButton(m_sqrWaveBtn); + m_waveBtnGroup->addButton(m_sawWaveBtn); + m_waveBtnGroup->addButton(m_sinWaveBtn); + m_waveBtnGroup->addButton(m_noiseWaveBtn); + connect( m_waveBtnGroup, SIGNAL ( dataChanged() ), + this, SLOT ( waveFormChanged() ) ); - pal = QPalette(); - pal.setBrush( backgroundRole(), - PLUGIN_NAME::getIconPixmap("wavegraph") ); - m_graph->setPalette( pal ); + createButtonLocalGraphic(m_pickupBtn, GENERATOR_BASE_X+GENERATOR_BUTTON_WIDTH*0, GENERATOR_BASE_Y, "Generate pick up/coin sfx", "pickup"); + createButtonLocalGraphic(m_laserBtn, GENERATOR_BASE_X+GENERATOR_BUTTON_WIDTH*1, GENERATOR_BASE_Y, "Generate laser/shoot sfx", "laser"); + createButtonLocalGraphic(m_explosionBtn, GENERATOR_BASE_X+GENERATOR_BUTTON_WIDTH*2, GENERATOR_BASE_Y, "Generate explosion sfx", "explosion"); + createButtonLocalGraphic(m_powerupBtn, GENERATOR_BASE_X+GENERATOR_BUTTON_WIDTH*3, GENERATOR_BASE_Y, "Generate power up sfx", "powerup"); + createButtonLocalGraphic(m_hitBtn, GENERATOR_BASE_X+GENERATOR_BUTTON_WIDTH*4, GENERATOR_BASE_Y, "Generate hit/hurt sfx", "hit"); + createButtonLocalGraphic(m_jumpBtn, GENERATOR_BASE_X+GENERATOR_BUTTON_WIDTH*5, GENERATOR_BASE_Y, "Generate jump sfx", "jump"); + createButtonLocalGraphic(m_blipBtn, GENERATOR_BASE_X+GENERATOR_BUTTON_WIDTH*6, GENERATOR_BASE_Y, "Generate blip/select sfx", "blip"); + connect( m_pickupBtn, SIGNAL ( clicked() ), this, SLOT ( genPickup() ) ); + connect( m_laserBtn, SIGNAL ( clicked() ), this, SLOT ( genLaser() ) ); + connect( m_explosionBtn, SIGNAL ( clicked() ), this, SLOT ( genExplosion() ) ); + connect( m_powerupBtn, SIGNAL ( clicked() ), this, SLOT ( genPowerup() ) ); + connect( m_hitBtn, SIGNAL ( clicked() ), this, SLOT ( genHit() ) ); + connect( m_jumpBtn, SIGNAL ( clicked() ), this, SLOT ( genJump() ) ); + connect( m_blipBtn, SIGNAL ( clicked() ), this, SLOT ( genBlip() ) ); - m_sinWaveBtn = new pixmapButton( this, tr( "Sine wave" ) ); - m_sinWaveBtn->move( 188, 120 ); - m_sinWaveBtn->setActiveGraphic( embed::getIconPixmap( - "sin_wave_active" ) ); - m_sinWaveBtn->setInactiveGraphic( embed::getIconPixmap( - "sin_wave_inactive" ) ); - toolTip::add( m_sinWaveBtn, - tr( "Click for a sine-wave." ) ); + createButtonLocalGraphic(m_randomizeBtn, RAND_BUTTON_X, RAND_BUTTON_Y, "Generate random sfx", "randomize"); + createButtonLocalGraphic(m_mutateBtn, MUTA_BUTTON_X, MUTA_BUTTON_Y, "Mutate sfx", "mutate"); + connect( m_randomizeBtn, SIGNAL ( clicked() ), this, SLOT ( randomize() ) ); + connect( m_mutateBtn, SIGNAL ( clicked() ), this, SLOT ( mutate() ) ); - m_triangleWaveBtn = new pixmapButton( this, tr( "Triangle wave" ) ); - m_triangleWaveBtn->move( 188, 136 ); - m_triangleWaveBtn->setActiveGraphic( - embed::getIconPixmap( "triangle_wave_active" ) ); - m_triangleWaveBtn->setInactiveGraphic( - embed::getIconPixmap( "triangle_wave_inactive" ) ); - toolTip::add( m_triangleWaveBtn, - tr( "Click here for a triangle-wave." ) ); + //TODO: for each generator button: + /*connect( m_pickupBtn, SIGNAL ( dataChanged() ), + this, SLOT ( pickupClicked() ) );*/ - m_sawWaveBtn = new pixmapButton( this, tr( "Saw wave" ) ); - m_sawWaveBtn->move( 188, 152 ); - m_sawWaveBtn->setActiveGraphic( embed::getIconPixmap( - "saw_wave_active" ) ); - m_sawWaveBtn->setInactiveGraphic( embed::getIconPixmap( - "saw_wave_inactive" ) ); - toolTip::add( m_sawWaveBtn, - tr( "Click here for a saw-wave." ) ); - - m_sqrWaveBtn = new pixmapButton( this, tr( "Square wave" ) ); - m_sqrWaveBtn->move( 188, 168 ); - m_sqrWaveBtn->setActiveGraphic( embed::getIconPixmap( - "square_wave_active" ) ); - m_sqrWaveBtn->setInactiveGraphic( embed::getIconPixmap( - "square_wave_inactive" ) ); - toolTip::add( m_sqrWaveBtn, - tr( "Click here for a square-wave." ) ); - - m_whiteNoiseWaveBtn = new pixmapButton( this, - tr( "White noise wave" ) ); - m_whiteNoiseWaveBtn->move( 188, 184 ); - m_whiteNoiseWaveBtn->setActiveGraphic( - embed::getIconPixmap( "white_noise_wave_active" ) ); - m_whiteNoiseWaveBtn->setInactiveGraphic( - embed::getIconPixmap( "white_noise_wave_inactive" ) ); - toolTip::add( m_whiteNoiseWaveBtn, - tr( "Click here for white-noise." ) ); - - m_usrWaveBtn = new pixmapButton( this, tr( "User defined wave" ) ); - m_usrWaveBtn->move( 188, 200 ); - m_usrWaveBtn->setActiveGraphic( embed::getIconPixmap( - "usr_wave_active" ) ); - m_usrWaveBtn->setInactiveGraphic( embed::getIconPixmap( - "usr_wave_inactive" ) ); - toolTip::add( m_usrWaveBtn, - tr( "Click here for a user-defined shape." ) ); - - m_smoothBtn = new pixmapButton( this, tr( "Smooth" ) ); - m_smoothBtn->move( 35, 200 ); - m_smoothBtn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( - "smooth" ) ); - m_smoothBtn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( - "smooth" ) ); - m_smoothBtn->setChecked( true ); - toolTip::add( m_smoothBtn, - tr( "Click here to smooth waveform." ) ); - - - m_interpolationToggle = new ledCheckBox( "Interpolation", this, - tr( "Interpolation" ) ); - m_interpolationToggle->move( 55,80 ); - - - m_normalizeToggle = new ledCheckBox( "Normalize", this, - tr( "Normalize" ) ); - m_normalizeToggle->move( 55, 100 ); - - - connect( m_sinWaveBtn, SIGNAL (clicked () ), - this, SLOT ( sinWaveClicked() ) ); - connect( m_triangleWaveBtn, SIGNAL ( clicked () ), - this, SLOT ( triangleWaveClicked() ) ); - connect( m_sawWaveBtn, SIGNAL (clicked () ), - this, SLOT ( sawWaveClicked() ) ); - connect( m_sqrWaveBtn, SIGNAL ( clicked () ), - this, SLOT ( sqrWaveClicked() ) ); - connect( m_whiteNoiseWaveBtn, SIGNAL ( clicked () ), - this, SLOT ( noiseWaveClicked() ) ); - connect( m_usrWaveBtn, SIGNAL ( clicked () ), - this, SLOT ( usrWaveClicked() ) ); - - connect( m_smoothBtn, SIGNAL ( clicked () ), - this, SLOT ( smoothClicked() ) ); - - connect( m_interpolationToggle, SIGNAL( toggled( bool ) ), - this, SLOT ( interpolationToggled( bool ) ) ); - - connect( m_normalizeToggle, SIGNAL( toggled( bool ) ), - this, SLOT ( normalizeToggled( bool ) ) ); } -void bitInvaderView::modelChanged() +void sfxrInstrumentView::modelChanged() { - bitInvader * b = castModel(); + sfxrInstrument * s = castModel(); - m_graph->setModel( &b->m_graph ); - m_sampleLengthKnob->setModel( &b->m_sampleLength ); - m_interpolationToggle->setModel( &b->m_interpolation ); - m_normalizeToggle->setModel( &b->m_normalize ); + m_attKnob->setModel( &s->m_attModel ); + m_holdKnob->setModel( &s->m_holdModel ); + m_susKnob->setModel( &s->m_susModel ); + m_decKnob->setModel( &s->m_decModel ); + m_startFreqKnob->setModel( &s->m_startFreqModel ); + m_minFreqKnob->setModel( &s->m_minFreqModel ); + m_slideKnob->setModel( &s->m_slideModel ); + m_dSlideKnob->setModel( &s->m_dSlideModel ); + m_vibDepthKnob->setModel( &s->m_vibDepthModel ); + m_vibSpeedKnob->setModel( &s->m_vibSpeedModel ); + + m_changeAmtKnob->setModel( &s->m_changeAmtModel ); + m_changeSpeedKnob->setModel( &s->m_changeSpeedModel ); + + m_sqrDutyKnob->setModel( &s->m_sqrDutyModel ); + m_sqrSpeedKnob->setModel( &s->m_sqrSweepModel ); + + m_repeatSpeedKnob->setModel( &s->m_repeatSpeedModel ); + + m_phaserOffsetKnob->setModel( &s->m_phaserOffsetModel ); + m_phaserSweepKnob->setModel( &s->m_phaserSweepModel ); + + m_lpFilCutKnob->setModel( &s->m_lpFilCutModel ); + m_lpFilCutSweepKnob->setModel( &s->m_lpFilCutSweepModel ); + m_lpFilResoKnob->setModel( &s->m_lpFilResoModel ); + m_hpFilCutKnob->setModel( &s->m_hpFilCutModel ); + m_hpFilCutSweepKnob->setModel( &s->m_hpFilCutSweepModel ); + + m_waveBtnGroup->setModel( &s->m_waveFormModel ); } -void bitInvaderView::sinWaveClicked() +void sfxrInstrumentView::waveFormChanged() { - m_graph->model()->setWaveToSine(); - engine::getSong()->setModified(); -} - - - - -void bitInvaderView::triangleWaveClicked() -{ - m_graph->model()->setWaveToTriangle(); - engine::getSong()->setModified(); -} - - - - -void bitInvaderView::sawWaveClicked() -{ - m_graph->model()->setWaveToSaw(); - engine::getSong()->setModified(); -} - - - - -void bitInvaderView::sqrWaveClicked() -{ - m_graph->model()->setWaveToSquare(); - engine::getSong()->setModified(); -} - - - - -void bitInvaderView::noiseWaveClicked() -{ - m_graph->model()->setWaveToNoise(); - engine::getSong()->setModified(); -} - - - - -void bitInvaderView::usrWaveClicked() -{ - QString fileName = m_graph->model()->setWaveToUser(); - toolTip::add( m_usrWaveBtn, fileName ); - engine::getSong()->setModified(); + //TODO: do we even need this slot? /* m_graph->model()->setWaveToNoise(); engine::getSong()->setModified(); - // zero sample_shape - for (int i = 0; i < sample_length; i++) - { - sample_shape[i] = 0; - } - - // load user shape - sampleBuffer buffer; - QString af = buffer.openAudioFile(); - if ( af != "" ) - { - buffer.setAudioFile( af ); - - // copy buffer data - sample_length = min( sample_length, static_cast( - buffer.frames() ) ); - for ( int i = 0; i < sample_length; i++ ) - { - sample_shape[i] = (float)*buffer.data()[i]; - } - } - - sampleChanged(); */ } -void bitInvaderView::smoothClicked() +void sfxrInstrumentView::genPickup() { - m_graph->model()->smooth(); - engine::getSong()->setModified(); + sfxrInstrument * s = castModel(); + s->resetModels(); + s->m_startFreqModel.setValue( 0.4f+frnd(0.5f) ); + s->m_attModel.setValue( 0.0f ); + s->m_holdModel.setValue( frnd(0.1f) ); + s->m_decModel.setValue( 0.1f+frnd(0.4f) ); + s->m_susModel.setValue( 0.3f+frnd(0.3f) ); + + if(rnd(1)) + { + s->m_changeAmtModel.setValue( 0.5f+frnd(0.2f) ); + s->m_changeSpeedModel.setValue( 0.2f+frnd(0.4f) ); + } } -void bitInvaderView::interpolationToggled( bool value ) +void sfxrInstrumentView::genLaser() { - m_graph->setGraphStyle( value ? graph::LinearStyle : graph::NearestStyle); - engine::getSong()->setModified(); + sfxrInstrument * s = castModel(); + s->resetModels(); + + s->m_waveFormModel.setValue( rnd(2) ); + if(s->m_waveFormModel.value()==2 && rnd(1)) + s->m_waveFormModel.setValue(rnd(1)); + + s->m_startFreqModel.setValue( 0.5f+frnd(0.5f) ); + s->m_minFreqModel.setValue( s->m_startFreqModel.value()-0.2f-frnd(0.6f) ); + + if(s->m_minFreqModel.value()<0.2f) + { + s->m_minFreqModel.setValue(0.2f); + } + + s->m_slideModel.setValue( -0.15f-frnd(0.2f) ); + + if(rnd(2)==0) + { + s->m_startFreqModel.setValue( 0.3f+frnd(0.6f) ); + s->m_minFreqModel.setValue( frnd(0.1f) ); + s->m_slideModel.setValue( -0.35f-frnd(0.3f) ); + } + + if(rnd(1)) + { + s->m_sqrDutyModel.setValue( frnd(0.5f) ); + s->m_sqrSweepModel.setValue( 0.2f ); + } + else + { + s->m_sqrDutyModel.setValue( 0.4f+frnd(0.5f) ); + s->m_sqrSweepModel.setValue( -frnd(0.7f) ); + } + + s->m_attModel.setValue( 0.0f ); + s->m_holdModel.setValue( 0.1f+frnd(0.2f) ); + s->m_decModel.setValue( frnd(0.4f) ); + + if(rnd(1)) + { + s->m_susModel.setValue( frnd(0.3f) ); + } + + if(rnd(2)==0) + { + s->m_phaserOffsetModel.setValue( frnd(0.2f) ); + s->m_phaserSweepModel.setValue( -frnd(0.2f) ); + } + + if(rnd(1)) + s->m_hpFilCutModel.setValue( frnd(0.3f) ); } -void bitInvaderView::normalizeToggled( bool value ) +void sfxrInstrumentView::genExplosion() { - engine::getSong()->setModified(); + sfxrInstrument * s = castModel(); + s->resetModels(); + + s->m_waveFormModel.setValue( 3 ); + + if(rnd(1)) + { + s->m_startFreqModel.setValue( 0.1f+frnd(0.4f) ); + s->m_slideModel.setValue( -0.1f+frnd(0.4f) ); + } + else + { + s->m_startFreqModel.setValue( 0.2f+frnd(0.7f) ); + s->m_slideModel.setValue( -0.2f-frnd(0.2f) ); + } + s->m_startFreqModel.setValue( s->m_startFreqModel.value()*s->m_startFreqModel.value() ); + + if(rnd(4)==0) + { + s->m_slideModel.setValue( 0.0f ); + } + + if(rnd(2)==0) + { + s->m_repeatSpeedModel.setValue( 0.3f+frnd(0.5f) ); + } + + s->m_attModel.setValue( 0.0f ); + s->m_holdModel.setValue( 0.1f+frnd(0.3f) ); + s->m_decModel.setValue( 0.5f ); + if(rnd(1)==0) + { + s->m_phaserOffsetModel.setValue( -0.3f+frnd(0.9f) ); + s->m_phaserSweepModel.setValue( -frnd(0.3f) ); + } + s->m_susModel.setValue( 0.2f+frnd(0.6f) ); + + if(rnd(1)) + { + s->m_vibDepthModel.setValue( frnd(0.7f) ); + s->m_vibSpeedModel.setValue( frnd(0.6f) ); + } + if(rnd(2)==0) + { + s->m_changeSpeedModel.setValue( 0.6f+frnd(0.3f) ); + s->m_changeAmtModel.setValue( 0.8f-frnd(1.6f) ); + } + +} + + + + +void sfxrInstrumentView::genPowerup() +{ + sfxrInstrument * s = castModel(); + s->resetModels(); + + if(rnd(1)) + s->m_waveFormModel.setValue( 1 ); + else + s->m_sqrDutyModel.setValue( frnd(0.6f) ); + if(rnd(1)) + { + s->m_startFreqModel.setValue( 0.2f+frnd(0.3f) ); + s->m_slideModel.setValue( 0.1f+frnd(0.4f) ); + s->m_repeatSpeedModel.setValue( 0.4f+frnd(0.4f) ); + } + else + { + s->m_startFreqModel.setValue( 0.2f+frnd(0.3f) ); + s->m_slideModel.setValue( 0.05f+frnd(0.2f) ); + if(rnd(1)) + { + s->m_vibDepthModel.setValue( frnd(0.7f) ); + s->m_vibSpeedModel.setValue( frnd(0.6f) ); + } + } + + s->m_attModel.setValue( 0.0f ); + s->m_holdModel.setValue( frnd(0.4f) ); + s->m_decModel.setValue( 0.1f+frnd(0.4f) ); +} + + + + +void sfxrInstrumentView::genHit() +{ + sfxrInstrument * s = castModel(); + s->resetModels(); + + s->m_waveFormModel.setValue( rnd(2) ); + if(s->m_waveFormModel.value()==2) + s->m_waveFormModel.setValue( 3 ); + if(s->m_waveFormModel.value()==0) + s->m_sqrDutyModel.setValue( frnd(0.6f) ); + + s->m_startFreqModel.setValue( 0.2f+frnd(0.6f) ); + s->m_slideModel.setValue( -0.3f-frnd(0.4f) ); + + s->m_attModel.setValue( 0.0f ); + s->m_holdModel.setValue( frnd(0.1f) ); + s->m_decModel.setValue( 0.1f+frnd(0.2f) ); + if(rnd(1)) + { + s->m_hpFilCutModel.setValue( frnd(0.3f) ); + } +} + + + + +void sfxrInstrumentView::genJump() +{ + sfxrInstrument * s = castModel(); + s->resetModels(); + + s->m_waveFormModel.setValue( 0 ); + s->m_sqrDutyModel.setValue( frnd(0.6f) ); + + s->m_startFreqModel.setValue( 0.3f+frnd(0.3f) ); + s->m_slideModel.setValue( 0.1f+frnd(0.2f) ); + + s->m_attModel.setValue( 0.0f ); + s->m_holdModel.setValue( 0.1f+frnd(0.3f) ); + s->m_decModel.setValue( 0.1f+frnd(0.2f) ); + + if(rnd(1)) + { + s->m_hpFilCutModel.setValue( frnd(0.3f) ); + } + + if(rnd(1)) + { + + s->m_lpFilCutModel.setValue( 1.0f-frnd(0.6f) ); + } +} + + + + +void sfxrInstrumentView::genBlip() +{ + sfxrInstrument * s = castModel(); + s->resetModels(); + + s->m_waveFormModel.setValue( rnd(1) ); + if( s->m_waveFormModel.value()==0 ) + { + s->m_sqrDutyModel.setValue( frnd(0.6f) ); + } + + s->m_startFreqModel.setValue( 0.2f+frnd(0.4f) ); + + s->m_attModel.setValue( 0.0f ); + s->m_holdModel.setValue( 0.1f+frnd(0.1f) ); + s->m_decModel.setValue( frnd(0.2f) ); + s->m_hpFilCutModel.setValue( 0.1f ); +} + + + + +void sfxrInstrumentView::randomize() +{ + sfxrInstrument * s = castModel(); + + s->m_startFreqModel.setValue( pow(frnd(2.0f)-1.0f, 2.0f) ); + if(rnd(1)) + { + s->m_startFreqModel.setValue( pow(frnd(2.0f)-1.0f, 3.0f)+0.5f ); + } + s->m_minFreqModel.setValue( 0.0f ); + s->m_slideModel.setValue( pow(frnd(2.0f)-1.0f, 5.0f) ); + if( s->m_startFreqModel.value()>0.7f && s->m_slideModel.value()>0.2f ) + { + s->m_slideModel.setValue( -s->m_slideModel.value() ); + } + if( s->m_startFreqModel.value()<0.2f && s->m_slideModel.value()<-0.05f ) + { + s->m_slideModel.setValue( -s->m_slideModel.value() ); + } + s->m_dSlideModel.setValue( pow(frnd(2.0f)-1.0f, 3.0f) ); + + s->m_sqrDutyModel.setValue( frnd(2.0f)-1.0f ); + s->m_sqrSweepModel.setValue( pow(frnd(2.0f)-1.0f, 3.0f) ); + + s->m_vibDepthModel.setValue( pow(frnd(2.0f)-1.0f, 3.0f) ); + s->m_vibSpeedModel.setValue( frnd(2.0f)-1.0f ); + //s->m_vibDelayModel.setValue( frnd(2.0f)-1.0f ); + + s->m_attModel.setValue( pow(frnd(2.0f)-1.0f, 3.0f) ); + s->m_holdModel.setValue( pow(frnd(2.0f)-1.0f, 2.0f) ); + s->m_decModel.setValue( frnd(2.0f)-1.0f ); + s->m_susModel.setValue( pow(frnd(0.8f), 2.0f) ); + if(s->m_attModel.value()+s->m_holdModel.value()+s->m_decModel.value()<0.2f) + { + s->m_holdModel.setValue( s->m_holdModel.value()+0.2f+frnd(0.3f) ); + s->m_decModel.setValue( s->m_decModel.value()+0.2f+frnd(0.3f) ); + } + + s->m_lpFilResoModel.setValue( frnd(2.0f)-1.0f ); + s->m_lpFilCutModel.setValue( 1.0f-pow(frnd(1.0f), 3.0f) ); + s->m_lpFilCutSweepModel.setValue( pow(frnd(2.0f)-1.0f, 3.0f) ); + if(s->m_lpFilCutModel.value()<0.1f && s->m_lpFilCutSweepModel.value()<-0.05f) + { + s->m_lpFilCutSweepModel.setValue( -s->m_lpFilCutSweepModel.value() ); + } + s->m_hpFilCutModel.setValue( pow(frnd(1.0f), 5.0f) ); + s->m_hpFilCutSweepModel.setValue( pow(frnd(2.0f)-1.0f, 5.0f) ); + + s->m_phaserOffsetModel.setValue( pow(frnd(2.0f)-1.0f, 3.0f) ); + s->m_phaserSweepModel.setValue( pow(frnd(2.0f)-1.0f, 3.0f) ); + + s->m_repeatSpeedModel.setValue( frnd(2.0f)-1.0f ); + + s->m_changeSpeedModel.setValue( frnd(2.0f)-1.0f ); + s->m_changeAmtModel.setValue( frnd(2.0f)-1.0f ); + +} + + + + +void sfxrInstrumentView::mutate() +{ + sfxrInstrument * s = castModel(); + + if(rnd(1)) s->m_startFreqModel.setValue( s->m_startFreqModel.value()+frnd(0.1f)-0.05f ); + // if(rnd(1)) s->m_minFreqModel.setValue( s->m_minFreqModel.value()+frnd(0.1f)-0.05f ); + if(rnd(1)) s->m_slideModel.setValue( s->m_slideModel.value()+frnd(0.1f)-0.05f ); + if(rnd(1)) s->m_dSlideModel.setValue( s->m_dSlideModel.value()+frnd(0.1f)-0.05f ); + + if(rnd(1)) s->m_sqrDutyModel.setValue( s->m_sqrDutyModel.value()+frnd(0.1f)-0.05f ); + if(rnd(1)) s->m_sqrSweepModel.setValue( s->m_sqrSweepModel.value()+frnd(0.1f)-0.05f ); + + if(rnd(1)) s->m_vibDepthModel.setValue( s->m_vibDepthModel.value()+frnd(0.1f)-0.05f ); + if(rnd(1)) s->m_vibSpeedModel.setValue( s->m_vibSpeedModel.value()+frnd(0.1f)-0.05f ); + // if(rnd(1)) s->m_vibDelayModel.setValue( s->m_vibDelayModel.value()+frnd(0.1f)-0.05f ); + + if(rnd(1)) s->m_attModel.setValue( s->m_attModel.value()+frnd(0.1f)-0.05f ); + if(rnd(1)) s->m_holdModel.setValue( s->m_holdModel.value()+frnd(0.1f)-0.05f ); + if(rnd(1)) s->m_decModel.setValue( s->m_decModel.value()+frnd(0.1f)-0.05f ); + if(rnd(1)) s->m_susModel.setValue( s->m_susModel.value()+frnd(0.1f)-0.05f ); + + if(rnd(1)) s->m_lpFilResoModel.setValue( s->m_lpFilResoModel.value()+frnd(0.1f)-0.05f ); + if(rnd(1)) s->m_lpFilCutModel.setValue( s->m_lpFilCutModel.value()+frnd(0.1f)-0.05f ); + if(rnd(1)) s->m_lpFilCutSweepModel.setValue( s->m_lpFilCutSweepModel.value()+frnd(0.1f)-0.05f ); + if(rnd(1)) s->m_hpFilCutModel.setValue( s->m_hpFilCutModel.value()+frnd(0.1f)-0.05f ); + if(rnd(1)) s->m_hpFilCutSweepModel.setValue( s->m_hpFilCutSweepModel.value()+frnd(0.1f)-0.05f ); + + if(rnd(1)) s->m_phaserOffsetModel.setValue( s->m_phaserOffsetModel.value()+frnd(0.1f)-0.05f ); + if(rnd(1)) s->m_phaserSweepModel.setValue( s->m_phaserSweepModel.value()+frnd(0.1f)-0.05f ); + + if(rnd(1)) s->m_repeatSpeedModel.setValue( s->m_repeatSpeedModel.value()+frnd(0.1f)-0.05f ); + + if(rnd(1)) s->m_changeSpeedModel.setValue( s->m_changeSpeedModel.value()+frnd(0.1f)-0.05f ); + if(rnd(1)) s->m_changeAmtModel.setValue( s->m_changeAmtModel.value()+frnd(0.1f)-0.05f ); + } @@ -580,7 +925,7 @@ extern "C" // necessary for getting instance out of shared lib Plugin * PLUGIN_EXPORT lmms_plugin_main( Model *, void * _data ) { - return( new bitInvader( static_cast( _data ) ) ); + return( new sfxrInstrument( static_cast( _data ) ) ); } @@ -588,4 +933,4 @@ Plugin * PLUGIN_EXPORT lmms_plugin_main( Model *, void * _data ) -#include "moc_bit_invader.cxx" +#include "moc_sfxr.cxx" diff --git a/plugins/sfxr/sfxr.h b/plugins/sfxr/sfxr.h index 3b2320e80..e363dd343 100644 --- a/plugins/sfxr/sfxr.h +++ b/plugins/sfxr/sfxr.h @@ -1,5 +1,6 @@ /* * sfxr.h - declaration of classes of the LMMS sfxr plugin + * The original readme file of sfxr can be found in readme.txt in this directory. * * Copyright (c) 2014 Wong Cho Ching * @@ -29,19 +30,44 @@ #include "Instrument.h" #include "InstrumentView.h" #include "knob.h" +#include "graph.h" #include "pixmap_button.h" #include "led_checkbox.h" -class bitInvaderView; -class bSynth +enum SfxrWaves +{ + SQR_WAVE, SAW_WAVE, SINE_WAVE, NOISE_WAVE, WAVES_NUM +}; + +const int WAVEFORM_BASE_X = 20; +const int WAVEFORM_BASE_Y = 14; +const int WAVEFORM_BUTTON_WIDTH = 16; + +const int GENERATOR_BASE_X = 110; +const int GENERATOR_BASE_Y = 24; +const int GENERATOR_BUTTON_WIDTH = 16; + +const int RAND_BUTTON_X = 160; +const int RAND_BUTTON_Y = 4; + +const int MUTA_BUTTON_X = 205; +const int MUTA_BUTTON_Y = 4; + +const int KNOBS_BASE_X = 20; +const int KNOBS_BASE_Y = 50; +const int KNOB_BLOCK_SIZE_X = 40; +const int KNOB_BLOCK_SIZE_Y = 40; + + +class SfxrSynth { public: - bSynth( float * sample, int length, notePlayHandle * _nph, - bool _interpolation, float factor, + SfxrSynth( float * sample, int length, notePlayHandle * _nph, + bool _interpolation, float factor, const sample_rate_t _sample_rate ); - virtual ~bSynth(); - + virtual ~SfxrSynth(); + sample_t nextStringSample(); @@ -54,15 +80,39 @@ private: const sample_rate_t sample_rate; bool interpolation; - -} ; -class bitInvader : public Instrument +}; + +/** + * @brief A class that simplify the constructor of FloatModel, with value [0,1] + */ +class SfxrZeroToOneFloatModel : public FloatModel +{ +public: + SfxrZeroToOneFloatModel(float val, Model * parent): + FloatModel( val, 0.0, 1.0, 0.001, parent) + { + } +}; + +/** + * @brief A class that simplify the constructor of FloatModel, with value [-1,1] + */ +class SfxrNegPosOneFloatModel : public FloatModel +{ +public: + SfxrNegPosOneFloatModel(float val, Model * parent): + FloatModel( val, -1.0, 1.0, 0.001, parent) + { + } +}; + +class sfxrInstrument : public Instrument { Q_OBJECT public: - bitInvader(InstrumentTrack * _instrument_track ); - virtual ~bitInvader(); + sfxrInstrument(InstrumentTrack * _instrument_track ); + virtual ~sfxrInstrument(); virtual void playNote( notePlayHandle * _n, sampleFrame * _working_buffer ); @@ -75,77 +125,127 @@ public: virtual QString nodeName() const; - virtual f_cnt_t desiredReleaseFrames() const - { - return( 64 ); - } + virtual f_cnt_t desiredReleaseFrames() const; virtual PluginView * instantiateView( QWidget * _parent ); -protected slots: - void lengthChanged(); - void samplesChanged( int, int ); + void resetModels(); - void normalize(); +protected slots: + void samplesChanged( int, int ); private: - FloatModel m_sampleLength; - graphModel m_graph; - - BoolModel m_interpolation; - BoolModel m_normalize; - - float m_normalizeFactor; + SfxrZeroToOneFloatModel m_attModel; + SfxrZeroToOneFloatModel m_holdModel; + SfxrZeroToOneFloatModel m_susModel; + SfxrZeroToOneFloatModel m_decModel; - friend class bitInvaderView; -} ; + SfxrZeroToOneFloatModel m_startFreqModel; + SfxrZeroToOneFloatModel m_minFreqModel; + SfxrNegPosOneFloatModel m_slideModel; + SfxrNegPosOneFloatModel m_dSlideModel; + SfxrZeroToOneFloatModel m_vibDepthModel; + SfxrZeroToOneFloatModel m_vibSpeedModel; + + SfxrNegPosOneFloatModel m_changeAmtModel; + SfxrZeroToOneFloatModel m_changeSpeedModel; + + SfxrZeroToOneFloatModel m_sqrDutyModel; + SfxrNegPosOneFloatModel m_sqrSweepModel; + + SfxrZeroToOneFloatModel m_repeatSpeedModel; + + SfxrNegPosOneFloatModel m_phaserOffsetModel; + SfxrNegPosOneFloatModel m_phaserSweepModel; + + SfxrZeroToOneFloatModel m_lpFilCutModel; + SfxrNegPosOneFloatModel m_lpFilCutSweepModel; + SfxrZeroToOneFloatModel m_lpFilResoModel; + SfxrZeroToOneFloatModel m_hpFilCutModel; + SfxrNegPosOneFloatModel m_hpFilCutSweepModel; + + IntModel m_waveFormModel; + + friend class sfxrInstrumentView; +}; -class bitInvaderView : public InstrumentView +class sfxrInstrumentView : public InstrumentView { Q_OBJECT public: - bitInvaderView( Instrument * _instrument, + sfxrInstrumentView( Instrument * _instrument, QWidget * _parent ); - virtual ~bitInvaderView() {}; + virtual ~sfxrInstrumentView() {}; protected slots: - //void sampleSizeChanged( float _new_sample_length ); - - void interpolationToggled( bool value ); - void normalizeToggled( bool value ); - - void sinWaveClicked(); - void triangleWaveClicked(); - void sqrWaveClicked(); - void sawWaveClicked(); - void noiseWaveClicked(); - void usrWaveClicked(); - - void smoothClicked( void ); + void waveFormChanged(); + void genPickup(); + void genLaser(); + void genExplosion(); + void genPowerup(); + void genHit(); + void genJump(); + void genBlip(); + void randomize(); + void mutate(); private: virtual void modelChanged(); - knob * m_sampleLengthKnob; - pixmapButton * m_sinWaveBtn; - pixmapButton * m_triangleWaveBtn; - pixmapButton * m_sqrWaveBtn; + knob * m_attKnob; //Attack Time + knob * m_holdKnob; //Sustain Time + knob * m_susKnob; //Sustain Punch + knob * m_decKnob; //Decay Time + + knob * m_startFreqKnob; //Start Frequency + knob * m_minFreqKnob; //Min Frequency + knob * m_slideKnob; //Slide + knob * m_dSlideKnob; //Delta Slide + knob * m_vibDepthKnob; //Vibrato Depth + knob * m_vibSpeedKnob; //Vibrato Speed + + knob * m_changeAmtKnob; //Change Amount + knob * m_changeSpeedKnob; //Change Speed + + knob * m_sqrDutyKnob; //Squre Duty + knob * m_sqrSpeedKnob; //Squre Sweep + + knob * m_repeatSpeedKnob; //Repeat Speed + + knob * m_phaserOffsetKnob; //Phaser Offset + knob * m_phaserSweepKnob; //Phaser Sweep + + knob * m_lpFilCutKnob; //LP Filter Cutoff + knob * m_lpFilCutSweepKnob; //LP Filter Cutoff Sweep + knob * m_lpFilResoKnob; //LP Filter Resonance + knob * m_hpFilCutKnob; //HP Filter Cutoff + knob * m_hpFilCutSweepKnob; //HP Filter Cutoff Sweep + + automatableButtonGroup * m_waveBtnGroup; + pixmapButton * m_sqrWaveBtn; //NOTE: This button has Squre Duty + //and Squre Speed configurable pixmapButton * m_sawWaveBtn; - pixmapButton * m_whiteNoiseWaveBtn; - pixmapButton * m_smoothBtn; - pixmapButton * m_usrWaveBtn; + pixmapButton * m_sinWaveBtn; + pixmapButton * m_noiseWaveBtn; + + + pixmapButton * m_pickupBtn; + pixmapButton * m_laserBtn; + pixmapButton * m_explosionBtn; + pixmapButton * m_powerupBtn; + pixmapButton * m_hitBtn; + pixmapButton * m_jumpBtn; + pixmapButton * m_blipBtn; + + pixmapButton * m_randomizeBtn; + pixmapButton * m_mutateBtn; static QPixmap * s_artwork; - - graph * m_graph; - ledCheckBox * m_interpolationToggle; - ledCheckBox * m_normalizeToggle; - -} ; +}; From 485d4fc595e0b4c3ebb1b9923e17514cde64d8f6 Mon Sep 17 00:00:00 2001 From: Vesa Date: Fri, 24 Jan 2014 13:37:08 +0200 Subject: [PATCH 033/110] New Zyn plugin artwork --- plugins/zynaddsubfx/artwork.png | Bin 30406 -> 86217 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/plugins/zynaddsubfx/artwork.png b/plugins/zynaddsubfx/artwork.png index 7d158bdaa71b4f69f9e3bb49af174cce80e6fd46..2ef0b570560876c9cb0469cd13fc8f52d9f9245c 100644 GIT binary patch literal 86217 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 literal 30406 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 From 84926cae4cf58f800d87e68f304481a6a5fd9464 Mon Sep 17 00:00:00 2001 From: Vesa Date: Sat, 25 Jan 2014 03:47:42 +0200 Subject: [PATCH 034/110] Oscilloscope, tripleosc gfx fix --- data/themes/default/output_graph.png | Bin 3684 -> 4790 bytes data/themes/default/style.css | 5 +++++ plugins/triple_oscillator/artwork.png | Bin 46685 -> 47649 bytes src/gui/widgets/visualization_widget.cpp | 2 +- 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/data/themes/default/output_graph.png b/data/themes/default/output_graph.png index b1405a63b566f8e593a7c7514fc8a5966a2b1040..46ec86d44784ec8e0d732837ca8489010afd74cb 100644 GIT binary patch literal 4790 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

2vaHIHA6)$LfUKG4zQ~9 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ġn0|q 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�LEUKpJVuU81i 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 by8JX~hL{qBb6oub1ASy96vS&q4TJv=<=WM- diff --git a/src/gui/widgets/visualization_widget.cpp b/src/gui/widgets/visualization_widget.cpp index 7dee75d33..2f6eebe95 100644 --- a/src/gui/widgets/visualization_widget.cpp +++ b/src/gui/widgets/visualization_widget.cpp @@ -141,7 +141,7 @@ void visualizationWidget::paintEvent( QPaintEvent * ) // and set color according to that... if( max_level * master_output < 0.9 ) { - p.setPen( QColor( 128, 224, 128 ) ); + p.setPen( QColor( 71, 253, 133 ) ); } else if( max_level * master_output < 1.0 ) { From 8a508eff27bb7de16da02be2832e06478c96b29d Mon Sep 17 00:00:00 2001 From: Vesa Date: Sat, 25 Jan 2014 17:38:56 +0200 Subject: [PATCH 035/110] Graphics tweaks here and there. Lots of palette adjustments, rest of the most important icons done. CPULoad widget fix to allow transparent background without glitching. --- data/themes/default/add.png | Bin 907 -> 900 bytes data/themes/default/apply.png | Bin 736 -> 787 bytes data/themes/default/arp_down.png | Bin 604 -> 575 bytes data/themes/default/arp_up.png | Bin 581 -> 615 bytes data/themes/default/arp_up_and_down.png | Bin 569 -> 586 bytes data/themes/default/autoscroll_off.png | Bin 623 -> 599 bytes data/themes/default/autoscroll_on.png | Bin 610 -> 604 bytes data/themes/default/back_to_start.png | Bin 687 -> 296 bytes data/themes/default/back_to_zero.png | Bin 476 -> 318 bytes data/themes/default/chord.png | Bin 1044 -> 1021 bytes data/themes/default/combobox_bg.png | Bin 101 -> 369 bytes data/themes/default/cpuload_bg.png | Bin 160 -> 840 bytes data/themes/default/cpuload_leds.png | Bin 135 -> 947 bytes data/themes/default/dont_know.png | Bin 717 -> 700 bytes data/themes/default/edit_select.png | Bin 842 -> 808 bytes data/themes/default/exp_wave_active.png | Bin 546 -> 565 bytes data/themes/default/home.png | Bin 1132 -> 1312 bytes data/themes/default/keep_stop_position.png | Bin 410 -> 299 bytes data/themes/default/lfo_d100_active.png | Bin 706 -> 708 bytes data/themes/default/lfo_x100_active.png | Bin 770 -> 772 bytes data/themes/default/lfo_x1_active.png | Bin 668 -> 665 bytes data/themes/default/moog_saw_wave_active.png | Bin 539 -> 555 bytes data/themes/default/note.png | Bin 974 -> 979 bytes data/themes/default/note_double_whole.png | Bin 1219 -> 1253 bytes data/themes/default/note_eighth.png | Bin 974 -> 979 bytes data/themes/default/note_half.png | Bin 556 -> 571 bytes data/themes/default/note_quarter.png | Bin 547 -> 551 bytes data/themes/default/note_sixteenth.png | Bin 1110 -> 1112 bytes data/themes/default/note_thirtysecond.png | Bin 1191 -> 1194 bytes data/themes/default/note_tripleteighth.png | Bin 1088 -> 1105 bytes data/themes/default/note_triplethalf.png | Bin 1069 -> 1107 bytes data/themes/default/note_tripletquarter.png | Bin 726 -> 717 bytes data/themes/default/note_tripletsixteenth.png | Bin 1291 -> 1302 bytes .../default/note_tripletthirtysecond.png | Bin 1453 -> 1476 bytes data/themes/default/note_whole.png | Bin 709 -> 728 bytes data/themes/default/plugins.png | Bin 2215 -> 2110 bytes data/themes/default/preset_file.png | Bin 1482 -> 2127 bytes data/themes/default/project_file.png | Bin 1558 -> 2132 bytes .../default/round_square_wave_active.png | Bin 551 -> 552 bytes data/themes/default/sample_file.png | Bin 1572 -> 1243 bytes data/themes/default/saw_wave_active.png | Bin 518 -> 541 bytes data/themes/default/scale.png | Bin 1056 -> 1059 bytes data/themes/default/sin_wave_active.png | Bin 544 -> 576 bytes data/themes/default/square_wave_active.png | Bin 505 -> 531 bytes data/themes/default/style.css | 6 +++++- data/themes/default/trackop.png | Bin 746 -> 951 bytes data/themes/default/trackop_c.png | Bin 787 -> 988 bytes data/themes/default/trackop_h.png | Bin 746 -> 966 bytes data/themes/default/triangle_wave_active.png | Bin 537 -> 535 bytes data/themes/default/usr_wave_active.png | Bin 518 -> 474 bytes .../default/white_noise_wave_active.png | Bin 502 -> 533 bytes src/gui/widgets/cpuload_widget.cpp | 4 +++- 52 files changed, 8 insertions(+), 2 deletions(-) diff --git a/data/themes/default/add.png b/data/themes/default/add.png index e029787c716868c498d99a78a967575568a28f96..f79fdfdba28505255360397b62b26d5d5972671a 100644 GIT binary patch delta 857 zcmV-f1E&0o2ZRTZBo78+OGiWi000000Qp0^e~~d5e+P6)O+^RZ0T~V)2Jss+H~;_x z5lKWrR5;76luKxwRTRg6_wmh4rfHr{Oc86Pg~TET8oDW>4K5V1U_m#!vf{!`*TqfU zxDuBlxG#mQd~SRt2&Icud{rc3B~eKyNt>9*%s1b6?>)!GL{~NmP0!}6&hPxs)2J#t z*{M%ne|`4p2PfXYvhev)=g21pM`tGn$1YwRd+pjzah_eQ+t;sL8h^cSy#F|YbP4+8 zQgQo3;31&ATb$huJioEn_f6wF>_C8lHY2q`W|prH194x9RW0jbi-l$bfF3=>Lh}}Y z>alWda~o6-{>ke_#xYvEfHPerI;7=f~A~tW~VF+g|Ce)d?w*hk!9cTLM+r z#pp*bsdI{R4(Gr*c(nIn&K^Fqx)ko5^*7fR-+lA+%RNB@OZgqZBDPbi8o?MtNlBgx ze*j7;d1Le(&KR8WIAd|fQukFXa67IJeA<|P%U}NKixZCzALXxdiG}78##yii<2uTX z5t30#DKN$`bNgE|V^Fo!Y=!=;m$hb#xm$~Du5a60|tD^K_`27X;#q-|RiA);b1 z&SFJzu9EaBRYNU&l}H;KX9Bu z*N3+ioHtan4g{+t6ZvxaDy1zsbLbRSEmbNU=^o-peF#;9s^XmROY?U`WZDB4zHj_? z?B|vFQI~nJX1f)g0oE#>XO5jDxq@1jQG|l8|F}W4`F}(149{Vlpf1gM?=N`0e>8Iw z7`xm49C+_}ZN&oX9WG1cT9T(0%ddQ9_Oi!29!N9f7}KeuE#;n0dJka3R@ov-=U3#Z zb$@p@_{oErcJLj=D+Gz|x9$KvPhXHm)9KDVOdC;v7?ifi=M}X1&GWOn)fs_(0Bu-eYOOXQZH|}DD#(4;3 zi4ikFqksL3mB*{>Hd}mt_Cp%+_FFp5QvTU_fRizuECvTs3AF3Q;kyQpQHDST1hQ)p zlGv0-&By#*|C!yWO()5iF-NJ$I7pBXX6(Tc`=cZT`N^sDS?uHHPHHk_KSWEm}MW0e>?1>JSre1tw?-C+^rvc zS{MEIxW9_L+F84pKr2Dw;^GZp5O9&-Ub;tSa}bc&=y3iD>nzQrg(5;pfyi53usxhl z=xs@-iHqB`;)GD-hY`j1dMX@ZQd_p0Z8mnE;nR>(R%T&gK@I?(wDVJw%~O>S?>)+E zX3P;nTVAhLt9}6R$6mYavxmF!YT{Cal#wA=9<}2iEiEne1^*AAhHk=0ThQhJ0000< KMNUMnLSTZyFR2g! diff --git a/data/themes/default/apply.png b/data/themes/default/apply.png index f547bf179a3072051a52539b089ba1436de79c7a..1ae48682ea8566dd6854517ffb39e7cc82f44c4b 100644 GIT binary patch delta 774 zcmV+h1Nr>m1(ODl8Gi-<006|aY&!q|00v@9M??Ss00000`9r&Z00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-vi84er}1C`Rf*oRBWS=vkktrQbKr!I&XNMhXt1rpIs+0Or*t`sxvBD?Uy=j!G8zwZzJye|*1tDP-Rp5eU-zEV1~AUDuj!*~~glf`T>#`(MHZ1*I0Yo4oo57?0L18BNt!lNES}oM) zYhP7W?k{s1EufW3Feb`9pPFW2M}s{8fMTb@ZnXt!J%8DDotO!h<-o;x@QPXZ`v%EO z=!ZvqJoNexaDH>ey}TSF6$#70B_yO6)L_!7qHvng#Of3SwvznG%Em0GoEX6J0@wrx zH4{N!|A-h0d_O^+4)v}7+!}Z>BRNOL@CVh53LGJb3IvRif?g*-ED)xxq|t04&>z7P&L_`rXB_PTqg!vVagaC(z zhA_ZMQ#0&2u6yYIR>wnaG!o-q9?pqOrOm9eFMpVMEGrUVRRo|ZWa(%K&zGf7)3Hmu zfB5d-PMzA!6oRvzi$ve(ve23AUNr<7aHv!e9?T;Yh_uIh-`(0)6fkuK6XjiX($OiO zly|vQQr5UT{!7L@kve4BYWKLcxiF!uI(Tz8b$6D20o?!h-f;x8rvLx|07*qoM6N<$ Ef_BJaH~;_u delta 723 zcmV;^0xbQL2H*vd8Gi!+008r9oCyE`00VPENmK|32;1RL-~a#tl2A-kMgRZ*|Nnph zKmY(U004jh09610O#lF0002n<09*h7TmS%800dP815yJ6Py+=`1qf0I2TcbCMg|5& z1|)YR21Eu6X$uo)6B1|=5Ni+yT?PkO2MSdR2xtfiO9>2Y41Wqp3JgRG5l0Lkavl$P z4Ig(O9eN!bdm0yh77~6C9&H{Ac?nRUP7;F=8mL}AYyVt=?qW3)wOs7Yn3PGzuDW|ui;nmuQS!N$wg*4*FU;pFG(?e6aO_xk(${Qds^{{DU9 z;8_3w0DrbgL_t&-(_>(uAK*~Y;ldPU*KBIlHUL8~Bh5+0xj+B_002ovPDHLk FV1g+8GEV>i diff --git a/data/themes/default/arp_down.png b/data/themes/default/arp_down.png index b0ce4a5cc110e4dfc2cf1c6e352e8bf76c056d95..85586f7dae1700692dcc04e0dcc760008e156576 100644 GIT binary patch delta 561 zcmV-10?z&11iu838Gi-<001BJ|6u?C00v@9M??Ss00000`9r&Z00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-vi84es4?5rbP0005ZNkl;9c2#=TbgncS;fhg+C}ZgK}d>|la#9iH90x#fpQ_Vi+>!P&`RMXr5rX&Y3z_O z?C?A@^L*#|{lnoY#o9lBcfD_)*XQ%;{f2*DV(XQYmrm67oPA|A@U<9~ix>A4&9BWPlT9?)%X7Ac#}H6Tt)fqQza zyaAQ^*fKx`F8#=bAO=5XWRS;dx5pW-d}V4r)_%qLw0{W;4fE5ka&KdK{gi=*Lx}Pm zEYF4@rkWHmzjrQh;NER+EhYfkie8?4c=>jxv13bRY?B-N!gTsrp2840lpnlc=Faio zYFxG8tNYc#k!^+7{ibXtR?6sFn4Xh=j>*5mvy*~T4@>uhH?n9(sa9Phn4Xi|m|1af z^$#xZ6)JqOtH-wQ>ny6zwSLZ9Y975F^Z)55z(URWuuZb200000NkvXXu0mjfA@&Bu delta 590 zcmXAlZAeoA6o%imyQ%4jZJAy}9IolqHBb{2F_}!or4rLz3|*Riu*5N97}RiL{xDGx zQwrUWTve1f7)R#7 zztK*FD=rpphl|QlrDj|+88&4PTT{mz%zgXW`S3L2UrA_03Qo0 zfFJk*tO4u52Jj8|0R(_Qz%H1NB8XWI+s=;g#zcRL=FY|P=HqxC9{&ZOd`FTWNb)0@ zIFp!kGf7|;B#$NwCxqfzaoYPd>04>GX(2mjDkpCyuVA>KaH3G=l*wM_m)J`b;|hga zp>!#0#%ffLRjMhKno`%=G<6T_G!Bi{sntvU_+LQfyn7Yc6N>FZ3R*}&=U+1V;0eWKW=A$Xl1A+)=->xL@N84DbU9hebZd PaQL~h;!3%#sJ{I#@@>@@ diff --git a/data/themes/default/arp_up.png b/data/themes/default/arp_up.png index 78e7ad37fb7a2f6a2b51a18384c5367f71086f55..07a4ecc7e4a1af2746fbd521ee0d750ede941ca7 100644 GIT binary patch delta 564 zcmV-40?Yly1m^^hBo78+OGiWi000000Qp0^e~~~Qf8GHZ4jdVL6F$uV00Hz#L_t(I z%gvKbYZFlvhTr><%wz~jtAiy?YiKJt#LrSih1OzMiYU4fgwjfluB3D&B6Oi3NS4Kg zxDs6W19Ty{5L76LP$OAfltkN7LNTT!P3)MNxyMC76si%r@!6i2m*;Re%yArS1&%H9 z#{xB{e{kf^W!A1h*tWgtpqv_Fx%|TRGgB8EZx7R>=vca@hMtiAlSK%Ql7S5O%RXRb(UW}tFTrUS1l!h=$URQ8bTWIvF)p`dPl{+VZ+ zT|s4fpH2>poh(sJ6dJ22Pz9!G!Zq>Qx&ChCfA0pDlG7LZhfiw>;hP+Y89>Z{YcbeX zd|2H*F#Bu%Hv=`E=o?AyEgtPoV}+_%H0oHUDwcQ+kR0F)Hex6*Ef1n++j}STN^<~E zS9dZ1NX5H~r**4X4Jx_8k;d70;^wBUhHUvSe zYcS7)qySO}5S|G^5}^$V-t^h1)tO}f8t*gxD?b3@-@Pu|4%BV{0000q zbfZNw16nPdY39y3_nsD-t1QV)&-y(-9^S(%j4?P)B#xOw0nQVbo{x%uZ}0))_4@Lu z%P+3@+DvT-PnF_B9u43$g;_LSTol{yHrBJ<-e!!sG=+xvE5I^g=8fkAejC^0sU5H~ zttOt8k1bO%o_{k0AAdfW7r*-jmicDt+|>1|ud28aBlaCX-BaC%~B z;zp)3DW}cL#+u3&wMjo2xfhQU6hwsZZhL z9?;fppkx1W0l>+k~e1j+=E8Gi-<001BJ|6u?C00v@9M??Ss00000`9r&Z00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-vi84esA40*~z0005kNklt8=aL(a9u!#~kNA1bS1P;H;dT9l3mX{<|YQqeD9aI-wvQgJcAP z5SfbY4?k2c0=L#rP;MT0a_Z{cRkx+J*1i__LI~fCD4$f+7rPR^kxBWXWd^xy|26)V z#G2W0=lH>yp-V3-ttI)jQNs!9lu`}mdtDZKyq|ZF0)Lzpa#htS?Yj|Qx5ARwd^PrT zYBFghq?A%ggaT9;bQJB5qS02=T_q7_sq9?oK4QM8f!TAW94ib?9F4XN5ov>H`ry0Z z1^|Sg>Ti(ZcGn7j@pZ6E*zO?uQq2%WG0g8#GQn65D>JkBbZTv7Ws&oNrnFmwo{6NvOzwsZ9(30000< KMNUMnLSTZ-kp4md delta 555 zcmX@bvXf1dJq!#Jn7RA;K->uo3@r@& zQ~4PhKn#W*3=F#%7&^cR$N-`~2CWNfdY9BzUR}B7#u|{8CkzZP7#LnLFuY-4_`|^P zkAd+&BlCY|>D$t>w`FZk*(B{rsyR?oKjqAnc~|BwxVC`l0Ta^`rq1J?49gf8R)Gx# zy5Im1u`(QCU^vIXaEXE83IoF}28MeK438KXo`Fq&$H4G`fnyI3&nf}l*}Qyn`1n@v zNnVwdye=tqN=oXCl-w*i`MvTAQxp_-DJU&dQd*;=wm?mNp_cVYYoH?>>km6R9dYv5 z<>9f%!)Jq!&laEL-N`9?QnHriWbMexUY?V^GrMqWVbPAF+Jm)qhwA?S|9^`+F&7wU z+9g4L!3>OyEW#p^k|yQ}Nd?6_cbz%=?fds1KYso~0l)wJ`}gnagS|liFfb;0ySu~} zUkua*awd4zyEukOTux4CV7OLb#wPOM?Yo9U+xfp;+2;6&+m*fQ#Vg4JKmSAt{yXQU zcC6`4f}Zg7sGJq+7tdVU%Elkj;OrCX8tEArh?_U0HWX%$~(%aJZ!NILpqL(ozaDlf@q`O;%}6+SI>VcU7p)#5XtY b0z-R4uP`Hz*P2g2*D-jy`njxgN@xNAebw6y diff --git a/data/themes/default/autoscroll_off.png b/data/themes/default/autoscroll_off.png index c0a4f37c84bec44cf6a1a61d18dcb3cbab5c3972..a2d56e672db983c3b89cccaec32ed4a8cf4e013a 100644 GIT binary patch delta 499 zcmVB%z4TfCiU@AZMHzXPoo4Nx3pwF76^a@WA1mhu{00^KuR& zBHZNQH%j}zfR5ulImO3LZHjH%p8;GMW1bC%L;slX$>lZ zF&9MiEe9l`Q5?s&<2Yv5yL&DDtxBaL7K_Cu2!gNE>1^~8z#AgEI@o2#*j)fm0pw`_ z8jZ$F&Uqz@qED{tzW)vTo--2BNoqEmU#ivWM*uGX+&Sixxe7-{9LKLb&*K0ti0H>L p-^p*8F;)hU5Yf*+`u_PJ`xnC@3Xo*WPE-H@002ovPDHLkV1lg+^34DM delta 524 zcmV+n0`vXX1n&fpZh!1aL_t(Ijop;bs}fNZ$G_*!)tqr`X5lU?kb3CoE`&Dif_^~I z|I%L)1VKEgMZ34CMVnp_wUEG_l?Z|h-KgU*x^Nsv=XzQxhWa#c)fc{;&6f}7o^v_G z%s8dQNooHABqBN~uv99&DVNK4P6h<-Q5RlNh$B@x(?Gc zVVWk=>GZl9h5=pIp=lasvl*(@su~OilQ@o_G@H#IJ7*|_Kq{45Ti12yx(>rIV45Z@ z%YtDTNG6l0RDUX3Hk-AC5a09p{OuJ(ZUUv0NF)-FQbI}zP17KR01-hcg~?=sIF1p9 zA=>RWT-RN?u6yBm-Wh<-7I0I{45btniv_0BDdzJzm>F>#qtof2)oQ8XaQNQyyh{LI zcXhaoq9`5?hfCl0*PX2@5s6$bCxam1ZnwJ}3RN+y$0}X)yOU%4YVxl9)QP(a_c7_5)oZv=ICJV|2eS7>JOn}=9A zF+Kr7277^iT&Q0=<$BG}`su;Ts71M=s@JCjgMGpA`6atpBgs;Hmf|Z3KBV|8!H0zE z;X0vSqy1!^*DFt>#<;45o>$d;2y{Qu>lx{h1wyq#s8tBn3h7`C)r@pch8Tl8caX3+ zXV))1I-7skYJZBzX;ppyTMwrw9qX#90c_%HnH?x{ u0oV)NQPrpi_jdl!PSke{M<0OA~jdqvY5qE4LQ&PJMI5TKSBb zt@Rfs{*x|GoQ|dr5ocABtV)tqNU|z%Rv}I+gw+@yc-rfme7^mn__?&&w03dD%wBed zJ3?{Z6DBcHWq+%x2~nC5rxlWsD(QGelqLitF~{#;^4YngDNYNL&UYQbPNBnx9v^yK z=y8EV&ViuJ3z{1ZicU_u(c=4Tjg6(%lG0{@@xDTwK*9hkjWRFE+a2@^@>U0cqLWj9 zw#>J??+PpIDKH1j_Y0+_vFM~5jY@fka}GHnCy+x9cX!~%WYGGuZa?n5FRidAz`U6) z^bbY43S8?Qm@P1L7osx~8ZhG5`Po07*qoM6N<$f~phk AV*mgE diff --git a/data/themes/default/back_to_start.png b/data/themes/default/back_to_start.png index 5eb2c12bc8f5e20ca5f021a6295ee57d2a49e947..d8b8b73fed3e22574bec0102b0df665cbd7478b4 100644 GIT binary patch delta 195 zcmV;!06hP%1*ig$ZGQlzNkluBv=3d002ovPDHLkV1gotR%QSI delta 589 zcmV-T0+R*62g+!|0LI@N@ zQ7W$7xhlF5^lxzEPDI6(;;Z07MG$FmC4%5aTRCx5h=tEWamQTgRZJV9e)F=fjSCf6siVv3{(}y z7^tgY$u42Jc9L~|-5>}6nbUitgHyW`j@^ROXu+|Y?eUkoy=LmpcHUchEh76!t^k0n zyDTC*V};CpSdylyrAklk86#Ol~V2f@^t`>o{Rx% z0Om+G0Y-QRt!HR7J{=f}z5{TobN+9#3+%Rg6994~ANP2}?)|^}U_~TMve%Y37yOs# b`+xWoUxJh;4dzEp00000NkvXXu0mjfYb6r0 diff --git a/data/themes/default/back_to_zero.png b/data/themes/default/back_to_zero.png index b89c2107a338e7b73aeaf03d3e62c7b54c18c1a0..dfde88b4e588a087df4886ee1042502f3d7a2119 100644 GIT binary patch delta 217 zcmV;~04D$31HJ-~ZGQl}Nkl4CEccJ(r@49&CX1Ag(O1e6x8-RLTfFpwLymYotBL;nK9<(!=pV> zS(fR#uC0jFuCp%g6joIgEz42^XaS^0_>-_GiVMjrfXr3w6;l8FQl@F@lO)LjGyvwK z+E;XwylTiY|&EC@zYti)*2D zFBVrPhdzWa;3l}ZSseQSE`o?lCqcxvf(j;u_TIF|!BDECCbkv4aF)xtAOD5Jp@?9T z$C#-0XP{vi+P3Xi!!Yzjz+^J%mdj7h;VU1$((pS2r8NBecXTfv3qQ@_C^Nd-Pw07G|5ilaNbcPg&adVV zHnX)-l0;Bo78+OGiWi000000Qp0^e~~d5e+P6)O+^RZ0T~V)AC+*M_y7O{ zib+I4R7l6AmCK79RTRd*Td%3=?&_|7&UDX=1|voYqZy;_{0CfU2xvxerAXZP%nVs5 z1QAil!&L-#irF|K>c&KfWZ}k@M8`o!ky*rO_jFZvy>C@l-FsbR6c?rkYwq&GcYYks z_nkw8e-PN~HD6w?n%(*nwQ}{CuIm;Nn51cX#Z7{bx7V)rr)kMvfb!aXN4xF0&u5$M z#b&(;(?JA<8(eeBn@ufMyUUYS~C`wILe^qFT3SCoSmdh|^bVw3F2mv4+Y#!=8 zSf~R4cVt?&6nPgy$!STlMLmv^1kovRm9Ie&I%G`uTLVwCg}6h#4J3^b+i!{84hOV5ibPTA8% zf3;Ib8o9(T2q7K^VC{bI09coa^j2{8hn;Eqy=DOK{Pj`o^zz%SR?8{Rl#c7VUey#e zPqRtM3;fUkfJ;xeIfhS-E4iV3tjA~oG6zSHd_#NjD(N@;^DqIaq#qM$=x{ zmx}ZfE56T1wldtHUNA|P5y;Av&pAv{{qh3%fl9NWYPct002ovPDHLkV1m%W B%P{}| delta 1022 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 LNkvXXu0mjf=a;K< delta 118 zcmdnY-p)8dBABk`C|*ag~ymGyl)H@;~F1|BU|`82?8y{$IlQ{}ki@ z|BRp84(|dgQ}=Xn4B?1Q7Dy2};Ns=Ob?gkAtPJndH>{aCoD0`5>gn+5@i_bFGOTx% VwKO`T7!K6J;OXk;vd$@?2>{`ICD8x? diff --git a/data/themes/default/dont_know.png b/data/themes/default/dont_know.png index 21a0cab6271bbd28319ee1149331667f3e789a6d..3924a91734d13b36b2cd8a841c646d25608c4146 100644 GIT binary patch delta 629 zcmV-*0*d|31-u22Dlq^60002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G` z2i^f04jeE(p{AjcTP%MdNkl$@%}Z2a6o;Sp-f=!0O=lPtDzq$hNCjt+QAm{k zMjNSrpmxzRXj2fh2wFvp+O!BFbm5|0m}G>AmZ+r?79lvP^Lc0Hp7XYt>lD?2mzQ%m z59jM=_-#$WZ~4~@pnx3uA%KaA31YF>r4QrZS1*o_-vWB33NwF|)s>yoz0L9W7v_53 zBz{DzwOZ|Exm>PPDwVJUAR?%0dup`j?xMHWHMud@vbwU91lTMUuRa}F?##zMM^#UV zNC;3Dpnsqr6?Hd5-yU{NIV%LX0Ctqy(KL@Lw3;@K+ef?y38Y@=iy^o5{Rr)f*Khwn(6!l2_>&sP)1S`T9}7;FGG z?if6q8#U+s$KCJz`+d)Lu5eAoPpb7@6-9hOgYN2}Hb81_4c(6<*0S3}e%Rj?5i7o0 z5vk{?G&DI#I-UNXHXXnP;(y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G` z2i6E45F8Gb?CsT&TP%MuNkl$@%S%*o6vscmd&e2C`5N&-X+`2=P-iiOP$E%o z`WJ#WLi?y)v<%wSqD9auXwfPNdM@19LczjZ*i+31ilN{*Iu0{;?%Z>JE#|6F9r*F% z9L|UH`{S$VdIYo|E?o3Th`DztWLBwjg*>8UUhIePm_f9Q()2TbDM~PpF zIkgtGid6+51|TAlfEH2BPR@V6UBA-!wJn?QC9sPI!5T2wBbBRQC{>BUsadPp7`ort zWMR;9-4c;f8`!vEymNiD*+qz8niyt5p;Vg9k?n_B8<4MWiAkpG9OzL_UhhdlBI_aA#)+v$M0z z%+n%LtbbOkKUY^*!OZY|ADK)h>^RO-B2ukqkNoAixjAO$X#k%9M05eb6#(lZ^8L8FKm8gDddz)7J^%m!07*qoM6N<$g2fF`HUIzs delta 744 zcmV8EapjxdGMSl@-9Am9zd3o8atgM(Y4BvCk-4l^#?*vrUt1t{7o}Qi(MG;XH(QGzJ zl7#8$Y1Y@*&EVi*CJ2Ia5qbG84)NaKD-;SEMG=iggE)@=h7Jr2u(q~lGnq`Ei0q5V z`ywL$1^lj1D6~2bJJCB(fcg1(SzKH+VHmDjYmY=^pno$T+~WH1^77KvYBf@+6e5DE z(r&kjqKHbRLb+U~R4RE@74Q8^z@CWAsOrPpfIk4fR4N7IVghUJnut8tJ$NfnRbi{ZYrwa_zN&tqs=s;f-#j=tXkTAn z)8F4O-uq{Ok43~iHgZ?=v70?>?bjlr#+Vq`13my|JOA?6;GHERgTP0?&p-|M9yn6f a7~oGsjX*uWh6P;!0000`3f=)34j&V@>x2-INi2VvNklFP4rMZxGQta^gy#d!Gl0R$a(CGI8Cid?LkOF__a1-&P&ba5jWJs5vs=T*hu!|u(bdmU2th=K zVQAYnj$;ELU#_aiDAHj}KQg^G(P_5wWr%773gX3wetKos04U3HBVOJZeVboO4(pS- z<)h-_$r^x&5YZM5o`nFC!3w8JSAkPCSoVPtL=jl9b@hRTz!%hdPpN;>tL30-UhkR2 zigFSt&|j39L#Fe2Qrt~ufeV&%68qjGyQjX)?B| P00000NkvXXu0mjf2wmJ` delta 480 zcmV<60U!Rg1fm3xBqa%ONLh0L01FcU01FcV0GgZ_00007bV*G`2h;}!5-uN0odlAR zTP%N=Nkl%OcKZvKVbz~8+(OxTVz47)50H+AL7rk5(H5! z6x7Cc5iHk@F`byqOfq+7GWXnLk!-(D`##MBFK}%Lz-%__^?Gp}8)JwF01>IGs)|U{ zG-X*j=L`Vvy%%8-0Ih9T0(kMa@6=}!gn+8B$6i|S4bAPj# zE|T-)a(XF0q(2`JR24)xsKE;efVQ@kRJdSC#ouT}JQM^d0Kfo{APSWvG`H)hh@yWr zN1Ld=Rd;O?IVR}dH2_2;q#>JT`DuRidX#=k`CpVh%}~+_>yWyK*`XQx)R0A6AEILrlUgqVK(w^I6 zb8G;NUyaF;{b{ufa%fQGl)Ov$mjN)q7mPJNR9J=Wm(Ob*RTRfRckaD2uh=4J(xz$CU#4whf7)WZv@R@I zsbDw$2^JU0MsVr>P@z8r7ZyQuA*d^{QUwtg7J?155Zh>Ln*J0@e0gu~PZxJ)k~BWS zBJHLJh8gagd(QWM&-a`&PsA8`oR&S-=uZGV0RV{pHG_W-T?R_$*POHO-MKmQQGCd9 zQUHfvf3xQcS}BxLNF|Y3hLjmXWC$Vn^WNXa0`O0k=bBt= zv`zq&Qb?IVWLX06^s1H2ZrdK)?YXzx?fX9qA@2WIB9;MAN|NU}MV==Bxkf96u34x+ z2q6Gi-M@cY4Gs<+8yHx3EQG+0-TU$0NJ&<)P+JIr5CYD7oO4*~FxFy>#TY|r3}uc#6gjO{L8~Y#AO%IP6A-PdR7ii6l!z=t01=2y@C3kEi#Dc8+d|3! zB9Y;dUE=!m)Is1S1t4XXXfJY#yr3uwS{0ZCBB#hTx@JO3+U+(%2v)6J*__^5hqV@E zl3ub3BnV=J7$YG@LI}hdGhmwn(5lL_*5tXS$aTX&t0-u-YG4|fNzR}98X+pd3&|^o zUnPG;FxF6(icBs#af~T&2>6g#@=Djl%ZdTHK(CT0U4hXRn7m*`t6=h%39d|CW_)~% z(a})=E?v6JiT6*iePjoF_U}G9O@0>pO=T>WmZ1;=1f-il zh;+@j+kEx;r^MhmbLI?veSJOa`L!cQIC$UyZyi65RGK44-yoB^@s<2i#aRH5)p;V4 zghFiccJJO@cJAKCGyMZhPEIzP=H})Y8yjbAe4M$txn_NGa*{Oz>)5;R0C(@)Y5af0 z7%RV2aTc1DN_8CZl}NnzNi5#8c5po_S_M+dC8xb`;Q~ANynv{l4;?zx{I+q^7Pf95 zrQ7Y&>6W<4U+ve2KnM>2@KpnGPNiD54l8X_O2(OGly|#b1Y+5`F_zMll*VGL#oE*f zQ;$e-y!T51SZ9$=qO3(`vS}Q3u1tSvnV6VpHcd=S(6tdE#Ip6$lyo{})&0uU0Zr

^D{SZ5z(AYhCks|6zt4>;$@wPtW=E*t~2OwA+94J!gTn z3q4>7003hxA%-MKA8^iNox>>Ga~jrwebsb)wZ}S#t#nYDbaLlB51JA}IOm*FDq%@N z>7=QqHQM(69%zP9(`v&aK`)((y-Z1^zPNJv;<4e;T|&wQLQEx`fBPa5f@a9Xm{{{6 z;48IT=XwTi0C>}R_uBNY>wi3-o_diqp&qH#iF_7#85jm+@7Mo#b0WrA3o2U#=#iOt e^5^t%1Na*j2+-Z_M}~X=0000>SJxiXFw zC=4jD0kxd1R)KTW=els$b z=x{jj8G{lmmu=u~Vb8X)hH))t1I5FJ30=PsVZ4G{=j@F$5Oos5L+XgSV$@c})zppZ z8Ygskf~#a0%<7S3c1!b~T5{Otwkdsj&(V*ah76{JKBXhKs^S`C6ur!jo7gZ;Y zZ;~fb{?eo|O_}|cUmjbF2CZcyVAYtdmIpQR?QL@~V-e|HK_9Q9gIid)$Wg$OMc0cH zn&rvu_$p&&pE>uDrC`8Z!nOSN+*&;W(s;IqvxX+Vt!)nKd}S|W%et1JR-U$Z6~gn_ z1~Hi~ztyfz=}_Nc8Z!ETY!(H`VFCBqKpsny{{$%Dm=FN$HxiWFXz!J>UwB!}1K@WuhWseu1c zz^|3?mJ;4pAvKsyG) znC%z`gg9W-fuIf)b6^<$U>qqPpL*ff9+?w;BZlDQb|#1z9u*g#ka{n#yoy>&qtWOs ztsRUm4tI2Rc6Ryo_Kr;PKPgQV;6Iry7ONGs*&rA>93zbq2u^XNu#nh`Udt~cBI1(I z6-&V%3iL&jA9>fGJQeQdO#)OG0@aRF*H5=y%@p;&*DUuPR|}`6YsF`YM}cV~U}oCm z{DdsZw$)o-F|f1B(yi6l?4Lm+9RZqzHF!a?8(0hD#T61k5a9jpr1&zbps}2)Z-7 zq{*)y%%>PDz24{E&gk8ZAG$S^Ym$~FRVqo|T-_M6y zOb?7qqjZ*qdoI?*1iq+>{WA4iR@U0ha}-jK@9%5TSKA*HxYvE>lfWLp3qDo8$zyIk zq6T6x+s`fdc1-Z)fS`*Zo&ncpO5Y9fbPw_l*c7_2@?#i1uJiusML%_LR($8teg0P; oP=`KK)9yB5@_6|@S4W9>ou3p+Ze(3Q{8*ei9*|XQNDI_Eh1B|1k%?L0M0MJ)T4Q(ScbN~PV07*qoM6N<$g3DW4 Ang9R* delta 310 zcmV-60m=TW0-6JmZGQn5NklQSB279gi?qIm zm9L?XAlUm579t1+i?kNjiYQiMlXLHO=C=?r+#RBFpn^Xv3sZbMv+N2<)R~}G?H~L( zP(a0_KX-HUS3K{r~^~07*qo IM6N<$f{XQwX8-^I diff --git a/data/themes/default/lfo_d100_active.png b/data/themes/default/lfo_d100_active.png index f2a05b55542f62b2944cbfa7c620b2d18fbf5078..bb966c5799704715aabd359969f984b5ac1594eb 100644 GIT binary patch delta 617 zcmV-v0+#*41;hoABo78+OGiWi000000Qp0^e~}>`3f=)34j&a>h#@7BNi2UTNklX?Gs&yrUh>4)A|W0a#yOFBXfQ=V`5# zQUH`vA|fJ(_l|NRa$Wa09FKp;aU3T}q5)WIiHL{};xjw0d%%fEM23>t_0KrML8wa`01c_MvU+3AZ1H4ozyJo9P|P*3;M9WmZ^8Y2B7>QHdWQRSE+9f zrVGN%mI(lR3Pw_9Ntu5OY8nE7VJ;|Pn&=v1cGs%YLi5jdbGl3xfEqJvFj;ZojAR;) zQ$vcKk&I0`(IukGt6Ko*tgAy75z2Liuq6hdyQ!%=L}YxeyXHig_3Na*ne9An_U}~a zr~wc`c0ThdN?N7hVI#RwEPRPif>9PSsjs#G;PkE9ONj_dAWA_&1PTE2BtdDTW3Cj2 zcWblX;?hQkh;y*K8BG2cfM&CKy2GK}ZtHA2^||v80H(AOAcuKD00000NkvXXu0mjf D`OF(i delta 641 zcmV-{0)G9(1;Pc8Bqa%ONLh0L01FcU01FcV0GgZ_00007bV*G`2iOJ|3@QhRA`Xj@ zTP%M#NklL&ny*Y@^&=Q=#WQW){%Bsclx+%Mn#PI7_&QwG5L`g*Zg z48t%80%HsSV~lgoIrnewGAHT#{#DrRc3Xd~R+^>(01*+=Cok@2byfF*lXT8qg%lAH z00Dqzt0|ORkn??i;5p87+po4~zt66GS^>~0c6Qcw>UZkZU)9wQtNAoP0Bi4S+SD)% zeE`!_)9p^Xm8Q*RlJxb_!=r;I2g!6Yd^DWf%O%a^@bO`^9L?;^M9WdqNy6Q50JeW@ zI<#LX7K;IZ)3Y-;0QmXl$Hd3U^5=49_V<3wW&AP*Q2J7`V>Wsbjc--^Q&xYcR07aYVIfM_gAQGS0AQg7Ri5iwYfsir`h_a* zDwnpWN)Z62Yt&aIov&WU>xZ^y>Cx+W-Cpn9uW)DbqCo=H}*Z_H(G!YC(3~ b_`mZ9z5CBO4@w)%00000NkvXXu0mjfO5!eZ diff --git a/data/themes/default/lfo_x100_active.png b/data/themes/default/lfo_x100_active.png index 479ff38c1217185fe0545fb99e2db91f6e40e697..cb563f432ed383d073f33b70eed6a6be816aa244 100644 GIT binary patch delta 682 zcmV;b0#*Hj280HXBo78+OGiWi000000Qp0^e~}>`3f=)34j&vRRGER1Ni2V8NklY@}h;U?s9b6+|4%p4at^pSK~KL*b5W9B=YfiuAWkp^I4VZpX-%d$+< z)HDr%rfEtkrPO}iVNOJbVGMu5Znx|Eeh>sE04XIA5z$_MqCww1PDDznK}bYWN&p4` zZE5P$qN|!Bvn{tzyKf#;{5Z`0mQfUiarAnr+AxFMrVPWdX#^i`JD=z4JCj~q znd`gB_!1&YhUvsCDOG=o#kkoAEr-Oonao!QAemTD_GsRf%Qxr2}1SE|!Rh zNhU?iy*o0?m7!lj=SJSz^fSwqL708v^!^usa=CoG%VBPA&PDfKUJzY~#R7zckbj^k>z8it_>KuRfz45DUz;~nhVbRtqp z9Ym5+N(sOKpgqxM9?htt>iE*JacX1g@l>^5^*(!16xBp+^66yJDtc>PtyU}PrRh7< zvm>*c+0D#KroLTo!Sr%EF2{yp7yt%&uyCp1XMOLTw|H-n+j!u`K($m|zqr11eJOwF z3EJ1&t$8ch306i{^27P;hira0A4GvYXSZNggoyjLe$$t`C1u3<#HuXMNHHT0E(HU zBq_C6V}qGU8LUV8UKDjfI_Z%f*Xz6UO8R}bNG^50>{OQW?{7&-lKut&R*HX^C9|2g zL`Fy=(Jjopc_{9g*AwMiWoOlK-@1vpL~u2TPuG};N$$?8ND`Aw%sF8$^v4R}`OsN# z4#7_jHTzZ`RFtFKahFKCuU+UUJ}eOtNopji#(s(2iH^3_w%}%9ui5Uajze(5ZIoyL odV711_BiBnIkWK{`Q7;g*IN=8K-RZ(RsaA107*qoM6N<$f|*K4umAu6 diff --git a/data/themes/default/lfo_x1_active.png b/data/themes/default/lfo_x1_active.png index 3a44b3e2882df84edba6cf62efab226fa9b0cbfb..2c54a6ab1d727e50cb3ef7d162b6f8d530c774a5 100644 GIT binary patch delta 575 zcmV-F0>J&81(^kqBo78+OGiWi000000Qp0^e~}>`3f=)34j&rMH$1eFNh^N={YgYY zR5;7El+SAuK@`WoGdtPZY&K*`&B22PL`3jnQD{ycs^CdM#FK~;Jct+n8&7&EC?150 z6-2><;K4&dY4Kc?)|!Nx&5zw?citNh6Sr$}Fo*gWnBl{FZ{DvN;QxpK&}=q6&vRW@ zDJ6seAcQc+7-J6f{^msFIL?1G9F0c9;V_CK1wd;}L`0O?TbcHoaUwFtOhY2lS_4o3 zzBKw@uZHK>if2B}Z=X)z-|C(HFn{h{5rA>9`mlRq!(Dt^%%{oBQp$@5}P%1v#k5!Jxmh8_rTzqm6&&R z$Jzim_2379jn~Jm&Oe<><=AckkN`9jC**&O0C?*$@9UH~TefhTNi*fSB^k7L8)CyW z?pu;1D68(35`b{I6s&)=3vHTc2$Ke2AaWBro)!y7e=O`=NqgG68IbQ(AGJ(DbZ%EE zCjg9LO{|IY+>!~HnJ55BMRc!Mj%>#M^G>u_>|ZYX&)V)*lIzAeidp0!-tcbC%t`<8 zF0uAkT9D$`y&4fQX{*FpOsq3*&yz5FUjXX$`r&>KjYdP+?a&who!@VJqZdyPmPG&n N002ovPDHLkV1fc*6KVhe delta 604 zcmV-i0;Bzz1)K$tBqa%ONLh0L01FcU01FcV0GgZ_00007bV*G`2iOJ|3@RWkD7)a1 zTPuG85=lfsR5;7Eluv6DQ540`>&&EubZTO(i-J(8pFj}F%7uS$DIzXKsp22}KCZe^ zuoYZMUE~9}tQ3s93TiddCQcKY%uJ^D-0Nb}F(o1{>fyrU{dn(k-o5WV;Qz=0SYBQ( zm&>J6$@hKd902E>nVH$|bw@c#&+{hXa5#S)31Mq-w?4OVcOw`Cwb!*)+}ggfy>nrwU+wq%{nn4xzm!#JwAMVg@(SD>H+080A%A zrE#KtV>h}Q1-n6Yy{bY0=bkPBXufU2EGK`L=T89;A%H0WRBEQ-yAVM6eOXf#Wf1_> zluC|4QSvZ~WfWDak^p=FS(dpF-Rpl{0KLn-lh3PuCm1(ksuanu#Td2Xt^mk5I*_pN zEBtvoV#wOFng!Or(-EO?6adtWs-im1sX7UT9P?Yrx;MKsA7;W=VSGN`zqUWO76zY7 zfaMRz)F_0r!>43`!)SIC0xbOY?)7ZO!j+Je@I{CzMECc|+!X;>USBG62}vwc`3f=)34j&xS-g|4UI$8`95sj9PvNCgwv1yvNZ7qOO3Nte^ zfW;oac{+!o!{_6jnK|D}DFA;gfOXq2v$Yn!`n{izZq$syXKng7@A6IIB-r z&Kjz^tLEz+yZ2g7?pCvT=zfWiXwf2Ra(UkZST2_U#MAnQ3t`~CgnWB2pD)5J0Z>&U z+Ne@k3EjA=54U$;t*S06WjHI@s30z0b*HzEF#iI3`uCj*A8c;NG=cEX#*|R^Ix=6lJ5viCH`u z4qu*`?;W3a1@`Y*B(EQhl=aewa1o%9=|?9qLkR##(UN delta 473 zcmV;~0Ve*d1e*kqBqa%ONLh0L01FcU01FcV0GgZ_00007bV*G`2h;}!5-c7LtX77R zTP%N(Nkly?JFgjv@gmsJ^qO^8%8E6m zmbtF$EXy2#+x4w=))>1#sjr@29eq72UKER>sBZR(lte|^@%XU=uqjI@w3EVQSJ$=w z>Dy=Ra=EO2R|HiB5e{l%0U3?BJOO||@~Qa$S4_xM P00000NkvXXu0mjf{lL_4 diff --git a/data/themes/default/note.png b/data/themes/default/note.png index f81425daed4eb550016c7efff9a545f72db8ad77..9e80341e097163d742a9dad0630f012c7c97434e 100644 GIT binary patch delta 951 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⁣a#{>6Il6otzJ;Fa}aPEpgmIWD=& p?d3JT_yW1djfa1c_rLwq{sf&gyIPu@{F(p&002ovPDHLkV1f>JLE-=a delta 1193 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 I0vk5`KlMQgh5!Hn literal 34254 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 diff --git a/src/gui/about_dialog.cpp b/src/gui/about_dialog.cpp index cd9cca16c..94b6fb217 100644 --- a/src/gui/about_dialog.cpp +++ b/src/gui/about_dialog.cpp @@ -67,7 +67,7 @@ aboutDialog::aboutDialog() : { setupUi( this ); - iconLabel->setPixmap( embed::getIconPixmap( "icon" ) ); + iconLabel->setPixmap( embed::getIconPixmap( "icon", 64, 64 ) ); versionLabel->setText( versionLabel->text(). arg( LMMS_VERSION ). From bc4b83f4436c39d39d61a9f97d226204dc0a02d1 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 27 Jan 2014 00:29:16 +0100 Subject: [PATCH 100/110] LADSPA/CMT: fixed global initialization on Win32 Global initialization happens via a global startup/shutdown handler instance. For some reason this does not work properly when building a DLL file, therefore create this startup/shutdown handler instance as a static variable in ladspa_descriptor(). Furthermore marked ladspa_descriptor as extern-C. --- plugins/ladspa_effect/cmt/src/init.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/plugins/ladspa_effect/cmt/src/init.cpp b/plugins/ladspa_effect/cmt/src/init.cpp index 76a7b2634..f232840fa 100644 --- a/plugins/ladspa_effect/cmt/src/init.cpp +++ b/plugins/ladspa_effect/cmt/src/init.cpp @@ -108,18 +108,26 @@ public: finalise_modules(); } -} g_oStartupShutdownHandler; +} ; /*****************************************************************************/ +extern "C" +{ + const LADSPA_Descriptor * ladspa_descriptor(unsigned long Index) { + + static StartupShutdownHandler handler; + if (Index < g_lPluginCount) return g_ppsRegisteredDescriptors[Index]; else return NULL; } +}; + /*****************************************************************************/ /* EOF */ From f2c4d144c806e5c3d40647859c4e728e49ddcb0b Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 27 Jan 2014 00:34:55 +0100 Subject: [PATCH 101/110] FxMixerView: set minimum width for EffectRackView The EffectRackView was a little bit too small in Win32 build, therefore explicitely set minimum width. --- src/gui/FxMixerView.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gui/FxMixerView.cpp b/src/gui/FxMixerView.cpp index 02d5fb178..2ff35c9a0 100644 --- a/src/gui/FxMixerView.cpp +++ b/src/gui/FxMixerView.cpp @@ -209,6 +209,8 @@ FxMixerView::FxMixerView() : cv->m_rackView = new EffectRackView( &m->m_fxChannels[i]->m_fxChain, this ); + cv->m_rackView->setMinimumWidth( 244 ); + m_fxRacksLayout->addWidget( cv->m_rackView ); if( i == 0 ) { From 0195bbaf7f4b771fb0260111a49c5d13766394f7 Mon Sep 17 00:00:00 2001 From: Oskar Wallgren Date: Mon, 27 Jan 2014 19:44:04 +0100 Subject: [PATCH 102/110] Removed copyrighted material and moved some files to CoolSongs. Directory Covers removed. --- data/projects/CoolSongs/LICENSES.TXT | 8 +++++++ .../MichaelKuhn-Mondscheinsonate.mmpz | Bin .../Thaledric-AwayFromBoobaloo.mmpz | Bin data/projects/Covers/CapDan-Infinity2010.mmpz | Bin 14782 -> 0 bytes .../projects/Covers/Edo98-FinalCountdown.mmpz | Bin 29222 -> 0 bytes data/projects/Covers/LICENSES.TXT | 20 ------------------ data/projects/Covers/Momo64-Jeeg.mmpz | Bin 44996 -> 0 bytes 7 files changed, 8 insertions(+), 20 deletions(-) rename data/projects/{Covers => CoolSongs}/MichaelKuhn-Mondscheinsonate.mmpz (100%) rename data/projects/{Covers => CoolSongs}/Thaledric-AwayFromBoobaloo.mmpz (100%) delete mode 100644 data/projects/Covers/CapDan-Infinity2010.mmpz delete mode 100644 data/projects/Covers/Edo98-FinalCountdown.mmpz delete mode 100644 data/projects/Covers/LICENSES.TXT delete mode 100644 data/projects/Covers/Momo64-Jeeg.mmpz diff --git a/data/projects/CoolSongs/LICENSES.TXT b/data/projects/CoolSongs/LICENSES.TXT index 94b95d9ed..cf4877625 100644 --- a/data/projects/CoolSongs/LICENSES.TXT +++ b/data/projects/CoolSongs/LICENSES.TXT @@ -22,6 +22,10 @@ - Artistic 2.0 - http://lmms.sourceforge.net/lsp/index.php?action=show&file=581 +* MichaelKuhn-Mondscheinsonate.mmpz + - Artistic 2.0 + - http://lmms.sourceforge.net/lsp/index.php?action=show&file=1581 + * Momo64-esp.mmpz - Artistic 2.0 - http://lmms.sourceforge.net/lsp/index.php?action=show&file=1534 @@ -57,6 +61,10 @@ * TameAnderson-MakeMe.mmpz - Artistic 2.0 - http://lmms.sourceforge.net/lsp/index.php?action=show&file=1060 + +* Thaledric-AwayFromBoobaloo.mmpz + - CC (by-nc-sa) + - http://lmms.sourceforge.net/lsp/index.php?action=show&file=1187 * unfa-Spoken.mmpz - CC (by-nc) diff --git a/data/projects/Covers/MichaelKuhn-Mondscheinsonate.mmpz b/data/projects/CoolSongs/MichaelKuhn-Mondscheinsonate.mmpz similarity index 100% rename from data/projects/Covers/MichaelKuhn-Mondscheinsonate.mmpz rename to data/projects/CoolSongs/MichaelKuhn-Mondscheinsonate.mmpz diff --git a/data/projects/Covers/Thaledric-AwayFromBoobaloo.mmpz b/data/projects/CoolSongs/Thaledric-AwayFromBoobaloo.mmpz similarity index 100% rename from data/projects/Covers/Thaledric-AwayFromBoobaloo.mmpz rename to data/projects/CoolSongs/Thaledric-AwayFromBoobaloo.mmpz diff --git a/data/projects/Covers/CapDan-Infinity2010.mmpz b/data/projects/Covers/CapDan-Infinity2010.mmpz deleted file mode 100644 index 08b8705d9075441f21f2106484ce8e2bb1c9d9fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14782 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 diff --git a/data/projects/Covers/Edo98-FinalCountdown.mmpz b/data/projects/Covers/Edo98-FinalCountdown.mmpz deleted file mode 100644 index 61d5856e818543c66f3f3cfe7a1454cd09b24460..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29222 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 IjeOnwe}2=g@&Et; diff --git a/data/projects/Covers/LICENSES.TXT b/data/projects/Covers/LICENSES.TXT deleted file mode 100644 index 066f1e881..000000000 --- a/data/projects/Covers/LICENSES.TXT +++ /dev/null @@ -1,20 +0,0 @@ -* CapDan-Infinity2010.mmpz - - Artistic 2.0 - - http://lmms.sourceforge.net/lsp/index.php?action=show&file=990 - -* Edo98-FinalCountdown.mmpz - - CC (by) - - http://lmms.sourceforge.net/lsp/index.php?action=show&file=1198 - -* MichaelKuhn-Mondscheinsonate.mmpz - - Artistic 2.0 - - http://lmms.sourceforge.net/lsp/index.php?action=show&file=1581 - -* Momo64-Jeeg.mmpz - - Artistic 2.0 - - http://lmms.sourceforge.net/lsp/index.php?action=show&file=1380 - -* Thaledric-AwayFromBoobaloo.mmpz - - CC (by-nc-sa) - - http://lmms.sourceforge.net/lsp/index.php?action=show&file=1187 - diff --git a/data/projects/Covers/Momo64-Jeeg.mmpz b/data/projects/Covers/Momo64-Jeeg.mmpz deleted file mode 100644 index c76c8ee3265cd30eb58a36118135fa37afde649d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44996 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 zΠDm1_Fk+rvDUeXch9==5ZcXl>2Esm3=4TawM6@qE=wva$&L(%bY3CBTd Date: Mon, 27 Jan 2014 21:12:54 +0200 Subject: [PATCH 103/110] Added LGPL text, as needed by the OPL2 emulator used in OpulenZ --- COPYING.LESSER | 502 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 502 insertions(+) create mode 100644 COPYING.LESSER diff --git a/COPYING.LESSER b/COPYING.LESSER new file mode 100644 index 000000000..4362b4915 --- /dev/null +++ b/COPYING.LESSER @@ -0,0 +1,502 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! From b8149c1d88a3517594c6acc604e99d3867272bea Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Tue, 28 Jan 2014 00:26:29 +0100 Subject: [PATCH 104/110] EffectView: fix crash when removing dummy effect plugin If a certain effect plugin fails to load a dummy plugin is inserted instead which has no sub window and thus caused a crash in EffectView destructor. --- src/gui/widgets/EffectView.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/gui/widgets/EffectView.cpp b/src/gui/widgets/EffectView.cpp index 9b6b8cc05..d61adc966 100644 --- a/src/gui/widgets/EffectView.cpp +++ b/src/gui/widgets/EffectView.cpp @@ -158,8 +158,11 @@ EffectView::~EffectView() delete m_subWindow; #else - // otherwise on win32 build VST GUI can get lost - m_subWindow->hide(); + if( m_subWindow ) + { + // otherwise on win32 build VST GUI can get lost + m_subWindow->hide(); + } #endif } From 8fba1968978223a144a86e392488f61c209e655b Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Tue, 28 Jan 2014 00:27:59 +0100 Subject: [PATCH 105/110] CMakeLists: removed deprecated win32-pkg target We've been using CPack for ages so there's really no need for the old win32-pkg target. --- CMakeLists.txt | 33 --------------------------------- 1 file changed, 33 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 196cfee9d..b097bf538 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -527,39 +527,6 @@ ADD_CUSTOM_TARGET(dist COMMAND tar cjf lmms-${VERSION}.tar.bz2 ${TMP} COMMAND rm -rf ${TMP}) -# -# add win32-pkg-target (deprecated - use "package" target instead) -# -ADD_CUSTOM_TARGET(win32-pkg - COMMAND mkdir -p tmp/lmms/data - COMMAND mkdir -p tmp/lmms/plugins/ladspa/ - COMMAND cp lmms.exe tmp/lmms - COMMAND find plugins/ -maxdepth 2 -name '*.dll' -exec cp '{}' tmp/lmms/plugins/ "';'" - COMMAND rm tmp/lmms/plugins/caps.dll - COMMAND rm tmp/lmms/plugins/tap*.dll - COMMAND cp plugins/ladspa_effect/caps/caps.dll tmp/lmms/plugins/ladspa/ - COMMAND cp plugins/ladspa_effect/tap/tap*.dll tmp/lmms/plugins/ladspa/ - COMMAND cd data && make DESTDIR=${CMAKE_BINARY_DIR}/tmp/lmms/ install - COMMAND mv tmp/lmms/opt/mingw32/share/lmms/* tmp/lmms/data/ && rm -rf tmp/lmms/opt - COMMAND cp /opt/mingw32/bin/QtCore4.dll tmp/lmms - COMMAND cp /opt/mingw32/bin/QtGui4.dll tmp/lmms - COMMAND cp /opt/mingw32/bin/QtXml4.dll tmp/lmms - COMMAND cp /opt/mingw32/bin/libz.dll tmp/lmms - COMMAND cp /opt/mingw32/bin/libsndfile-1.dll tmp/lmms - COMMAND cp /opt/mingw32/bin/libvorbis*.dll tmp/lmms - COMMAND cp /opt/mingw32/bin/libogg-0.dll tmp/lmms - COMMAND cp /opt/mingw32/bin/libfluidsynth-1.dll tmp/lmms - COMMAND cp /opt/mingw32/bin/libfftw3f-3.dll tmp/lmms - COMMAND cp /opt/mingw32/bin/SDL.dll tmp/lmms - COMMAND cp /opt/mingw32/i586-mingw32/bin/mingwm10.dll tmp/lmms - COMMAND cp -L ${CMAKE_SOURCE_DIR}/COPYING tmp/lmms/LICENSE.TXT - COMMAND cp -L ${CMAKE_SOURCE_DIR}/README tmp/lmms/README.TXT - COMMAND ${STRIP} tmp/lmms/lmms.exe tmp/lmms/plugins/*.dll tmp/lmms/plugins/ladspa/*.dll - COMMAND mv tmp/lmms tmp/lmms-${VERSION} - COMMAND cd tmp && zip -r -9 ../lmms-${VERSION}-bin-win32.zip lmms-${VERSION}/* - COMMAND rm -rf tmp -) - SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${LMMS_ER_H} ${lmms_MOC_out} ${lmms_UI_out} lmmsconfig.h lmms.1.gz") From ec71c0881626195d236f38fd4d22cf66eea8cacb Mon Sep 17 00:00:00 2001 From: Wong Cho Ching Date: Tue, 28 Jan 2014 11:21:46 +0800 Subject: [PATCH 106/110] Reduced CPU usage --- plugins/sfxr/sfxr.cpp | 6 +++--- plugins/sfxr/sfxr.h | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/plugins/sfxr/sfxr.cpp b/plugins/sfxr/sfxr.cpp index ab1132197..66f9b58a1 100644 --- a/plugins/sfxr/sfxr.cpp +++ b/plugins/sfxr/sfxr.cpp @@ -23,7 +23,8 @@ * Boston, MA 02110-1301 USA. */ -#include +#include +#include #define rnd(n) (rand()%(n+1)) @@ -447,7 +448,6 @@ QString sfxrInstrument::nodeName() const void sfxrInstrument::playNote( notePlayHandle * _n, sampleFrame * _working_buffer ) { - m_synthMutex.lock(); fpp_t frameNum = _n->framesLeftForCurrentPeriod(); if ( _n->totalFramesPlayed() == 0 ) { @@ -456,6 +456,7 @@ void sfxrInstrument::playNote( notePlayHandle * _n, sampleFrame * _working_buffe else if( static_cast(_n->m_pluginData)->isPlaying() == false ) { _n->noteOff(); + return; } fpp_t pitchedFrameNum = (_n->frequency()/BaseFreq)*frameNum; @@ -470,7 +471,6 @@ void sfxrInstrument::playNote( notePlayHandle * _n, sampleFrame * _working_buffe } delete[] pitchedBuffer; - m_synthMutex.unlock(); instrumentTrack()->processAudioBuffer( _working_buffer, frameNum, NULL ); } diff --git a/plugins/sfxr/sfxr.h b/plugins/sfxr/sfxr.h index 2d9934219..20250db70 100644 --- a/plugins/sfxr/sfxr.h +++ b/plugins/sfxr/sfxr.h @@ -184,7 +184,6 @@ public: private: - QMutex m_synthMutex; SfxrZeroToOneFloatModel m_attModel; SfxrZeroToOneFloatModel m_holdModel; SfxrZeroToOneFloatModel m_susModel; From a36f59ab350152b601ef9a811d7b8483c03e7b13 Mon Sep 17 00:00:00 2001 From: "Raine M. Ekman" Date: Tue, 28 Jan 2014 20:39:03 +0200 Subject: [PATCH 107/110] Moved LGPL to OpulenZ source dir, added presets. --- data/presets/OpulenZ/Bagpipe.xpf | 29 +++++++++++++++++++ data/presets/OpulenZ/Bells.xpf | 21 ++++++++++++++ data/presets/OpulenZ/Brass.xpf | 21 ++++++++++++++ data/presets/OpulenZ/Bubbly_days.xpf | 21 ++++++++++++++ data/presets/OpulenZ/Cheesy_synth.xpf | 21 ++++++++++++++ data/presets/OpulenZ/Clarinet.xpf | 21 ++++++++++++++ data/presets/OpulenZ/Combo_organ.xpf | 29 +++++++++++++++++++ data/presets/OpulenZ/Epiano.xpf | 21 ++++++++++++++ data/presets/OpulenZ/Funky.xpf | 29 +++++++++++++++++++ data/presets/OpulenZ/Halo_pad.xpf | 21 ++++++++++++++ data/presets/OpulenZ/Harp.xpf | 29 +++++++++++++++++++ data/presets/OpulenZ/Organ_leslie.xpf | 29 +++++++++++++++++++ data/presets/OpulenZ/Pad.xpf | 21 ++++++++++++++ data/presets/OpulenZ/Square.xpf | 29 +++++++++++++++++++ data/presets/OpulenZ/Vibraphone.xpf | 21 ++++++++++++++ COPYING.LESSER => plugins/opl2/COPYING.LESSER | 0 16 files changed, 363 insertions(+) create mode 100644 data/presets/OpulenZ/Bagpipe.xpf create mode 100644 data/presets/OpulenZ/Bells.xpf create mode 100644 data/presets/OpulenZ/Brass.xpf create mode 100644 data/presets/OpulenZ/Bubbly_days.xpf create mode 100644 data/presets/OpulenZ/Cheesy_synth.xpf create mode 100644 data/presets/OpulenZ/Clarinet.xpf create mode 100644 data/presets/OpulenZ/Combo_organ.xpf create mode 100644 data/presets/OpulenZ/Epiano.xpf create mode 100644 data/presets/OpulenZ/Funky.xpf create mode 100644 data/presets/OpulenZ/Halo_pad.xpf create mode 100644 data/presets/OpulenZ/Harp.xpf create mode 100644 data/presets/OpulenZ/Organ_leslie.xpf create mode 100644 data/presets/OpulenZ/Pad.xpf create mode 100644 data/presets/OpulenZ/Square.xpf create mode 100644 data/presets/OpulenZ/Vibraphone.xpf rename COPYING.LESSER => plugins/opl2/COPYING.LESSER (100%) diff --git a/data/presets/OpulenZ/Bagpipe.xpf b/data/presets/OpulenZ/Bagpipe.xpf new file mode 100644 index 000000000..15aae06ac --- /dev/null +++ b/data/presets/OpulenZ/Bagpipe.xpf @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/presets/OpulenZ/Bells.xpf b/data/presets/OpulenZ/Bells.xpf new file mode 100644 index 000000000..aade9bd6c --- /dev/null +++ b/data/presets/OpulenZ/Bells.xpf @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/data/presets/OpulenZ/Brass.xpf b/data/presets/OpulenZ/Brass.xpf new file mode 100644 index 000000000..f995fb96e --- /dev/null +++ b/data/presets/OpulenZ/Brass.xpf @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/data/presets/OpulenZ/Bubbly_days.xpf b/data/presets/OpulenZ/Bubbly_days.xpf new file mode 100644 index 000000000..bf4d925af --- /dev/null +++ b/data/presets/OpulenZ/Bubbly_days.xpf @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/data/presets/OpulenZ/Cheesy_synth.xpf b/data/presets/OpulenZ/Cheesy_synth.xpf new file mode 100644 index 000000000..d30fce903 --- /dev/null +++ b/data/presets/OpulenZ/Cheesy_synth.xpf @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/data/presets/OpulenZ/Clarinet.xpf b/data/presets/OpulenZ/Clarinet.xpf new file mode 100644 index 000000000..ec3357c53 --- /dev/null +++ b/data/presets/OpulenZ/Clarinet.xpf @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/data/presets/OpulenZ/Combo_organ.xpf b/data/presets/OpulenZ/Combo_organ.xpf new file mode 100644 index 000000000..92550e15c --- /dev/null +++ b/data/presets/OpulenZ/Combo_organ.xpf @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/presets/OpulenZ/Epiano.xpf b/data/presets/OpulenZ/Epiano.xpf new file mode 100644 index 000000000..cbfa3ea9a --- /dev/null +++ b/data/presets/OpulenZ/Epiano.xpf @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/data/presets/OpulenZ/Funky.xpf b/data/presets/OpulenZ/Funky.xpf new file mode 100644 index 000000000..e1c2baa47 --- /dev/null +++ b/data/presets/OpulenZ/Funky.xpf @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/presets/OpulenZ/Halo_pad.xpf b/data/presets/OpulenZ/Halo_pad.xpf new file mode 100644 index 000000000..d3769abe2 --- /dev/null +++ b/data/presets/OpulenZ/Halo_pad.xpf @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/data/presets/OpulenZ/Harp.xpf b/data/presets/OpulenZ/Harp.xpf new file mode 100644 index 000000000..e5c686d93 --- /dev/null +++ b/data/presets/OpulenZ/Harp.xpf @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/presets/OpulenZ/Organ_leslie.xpf b/data/presets/OpulenZ/Organ_leslie.xpf new file mode 100644 index 000000000..9f46ffed0 --- /dev/null +++ b/data/presets/OpulenZ/Organ_leslie.xpf @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/presets/OpulenZ/Pad.xpf b/data/presets/OpulenZ/Pad.xpf new file mode 100644 index 000000000..636ce3628 --- /dev/null +++ b/data/presets/OpulenZ/Pad.xpf @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/data/presets/OpulenZ/Square.xpf b/data/presets/OpulenZ/Square.xpf new file mode 100644 index 000000000..8c40992e4 --- /dev/null +++ b/data/presets/OpulenZ/Square.xpf @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/presets/OpulenZ/Vibraphone.xpf b/data/presets/OpulenZ/Vibraphone.xpf new file mode 100644 index 000000000..b41cd40e6 --- /dev/null +++ b/data/presets/OpulenZ/Vibraphone.xpf @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/COPYING.LESSER b/plugins/opl2/COPYING.LESSER similarity index 100% rename from COPYING.LESSER rename to plugins/opl2/COPYING.LESSER From f7d58114b2192ac379bc775f8d2c4f672b6c9aa7 Mon Sep 17 00:00:00 2001 From: Vesa Date: Tue, 28 Jan 2014 22:16:25 +0200 Subject: [PATCH 108/110] Added object names for transport buttons (for theming purposes), fixed alignment issues on track labels --- data/themes/default/automation_track.png | Bin 586 -> 519 bytes data/themes/default/bb_track.png | Bin 681 -> 657 bytes data/themes/default/sample_track.png | Bin 893 -> 847 bytes data/themes/default/style.css | 11 ++++++++++ src/gui/AutomationEditor.cpp | 26 +++++++++++++---------- src/gui/MainWindow.cpp | 2 +- src/gui/bb_editor.cpp | 5 ++++- src/gui/piano_roll.cpp | 5 +++++ src/gui/song_editor.cpp | 19 +++++++++++------ src/gui/widgets/track_label_button.cpp | 2 +- 10 files changed, 49 insertions(+), 21 deletions(-) diff --git a/data/themes/default/automation_track.png b/data/themes/default/automation_track.png index d6193e4f6b6e228355b5f5c606569348f172b60c..a7480fd70fd6faa3dca4a9915d6e155a56a4500e 100644 GIT binary patch delta 507 zcmVnOfe+P6) zO+^RZ0UQ(y5GEtkYXATNrb$FWR7l5TU>F7D0u>b%c50ZzghhVTH|(dWnfW0He+LH+V$3lyF^R(!MC()Xrt`V_WV8MM&&=@mF9QP? zw=hFa*1E zT#Do55@JZmUBq_o_!V|1&)5b^zA)o*kIU&hG#K002ovPDHLkV1hv-<2V2S delta 553 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 Q*#H0l07*qoM6N<$f}ypK2LJ#7 delta 884 zcmV-)1B?962K@#xiBL{Q4GJ0x0000DNk~Le0000K0000K2nGNE0F8+q4FCWD1am@3 zR0s$N2z&@+h>;-}e;IT|SaefwW^{L9a%BK_cXuvnZfkR6VQ^(GZ*pgw?mQX*00R0+ zL_t(IjjfbVXxv2<$3Jgob~n4-ja}BJS!qlOjn*WBfto^74j{R9ZPzWjgQq&Lt={lU0R8PK>8CK1RLy1?NB z|jEWng7L7gj+f5%JL0Gxhuy$O6hdHTh-!l~*(^X@U5>n~9#^61|{jl#O;VQO30G5YZ>llL~MMM*hc^ie}+rF>(J}x_RF;-G$OJ%C22<_+Yw1S zCha6-Q9{^^seZGSZr#571Ih+~e(+Cp0P=7@9G{%{s!%GvuCG01IdRbVsw3+pq<^$9 z3wJ{Ca?5Ysx%<=F%IZbnqN@JPF3Ii&TdURHK6GT@{X(fYV!iYOnwik-G&^gzf4}v8 zI;+*%04}TQx4U6IfdC>>15N`+fl7C~39JG?s%oPb?2*9#qrU-=*;w+>EAM3h0000< KMNUMnLSTZ * Copyright (c) 2008-2013 Paul Giblock * Copyright (c) 2006-2008 Javier Serrano Polo - * + * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * * This program is free software; you can redistribute it and/or @@ -156,10 +156,14 @@ AutomationEditor::AutomationEditor() : tr( "Play/pause current pattern (Space)" ), this, SLOT( play() ), m_toolBar ); + m_stopButton = new toolButton( embed::getIconPixmap( "stop" ), tr( "Stop playing of current pattern (Space)" ), this, SLOT( stop() ), m_toolBar ); + m_playButton->setObjectName( "playButton" ); + m_stopButton->setObjectName( "stopButton" ); + m_playButton->setWhatsThis( tr( "Click here if you want to play the current pattern. " "This is useful while editing it. The pattern is " @@ -277,7 +281,7 @@ AutomationEditor::AutomationEditor() : connect( &m_tensionModel, SIGNAL( dataChanged() ), this, SLOT( tensionChanged() ) ); - + tool_button_group = new QButtonGroup( this ); tool_button_group->addButton( m_discreteButton ); tool_button_group->addButton( m_linearButton ); @@ -524,7 +528,7 @@ void AutomationEditor::updateAfterPatternChange() } if( m_pattern->progressionType() == - AutomationPattern::DiscreteProgression && + AutomationPattern::DiscreteProgression && !m_discreteButton->isChecked() ) { m_discreteButton->setChecked( true ); @@ -763,20 +767,20 @@ void AutomationEditor::drawLine( int _x0, float _y0, int _x1, float _y1 ) float yscale = deltay / ( deltax ); - if( _x0 < _x1) + if( _x0 < _x1) { xstep = quantization(); } - else + else { xstep = -( quantization() ); } if( _y0 < _y1 ) { - ystep = 1; + ystep = 1; } - else + else { ystep = -1; } @@ -878,7 +882,7 @@ void AutomationEditor::mousePressEvent( QMouseEvent * _me ) { // then set new value MidiTime value_pos( pos_ticks ); - + MidiTime new_time = m_pattern->putValue( value_pos, level ); @@ -1577,7 +1581,7 @@ void AutomationEditor::paintEvent( QPaintEvent * _pe ) is_selected ); } delete [] values; - + // Draw cross int y = yCoordOfLevel( it.value() ); p.drawLine( x - 1, y, x + 1, y ); @@ -1803,7 +1807,7 @@ void AutomationEditor::wheelEvent( QWheelEvent * _we ) m_timeLine->setPixelsPerTact( m_ppt ); update(); } - else if( _we->modifiers() & Qt::ShiftModifier + else if( _we->modifiers() & Qt::ShiftModifier || _we->orientation() == Qt::Horizontal ) { m_leftRightScroll->setValue( m_leftRightScroll->value() - @@ -2069,7 +2073,7 @@ void AutomationEditor::selectAll() const float level = it.value(); if( level < m_selectStartLevel ) { - // if we move start-level down, we have to add + // if we move start-level down, we have to add // the difference between old and new start-level // to m_selectedLevels, otherwise the selection // is just moved down... diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 8a92a5c76..c86975b3f 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -412,7 +412,7 @@ void MainWindow::finalize( void ) toolButton * bb_editor_window = new toolButton( - embed::getIconPixmap( "bb_track" ), + embed::getIconPixmap( "bb_track_btn" ), tr( "Show/hide Beat+Bassline Editor" ) + " (F6)", this, SLOT( toggleBBEditorWin() ), diff --git a/src/gui/bb_editor.cpp b/src/gui/bb_editor.cpp index a26094e80..ec6de9034 100644 --- a/src/gui/bb_editor.cpp +++ b/src/gui/bb_editor.cpp @@ -2,7 +2,7 @@ * bb_editor.cpp - basic main-window for editing of beats and basslines * * Copyright (c) 2004-2008 Tobias Doerffel - * + * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * * This program is free software; you can redistribute it and/or @@ -85,6 +85,9 @@ bbEditor::bbEditor( bbTrackContainer* tc ) : tr( "Stop playback of current beat/bassline (Space)" ), this, SLOT( stop() ), m_toolBar ); + m_playButton->setObjectName( "playButton" ); + m_stopButton->setObjectName( "stopButton" ); + toolButton * add_bb_track = new toolButton( embed::getIconPixmap( "add_bb_track" ), tr( "Add beat/bassline" ), diff --git a/src/gui/piano_roll.cpp b/src/gui/piano_roll.cpp index ddd450faa..4a9d8203e 100644 --- a/src/gui/piano_roll.cpp +++ b/src/gui/piano_roll.cpp @@ -331,6 +331,11 @@ pianoRoll::pianoRoll() : m_stopButton = new toolButton( embed::getIconPixmap( "stop" ), tr( "Stop playing of current pattern (Space)" ), this, SLOT( stop() ), m_toolBar ); + + m_playButton->setObjectName( "playButton" ); + m_stopButton->setObjectName( "stopButton" ); + m_recordButton->setObjectName( "recordButton" ); + m_recordAccompanyButton->setObjectName( "recordAccompanyButton" ); m_playButton->setWhatsThis( tr( "Click here to play the current pattern. " diff --git a/src/gui/song_editor.cpp b/src/gui/song_editor.cpp index 4a2205fbd..099204616 100644 --- a/src/gui/song_editor.cpp +++ b/src/gui/song_editor.cpp @@ -113,7 +113,7 @@ songEditor::songEditor( song * _song, songEditor * & _engine_ptr ) : this, SLOT( adjustUiAfterProjectLoad() ) ); - // add some essential widgets to global tool-bar + // add some essential widgets to global tool-bar QWidget * tb = engine::mainWindow()->toolBar(); engine::mainWindow()->addSpacingToToolBar( 10 ); @@ -153,7 +153,7 @@ songEditor::songEditor( song * _song, songEditor * & _engine_ptr ) : engine::mainWindow()->addWidgetToToolBar( m_timeSigDisplay ); engine::mainWindow()->addSpacingToToolBar( 10 ); - + QLabel * master_vol_lbl = new QLabel( tb ); master_vol_lbl->setPixmap( embed::getIconPixmap( "master_volume" ) ); @@ -239,7 +239,7 @@ songEditor::songEditor( song * _song, songEditor * & _engine_ptr ) : m_toolBar->setFixedHeight( 32 ); m_toolBar->setAutoFillBackground( true ); QPalette pal; - pal.setBrush( m_toolBar->backgroundRole(), + pal.setBrush( m_toolBar->backgroundRole(), embed::getIconPixmap( "toolbar_bg" ) ); m_toolBar->setPalette( pal ); @@ -255,19 +255,23 @@ songEditor::songEditor( song * _song, songEditor * & _engine_ptr ) : m_playButton = new toolButton( embed::getIconPixmap( "play" ), tr( "Play song (Space)" ), this, SLOT( play() ), m_toolBar ); + m_playButton->setObjectName( "playButton" ); m_recordButton = new toolButton( embed::getIconPixmap( "record" ), tr( "Record samples from Audio-device" ), this, SLOT( record() ), m_toolBar ); - m_recordAccompanyButton = new toolButton( + m_recordButton->setObjectName( "recordButton" ); + + m_recordAccompanyButton = new toolButton( embed::getIconPixmap( "record_accompany" ), tr( "Record samples from Audio-device while playing " "song or BB track" ), this, SLOT( recordAccompany() ), m_toolBar ); + m_recordAccompanyButton->setObjectName( "recordAccompanyButton" ); // FIXME: disable record button while it is not implemented m_recordButton->setDisabled( true ); - + // disable record buttons if capturing is not supported if( !engine::mixer()->audioDev()->supportsCapture() ) { @@ -278,6 +282,7 @@ songEditor::songEditor( song * _song, songEditor * & _engine_ptr ) : m_stopButton = new toolButton( embed::getIconPixmap( "stop" ), tr( "Stop song (Space)" ), this, SLOT( stop() ), m_toolBar ); + m_stopButton->setObjectName( "stopButton" ); m_addBBTrackButton = new toolButton( embed::getIconPixmap( "add_bb_track" ), @@ -566,7 +571,7 @@ void songEditor::wheelEvent( QWheelEvent * _we ) setPixelsPerTact( pixelsPerTact() ); // and make sure, all TCO's are resized and relocated realignTracks(); - } + } else if( engine::mainWindow()->isShiftPressed() == TRUE ) { m_leftRightScroll->setValue( m_leftRightScroll->value() - @@ -720,7 +725,7 @@ void songEditor::updatePosition( const MidiTime & _t ) trackOpWidth = TRACK_OP_WIDTH; } - if( ( m_s->isPlaying() && m_s->m_playMode == song::Mode_PlaySong + if( ( m_s->isPlaying() && m_s->m_playMode == song::Mode_PlaySong && m_timeLine->autoScroll() == timeLine::AutoScrollEnabled) || m_scrollBack == true ) { diff --git a/src/gui/widgets/track_label_button.cpp b/src/gui/widgets/track_label_button.cpp index 0080c090c..f26485701 100644 --- a/src/gui/widgets/track_label_button.cpp +++ b/src/gui/widgets/track_label_button.cpp @@ -58,7 +58,7 @@ trackLabelButton::trackLabelButton( trackView * _tv, QWidget * _parent ) : setFixedSize( 160, 29 ); } - setIconSize( QSize( 32, 32 ) ); + setIconSize( QSize( 24, 24 ) ); setText( " " ); connect( m_trackView->getTrack(), SIGNAL( dataChanged() ), From c2672651488be91f4b6c30fd1fee4829b579c939 Mon Sep 17 00:00:00 2001 From: Vesa Date: Wed, 29 Jan 2014 00:45:03 +0200 Subject: [PATCH 109/110] Retouched transport icons, commented stylesheet for better documentation, fixed faint line in bitinvader knob --- data/themes/default/pause.png | Bin 228 -> 415 bytes data/themes/default/play.png | Bin 337 -> 602 bytes data/themes/default/record.png | Bin 610 -> 742 bytes data/themes/default/record_accompany.png | Bin 692 -> 975 bytes data/themes/default/reload.png | Bin 1211 -> 962 bytes data/themes/default/stop.png | Bin 244 -> 507 bytes data/themes/default/style.css | 99 +++++++++++++++-------- src/gui/widgets/knob.cpp | 1 + 8 files changed, 68 insertions(+), 32 deletions(-) diff --git a/data/themes/default/pause.png b/data/themes/default/pause.png index c9b45d7d948f21331ae93aebf3266894b7fa0b7e..04725f997e18ab73d34ad049ddd332a9e895d866 100644 GIT binary patch delta 315 zcmV-B0mS~~0iOeqZGQnANkl1*p)l{)g0dDW~~NK zXw8VG{@QJd88zzf&tpyLyAC|_Zd0zz46XGMVFTyvZiZc3!&$R>hn}!)Y6zis2fJ-* zj8bEA?wIiQ^fb1j@7nv*^MaZ03)coNSNRMRF62Z+VyypDXam5B^vlHE<9bh&3Jl`t^$opC)|rjL5~; gpv=pRBd>r30CT$~FWiIDvd1+!7t%WBG_J3 zP%ok&eg!{DPW={zYQ^e7ZPSg$lbV9$rfquAgx%Tfdmc0)bhD<`{NcgCFhAbRJQ5Ks zGHRjPNsx$E7Y%;3);5V~<;y0!`pNh!0(==ED*Vfh%I)@;1U}n5;C;YL~DU8t@!{Kl)Tmo<1zJt(3ztOI=r1n;v6c69h1+gqF5PFf70?Y(~n;0J)? z@$nK^6eAR)5%S!_XDI;SxZlUCm)o4Qc3Fs~p#;E=h;R%l!9365y@%2o!@&T_{vLNa z9~eY!pJkO$CFrvh-g~@z`-Z=K{=_t=qmwC(O&rJE>-AVEHHLly*q;Z@1eH>$F{YE} t`9DKd9j*d+cot|T_y=`ofhxiO%`fL%O58hk^&S8K002ovPDHLkV1iM5@b>@! delta 236 zcmVEEAs9F~kkz7Q~Pok=R3Q*t%Y=Eh|7g|2>T~}Z| z6!wC~n7ad4z$z5>f@zu-Ns^p9a0x7dNgpU~Y(zu>vMej?_hps3uIEkDEZVl6*~dy? z3mjGT+3iU$=rqm;Uo3ob;UF*o-rEyDq6a%D#6zy!3yx`u7yJTMzz#V0Aou0}2b;*F m7xm|m17-~59laPUdaz#@%JH^ha%utq0000hZGQq|Nkl8mcG(0_uTz- z_uTUyDa#TMS;m9X{s+*!OW0^O8-)WCx%ENWf zTcehB;M%q`SFe+XZ36(p@fiImDu;1APLAFZ5GDx1a*T$pofp0)!w_YGw)2$pqbfslQtq{+w5nQf5Xb5~2=>2?$DaYbDa-Qf zy+8o)IDfq0IJ+$=m#?CMg3`etjxV~S(ec&E-rj`W3j_c{2*)(Ei}(=@|H`wIS$F&~ e@NeqDKiKcQA}KQcftzmt0000yvdZGQpZNkl$pC zwlDCq+l?-}-Dsb^^wyCt+U*{IA&AZa4C>_(m~R1G|Cr70_J0O`=yX0Z^9=wE00b}q zFhKPdOGKZ)Pp4o139MmX0H7(Q?Zxp!90V2sOi}1NV@~E-_VOX3PrJ}9;6=OL1JO?a zx_^B9&`**{*l464Q3(K!+0R!iHC`;b1By zlzKW+>PbtvjDLLpxt}D{rj)jB$#4@Owi`g_0B{<|k3pl6${?^xh@}!D1%R}w6aZAt z`KNLGIG@e*y5^5RthE>rz;O^*;d!M`lq(@p9fn4Sp;1DlK2a__uZ)Ah*25ZXD)oM1 zf16Bx0T?krrYLmfoL@4BX;mqk=dsQ6IISvGGKZCOzIZ7LU28O|YXR)`koguwXZOam zT2W-Oq9_5Na!vw3>0Fo>n z&1>FQ>>cP~uHHHaeH?bP_H1*SZ)Gpw|K#9e{{|Sc5)wKJ&tm`p002ovPDHLkV1g8D B^g;jt diff --git a/data/themes/default/record_accompany.png b/data/themes/default/record_accompany.png index 0dbbb91b94acfa0275a4b49a912f9b0cd0552514..7dd091a1246a3cd3218c8dc61cb7ab98a845a50c 100644 GIT binary patch delta 879 zcmV-#1Cac*1F&g{%)CMD)4F=}H%strx06s3yT zAU%|zQtL%n@uXM1`5%ZNf_m~I6vUIgNFg?aNMqYe5lmW}WYIucT5Yo3>}(Tfc4yw1 zcODNlYfZsJ$#Z_54_|n`-{(;x!d_NkPiZ?qrIf!{KqVqrmVXr}rM@)Ad?q5T2OC}; z8F{RjByYH``?krl$y}u9IL_}{>mQP0@zePmH|{+IR7%Ov(2%LsYFb1-&a&)t5s6O@ z4vtuk^K+Ny_4JfVg&yC>wr#eXO=@8%wJ=OVt;?6I)$bnyo;vj=aiXbImQ8hIBPqex z$NKu-KhWRr4}T8~;JPlBWdV>ILz<>kgMjOI?&N<)(FfOp;41)ohwQj6UEMtlKRsea zQRL0f&U|>WdRJ-N=D_~_`2VOwDRN^-;+V$^1#*!>zP|oNuj4G#wZ76;SbpbS{LW4~ zJf9BF$8}w9t*tS4ewuot&WW)x%EymWavUwswk(=;W^QnXI6Y#R`MTe{BN`Dv*)>gvSUm@2<@`u$NCat!!=0$5|Et--*aN{F`MTcn_EdmSoq} zRZ3aFFfa-{1GvB+z#4E>L`=JPXI3etc7qpTx_FgtoS@Ff&cVh<^x-F#@m$;5mR-MAYjG zZdld@1-MJVGJq?75xb0No2lx?X1QEC3fPYVfM)<+uSBD_6yOa2V~_w~NGt$6-m>kN z6M>xbdbis>3jmz4YRWXj5nWfqn)bsoj8<6FzH>$Kno=4ELWG;`cF5;E>_bO@*=+Wy zZQGfqu1=_9~`q}B2AIjxqOUfW4dhxDOc{C9? z^dD-&w)53y^U@gj%bjF$UrK2fg^2IeYUcs$Y}xkZseiy>aNV}^wK4G3XtcUyS*`b_ zQksBHz%a~X8{5N3w+AuR%#)rRJgn?sZGOJsx~^FiB2I^H+I?Fn$cey7O$l=DU9+s> zgH-CH0tDKw8*+O+{i_gRKWF>53W;(<{;F&3_ra0f>mYeZk)@2lxwi9RMdHOgl@nv)a8( gW@eg({r4OD7q~Qr*Sh@s4gdfE07*qoM6N<$f{t|^2><{9 diff --git a/data/themes/default/reload.png b/data/themes/default/reload.png index 699153a9386365535470ea21d5363d0393464d72..c92882ecdc5ef71499288811d847f265fbaf3b92 100644 GIT binary patch literal 962 zcmV;z13mnSP)$m(GYfGX0+=d${xDi4jOCJ!D zW&y>xhb0>>MvU=cVq$zS>R;fC#te-=p5}x4qR}nth8t$f#uiC7MsQ&)Oa!46TKaRW$?Nr+m*>@2V|Y3b%XTYk-+eFZLer6n3!Hm+S9 zyct~dw~9zQC(u#i>gx1$pL(*X#WD2L4=XoDu1l8&!!ri z+Y0gu3SUu5IUy@;itTpa-nx3zr{mAFc;n9b&s{|5sq8=E|neJ9?Oh6A3MrfDAn z&x*)DwJairQpyV)1}^1#H>H%e)9!q=v8koM&D*(WDY$4%-@Sd)FpMc+7&fWp93Xei z?#I5dJ4+n3dmnc@OUw1Zg5MZA`|a_9IN k1|qPR18a! z@R>P#2w9kwv!`imJ+z0Kb+Vf2dTwRDD(`UJbMEiE-}le`=boDz5w?tGG0Oq~XyWBT zQAV9P*=7VIKO`M8H_DVmp+pFvYv&U4{su6ujtE^TGUhUXB>>C+r_^ZeAqId0@G~8% zM34kfJOhfCfXoWE0PJ;!gI*w`gTev!P(aCsGH;MGAe#|ueD11fjOn+XOfiylZpU14UAKy1h@aLNJH2tE(}5_E*^)bPqY!0wm|>4uOjIy&uOsF=Vu3v>nW%I^r86p7Sj5JC zEG%}xVmB-n-~ksb2}ZRO9-NP*T-36#oQo9_tmI*p7;8hYj*lk-Q5S;^8}Rf_H29z) z3C|>AQv{w}gy+7+^C{SpjF(p7Wk0;K2(RW~Ybv(!u{|E|WMPK@I|bO4fZdtcyA1n^ z@R{LyrV5Q`n!YV6EE-Iwkj>1@%qbKKl}epzX>C1oCY^3;KX=}|dCd8)Zfv$YhqJ)L zW1+VXm&@fZ2?`dkkVM8xX%kLnH07cN|A|Km~0`(JW>66p4DQjyyh}+<)!ne%qq8?ax-!DK<+3 zw!iFdok1kEKeO`ms=vKS+KheI+2R~CFNzzJAYVRuZ+=<8iPT@hN63noPA)Y()9)wx zNKDeF1Dkju)`H8czHA@x&0z3vbyBH9O4rcCj2#cAb3XQ5eB-ex_KYK3)erjf?$S7H z>A92`Mowj{Y-sH)ED zSSbLs)=)PrK5c&nh7btTM4Te3N=lh!{lQ&EciY#5KoI%7{n>|d#5os1fB}4bRpW@a zC+uU;d#CqKt$+0_bBuvm!QH8?(p#f{MU>rVj+>nVxZBY?RyN!WccZ$$2f7=R#nT$C zH9~ld%?f4Puu{%MzXg_3PSf_*(L;m*^ww}UtQ1PwC}n#Ov}4ieyU#2}f&>Qp-B$PG z>1{7dW{hzL5Apsqu6IWK1Q!vxKBxV9lmGt5{sr+(@Day?+E&2;0000G#Hn;D8=J|~%KAXQyO1b*)Ul1w3lqXvvI?y9=o=4%F9 xGQkOs0K$J?SC^Zs=et}2oAV0x$oP+P0@HgcAlzGhCjbBd00>D%PDHLkV1i(tJy-w$ diff --git a/data/themes/default/style.css b/data/themes/default/style.css index 54c9d9412..94a4b393c 100644 --- a/data/themes/default/style.css +++ b/data/themes/default/style.css @@ -1,4 +1,6 @@ -/* LMMS style sheet */ +/******************** + * LMMS style sheet * + ********************/ QWhatsThat { color: black; @@ -12,6 +14,7 @@ AutomationEditor { background-color: rgb(0, 0, 0); } +/* text box */ QLineEdit { border-radius: 4px; @@ -20,6 +23,8 @@ QLineEdit { color: #e0e0e0; } +/* text box when it wants text */ + QLineEdit:focus { border: 1px solid rgba(0,0,0, 128); } @@ -89,6 +94,20 @@ pianoRoll { background-color: rgb(0, 0, 0); } +/* main toolbar oscilloscope - can have transparent bg now */ + +visualizationWidget { + background: none; + border: none; +} + +/* main toolbar cpu load widget - this can have transparent bg now */ + +cpuloadWidget { + border: none; + background: url(resources:cpuload_bg.png); +} + /* scrollbar: trough */ QScrollBar:horizontal { @@ -104,15 +123,6 @@ QScrollBar:vertical { margin: 13px 0px; } -visualizationWidget { - background: none; - border: none; -} - -cpuloadWidget { - border: none; - background: url(resources:cpuload_bg.png); -} /* scrollbar: trough clicky things */ QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal, @@ -130,7 +140,7 @@ QScrollBar::add-page:vertical:pressed, QScrollBar::sub-page:vertical:pressed { QScrollBar::handle:horizontal { background: qlineargradient(spread:reflect, x1:0.5, y1:0, x2:0.5, y2:1, - stop:0 #747474, stop:0.5 #c9c9c9, stop:1 #808080); + stop:0 #969696, stop:0.5 #c9c9c9, stop:1 #aaa); border: 1px outset #888; border-radius: 2px; min-width: 24px; @@ -139,7 +149,7 @@ QScrollBar::handle:horizontal { QScrollBar::handle:horizontal:hover { background: qlineargradient(spread:reflect, x1:0.5, y1:0, x2:0.5, y2:1, - stop:0 #747474, stop:0.5 #f0f0f0, stop:1 #808080); + stop:0 #969696, stop:0.5 #f0f0f0, stop:1 #aaa); } QScrollBar::handle:horizontal:pressed { @@ -151,7 +161,7 @@ QScrollBar::handle:horizontal:pressed { QScrollBar::handle:vertical { background: qlineargradient(spread:reflect, x1:0, y1:0.5, x2:1, y2:0.5, - stop:0 #747474, stop:0.5 #c9c9c9, stop:1 #808080); + stop:0 #969696, stop:0.5 #c9c9c9, stop:1 #aaa); border: 1px outset #888; border-radius: 2px; min-height: 24px; @@ -160,7 +170,7 @@ QScrollBar::handle:vertical { QScrollBar::handle:vertical:hover { background: qlineargradient(spread:reflect, x1:0, y1:0.5, x2:1, y2:0.5, - stop:0 #747474, stop:0.5 #f0f0f0, stop:1 #808080); + stop:0 #969696, stop:0.5 #f0f0f0, stop:1 #aaa); } QScrollBar::handle:vertical:pressed { @@ -201,6 +211,8 @@ QScrollBar::add-line:disabled, QScrollBar::sub-line:disabled { background: #747474; } +/* arrow button arrows */ + QScrollBar::left-arrow:horizontal, QScrollBar::right-arrow:horizontal, QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical { border: none; @@ -218,18 +230,23 @@ QScrollBar::right-arrow:horizontal:disabled { background-image: url(resources:sb QScrollBar::up-arrow:vertical:disabled { background-image: url(resources:sbarrow_up_d.png);} QScrollBar::down-arrow:vertical:disabled { background-image: url(resources:sbarrow_down_d.png);} +/* background for song editor and bb-editor */ TrackContainerView QFrame{ background-color: #49515b; } -nStateButton { +/* autoscroll, loop, stop behaviour toggle buttons */ + +nStateButton { max-height: 26px; max-width: 26px; min-height: 26px; min-width: 26px; } +/* gear button in tracks */ + trackOperationsWidget > QPushButton { max-height: 26px; max-width: 26px; @@ -260,15 +277,19 @@ trackOperationsWidget > QPushButton::menu-indicator:checked top: 3px; } -trackWidget { -/* border-bottom: 1px solid rgb(0, 0, 0);*/ +/* actually has no effect yet so disabled */ +/*trackWidget { +/* border-bottom: 1px solid rgb(0, 0, 0);*//* background-color: rgb(0, 0, 0); -} +}*/ + +/* font sizes */ + nameLabel, effectLabel, sf2InstrumentView > QLabel { font-size:10px; } - +/* main toolbar sliders (master vol, master pitch) */ automatableSlider::groove:vertical { background: rgba(0,0,0, 128); @@ -287,11 +308,14 @@ automatableSlider::handle:vertical { margin: -4px -12px -2px; } +/* window that shows up when you add effects */ EffectSelectDialog QScrollArea { background: #5b6571; } +/* the inner boxes in LADSPA effect windows */ + EffectControlDialog QGroupBox { background: #49515b; margin-top: 1ex; @@ -300,6 +324,8 @@ EffectControlDialog QGroupBox { border: 1px solid rgba(0,0,0, 64); } +/* the inner box titles when present (channel 1, channel 2...) */ + EffectControlDialog QGroupBox::title { subcontrol-origin: margin; subcontrol-position: top left; @@ -310,10 +336,14 @@ EffectControlDialog QGroupBox::title { padding: 2px 1px; } +/* main toolbar */ + QWidget#mainToolbar { background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #98a2a7, stop:1 #5b646f); } +/* smaller toolbars */ + QToolBar { background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #98a2a7, stop:1 #5b646f); } @@ -327,16 +357,22 @@ QToolButton, toolButton { color: black; } +/* separate corner rounding for play and stop buttons! */ + toolButton#playButton { - border-top-left-radius: 10px 6px; - border-bottom-left-radius: 10px 6px; + border-top-left-radius: 8px 6px; + border-bottom-left-radius: 8px 6px; } toolButton#stopButton { - border-top-right-radius: 10px 6px; - border-bottom-right-radius: 10px 6px; + border-top-right-radius: 8px 6px; + border-bottom-right-radius: 8px 6px; } +/* record and record-accompany can be styled with #recordButton and #recordAccompanyButton respectively */ + +/* all tool buttons */ + QToolButton:hover, toolButton:hover { background: qradialgradient(cx:0.3, cy:0.3, radius:0.8, fx:0.3, fy:0.3, stop:0 #e0e0e0, stop:0.5 #c9c9c9, stop:1 #969696 ); border: 1px solid rgba(0,0,0,128); @@ -358,6 +394,8 @@ QToolButton:checked, toolButton:checked { color: black; } +/* track label buttons - the part that contains the icon and track title */ + trackLabelButton { background-color: #5b6571; color: #c9c9c9; @@ -400,7 +438,7 @@ trackLabelButton:checked:pressed { background: qlineargradient(spread:reflect, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 #49515b, stop:0.3 #5b6571, stop:1 #6b7581 ); } - +/* sidebar, sidebar buttons */ SideBar { background: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop: 0 #98a2a7, stop: 1.0 #5b646f); @@ -410,13 +448,16 @@ SideBar QToolButton { font-size: 12px; } +/* font sizes for text buttons */ + FxMixerView QPushButton, EffectRackView QPushButton, ControllerRackView QPushButton { font-size: 10px; } -timeLine { +/* has no effect yet */ +/*timeLine { font-size: 8px; -} +}*/ QTreeView { alternate-background-color: #747474; @@ -522,9 +563,3 @@ palette:brighttext {color: #4afd85} palette:highlight {color: #202020} palette:highlightedtext {color: #ffffff} -/* Notes: - -lcd-spinbox colors: (12, 250, 150), (37, 57, 42) - - -*/ diff --git a/src/gui/widgets/knob.cpp b/src/gui/widgets/knob.cpp index 44b4449b5..e03d2a6fc 100644 --- a/src/gui/widgets/knob.cpp +++ b/src/gui/widgets/knob.cpp @@ -352,6 +352,7 @@ void knob::drawKnob( QPainter * _p ) } case knobDark_28: { + p.setPen( QPen( QApplication::palette().color( QPalette::Active, QPalette::WindowText ), 2 ) ); const float rb = qMax( ( radius - 10 ) / 3.0, 0.0 ); const float re = qMax( ( radius - 4 ), 0.0 ); From f6ee1dd25d6833b81304ff3c28432c8eb51663cb Mon Sep 17 00:00:00 2001 From: Vesa Date: Wed, 29 Jan 2014 00:49:46 +0200 Subject: [PATCH 110/110] New files --- data/themes/default/apply-selected.png | Bin 0 -> 344 bytes data/themes/default/bb_track_btn.png | Bin 0 -> 647 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 data/themes/default/apply-selected.png create mode 100644 data/themes/default/bb_track_btn.png diff --git a/data/themes/default/apply-selected.png b/data/themes/default/apply-selected.png new file mode 100644 index 0000000000000000000000000000000000000000..f4e79fb4d613956f8db7ad67bf36ac4d35f0776a GIT binary patch literal 344 zcmV-e0jK_nP)*+_z`GSWi<+q#-fl_7!<){u>^xbx1xcN$_l_$@bzH0u)XZuT}e*SH(7D>&OX`M z%HffFNh?VkN!4EtaO)}o-(2+rR6;+vu`3=WEhRli;#)~i)>XVo>cl`F zBz=0Iq36AdnN!-pQ+^Tn!mmA03v=B~6HjvA@e9DpfF6Lldk7c2GdA^rJg_kQBk&Tf z&ixo-Yi-0&z^kuoqJa_VbpjezJNkm-l+b2epIgQ>0oqC$pg41GfZJ&%Gb!OC0_~(7 q`J{v#@P29j?qA-L;QtSjIrt1o@Yx15QZP8`Px+i zZBayNiqsnt0z|0F1^!%r8z&Ae2M!>lN(hmVwB028<@I`Y*BmHqLed^kEX`?V9=&6~ z8Y|};l(eAHkt*qFq#volo(I6697NsdM%e(WBw_xu&kRp=xkyt?G#%V&LDg#LB*Er6WmzC1 z|2J|Lg#_afO4TqrB@IKYF<5KwA9*sFtR%G7m~US(aSRGd5scR4!3FbZjeNSh5 z8&_4tvnkWb7!l#2GW2@AB_%~s(0=ingTXPm*32$12!0LW;{wp{bXM%qXf_cYuiTZ0 z;CH(8_WOiEfYB+>pf

z&57o2$A5B6cgnqRZvVMt@qF=5ASZyhvBbDr+o=4n98+-g2)EHU14EGHN% z#!ecS^p67**0I)5Ye|pj^JT05$aLHE1p+$*`|X3awDwp(+8y=)&;@h=-HGLiRqKwf zz1sg(zYK2(uLBx@I(q1}KD4H+1D5YR=WGEMDoh8kc-8JzJ635MFh!d(U$ftp#Uc83507+C3GdO^0BMHXb{Mi*IsW2BIJ4aQJzH*aX}8!x6r z`g%H}>r3^;A|~$Fy0m+kVpv|16(AB=8Gl$9-W=XOX;1c)bLBJTH_JQlxDNRKxPMJw zp|2N?n5!+)gm>1vNCAsR;?AbfuPS+^s-pf0e?*Vyr>LWWAhR&3L*mIP zdE6WFc2!=lybnx?8r2K~HZ6phq(Ygpn#MwPDr;0yQ@D_FOTF{e#8(xdT$PGi?Y~*? zy{d545Y){i)x$PH zitJRB3A%#^r@QFfz=I6L!wx#ci-#$A@h{47P8bRz>Z%71vVSqQ${1tq(9y*-X-Jkd z|6X3+d%vHD{vuh{%{JW+zWfgF`+lGA|F4hr9SsNqL;KFWelhs?&|W)VN!HV42aqjt z$I&+c@B!UE)7Yw+zKO))Cr%IVe{2sB1-bx3>2(BX>Y4xuY3h+cEdJKi=VR|p&j5o! zXf4P_0JQw9Q-2p|n$|P^+MW~doP7U9;6b2U8KHFwkN}?L6lK||`;s2HrL6hmGpS=w zoqhEU1-Z?WjRFLKTWkD%_4w?;%DL1TZLTWZODkF_;=D5c(aaHGK;=XSw2nN`Ox><7 z=I5^-Kl^s}higY!s8sdKHTr_#BZ))1_X7_AfldIciGT3v9#8@@izhFBpZsR-ko06j z(=;u*bL3cb=jb+7*1nDa>Nr3R$Yo|1&Xup{zgUH9f!NIWODY%oW&jfKfI3jP{^9SR zdQ~q8;E#l+0RLt^XoWP~nq6_KR!W7?*ZjU&KocSq$N{j@#aX}x#Qgy1O)*0Lm~chu z#@Cm=1b-~RyI%nRmYK;hqsPCkzEnA7-6&*KZiKOpv7oic-K-Brc0c^IaK+N%x92|w z$|_vaxX0tVnxKZdgQ_y_&>1~2wY_Vo_qojMwF9Lqxtpqdy|n;MOAXcTA$6OoGyB`U z3T^KTMt6Mn_a&azy!kd7=J_2XD415d}Pbsa5xid|;Tq-Y`NyJ~1+x zUe3stY3W^g_x$Cyp15thwR^C-wWf!U_QwWxM0)#)4GuFBk5jAF5JFH`DQI={k+w%g z`+q=O3(#DP0WECql2YQjF1BrxFBGxtI#sJiyz@o;3cc4-Cve|2J#Bv-YYx+ Z{{pU!VZmRDUuXaT002ovPDHLkV1m-{($xR} delta 946 zcmV;j15NzX2hInODu4d~{{a7>y{D4^000SaNLh0L00l7s00l7tx9uoW00007bV*G` z2i*Y=6cQKbe_{^+00Ub|L_t(Y$E}r1Xk1kofWLDenaNBic4i#Y8Kt(9bcD7b)+)4u z7Ni@CSi!n*(P~}zXm?T&gf4t8Tvfr1Pn1FkDs)lMQoB*XSAP{th)shHNoq0^b32*$ zo!ooQanU~`r>nEB2k17r?ikAe zm_XF(F*lf&xaYo?2Zjgtt$PSa0=k^tRX1pYD7oy9Y=Ck#3OX z0BHN!Pz^AIv47@)Lz|Ahd;E?4z#Tv|FhZ;ppaDErF8CGgHm6MHX6Ee+Pnr7 zhc`!Gzj$))NMnpz{ZEs=(AvY>UL1HDxD5!c1aKu0hJTPi8OVcqq3g{cMm6V>JK`NWcY(zr8>H@nTI* z1N0_(wgWw@^`ITH=r{bTSNHw_5T-C&-&YH0K@=dxm9SBpX`BX{fVvd`qa}94N-JNL z&kap{4u3QNd8+_Dn;yF}Ye%iY@{BuFo@nHQ+$d`aV?ngZjjRu6b|xN|zM2{Ta`Ho< z5>%PCZt}PhOi(Mh!$D_dYfGUH(9Rq&yXruj~eBS!xCC9tmzc=*)Ph zSE4fUx6y%x4OO?zy@MO>3>f?nS3UdOYM%uVhQO<*E#R}p|wUU zZL~s`+nc>>;+snc&!5N_fyF>nH$cnfh_%5QNbXC1l+A72nn`7d_pL=Lg_Cu*{8gCM z=&RFG{`mIDxsIN=X1jHIU;jNzh2@|C*#TL=vdWzvZz~sPtabYue7jWo*mFmmZZ`Mc1bq zUwCJ{Gi{}~q#fIy!Q<>?jBhByG$ z8Ws0tyA=EmYprZ$UShyjqYvl<`hfocaC`6{Hh7L~7eF>RXxrGlKh{Z7Ks&JpQgLD( z{|CNUgh(VQpnsh_1^DjCy`C`6_Qf?9j?Hzf}rR;=^?Ye2!))xy;-raq(aPK9c&)&Lt zIdv|)Qw?<34WK$GaGj$=QzD|9j|(@J7T!MvD!|VdGk^DAE&uq|s2EcPT7ZpPPw&7+ z4f7qqnb>m*I0OXVXb_Ifp1JaI?Tc3`lpX+eAnJC%|9-%`b$Vd-^dojS$EcgnQj3y{D4^000SaNLh0L00l7s00l7tx9uoW00007bV*G` z2i*Y=6cZ^w1y1Dv00Fs4L_t(Y$L*ERYZE~jhM#X|XLo}pJ*W-XC2Amu6-0#k4-^mH z1+Ri&d#?vUPf|qCqy7idt9q#-6!9YTs+VH%ASOr*B(2rPO@A^oUUsF}nwStg<%5BN zVcuun`SA`6R|15yu18p?g?-N(COH|@!sq+;-OMl z`dFE+%x#_9%5T;;y2isF#X+{BKwVX5r7XA2j(J~Qt=?Z>S$_@a`8)I1qD$eu*3@o1 z2;lW`;Hxw0qKN43YWG%crS<~Y27at9uf1vPG&+sm_J1zW16B3_$1Dk-q%Adf*i}SJ(Y4&GWGPuB zp#ij0$UYaUp92z%*)T8FX{AKObCEkPU8&o*_GV|f^B6-bbzuIsMZW;11A?-5%^aTq P0000 diff --git a/data/themes/default/note_quarter.png b/data/themes/default/note_quarter.png index 6c3acf2cd6e01763d5ba450fe43ffa39ae7c8c97..acd47baabcb56d1cab98ed6483122e28c286e67b 100644 GIT binary patch delta 520 zcmV+j0{8u+1g8X$Dt`a~0002_L%V+f000SaNLh0L00l7s00l7tx9uoW00007bV*G` z2i^f04kH0Kp^T>h00Fc~L_t(Y$L*CrZ__{+#((~&xFn9!HdPuUkVu4zL>AUA6$2lj zVr1hJu<$*Qn7c5tu!00)MnZx$0|P>(O(n-p+t_jKyO+h5s((nW?1(Y1blbhp@1FN` z&skI}18{-v;fGh>-6y^N>F4oJAP3~OMzaRM0ya$B8fcUcG^+Gh1(Xm6K$Nx$pz%Ke z%P^zLMso$>TD7W!HDC=`18S6A;nkM0V6O6#?OVjnBGAg^mSI;XHtZWh%q|3**Mu8D z2S7xORUMR(+<&5F_qGrBUhF))`^@vaEtTa-FrNPqkut7pJ1EC;#~!qY+s_{zJ=hzL z{O&HDwujab48zgM*CGKwce)Ll{1Y(9LFJ385i?QNq$G~vM(oJ3xKNg z1(qXnfsXUEe_#$;FO8=27%f_oe5{V=@AHp;KLG&{UmMen^$%j>p286~=3@W=002ov KPDHLkU;%y{D4^000SaNLh0L00l7s00l7tx9uoW00007bV*G` z2i*Y=6ciJ-NCA)l00FQ`L_t(Y$L*E9i_}0E#($F!HutgTez@ocRBnZ9+{V`Cu&`IK zvlIUX{|~|X8cQ4N1I1nh?c@qUL^vbP?Z=r-LNfE(BzPQpB!9tjUzlc?d4BV}!#v|s zuM`jfm!G_P@cz>6VEpCv_m4mU$VD5S1^^e>a6M-NHUv6#_SXee5FbE{xFt~iPr#oN zR2}g)0M+y??HsHDYrq=NsJt4lwu%L(%}e$!5O>Nzt42_TU6a`G{vxc(`2g5DBisRc z03xE=I;bLfn}2Pt4DSygjrKAo_>ms1;ML(C+8iwz?Qr3J{?@`Py0Iq#-lMe!t2DV7;7!FZ&_d1Y-))Eam4+lVk~T5|d^rztYSArWBUC4t%PG2E%f`oQFSx4U9EJIwCJ} zP8KsF9dZ0FIsg*DHf@msR_3#Lw&*OLXL;u9`3b(~Q<$97_*7P3lNb4${A~#^O}@aY zMFG(B@A~`B#CfbX)hz@oi5!`4=4EkM90D3xooUlQ>o;;bpf#qlRk;8F002ovPDHLk FV1f~{@1Otx diff --git a/data/themes/default/note_sixteenth.png b/data/themes/default/note_sixteenth.png index 661bcb7be0043519a80ee0e6b452bd71aac3ad78..44c900cebdedf97bae68dde475624606309854aa 100644 GIT binary patch delta 1085 zcmV-D1j75)2-paaDt`a~0002_L%V+f000SaNLh0L00l7s00l7tx9uoW00007bV*G` z2i^f04kH${atUAn00ZSoL_t(Y$DLJMXk0}Y{^nfvmTa=gCe7{!7LqjvYEpt!OM|u# zwc?`UjXr2B(t@`V=|d3(17fLAkcyUy2nIxaXr(EQ57Am`sDDw3=_RPCn8e6#(;Sm+ z_m;DJ_MAQE%=nPmxTYIv_J?5xX6FCq|Nig)N5q{O0pJ9%>B%z(uei1ab{i=*t}Chu zfR&BgOxOT`2*4xCQX3J4&d93|o(?{{WjlaI04}~yss$*Wl>q>h$wH$u6nJy%=aFN( zq5%8=JOHG%Ab%SH_-{lyg#hC1cyaqjN54G27eG@bkg5P^(M~hfEQs?qZYc?QI2t>= z`@(@kWgx3`Z4`h3fT`;7>0{qNof}^`LniaKbu~*eKI1^=Cy)2@oVdAfQdI;FpS!ho zi$DAOk@L^1zbJi}$>oJ#HPp*B2k+|d-2OC?>XK*^wgo*kH;qU#oUK0;KbSTXvaQI zlUP*_01#+Jh$iH~Bb$$$RYnJ9-oJRlRJHgDg`WGlq=l*gs7@1h(p1R2iBv2>-ti8- z@xXWc-+$E;+AxnotX8HB04&|Oe&w~HzU1)i0Qq_OrZk}yoeF!F>snf_6{RzMB$^iYfHu`ec0a{yMAObH>fFKF3VDz4Q?}Q@4hfp^2TZ{p)0e=_(R5P#NjGwynUTM2F+;m@QE&Y#k zftS3<*Uo>N9Vy9`@}cLaGYYerO++H*ZX|!;4`9+dua)LPEo$XW{%5+LYwl=yxUSagw=BDmnpwK+U^Wp##d7>6>k-jl>kbIJyN?b;@{Ib*w)eB9cl`|SLX$#K(ej1JGQjI98{Oea>G2~ z8p#!?e<(E`?^`-IJH-WHRm#E2ueG!J^@bLIcVk@xg3SShLm_CI21+T?*)+*AEnF_& z$jdu7XD(3?$PT6bv2tf(E^4z%Xo^Cy@fM ze|u|WjNhlFfFSW~*RNkxD zdNQ>EX!hLl2U&-3!Z3@DR3;5smSNf^)O?N=<};s}=ao?a1@4$tXok17-*Sqa05*K` zuHX)#-MgQ-r7i%J<;`iTXs67t7tR4l1JKIoSl9jmLHDSykhpZV00000NkvXXu0mjf D0UG@I delta 1083 zcmV-B1jPH;2-XOYDu4d~{{a7>y{D4^000SaNLh0L00l7s00l7tx9uoW00007bV*G` z2i*Y=6cq(qhlPLu00ZMmL_t(Y$DLJgXj@ej|K0oEYtopeNwY3Z29-3e18sEvD>!8g znX*k~W3Ug}4XNl9-SEQ@{ZJ9gL_`WxCMZ~tf#_sT>j&9}V}H8MVaM88?B-f+X{$|_ zw8=}FyuA1N-n-Wiy%}*$WzB`dy>Rb6zkAN_cg~e?dxHRQ0a*LuiJgOi4)+s_syUTU z7#09tX3GX$1%L#=BPmi;lF0h|UWpyQ>)G%l02%t)`=o z^~SaV2maJ z*Q^WO>&;y_bZyW4Z~0Dr6k2guf>*A8{h`-dcLVSNsDG&jU@2^w1X`bt{BY09k>@YI zfBn1Jq3kx!xJd{hP4_qSggY8rgtBN=001PVp8DGlG=22UH}Qi*pZs|xf5Z3?00c}B27|N8~`9p17K4nx;1p@Oyb+_f!?trR>7JAfLeb|hmbU_j%0(SjEs|5oT8YU zRLRl0o_{y@oPG4&Lel78ijPRu%9I0uW7yND4h(iqe4p-K_?66Qmt-s~=JtAGbQ1t* zH;kVF*Z>$^rE@MwUIdUD?i>H=+}k5N)FJB^eMEu_cWhubGp>Cxd0YVSs$@ziVE{A$ znS8>SIQP!g{aVU6zXVR*(XHVJZYM=V7%iKZHh%~>00)2xAa50|x$DQKJ}B+`n!OK~ z*7E;2r=sK~v38X;yOLa)Fk^01OK`>=LWz{0DO?Z_;PMKumPMh|idhkrSufaF)|O-2 zL(PN|$=2<^M!%dsDWYSQ0Av7Oc(FFPEBIVvTjP_yI$zMXY&|oUxy(5S=bYY>LfRA$ zY=2}n%Z&B^voD`sOjiOZ9rnmkITqX<>}zR@#v_dp1blutj3FIO$Nxyqa>5{&al_X% zdt^_@y(KY_=^Q_u91#MrD{-*&Yi*X^Xb1)30bc{cjbYpwX@*wRz!-zNppq=~=5qPA z?~C0%b2-~J+&4Z6zyNUbE3Fhk4e^qVjDK@Djt#>!Ft4Ven>sXIgJBxbOw$o0G62p` z-M^m~_gRVDQq9N}3WLWyUd30E zsRN+sOgM*guG|sRGHcS=3=~;`?O4cbd0zZm|J?e~ItxG-j(LSzy?;9$JSN7)QJW}UQ70Z;)H%hIvp_!ni_tN8;xg%tn*002ovPDHLkV1hE9 B{pkPz diff --git a/data/themes/default/note_thirtysecond.png b/data/themes/default/note_thirtysecond.png index a3daee57927420c2b03de184fe65194e8346a90d..204325edc50e362425b569b75a47b9d45e5f3ca2 100644 GIT binary patch delta 1168 zcmV;B1aJGN391Q@Dt`a~0002_L%V+f000SaNLh0L00l7s00l7tx9uoW00007bV*G` z2i^f04kIjbe$dhY00cKlL_t(Y$DNf~Ok7nM$N%RpvoSL)Bg;Tj3J6^(ZDS%OL1J3# z7ENR00`DpfCUi&0L&1%JbQ7`I}deMwC{cb zfDeGnbb@3GxPKj{FmNEA%GYX-wVmwPzY-)PfG*RpIuRZsW16xs9TdOcGxp)0p4VIM z2FVD(xkT6EO{r_N<%b64Y@n0&MN*PSd1J$u&%6yFFTE!GD)MgwkiDs?t~nBx5?R}d zo^w53GIQg=nfL8B@vki2{j7u7>%0%<#}_V-4+2mDuzyTzz!Q-pjxD|;PhM>~7C13D z6dRs7Xy}IS*<5(Iv~l}3(;>1Nz>?Mp&w)r3B$~op1%0t?q_acm3H+fg$fpS*oU<@{ zjhTLuQ3Nz9--`V=-%5WE{X%ZU*>QGpxA)YeU4|0_EXAbIz|;@`9e}~FvIo4In(CUP zi!q%Ocz=E9-Lr?-jCLiqW$ z=y!GxepmTs{d53NoqO6tzcLLkY$eI0sut-3ISxNr7Hm-BnP5n z*ME=B+Oum)a;>O^73RJhZlS=pZ(~z_rGJmto$X7d3^_a+?B|W8 zd%8IelF)SH?+-4tZvFV_F2QZ9Dr_j*9vukWgcb4~-n)cyZ-wvqjbD^imRA=)P=p+> z2aExsGJo~t+%3b-s5LDafE0iPO(+ZMe1Gzs;I>t13(Ayv24R`}02kj-cqq5fSDok0 zg+IRtYm1AKOeVn?gA|oW#E7p=>j?%x1F$IM*m!v^-ZuXApVt7;JBw^ZU?(22&M*w5 zQYomaijWk6tSU&zNhq2MRn>LVbCw2?r@tNfDA+r!n80NKOXoULEEb7HN}P5Fbbmv~ zY&Zx?DWs@`xlj;uebb)jzoRa_m00{s|MNUMnLSTYsnIFag delta 1165 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 delta 1061 zcmV+=1ls%22*3!CDu4d~{{a7>y{D4^000SaNLh0L00l7s00l7tx9uoW00007bV*G` z2i*c17A-TNL8b8k00YfQL_t(Y$L*EPYg|H&LbB(KGjLxS6YQiDG?DJd19t!_Z%)hke^@t zY3bWu)4ilEJe@|Ag(w~Az>VyOpE|tIb$i*}0MUq*Ykzs-y5~+Ueg!lD7m%%QwDA6c zSF@>+`R*+2;pApmzcUh?GL&=MK;Y`r80eGM#h*jGb`f z`UVhg0~n=Lq!ePfw*tVAL*npNLPY>d6UD|s912JP;ntA<29R9>rPOeT!+b|=#~RK5 ztowlbfPeoEptj|II_S1)N<`E>Jn!%@F=Xp5umB@+7f^3IX)Ot5IM{8_)*qbM>9J*+ z0&E})z2r94YEou$^Sak+kjD2NP@ zwT@fQJa}~f$+`V=rSe3XAP87lU6HW0+0u!J67M-hXQtp3s7zOwEKZWKGpg2Kw*V_O zpMP3#%FeO;s6)9lMWsATE;~vu^jW7r4%qgb{f?7&N(HCDzH)_$LWy)Lt?KS(%7~KU zW_OcXvql(&c%DbKUgi2q^&;R&N{Zcnhi1FU;>uqbW2iUl)LQju>FllVfzZd#Z*(@O zuC3zv9s_T{t$LN^$vrzF6zgX zt@cVsE)32LKBvPPFaT2KNpmPsNgT&!9~y#l!Kv`~@N#_P0p!dp=A}d~@ra~lS{~Z+ fv;Uoc8jr@`^8ux{P0dZR00000NkvXXu0mjfLFNnE diff --git a/data/themes/default/note_triplethalf.png b/data/themes/default/note_triplethalf.png index 5c8a7e90c88eef94dc05180fde462abe3c09f7d0..a2c80fe194e01c05190e0af4b0977e49d1fd239f 100644 GIT binary patch delta 1080 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 Hu0mjf5kfX9 delta 702 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 bm!-b|(SizxToL0q00000NkvXXu0mjfS&3q& diff --git a/data/themes/default/note_tripletthirtysecond.png b/data/themes/default/note_tripletthirtysecond.png index 20e2ab65aa04fe356c3741144d9eb20e36cc41aa..9f8b31122b7c30c619b91a091e9d7c79774bdc9f 100644 GIT binary patch delta 1452 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 delta 679 zcmV;Y0$Ban1;quBDu4d~{{a7>y{D4^000SaNLh0L00l7s00l7tx9uoW00007bV*G` z2i*Y~6E7~Jue^T%00L4;L_t(Y$L&>3XcJKo{$_vk)9oga)L5Dn5sG*a#Giu^EJ(2z z6?^H)Uc73B9=z$*gSQIOo(mqNMbIL65GvcztT zRM0~QhR3q+%{TMCZ{`7e_OFe0xtDhfK!G*r0N_giZU&~c5L}h6OIKttPr3_0gn?*H zf|L9o0T9>DXq~x>xpTH<+fgm*uM}2ZFN`kC18@LTCD1P*)C52W(1ugUnnUKDY*)4~ zXJxfa`~YmjhJVijm2Z{e+~oYVrSYX%0N*7@kT$3x!BqfJ?UHsxzoI`f+KuDsSelYv z@?)ajKAToLmiJky4%RuN9#StmG3V9B`;BEu8Mi`_3Lvibskg|WF0m;}m8X>(g^9wP z45Id&?diM<*C4VTBtGXQFV``8iSC->R~t$&-6)X&UfYijFyb-Maa(jWk+ z#TP}_oHFmG29giFxYrB7kcqj!tAGFyr#JxsaIq$)#iBguNdN-iuRH53Y93Z=t4^2{ zm5}CPs?b+vcFCZWKBS)j5C_l(zye_FIeov^>y3PJKEqjaJ^-jU(i5g4lI14Md**#g z(Etmsa({^@c#&Vihd?)uDp_TaB6N^_cEuBM-h1fHNXd%eMTY?>0Ae_aoO#t8CyVks zmCr7h{Wt!wJLWzQlWDU)&;UdcLBhCc3?hSmiqc^K0(F%AFa9$;#-#h!Ey>K?!1!pX z(Y8gP%WgIUq7ahvO}ToFng7YK+ipB1@a;Ev=peA8zcA8y@74Ri?FTaK-3&BC`4|8I N002ovPDHLkV1ms$K_dVF diff --git a/data/themes/default/plugins.png b/data/themes/default/plugins.png index b7cff0117d47866f34eb5f60ebdc8842761f2a54..5ba9bc3c90e74d1d35f3122aa28cda84e107782b 100644 GIT binary patch delta 2097 zcmV-12+sGX5xx+RB!2{RLP=Bz2nYy#2xN!=000SaNLh0L01e3i01e3jueHZa0000P zbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$XyGcYrR9J2?XEXU(6I1>DZ_Y2e{cie{ir78&xpU9t@)N-eh4R!n00)}_uHxKfhpS4w z%MPlsbJYvaoqun9>Hy#T&eOjO!_0&Ea^=K9ouribzK18hy71)35~>JsSqORAI#(TI z|0TD3-=46vrtPOB4!4@`WPVT!HLZ4(a*CN)g8j zV@&MelUlw0=u6N4w&nwzJ$ts`g@r#LL>dIfm@L5R(&C-{dvF5xdX09gNxRhquEF6n ztn_cYEq@3@^7$fD(?>Xc=Kf$TU;Iq<{kOjWd>{doO+5#k1Q3ah9>D(${jZewwmorZ zPg6V?P_M1=;l+RP%8P$QN=ejM|32`H{M^0we%?9vv~!8_)^7{uj^*LX-nK_4!8^ET zyBX1KH^C7Ap_E4Y&N-a3Sm$uo;+)0zy}bm7(|<6X9@TR`OayRjENSxu9L>O8S;%+? zLP$@J>M`J)O@yt*T8q_|R4TRCgC`Eb1LH~kR1V&(!^7p#Qp{!HjXIpn!4GE-1n|8P zoCKAKT8ps;V-40O0DFu)nt}OzQa_o4*K6?D6x>r7LH%t7PK?1bvrq~51@JtHkYWfB zgMZx;HU?voddl}8lrWot<74nh1+H{Q>stxoQVZ@W!s-B0GJ*Pc3(geb^>z5_J~0AF zIdZ^PfM<4yYmM_9zUSi#K0H(a?ULiK%kZt~#A-nzd}RaPZ^6Aq81rG%Ky2apTkwrT z@a+8U>aVUN#mHM96=OWPEv`L{#3eS>Vt=@>YcKd`lth1QL0NdK0q->6M{}c)`A-X~ z8}MOgUkAjOMgUTwFvg&bP7bXwS|g=I?3ak2Y`|laaJ@U6(HgXM5+5y9`cy}cMpI)!eX0JCq_u1U+ z-43wjf)qms5LoNT7fU?()DOsH(qz(UGUY#< zahsUz{s2il7*J|BYsJSOUVmnJ;Tokl}d$~ znHkFEGEz#~ohIFGmsBcXZFPx_jSe$2^UTi9GCe&_x7%f{5g}7qJbyohl#(C_D3{Ch z`+cNaB=GJk-q@n-fndc6)WOi8*mf~1*WE^n4O&^oldj7yiB{@B9qM_rH>E- z&+`bwkV>UO5Cp77UHbh2rOF{bx^QS>9Ma`%dMYXl4wzk|f z#u&f=dbAHXXM_;HEKeT(n&-WIsMki{wqA04@ zqx$+vw7#|+)qmI5IwYI3C3%Ex)q6l~c--8bhOtror-QKgcc8Qb&c#Z1TFofhXt$zv zyV-2kYtj13twy)o>Fp5N5;8yws1JqKcZhBbuUo+G`8E_ni2J_y(D#bv$zOEZty?R% zZUpOV%N;cssC{OnfX0r&w}k4zV8{L2{dRw8?*SM>cq+i%z**o75bqG#Dbxh?K45!< b4l4fzs(Kid#R2p300000NkvXXu0mjf6qXj5 delta 2203 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 delta 1464 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 delta 1540 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 delta 452 zcmV;#0XzPk1cn5VBqa%ONLh0L01FcU01FcV0GgZ_00007bV*G`2h;}x1S>lwoICcB zTP%NkNkl232;;%4Nr&J_slieE^20`>X$w}OM5?icik@(&cd&el3q-8ZiQ0000gwlo_e{_3^gN8aAsW1l3yPqUh@jq8mY9R+Ax452#7NwD z5#xZOWD!(Q@gh+qAU?pGL`)8Q*rO0Of~*H$F>z<6r{B-&E)PaQVUy5X=c@XB_5XkW zk0P9Nf9zxpPVRr8)oML%>c-s?6~(Hmeu? z!#XC^Qh#)>A&TO2q9{V55+q52qDU|r4Nyu!f5^X8srLd^RyvF^Im%_q)zn(bv2RXXeFf~IBk}&1({S^Mk5Z41V zPu#J;+v$GZo3{t^?Rl7*4gd&}2-DegGI6HMKdyYUw%z$_+O+ZF(t@t*-?m%Uz;1W2 z%N}6Q!XkF>T10=Y3#(~$)Q0>i84bl+e*ge0k|b#o6(P$qR8@v$w4o{LRlgGuP8aRM z+_&8Y*R$zDQ4~n?3{eupab4tj2F5rXe+EDF5hXFAEKX_x2q7C@;6JJ;3Istwk|mHu z8LVQ6q6m)fV&YDJh>i05S^y#E@0Jpt+?tGcCrN^a+JGpED9aK_mcWaGF@UG|f9n_7 zwj%%UB75~dQ;vxOAii{REjFKDvP%hX19%vKadn$V2>FUryb`~8;rDA+;U7T%)qRKU zcIWA)Vcx4K3aX0bNs^s+!trSH__=j58mdY_76}JSS$2uPvzgscFyhE9lHIe<4D9}a zey4|yHHSt+MOkuqfsZX`oL|}cfAiqxOJ~2XGwp)b(vRu7exPZXm~XW)u)DZ*VGnNZ z_F*+!&^29F6y+2d4QoZafQlaxAb=18PAUKb7-Ps;3C0*$#ZdC z4ZeD@ss*4#7?r%bXF7B43Zf9I{P$2X#t^3oD)0|dKVGdH>4b9*G8(E{M4v&$mjUzv nB%EL!75^-GYvcS*zBPXVx!bilX7e^U00000NkvXXu0mjfH{sSz delta 1035 zcmV+m1oZo(2%rd%B!2{RLP=Bz2nYy#2xN!=000SaNLh0L00l7s00l7tx9uoW0000P zbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$Tok>JNR7i=Xl*@}8RTRd* zQ}3#&s(w~?wQ=HNz<(g1q9CYi9}F=IaT6jz42DRYxRDGEf`6D%5JAO_M3I2_0Jn-{ zkwp*}ZU!aHCI-iZba%b$R&~9u3&$X0#-TjxbH3j>_ni9?=N$hhCYzJTI-SmQmSH_0 zi?Y=4=GT;^Uv3}T{)9ivYibLiDQRPjKX3=`@o|5IuHA*Es3^)3K^)+=H~aqj?E1RY zwsSq!->}E_@qfPE!)P#qJ9J?g7NRtQD2T|H`4j!Le@1B4{V6gfQF>XHB*>BsMOL7z z8cbsak|=>_FOj3&1e&4^tGZH_#S$!M2;&d}37Go}qzx@PBTP19`xl|_+% zJ7?afH_qMoolcQy>6R8}an9f8$=_@L6JVdS9~litU$}$uWY8VJG)w?M!V)Zk#eC+? z*RO3{yMJ=G`hAydoHbUvcIUgE-P4_(gNZZ2us1;6G?;la)J;81v*a_H(i-37)xT-% z{|^Wok|gVjBtuaY=$Z!G>_As_h@uE00zikI(s{Vm1OQgcvP53wNLY$R;9*%TQC1cF z$VZe!NV61ao@T881lkUh@EJ{2K_nnsW>94XRexO}VJW=O!`z?$%q;fPT{ZSwvUS>W zYNh@Wz7H=<&I`6_Kcp!tIByD;WtYR)oBs0Z&Q+R{rbg;v z;(t`-RldvLPBLJ|>QfwbeD;J354(-GgbYD5|PnpeePob^#nGi3AW4i2gK_vMNzj zC90}IRadB+`u=Xvwc7wB09Lll_RcN52X#8mxoh0?0V=t7!0f_D*)WtvCSu0fsodP?GsK5&!@I07*qoL`3f=)34k#NbH>?(sNi2V)Nkl!0@+McYd@B3@xR#bUJq^hdQ z%vDttMNyVz0KkUsbSFQ2WQl*g`)@mU4z8Lx5s`>6Gc!Bq00aQOuN4OmY2#h!f!;ru z_~-M%*k7EgYST2j-S4di0M2*K;Ca^U z6@YfTD`$_d@W)waf4)egszlW9t$F~c(bh>#vj&-qPAdS#Ex(G{2|Iu1>Xu|X0RSJs z`Xq^tELkWC{bs0MJXwj3ZS<`XAio=aeKy#79eM!by_}}bsT0SP*XC0RpuBDBHe8Hy zGg2Q*HBD1hRZ&q@QEw`6nmz5B<9XflevNv`%gM&L698c5OSNPiezrij*fvB2Ao@@& z)g(z20#?C7R?2Fxl-WFPT5Yzjz4#fwnceJPzpTn%81btM|I7j~ho$DcY->0i{_9P) am-`Qe^XQ~N%*ti}0000(_; delta 478 zcmV<40U`dt1fT?vBqa%ONLh0L01FcU01FcV0GgZ_00007bV*G`2h;}x1TzV5Q1UO4 zTP%N;Nkl}4sA99=-HqAz_EHdoM1h!QnxoNZ?uGxB0K?(XTr>0TJP3mJm$qG6 z5m8lD_1-U+%QQ{1EDM3$Am;PIp=^7IBB26cjC>L zn-!_--QEkPLFaQvpj6eeES$^pJc^;J+C)GnM-_QhmWKq&?T2zs7aaiB2Cl3>Z#%{yJhTbmk)W4KadsYi30T8{9bg}9>7!3aPCO0npCyOP> ULv#HQegFUf07*qoM6N<$f>e>(MF0Q* diff --git a/data/themes/default/square_wave_active.png b/data/themes/default/square_wave_active.png index a79a22b98b98e0b2002db440aa7a2df8c337c85a..487b5aff74f5a1f795fbb26121483c85598d2ef6 100644 GIT binary patch delta 439 zcmV;o0Z9J&1Cs=hBo78+OGiWi000000Qp0^e~}>`3f=)34k#JNIn6qeNi2VNNkl4f26ot=y^Cq*zAZt*O6oLwZsKiE6#7;biA_|D#-wV+0o{$ zqde4o1n}W?fAFrl{XGKsapQmd{mT;u1Ofzu%(4Hr+O81+q)kn|olH_u6!nnYbob-N zwQnZbuUmffB+WG6Mi~J}YMSQwCqiM9Nx>B3=SBI6Cd56{6y6v;)vI zmzc**b7m(Ufa$a%uXf#Rg@TgYnMIHUKqhAvj0AwC#$^!h?t>6WQYL>gxVzCv$VBEf zN-`^lEHZ(R+y@y*5*Jo$l-UU^^K_Rp1K>)-1sbe>Fp>mne!o&_WODaqI5NrqJdink zapmm!7=TK%M9l_wH%POgsI$7fD)#!}qjl3%=(+Kw53K{>W*F{_%CC$4-Mt9lX?O46 hT|E4IDZ2ph8{~}t;8qV7;%Wc@002ovPDHLkV1n@P(;@%> delta 439 zcmV;o0Z9In1o;DyBqa%ONLh0L01FcU01FcV0GgZ_00007bV*G`2h;}x1p*gRz@o{K zTP%NXNkl@-lCH+sN|_XiM#0+yBuY9gGTaxIDbm hiwsZiHst`|FG$=7Nf(ewA^-pY07(Z$PDHLkV1oCN%Mkzo diff --git a/data/themes/default/style.css b/data/themes/default/style.css index d1a43900a..8f2c0b699 100644 --- a/data/themes/default/style.css +++ b/data/themes/default/style.css @@ -104,11 +104,15 @@ QScrollBar:vertical { margin: 13px 0px; } -visualizationWidget, cpuloadWidget { +visualizationWidget { background: none; border: none; } +cpuloadWidget { + border: none; + background: url(resources:cpuload_bg.png); +} /* scrollbar: trough clicky things */ QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal, diff --git a/data/themes/default/trackop.png b/data/themes/default/trackop.png index dcb8036e2ba698f510e4463cf7470842eb2c4ce3..bc089652ecd5fa3139d584eae9daad35261ea90a 100644 GIT binary patch delta 890 zcmV-=1BLwR1-AzwiBL{Q4GJ0x0000DNk~Le0000H0000H2nGNE06T3*`jH__e*-j0 zL_t(Ijb&6pOk7nIJ@?O_kvAHNR-2|Il}M0C1r2V5MblOxCM3Es!6lKv%2*JiI~O1< zTnNc9p<8Aajf|f_A^}{86bBe=f@rM9v}uJn#7Gwc&Y$`7-a9V(hm87?m%N*I&pjvS z-TOci)jN~PoU5EY&s+CA?^^&df0CG=pFj8Ce3EcbwH6l_-&IQ8otT(-5df4@&&6V~ zW&oF0R#qC7Qg;^?7Ty<;Y8c$=Kq>VNfOu0=)5`Ml^4ChKr$j_jsnkbGsd^EKCzHuC zfMx)xyEY&QFrh%Adp0N?PW_`6;|X2K~O3b3J>D(_!*Lqtgf!UF*Y{#rG#eo)YjIfL?l*W z*IN4|ElG%o<4Me;)ogFfi~jfE>vKnVp@z0pNL(7p=7}0F+9l2fe+$eE@y{ zaGxa8>Gbce>z)@81VLbZ-@m7n`i|s#uJ8L-0GuUBYb^laydXlRo>%%TIB(2u^rt7)^fGZ*r5s|317QXNQ>3QA< zySuw70Fd$V@r$8Bk6LRD00B-rnc?e5sL&c?2q0pNDemv@U!9qm*>rv1zoWIjvAMZ< zZ*On!u&1YIQbbf}f5mBklZ4i~}w@JsFO?e741z3ToDjUm Q=l}o!07*qoM6N<$f@0#Qb^rhX delta 684 zcmV;d0#p6B2kHeOiBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZzBe*$Mo zL_t(IjdfE!OJhM4J@+L~W5_lx1U9a0uo3(R5<3gEN)_4EHWo=C*a#N>ffONy)po+J zO6(*^NSEM02y7!+`~pFn4f7^>Z|>P*lVDc&z=atuGu(5}IUtGGb#ZZ#9-r&=daGWq zx8CcG%fl;NUS1YvW@dVgMq>p4e-eqr^4#3qG5|Chjg?d?)oV7Jh1YL{f z{1(82h_ppyd(=7uuojEOG9t2=%jF)XKDfTVE~siJ48x~HB5?!YGXTLf2;k0IyX5gwvbbUK|h$sT}NlJ_J(0!ZQ=L{Ve_Jge%0hzz1A$_h!eTCEl5f83RbERYlc zRMkF!ml4Hz&+}3uBF;HF=kA?z8~J>`>jA*}`g+$|+cw6CF$Tt%eh>sZo12^2t*x!B zwRWf9@Ar){2!cS2G3|Ul-vt0UJw0s!SXR|fB*&`!Di({`*W;g@ob)`;`!b@UBp*rs zj2mMhA|MG>eUCZ-z*-9te;My$;)98d$H&LtRrM=Lh{$h}JEcx5)n~VI_K_1WaHrApesj5M`_>p zd#XAM;9gb#E2DGHkbEY&Kyu*w{$Cjn4-X4r7W#w|YoQcQdw>ILt_geVfCMx-Ie2Lxl#szeP^ zOtor*(in@?AeNRU5?ZX$5N)W`RPBp_3Z>QswKQyv+GWcrd#>~Oz!qDaWHOV?e82fm z=KBUDF|)t+Q_HgH`KHmP{HD>Se>?z-B$W-rUvE zS8+Rzp#wh-16cAuNb|YR8~2QUIk(hI^^{ABs>Cv;=1O(kv|*bTyoIs(e>!29DcbyI zch||9hG(MYYHUJSp$Pfq#IXr%_<v1Z){= z&P}Afa)2-+fj!{#wXJV_e;+`!uB~?S)Gf(75mV6ANc{!p!^O`(0bqb+RyJpL{ZX*O z$_oiU5kUh0;;y0Fuig4EfI$GiljLJ(-w6FU4H1PP43KgRKOUIlSLLkx&8#(9Q-LJn=i&cw&&M@We@}V<3PKVazTS50Z`U}zPQo`y zLTP~zD9gqEfry?ccPk+Plpvyp?MPI3_r!~XpZ4tp09pG*?SmtW@`nP0K+(opIQ_mw zBNRtXgw)U=%n+#he;$t?+1R?@^e(!+sWF`LzRUJc92?819ZTQz%}9vRj>AfxmN`Na#Vjnj`PB!?&#t!nB?4leXg97ENLa3D&(bPV8i^N% zpZ)V_<|6w;x(t(LK4(2@6Q9 zuC4)KlDt6jB*|!20F!z3)S`Z)Dbw)nK>!13*K$i;I{?7b^}XwFI#Kb~`Q1N%0AS&) zyI%P>6hm1_5_hz3c;tpHcW(!n|cVkMU~{{qIB-5sXOT8jVx002ovPDHLkV1iLH Bw#@(l delta 725 zcmV;`0xJF72a^UNiBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZzBe*%z6 zL_t(Ijb&3!NK|1IJ@i&{jxHWkvM zpN&B-YEdM$sZD{abmJzX5CX9Y^C!d1d~e>&eDAxb#ppEFg$wuNe&=wx=N^zmeO{O! zNUhcRrGb%iO9Lad-pb$JS{l^Ff5qTIuEF0_=nC$)1Aw1Mw)u%<8vyhKgYCZO7kZ0KC>D}0Sv+Brq)Zq^|Q0wk&Y_I-J=b^F#WDHX3{asSKVb*H@J{mFC; znWp0`preGGAqaxcNgRPNP0u!m2j13Bd7YVl+o&TfN9D+coxcvg%7-?Z3vD#Fa`1KD zYN@jl+j3k&$2xibE48OTcC2PufBg7JU`1K%N=lkTq=zD|tVj&02~qlkVr{9gJy@IF=F9gb@Atmb!y1V@FfcIl zJTnaQ444`9zPY)1trqX@?mo%oe{xR%Sj>#=?d@yN*E2IT)LAZY^1%ty`@Mb z@|w-B(IM2q6r^Fzd%<<_i)b1S*w^ZADUgg75o~QetasD=|7c`T)Qqs(}iH!oPt)APfLXDeUj> zKbn}Bm6=frBEyuOMQKPHvwdr`7!P6?EIYIV->&OkH>8wTiAeK24@xNjfa|&ffUFS!fa5q7 zDP^!m!pxRZ>S{b5f0Y1O&CSg>mY0{mvnb}u3IqZXB7&xAP)fn`Jh{5M zdN+|sd}%z6`Qhp5f9bF5>+1_MGczBR%VqXF53cK8a>sE{DwTMCe*VLajg4z>5HiT5XZc z{7W<%{n&L~q|@mKlarHgJC4JS<8Uk%dncRC-gjLW{r&y7UjP`){2w#_%*^tV06ovU zeSCcU_0rN(0zd|U2S5Pe#l^+pVzKynDwUcA@X{q2KmQxfl^tPbOifL_J3Ku6DS#Vw f`77s>TwwkOC|wJ(#1!$h00000NkvXXu0mjfh%~WD delta 684 zcmV;d0#p6Q2kHeOiBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZzBe*$Mo zL_t(Ijct=ZOJh+G#n0RqS+ZmcV+gJqH<5r~XB}IKUm&v9X%zf8qSe}1?4n>RBC(2{ zg+d4{JS6+#KSW~@&Ark0=4@dSj5siGhq-sSGruz+iT8efexB~1YqeUXR;yL|vG4oo zkM|AUneY3hL?Y4feSZ!B;_>)we>@(a1%Mz3=3=o}BM5@h`!_;z5Hy?33D5JI0ImU4 zjWNprAR@aWvH)Ph7?Vk*QrANTTCG+|RZmi>)ZOFb;{|{z0D@s7fXmU*(V6@E`?N8p zkW41`DV094f{ z04)F@nKZ^EL`1?cB*`lP#e61o3l^8*0FFjSH^s`@wP zoI{_4s(#iw0Khp1k+->qe_=S#!2sj&@$qkxKS@GF+NxS!TwL4(fTN?M63Jhl=Y3OE zL{ao-X=!O?fbrnqV2t#PHzeil?d^#$44WjcNmcjTg zy1Kezt-Z0<-mI;ytvKh3udlD&D2fV0eSKWdt*x!W%5H3IR5mv^E1%{1{vR9!%R#`{ S!{Yz|002ovPDHLk0$_rf7C(9b diff --git a/data/themes/default/triangle_wave_active.png b/data/themes/default/triangle_wave_active.png index 79a4c6807df21cbcf2dcf92f055ee053611f3a0d..f3ef94abc01c8988b94af7827b8caaf88932e876 100644 GIT binary patch delta 521 zcmV+k0`~ox1eXMm8Gix*0059Gx`qG%00v@9M??Ss00000`9r&Z00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-vi84f8Br~X9W0004`Nkl>1lZl(P17_<66c(V03u>$W~Qn|QA{Qi@4W*;2&$^8KsC>gD+RFn ztr_Pw^Fs)L1J30pV`v`|_mpS(KTG^tvk%aB1~o zwIGA7`N8%=cRy>r@$P3CO>A&KrK;nv1x4NMb{!CE&8{c?oyDd7ar;?@H=zCeOy{J( zv*=Eyiw9GnF}pfnkAdXa%Xw*9)f!|}C&xLEug?`t1Aii*@#xz4UaPY=Oka7Xbv=8j z)iPA^I)2dBrd;h`h=A$iJDt5@`^iYMV1I!^<1eK(8>bI@H=o81peA~sF)FoTm;i`j zBAA`2`{1ehU10SjN#1!Y)c$18$V|zgYQ8;RlNASS$p*LnJ(piAg#L?%QE6rX0000< LMNUMnLIPld0o3gI literal 537 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F?i!z-ScU6XFWwGQVJEe$C8rorB{B z2j@*Lu47z0CwO>H^6=i}<-N-%^iW8wSxl@&OsrL0yj5HxTtcE+Lb6&?vQ1Jd8i=H% z+oh#Dq~vtuvRrw?S?>Kg)q zgQ1b3k&%O;2?&^)m;!-`d4+{}rMb;~8)s){7Z+zYcQv-s z85tcD9TO81n;jdQ9Ty)TpOBD{n2?a1oSc=Not>4HmzS4co1b4>P*_-4Qc_Y{T3S(2 zQCV48RaMn<;nr_ps4enzaSY**4L#_~caTAV?Lxkl^1nq(d^=bvm~+Bc+ma)=1N@^1{jQs+L)#ezlu^RI13H>s~WGh=7y?3)SZT&02; zHx4rGiWk@}5o|r@bKv(<&C9!#E9CuuT9iCmeolaMm625E)muH;tj8An81G<<4m`v9 zJul5|!HKO63bWi=6rPuHI>w8{AFJgE`|*)cE-k25^WYpeplcaCUHx3vIVCg!0D;h^ APXGV_ diff --git a/data/themes/default/usr_wave_active.png b/data/themes/default/usr_wave_active.png index 336ca87c6e85c49035eb2ccb979338742404fabc..2309967d5d47f9146c91c68006391321e9ef5e8d 100644 GIT binary patch delta 459 zcmV;+0W|)G1lj|T8Gix*0059Gx`qG%00v@9M??Ss00000`9r&Z00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-vi84f8AD)vb#0004JNklCS`PM5tnj>9mFqR0VYt!3uYTG&am zHz0@-Q83>-+YK72n3=7$01SXm6f*PDwYzdXlC7A&FPD2!HOB)_Zx`yzC3L%8-}eoG z*LtJvnZ*;=x_=ai0!ZF?$oT-m=VtBMTIo+^vIan_)%vO*&zSP&Gyu2B&c$P`DMa*v zie)8$)TZ2Ef1GL0Vek)1NrhrU6J$)e5)7RHC($#a&)AQBSI}R2A3ISz+piAG-(9j5kjEun8$jQ(I z1WbX@#1sfjtQJ@~J3G6$IJ>#Kxx0IKczSvPfwz}mqkk|Egak)MMn=a($Hc_MWyQr! zi;ItsPfkuw0ivdqtnBRUtgO7eywcLr#-9fQfT1+c)5S4_LpJo_-d-j{frg9c)6UF) zARwSDs1V2|=zBp$^a6{Ei9=cYkxj4fe!WqwxraSoW_iJW*PK$B=vTI3>kKWv+pLy! zT7Ua*h<^Rc@^$xwAD_GTmVZxj`-I7#e|~jn3ly-*|GM|&V&9^_J{L01ciprzS=SIsuAM MPgg&ebxsLQ08kdA(f|Me diff --git a/data/themes/default/white_noise_wave_active.png b/data/themes/default/white_noise_wave_active.png index 8c8fa9d7f8b1abd5ca1b1b19fcde6ad77c7c65ea..38b089c63d7ff48ee786656a620cae7281a88d3d 100644 GIT binary patch delta 518 zcmV+h0{Q*+1C<1j8Gix*0059Gx`qG%00v@9M??Ss00000`9r&Z00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-vi84f88#P}!%0004^NklvV27f~oT_yi!d#0V9>F&=% za`Cox`cYNXsep5f0F1}uG)=YEQc5BMKt#;U%pnBlTu~I(S_!~=Z>3-M!cn2~i=q8T z=_;u-uRE@Fnji%4Jpciqb?@5t*uTG@TVH;jg&Squ048;@(#TAOX-h zS&1whzRk%+VM6PL5hfnKJnNjS_kPX$>cNLx{i+*NCx1+AKVPP=G71dKYU+}b8&fB; z06+pzll=Ip4_zg1rHx4eK&(9S3V_)7#^=2EE(2~5fWcq@;@A{bU+Z}dpt`E`yk?HR z-&C_Qv2i#YN&q1Q05DNaY6bwPNwov{#V`M@j3;+NC07*qo IM6N<$g5&DqL;wH) delta 487 zcmV~_W=R;0Ri~|0r~*} z`vC*(0|W2_1Mma{=>!Dr1O?><1?B|?>jnqx2M6s32-64%-UtZl2o1aq4!jKywGR-t z5D>l)61Wl*vJ?~E6BL&e6y6jR-xL*%6&05i7mpVjavK|G8-E*U8yrs?98Vk^TpS!- z92{vK9BLgLbQ~O%8y-_0A739JARr+uAt5axAub>xFCihWAtI(CBO@XsBO@d)BqyLJ zFo`fUtTZ@nI6Z$oKukYCjX*+QLP&{7N{dQMi%L^dQ(0MAT8vs;TwGj_TwRb|UteEh zWMX4uV`OnUZ+mcbbaZufb$EDqd3kwydU{!*^&$WO0HaAn zK~xAGRl&;&!Y~j8(3?!sq>T^6suXnL2l??X#f?irP!Rh{lNq;q4)90eWJxP15lPc% zz^V09N!)s25Sn;#*MQHZlB6`w-7voUwtJ6l1c6gGzF;2Rt)K2@PCy)D&OPV&c^)+= z784AweJnCG_HLov%GZrs5;PW-_q!R1x2}LeweMXC!?5lE11U)b)Im0(0HMyX%$CJU d3I<#J_ySDLNX&Mrn*jg-002ovPDHLkV1jJnuQ~t# diff --git a/src/gui/widgets/cpuload_widget.cpp b/src/gui/widgets/cpuload_widget.cpp index 508581a74..f634a6b1e 100644 --- a/src/gui/widgets/cpuload_widget.cpp +++ b/src/gui/widgets/cpuload_widget.cpp @@ -45,6 +45,7 @@ cpuloadWidget::cpuloadWidget( QWidget * _parent ) : setFixedSize( m_background.width(), m_background.height() ); m_temp = QPixmap( width(), height() ); + connect( &m_updateTimer, SIGNAL( timeout() ), this, SLOT( updateCpuLoad() ) ); @@ -66,7 +67,8 @@ void cpuloadWidget::paintEvent( QPaintEvent * ) if( m_changed == true ) { m_changed = false; - + + m_temp.fill( QColor(0,0,0,0) ); QPainter p( &m_temp ); p.drawPixmap( 0, 0, m_background ); From dbe80e9f2be631825eba67e29004778aa3056c14 Mon Sep 17 00:00:00 2001 From: Vesa Date: Sat, 25 Jan 2014 18:20:48 +0200 Subject: [PATCH 036/110] Peak controller artwork fix --- plugins/peak_controller_effect/artwork.png | Bin 30448 -> 26354 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/plugins/peak_controller_effect/artwork.png b/plugins/peak_controller_effect/artwork.png index 1c5d5defb7155bd556f21a726ab82bb2f30cd00a..31296ca909354ca9680d46b0fbbcd12de5cfaa15 100644 GIT binary patch delta 7620 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 FV1g}E8rA>+ From 14e9694ecc5023e81a21a2e6abcf06c4edc14e15 Mon Sep 17 00:00:00 2001 From: Hexasoft Date: Sat, 25 Jan 2014 17:37:05 +0100 Subject: [PATCH 037/110] Added a vocoder LADSPA plugin into the tree. --- plugins/ladspa_effect/swh/vocoder_1337.c | 456 +++++++++++++++++++++++ 1 file changed, 456 insertions(+) create mode 100644 plugins/ladspa_effect/swh/vocoder_1337.c diff --git a/plugins/ladspa_effect/swh/vocoder_1337.c b/plugins/ladspa_effect/swh/vocoder_1337.c new file mode 100644 index 000000000..086faffb5 --- /dev/null +++ b/plugins/ladspa_effect/swh/vocoder_1337.c @@ -0,0 +1,456 @@ +/* vocoder.c + Version 0.3 + + LADSPA Unique ID: 1337 + + Version 0.31 + Added stereo output, renamed input/output ports, added, + added a control for stereo balance + + Version 0.3 + Added support for changing bands in real time 2003-12-09 + + Version 0.2 + Adapted to LADSPA by Josh Green + 15.6.2001 (for the LinuxTag 2001!) + + Original program can be found at: + http://www.sirlab.de/linux/ + Author: Achim Settelmeier + + Adapted to LMMS by Hexasoft (hexasoft.corp@free.fr) + + + Licence: GPL + 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 3 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. If not, see . + +*/ + + +/* not familiar with WINDOWS stuff. Saw this in other sources, it should be needed */ + +#ifdef WIN32 +#define _WINDOWS_DLL_EXPORT_ __declspec(dllexport) +int bIsFirstTime = 1; +void _init(); // forward declaration +#else +#define _WINDOWS_DLL_EXPORT_ +#endif + + +/*****************************************************************************/ +/* general includes */ +#include +#include +#include +#include + +/*****************************************************************************/ +/* LADSPA headers */ +#include + +/*****************************************************************************/ + + +#define LADSPA_UNIQUE_ID 1337 + +#define MAX_BANDS 16 /* max 16 bandsn should be increased */ +#define AMPLIFIER 16.0 + +struct bandpass +{ + LADSPA_Data c, f, att; + + LADSPA_Data freq; + LADSPA_Data low1, low2; + LADSPA_Data mid1, mid2; + LADSPA_Data high1, high2; + LADSPA_Data y; +}; + +struct bands_out{ + LADSPA_Data decay; + LADSPA_Data oldval; + LADSPA_Data level; /* 0.0 - 1.0 level of this output band */ +}; + +const LADSPA_Data decay_table[] = +{ + 1/100.0, + 1/100.0, 1/100.0, 1/100.0, + 1/125.0, 1/125.0, 1/125.0, + 1/166.0, 1/166.0, 1/166.0, + 1/200.0, 1/200.0, 1/200.0, + 1/250.0, 1/250.0, 1/250.0 +}; + +/* The port numbers for the plugin: */ + +#define PORT_FORMANT 0 /* the track to "vocodify */ +#define PORT_CARRIER 1 /* the track to control 1st track */ +#define PORT_OUTPUT 2 /* left output */ +#define PORT_OUTPUT2 3 /* right output */ +#define CTRL_BANDCOUNT 4 /* selected # of bands to use */ +#define CTRL_PAN 5 /* stereo balance for outputs */ +#define CTRL_BAND1LVL 6 /* start of bands level */ + +#define PORT_COUNT 6 + MAX_BANDS /* bands level */ + + +/* useful macros */ +#undef CLAMP +#define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) + +/* Instance data for the vocoder plugin */ +typedef struct { + LADSPA_Data SampleRate; + + int num_bands; /* current number of bands */ + float mainvol; /* main volume */ + + struct bandpass bands_formant[MAX_BANDS]; /* one structure per band */ + struct bandpass bands_carrier[MAX_BANDS]; /* one structure per band */ + struct bands_out bands_out[MAX_BANDS]; /* one structure per band */ + + /* Ports */ + + LADSPA_Data * portFormant; /* Formant signal port data location */ + LADSPA_Data * portCarrier; /* Carrier signal port data location */ + LADSPA_Data * portOutput; /* Output audio port data location */ + LADSPA_Data * portOutput2; /* Output audio port data location (copy of previous one) */ + LADSPA_Data * ctrlPan; /* PAN for output */ + LADSPA_Data * ctrlBandCount; /* Band count control */ + LADSPA_Data * ctrlBandLevels[MAX_BANDS]; /* level controls for each band */ + +} VocoderInstance; + +/*****************************************************************************/ + +/* Construct a new plugin instance. */ +LADSPA_Handle +instantiateVocoder(const LADSPA_Descriptor * Descriptor, + unsigned long SampleRate) { + VocoderInstance * vocoder; + + vocoder = (VocoderInstance *)malloc(sizeof(VocoderInstance)); + + if (vocoder == NULL) + return NULL; + + vocoder->SampleRate = (LADSPA_Data)SampleRate; + vocoder->num_bands = -1; + + return vocoder; +} + +/*****************************************************************************/ + +/* Initialise and activate a plugin instance. */ +void +activateVocoder(LADSPA_Handle Instance) { + VocoderInstance *vocoder = (VocoderInstance *)Instance; + int i; + + vocoder->mainvol = 1.0 * AMPLIFIER; + + for (i = 0; i < MAX_BANDS; i++) + vocoder->bands_out[i].oldval = 0.0; +} + +/*****************************************************************************/ + +/* Connect a port to a data location. */ +void +connectPortToVocoder(LADSPA_Handle Instance, + unsigned long Port, + LADSPA_Data * DataLocation) { + + VocoderInstance * vocoder; + + vocoder = (VocoderInstance *)Instance; + switch (Port) { + case PORT_FORMANT: /* formant port? */ + vocoder->portFormant = DataLocation; + break; + case PORT_CARRIER: /* carrier port? */ + vocoder->portCarrier = DataLocation; + break; + case PORT_OUTPUT: /* output port? */ + vocoder->portOutput = DataLocation; + break; + case PORT_OUTPUT2: /* output port? */ + vocoder->portOutput2 = DataLocation; + break; + case CTRL_BANDCOUNT: /* band count control? */ + vocoder->ctrlBandCount = DataLocation; + break; + case CTRL_PAN: /* Pan control? */ + vocoder->ctrlPan = DataLocation; + break; + default: /* a band level control? */ + if (Port >= CTRL_BAND1LVL && Port < CTRL_BAND1LVL + MAX_BANDS) + vocoder->ctrlBandLevels[Port - CTRL_BAND1LVL] = DataLocation; + break; + } +} + +/*****************************************************************************/ + +// vocoder_do_bandpasses /*fold00*/ +void vocoder_do_bandpasses(struct bandpass *bands, LADSPA_Data sample, + VocoderInstance *vocoder) +{ + int i; + for (i=0; i < vocoder->num_bands; i++) + { + bands[i].high1 = sample - bands[i].f * bands[i].mid1 - bands[i].low1; + bands[i].mid1 += bands[i].high1 * bands[i].c; + bands[i].low1 += bands[i].mid1; + + bands[i].high2 = bands[i].low1 - bands[i].f * bands[i].mid2 + - bands[i].low2; + bands[i].mid2 += bands[i].high2 * bands[i].c; + bands[i].low2 += bands[i].mid2; + bands[i].y = bands[i].high2 * bands[i].att; + } +} + +/* Run a vocoder instance for a block of SampleCount samples. */ +void +runVocoder(LADSPA_Handle Instance, + unsigned long SampleCount) +{ + VocoderInstance *vocoder = (VocoderInstance *)Instance; + int i, j, numbands, pan; + float a; + LADSPA_Data x, c; + float fl, fr; + + numbands = (int)(*vocoder->ctrlBandCount); + if (numbands < 1 || numbands > MAX_BANDS) numbands = MAX_BANDS; + + /* initialize bandpass information if num_bands control has changed, + or on first run */ + if (vocoder->num_bands != numbands) + { + vocoder->num_bands = numbands; + + for(i=0; i < numbands; i++) + { + memset(&vocoder->bands_formant[i], 0, sizeof(struct bandpass)); + + a = 16.0 * i/(double)numbands; // stretch existing bands + + if (a < 4.0) + vocoder->bands_formant[i].freq = 150 + 420 * a / 4.0; + else + vocoder->bands_formant[i].freq = 600 * pow (1.23, a - 4.0); + + c = vocoder->bands_formant[i].freq * 2 * M_PI / vocoder->SampleRate; + vocoder->bands_formant[i].c = c * c; + + vocoder->bands_formant[i].f = 0.4/c; + vocoder->bands_formant[i].att = + 1/(6.0 + ((exp (vocoder->bands_formant[i].freq + / vocoder->SampleRate) - 1) * 10)); + + memcpy(&vocoder->bands_carrier[i], + &vocoder->bands_formant[i], sizeof(struct bandpass)); + + vocoder->bands_out[i].decay = decay_table[(int)a]; + vocoder->bands_out[i].level = + CLAMP (*vocoder->ctrlBandLevels[i], 0.0, 1.0); + } + } + else /* get current values of band level controls */ + { + for (i = 0; i < numbands; i++) + vocoder->bands_out[i].level = CLAMP (*vocoder->ctrlBandLevels[i], + 0.0, 1.0); + } + + for (i=0; i < SampleCount; i++) + { + vocoder_do_bandpasses (vocoder->bands_carrier, + vocoder->portCarrier[i], vocoder); + vocoder_do_bandpasses (vocoder->bands_formant, + vocoder->portFormant[i], vocoder); + + vocoder->portOutput[i] = 0.0; + vocoder->portOutput2[i] = 0.0; + for (j=0; j < numbands; j++) + { + vocoder->bands_out[j].oldval = vocoder->bands_out[j].oldval + + (fabs (vocoder->bands_formant[j].y) + - vocoder->bands_out[j].oldval) + * vocoder->bands_out[j].decay; + x = vocoder->bands_carrier[j].y * vocoder->bands_out[j].oldval; + vocoder->portOutput[i] += x * vocoder->bands_out[j].level; + vocoder->portOutput2[i] += x * vocoder->bands_out[j].level; + } + /* treat paning + main volume */ + pan = (int)(*vocoder->ctrlPan); + fl = fr = 1.; + if (pan != 0) { /* no paning, don't compute useless values */ + if (pan > 0) { /* reduce left */ + fl = (100.-pan)/100.; + } else { + fr = (100.+pan)/100.; + } + } + /* apply volume and paning */ + vocoder->portOutput[i] *= vocoder->mainvol * fl; + vocoder->portOutput2[i] *= vocoder->mainvol * fr; + } +} + + +/*****************************************************************************/ + +/* Throw away a vocoder instance. */ +void +cleanupVocoder(LADSPA_Handle Instance) +{ + VocoderInstance * Vocoder; + Vocoder = (VocoderInstance *)Instance; + free(Vocoder); +} + +/*****************************************************************************/ + +LADSPA_Descriptor * g_psDescriptor = NULL; + +/*****************************************************************************/ + +/* _init() is called automatically when the plugin library is first + loaded. */ +void +_init() { + char ** pcPortNames; + LADSPA_PortDescriptor * piPortDescriptors; + LADSPA_PortRangeHint * psPortRangeHints; + int i; + + g_psDescriptor = (LADSPA_Descriptor *)malloc(sizeof(LADSPA_Descriptor)); + + if (g_psDescriptor) { + g_psDescriptor->UniqueID = LADSPA_UNIQUE_ID; + g_psDescriptor->Label = strdup("vocoder-lmms"); + g_psDescriptor->Properties = LADSPA_PROPERTY_HARD_RT_CAPABLE; + g_psDescriptor->Name = strdup("Vocoder for LMMS"); + g_psDescriptor->Maker = strdup("Achim Settelmeier (adapted to LADSPA by Josh Green, adapted to LMMS by Hexasoft)"); + g_psDescriptor->Copyright = strdup("GPL"); + g_psDescriptor->PortCount = PORT_COUNT; + piPortDescriptors = (LADSPA_PortDescriptor *)calloc(PORT_COUNT, + sizeof(LADSPA_PortDescriptor)); + g_psDescriptor->PortDescriptors + = (const LADSPA_PortDescriptor *)piPortDescriptors; + piPortDescriptors[PORT_FORMANT] + = LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO; + piPortDescriptors[PORT_CARRIER] + = LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO; + piPortDescriptors[PORT_OUTPUT] + = LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO; + piPortDescriptors[PORT_OUTPUT2] + = LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO; + piPortDescriptors[CTRL_BANDCOUNT] + = LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL; + piPortDescriptors[CTRL_PAN] + = LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL; + + pcPortNames = (char **)calloc(PORT_COUNT, sizeof(char *)); + g_psDescriptor->PortNames = (const char **)pcPortNames; + pcPortNames[PORT_FORMANT] = strdup("Formant-in"); + pcPortNames[PORT_CARRIER] = strdup("Carrier-in"); + pcPortNames[PORT_OUTPUT] = strdup("Output-out"); + pcPortNames[PORT_OUTPUT2] = strdup("Output2-out"); + pcPortNames[CTRL_BANDCOUNT] = strdup("Number of bands"); + pcPortNames[CTRL_PAN] = strdup("Left/Right"); + + psPortRangeHints = ((LADSPA_PortRangeHint *) + calloc(PORT_COUNT, sizeof(LADSPA_PortRangeHint))); + g_psDescriptor->PortRangeHints + = (const LADSPA_PortRangeHint *)psPortRangeHints; + psPortRangeHints[PORT_FORMANT].HintDescriptor = 0; + psPortRangeHints[PORT_CARRIER].HintDescriptor = 0; + psPortRangeHints[PORT_OUTPUT].HintDescriptor = 0; + psPortRangeHints[PORT_OUTPUT2].HintDescriptor = 0; + psPortRangeHints[CTRL_BANDCOUNT].HintDescriptor + = LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE + | LADSPA_HINT_INTEGER; + psPortRangeHints[CTRL_BANDCOUNT].LowerBound = 1; + psPortRangeHints[CTRL_BANDCOUNT].UpperBound = MAX_BANDS; + psPortRangeHints[CTRL_PAN].HintDescriptor + = LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE + | LADSPA_HINT_INTEGER; + psPortRangeHints[CTRL_PAN].LowerBound = -100; + psPortRangeHints[CTRL_PAN].UpperBound = +100; + + for (i=CTRL_BAND1LVL; i < CTRL_BAND1LVL + MAX_BANDS; i++) + { + piPortDescriptors[i] = LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL; + pcPortNames[i] = malloc (sizeof ("Band 99 Level")); + sprintf(pcPortNames[i], "Band %d Level", i - CTRL_BAND1LVL + 1); + psPortRangeHints[i].HintDescriptor + = LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE; + psPortRangeHints[i].LowerBound = 0; + psPortRangeHints[i].UpperBound = 1; + } + + g_psDescriptor->instantiate = instantiateVocoder; + g_psDescriptor->connect_port = connectPortToVocoder; + g_psDescriptor->activate = activateVocoder; + g_psDescriptor->run = runVocoder; + g_psDescriptor->run_adding = NULL; + g_psDescriptor->set_run_adding_gain = NULL; + g_psDescriptor->deactivate = NULL; + g_psDescriptor->cleanup = cleanupVocoder; + } +} + +/*****************************************************************************/ + +/* _fini() is called automatically when the library is unloaded. */ +void +_fini() { + long lIndex; + if (g_psDescriptor) { + free((char *)g_psDescriptor->Label); + free((char *)g_psDescriptor->Name); + free((char *)g_psDescriptor->Maker); + free((char *)g_psDescriptor->Copyright); + free((LADSPA_PortDescriptor *)g_psDescriptor->PortDescriptors); + for (lIndex = 0; lIndex < g_psDescriptor->PortCount; lIndex++) + free((char *)(g_psDescriptor->PortNames[lIndex])); + free((char **)g_psDescriptor->PortNames); + free((LADSPA_PortRangeHint *)g_psDescriptor->PortRangeHints); + free(g_psDescriptor); + } +} + +/*****************************************************************************/ + +/* Return a descriptor of the requested plugin type. Only one plugin + type is available in this library. */ +const LADSPA_Descriptor * +ladspa_descriptor(unsigned long Index) { + if (Index == 0) + return g_psDescriptor; + else + return NULL; +} + +/*****************************************************************************/ + +/* EOF */ From 139db3d57a293b2a13a8a7d8f8e709d4df041bd7 Mon Sep 17 00:00:00 2001 From: Wong Cho Ching Date: Sun, 26 Jan 2014 03:13:27 +0800 Subject: [PATCH 038/110] Ported synth function --- plugins/sfxr/sfxr.cpp | 394 +++++++++++++++++++++++++++--------------- plugins/sfxr/sfxr.h | 95 +++++++--- 2 files changed, 327 insertions(+), 162 deletions(-) diff --git a/plugins/sfxr/sfxr.cpp b/plugins/sfxr/sfxr.cpp index 2e942a6ab..01beac525 100644 --- a/plugins/sfxr/sfxr.cpp +++ b/plugins/sfxr/sfxr.cpp @@ -1,6 +1,7 @@ /* * sfxr.cpp - port of sfxr to LMMS - * The original readme file of sfxr can be found in readme.txt in this directory. + * Originally written by Tomas Pettersson. For the original license, + * please read readme.txt in this directory * * Copyright (c) 2014 Wong Cho Ching * @@ -38,10 +39,8 @@ float frnd(float range) #include "sfxr.h" #include "engine.h" -#include "graph.h" #include "InstrumentTrack.h" #include "knob.h" -#include "led_checkbox.h" #include "note_play_handle.h" #include "pixmap_button.h" #include "song_editor.h" @@ -71,73 +70,252 @@ Plugin::Descriptor PLUGIN_EXPORT sfxr_plugin_descriptor = } -SfxrSynth::SfxrSynth( float * _shape, int _length, notePlayHandle * _nph, bool _interpolation, - float _factor, const sample_rate_t _sample_rate ) : - sample_index( 0 ), - sample_realindex( 0 ), - nph( _nph ), - sample_length( _length ), - sample_rate( _sample_rate ), - interpolation( _interpolation) + + +SfxrSynth::SfxrSynth( const sfxrInstrument * s ): + s(s), + playing_sample( true ) { - sample_shape = new float[sample_length]; - for (int i=0; i < _length; ++i) - { - sample_shape[i] = _shape[i] * _factor; - } + resetSample( false ); } + + SfxrSynth::~SfxrSynth() { - delete[] sample_shape; + } -sample_t SfxrSynth::nextStringSample() + + +void SfxrSynth::resetSample( bool restart ) { - float sample_step = - static_cast( sample_length / ( sample_rate / nph->frequency() ) ); - - - // check overflow - while (sample_realindex >= sample_length) { - sample_realindex -= sample_length; + if(!restart) + { + phase=0; } + fperiod=100.0/(s->m_startFreqModel.value()*s->m_startFreqModel.value()+0.001); + period=(int)fperiod; + fmaxperiod=100.0/(s->m_minFreqModel.value()*s->m_minFreqModel.value()+0.001); + fslide=1.0-pow((double)s->m_slideModel.value(), 3.0)*0.01; + fdslide=-pow((double)s->m_dSlideModel.value(), 3.0)*0.000001; + square_duty=0.5f-s->m_sqrDutyModel.value()*0.5f; + square_slide=-s->m_sqrSweepModel.value()*0.00005f; + if(s->m_changeAmtModel.value()>=0.0f) + arp_mod=1.0-pow((double)s->m_changeAmtModel.value(), 2.0)*0.9; + else + arp_mod=1.0+pow((double)s->m_changeAmtModel.value(), 2.0)*10.0; + arp_time=0; + arp_limit=(int)(pow(1.0f-s->m_changeSpeedModel.value(), 2.0f)*20000+32); + if(s->m_changeSpeedModel.value()==1.0f) + arp_limit=0; + if(!restart) + { + // reset filter + fltp=0.0f; + fltdp=0.0f; + fltw=pow(s->m_lpFilCutModel.value(), 3.0f)*0.1f; + fltw_d=1.0f+s->m_lpFilCutSweepModel.value()*0.0001f; + fltdmp=5.0f/(1.0f+pow(s->m_lpFilResoModel.value(), 2.0f)*20.0f)*(0.01f+fltw); + if(fltdmp>0.8f) fltdmp=0.8f; + fltphp=0.0f; + flthp=pow(s->m_hpFilCutModel.value(), 2.0f)*0.1f; + flthp_d=1.0+s->m_hpFilCutSweepModel.value()*0.0003f; + // reset vibrato + vib_phase=0.0f; + vib_speed=pow(s->m_vibSpeedModel.value(), 2.0f)*0.01f; + vib_amp=s->m_vibDepthModel.value()*0.5f; + // reset envelope + env_vol=0.0f; + env_stage=0; + env_time=0; + env_length[0]=(int)(s->m_attModel.value()*s->m_attModel.value()*100000.0f); + env_length[1]=(int)(s->m_holdModel.value()*s->m_holdModel.value()*100000.0f); + env_length[2]=(int)(s->m_decModel.value()*s->m_decModel.value()*100000.0f); - sample_t sample; + fphase=pow(s->m_phaserOffsetModel.value(), 2.0f)*1020.0f; + if(s->m_phaserOffsetModel.value()<0.0f) fphase=-fphase; + fdphase=pow(s->m_phaserSweepModel.value(), 2.0f)*1.0f; + if(s->m_phaserSweepModel.value()<0.0f) fdphase=-fdphase; + iphase=abs((int)fphase); + ipp=0; + for(int i=0;i<1024;i++) + phaser_buffer[i]=0.0f; - if (interpolation) { + for(int i=0;i<32;i++) + noise_buffer[i]=frnd(2.0f)-1.0f; - // find position in shape - int a = static_cast(sample_realindex); - int b; - if (a < (sample_length-1)) { - b = static_cast(sample_realindex+1); - } else { - b = 0; + rep_time=0; + rep_limit=(int)(pow(1.0f-s->m_repeatSpeedModel.value(), 2.0f)*20000+32); + if(s->m_repeatSpeedModel.value()==0.0f) + rep_limit=0; + } +} + + + + +void SfxrSynth::update( sampleFrame * buffer, const fpp_t frameNum ) +{ + for(int i=0;i=rep_limit) + { + rep_limit=0; + resetSample(true); } - // Nachkommaanteil - float frac = sample_realindex - static_cast(sample_realindex); + // frequency envelopes/arpeggios + arp_time++; + if(arp_limit!=0 && arp_time>=arp_limit) + { + arp_limit=0; + fperiod*=arp_mod; + } + fslide+=fdslide; + fperiod*=fslide; + if(fperiod>fmaxperiod) + { + fperiod=fmaxperiod; + if(s->m_minFreqModel.value()>0.0f) + playing_sample=false; + } + float rfperiod=fperiod; + if(vib_amp>0.0f) + { + vib_phase+=vib_speed; + rfperiod=fperiod*(1.0+sin(vib_phase)*vib_amp); + } + period=(int)rfperiod; + if(period<8) period=8; + square_duty+=square_slide; + if(square_duty<0.0f) square_duty=0.0f; + if(square_duty>0.5f) square_duty=0.5f; + // volume envelope + env_time++; + if(env_time>env_length[env_stage]) + { + env_time=0; + env_stage++; + if(env_stage==3) + playing_sample=false; + } + if(env_stage==0) + env_vol=(float)env_time/env_length[0]; + if(env_stage==1) + env_vol=1.0f+pow(1.0f-(float)env_time/env_length[1], 1.0f)*2.0f*s->m_susModel.value(); + if(env_stage==2) + env_vol=1.0f-(float)env_time/env_length[2]; - sample = sample_shape[a]*(1-frac) + sample_shape[b]*(frac); + // phaser step + fphase+=fdphase; + iphase=abs((int)fphase); + if(iphase>1023) iphase=1023; - } else { - // No interpolation - sample_index = static_cast(sample_realindex); - sample = sample_shape[sample_index]; + if(flthp_d!=0.0f) + { + flthp*=flthp_d; + if(flthp<0.00001f) flthp=0.00001f; + if(flthp>0.1f) flthp=0.1f; + } + + float ssample=0.0f; + for(int si=0;si<8;si++) // 8x supersampling + { + float sample=0.0f; + phase++; + if(phase>=period) + { +// phase=0; + phase%=period; + if(s->m_waveFormModel.value()==3) + for(int i=0;i<32;i++) + noise_buffer[i]=frnd(2.0f)-1.0f; + } + // base waveform + float fp=(float)phase/period; + switch(s->m_waveFormModel.value()) + { + case 0: // square + if(fp0.1f) fltw=0.1f; + if(s->m_lpFilCutModel.value()!=1.0f) + { + fltdp+=(sample-fltp)*fltw; + fltdp-=fltdp*fltdmp; + } + else + { + fltp=sample; + fltdp=0.0f; + } + fltp+=fltdp; + // hp filter + fltphp+=fltp-pp; + fltphp-=fltphp*flthp; + sample=fltphp; + // phaser + phaser_buffer[ipp&1023]=sample; + sample+=phaser_buffer[(ipp-iphase+1024)&1023]; + ipp=(ipp+1)&1023; + // final accumulation and envelope application + ssample+=sample*env_vol; + } + //ssample=ssample/8*master_vol; + + //ssample*=2.0f*sound_vol; + ssample*=0.05f; + + if(buffer!=NULL) + { + if(ssample>1.0f) ssample=1.0f; + if(ssample<-1.0f) ssample=-1.0f; + for( ch_cnt_t j=0; j < DEFAULT_CHANNELS; j++ ) + { + buffer[i][j]=ssample; + } + } } - - // progress in shape - sample_realindex += sample_step; - - return sample; } +bool SfxrSynth::isPlaying() const +{ + return playing_sample; +} + + sfxrInstrument::sfxrInstrument( InstrumentTrack * _instrument_track ) : Instrument( _instrument_track, &sfxr_plugin_descriptor ), m_attModel(0.0f, this), @@ -170,14 +348,6 @@ sfxrInstrument::sfxrInstrument( InstrumentTrack * _instrument_track ) : m_hpFilCutSweepModel(0.0f, this), m_waveFormModel( SQR_WAVE, 0, WAVES_NUM-1, this, tr( "Wave Form" ) ) { - //TODO - /* - connect( &m_sampleLength, SIGNAL( dataChanged( ) ), - this, SLOT( lengthChanged( ) ) ); - - connect( &m_graph, SIGNAL( samplesChanged( int, int ) ), - this, SLOT( samplesChanged( int, int ) ) ); - */ } @@ -267,16 +437,6 @@ void sfxrInstrument::loadSettings( const QDomElement & _this ) -void sfxrInstrument::samplesChanged( int _begin, int _end ) -{ - //TODO - //normalize(); - //engine::getSongEditor()->setModified(); -} - - - - QString sfxrInstrument::nodeName() const { return( sfxr_plugin_descriptor.name ); @@ -285,54 +445,23 @@ QString sfxrInstrument::nodeName() const -f_cnt_t sfxrInstrument::desiredReleaseFrames() const +void sfxrInstrument::playNote(notePlayHandle * _n, sampleFrame * _working_buffer ) { - //TODO: check whether this disables - return 0; -} - - - -void sfxrInstrument::playNote( notePlayHandle * _n, - sampleFrame * _working_buffer ) -{ - //TODO - /*if ( _n->totalFramesPlayed() == 0 || _n->m_pluginData == NULL ) + m_synthMutex.lock(); + fpp_t frameNum = _n->framesLeftForCurrentPeriod(); + if ( _n->totalFramesPlayed() == 0 ) { - - float factor; - if( !m_normalize.value() ) - { - factor = 1.0f; - } - else - { - factor = m_normalizeFactor; - } - - _n->m_pluginData = new SfxrSynth( - const_cast( m_graph.samples() ), - m_graph.length(), - _n, - m_interpolation.value(), factor, - engine::mixer()->processingSampleRate() ); + _n->m_pluginData = new SfxrSynth( this ); + } + else if( static_cast(_n->m_pluginData)->isPlaying() == false ) + { + _n->noteOff(); } - const fpp_t frames = _n->framesLeftForCurrentPeriod(); + static_cast(_n->m_pluginData)->update( _working_buffer, frameNum ); + m_synthMutex.unlock(); - SfxrSynth * ps = static_cast( _n->m_pluginData ); - for( fpp_t frame = 0; frame < frames; ++frame ) - { - const sample_t cur = ps->nextStringSample(); - for( ch_cnt_t chnl = 0; chnl < DEFAULT_CHANNELS; ++chnl ) - { - _working_buffer[frame][chnl] = cur; - } - } - - applyRelease( _working_buffer, _n ); - - instrumentTrack()->processAudioBuffer( _working_buffer, frames, _n );*/ + instrumentTrack()->processAudioBuffer( _working_buffer, frameNum, NULL ); } @@ -356,6 +485,7 @@ PluginView * sfxrInstrument::instantiateView( QWidget * _parent ) void sfxrInstrument::resetModels() { + m_attModel.reset(); m_holdModel.reset(); m_susModel.reset(); @@ -463,7 +593,7 @@ sfxrInstrumentView::sfxrInstrumentView( Instrument * _instrument, createKnob(m_changeSpeedKnob, KNOBS_BASE_X+KNOB_BLOCK_SIZE_X*1, KNOBS_BASE_Y+KNOB_BLOCK_SIZE_Y*2, "Change Speed"); createKnob(m_sqrDutyKnob, KNOBS_BASE_X+KNOB_BLOCK_SIZE_X*3, KNOBS_BASE_Y+KNOB_BLOCK_SIZE_Y*2, "Squre Duty(Square wave only)"); - createKnob(m_sqrSpeedKnob, KNOBS_BASE_X+KNOB_BLOCK_SIZE_X*4, KNOBS_BASE_Y+KNOB_BLOCK_SIZE_Y*2, "Squre Sweep(Square wave only)"); + createKnob(m_sqrSweepKnob, KNOBS_BASE_X+KNOB_BLOCK_SIZE_X*4, KNOBS_BASE_Y+KNOB_BLOCK_SIZE_Y*2, "Squre Sweep(Square wave only)"); createKnob(m_repeatSpeedKnob, KNOBS_BASE_X+KNOB_BLOCK_SIZE_X*0, KNOBS_BASE_Y+KNOB_BLOCK_SIZE_Y*3, "Repeat Speed"); @@ -485,9 +615,7 @@ sfxrInstrumentView::sfxrInstrumentView( Instrument * _instrument, m_waveBtnGroup->addButton(m_sqrWaveBtn); m_waveBtnGroup->addButton(m_sawWaveBtn); m_waveBtnGroup->addButton(m_sinWaveBtn); - m_waveBtnGroup->addButton(m_noiseWaveBtn); - connect( m_waveBtnGroup, SIGNAL ( dataChanged() ), - this, SLOT ( waveFormChanged() ) ); + m_waveBtnGroup->addButton(m_noiseWaveBtn); createButtonLocalGraphic(m_pickupBtn, GENERATOR_BASE_X+GENERATOR_BUTTON_WIDTH*0, GENERATOR_BASE_Y, "Generate pick up/coin sfx", "pickup"); @@ -511,10 +639,6 @@ sfxrInstrumentView::sfxrInstrumentView( Instrument * _instrument, connect( m_randomizeBtn, SIGNAL ( clicked() ), this, SLOT ( randomize() ) ); connect( m_mutateBtn, SIGNAL ( clicked() ), this, SLOT ( mutate() ) ); - //TODO: for each generator button: - /*connect( m_pickupBtn, SIGNAL ( dataChanged() ), - this, SLOT ( pickupClicked() ) );*/ - } @@ -541,7 +665,7 @@ void sfxrInstrumentView::modelChanged() m_changeSpeedKnob->setModel( &s->m_changeSpeedModel ); m_sqrDutyKnob->setModel( &s->m_sqrDutyModel ); - m_sqrSpeedKnob->setModel( &s->m_sqrSweepModel ); + m_sqrSweepKnob->setModel( &s->m_sqrSweepModel ); m_repeatSpeedKnob->setModel( &s->m_repeatSpeedModel ); @@ -560,32 +684,20 @@ void sfxrInstrumentView::modelChanged() -void sfxrInstrumentView::waveFormChanged() -{ - //TODO: do we even need this slot? - /* - m_graph->model()->setWaveToNoise(); - engine::getSong()->setModified(); - */ -} - - - - void sfxrInstrumentView::genPickup() { sfxrInstrument * s = castModel(); s->resetModels(); - s->m_startFreqModel.setValue( 0.4f+frnd(0.5f) ); - s->m_attModel.setValue( 0.0f ); - s->m_holdModel.setValue( frnd(0.1f) ); - s->m_decModel.setValue( 0.1f+frnd(0.4f) ); - s->m_susModel.setValue( 0.3f+frnd(0.3f) ); + s->m_startFreqModel.setValue( 0.4f+frnd(0.5f) ); + s->m_attModel.setValue( 0.0f ); + s->m_holdModel.setValue( frnd(0.1f) ); + s->m_decModel.setValue( 0.1f+frnd(0.4f) ); + s->m_susModel.setValue( 0.3f+frnd(0.3f) ); if(rnd(1)) { - s->m_changeAmtModel.setValue( 0.5f+frnd(0.2f) ); - s->m_changeSpeedModel.setValue( 0.2f+frnd(0.4f) ); + s->m_changeSpeedModel.setValue( 0.5f+frnd(0.2f) ); + s->m_changeAmtModel.setValue( 0.2f+frnd(0.4f) ); } } @@ -599,9 +711,9 @@ void sfxrInstrumentView::genLaser() s->m_waveFormModel.setValue( rnd(2) ); if(s->m_waveFormModel.value()==2 && rnd(1)) - s->m_waveFormModel.setValue(rnd(1)); + s->m_waveFormModel.setValue( rnd(1) ); - s->m_startFreqModel.setValue( 0.5f+frnd(0.5f) ); + s->m_startFreqModel.setValue( 0.5f+frnd(0.5f) ); s->m_minFreqModel.setValue( s->m_startFreqModel.value()-0.2f-frnd(0.6f) ); if(s->m_minFreqModel.value()<0.2f) @@ -615,7 +727,7 @@ void sfxrInstrumentView::genLaser() { s->m_startFreqModel.setValue( 0.3f+frnd(0.6f) ); s->m_minFreqModel.setValue( frnd(0.1f) ); - s->m_slideModel.setValue( -0.35f-frnd(0.3f) ); + s->m_slideModel.setValue( -0.35f-frnd(0.3f) ); } if(rnd(1)) @@ -747,9 +859,13 @@ void sfxrInstrumentView::genHit() s->m_waveFormModel.setValue( rnd(2) ); if(s->m_waveFormModel.value()==2) + { s->m_waveFormModel.setValue( 3 ); + } if(s->m_waveFormModel.value()==0) + { s->m_sqrDutyModel.setValue( frnd(0.6f) ); + } s->m_startFreqModel.setValue( 0.2f+frnd(0.6f) ); s->m_slideModel.setValue( -0.3f-frnd(0.4f) ); @@ -785,12 +901,12 @@ void sfxrInstrumentView::genJump() { s->m_hpFilCutModel.setValue( frnd(0.3f) ); } - if(rnd(1)) { s->m_lpFilCutModel.setValue( 1.0f-frnd(0.6f) ); } + } diff --git a/plugins/sfxr/sfxr.h b/plugins/sfxr/sfxr.h index e363dd343..2d9934219 100644 --- a/plugins/sfxr/sfxr.h +++ b/plugins/sfxr/sfxr.h @@ -1,6 +1,7 @@ /* * sfxr.h - declaration of classes of the LMMS sfxr plugin - * The original readme file of sfxr can be found in readme.txt in this directory. + * Originally written by Tomas Pettersson. For the original license, + * please read readme.txt in this directory * * Copyright (c) 2014 Wong Cho Ching * @@ -60,28 +61,64 @@ const int KNOB_BLOCK_SIZE_X = 40; const int KNOB_BLOCK_SIZE_Y = 40; + + +class sfxrInstrument; + + + class SfxrSynth { public: - SfxrSynth( float * sample, int length, notePlayHandle * _nph, - bool _interpolation, float factor, - const sample_rate_t _sample_rate ); + SfxrSynth( const sfxrInstrument * s ); virtual ~SfxrSynth(); - sample_t nextStringSample(); + void resetSample( bool restart ); + void update( sampleFrame * buffer, const fpp_t frameNum ); + bool isPlaying() const; private: - int sample_index; - float sample_realindex; - float* sample_shape; - notePlayHandle* nph; - const int sample_length; - const sample_rate_t sample_rate; + const sfxrInstrument * s; + bool playing_sample; + int phase; + double fperiod; + double fmaxperiod; + double fslide; + double fdslide; + int period; + float square_duty; + float square_slide; + int env_stage; + int env_time; + int env_length[3]; + float env_vol; + float fphase; + float fdphase; + int iphase; + float phaser_buffer[1024]; + int ipp; + float noise_buffer[32]; + float fltp; + float fltdp; + float fltw; + float fltw_d; + float fltdmp; + float fltphp; + float flthp; + float flthp_d; + float vib_phase; + float vib_speed; + float vib_amp; + int rep_time; + int rep_limit; + int arp_time; + int arp_limit; + double arp_mod; + +} ; - bool interpolation; -}; /** * @brief A class that simplify the constructor of FloatModel, with value [0,1] @@ -93,6 +130,15 @@ public: FloatModel( val, 0.0, 1.0, 0.001, parent) { } + /* purpose: prevent the initial value of the model from being changed */ + virtual void loadSettings( const QDomElement& element, const QString& name = QString( "value" ) ) + { + float oldInitValue = initValue(); + FloatModel::loadSettings(element, name); + float oldValue = value(); + setInitValue(oldInitValue); + setValue(oldValue); + } }; /** @@ -105,6 +151,15 @@ public: FloatModel( val, -1.0, 1.0, 0.001, parent) { } + /* purpose: prevent the initial value of the model from being changed */ + virtual void loadSettings( const QDomElement& element, const QString& name = QString( "value" ) ) + { + float oldInitValue = initValue(); + FloatModel::loadSettings(element, name); + float oldValue = value(); + setInitValue(oldInitValue); + setValue(oldValue); + } }; class sfxrInstrument : public Instrument @@ -114,28 +169,22 @@ public: sfxrInstrument(InstrumentTrack * _instrument_track ); virtual ~sfxrInstrument(); - virtual void playNote( notePlayHandle * _n, - sampleFrame * _working_buffer ); + virtual void playNote( notePlayHandle * _n, sampleFrame * _working_buffer ); virtual void deleteNotePluginData( notePlayHandle * _n ); - virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); virtual void loadSettings( const QDomElement & _this ); virtual QString nodeName() const; - virtual f_cnt_t desiredReleaseFrames() const; - virtual PluginView * instantiateView( QWidget * _parent ); void resetModels(); -protected slots: - void samplesChanged( int, int ); - private: + QMutex m_synthMutex; SfxrZeroToOneFloatModel m_attModel; SfxrZeroToOneFloatModel m_holdModel; SfxrZeroToOneFloatModel m_susModel; @@ -168,6 +217,7 @@ private: IntModel m_waveFormModel; friend class sfxrInstrumentView; + friend class SfxrSynth; }; @@ -182,7 +232,6 @@ public: virtual ~sfxrInstrumentView() {}; protected slots: - void waveFormChanged(); void genPickup(); void genLaser(); void genExplosion(); @@ -212,7 +261,7 @@ private: knob * m_changeSpeedKnob; //Change Speed knob * m_sqrDutyKnob; //Squre Duty - knob * m_sqrSpeedKnob; //Squre Sweep + knob * m_sqrSweepKnob; //Squre Sweep knob * m_repeatSpeedKnob; //Repeat Speed From a8d7f1e4a8fa9bcce9a1a16ad96c1e6075648c60 Mon Sep 17 00:00:00 2001 From: Wong Cho Ching Date: Sun, 26 Jan 2014 03:20:21 +0800 Subject: [PATCH 039/110] added artworks --- plugins/sfxr/blip_active.png | Bin 0 -> 222 bytes plugins/sfxr/blip_inactive.png | Bin 0 -> 334 bytes plugins/sfxr/explosion_active.png | Bin 0 -> 264 bytes plugins/sfxr/explosion_inactive.png | Bin 0 -> 350 bytes plugins/sfxr/hit_active.png | Bin 0 -> 210 bytes plugins/sfxr/hit_inactive.png | Bin 0 -> 330 bytes plugins/sfxr/jump_active.png | Bin 0 -> 272 bytes plugins/sfxr/jump_inactive.png | Bin 0 -> 347 bytes plugins/sfxr/laser_active.png | Bin 0 -> 191 bytes plugins/sfxr/laser_inactive.png | Bin 0 -> 318 bytes plugins/sfxr/mutate_active.png | Bin 0 -> 332 bytes plugins/sfxr/mutate_inactive.png | Bin 0 -> 379 bytes plugins/sfxr/pickup_active.png | Bin 0 -> 274 bytes plugins/sfxr/pickup_inactive.png | Bin 0 -> 343 bytes plugins/sfxr/powerup_active.png | Bin 0 -> 236 bytes plugins/sfxr/powerup_inactive.png | Bin 0 -> 337 bytes plugins/sfxr/randomize_active.png | Bin 0 -> 339 bytes plugins/sfxr/randomize_inactive.png | Bin 0 -> 383 bytes 18 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 plugins/sfxr/blip_active.png create mode 100644 plugins/sfxr/blip_inactive.png create mode 100644 plugins/sfxr/explosion_active.png create mode 100644 plugins/sfxr/explosion_inactive.png create mode 100644 plugins/sfxr/hit_active.png create mode 100644 plugins/sfxr/hit_inactive.png create mode 100644 plugins/sfxr/jump_active.png create mode 100644 plugins/sfxr/jump_inactive.png create mode 100644 plugins/sfxr/laser_active.png create mode 100644 plugins/sfxr/laser_inactive.png create mode 100644 plugins/sfxr/mutate_active.png create mode 100644 plugins/sfxr/mutate_inactive.png create mode 100644 plugins/sfxr/pickup_active.png create mode 100644 plugins/sfxr/pickup_inactive.png create mode 100644 plugins/sfxr/powerup_active.png create mode 100644 plugins/sfxr/powerup_inactive.png create mode 100644 plugins/sfxr/randomize_active.png create mode 100644 plugins/sfxr/randomize_inactive.png diff --git a/plugins/sfxr/blip_active.png b/plugins/sfxr/blip_active.png new file mode 100644 index 0000000000000000000000000000000000000000..f3113f77261ea00999f6c5772bbc1c6156002d23 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1SBVD?P>#3oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9-}0eCc|EbKj}cBT2B|p5RLQ62?|mMMg|6JqPBJ|*!A`Gb>oGcsWVd^2Aw^0 z;6TCibFyq~Y-wp}K$1;ZLwxt8*XDT&EKY$tGraU;_Z&EI;6uq@#JG5$AJ!E N@O1TaS?83{1OV1bNe%!2 literal 0 HcmV?d00001 diff --git a/plugins/sfxr/blip_inactive.png b/plugins/sfxr/blip_inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..e8e5ca112cf2579eb66c2d46321d540f37436ca1 GIT binary patch literal 334 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCmInBQxB_W?eLW*1Lt|qj3kwTN zOA8wtYkPY;S65eWZ?B-Bz>tvO$jHc;nCO_8nAo_ujLgjJ?5wi#^48YYwzjtR_V&)s z&febMi4!MInlx$Z)TuLP&X_-c{=$U|7cE+}bm`J%%a*QMwQB9!wd>cfTfct&h7B7w zZQ8VX^X6^awr$_OZU6rLM~)mhe*E~UQ>V_JJ$v!u#Y>kiUAc1Q+O=!fuV24;^XBc_ zx9{A!bIn5?=uQUC0*}aI1_o|n5N2eUHAey{$X?><>&kwQQIgYIv(;f$BT&f3)5S4_ z<9c#}19O*01N$LU=K@!kBS+4-C@`FO%Fbk5$H7n}DS7t61PMK!2TzThcJvs?P2pyD c(Bn5^VA#+kkalj;$`X);p00i_>zopr0ErNW-~a#s literal 0 HcmV?d00001 diff --git a/plugins/sfxr/explosion_active.png b/plugins/sfxr/explosion_active.png new file mode 100644 index 0000000000000000000000000000000000000000..b6af2a916e0a8637af87adc0db4adffa2414b099 GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1SBVD?P>#3oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9-}0eo*V~X_+g;Xa!(h>5RLP_lQ!}mRuFKl7YM!~EfaL7qH{^{b4iVv2ZRmW zU7V-)2#H_6RlLOF^e&5z8L$4Ix36$wSbm+=!Ruwd{_`A{pZDIsbbNn}DdE|HgZ*|k zOblNV(ijSRCK*($-uFE6*&~Vk%dwNLf4LGZoqav_s7_^W`?3>WPu6^Ezc(p-ZuH!L zaw{k6H*m2{G(IZrn$3Mcq}o*?I5D@~?YwwIcE9VBb2ZcXZ>Br{p1>wk2Xr!nr>mdK II;Vst091!!`~Uy| literal 0 HcmV?d00001 diff --git a/plugins/sfxr/explosion_inactive.png b/plugins/sfxr/explosion_inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..67c89f013a3630426aea3e7402c2af8cb3e604fe GIT binary patch literal 350 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCmInBQxB_W?eLW*1Lt|qj3kwTN zOA8wtYkPY;S65eWZ?B-Bz>tvO$jHc;nCO_8nAo_ujLgjJ?5wi#^48YYwzjtR_V&)s z&febMi4!MInlx$Z)TuLP&X_-c{=$U|7cE+}bm`J%%a*QMwQB9!wd>cfTfct&h7B7w zZQ8VX^X6^awr$_OZU6rLM~)mhe*E~UQ>V_JJ$v!u#Y>kiUAc1Q+O=!fuV24;^XBc_ zx9{A!bIn5?=uQUC0*}aI1_o|n5N2eUHAey{$X?><>&kwQQId;6zJxEY5-8;3>Eal| zaXq%@ATNU=2g}p^L+xxiNx$^pGF*JXtK}yq`}la4PxzkaYFBzTp9vM6Vi6MS%A&bV u%|Xk0$fSLG#3oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9-}0ep1}KURY!nAg`O^sAsXlRPT0uVU?AW+UoH3r+pRRg>nAcY^F+5Ax<=hq zN>GfbXc9cAE#H6qFIHeJ5o^s#$9&~gS(S3j3^P6tvO$jHc;nCO_8nAo_ujLgjJ?5wi#^48YYwzjtR_V&)s z&febMi4!MInlx$Z)TuLP&X_-c{=$U|7cE+}bm`J%%a*QMwQB9!wd>cfTfct&h7B7w zZQ8VX^X6^awr$_OZU6rLM~)mhe*E~UQ>V_JJ$v!u#Y>kiUAc1Q+O=!fuV24;^XBc_ zx9{A!bIn5?=uQUC0*}aI1_o|n5N2eUHAey{$X?><>&kwQQId;^Pp3nN6DVZi>Eal| zaXmS~fw{}0f&G-JadV-o%MllsGiO{J7*0H8XEZi8V0~iL)G$+WhEg9ltHq8Zubw)x YF)U2yl$@2K@DgO1r>mdKI;Vst02(NTGynhq literal 0 HcmV?d00001 diff --git a/plugins/sfxr/jump_active.png b/plugins/sfxr/jump_active.png new file mode 100644 index 0000000000000000000000000000000000000000..6f1ff1ee5f61449eeaa62830f199350406c0701a GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1SBVD?P>#3oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9-}0e9%Cz8lo?QHy{C&~h{pNk1O+JrBLjmqQCqtf?E3opx^ZGx+RT*1(6fgQ z94L5xPL_?0EiLWY{`&vlT)#Mmh_BUf3O;q_zySqS-M`Py&JJH6uYWG`$bkb7ZayeI z{_tDj+{aAWEcXu_0BVqsl#uxH^{a%0#JqL&$ADU7HCPRqdsi=AdbTB$>0DcfGlTFf znN22}{4x?8Wg6mT4>8U-=dexcF5`(;8&)kl6TQO)WQ3Bka;K*rL(pdbpqmH(yazg+ N!PC{xWt~$(69A(`X9oZP literal 0 HcmV?d00001 diff --git a/plugins/sfxr/jump_inactive.png b/plugins/sfxr/jump_inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..cc67812eb51675c5b929da37f6d08d9d281f7965 GIT binary patch literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCmInBQxB_W?eLW*1Lt|qj3kwTN zOA8wtYkPY;S65eWZ?B-Bz>tvO$jHc;nCO_8nAo_ujLgjJ?5wi#^48YYwzjtR_V&)s z&febMi4!MInlx$Z)TuLP&X_-c{=$U|7cE+}bm`J%%a*QMwQB9!wd>cfTfct&h7B7w zZQ8VX^X6^awr$_OZU6rLM~)mhe*E~UQ>V_JJ$v!u#Y>kiUAc1Q+O=!fuV24;^XBc_ zx9{A!bIn5?=uQUC0*}aI1_o|n5N2eUHAey{$X?><>&kwQQId;M;dXHmD^SSO)5S4_ z<9hEIM=k~h4weIZ*yEN|&%g2CUiW%$ho7z_U)NgOnc=_G_>|okIMiOgV~AJFWV`Y2 rMAj3f>QLR{MZAWJ|L1NhUUfh6MLe%w@hqJkAlp4%{an^LB{Ts5Fxik8 literal 0 HcmV?d00001 diff --git a/plugins/sfxr/laser_active.png b/plugins/sfxr/laser_active.png new file mode 100644 index 0000000000000000000000000000000000000000..04a5de94c092bda381e62403bdbec05a0d70064d GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1SBVD?P>#3oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9-}0euIw(Y&|N^GI8PVH5RLQ62?|mMMg|6JqPBJ|*!A`Gbz{MNEpBG!!*i|6 zB_t$f%$)iE-(PQsmtUpLJ4#pY+b8E(8WnX*N8sA!ujfCkn9MgNDIr1OV6;jb!yT?w jGrg?0XJuvzFBV}qRwx+B%Bso?w28sf)z4*}Q$iB}k#0LV literal 0 HcmV?d00001 diff --git a/plugins/sfxr/laser_inactive.png b/plugins/sfxr/laser_inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..bf7eb18d1e399bb470f3ad89f10d868cb32f9e0b GIT binary patch literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCmInBQxB_W?eLW*1Lt|qj3kwTN zOA8wtYkPY;S65eWZ?B-Bz>tvO$jHc;nCO_8nAo_ujLgjJ?5wi#^48YYwzjtR_V&)s z&febMi4!MInlx$Z)TuLP&X_-c{=$U|7cE+}bm`J%%a*QMwQB9!wd>cfTfct&h7B7w zZQ8VX^X6^awr$_OZU6rLM~)mhe*E~UQ>V_JJ$v!u#Y>kiUAc1Q+O=!fuV24;^XBc_ zx9{A!bIn5?=uQUC0*}aI1_o|n5N2eUHAey{$X?><>&kwQQId;AqL0n)9#BZf)5S4_ z<9c#}19O*01ADW!l9Cz|vxA literal 0 HcmV?d00001 diff --git a/plugins/sfxr/mutate_active.png b/plugins/sfxr/mutate_active.png new file mode 100644 index 0000000000000000000000000000000000000000..31cf797b1a43507783c2757592d55c6f9407c9e8 GIT binary patch literal 332 zcmV-S0ki&zP)cE)V64AQH^wNVh)lT#L&{ry zNBDNXbI5TyG7|FLwrF<69za=?_TdU&FK629Zy$gQw|c zz0_3)gzc1e+^_5MbXzd6>OYw;HZ2^S)izF{$(8WvuM_j7ji~xPIZY2gSC(yOzN{s$ eI0fhdEP)tIXFB#J3l`@MMXtROG;8wQB+h@Sy@?JTw7dRTwPvXXlZF{Yif3P zcZG$8hK7cRhlh!YiH(hok&%&-l9H8`m6@5CpP!$hp`oIpqNSy!rlzH;s;aH6t*@`H zudlDLu&}bSva_?Zwzjsnx3<5(zr@7E$H&LY%F4~n&C$`(($dn@)YR72*4Nk9+1c6K z+uPjS+}21Z0000032;bRa{vGf6951U69E94oEQKA00(qQO+^RZ0T~Jm88O&|KmY&$ zX-PyuR4C7tj6n{-AP5BIZo-8R_=)}h(@I#ZHfdU1lW`>@t(7xM=^=s-%!UERD{j%u z082(8v+^<*RTa==6mo(i7exeqCPb1G936`S$cwms{E3l=xbJ{`Y+Q@5UfY~vAtz$5 Z#3oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9-}0eE|a-Zgg;Pdqo<2wh{pNk1O+JrBLjmqQCqnpHBPH^H#R2Tnwfc`>Gk#X z=?6nvyqS%enVT0be7L*(eb${U1Kqn?TSNa&_yy#~?X5a`I}8iVS`=k9N;@Ai0nL~;&5V0ium5#>=VT9dFGmTVBkW>MD@zuL zuq>2pbJe`#7Sq7G+IizEmqLbRo+p}gW(Wy^x%Uj+aF literal 0 HcmV?d00001 diff --git a/plugins/sfxr/pickup_inactive.png b/plugins/sfxr/pickup_inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..a4502ce56fd494e14de8a90266a26b36b01c682c GIT binary patch literal 343 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCmInBQxB_W?eLW*1Lt|qj3kwTN zOA8wtYkPY;S65eWZ?B-Bz>tvO$jHc;nCO_8nAo_ujLgjJ?5wi#^48YYwzjtR_V&)s z&febMi4!MInlx$Z)TuLP&X_-c{=$U|7cE+}bm`J%%a*QMwQB9!wd>cfTfct&h7B7w zZQ8VX^X6^awr$_OZU6rLM~)mhe*E~UQ>V_JJ$v!u#Y>kiUAc1Q+O=!fuV24;^XBc_ zx9{A!bIn5?=uQUC0*}aI1_o|n5N2eUHAey{$X?><>&kwQQId;IW7f-@4?rPTPZ!4! zj_bL-Cpj4mI9MLXe@JG|O!}>_8^@_6DV9=jbSv9!#-sv`rjSsPRm+qb+;x_@G#uCT n{pYoQ{_TZ}Yu4VsrubP0l+XkKIO~u~ literal 0 HcmV?d00001 diff --git a/plugins/sfxr/powerup_active.png b/plugins/sfxr/powerup_active.png new file mode 100644 index 0000000000000000000000000000000000000000..6be7826ccde2ad9030741d36bb2583c8b43cb0a4 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1SBVD?P>#3oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9-}0ej&f2!WdKm9+tbA{MB{vNf`XKRk%7UQsI6TKc71()eY3*n%|4qhg!ot+ z^PWpfOi0*K{G5-O**V@tep#Y`X3M45=6MHx&f|>}IQFeAHzP=ghlgjnUR=Xx#W%}e z&sQv#l#tl6Ws6|mRK6)q1`l3cVBpr%KU{itvO$jHc;nCO_8nAo_ujLgjJ?5wi#^48YYwzjtR_V&)s z&febMi4!MInlx$Z)TuLP&X_-c{=$U|7cE+}bm`J%%a*QMwQB9!wd>cfTfct&h7B7w zZQ8VX^X6^awr$_OZU6rLM~)mhe*E~UQ>V_JJ$v!u#Y>kiUAc1Q+O=!fuV24;^XBc_ zx9{A!bIn5?=uQUC0*}aI1_o|n5N2eUHAey{$X?><>&kwQQId;UIBaU+M4*tpr;B3< z$Mxg{2j(u12KFCFcXsyU z@Z6$FiaT^z9T;Bh%5!0T73{mxE-TWbE#z;;yhOJQPsRzy{WXp1_QmyB>W7vFrniZg z>V>j8X!~+*x8%v+nEKa@@j>B!!)JTU567HT55Fy==4<@$%8CA@au27tQ|~5xN#n?Q z)=?`ObuM#;;%v|N>w8=u*zUXf_wEh*<4-J@^xvL$TEll jb@czQ)vQ1B^Z&4If6xtIXFB#J3l`@MMXtROG;8wQB+h@Sy@?JTw7dRTwPvXXlZF{Yif3P zcZG$8hK7cRhlh!YiH(hok&%&-l9H8`m6@5CpP!$hp`oIpqNSy!rlzH;s;aH6t*@`H zudlDLu&}bSva_?Zwzjsnx3<5(zr@7E$H&LY%F4~n&C$`(($dn@)YR72*4Nk9+1c6K z+uPjS+}21Z0000032;bRa{vGf6951U69E94oEQKA00(qQO+^RZ0T~JlEGR10qyPW_ zZAnByR4C7tkI@OhFbG8Bf50CX=o0QfS~X`Hg+lES&!`Vc#%SwmX)aJ*t40dX0|P}w zJ>05e05g!8mBVzWRKN`+BK1&QkWv8;&_x+Mr-CWU);DnVWA!&!a%vP1-+8_Qa6dl4 dhW>!FryFBsBlg61{H*{0002ovPDHLkV1jAHq4NL$ literal 0 HcmV?d00001 From fa0201ffd7c63d42a8aaa038d0c177afdc2eac22 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sat, 25 Jan 2014 20:41:20 +0100 Subject: [PATCH 040/110] AUTHORS: small updates & typo fixes --- AUTHORS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AUTHORS b/AUTHORS index 8650caad1..579d21dd9 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,6 +1,6 @@ Tobias Doerffel - Maintainer, main-development, artwork etc. + Development Manager Jonathan Aquilina @@ -32,7 +32,7 @@ Andreas Brandmaier Juan Fabián Simón - Version 4.0 plugin artwork + Version 0.4 plugin artwork Sebastian Tilsch From 2116cf840b5589379f013e06304d91303e2b33a4 Mon Sep 17 00:00:00 2001 From: "Raine M. Ekman" Date: Sat, 25 Jan 2014 21:48:24 +0200 Subject: [PATCH 041/110] OpulenZ: Velocity works OK now. --- plugins/opl2/fmopl.c | 2 +- plugins/opl2/opl2instrument.cpp | 138 ++++++++++++++++++++++++-------- plugins/opl2/opl2instrument.h | 13 ++- 3 files changed, 119 insertions(+), 34 deletions(-) diff --git a/plugins/opl2/fmopl.c b/plugins/opl2/fmopl.c index 2b0e82b0c..db5180189 100644 --- a/plugins/opl2/fmopl.c +++ b/plugins/opl2/fmopl.c @@ -596,7 +596,7 @@ static void init_timetables( FM_OPL *OPL , int ARRATE , int DRRATE ) OPL->AR_TABLE[i] = rate / ARRATE; OPL->DR_TABLE[i] = rate / DRRATE; } - for (i = 60;i < 76;i++) + for (i = 60;i < 75;i++) { OPL->AR_TABLE[i] = EG_AED-1; OPL->DR_TABLE[i] = OPL->DR_TABLE[60]; diff --git a/plugins/opl2/opl2instrument.cpp b/plugins/opl2/opl2instrument.cpp index ab94eb834..0718a3796 100644 --- a/plugins/opl2/opl2instrument.cpp +++ b/plugins/opl2/opl2instrument.cpp @@ -23,8 +23,7 @@ */ // TODO: -// - Velocity (and aftertouch) sensitivity -// * in FM mode: OP2 level, add mode: OP1 and OP2 levels +// - Better voice allocation: long releases get cut short :( // - .sbi (or similar) file loading into models // - RT safety = get rid of mutex = make emulator code thread-safe @@ -92,6 +91,9 @@ Plugin * PLUGIN_EXPORT lmms_plugin_main( Model *, void * _data ) // the emulator code isn't really ready for threads QMutex opl2instrument::emulatorMutex; +// Weird ordering of voice parameters +const unsigned int adlib_opadd[9] = {0x00, 0x01, 0x02, 0x08, 0x09, 0x0A, 0x10, 0x11, 0x12}; + opl2instrument::opl2instrument( InstrumentTrack * _instrument_track ) : Instrument( _instrument_track, &OPL2_plugin_descriptor ), m_patchModel( 0, 0, 127, this, tr( "Patch" ) ), @@ -139,10 +141,11 @@ opl2instrument::opl2instrument( InstrumentTrack * _instrument_track ) : InstrumentPlayHandle * iph = new InstrumentPlayHandle( this ); engine::mixer()->addPlayHandle( iph ); + // Voices are laid out in a funny way... + // adlib_opadd = {0x00, 0x01, 0x02, 0x08, 0x09, 0x0A, 0x10, 0x11, 0x12}; + // Create an emulator - samplerate, 16 bit, mono - // CTemuopl is the better one, CKemuopl kinda sucks (some sounds silent, pitch goes flat after a while) emulatorMutex.lock(); - // theEmulator = new CKemuopl(engine::mixer()->processingSampleRate(), true, false); theEmulator = new CTemuopl(engine::mixer()->processingSampleRate(), true, false); theEmulator->init(); // Enable waveform selection @@ -161,6 +164,7 @@ opl2instrument::opl2instrument( InstrumentTrack * _instrument_track ) : for(int i=1; i<9; ++i) { voiceNote[i] = OPL2_VOICE_FREE; + voiceLRU[i] = i; } connect( engine::mixer(), SIGNAL( sampleRateChanged() ), @@ -225,39 +229,95 @@ void opl2instrument::reloadEmulator() { emulatorMutex.unlock(); for(int i=1; i<9; ++i) { voiceNote[i] = OPL2_VOICE_FREE; + voiceLRU[i] = i; } updatePatch(); } +// This shall only be called from code protected by the holy Mutex! +void opl2instrument::setVoiceVelocity(int voice, int vel) { + int vel_adjusted; + // Velocity calculation, some kind of approximation + // Only calculate for operator 1 if in adding mode, don't want to change timbre + if( fm_mdl.value() == false ) { + vel_adjusted = 63 - ( op1_lvl_mdl.value() * vel/127.0) ; + } else { + vel_adjusted = 63 - op1_lvl_mdl.value(); + } + theEmulator->write(0x40+adlib_opadd[voice], + ( (int)op1_scale_mdl.value() & 0x03 << 6) + + ( vel_adjusted & 0x3f ) ); + + + vel_adjusted = 63 - ( op2_lvl_mdl.value() * vel/127.0 ); + // vel_adjusted = 63 - op2_lvl_mdl.value(); + theEmulator->write(0x43+adlib_opadd[voice], + ( (int)op2_scale_mdl.value() & 0x03 << 6) + + ( vel_adjusted & 0x3f ) ); + // printf("vel %d for voice %d (%f)\n",vel_adjusted,voice,op2_lvl_mdl.value() ); +} + +// Pop least recently used voice - why does it sometimes lose a voice (mostly 0)? +int opl2instrument::popVoice() { + int tmp = voiceLRU[0]; + for( int i=0; i<8; ++i) { + voiceLRU[i] = voiceLRU[i+1]; + } + voiceLRU[8] = OPL2_NO_VOICE; + /* printf("pop: %d %d %d %d %d %d %d %d %d \n", + voiceLRU[0],voiceLRU[1],voiceLRU[2], + voiceLRU[3],voiceLRU[4],voiceLRU[5], + voiceLRU[6],voiceLRU[7],voiceLRU[8]); */ + return tmp; +} + +int opl2instrument::pushVoice(int v) { + int i; + for(i=8; i>0; --i) { + if( voiceLRU[i-1] != OPL2_NO_VOICE ) { + break; + } + } + voiceLRU[i] = v; + /*printf("%d %d %d %d %d %d %d %d %d \n", + voiceLRU[0],voiceLRU[1],voiceLRU[2], + voiceLRU[3],voiceLRU[4],voiceLRU[5], + voiceLRU[6],voiceLRU[7],voiceLRU[8]); */ + return i; +} + bool opl2instrument::handleMidiEvent( const midiEvent & _me, const midiTime & _time ) { emulatorMutex.lock(); - int key, vel, tmp_pb; - static int lastvoice=0; + int key, vel, voice, tmp_pb; + switch(_me.m_type) { case MidiNoteOn: // to get us in line with MIDI(?) key = _me.key() +12; vel = _me.velocity(); - for(int i=lastvoice+1; i!=lastvoice; ++i,i%=9) { - if( voiceNote[i] == OPL2_VOICE_FREE ) { - theEmulator->write(0xA0+i, fnums[key] & 0xff); - theEmulator->write(0xB0+i, 32 + ((fnums[key] & 0x1f00) >> 8) ); - voiceNote[i] = key; - velocities[key] = vel; - lastvoice=i; - break; - } + + voice = popVoice(); + if( voice != OPL2_NO_VOICE ) { + // Turn voice on, NB! the frequencies are straight by voice number, + // not by the adlib_opadd table! + theEmulator->write(0xA0+voice, fnums[key] & 0xff); + theEmulator->write(0xB0+voice, 32 + ((fnums[key] & 0x1f00) >> 8) ); + setVoiceVelocity(voice, vel); + voiceNote[voice] = key; + velocities[key] = vel; + // printf("%d %d\n",voice,vel); } break; case MidiNoteOff: key = _me.key() +12; - for(int i=0; i<9; ++i) { - if( voiceNote[i] == key ) { - theEmulator->write(0xA0+i, fnums[key] & 0xff); - theEmulator->write(0xB0+i, (fnums[key] & 0x1f00) >> 8 ); - voiceNote[i] = OPL2_VOICE_FREE; + for(voice=0; voice<9; ++voice) { + if( voiceNote[voice] == key ) { + theEmulator->write(0xA0+voice, fnums[key] & 0xff); + theEmulator->write(0xB0+voice, (fnums[key] & 0x1f00) >> 8 ); + voiceNote[voice] = OPL2_VOICE_FREE; + pushVoice(voice); } } velocities[key] = 0; @@ -268,22 +328,32 @@ bool opl2instrument::handleMidiEvent( const midiEvent & _me, if( velocities[key] != 0) { velocities[key] = vel; } + for(voice=0; voice<9; ++voice) { + if(voiceNote[voice] == key) { + setVoiceVelocity(voice, vel); + } + } break; case MidiPitchBend: // Update fnumber table - tmp_pb = (2*BEND_CENTS)*((float)_me.m_data.m_param[0]/16383)-BEND_CENTS; + // Pitchbend should be in the range 0...16383 but the new range knob gets it wrong. + // tmp_pb = (2*BEND_CENTS)*((float)_me.m_data.m_param[0]/16383)-BEND_CENTS; + + // Something like 100 cents = 8192, but offset by 8192 so the +/-100 cents range goes from 0...16383? + tmp_pb = ( _me.m_data.m_param[0]-8192 ) * BEND_CENTS / 8192; + + printf("Pitch bend: %d -> %d cents\n",_me.m_data.m_param[0],tmp_pb); if( tmp_pb != pitchbend ) { pitchbend = tmp_pb; tuneEqual(69, 440.0); } // Update pitch of sounding notes - for( int i=0; i<9; ++i ) { - if( voiceNote[i] != OPL2_VOICE_FREE ) { - theEmulator->write(0xA0+i, fnums[voiceNote[i] ] & 0xff); - theEmulator->write(0xB0+i, 32 + ((fnums[voiceNote[i]] & 0x1f00) >> 8) ); + for( int v=0; v<9; ++v ) { + if( voiceNote[v] != OPL2_VOICE_FREE ) { + theEmulator->write(0xA0+v, fnums[voiceNote[v] ] & 0xff); + theEmulator->write(0xB0+v, 32 + ((fnums[voiceNote[v]] & 0x1f00) >> 8) ); } } - // printf("Pitch bend: %d\n", pitchbend); break; default: printf("Midi event type %d\n",_me.m_type); @@ -393,16 +463,14 @@ void opl2instrument::loadSettings( const QDomElement & _this ) } -// Load a preset in binary form +// Load a patch into the emulator void opl2instrument::loadPatch(unsigned char inst[14]) { - const unsigned int adlib_opadd[] = {0x00, 0x01, 0x02, 0x08, 0x09, 0x0A, 0x10, 0x11, 0x12}; - emulatorMutex.lock(); for(int v=0; v<9; ++v) { theEmulator->write(0x20+adlib_opadd[v],inst[0]); // op1 AM/VIB/EG/KSR/Multiplier theEmulator->write(0x23+adlib_opadd[v],inst[1]); // op2 - theEmulator->write(0x40+adlib_opadd[v],inst[2]); // op1 KSL/Output Level - theEmulator->write(0x43+adlib_opadd[v],inst[3]); // op2 + // theEmulator->write(0x40+adlib_opadd[v],inst[2]); // op1 KSL/Output Level - these are handled by noteon/aftertouch code + // theEmulator->write(0x43+adlib_opadd[v],inst[3]); // op2 theEmulator->write(0x60+adlib_opadd[v],inst[4]); // op1 A/D theEmulator->write(0x63+adlib_opadd[v],inst[5]); // op2 theEmulator->write(0x80+adlib_opadd[v],inst[6]); // op1 S/R @@ -478,10 +546,16 @@ void opl2instrument::updatePatch() { inst[12] = 0; inst[13] = 0; - // Not part of the patch per se + // Not part of the per-voice patch info theEmulator->write(0xBD, (trem_depth_mdl.value() ? 128 : 0 ) + (vib_depth_mdl.value() ? 64 : 0 )); + // have to do this, as the level knobs might've changed + for( int voice = 0; voice < 9 ; ++voice) { + if(voiceNote[voice]!=OPL2_VOICE_FREE) { + setVoiceVelocity(voice, velocities[voiceNote[voice]] ); + } + } loadPatch(inst); } diff --git a/plugins/opl2/opl2instrument.h b/plugins/opl2/opl2instrument.h index 7c81ba192..af2493f95 100644 --- a/plugins/opl2/opl2instrument.h +++ b/plugins/opl2/opl2instrument.h @@ -34,6 +34,9 @@ #include "pixmap_button.h" #define OPL2_VOICE_FREE 255 +#define OPL2_NO_VOICE 255 +// The "normal" range for LMMS pitchbends +#define BEND_CENTS 100 class opl2instrument : public Instrument { @@ -109,19 +112,27 @@ private: fpp_t frameCount; short *renderbuffer; int voiceNote[9]; + // Least recently used voices + int voiceLRU[9]; // 0 - no note, >0 - note on velocity int velocities[128]; // These include both octave and Fnumber int fnums[128]; // in cents, range defaults to +/-100 cents (should this be changeable?) int pitchbend; - #define BEND_CENTS 100 + + + + int popVoice(); + int pushVoice(int v); int Hz2fnum(float Hz); static QMutex emulatorMutex; + void setVoiceVelocity(int voice, int vel); }; + class opl2instrumentView : public InstrumentView { Q_OBJECT From 1f351439275a4b7dcfcf3f1a6c003646f27e5fac Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sat, 25 Jan 2014 20:49:02 +0100 Subject: [PATCH 042/110] Fader: fixed drawing of peaks As the fader background graphics recently have changed, the code for drawing the peaks had to be fixed as well. --- src/gui/widgets/fader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/widgets/fader.cpp b/src/gui/widgets/fader.cpp index b9f301663..f2dc4c5fd 100644 --- a/src/gui/widgets/fader.cpp +++ b/src/gui/widgets/fader.cpp @@ -290,7 +290,7 @@ void fader::paintEvent( QPaintEvent * ev) if( m_persistentPeak_L > 0.05 ) { - painter.fillRect( QRect( 2, persistentPeak_L, 4, 1 ), (m_persistentPeak_L < 1.0 )? QColor( 74, 253, 133) : QColor( 255, 100, 100)); + painter.fillRect( QRect( 2, persistentPeak_L, 7, 1 ), (m_persistentPeak_L < 1.0 )? QColor( 74, 253, 133) : QColor( 255, 100, 100)); } int peak_R = calculateDisplayPeak( m_fPeakValue_R - m_fMinPeak ); @@ -299,7 +299,7 @@ void fader::paintEvent( QPaintEvent * ev) if( m_persistentPeak_R > 0.05 ) { - painter.fillRect( QRect( 16, persistentPeak_R, 4, 1 ), (m_persistentPeak_R < 1.0 )? QColor( 74, 253, 133) : QColor( 255, 100, 100)); + painter.fillRect( QRect( 14, persistentPeak_R, 7, 1 ), (m_persistentPeak_R < 1.0 )? QColor( 74, 253, 133) : QColor( 255, 100, 100)); } // knob From 3a827f061f71541d7373ee9453f14a4a9425a11d Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sat, 25 Jan 2014 23:52:25 +0100 Subject: [PATCH 043/110] Reworked MIDI event handling in InstrumentTrack and renamed MIDI classes The MIDI event handling in InstrumentTrack was complex and buggy. It has been simplified now such that processInEvent() tries to handle note on, note off and key pressure events. The actions taken should result in equivalent calls to processOutEvent() by NotePlayHandle instances. The processOutEvent() function sends according MIDI events to the attached instruments. All unhandled MIDI events are directly forwarded to the instrument in processInEvent(). It's possible that some corner-cases are not handled yet with the new code and we have regressions now. Furthermore renamed midiTime/midiEvent to MidiTime/MidiEvent to match coding style. Closes #72. --- include/AutomationEditor.h | 8 +- include/AutomationPattern.h | 14 +- include/AutomationTrack.h | 4 +- include/Instrument.h | 6 +- include/InstrumentTrack.h | 12 +- include/{midi.h => Midi.h} | 144 +-------------- include/MidiAlsaSeq.h | 6 +- include/MidiClient.h | 14 +- include/MidiController.h | 8 +- include/MidiEvent.h | 209 ++++++++++++++++++++++ include/MidiEventProcessor.h | 14 +- include/MidiPort.h | 15 +- include/{midi_time.h => MidiTime.h} | 58 +++--- include/MidiWinMM.h | 6 +- include/RemotePlugin.h | 11 +- include/SampleRecordHandle.h | 2 +- include/SampleTrack.h | 8 +- include/TrackContainerView.h | 6 +- include/bb_track.h | 4 +- include/bb_track_container.h | 2 +- include/note.h | 40 ++--- include/note_play_handle.h | 24 ++- include/panning.h | 4 +- include/pattern.h | 4 +- include/piano_roll.h | 14 +- include/song.h | 4 +- include/song_editor.h | 2 +- include/timeline.h | 26 +-- include/track.h | 36 ++-- include/volume.h | 4 +- plugins/flp_import/FlpImport.cpp | 3 +- plugins/midi_import/MidiImport.cpp | 13 +- plugins/midi_import/MidiImport.h | 6 +- plugins/opl2/opl2instrument.cpp | 23 ++- plugins/opl2/opl2instrument.h | 3 +- plugins/vestige/vestige.cpp | 8 +- plugins/vestige/vestige.h | 6 +- plugins/zynaddsubfx/LocalZynAddSubFx.cpp | 32 ++-- plugins/zynaddsubfx/LocalZynAddSubFx.h | 5 +- plugins/zynaddsubfx/RemoteZynAddSubFx.cpp | 7 +- plugins/zynaddsubfx/ZynAddSubFx.cpp | 16 +- plugins/zynaddsubfx/ZynAddSubFx.h | 3 +- src/core/AutomationPattern.cpp | 18 +- src/core/InstrumentFunctions.cpp | 2 +- src/core/Piano.cpp | 5 +- src/core/RemotePlugin.cpp | 12 +- src/core/SampleRecordHandle.cpp | 2 +- src/core/bb_track_container.cpp | 12 +- src/core/midi/MidiAlsaSeq.cpp | 80 ++++----- src/core/midi/MidiClient.cpp | 57 +++--- src/core/midi/MidiController.cpp | 11 +- src/core/midi/MidiPort.cpp | 58 +++--- src/core/midi/MidiWinMM.cpp | 18 +- src/core/note.cpp | 8 +- src/core/note_play_handle.cpp | 48 +++-- src/core/song.cpp | 8 +- src/core/timeline.cpp | 16 +- src/core/track.cpp | 80 ++++----- src/gui/AutomationEditor.cpp | 33 ++-- src/gui/AutomationPatternView.cpp | 6 +- src/gui/ControllerConnectionDialog.cpp | 10 +- src/gui/PianoView.cpp | 14 +- src/gui/TrackContainerView.cpp | 4 +- src/gui/piano_roll.cpp | 126 +++++++------ src/gui/song_editor.cpp | 22 +-- src/tracks/AutomationTrack.cpp | 10 +- src/tracks/InstrumentTrack.cpp | 206 +++++++++------------ src/tracks/SampleTrack.cpp | 8 +- src/tracks/bb_track.cpp | 12 +- src/tracks/pattern.cpp | 72 ++++---- 70 files changed, 901 insertions(+), 891 deletions(-) rename include/{midi.h => Midi.h} (53%) create mode 100644 include/MidiEvent.h rename include/{midi_time.h => MidiTime.h} (62%) diff --git a/include/AutomationEditor.h b/include/AutomationEditor.h index d725366a4..1e37cd9b4 100644 --- a/include/AutomationEditor.h +++ b/include/AutomationEditor.h @@ -31,7 +31,7 @@ #include "lmms_basics.h" #include "JournallingObject.h" -#include "midi_time.h" +#include "MidiTime.h" #include "AutomationPattern.h" #include "ComboBoxModel.h" @@ -127,7 +127,7 @@ protected slots: void pasteValues(); void deleteSelectedValues(); - void updatePosition( const midiTime & _t ); + void updatePosition( const MidiTime & _t ); void zoomingXChanged(); void zoomingYChanged(); @@ -218,7 +218,7 @@ private: QScrollBar * m_leftRightScroll; QScrollBar * m_topBottomScroll; - midiTime m_currentPosition; + MidiTime m_currentPosition; actions m_action; @@ -258,7 +258,7 @@ private: signals: void currentPatternChanged(); - void positionChanged( const midiTime & ); + void positionChanged( const MidiTime & ); } ; diff --git a/include/AutomationPattern.h b/include/AutomationPattern.h index 8b11c332c..ea20bb3a0 100644 --- a/include/AutomationPattern.h +++ b/include/AutomationPattern.h @@ -33,7 +33,7 @@ class AutomationTrack; -class midiTime; +class MidiTime; @@ -72,12 +72,12 @@ public: } void setTension( QString _new_tension ); - virtual midiTime length() const; + virtual MidiTime length() const; - midiTime putValue( const midiTime & _time, const float _value, + MidiTime putValue( const MidiTime & _time, const float _value, const bool _quant_pos = true ); - void removeValue( const midiTime & _time ); + void removeValue( const MidiTime & _time ); inline const timeMap & getTimeMap() const { @@ -104,8 +104,8 @@ public: return m_timeMap.isEmpty() == false; } - float valueAt( const midiTime & _time ) const; - float *valuesAfter( const midiTime & _time ) const; + float valueAt( const MidiTime & _time ) const; + float *valuesAfter( const MidiTime & _time ) const; const QString name() const; @@ -123,7 +123,7 @@ public: return classNodeName(); } - void processMidiTime( const midiTime & _time ); + void processMidiTime( const MidiTime & _time ); virtual trackContentObjectView * createView( trackView * _tv ); diff --git a/include/AutomationTrack.h b/include/AutomationTrack.h index 834174ece..a4c44b302 100644 --- a/include/AutomationTrack.h +++ b/include/AutomationTrack.h @@ -36,7 +36,7 @@ public: AutomationTrack( TrackContainer* tc, bool _hidden = false ); virtual ~AutomationTrack(); - virtual bool play( const midiTime & _start, const fpp_t _frames, + virtual bool play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _frame_base, int _tco_num = -1 ); virtual QString nodeName() const @@ -45,7 +45,7 @@ public: } virtual trackView * createView( TrackContainerView* ); - virtual trackContentObject * createTCO( const midiTime & _pos ); + virtual trackContentObject * createTCO( const MidiTime & _pos ); virtual void saveTrackSpecificSettings( QDomDocument & _doc, QDomElement & _parent ); diff --git a/include/Instrument.h b/include/Instrument.h index 7cec41019..f0ff145c2 100644 --- a/include/Instrument.h +++ b/include/Instrument.h @@ -35,8 +35,8 @@ // forward-declarations class InstrumentTrack; class InstrumentView; -class midiEvent; -class midiTime; +class MidiEvent; +class MidiTime; class notePlayHandle; class track; @@ -99,7 +99,7 @@ public: // sub-classes can re-implement this for receiving all incoming // MIDI-events - inline virtual bool handleMidiEvent( const midiEvent &, const midiTime & ) + inline virtual bool handleMidiEvent( const MidiEvent&, const MidiTime& = MidiTime() ) { return false; } diff --git a/include/InstrumentTrack.h b/include/InstrumentTrack.h index 3514b0aa7..0217cb19a 100644 --- a/include/InstrumentTrack.h +++ b/include/InstrumentTrack.h @@ -69,12 +69,10 @@ public: void processAudioBuffer( sampleFrame * _buf, const fpp_t _frames, notePlayHandle * _n ); - midiEvent applyMasterKey( const midiEvent & _me ); + MidiEvent applyMasterKey( const MidiEvent& event ); - virtual void processInEvent( const midiEvent & _me, - const midiTime & _time ); - virtual void processOutEvent( const midiEvent & _me, - const midiTime & _time ); + virtual void processInEvent( const MidiEvent& event, const MidiTime& time = MidiTime() ); + virtual void processOutEvent( const MidiEvent& event, const MidiTime& time = MidiTime() ); // silence all running notes played by this track void silenceAllNotes(); @@ -117,13 +115,13 @@ public: } // play everything in given frame-range - creates note-play-handles - virtual bool play( const midiTime & _start, const fpp_t _frames, + virtual bool play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _frame_base, int _tco_num = -1 ); // create new view for me virtual trackView * createView( TrackContainerView* tcv ); // create new track-content-object = pattern - virtual trackContentObject * createTCO( const midiTime & _pos ); + virtual trackContentObject * createTCO( const MidiTime & _pos ); // called by track diff --git a/include/midi.h b/include/Midi.h similarity index 53% rename from include/midi.h rename to include/Midi.h index 09a9afa1b..25a9fecc8 100644 --- a/include/midi.h +++ b/include/Midi.h @@ -1,7 +1,7 @@ /* - * midi.h - constants, structs etc. concerning MIDI + * Midi.h - constants, structs etc. concerning MIDI * - * Copyright (c) 2005-2013 Tobias Doerffel + * Copyright (c) 2005-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -26,8 +26,6 @@ #define _MIDI_H #include "lmms_basics.h" -#include "panning_constants.h" -#include enum MidiEventTypes @@ -60,7 +58,7 @@ enum MidiEventTypes MidiMetaEvent = 0xFF } ; -enum MidiMetaEvents +enum MidiMetaEventTypes { MidiMetaInvalid = 0x00, MidiCopyright = 0x02, @@ -79,6 +77,7 @@ enum MidiMetaEvents MidiMetaCustom = 0x80, MidiNotePanning } ; +typedef MidiMetaEventTypes MidiMetaEventType; enum MidiStandardControllers @@ -120,139 +119,4 @@ const int MidiMaxNote = 127; const int MidiMaxPanning = 127; const int MidiMinPanning = -128; - -struct midiEvent -{ - midiEvent( MidiEventTypes _type = MidiActiveSensing, - int8_t _channel = 0, - int16_t _param1 = 0, - int16_t _param2 = 0, - const void * _sourcePort = NULL ) : - m_type( _type ), - m_metaEvent( MidiMetaInvalid ), - m_channel( _channel ), - m_sysExData( NULL ), - m_sourcePort( _sourcePort ), - m_fromMidiPort( false ) - { - m_data.m_param[0] = _param1; - m_data.m_param[1] = _param2; - } - - midiEvent( MidiEventTypes _type, const char * _sysex_data, - int _data_len ) : - m_type( _type ), - m_metaEvent( MidiMetaInvalid ), - m_channel( 0 ), - m_sysExData( _sysex_data ), - m_sourcePort( NULL ), - m_fromMidiPort( false ) - { - m_data.m_sysExDataLen = _data_len; - } - - midiEvent( const midiEvent & _copy ) : - m_type( _copy.m_type ), - m_metaEvent( _copy.m_metaEvent ), - m_channel( _copy.m_channel ), - m_data( _copy.m_data ), - m_sysExData( _copy.m_sysExData ), - m_sourcePort( _copy.m_sourcePort ), - m_fromMidiPort( _copy.m_fromMidiPort ) - { - } - - inline MidiEventTypes type() const - { - return m_type; - } - - inline int channel() const - { - return m_channel; - } - - inline int16_t key() const - { - return m_data.m_param[0]; - } - - inline int16_t & key() - { - return m_data.m_param[0]; - } - - inline uint8_t controllerNumber() const - { - return m_data.m_param[0]; - } - - inline uint8_t controllerValue() const - { - return m_data.m_param[1]; - } - - inline int16_t velocity() const - { - return m_data.m_param[1]; - } - - inline int16_t & velocity() - { - return m_data.m_param[1]; - } - - inline int16_t midiPanning() const - { - return m_data.m_param[1]; - } - - inline volume_t getVolume() const - { - return (volume_t)( velocity() * 100 / MidiMaxVelocity ); - } - - inline const void * sourcePort() const - { - return m_sourcePort; - } - - inline panning_t getPanning() const - { - return (panning_t) ( PanningLeft + - ( (float)( midiPanning() - MidiMinPanning ) ) / - ( (float)( MidiMaxPanning - MidiMinPanning ) ) * - ( (float)( PanningRight - PanningLeft ) ) ); - } - - void setFromMidiPort( bool enabled ) - { - m_fromMidiPort = enabled; - } - - bool isFromMidiPort() const - { - return m_fromMidiPort; - } - - MidiEventTypes m_type; // MIDI event type - MidiMetaEvents m_metaEvent; // Meta event (mostly unused) - int8_t m_channel; // MIDI channel - union - { - int16_t m_param[2]; // first/second parameter (key/velocity) - uint8_t m_bytes[4]; // raw bytes - int32_t m_sysExDataLen; // len of m_sysExData - } m_data; - - const char * m_sysExData; - const void * m_sourcePort; - - -private: - bool m_fromMidiPort; - -} ; - - #endif diff --git a/include/MidiAlsaSeq.h b/include/MidiAlsaSeq.h index 13d250c3f..70640ae3a 100644 --- a/include/MidiAlsaSeq.h +++ b/include/MidiAlsaSeq.h @@ -62,8 +62,8 @@ public: - virtual void processOutEvent( const midiEvent & _me, - const midiTime & _time, + virtual void processOutEvent( const MidiEvent & _me, + const MidiTime & _time, const MidiPort * _port ); virtual void applyPortMode( MidiPort * _port ); @@ -84,7 +84,7 @@ public: } // return name of port which specified MIDI event came from - virtual QString sourcePortName( const midiEvent & ) const; + virtual QString sourcePortName( const MidiEvent & ) const; // (un)subscribe given MidiPort to/from destination-port virtual void subscribeReadablePort( MidiPort * _port, diff --git a/include/MidiClient.h b/include/MidiClient.h index b8f0b459a..2888999ac 100644 --- a/include/MidiClient.h +++ b/include/MidiClient.h @@ -29,7 +29,7 @@ #include -#include "midi.h" +#include "MidiEvent.h" #include "MidiEventProcessor.h" #include "tab_widget.h" @@ -45,8 +45,8 @@ public: virtual ~MidiClient(); // to be implemented by sub-classes - virtual void processOutEvent( const midiEvent & _me, - const midiTime & _time, + virtual void processOutEvent( const MidiEvent & _me, + const MidiTime & _time, const MidiPort * _port ) = 0; // inheriting classes can re-implement this for being able to update @@ -78,13 +78,13 @@ public: } // return name of port which specified MIDI event came from - virtual QString sourcePortName( const midiEvent & ) const + virtual QString sourcePortName( const MidiEvent & ) const { return QString(); } - // (un)subscribe given MidiPort to/from destination-port + // (un)subscribe given MidiPort to/from destination-port virtual void subscribeReadablePort( MidiPort * _port, const QString & _dest, bool _subscribe = true ); @@ -167,7 +167,7 @@ protected: private: // this does MIDI-event-process void processParsedEvent(); - virtual void processOutEvent( const midiEvent& event, const midiTime& time, const MidiPort* port ); + virtual void processOutEvent( const MidiEvent& event, const MidiTime& time, const MidiPort* port ); // small helper function returning length of a certain event - this // is necessary for parsing raw-MIDI-data @@ -188,7 +188,7 @@ private: // event type include? uint32_t m_buffer[RAW_MIDI_PARSE_BUF_SIZE]; // buffer for incoming data - midiEvent m_midiEvent; // midi-event + MidiEvent m_midiEvent; // midi-event } m_midiParseData; } ; diff --git a/include/MidiController.h b/include/MidiController.h index f9d3a0d33..2271e8659 100644 --- a/include/MidiController.h +++ b/include/MidiController.h @@ -43,11 +43,11 @@ public: MidiController( Model * _parent ); virtual ~MidiController(); - virtual void processInEvent( const midiEvent & _me, - const midiTime & _time ); + virtual void processInEvent( const MidiEvent & _me, + const MidiTime & _time ); - virtual void processOutEvent( const midiEvent& _me, - const midiTime & _time) + virtual void processOutEvent( const MidiEvent& _me, + const MidiTime & _time) { // No output yet } diff --git a/include/MidiEvent.h b/include/MidiEvent.h new file mode 100644 index 000000000..38bf33f90 --- /dev/null +++ b/include/MidiEvent.h @@ -0,0 +1,209 @@ +/* + * MidiEvent.h - MidiEvent class + * + * Copyright (c) 2005-2014 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _MIDI_EVENT_H +#define _MIDI_EVENT_H + +#include +#include "Midi.h" +#include "panning_constants.h" + +class MidiEvent +{ +public: + MidiEvent( MidiEventTypes type = MidiActiveSensing, + int8_t channel = 0, + int16_t param1 = 0, + int16_t param2 = 0, + const void* sourcePort = NULL ) : + m_type( type ), + m_metaEvent( MidiMetaInvalid ), + m_channel( channel ), + m_sysExData( NULL ), + m_sourcePort( sourcePort ) + { + m_data.m_param[0] = param1; + m_data.m_param[1] = param2; + } + + MidiEvent( MidiEventTypes type, const char* sysExData, int dataLen ) : + m_type( type ), + m_metaEvent( MidiMetaInvalid ), + m_channel( 0 ), + m_sysExData( sysExData ), + m_sourcePort( NULL ) + { + m_data.m_sysExDataLen = dataLen; + } + + MidiEvent( const MidiEvent& other ) : + m_type( other.m_type ), + m_metaEvent( other.m_metaEvent ), + m_channel( other.m_channel ), + m_data( other.m_data ), + m_sysExData( other.m_sysExData ), + m_sourcePort( other.m_sourcePort ) + { + } + + MidiEventTypes type() const + { + return m_type; + } + + void setType( MidiEventTypes type ) + { + m_type = type; + } + + void setMetaEvent( MidiMetaEventType metaEvent ) + { + m_metaEvent = metaEvent; + } + + MidiMetaEventType metaEvent() const + { + return m_metaEvent; + } + + int8_t channel() const + { + return m_channel; + } + + void setChannel( int8_t channel ) + { + m_channel = channel; + } + + int16_t param( int i ) const + { + return m_data.m_param[i]; + } + + void setParam( int i, uint16_t value ) + { + m_data.m_param[i] = value; + } + + int16_t key() const + { + return param( 0 ); + } + + void setKey( int16_t key ) + { + m_data.m_param[0] = key; + } + + uint8_t velocity() const + { + return m_data.m_param[1] & 0x7F; + } + + void setVelocity( int16_t velocity ) + { + m_data.m_param[1] = velocity; + } + + panning_t panning() const + { + return (panning_t) ( PanningLeft + + ( (float)( midiPanning() - MidiMinPanning ) ) / + ( (float)( MidiMaxPanning - MidiMinPanning ) ) * + ( (float)( PanningRight - PanningLeft ) ) ); + } + int16_t midiPanning() const + { + return m_data.m_param[1]; + } + + volume_t volume() const + { + return (volume_t)( velocity() * 100 / MidiMaxVelocity ); + } + + const void* sourcePort() const + { + return m_sourcePort; + } + + uint8_t controllerNumber() const + { + return param( 0 ) & 0x7F; + } + + void setControllerNumber( uint8_t num ) + { + setParam( 0, num ); + } + + uint8_t controllerValue() const + { + return param( 1 ); + } + + void setControllerValue( uint8_t value ) + { + setParam( 1, value ); + } + + uint8_t program() const + { + return param( 0 ); + } + + uint8_t channelPressure() const + { + return param( 0 ); + } + + int16_t pitchBend() const + { + return param( 0 ); + } + + void setPitchBend( uint16_t pitchBend ) + { + setParam( 0, pitchBend ); + } + + +private: + MidiEventTypes m_type; // MIDI event type + MidiMetaEventType m_metaEvent; // Meta event (mostly unused) + int8_t m_channel; // MIDI channel + union + { + int16_t m_param[2]; // first/second parameter (key/velocity) + uint8_t m_bytes[4]; // raw bytes + int32_t m_sysExDataLen; // len of m_sysExData + } m_data; + + const char* m_sysExData; + const void* m_sourcePort; + +} ; + +#endif diff --git a/include/MidiEventProcessor.h b/include/MidiEventProcessor.h index 1b3d0dd33..dafcfb6cd 100644 --- a/include/MidiEventProcessor.h +++ b/include/MidiEventProcessor.h @@ -25,27 +25,25 @@ #ifndef _MIDI_EVENT_PROCESSOR_H #define _MIDI_EVENT_PROCESSOR_H -class midiEvent; -class midiTime; +#include "MidiEvent.h" +#include "MidiTime.h" // all classes being able to process MIDI-events should inherit from this class MidiEventProcessor { public: - inline MidiEventProcessor() + MidiEventProcessor() { } - virtual inline ~MidiEventProcessor() + virtual ~MidiEventProcessor() { } // to be implemented by inheriting classes - virtual void processInEvent( const midiEvent & _me, - const midiTime & _time ) = 0; - virtual void processOutEvent( const midiEvent & _me, - const midiTime & _time ) = 0; + virtual void processInEvent( const MidiEvent& event, const MidiTime& time = MidiTime() ) = 0; + virtual void processOutEvent( const MidiEvent& event, const MidiTime& time = MidiTime() ) = 0; } ; diff --git a/include/MidiPort.h b/include/MidiPort.h index a5b1aee0e..c407f1f8f 100644 --- a/include/MidiPort.h +++ b/include/MidiPort.h @@ -1,8 +1,8 @@ /* - * MidiPort.h - abstraction of MIDI ports which are part of LMMS's MIDI- + * MidiPort.h - abstraction of MIDI ports which are part of LMMS' MIDI * sequencing system * - * Copyright (c) 2005-2009 Tobias Doerffel + * Copyright (c) 2005-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -28,16 +28,17 @@ #include #include -#include +#include -#include "midi.h" +#include "Midi.h" +#include "MidiTime.h" #include "AutomatableModel.h" class MidiClient; +class MidiEvent; class MidiEventProcessor; class MidiPortMenu; -class midiTime; // class for abstraction of MIDI-port @@ -104,8 +105,8 @@ public: return outputChannel() - 1; } - void processInEvent( const midiEvent & _me, const midiTime & _time ); - void processOutEvent( const midiEvent & _me, const midiTime & _time ); + void processInEvent( const MidiEvent& event, const MidiTime& time = MidiTime() ); + void processOutEvent( const MidiEvent& event, const MidiTime& time = MidiTime() ); virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); diff --git a/include/midi_time.h b/include/MidiTime.h similarity index 62% rename from include/midi_time.h rename to include/MidiTime.h index f7f857624..9a86f3b48 100644 --- a/include/midi_time.h +++ b/include/MidiTime.h @@ -1,8 +1,8 @@ /* - * midi_time.h - declaration of class midiTime which provides data-type for - * position- and length-variables + * MidiTime.h - declaration of class MidiTime which provides data type for + * position- and length-variables * - * Copyright (c) 2004-2009 Tobias Doerffel + * Copyright (c) 2004-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -35,25 +35,25 @@ const int DefaultStepsPerTact = 16; const int DefaultBeatsPerTact = DefaultTicksPerTact / DefaultStepsPerTact; -class EXPORT midiTime +class EXPORT MidiTime { public: - inline midiTime( const tact_t _tact, const tick_t _ticks ) : - m_ticks( _tact * s_ticksPerTact + _ticks ) + MidiTime( const tact_t tact, const tick_t ticks ) : + m_ticks( tact * s_ticksPerTact + ticks ) { } - inline midiTime( const tick_t _ticks = 0 ) : - m_ticks( _ticks ) + MidiTime( const tick_t ticks = 0 ) : + m_ticks( ticks ) { } - inline midiTime( const midiTime & _t ) : - m_ticks( _t.m_ticks ) + MidiTime( const MidiTime& time ) : + m_ticks( time.m_ticks ) { } - inline midiTime toNearestTact() const + MidiTime toNearestTact() const { if( m_ticks % s_ticksPerTact >= s_ticksPerTact/2 ) { @@ -62,30 +62,30 @@ public: return getTact() * s_ticksPerTact; } - inline midiTime & operator=( const midiTime & _t ) + MidiTime& operator=( const MidiTime& time ) { - m_ticks = _t.m_ticks; + m_ticks = time.m_ticks; return *this; } - inline midiTime & operator+=( const midiTime & _t ) + MidiTime& operator+=( const MidiTime& time ) { - m_ticks += _t.m_ticks; + m_ticks += time.m_ticks; return *this; } - inline midiTime & operator-=( const midiTime & _t ) + MidiTime& operator-=( const MidiTime& time ) { - m_ticks -= _t.m_ticks; + m_ticks -= time.m_ticks; return *this; } - inline tact_t getTact() const + tact_t getTact() const { return m_ticks / s_ticksPerTact; } - inline tact_t nextFullTact() const + tact_t nextFullTact() const { if( m_ticks % s_ticksPerTact == 0 ) { @@ -94,37 +94,34 @@ public: return m_ticks / s_ticksPerTact + 1; } - inline void setTicks( tick_t _t ) + void setTicks( tick_t ticks ) { - m_ticks = _t; + m_ticks = ticks; } - inline tick_t getTicks() const + tick_t getTicks() const { return m_ticks; } - inline operator int() const + operator int() const { return m_ticks; } // calculate number of frame that are needed this time - inline f_cnt_t frames( const float _frames_per_tick ) const + f_cnt_t frames( const float framesPerTick ) const { if( m_ticks >= 0 ) { - return static_cast( m_ticks * - _frames_per_tick ); + return static_cast( m_ticks * framesPerTick ); } return 0; } - static inline midiTime fromFrames( const f_cnt_t _frames, - const float _frames_per_tick ) + static MidiTime fromFrames( const f_cnt_t frames, const float framesPerTick ) { - return midiTime( static_cast( _frames / - _frames_per_tick ) ); + return MidiTime( static_cast( frames / framesPerTick ) ); } @@ -143,6 +140,7 @@ public: s_ticksPerTact = _tpt; } + private: tick_t m_ticks; diff --git a/include/MidiWinMM.h b/include/MidiWinMM.h index 51cccae71..54b6bdf0d 100644 --- a/include/MidiWinMM.h +++ b/include/MidiWinMM.h @@ -56,8 +56,8 @@ public: - virtual void processOutEvent( const midiEvent & _me, - const midiTime & _time, + virtual void processOutEvent( const MidiEvent & _me, + const MidiTime & _time, const MidiPort * _port ); virtual void applyPortMode( MidiPort * _port ); @@ -78,7 +78,7 @@ public: #endif // return name of port which specified MIDI event came from - virtual QString sourcePortName( const midiEvent & ) const; + virtual QString sourcePortName( const MidiEvent & ) const; // (un)subscribe given MidiPort to/from destination-port virtual void subscribeReadablePort( MidiPort * _port, diff --git a/include/RemotePlugin.h b/include/RemotePlugin.h index 46ffc5e15..8eb097ebd 100644 --- a/include/RemotePlugin.h +++ b/include/RemotePlugin.h @@ -1,7 +1,7 @@ /* * RemotePlugin.h - base class providing RPC like mechanisms * - * Copyright (c) 2008-2012 Tobias Doerffel + * Copyright (c) 2008-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -26,7 +26,7 @@ #define _REMOTE_PLUGIN_H #include "export.h" -#include "midi.h" +#include "MidiEvent.h" #include "VST_sync_shm.h" #include @@ -724,7 +724,7 @@ public: bool process( const sampleFrame * _in_buf, sampleFrame * _out_buf ); - void processMidiEvent( const midiEvent &, const f_cnt_t _offset ); + void processMidiEvent( const MidiEvent&, const f_cnt_t _offset ); void updateSampleRate( sample_rate_t _sr ) { @@ -820,8 +820,7 @@ public: virtual void process( const sampleFrame * _in_buf, sampleFrame * _out_buf ) = 0; - virtual void processMidiEvent( const midiEvent &, - const f_cnt_t /* _offset */ ) + virtual void processMidiEvent( const MidiEvent&, const f_cnt_t /* _offset */ ) { } @@ -1120,7 +1119,7 @@ bool RemotePluginClient::processMessage( const message & _m ) case IdMidiEvent: processMidiEvent( - midiEvent( static_cast( + MidiEvent( static_cast( _m.getInt( 0 ) ), _m.getInt( 1 ), _m.getInt( 2 ), diff --git a/include/SampleRecordHandle.h b/include/SampleRecordHandle.h index 465005fbe..6ff8a3d63 100644 --- a/include/SampleRecordHandle.h +++ b/include/SampleRecordHandle.h @@ -61,7 +61,7 @@ private: typedef QList > bufferList; bufferList m_buffers; f_cnt_t m_framesRecorded; - midiTime m_minLength; + MidiTime m_minLength; track * m_track; bbTrack * m_bbTrack; diff --git a/include/SampleTrack.h b/include/SampleTrack.h index 975ba2477..fed785657 100644 --- a/include/SampleTrack.h +++ b/include/SampleTrack.h @@ -43,7 +43,7 @@ public: SampleTCO( track * _track ); virtual ~SampleTCO(); - virtual void changeLength( const midiTime & _length ); + virtual void changeLength( const MidiTime & _length ); const QString & sampleFile() const; virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); @@ -58,7 +58,7 @@ public: return m_sampleBuffer; } - midiTime sampleLength() const; + MidiTime sampleLength() const; virtual trackContentObjectView * createView( trackView * _tv ); @@ -121,10 +121,10 @@ public: SampleTrack( TrackContainer* tc ); virtual ~SampleTrack(); - virtual bool play( const midiTime & _start, const fpp_t _frames, + virtual bool play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _frame_base, int _tco_num = -1 ); virtual trackView * createView( TrackContainerView* tcv ); - virtual trackContentObject * createTCO( const midiTime & _pos ); + virtual trackContentObject * createTCO( const MidiTime & _pos ); virtual void saveTrackSpecificSettings( QDomDocument & _doc, diff --git a/include/TrackContainerView.h b/include/TrackContainerView.h index 2203fb868..a18bf5a78 100644 --- a/include/TrackContainerView.h +++ b/include/TrackContainerView.h @@ -56,7 +56,7 @@ public: return( m_scrollArea ); } - inline const midiTime & currentPosition() const + inline const MidiTime & currentPosition() const { return( m_currentPosition ); } @@ -142,7 +142,7 @@ protected: virtual void undoStep( JournalEntry & _je ); virtual void redoStep( JournalEntry & _je ); - midiTime m_currentPosition; + MidiTime m_currentPosition; private: @@ -180,7 +180,7 @@ private: signals: - void positionChanged( const midiTime & _pos ); + void positionChanged( const MidiTime & _pos ); } ; diff --git a/include/bb_track.h b/include/bb_track.h index 8b0dbff99..a4c440f4c 100644 --- a/include/bb_track.h +++ b/include/bb_track.h @@ -109,10 +109,10 @@ public: bbTrack( TrackContainer* tc ); virtual ~bbTrack(); - virtual bool play( const midiTime & _start, const fpp_t _frames, + virtual bool play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _frame_base, int _tco_num = -1 ); virtual trackView * createView( TrackContainerView* tcv ); - virtual trackContentObject * createTCO( const midiTime & _pos ); + virtual trackContentObject * createTCO( const MidiTime & _pos ); virtual void saveTrackSpecificSettings( QDomDocument & _doc, QDomElement & _parent ); diff --git a/include/bb_track_container.h b/include/bb_track_container.h index bc9bf7064..3ad0b9157 100644 --- a/include/bb_track_container.h +++ b/include/bb_track_container.h @@ -38,7 +38,7 @@ public: bbTrackContainer(); virtual ~bbTrackContainer(); - virtual bool play( midiTime _start, const fpp_t _frames, + virtual bool play( MidiTime _start, const fpp_t _frames, const f_cnt_t _frame_base, int _tco_num = -1 ); virtual void updateAfterTrackAdd(); diff --git a/include/note.h b/include/note.h index 36bf1640d..199254f9d 100644 --- a/include/note.h +++ b/include/note.h @@ -30,7 +30,7 @@ #include "volume.h" #include "panning.h" -#include "midi_time.h" +#include "MidiTime.h" #include "SerializingObject.h" class DetuningHelper; @@ -81,8 +81,8 @@ const float MaxDetuning = 4 * 12.0f; class EXPORT note : public SerializingObject { public: - note( const midiTime & _length = midiTime( 0 ), - const midiTime & _pos = midiTime( 0 ), + note( const MidiTime & _length = MidiTime( 0 ), + const MidiTime & _pos = MidiTime( 0 ), int key = DefaultKey, volume_t _volume = DefaultVolume, panning_t _panning = DefaultPanning, @@ -93,8 +93,8 @@ public: // used by GUI inline void setSelected( const bool _selected ){ m_selected = _selected; } inline void setOldKey( const int _oldKey ){ m_oldKey = _oldKey; } - inline void setOldPos( const midiTime & _oldPos ){ m_oldPos = _oldPos; } - inline void setOldLength( const midiTime & _oldLength ) + inline void setOldPos( const MidiTime & _oldPos ){ m_oldPos = _oldPos; } + inline void setOldLength( const MidiTime & _oldLength ) { m_oldLength = _oldLength; } @@ -104,11 +104,11 @@ public: } - void setLength( const midiTime & _length ); - void setPos( const midiTime & _pos ); + void setLength( const MidiTime & _length ); + void setPos( const MidiTime & _pos ); void setKey( const int _key ); - virtual void setVolume( const volume_t _volume = DefaultVolume ); - void setPanning( const panning_t _panning = DefaultPanning ); + virtual void setVolume( const volume_t volume = DefaultVolume ); + virtual void setPanning( const panning_t panning = DefaultPanning ); void quantizeLength( const int _q_grid ); void quantizePos( const int _q_grid ); @@ -129,12 +129,12 @@ public: return m_oldKey; } - inline midiTime oldPos() const + inline MidiTime oldPos() const { return m_oldPos; } - inline midiTime oldLength() const + inline MidiTime oldLength() const { return m_oldLength; } @@ -144,23 +144,23 @@ public: return m_isPlaying; } - inline midiTime endPos() const + inline MidiTime endPos() const { const int l = length(); return pos() + l; } - inline const midiTime & length() const + inline const MidiTime & length() const { return m_length; } - inline const midiTime & pos() const + inline const MidiTime & pos() const { return m_pos; } - inline midiTime pos( midiTime _base_pos ) const + inline MidiTime pos( MidiTime _base_pos ) const { const int bp = _base_pos; return m_pos - bp; @@ -191,7 +191,7 @@ public: return classNodeName(); } - static midiTime quantized( const midiTime & _m, const int _q_grid ); + static MidiTime quantized( const MidiTime & _m, const int _q_grid ); DetuningHelper * detuning() const { @@ -226,15 +226,15 @@ private: // for piano roll editing bool m_selected; int m_oldKey; - midiTime m_oldPos; - midiTime m_oldLength; + MidiTime m_oldPos; + MidiTime m_oldLength; bool m_isPlaying; int m_key; volume_t m_volume; panning_t m_panning; - midiTime m_length; - midiTime m_pos; + MidiTime m_length; + MidiTime m_pos; DetuningHelper * m_detuning; void createDetuning(); diff --git a/include/note_play_handle.h b/include/note_play_handle.h index 2c2b2e3f1..e1374276a 100644 --- a/include/note_play_handle.h +++ b/include/note_play_handle.h @@ -2,7 +2,7 @@ * note_play_handle.h - declaration of class notePlayHandle which is needed * by LMMS-Play-Engine * - * Copyright (c) 2004-2012 Tobias Doerffel + * Copyright (c) 2004-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -52,13 +52,19 @@ public: const f_cnt_t _offset, const f_cnt_t _frames, const note & _n, notePlayHandle * _parent = NULL, - const bool _part_of_arp = false ); + const bool _part_of_arp = false, + int midiChannel = -1 ); virtual ~notePlayHandle(); - virtual void setVolume( const volume_t _volume = DefaultVolume ); + virtual void setVolume( const volume_t volume = DefaultVolume ); + virtual void setPanning( const panning_t panning = DefaultPanning ); int midiVelocity() const; int midiKey() const; + int midiChannel() const + { + return m_midiChannel; + } const float & frequency() const { @@ -189,15 +195,15 @@ public: m_bbTrack = _bb_track; } - void processMidiTime( const midiTime & _time ); + void processMidiTime( const MidiTime & _time ); void resize( const bpm_t _new_tempo ); - void setSongGlobalParentOffset( const midiTime &offset ) + void setSongGlobalParentOffset( const MidiTime &offset ) { m_songGlobalParentOffset = offset; } - const midiTime &songGlobalParentOffset() const + const MidiTime &songGlobalParentOffset() const { return m_songGlobalParentOffset; } @@ -266,13 +272,15 @@ private: bpm_t m_origTempo; // original tempo f_cnt_t m_origFrames; // original m_frames - int m_origBaseNote; + const int m_origBaseNote; float m_frequency; float m_unpitchedFrequency; BaseDetuning * m_baseDetuning; - midiTime m_songGlobalParentOffset; + MidiTime m_songGlobalParentOffset; + + const int m_midiChannel; } ; diff --git a/include/panning.h b/include/panning.h index 29d2e5365..60188e3f8 100644 --- a/include/panning.h +++ b/include/panning.h @@ -2,7 +2,7 @@ * panning.h - declaration of some types, concerning the * panning of a note * - * Copyright (c) 2004-2009 Tobias Doerffel + * Copyright (c) 2004-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -30,7 +30,7 @@ #include "volume.h" #include "templates.h" #include "panning_constants.h" -#include "midi.h" +#include "Midi.h" inline stereoVolumeVector panningToVolumeVector( panning_t _p, float _scale = 1.0f ) diff --git a/include/pattern.h b/include/pattern.h index 26b51849e..fcb66fed9 100644 --- a/include/pattern.h +++ b/include/pattern.h @@ -64,8 +64,8 @@ public: void init(); - virtual midiTime length() const; - midiTime beatPatternLength() const; + virtual MidiTime length() const; + MidiTime beatPatternLength() const; // note management note * addNote( const note & _new_note, const bool _quant_pos = true ); diff --git a/include/piano_roll.h b/include/piano_roll.h index 55e193b99..596a29f1a 100644 --- a/include/piano_roll.h +++ b/include/piano_roll.h @@ -135,8 +135,8 @@ protected slots: void pasteNotes(); void deleteSelectedNotes(); - void updatePosition( const midiTime & _t ); - void updatePositionAccompany( const midiTime & _t ); + void updatePosition( const MidiTime & _t ); + void updatePositionAccompany( const MidiTime & _t ); void zoomingChanged(); void quantizeChanged(); @@ -203,9 +203,9 @@ private: pianoRoll( const pianoRoll & ); virtual ~pianoRoll(); - void autoScroll( const midiTime & _t ); + void autoScroll( const MidiTime & _t ); - midiTime newNoteLen() const; + MidiTime newNoteLen() const; void shiftPos(int amount); void shiftSemiTone(int amount); @@ -276,7 +276,7 @@ private: QScrollBar * m_leftRightScroll; QScrollBar * m_topBottomScroll; - midiTime m_currentPosition; + MidiTime m_currentPosition; bool m_recording; QList m_recordingNotes; @@ -315,7 +315,7 @@ private: // remember these values to use them // for the next note that is set - midiTime m_lenOfNewNotes; + MidiTime m_lenOfNewNotes; volume_t m_lastNoteVolume; panning_t m_lastNotePanning; @@ -345,7 +345,7 @@ private: signals: - void positionChanged( const midiTime & ); + void positionChanged( const MidiTime & ); } ; diff --git a/include/song.h b/include/song.h index ed6c18872..32b36e34b 100644 --- a/include/song.h +++ b/include/song.h @@ -65,11 +65,11 @@ public: } ; - class playPos : public midiTime + class playPos : public MidiTime { public: playPos( const int _abs = 0 ) : - midiTime( _abs ), + MidiTime( _abs ), m_timeLine( NULL ), m_timeLineUpdate( true ), m_currentFrame( 0.0f ) diff --git a/include/song_editor.h b/include/song_editor.h index 989636790..af10cd51c 100644 --- a/include/song_editor.h +++ b/include/song_editor.h @@ -84,7 +84,7 @@ private slots: void masterPitchReleased(); void updateScrollBar( int ); - void updatePosition( const midiTime & _t ); + void updatePosition( const MidiTime & _t ); void zoomingChanged(); diff --git a/include/timeline.h b/include/timeline.h index 298f42a7b..ff4661837 100644 --- a/include/timeline.h +++ b/include/timeline.h @@ -61,7 +61,7 @@ public: timeLine( int _xoff, int _yoff, float _ppt, song::playPos & _pos, - const midiTime & _begin, QWidget * _parent ); + const MidiTime & _begin, QWidget * _parent ); virtual ~timeLine(); inline song::playPos & pos() @@ -84,23 +84,23 @@ public: return m_loopPoints == LoopPointsEnabled; } - inline const midiTime & loopBegin() const + inline const MidiTime & loopBegin() const { return ( m_loopPos[0] < m_loopPos[1] ) ? m_loopPos[0] : m_loopPos[1]; } - inline const midiTime & loopEnd() const + inline const MidiTime & loopEnd() const { return ( m_loopPos[0] > m_loopPos[1] ) ? m_loopPos[0] : m_loopPos[1]; } - inline void savePos( const midiTime & _pos ) + inline void savePos( const MidiTime & _pos ) { m_savedPos = _pos; } - inline const midiTime & savedPos() const + inline const MidiTime & savedPos() const { return m_savedPos; } @@ -121,18 +121,18 @@ public: return "timeline"; } - inline int markerX( const midiTime & _t ) const + inline int markerX( const MidiTime & _t ) const { return m_xOffset + static_cast( ( _t - m_begin ) * - m_ppt / midiTime::ticksPerTact() ); + m_ppt / MidiTime::ticksPerTact() ); } public slots: - void updatePosition( const midiTime & ); + void updatePosition( const MidiTime & ); void updatePosition() { - updatePosition( midiTime() ); + updatePosition( MidiTime() ); } void toggleAutoScroll( int _n ); void toggleLoopPoints( int _n ); @@ -162,10 +162,10 @@ private: int m_posMarkerX; float m_ppt; song::playPos & m_pos; - const midiTime & m_begin; - midiTime m_loopPos[2]; + const MidiTime & m_begin; + MidiTime m_loopPos[2]; - midiTime m_savedPos; + MidiTime m_savedPos; textFloat * m_hint; @@ -183,7 +183,7 @@ private: signals: - void positionChanged( const midiTime & _t ); + void positionChanged( const MidiTime & _t ); void loopPointStateLoaded( int _n ); } ; diff --git a/include/track.h b/include/track.h index cbb5faaeb..e30e62e48 100644 --- a/include/track.h +++ b/include/track.h @@ -31,7 +31,7 @@ #include #include "lmms_basics.h" -#include "midi_time.h" +#include "MidiTime.h" #include "rubberband.h" #include "JournallingObject.h" #include "AutomatableModel.h" @@ -101,24 +101,24 @@ public: } - inline const midiTime & startPosition() const + inline const MidiTime & startPosition() const { return m_startPosition; } - inline midiTime endPosition() const + inline MidiTime endPosition() const { const int sp = m_startPosition; return sp + m_length; } - inline const midiTime & length() const + inline const MidiTime & length() const { return m_length; } - virtual void movePosition( const midiTime & _pos ); - virtual void changeLength( const midiTime & _length ); + virtual void movePosition( const MidiTime & _pos ); + virtual void changeLength( const MidiTime & _length ); virtual trackContentObjectView * createView( trackView * _tv ) = 0; @@ -151,8 +151,8 @@ private: track * m_track; QString m_name; - midiTime m_startPosition; - midiTime m_length; + MidiTime m_startPosition; + MidiTime m_length; BoolModel m_mutedModel; BoolModel m_soloModel; @@ -230,7 +230,7 @@ private: textFloat * m_hint; - midiTime m_oldTime;// used for undo/redo while mouse-button is pressed + MidiTime m_oldTime;// used for undo/redo while mouse-button is pressed } ; @@ -258,11 +258,11 @@ public: } } - midiTime endPosition( const midiTime & _pos_start ); + MidiTime endPosition( const MidiTime & _pos_start ); public slots: void update(); - void changePosition( const midiTime & _new_pos = midiTime( -1 ) ); + void changePosition( const MidiTime & _new_pos = MidiTime( -1 ) ); protected: @@ -289,7 +289,7 @@ private: } ; track * getTrack(); - midiTime getPosition( int _mouse_x ); + MidiTime getPosition( int _mouse_x ); trackView * m_trackView; @@ -382,12 +382,12 @@ public: return m_type; } - virtual bool play( const midiTime & _start, const fpp_t _frames, + virtual bool play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _frame_base, int _tco_num = -1 ) = 0; virtual trackView * createView( TrackContainerView * _view ) = 0; - virtual trackContentObject * createTCO( const midiTime & _pos ) = 0; + virtual trackContentObject * createTCO( const MidiTime & _pos ) = 0; virtual void saveTrackSpecificSettings( QDomDocument & _doc, QDomElement & _parent ) = 0; @@ -415,13 +415,13 @@ public: { return( m_trackContentObjects ); } - void getTCOsInRange( tcoVector & _tco_v, const midiTime & _start, - const midiTime & _end ); + void getTCOsInRange( tcoVector & _tco_v, const MidiTime & _start, + const MidiTime & _end ); void swapPositionOfTCOs( int _tco_num1, int _tco_num2 ); - void insertTact( const midiTime & _pos ); - void removeTact( const midiTime & _pos ); + void insertTact( const MidiTime & _pos ); + void removeTact( const MidiTime & _pos ); tact_t length() const; diff --git a/include/volume.h b/include/volume.h index aeb1daf1c..dedecd504 100644 --- a/include/volume.h +++ b/include/volume.h @@ -2,7 +2,7 @@ * volume.h - declaration of some constants and types, concerning the volume * of a note * - * Copyright (c) 2004-2009 Tobias Doerffel + * Copyright (c) 2004-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -29,7 +29,7 @@ #include "lmmsconfig.h" #include "lmms_basics.h" -#include "midi.h" +#include "Midi.h" const volume_t MinVolume = 0; const volume_t MaxVolume = 200; diff --git a/plugins/flp_import/FlpImport.cpp b/plugins/flp_import/FlpImport.cpp index c374595f8..c238fee10 100644 --- a/plugins/flp_import/FlpImport.cpp +++ b/plugins/flp_import/FlpImport.cpp @@ -1744,8 +1744,7 @@ p->putValue( jt->pos, value, false ); { continue; } - trackContentObject * tco = - bb_tracks[it->pattern]->createTCO( midiTime() ); + trackContentObject * tco = bb_tracks[it->pattern]->createTCO( MidiTime() ); tco->movePosition( it->position ); if( it->length != DefaultTicksPerTact ) { diff --git a/plugins/midi_import/MidiImport.cpp b/plugins/midi_import/MidiImport.cpp index 585c2f5eb..0444ce51a 100644 --- a/plugins/midi_import/MidiImport.cpp +++ b/plugins/midi_import/MidiImport.cpp @@ -38,6 +38,7 @@ #include "pattern.h" #include "Instrument.h" #include "MainWindow.h" +#include "MidiTime.h" #include "debug.h" #include "embed.h" #include "song.h" @@ -152,7 +153,7 @@ public: AutomationTrack * at; AutomationPattern * ap; - midiTime lastPos; + MidiTime lastPos; smfMidiCC & create( TrackContainer* tc ) { @@ -172,11 +173,11 @@ public: } - smfMidiCC & putValue( midiTime time, AutomatableModel * objModel, float value ) + smfMidiCC & putValue( MidiTime time, AutomatableModel * objModel, float value ) { if( !ap || time > lastPos + DefaultTicksPerTact ) { - midiTime pPos = midiTime( time.getTact(), 0 ); + MidiTime pPos = MidiTime( time.getTact(), 0 ); ap = dynamic_cast( at->createTCO(0) ); ap->movePosition( pPos ); @@ -186,7 +187,7 @@ public: lastPos = time; time = time - ap->startPosition(); ap->putValue( time, value, false ); - ap->changeLength( midiTime( time.getTact() + 1, 0 ) ); + ap->changeLength( MidiTime( time.getTact() + 1, 0 ) ); return *this; } @@ -212,7 +213,7 @@ public: Instrument * it_inst; bool isSF2; bool hasNotes; - midiTime lastEnd; + MidiTime lastEnd; smfMidiChannel * create( TrackContainer* tc ) { @@ -247,7 +248,7 @@ public: { if( !p || n.pos() > lastEnd + DefaultTicksPerTact ) { - midiTime pPos = midiTime(n.pos().getTact(), 0 ); + MidiTime pPos = MidiTime( n.pos().getTact(), 0 ); p = dynamic_cast( it->createTCO( 0 ) ); p->movePosition( pPos ); } diff --git a/plugins/midi_import/MidiImport.h b/plugins/midi_import/MidiImport.h index 47ad49486..66b839334 100644 --- a/plugins/midi_import/MidiImport.h +++ b/plugins/midi_import/MidiImport.h @@ -29,7 +29,7 @@ #include #include -#include "midi.h" +#include "MidiEvent.h" #include "ImportFilter.h" @@ -117,8 +117,8 @@ private: } - typedef QVector > eventVector; - eventVector m_events; + typedef QVector > EventVector; + EventVector m_events; int m_timingDivision; } ; diff --git a/plugins/opl2/opl2instrument.cpp b/plugins/opl2/opl2instrument.cpp index 0718a3796..2288e0d32 100644 --- a/plugins/opl2/opl2instrument.cpp +++ b/plugins/opl2/opl2instrument.cpp @@ -286,17 +286,16 @@ int opl2instrument::pushVoice(int v) { return i; } -bool opl2instrument::handleMidiEvent( const midiEvent & _me, - const midiTime & _time ) +bool opl2instrument::handleMidiEvent( const MidiEvent& event, const MidiTime& time ) { emulatorMutex.lock(); int key, vel, voice, tmp_pb; - switch(_me.m_type) { + switch(event.type()) { case MidiNoteOn: // to get us in line with MIDI(?) - key = _me.key() +12; - vel = _me.velocity(); + key = event.key() +12; + vel = event.velocity(); voice = popVoice(); if( voice != OPL2_NO_VOICE ) { @@ -311,7 +310,7 @@ bool opl2instrument::handleMidiEvent( const midiEvent & _me, } break; case MidiNoteOff: - key = _me.key() +12; + key = event.key() +12; for(voice=0; voice<9; ++voice) { if( voiceNote[voice] == key ) { theEmulator->write(0xA0+voice, fnums[key] & 0xff); @@ -323,8 +322,8 @@ bool opl2instrument::handleMidiEvent( const midiEvent & _me, velocities[key] = 0; break; case MidiKeyPressure: - key = _me.key() +12; - vel = _me.velocity(); + key = event.key() +12; + vel = event.velocity(); if( velocities[key] != 0) { velocities[key] = vel; } @@ -337,12 +336,12 @@ bool opl2instrument::handleMidiEvent( const midiEvent & _me, case MidiPitchBend: // Update fnumber table // Pitchbend should be in the range 0...16383 but the new range knob gets it wrong. - // tmp_pb = (2*BEND_CENTS)*((float)_me.m_data.m_param[0]/16383)-BEND_CENTS; + // tmp_pb = (2*BEND_CENTS)*((float)event.m_data.m_param[0]/16383)-BEND_CENTS; // Something like 100 cents = 8192, but offset by 8192 so the +/-100 cents range goes from 0...16383? - tmp_pb = ( _me.m_data.m_param[0]-8192 ) * BEND_CENTS / 8192; + tmp_pb = ( event.pitchBend()-8192 ) * BEND_CENTS / 8192; - printf("Pitch bend: %d -> %d cents\n",_me.m_data.m_param[0],tmp_pb); + printf("Pitch bend: %d -> %d cents\n",event.pitchBend(),tmp_pb); if( tmp_pb != pitchbend ) { pitchbend = tmp_pb; tuneEqual(69, 440.0); @@ -356,7 +355,7 @@ bool opl2instrument::handleMidiEvent( const midiEvent & _me, } break; default: - printf("Midi event type %d\n",_me.m_type); + printf("Midi event type %d\n",event.type()); } emulatorMutex.unlock(); return true; diff --git a/plugins/opl2/opl2instrument.h b/plugins/opl2/opl2instrument.h index af2493f95..39c9d13c2 100644 --- a/plugins/opl2/opl2instrument.h +++ b/plugins/opl2/opl2instrument.h @@ -50,8 +50,7 @@ public: inline virtual bool isMidiBased() const { return true; } - virtual bool handleMidiEvent( const midiEvent & _me, - const midiTime & _time ); + virtual bool handleMidiEvent( const MidiEvent& event, const MidiTime& time ); virtual void play( sampleFrame * _working_buffer ); void saveSettings( QDomDocument & _doc, QDomElement & _this ); diff --git a/plugins/vestige/vestige.cpp b/plugins/vestige/vestige.cpp index e8f59c1f4..f47efe689 100644 --- a/plugins/vestige/vestige.cpp +++ b/plugins/vestige/vestige.cpp @@ -310,13 +310,12 @@ void vestigeInstrument::play( sampleFrame * _buf ) -bool vestigeInstrument::handleMidiEvent( const midiEvent & _me, - const midiTime & _time ) +bool vestigeInstrument::handleMidiEvent( const MidiEvent& event, const MidiTime& time ) { m_pluginMutex.lock(); if( m_plugin != NULL ) { - m_plugin->processMidiEvent( _me, _time ); + m_plugin->processMidiEvent( event, time ); } m_pluginMutex.unlock(); @@ -779,8 +778,7 @@ void VestigeInstrumentView::noteOffAll( void ) { for( int key = 0; key <= MidiMaxNote; ++key ) { - m_vi->m_plugin->processMidiEvent( - midiEvent( MidiNoteOff, 0, key, 0 ), 0 ); + m_vi->m_plugin->processMidiEvent( MidiEvent( MidiNoteOff, 0, key, 0 ), 0 ); } } m_vi->m_pluginMutex.unlock(); diff --git a/plugins/vestige/vestige.h b/plugins/vestige/vestige.h index 600e87e22..b3e670305 100644 --- a/plugins/vestige/vestige.h +++ b/plugins/vestige/vestige.h @@ -1,7 +1,7 @@ /* * vestige.h - instrument VeSTige for hosting VST-plugins * - * Copyright (c) 2005-2012 Tobias Doerffel + * Copyright (c) 2005-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -34,7 +34,6 @@ #include "Instrument.h" #include "InstrumentView.h" -#include "midi.h" #include "note.h" #include "knob.h" @@ -69,8 +68,7 @@ public: return true; } - virtual bool handleMidiEvent( const midiEvent & _me, - const midiTime & _time ); + virtual bool handleMidiEvent( const MidiEvent& event, const MidiTime& time ); virtual PluginView * instantiateView( QWidget * _parent ); diff --git a/plugins/zynaddsubfx/LocalZynAddSubFx.cpp b/plugins/zynaddsubfx/LocalZynAddSubFx.cpp index 24e4ff182..6705bb33d 100644 --- a/plugins/zynaddsubfx/LocalZynAddSubFx.cpp +++ b/plugins/zynaddsubfx/LocalZynAddSubFx.cpp @@ -1,7 +1,7 @@ /* * LocalZynAddSubFx.cpp - local implementation of ZynAddSubFx plugin * - * Copyright (c) 2009-2013 Tobias Doerffel + * Copyright (c) 2009-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -190,47 +190,43 @@ void LocalZynAddSubFx::setLmmsWorkingDir( const std::string & _dir ) -void LocalZynAddSubFx::processMidiEvent( const midiEvent & _e ) +void LocalZynAddSubFx::processMidiEvent( const MidiEvent& event ) { // all functions are called while m_master->mutex is held static NULLMidiIn midiIn; - switch( _e.m_type ) + switch( event.type() ) { case MidiNoteOn: - if( _e.velocity() > 0 ) + if( event.velocity() > 0 ) { - if( _e.key() <= 0 || _e.key() >= 128 ) + if( event.key() <= 0 || event.key() >= 128 ) { break; } - if( m_runningNotes[_e.key()] > 0 ) + if( m_runningNotes[event.key()] > 0 ) { - m_master->NoteOff( _e.channel(), _e.key() ); + m_master->NoteOff( event.channel(), event.key() ); } - ++m_runningNotes[_e.key()]; - m_master->NoteOn( _e.channel(), _e.key(), _e.velocity() ); + ++m_runningNotes[event.key()]; + m_master->NoteOn( event.channel(), event.key(), event.velocity() ); break; } case MidiNoteOff: - if( _e.key() <= 0 || _e.key() >= 128 ) + if( event.key() <= 0 || event.key() >= 128 ) { break; } - if( --m_runningNotes[_e.key()] <= 0 ) + if( --m_runningNotes[event.key()] <= 0 ) { - m_master->NoteOff( _e.channel(), _e.key() ); + m_master->NoteOff( event.channel(), event.key() ); } break; case MidiPitchBend: - m_master->SetController( _e.channel(), C_pitchwheel, - _e.m_data.m_param[0] + - _e.m_data.m_param[1]*128-8192 ); + m_master->SetController( event.channel(), C_pitchwheel, event.pitchBend()-8192 ); break; case MidiControlChange: - m_master->SetController( _e.channel(), - midiIn.getcontroller( _e.m_data.m_param[0] ), - _e.m_data.m_param[1] ); + m_master->SetController( event.channel(), midiIn.getcontroller( event.controllerNumber() ), event.controllerValue() ); break; default: break; diff --git a/plugins/zynaddsubfx/LocalZynAddSubFx.h b/plugins/zynaddsubfx/LocalZynAddSubFx.h index 9d6d66345..3aeab8ba5 100644 --- a/plugins/zynaddsubfx/LocalZynAddSubFx.h +++ b/plugins/zynaddsubfx/LocalZynAddSubFx.h @@ -1,7 +1,7 @@ /* * LocalZynAddSubFx.h - local implementation of ZynAddSubFx plugin * - * Copyright (c) 2009 Tobias Doerffel + * Copyright (c) 2009-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -25,6 +25,7 @@ #ifndef _LOCAL_ZYNADDSUBFX_H #define _LOCAL_ZYNADDSUBFX_H +#include "MidiEvent.h" #include "note.h" class Master; @@ -48,7 +49,7 @@ public: void setPresetDir( const std::string & _dir ); void setLmmsWorkingDir( const std::string & _dir ); - void processMidiEvent( const midiEvent & _e ); + void processMidiEvent( const MidiEvent& event ); void processAudio( sampleFrame * _out ); diff --git a/plugins/zynaddsubfx/RemoteZynAddSubFx.cpp b/plugins/zynaddsubfx/RemoteZynAddSubFx.cpp index 29300bf75..5e25de9fa 100644 --- a/plugins/zynaddsubfx/RemoteZynAddSubFx.cpp +++ b/plugins/zynaddsubfx/RemoteZynAddSubFx.cpp @@ -1,7 +1,7 @@ /* * RemoteZynAddSubFx.cpp - ZynAddSubFx-embedding plugin * - * Copyright (c) 2008-2012 Tobias Doerffel + * Copyright (c) 2008-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -126,10 +126,9 @@ public: } // all functions are called while m_master->mutex is held - virtual void processMidiEvent( const midiEvent & _e, - const f_cnt_t /* _offset */ ) + virtual void processMidiEvent( const MidiEvent& event, const f_cnt_t /* _offset */ ) { - LocalZynAddSubFx::processMidiEvent( _e ); + LocalZynAddSubFx::processMidiEvent( event ); } diff --git a/plugins/zynaddsubfx/ZynAddSubFx.cpp b/plugins/zynaddsubfx/ZynAddSubFx.cpp index ad2dde50a..0984bfecf 100644 --- a/plugins/zynaddsubfx/ZynAddSubFx.cpp +++ b/plugins/zynaddsubfx/ZynAddSubFx.cpp @@ -340,14 +340,13 @@ void ZynAddSubFxInstrument::play( sampleFrame * _buf ) -bool ZynAddSubFxInstrument::handleMidiEvent( const midiEvent & _me, - const midiTime & _time ) +bool ZynAddSubFxInstrument::handleMidiEvent( const MidiEvent& event, const MidiTime& time ) { // do not forward external MIDI Control Change events if the according // LED is not checked - if( _me.type() == MidiControlChange && - _me.sourcePort() != this && - m_forwardMidiCcModel.value() == false ) + if( event.type() == MidiControlChange && + event.sourcePort() != this && + m_forwardMidiCcModel.value() == false ) { return true; } @@ -355,11 +354,11 @@ bool ZynAddSubFxInstrument::handleMidiEvent( const midiEvent & _me, m_pluginMutex.lock(); if( m_remotePlugin ) { - m_remotePlugin->processMidiEvent( _me, 0 ); + m_remotePlugin->processMidiEvent( event, 0 ); } else { - m_plugin->processMidiEvent( _me ); + m_plugin->processMidiEvent( event ); } m_pluginMutex.unlock(); @@ -446,8 +445,7 @@ void ZynAddSubFxInstrument::initPlugin() void ZynAddSubFxInstrument::sendControlChange( MidiControllers midiCtl, float value ) { - handleMidiEvent( midiEvent( MidiControlChange, instrumentTrack()->midiPort()->realOutputChannel(), midiCtl, (int) value, this ), - midiTime() ); + handleMidiEvent( MidiEvent( MidiControlChange, instrumentTrack()->midiPort()->realOutputChannel(), midiCtl, (int) value, this ) ); } diff --git a/plugins/zynaddsubfx/ZynAddSubFx.h b/plugins/zynaddsubfx/ZynAddSubFx.h index f37ba857b..8ea46a124 100644 --- a/plugins/zynaddsubfx/ZynAddSubFx.h +++ b/plugins/zynaddsubfx/ZynAddSubFx.h @@ -70,8 +70,7 @@ public: virtual void play( sampleFrame * _working_buffer ); - virtual bool handleMidiEvent( const midiEvent & _me, - const midiTime & _time ); + virtual bool handleMidiEvent( const MidiEvent& event, const MidiTime& time = MidiTime() ); virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); virtual void loadSettings( const QDomElement & _this ); diff --git a/src/core/AutomationPattern.cpp b/src/core/AutomationPattern.cpp index 4babc3c50..1ce04941c 100644 --- a/src/core/AutomationPattern.cpp +++ b/src/core/AutomationPattern.cpp @@ -45,7 +45,7 @@ AutomationPattern::AutomationPattern( AutomationTrack * _auto_track ) : m_tension( "1.0" ), m_progressionType( DiscreteProgression ) { - changeLength( midiTime( 1, 0 ) ); + changeLength( MidiTime( 1, 0 ) ); } @@ -166,7 +166,7 @@ const AutomatableModel * AutomationPattern::firstObject() const //TODO: Improve this -midiTime AutomationPattern::length() const +MidiTime AutomationPattern::length() const { tick_t max_length = 0; @@ -175,19 +175,19 @@ midiTime AutomationPattern::length() const { max_length = qMax( max_length, it.key() ); } - return midiTime( qMax( midiTime( max_length ).getTact() + 1, 1 ), 0 ); + return MidiTime( qMax( MidiTime( max_length ).getTact() + 1, 1 ), 0 ); } -midiTime AutomationPattern::putValue( const midiTime & _time, +MidiTime AutomationPattern::putValue( const MidiTime & _time, const float _value, const bool _quant_pos ) { cleanObjects(); - midiTime newTime = _quant_pos && engine::automationEditor() ? + MidiTime newTime = _quant_pos && engine::automationEditor() ? note::quantized( _time, engine::automationEditor()->quantization() ) : _time; @@ -215,7 +215,7 @@ midiTime AutomationPattern::putValue( const midiTime & _time, -void AutomationPattern::removeValue( const midiTime & _time ) +void AutomationPattern::removeValue( const MidiTime & _time ) { cleanObjects(); @@ -240,7 +240,7 @@ void AutomationPattern::removeValue( const midiTime & _time ) -float AutomationPattern::valueAt( const midiTime & _time ) const +float AutomationPattern::valueAt( const MidiTime & _time ) const { if( m_timeMap.isEmpty() ) { @@ -306,7 +306,7 @@ float AutomationPattern::valueAt( timeMap::const_iterator v, int offset ) const -float *AutomationPattern::valuesAfter( const midiTime & _time ) const +float *AutomationPattern::valuesAfter( const MidiTime & _time ) const { timeMap::ConstIterator v = m_timeMap.lowerBound( _time ); if( v == m_timeMap.end() || (v+1) == m_timeMap.end() ) @@ -417,7 +417,7 @@ const QString AutomationPattern::name() const -void AutomationPattern::processMidiTime( const midiTime & _time ) +void AutomationPattern::processMidiTime( const MidiTime & _time ) { if( _time >= 0 && hasAutomation() ) { diff --git a/src/core/InstrumentFunctions.cpp b/src/core/InstrumentFunctions.cpp index 1de453df8..985fd3152 100644 --- a/src/core/InstrumentFunctions.cpp +++ b/src/core/InstrumentFunctions.cpp @@ -477,7 +477,7 @@ void InstrumentFunctionArpeggio::processNote( notePlayHandle * _n ) } // create new arp-note - note new_note( midiTime( 0 ), midiTime( 0 ), + note new_note( MidiTime( 0 ), MidiTime( 0 ), sub_note_key, (volume_t) qRound( _n->getVolume() * vol_level ), diff --git a/src/core/Piano.cpp b/src/core/Piano.cpp index 3bd85ee8d..584362f46 100644 --- a/src/core/Piano.cpp +++ b/src/core/Piano.cpp @@ -38,6 +38,7 @@ #include "Piano.h" #include "InstrumentTrack.h" +#include "MidiEvent.h" #include "MidiEventProcessor.h" @@ -96,7 +97,7 @@ void Piano::handleKeyPress( int key, int midiVelocity ) { if( isValidKey( key ) ) { - m_midiEvProc->processInEvent( midiEvent( MidiNoteOn, 0, key, midiVelocity ), midiTime() ); + m_midiEvProc->processInEvent( MidiEvent( MidiNoteOn, 0, key, midiVelocity ) ); m_pressedKeys[key] = true; } } @@ -113,7 +114,7 @@ void Piano::handleKeyRelease( int key ) { if( isValidKey( key ) ) { - m_midiEvProc->processInEvent( midiEvent( MidiNoteOff, 0, key, 0 ), midiTime() ); + m_midiEvProc->processInEvent( MidiEvent( MidiNoteOff, 0, key, 0 ) ); m_pressedKeys[key] = false; } } diff --git a/src/core/RemotePlugin.cpp b/src/core/RemotePlugin.cpp index 24e047d99..0128444e8 100644 --- a/src/core/RemotePlugin.cpp +++ b/src/core/RemotePlugin.cpp @@ -1,7 +1,7 @@ /* * RemotePlugin.cpp - base class providing RPC like mechanisms * - * Copyright (c) 2008-2010 Tobias Doerffel + * Copyright (c) 2008-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -281,14 +281,14 @@ bool RemotePlugin::process( const sampleFrame * _in_buf, -void RemotePlugin::processMidiEvent( const midiEvent & _e, +void RemotePlugin::processMidiEvent( const MidiEvent & _e, const f_cnt_t _offset ) { message m( IdMidiEvent ); - m.addInt( _e.m_type ); - m.addInt( _e.m_channel ); - m.addInt( _e.m_data.m_param[0] ); - m.addInt( _e.m_data.m_param[1] ); + m.addInt( _e.type() ); + m.addInt( _e.channel() ); + m.addInt( _e.param( 0 ) ); + m.addInt( _e.param( 1 ) ); m.addInt( _offset ); lock(); sendMessage( m ); diff --git a/src/core/SampleRecordHandle.cpp b/src/core/SampleRecordHandle.cpp index 9d0cff4ad..674af8d93 100644 --- a/src/core/SampleRecordHandle.cpp +++ b/src/core/SampleRecordHandle.cpp @@ -73,7 +73,7 @@ void SampleRecordHandle::play( sampleFrame * /*_working_buffer*/ ) writeBuffer( recbuf, frames ); m_framesRecorded += frames; - midiTime len = (tick_t)( m_framesRecorded / engine::framesPerTick() ); + MidiTime len = (tick_t)( m_framesRecorded / engine::framesPerTick() ); if( len > m_minLength ) { // m_tco->changeLength( len ); diff --git a/src/core/bb_track_container.cpp b/src/core/bb_track_container.cpp index d199f8454..0cbcef43b 100644 --- a/src/core/bb_track_container.cpp +++ b/src/core/bb_track_container.cpp @@ -54,7 +54,7 @@ bbTrackContainer::~bbTrackContainer() -bool bbTrackContainer::play( midiTime _start, fpp_t _frames, +bool bbTrackContainer::play( MidiTime _start, fpp_t _frames, f_cnt_t _offset, int _tco_num ) { bool played_a_note = false; @@ -63,7 +63,7 @@ bool bbTrackContainer::play( midiTime _start, fpp_t _frames, return false; } - _start = _start % ( lengthOfBB( _tco_num ) * midiTime::ticksPerTact() ); + _start = _start % ( lengthOfBB( _tco_num ) * MidiTime::ticksPerTact() ); TrackList tl = tracks(); for( TrackList::iterator it = tl.begin(); it != tl.end(); ++it ) @@ -99,7 +99,7 @@ void bbTrackContainer::updateAfterTrackAdd() tact_t bbTrackContainer::lengthOfBB( int _bb ) { - midiTime max_length = midiTime::ticksPerTact(); + MidiTime max_length = MidiTime::ticksPerTact(); const TrackList & tl = tracks(); for( TrackList::const_iterator it = tl.begin(); it != tl.end(); ++it ) @@ -172,7 +172,7 @@ void bbTrackContainer::fixIncorrectPositions() { for( int i = 0; i < numOfBBs(); ++i ) { - ( *it )->getTCO( i )->movePosition( midiTime( i, 0 ) ); + ( *it )->getTCO( i )->movePosition( MidiTime( i, 0 ) ); } } } @@ -252,10 +252,10 @@ void bbTrackContainer::createTCOsForBB( int _bb ) { while( tl[i]->numOfTCOs() < _bb + 1 ) { - midiTime position = midiTime( tl[i]->numOfTCOs(), 0 ); + MidiTime position = MidiTime( tl[i]->numOfTCOs(), 0 ); trackContentObject * tco = tl[i]->createTCO( position ); tco->movePosition( position ); - tco->changeLength( midiTime( 1, 0 ) ); + tco->changeLength( MidiTime( 1, 0 ) ); } } } diff --git a/src/core/midi/MidiAlsaSeq.cpp b/src/core/midi/MidiAlsaSeq.cpp index 95b351197..662dc43ea 100644 --- a/src/core/midi/MidiAlsaSeq.cpp +++ b/src/core/midi/MidiAlsaSeq.cpp @@ -31,6 +31,7 @@ #include "gui_templates.h" #include "song.h" #include "MidiPort.h" +#include "MidiTime.h" #include "note.h" @@ -160,73 +161,70 @@ QString MidiAlsaSeq::probeDevice() -void MidiAlsaSeq::processOutEvent( const midiEvent & _me, - const midiTime & _time, - const MidiPort * _port ) +void MidiAlsaSeq::processOutEvent( const MidiEvent& event, const MidiTime& time, const MidiPort* port ) { // HACK!!! - need a better solution which isn't that easy since we // cannot store const-ptrs in our map because we need to call non-const // methods of MIDI-port - it's a mess... - MidiPort * p = const_cast( _port ); + MidiPort* p = const_cast( port ); snd_seq_event_t ev; snd_seq_ev_clear( &ev ); snd_seq_ev_set_source( &ev, ( m_portIDs[p][1] != -1 ) ? m_portIDs[p][1] : m_portIDs[p][0] ); snd_seq_ev_set_subs( &ev ); - snd_seq_ev_schedule_tick( &ev, m_queueID, 1, static_cast( _time ) ); + snd_seq_ev_schedule_tick( &ev, m_queueID, 1, static_cast( time ) ); ev.queue = m_queueID; - switch( _me.m_type ) + switch( event.type() ) { case MidiNoteOn: snd_seq_ev_set_noteon( &ev, - _me.channel(), - _me.key() + KeysPerOctave, - _me.velocity() ); + event.channel(), + event.key() + KeysPerOctave, + event.velocity() ); break; case MidiNoteOff: snd_seq_ev_set_noteoff( &ev, - _me.channel(), - _me.key() + KeysPerOctave, - _me.velocity() ); + event.channel(), + event.key() + KeysPerOctave, + event.velocity() ); break; case MidiKeyPressure: snd_seq_ev_set_keypress( &ev, - _me.channel(), - _me.key() + KeysPerOctave, - _me.velocity() ); + event.channel(), + event.key() + KeysPerOctave, + event.velocity() ); break; case MidiControlChange: snd_seq_ev_set_controller( &ev, - _me.channel(), - _me.m_data.m_param[0], - _me.m_data.m_param[1] ); + event.channel(), + event.controllerNumber(), + event.controllerValue() ); break; case MidiProgramChange: snd_seq_ev_set_pgmchange( &ev, - _me.channel(), - _me.m_data.m_param[0] ); + event.channel(), + event.program() ); break; case MidiChannelPressure: snd_seq_ev_set_chanpress( &ev, - _me.channel(), - _me.m_data.m_param[0] ); + event.channel(), + event.channelPressure() ); break; case MidiPitchBend: snd_seq_ev_set_pitchbend( &ev, - _me.channel(), - _me.m_data.m_param[0] - 8192 ); + event.channel(), + event.param( 0 ) - 8192 ); break; default: - fprintf( stderr, "ALSA-sequencer: unhandled output " - "event %d\n", (int) _me.m_type ); + qWarning( "MidiAlsaSeq: unhandled output event %d\n", (int) event.type() ); return; } @@ -353,7 +351,7 @@ void MidiAlsaSeq::removePort( MidiPort * _port ) -QString MidiAlsaSeq::sourcePortName( const midiEvent & _event ) const +QString MidiAlsaSeq::sourcePortName( const MidiEvent & _event ) const { if( _event.sourcePort() ) { @@ -535,70 +533,70 @@ void MidiAlsaSeq::run() switch( ev->type ) { case SND_SEQ_EVENT_NOTEON: - dest->processInEvent( midiEvent( MidiNoteOn, + dest->processInEvent( MidiEvent( MidiNoteOn, ev->data.note.channel, ev->data.note.note - KeysPerOctave, ev->data.note.velocity, source ), - midiTime( ev->time.tick ) ); + MidiTime( ev->time.tick ) ); break; case SND_SEQ_EVENT_NOTEOFF: - dest->processInEvent( midiEvent( MidiNoteOff, + dest->processInEvent( MidiEvent( MidiNoteOff, ev->data.note.channel, ev->data.note.note - KeysPerOctave, ev->data.note.velocity, source ), - midiTime( ev->time.tick) ); + MidiTime( ev->time.tick) ); break; case SND_SEQ_EVENT_KEYPRESS: - dest->processInEvent( midiEvent( + dest->processInEvent( MidiEvent( MidiKeyPressure, ev->data.note.channel, ev->data.note.note - KeysPerOctave, ev->data.note.velocity, source - ), midiTime() ); + ), MidiTime() ); break; case SND_SEQ_EVENT_CONTROLLER: - dest->processInEvent( midiEvent( + dest->processInEvent( MidiEvent( MidiControlChange, ev->data.control.channel, ev->data.control.param, ev->data.control.value, source ), - midiTime() ); + MidiTime() ); break; case SND_SEQ_EVENT_PGMCHANGE: - dest->processInEvent( midiEvent( + dest->processInEvent( MidiEvent( MidiProgramChange, ev->data.control.channel, ev->data.control.param, ev->data.control.value, source ), - midiTime() ); + MidiTime() ); break; case SND_SEQ_EVENT_CHANPRESS: - dest->processInEvent( midiEvent( + dest->processInEvent( MidiEvent( MidiChannelPressure, ev->data.control.channel, ev->data.control.param, ev->data.control.value, source ), - midiTime() ); + MidiTime() ); break; case SND_SEQ_EVENT_PITCHBEND: - dest->processInEvent( midiEvent( MidiPitchBend, + dest->processInEvent( MidiEvent( MidiPitchBend, ev->data.control.channel, ev->data.control.value + 8192, 0, source ), - midiTime() ); + MidiTime() ); break; case SND_SEQ_EVENT_SENSING: diff --git a/src/core/midi/MidiClient.cpp b/src/core/midi/MidiClient.cpp index 8e3895d24..673d5f20d 100644 --- a/src/core/midi/MidiClient.cpp +++ b/src/core/midi/MidiClient.cpp @@ -25,7 +25,6 @@ #include "MidiClient.h" #include "MidiPort.h" -#include "templates.h" #include "note.h" @@ -44,32 +43,32 @@ MidiClient::~MidiClient() -void MidiClient::applyPortMode( MidiPort * ) +void MidiClient::applyPortMode( MidiPort* ) { } -void MidiClient::applyPortName( MidiPort * ) +void MidiClient::applyPortName( MidiPort* ) { } -void MidiClient::addPort( MidiPort * _port ) +void MidiClient::addPort( MidiPort* port ) { - m_midiPorts.push_back( _port ); + m_midiPorts.push_back( port ); } -void MidiClient::removePort( MidiPort * _port ) +void MidiClient::removePort( MidiPort* port ) { QVector::Iterator it = - qFind( m_midiPorts.begin(), m_midiPorts.end(), _port ); + qFind( m_midiPorts.begin(), m_midiPorts.end(), port ); if( it != m_midiPorts.end() ) { m_midiPorts.erase( it ); @@ -79,14 +78,14 @@ void MidiClient::removePort( MidiPort * _port ) -void MidiClient::subscribeReadablePort( MidiPort *, const QString & , bool ) +void MidiClient::subscribeReadablePort( MidiPort*, const QString& , bool ) { } -void MidiClient::subscribeWritablePort( MidiPort * , const QString & , bool ) +void MidiClient::subscribeWritablePort( MidiPort* , const QString& , bool ) { } @@ -124,7 +123,7 @@ void MidiClientRaw::parseData( const unsigned char c ) { if( c == MidiSystemReset ) { - m_midiParseData.m_midiEvent.m_type = MidiSystemReset; + m_midiParseData.m_midiEvent.setType( MidiSystemReset ); m_midiParseData.m_status = 0; processParsedEvent(); } @@ -206,34 +205,30 @@ void MidiClientRaw::parseData( const unsigned char c ) * We simply keep the status as it is, just reset the parameter counter. * If another status byte comes in, it will overwrite the status. */ - m_midiParseData.m_midiEvent.m_type = static_cast( m_midiParseData.m_status ); - m_midiParseData.m_midiEvent.m_channel = m_midiParseData.m_channel; + m_midiParseData.m_midiEvent.setType( static_cast( m_midiParseData.m_status ) ); + m_midiParseData.m_midiEvent.setChannel( m_midiParseData.m_channel ); m_midiParseData.m_bytes = 0; /* Related to running status! */ - switch( m_midiParseData.m_midiEvent.m_type ) + switch( m_midiParseData.m_midiEvent.type() ) { case MidiNoteOff: case MidiNoteOn: case MidiKeyPressure: case MidiProgramChange: case MidiChannelPressure: - m_midiParseData.m_midiEvent.m_data.m_param[0] = - m_midiParseData.m_buffer[0] - KeysPerOctave; - m_midiParseData.m_midiEvent.m_data.m_param[1] = - m_midiParseData.m_buffer[1]; + m_midiParseData.m_midiEvent.setKey( m_midiParseData.m_buffer[0] - KeysPerOctave ); + m_midiParseData.m_midiEvent.setVelocity( m_midiParseData.m_buffer[1] ); break; case MidiControlChange: - m_midiParseData.m_midiEvent.m_data.m_param[0] = m_midiParseData.m_buffer[0]; - m_midiParseData.m_midiEvent.m_data.m_param[1] = m_midiParseData.m_buffer[1]; + m_midiParseData.m_midiEvent.setControllerNumber( m_midiParseData.m_buffer[0] ); + m_midiParseData.m_midiEvent.setControllerValue( m_midiParseData.m_buffer[1] ); break; case MidiPitchBend: // Pitch-bend is transmitted with 14-bit precision. // Note: '|' does here the same as '+' (no common bits), // but might be faster - m_midiParseData.m_midiEvent.m_data.m_param[0] = - ( ( m_midiParseData.m_buffer[1] * 128 ) | - m_midiParseData.m_buffer[0] ); + m_midiParseData.m_midiEvent.setPitchBend( ( m_midiParseData.m_buffer[1] * 128 ) | m_midiParseData.m_buffer[0] ); break; default: @@ -251,33 +246,29 @@ void MidiClientRaw::processParsedEvent() { for( int i = 0; i < m_midiPorts.size(); ++i ) { - m_midiPorts[i]->processInEvent( m_midiParseData.m_midiEvent, - midiTime() ); + m_midiPorts[i]->processInEvent( m_midiParseData.m_midiEvent ); } } -void MidiClientRaw::processOutEvent( const midiEvent & _me, - const midiTime & , - const MidiPort * _port ) +void MidiClientRaw::processOutEvent( const MidiEvent& event, const MidiTime & , const MidiPort* port ) { // TODO: also evaluate _time and queue event if necessary - switch( _me.m_type ) + switch( event.type() ) { case MidiNoteOn: case MidiNoteOff: case MidiKeyPressure: - sendByte( _me.m_type | _me.channel() ); - sendByte( _me.m_data.m_param[0] + KeysPerOctave ); - sendByte( tLimit( (int) _me.m_data.m_param[1], - 0, 127 ) ); + sendByte( event.type() | event.channel() ); + sendByte( event.key() + KeysPerOctave ); + sendByte( event.velocity() ); break; default: qWarning( "MidiClientRaw: unhandled MIDI-event %d\n", - (int) _me.m_type ); + (int) event.type() ); break; } } diff --git a/src/core/midi/MidiController.cpp b/src/core/midi/MidiController.cpp index d323e6e7f..5e65b5cd0 100644 --- a/src/core/midi/MidiController.cpp +++ b/src/core/midi/MidiController.cpp @@ -73,20 +73,19 @@ void MidiController::updateName() -void MidiController::processInEvent( const midiEvent & _me, - const midiTime & _time ) +void MidiController::processInEvent( const MidiEvent& event, const MidiTime& time ) { unsigned char controllerNum; - switch( _me.m_type ) + switch( event.type() ) { case MidiControlChange: - controllerNum = _me.m_data.m_bytes[0] & 0x7F; + controllerNum = event.controllerNumber(); if( m_midiPort.inputController() == controllerNum + 1 && - ( m_midiPort.inputChannel() == _me.m_channel + 1 || + ( m_midiPort.inputChannel() == event.channel() + 1 || m_midiPort.inputChannel() == 0 ) ) { - unsigned char val = _me.m_data.m_bytes[2] & 0x7F; + unsigned char val = event.controllerValue(); m_lastValue = (float)( val ) / 127.0f; emit valueChanged(); } diff --git a/src/core/midi/MidiPort.cpp b/src/core/midi/MidiPort.cpp index eb6949356..c798fd265 100644 --- a/src/core/midi/MidiPort.cpp +++ b/src/core/midi/MidiPort.cpp @@ -2,7 +2,7 @@ * MidiPort.cpp - abstraction of MIDI-ports which are part of LMMS's MIDI- * sequencing system * - * Copyright (c) 2005-2013 Tobias Doerffel + * Copyright (c) 2005-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -123,64 +123,58 @@ void MidiPort::setMode( Modes _mode ) -void MidiPort::processInEvent( const midiEvent & _me, const midiTime & _time ) +void MidiPort::processInEvent( const MidiEvent& event, const MidiTime& time ) { // mask event if( inputEnabled() && - ( inputChannel()-1 == _me.m_channel || inputChannel() == 0 ) ) + ( inputChannel() == 0 || inputChannel()-1 == event.channel() ) ) { - midiEvent ev = _me; - if( _me.m_type == MidiNoteOn || - _me.m_type == MidiNoteOff || - _me.m_type == MidiKeyPressure ) + MidiEvent inEvent = event; + if( event.type() == MidiNoteOn || + event.type() == MidiNoteOff || + event.type() == MidiKeyPressure ) { - ev.key() = ev.key() + KeysPerOctave; - if( ev.key() < 0 || ev.key() >= NumKeys ) + inEvent.setKey( inEvent.key() + KeysPerOctave ); + if( inEvent.key() < 0 || inEvent.key() >= NumKeys ) { return; } } - if( fixedInputVelocity() >= 0 && _me.velocity() > 0 ) + if( fixedInputVelocity() >= 0 && inEvent.velocity() > 0 ) { - ev.velocity() = fixedInputVelocity(); + inEvent.setVelocity( fixedInputVelocity() ); } - ev.setFromMidiPort( true ); - m_midiEventProcessor->processInEvent( ev, _time ); + m_midiEventProcessor->processInEvent( inEvent, time ); } } -void MidiPort::processOutEvent( const midiEvent & _me, const midiTime & _time ) +void MidiPort::processOutEvent( const MidiEvent& event, const MidiTime& time ) { // mask event - if( outputEnabled() && realOutputChannel() == _me.m_channel ) + if( outputEnabled() && realOutputChannel() == event.channel() ) { - midiEvent ev = _me; - // we use/display MIDI channels 1...16 but we need 0...15 for - // the outside world - // We are already in "real" MIDI channel space here - /* if( ev.m_channel > 0 ) - { - --ev.m_channel; - } */ - if( ( _me.m_type == MidiNoteOn || _me.m_type == MidiNoteOff ) && + MidiEvent outEvent = event; + + if( ( event.type() == MidiNoteOn || event.type() == MidiNoteOff ) && fixedOutputNote() >= 0 ) { // Convert MIDI note number (from spinbox) -> LMMS note number // that will be converted back when outputted. - ev.key() = fixedOutputNote() - KeysPerOctave; + outEvent.setKey( fixedOutputNote() - KeysPerOctave ); } - if( fixedOutputVelocity() >= 0 && _me.velocity() > 0 && - ( _me.m_type == MidiNoteOn || - _me.m_type == MidiKeyPressure ) ) + + if( fixedOutputVelocity() >= 0 && event.velocity() > 0 && + ( event.type() == MidiNoteOn || event.type() == MidiKeyPressure ) ) { - ev.velocity() = fixedOutputVelocity(); + outEvent.setVelocity( fixedOutputVelocity() ); } - m_midiClient->processOutEvent( ev, _time, this ); + + m_midiClient->processOutEvent( outEvent, time, this ); } } @@ -420,9 +414,9 @@ void MidiPort::updateWritablePorts( void ) void MidiPort::updateOutputProgram( void ) { - processOutEvent( midiEvent( MidiProgramChange, + processOutEvent( MidiEvent( MidiProgramChange, realOutputChannel(), - outputProgram()-1 ), midiTime( 0 ) ); + outputProgram()-1 ), MidiTime( 0 ) ); } diff --git a/src/core/midi/MidiWinMM.cpp b/src/core/midi/MidiWinMM.cpp index dc06db891..7920bc3e3 100644 --- a/src/core/midi/MidiWinMM.cpp +++ b/src/core/midi/MidiWinMM.cpp @@ -57,8 +57,8 @@ MidiWinMM::~MidiWinMM() -void MidiWinMM::processOutEvent( const midiEvent & _me, - const midiTime & _time, +void MidiWinMM::processOutEvent( const MidiEvent & _me, + const MidiTime & _time, const MidiPort * _port ) { const DWORD shortMsg = ( _me.m_type + _me.channel() ) + @@ -137,7 +137,7 @@ void MidiWinMM::removePort( MidiPort * _port ) -QString MidiWinMM::sourcePortName( const midiEvent & _event ) const +QString MidiWinMM::sourcePortName( const MidiEvent & _event ) const { if( _event.sourcePort() ) { @@ -232,22 +232,22 @@ void MidiWinMM::handleInputEvent( HMIDIIN _hm, DWORD _ev ) case MidiNoteOff: case MidiKeyPressure: ( *it )->processInEvent( - midiEvent( cmdtype, chan, par1 - KeysPerOctave, - par2 & 0xff, &_hm ), midiTime() ); + MidiEvent( cmdtype, chan, par1 - KeysPerOctave, + par2 & 0xff, &_hm ), MidiTime() ); break; case MidiControlChange: case MidiProgramChange: case MidiChannelPressure: ( *it )->processInEvent( - midiEvent( cmdtype, chan, par1, par2 & 0xff, &_hm ), - midiTime() ); + MidiEvent( cmdtype, chan, par1, par2 & 0xff, &_hm ), + MidiTime() ); break; case MidiPitchBend: ( *it )->processInEvent( - midiEvent( cmdtype, chan, par1 + par2*128, 0, &_hm ), - midiTime() ); + MidiEvent( cmdtype, chan, par1 + par2*128, 0, &_hm ), + MidiTime() ); break; default: diff --git a/src/core/note.cpp b/src/core/note.cpp index 2d77f0237..ce86cb9c0 100644 --- a/src/core/note.cpp +++ b/src/core/note.cpp @@ -35,7 +35,7 @@ -note::note( const midiTime & _length, const midiTime & _pos, +note::note( const MidiTime & _length, const MidiTime & _pos, int _key, volume_t _volume, panning_t _panning, DetuningHelper * _detuning ) : m_selected( false ), @@ -96,7 +96,7 @@ note::~note() -void note::setLength( const midiTime & _length ) +void note::setLength( const MidiTime & _length ) { // addJournalEntry( journalEntry( ChangeLength, m_length - _length ) ); m_length = _length; @@ -105,7 +105,7 @@ void note::setLength( const midiTime & _length ) -void note::setPos( const midiTime & _pos ) +void note::setPos( const MidiTime & _pos ) { // addJournalEntry( journalEntry( ChangePosition, m_pos - _pos ) ); m_pos = _pos; @@ -144,7 +144,7 @@ void note::setPanning( const panning_t _panning ) -midiTime note::quantized( const midiTime & _m, const int _q_grid ) +MidiTime note::quantized( const MidiTime & _m, const int _q_grid ) { float p = ( (float) _m / _q_grid ); if( p - floorf( p ) < 0.5f ) diff --git a/src/core/note_play_handle.cpp b/src/core/note_play_handle.cpp index 88482599c..c8845b6f6 100644 --- a/src/core/note_play_handle.cpp +++ b/src/core/note_play_handle.cpp @@ -29,6 +29,7 @@ #include "DetuningHelper.h" #include "InstrumentSoundShaping.h" #include "InstrumentTrack.h" +#include "MidiEvent.h" #include "MidiPort.h" #include "song.h" @@ -48,7 +49,8 @@ notePlayHandle::notePlayHandle( InstrumentTrack * _it, const f_cnt_t _frames, const note & _n, notePlayHandle *parent, - const bool _part_of_arp ) : + const bool _part_of_arp, + int MidiEventChannel ) : playHandle( NotePlayHandle, _offset ), note( _n.length(), _n.pos(), _n.key(), _n.getVolume(), _n.getPanning(), _n.detuning() ), @@ -73,7 +75,8 @@ notePlayHandle::notePlayHandle( InstrumentTrack * _it, m_frequency( 0 ), m_unpitchedFrequency( 0 ), m_baseDetuning( NULL ), - m_songGlobalParentOffset( 0 ) + m_songGlobalParentOffset( 0 ), + m_midiChannel( MidiEventChannel >= 0 ? MidiEventChannel : instrumentTrack()->midiPort()->realOutputChannel() ) { if( isTopNote() ) { @@ -103,12 +106,10 @@ notePlayHandle::notePlayHandle( InstrumentTrack * _it, if( !isTopNote() || !instrumentTrack()->isArpeggioEnabled() ) { - // send MIDI-note-on-event - m_instrumentTrack->processOutEvent( midiEvent( MidiNoteOn, - m_instrumentTrack->midiPort()->realOutputChannel(), - midiKey(), midiVelocity() ), - midiTime::fromFrames( offset(), - engine::framesPerTick() ) ); + // send MidiNoteOn event + m_instrumentTrack->processOutEvent( + MidiEvent( MidiNoteOn, midiChannel(), midiKey(), midiVelocity() ), + MidiTime::fromFrames( offset(), engine::framesPerTick() ) ); } } @@ -151,10 +152,21 @@ notePlayHandle::~notePlayHandle() void notePlayHandle::setVolume( const volume_t _volume ) { note::setVolume( _volume ); - m_instrumentTrack->processOutEvent( midiEvent( MidiKeyPressure, - m_instrumentTrack->midiPort()->realOutputChannel(), - midiKey(), midiVelocity() ), 0 ); - + + m_instrumentTrack->processOutEvent( MidiEvent( MidiKeyPressure, midiChannel(), midiKey(), midiVelocity() ) ); +} + + + + +void notePlayHandle::setPanning( const panning_t panning ) +{ + note::setPanning( panning ); + + MidiEvent event( MidiMetaEvent, midiChannel(), midiKey(), panningToMidi( panning ) ); + event.setMetaEvent( MidiNotePanning ); + + m_instrumentTrack->processOutEvent( event ); } @@ -341,12 +353,10 @@ void notePlayHandle::noteOff( const f_cnt_t _s ) if( !isTopNote() || !instrumentTrack()->isArpeggioEnabled() ) { - // send MIDI-note-off-event - m_instrumentTrack->processOutEvent( midiEvent( MidiNoteOff, - m_instrumentTrack->midiPort()->realOutputChannel(), - midiKey(), 0 ), - midiTime::fromFrames( m_framesBeforeRelease, - engine::framesPerTick() ) ); + // send MidiNoteOff event + m_instrumentTrack->processOutEvent( + MidiEvent( MidiNoteOff, midiChannel(), midiKey(), 0 ), + MidiTime::fromFrames( m_framesBeforeRelease, engine::framesPerTick() ) ); } m_released = true; @@ -501,7 +511,7 @@ void notePlayHandle::updateFrequency() -void notePlayHandle::processMidiTime( const midiTime& time ) +void notePlayHandle::processMidiTime( const MidiTime& time ) { if( detuning() && time >= songGlobalParentOffset()+pos() ) { diff --git a/src/core/song.cpp b/src/core/song.cpp index f49f1bb31..f01e7f0cd 100644 --- a/src/core/song.cpp +++ b/src/core/song.cpp @@ -76,7 +76,7 @@ #include #endif -tick_t midiTime::s_ticksPerTact = DefaultTicksPerTact; +tick_t MidiTime::s_ticksPerTact = DefaultTicksPerTact; @@ -256,7 +256,7 @@ void song::setTempo() void song::setTimeSignature() { - midiTime::setTicksPerTact( ticksPerTact() ); + MidiTime::setTicksPerTact( ticksPerTact() ); emit timeSignatureChanged( m_oldTicksPerTact, ticksPerTact() ); emit dataChanged(); m_oldTicksPerTact = ticksPerTact(); @@ -494,7 +494,7 @@ void song::processNextBuffer() #endif // did we play a whole tact? - if( ticks >= midiTime::ticksPerTact() ) + if( ticks >= MidiTime::ticksPerTact() ) { // per default we just continue playing even if // there's no more stuff to play @@ -525,7 +525,7 @@ void song::processNextBuffer() // then start from beginning and keep // offset ticks = ticks % ( max_tact * - midiTime::ticksPerTact() ); + MidiTime::ticksPerTact() ); #ifdef VST_SNC_LATENCY m_SncVSTplug->ppqPos = ( ( ticks + 0 ) / (float)48 ) diff --git a/src/core/timeline.cpp b/src/core/timeline.cpp index 74d754eba..3c0aa6f11 100644 --- a/src/core/timeline.cpp +++ b/src/core/timeline.cpp @@ -47,7 +47,7 @@ QPixmap * timeLine::s_loopPointPixmap = NULL; timeLine::timeLine( const int _xoff, const int _yoff, const float _ppt, - song::playPos & _pos, const midiTime & _begin, + song::playPos & _pos, const MidiTime & _begin, QWidget * _parent ) : QWidget( _parent ), m_autoScroll( AutoScrollEnabled ), @@ -175,7 +175,7 @@ void timeLine::loadSettings( const QDomElement & _this ) -void timeLine::updatePosition( const midiTime & ) +void timeLine::updatePosition( const MidiTime & ) { const int new_x = markerX( m_pos ); @@ -238,7 +238,7 @@ void timeLine::paintEvent( QPaintEvent * ) tact_t tact_num = m_begin.getTact(); int x = m_xOffset + s_posMarkerPixmap->width() / 2 - - ( ( static_cast( m_begin * m_ppt ) / midiTime::ticksPerTact() ) % static_cast( m_ppt ) ); + ( ( static_cast( m_begin * m_ppt ) / MidiTime::ticksPerTact() ) % static_cast( m_ppt ) ); p.setPen( QColor( 192, 192, 192 ) ); for( int i = 0; x + i * m_ppt < width(); ++i ) @@ -248,7 +248,7 @@ void timeLine::paintEvent( QPaintEvent * ) ++tact_num; if( ( tact_num - 1 ) % qMax( 1, qRound( 1.0f / 3.0f * - midiTime::ticksPerTact() / m_ppt ) ) == 0 ) + MidiTime::ticksPerTact() / m_ppt ) ) == 0 ) { const QString s = QString::number( tact_num ); p.drawText( cx + qRound( ( m_ppt - p.fontMetrics(). @@ -285,7 +285,7 @@ void timeLine::mousePressEvent( QMouseEvent* event ) } else if( event->button() == Qt::RightButton ) { - const midiTime t = m_begin + static_cast( event->x() * midiTime::ticksPerTact() / m_ppt ); + const MidiTime t = m_begin + static_cast( event->x() * MidiTime::ticksPerTact() / m_ppt ); if( m_loopPos[0] > m_loopPos[1] ) { qSwap( m_loopPos[0], m_loopPos[1] ); @@ -324,7 +324,7 @@ void timeLine::mousePressEvent( QMouseEvent* event ) void timeLine::mouseMoveEvent( QMouseEvent* event ) { - const midiTime t = m_begin + static_cast( qMax( event->x() - m_xOffset - m_moveXOff, 0 ) * midiTime::ticksPerTact() / m_ppt ); + const MidiTime t = m_begin + static_cast( qMax( event->x() - m_xOffset - m_moveXOff, 0 ) * MidiTime::ticksPerTact() / m_ppt ); switch( m_action ) { @@ -356,9 +356,9 @@ void timeLine::mouseMoveEvent( QMouseEvent* event ) // Note, swap 1 and 0 below and the behavior "skips" the other // marking instead of pushing it. if( m_action == MoveLoopBegin ) - m_loopPos[0] -= midiTime::ticksPerTact(); + m_loopPos[0] -= MidiTime::ticksPerTact(); else - m_loopPos[1] += midiTime::ticksPerTact(); + m_loopPos[1] += MidiTime::ticksPerTact(); } update(); break; diff --git a/src/core/track.cpp b/src/core/track.cpp index 10a4ed80f..f11210e27 100644 --- a/src/core/track.cpp +++ b/src/core/track.cpp @@ -145,7 +145,7 @@ trackContentObject::~trackContentObject() * * \param _pos The new position of the track content object. */ -void trackContentObject::movePosition( const midiTime & _pos ) +void trackContentObject::movePosition( const MidiTime & _pos ) { if( m_startPosition != _pos ) { @@ -166,7 +166,7 @@ void trackContentObject::movePosition( const midiTime & _pos ) * * \param _length The new length of the track content object. */ -void trackContentObject::changeLength( const midiTime & _length ) +void trackContentObject::changeLength( const MidiTime & _length ) { if( m_length != _length ) { @@ -243,7 +243,7 @@ void trackContentObject::paste() { if( Clipboard::getContent( nodeName() ) != NULL ) { - const midiTime pos = startPosition(); + const MidiTime pos = startPosition(); restoreState( *( Clipboard::getContent( nodeName() ) ) ); movePosition( pos ); } @@ -422,7 +422,7 @@ void trackContentObjectView::updateLength() { setFixedWidth( static_cast( m_tco->length() * pixelsPerTact() / - midiTime::ticksPerTact() ) + + MidiTime::ticksPerTact() ) + TCO_BORDER_WIDTH * 2-1 ); } m_trackView->trackContainerView()->update(); @@ -485,7 +485,7 @@ void trackContentObjectView::dropEvent( QDropEvent * _de ) multimediaProject mmp( value.toUtf8() ); // at least save position before getting to moved to somewhere // the user doesn't expect... - midiTime pos = m_tco->startPosition(); + MidiTime pos = m_tco->startPosition(); m_tco->restoreState( mmp.content().firstChild().toElement() ); m_tco->movePosition( pos ); AutomationPattern::resolveAllIDs(); @@ -654,9 +654,9 @@ void trackContentObjectView::mouseMoveEvent( QMouseEvent * _me ) if( m_action == Move ) { const int x = mapToParent( _me->pos() ).x() - m_initialMouseX; - midiTime t = qMax( 0, (int) + MidiTime t = qMax( 0, (int) m_trackView->trackContainerView()->currentPosition()+ - static_cast( x * midiTime::ticksPerTact() / + static_cast( x * MidiTime::ticksPerTact() / ppt ) ); if( ! ( _me->modifiers() & Qt::ControlModifier ) && _me->button() == Qt::NoButton ) @@ -668,7 +668,7 @@ void trackContentObjectView::mouseMoveEvent( QMouseEvent * _me ) s_textFloat->setText( QString( "%1:%2" ). arg( m_tco->startPosition().getTact() + 1 ). arg( m_tco->startPosition().getTicks() % - midiTime::ticksPerTact() ) ); + MidiTime::ticksPerTact() ) ); s_textFloat->moveGlobal( this, QPoint( width() + 2, height() + 2 ) ); } @@ -678,7 +678,7 @@ void trackContentObjectView::mouseMoveEvent( QMouseEvent * _me ) QVector so = m_trackView->trackContainerView()->selectedObjects(); QVector tcos; - midiTime smallest_pos, t; + MidiTime smallest_pos, t; // find out smallest position of all selected objects for not // moving an object before zero for( QVector::iterator it = so.begin(); @@ -695,13 +695,13 @@ void trackContentObjectView::mouseMoveEvent( QMouseEvent * _me ) smallest_pos = qMin( smallest_pos, (int)tco->startPosition() + static_cast( dx * - midiTime::ticksPerTact() / ppt ) ); + MidiTime::ticksPerTact() / ppt ) ); } for( QVector::iterator it = tcos.begin(); it != tcos.end(); ++it ) { t = ( *it )->startPosition() + - static_cast( dx *midiTime::ticksPerTact() / + static_cast( dx *MidiTime::ticksPerTact() / ppt )-smallest_pos; if( ! ( _me->modifiers() & Qt::AltModifier ) && _me->button() == Qt::NoButton ) @@ -713,22 +713,22 @@ void trackContentObjectView::mouseMoveEvent( QMouseEvent * _me ) } else if( m_action == Resize ) { - midiTime t = qMax( midiTime::ticksPerTact() / 16, static_cast( _me->x() * midiTime::ticksPerTact() / ppt ) ); + MidiTime t = qMax( MidiTime::ticksPerTact() / 16, static_cast( _me->x() * MidiTime::ticksPerTact() / ppt ) ); if( ! ( _me->modifiers() & Qt::ControlModifier ) && _me->button() == Qt::NoButton ) { - t = qMax( midiTime::ticksPerTact(), t.toNearestTact() ); + t = qMax( MidiTime::ticksPerTact(), t.toNearestTact() ); } m_tco->changeLength( t ); s_textFloat->setText( tr( "%1:%2 (%3:%4 to %5:%6)" ). arg( m_tco->length().getTact() ). arg( m_tco->length().getTicks() % - midiTime::ticksPerTact() ). + MidiTime::ticksPerTact() ). arg( m_tco->startPosition().getTact() + 1 ). arg( m_tco->startPosition().getTicks() % - midiTime::ticksPerTact() ). + MidiTime::ticksPerTact() ). arg( m_tco->endPosition().getTact() + 1 ). arg( m_tco->endPosition().getTicks() % - midiTime::ticksPerTact() ) ); + MidiTime::ticksPerTact() ) ); s_textFloat->moveGlobal( this, QPoint( width() + 2, height() + 2) ); } @@ -864,8 +864,8 @@ trackContentWidget::trackContentWidget( trackView * _parent ) : setAcceptDrops( true ); connect( _parent->trackContainerView(), - SIGNAL( positionChanged( const midiTime & ) ), - this, SLOT( changePosition( const midiTime & ) ) ); + SIGNAL( positionChanged( const MidiTime & ) ), + this, SLOT( changePosition( const MidiTime & ) ) ); updateBackground(); } @@ -1014,7 +1014,7 @@ void trackContentWidget::update() * * \param _new_pos The MIDI time to move to. */ -void trackContentWidget::changePosition( const midiTime & _new_pos ) +void trackContentWidget::changePosition( const MidiTime & _new_pos ) { if( m_trackView->trackContainerView() == engine::getBBEditor() ) { @@ -1051,7 +1051,7 @@ void trackContentWidget::changePosition( const midiTime & _new_pos ) return; } - midiTime pos = _new_pos; + MidiTime pos = _new_pos; if( pos < 0 ) { pos = m_trackView->trackContainerView()->currentPosition(); @@ -1077,7 +1077,7 @@ void trackContentWidget::changePosition( const midiTime & _new_pos ) ( ts <= begin && te >= end ) ) { tcov->move( static_cast( ( ts - begin ) * ppt / - midiTime::ticksPerTact() ), + MidiTime::ticksPerTact() ), tcov->y() ); if( !tcov->isVisible() ) { @@ -1122,7 +1122,7 @@ void trackContentWidget::dropEvent( QDropEvent * _de ) if( type == ( "tco_" + QString::number( getTrack()->type() ) ) && m_trackView->trackContainerView()->fixedTCOs() == false ) { - const midiTime pos = getPosition( _de->pos().x() + const MidiTime pos = getPosition( _de->pos().x() ).toNearestTact(); trackContentObject * tco = getTrack()->createTCO( pos ); @@ -1162,8 +1162,8 @@ void trackContentWidget::mousePressEvent( QMouseEvent * _me ) else if( _me->button() == Qt::LeftButton && !m_trackView->trackContainerView()->fixedTCOs() ) { - const midiTime pos = getPosition( _me->x() ).getTact() * - midiTime::ticksPerTact(); + const MidiTime pos = getPosition( _me->x() ).getTact() * + MidiTime::ticksPerTact(); trackContentObject * tco = getTrack()->createTCO( pos ); tco->saveJournallingState( false ); @@ -1237,7 +1237,7 @@ void trackContentWidget::undoStep( JournalEntry & _je ) case RemoveTrackContentObject: { - trackContentObject * tco = getTrack()->createTCO( midiTime( 0 ) ); + trackContentObject * tco = getTrack()->createTCO( MidiTime( 0 ) ); multimediaProject mmp( _je.data().toMap()["state"]. toString().toUtf8() ); @@ -1292,11 +1292,11 @@ track * trackContentWidget::getTrack() * * \param _mouse_x the mouse's current X position in pixels. */ -midiTime trackContentWidget::getPosition( int _mouse_x ) +MidiTime trackContentWidget::getPosition( int _mouse_x ) { - return midiTime( m_trackView->trackContainerView()-> + return MidiTime( m_trackView->trackContainerView()-> currentPosition() + _mouse_x * - midiTime::ticksPerTact() / + MidiTime::ticksPerTact() / static_cast( m_trackView-> trackContainerView()->pixelsPerTact() ) ); } @@ -1307,11 +1307,11 @@ midiTime trackContentWidget::getPosition( int _mouse_x ) * * \param _pos_start the starting position of the Widget (from getPosition()) */ -midiTime trackContentWidget::endPosition( const midiTime & _pos_start ) +MidiTime trackContentWidget::endPosition( const MidiTime & _pos_start ) { const float ppt = m_trackView->trackContainerView()->pixelsPerTact(); const int w = width(); - return _pos_start + static_cast( w * midiTime::ticksPerTact() / ppt ); + return _pos_start + static_cast( w * MidiTime::ticksPerTact() / ppt ); } @@ -1762,7 +1762,7 @@ void track::loadSettings( const QDomElement & _this ) !node.toElement().attribute( "metadata" ).toInt() ) { trackContentObject * tco = createTCO( - midiTime( 0 ) ); + MidiTime( 0 ) ); tco->restoreState( node.toElement() ); saveJournallingState( false ); restoreJournallingState(); @@ -1852,7 +1852,7 @@ trackContentObject * track::getTCO( int _tco_num ) } printf( "called track::getTCO( %d ), " "but TCO %d doesn't exist\n", _tco_num, _tco_num ); - return createTCO( _tco_num * midiTime::ticksPerTact() ); + return createTCO( _tco_num * MidiTime::ticksPerTact() ); } @@ -1898,8 +1898,8 @@ int track::getTCONum( trackContentObject * _tco ) * \param _start The MIDI start time of the range. * \param _end The MIDI endi time of the range. */ -void track::getTCOsInRange( tcoVector & _tco_v, const midiTime & _start, - const midiTime & _end ) +void track::getTCOsInRange( tcoVector & _tco_v, const MidiTime & _start, + const MidiTime & _end ) { for( tcoVector::iterator it_o = m_trackContentObjects.begin(); it_o != m_trackContentObjects.end(); ++it_o ) @@ -1948,7 +1948,7 @@ void track::swapPositionOfTCOs( int _tco_num1, int _tco_num2 ) qSwap( m_trackContentObjects[_tco_num1], m_trackContentObjects[_tco_num2] ); - const midiTime pos = m_trackContentObjects[_tco_num1]->startPosition(); + const MidiTime pos = m_trackContentObjects[_tco_num1]->startPosition(); m_trackContentObjects[_tco_num1]->movePosition( m_trackContentObjects[_tco_num2]->startPosition() ); @@ -1965,7 +1965,7 @@ void track::swapPositionOfTCOs( int _tco_num1, int _tco_num2 ) * in ascending order by TCO time, once we hit a TCO that was earlier * than the insert time, we could fall out of the loop early. */ -void track::insertTact( const midiTime & _pos ) +void track::insertTact( const MidiTime & _pos ) { // we'll increase the position of every TCO, positioned behind _pos, by // one tact @@ -1975,7 +1975,7 @@ void track::insertTact( const midiTime & _pos ) if( ( *it )->startPosition() >= _pos ) { ( *it )->movePosition( (*it)->startPosition() + - midiTime::ticksPerTact() ); + MidiTime::ticksPerTact() ); } } } @@ -1987,7 +1987,7 @@ void track::insertTact( const midiTime & _pos ) * * \param _pos The time at which we want to remove the bar. */ -void track::removeTact( const midiTime & _pos ) +void track::removeTact( const MidiTime & _pos ) { // we'll decrease the position of every TCO, positioned behind _pos, by // one tact @@ -1997,7 +1997,7 @@ void track::removeTact( const midiTime & _pos ) if( ( *it )->startPosition() >= _pos ) { ( *it )->movePosition( qMax( ( *it )->startPosition() - - midiTime::ticksPerTact(), 0 ) ); + MidiTime::ticksPerTact(), 0 ) ); } } } @@ -2025,7 +2025,7 @@ tact_t track::length() const } } - return last / midiTime::ticksPerTact(); + return last / MidiTime::ticksPerTact(); } diff --git a/src/gui/AutomationEditor.cpp b/src/gui/AutomationEditor.cpp index ce3847f0e..0c498ba79 100644 --- a/src/gui/AutomationEditor.cpp +++ b/src/gui/AutomationEditor.cpp @@ -57,7 +57,6 @@ #include "gui_templates.h" #include "timeline.h" #include "tooltip.h" -#include "midi.h" #include "tool_button.h" #include "text_float.h" #include "combobox.h" @@ -131,10 +130,10 @@ AutomationEditor::AutomationEditor() : engine::getSong()->getPlayPos( song::Mode_PlayAutomationPattern ), m_currentPosition, this ); - connect( this, SIGNAL( positionChanged( const midiTime & ) ), - m_timeLine, SLOT( updatePosition( const midiTime & ) ) ); - connect( m_timeLine, SIGNAL( positionChanged( const midiTime & ) ), - this, SLOT( updatePosition( const midiTime & ) ) ); + connect( this, SIGNAL( positionChanged( const MidiTime & ) ), + m_timeLine, SLOT( updatePosition( const MidiTime & ) ) ); + connect( m_timeLine, SIGNAL( positionChanged( const MidiTime & ) ), + this, SLOT( updatePosition( const MidiTime & ) ) ); m_toolBar = new QWidget( this ); @@ -789,8 +788,8 @@ void AutomationEditor::drawLine( int _x0, float _y0, int _x1, float _y1 ) x += xstep; i += 1; - m_pattern->removeValue( midiTime( x ) ); - m_pattern->putValue( midiTime( x ), y ); + m_pattern->removeValue( MidiTime( x ) ); + m_pattern->putValue( MidiTime( x ), y ); } } @@ -843,7 +842,7 @@ void AutomationEditor::mousePressEvent( QMouseEvent * _me ) // loop through whole time-map... while( it != time_map.end() ) { - midiTime len = 4; + MidiTime len = 4; // and check whether the user clicked on an // existing value @@ -878,9 +877,9 @@ void AutomationEditor::mousePressEvent( QMouseEvent * _me ) if( it == time_map.end() ) { // then set new value - midiTime value_pos( pos_ticks ); + MidiTime value_pos( pos_ticks ); - midiTime new_time = + MidiTime new_time = m_pattern->putValue( value_pos, level ); @@ -1020,8 +1019,8 @@ void AutomationEditor::mouseMoveEvent( QMouseEvent * _me ) // moved properly according to new starting- // time in the time map of pattern m_pattern->removeValue( - midiTime( pos_ticks ) ); - m_pattern->putValue( midiTime( pos_ticks ), + MidiTime( pos_ticks ) ); + m_pattern->putValue( MidiTime( pos_ticks ), level ); } @@ -1033,7 +1032,7 @@ void AutomationEditor::mouseMoveEvent( QMouseEvent * _me ) ( _me->buttons() & Qt::LeftButton && m_editMode == ERASE ) ) { - m_pattern->removeValue( midiTime( pos_ticks ) ); + m_pattern->removeValue( MidiTime( pos_ticks ) ); } else if( _me->buttons() & Qt::NoButton && m_editMode == DRAW ) { @@ -1216,7 +1215,7 @@ void AutomationEditor::mouseMoveEvent( QMouseEvent * _me ) for( timeMap::iterator it = m_selValuesForMove.begin(); it != m_selValuesForMove.end(); ++it ) { - midiTime new_value_pos; + MidiTime new_value_pos; if( it.key() ) { int value_tact = @@ -1236,7 +1235,7 @@ void AutomationEditor::mouseMoveEvent( QMouseEvent * _me ) DefaultTicksPerTact; } m_pattern->removeValue( it.key() ); - new_value_pos = midiTime( value_tact, + new_value_pos = MidiTime( value_tact, value_ticks ); } new_selValuesForMove[ @@ -2242,7 +2241,7 @@ void AutomationEditor::deleteSelectedValues() -void AutomationEditor::updatePosition( const midiTime & _t ) +void AutomationEditor::updatePosition( const MidiTime & _t ) { if( ( engine::getSong()->isPlaying() && engine::getSong()->playMode() == @@ -2257,7 +2256,7 @@ void AutomationEditor::updatePosition( const midiTime & _t ) } else if( _t < m_currentPosition ) { - midiTime t = qMax( _t - w * DefaultTicksPerTact * + MidiTime t = qMax( _t - w * DefaultTicksPerTact * DefaultTicksPerTact / m_ppt, 0 ); m_leftRightScroll->setValue( t.getTact() * DefaultTicksPerTact ); diff --git a/src/gui/AutomationPatternView.cpp b/src/gui/AutomationPatternView.cpp index cd0127b36..e66c728b4 100644 --- a/src/gui/AutomationPatternView.cpp +++ b/src/gui/AutomationPatternView.cpp @@ -250,7 +250,7 @@ void AutomationPatternView::paintEvent( QPaintEvent * ) if( it+1 == m_pat->getTimeMap().end() ) { const float x1 = x_base + it.key() * ppt / - midiTime::ticksPerTact(); + MidiTime::ticksPerTact(); const float x2 = (float)( width() - TCO_BORDER_WIDTH ); p.fillRect( QRectF( x1, 0.0f, x2-x1, it.value() ), lin2grad ); @@ -262,9 +262,9 @@ void AutomationPatternView::paintEvent( QPaintEvent * ) { float value = values[i - it.key()]; const float x1 = x_base + i * ppt / - midiTime::ticksPerTact(); + MidiTime::ticksPerTact(); const float x2 = x_base + (i+1) * ppt / - midiTime::ticksPerTact(); + MidiTime::ticksPerTact(); p.fillRect( QRectF( x1, 0.0f, x2-x1, value ), lin2grad ); diff --git a/src/gui/ControllerConnectionDialog.cpp b/src/gui/ControllerConnectionDialog.cpp index 5e2903f68..66fed87d3 100644 --- a/src/gui/ControllerConnectionDialog.cpp +++ b/src/gui/ControllerConnectionDialog.cpp @@ -63,13 +63,13 @@ public: } - virtual void processInEvent( const midiEvent& event, const midiTime& time ) + virtual void processInEvent( const MidiEvent& event, const MidiTime& time ) { - if( event.m_type == MidiControlChange && - ( m_midiPort.inputChannel() == event.m_channel + 1 || m_midiPort.inputChannel() == 0 ) ) + if( event.type() == MidiControlChange && + ( m_midiPort.inputChannel() == 0 || m_midiPort.inputChannel() == event.channel() + 1 ) ) { - m_detectedMidiChannel = event.m_channel + 1; - m_detectedMidiController = ( event.m_data.m_bytes[0] & 0x7F ) + 1; + m_detectedMidiChannel = event.channel() + 1; + m_detectedMidiController = event.controllerNumber() + 1; m_detectedMidiPort = engine::mixer()->midiClient()->sourcePortName( event ); emit valueChanged(); diff --git a/src/gui/PianoView.cpp b/src/gui/PianoView.cpp index 18a916a1e..771793247 100644 --- a/src/gui/PianoView.cpp +++ b/src/gui/PianoView.cpp @@ -53,7 +53,7 @@ #include "knob.h" #include "string_pair_drag.h" #include "MainWindow.h" -#include "midi.h" +#include "MidiEvent.h" #include "templates.h" #include "update_event.h" @@ -465,7 +465,7 @@ void PianoView::mousePressEvent( QMouseEvent * _me ) velocity = MidiMaxVelocity; } // set note on - m_piano->midiEventProcessor()->processInEvent( midiEvent( MidiNoteOn, 0, key_num, velocity ), midiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOn, 0, key_num, velocity ), MidiTime() ); m_piano->setKeyState( key_num, true ); m_lastKey = key_num; @@ -510,7 +510,7 @@ void PianoView::mouseReleaseEvent( QMouseEvent * ) { if( m_piano != NULL ) { - m_piano->midiEventProcessor()->processInEvent( midiEvent( MidiNoteOff, 0, m_lastKey, 0 ), midiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOff, 0, m_lastKey, 0 ), MidiTime() ); m_piano->setKeyState( m_lastKey, false ); } @@ -571,7 +571,7 @@ void PianoView::mouseMoveEvent( QMouseEvent * _me ) { if( m_lastKey != -1 ) { - m_piano->midiEventProcessor()->processInEvent( midiEvent( MidiNoteOff, 0, m_lastKey, 0 ), midiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOff, 0, m_lastKey, 0 ), MidiTime() ); m_piano->setKeyState( m_lastKey, false ); m_lastKey = -1; } @@ -579,7 +579,7 @@ void PianoView::mouseMoveEvent( QMouseEvent * _me ) { if( _me->pos().y() > PIANO_BASE ) { - m_piano->midiEventProcessor()->processInEvent( midiEvent( MidiNoteOn, 0, key_num, velocity ), midiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOn, 0, key_num, velocity ), MidiTime() ); m_piano->setKeyState( key_num, true ); m_lastKey = key_num; } @@ -593,7 +593,7 @@ void PianoView::mouseMoveEvent( QMouseEvent * _me ) } else if( m_piano->isKeyPressed( key_num ) ) { - m_piano->midiEventProcessor()->processInEvent( midiEvent( MidiKeyPressure, 0, key_num, velocity ), midiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiKeyPressure, 0, key_num, velocity ), MidiTime() ); } } @@ -690,7 +690,7 @@ void PianoView::focusOutEvent( QFocusEvent * ) // hang otherwise for( int i = 0; i < NumKeys; ++i ) { - m_piano->midiEventProcessor()->processInEvent( midiEvent( MidiNoteOff, 0, i, 0 ), midiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOff, 0, i, 0 ), MidiTime() ); m_piano->setKeyState( i, false ); } update(); diff --git a/src/gui/TrackContainerView.cpp b/src/gui/TrackContainerView.cpp index 214d802a1..11a91727d 100644 --- a/src/gui/TrackContainerView.cpp +++ b/src/gui/TrackContainerView.cpp @@ -127,9 +127,9 @@ trackView * TrackContainerView::addTrackView( trackView * _tv ) m_trackViews.push_back( _tv ); m_scrollLayout->addWidget( _tv ); - connect( this, SIGNAL( positionChanged( const midiTime & ) ), + connect( this, SIGNAL( positionChanged( const MidiTime & ) ), _tv->getTrackContentWidget(), - SLOT( changePosition( const midiTime & ) ) ); + SLOT( changePosition( const MidiTime & ) ) ); realignTracks(); return( _tv ); } diff --git a/src/gui/piano_roll.cpp b/src/gui/piano_roll.cpp index 0c854808d..bf27071fc 100644 --- a/src/gui/piano_roll.cpp +++ b/src/gui/piano_roll.cpp @@ -56,7 +56,7 @@ #include "gui_templates.h" #include "InstrumentTrack.h" #include "MainWindow.h" -#include "midi.h" +#include "MidiEvent.h" #include "mmp.h" #include "pattern.h" #include "Piano.h" @@ -162,7 +162,7 @@ pianoRoll::pianoRoll() : m_oldNotesEditHeight( 100 ), m_notesEditHeight( 100 ), m_ppt( DEFAULT_PR_PPT ), - m_lenOfNewNotes( midiTime( 0, DefaultTicksPerTact/4 ) ), + m_lenOfNewNotes( MidiTime( 0, DefaultTicksPerTact/4 ) ), m_lastNoteVolume( DefaultVolume ), m_lastNotePanning( DefaultPanning ), m_startKey( INITIAL_START_KEY ), @@ -283,21 +283,21 @@ pianoRoll::pianoRoll() : engine::getSong()->getPlayPos( song::Mode_PlayPattern ), m_currentPosition, this ); - connect( this, SIGNAL( positionChanged( const midiTime & ) ), - m_timeLine, SLOT( updatePosition( const midiTime & ) ) ); - connect( m_timeLine, SIGNAL( positionChanged( const midiTime & ) ), - this, SLOT( updatePosition( const midiTime & ) ) ); + connect( this, SIGNAL( positionChanged( const MidiTime & ) ), + m_timeLine, SLOT( updatePosition( const MidiTime & ) ) ); + connect( m_timeLine, SIGNAL( positionChanged( const MidiTime & ) ), + this, SLOT( updatePosition( const MidiTime & ) ) ); // update timeline when in record-accompany mode connect( engine::getSong()->getPlayPos( song::Mode_PlaySong ).m_timeLine, - SIGNAL( positionChanged( const midiTime & ) ), + SIGNAL( positionChanged( const MidiTime & ) ), this, - SLOT( updatePositionAccompany( const midiTime & ) ) ); + SLOT( updatePositionAccompany( const MidiTime & ) ) ); // TODO /* connect( engine::getSong()->getPlayPos( song::Mode_PlayBB ).m_timeLine, - SIGNAL( positionChanged( const midiTime & ) ), + SIGNAL( positionChanged( const MidiTime & ) ), this, - SLOT( updatePositionAccompany( const midiTime & ) ) );*/ + SLOT( updatePositionAccompany( const MidiTime & ) ) );*/ m_toolBar = new QWidget( this ); @@ -927,7 +927,7 @@ inline void pianoRoll::drawDetuningInfo( QPainter & _p, note * _n, int _x, { break; } - int pos_x = _x + pos_ticks * m_ppt / midiTime::ticksPerTact(); + int pos_x = _x + pos_ticks * m_ppt / MidiTime::ticksPerTact(); const float level = it.value(); @@ -1522,7 +1522,7 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me ) x -= WHITE_KEY_WIDTH; // get tick in which the user clicked - int pos_ticks = x * midiTime::ticksPerTact() / m_ppt + + int pos_ticks = x * MidiTime::ticksPerTact() / m_ppt + m_currentPosition; @@ -1535,7 +1535,7 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me ) // loop through whole note-vector... for( int i = 0; i < notes.size(); ++i ) { - midiTime len = ( *it )->length(); + MidiTime len = ( *it )->length(); if( len < 0 ) { len = 4; @@ -1552,7 +1552,7 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me ) ( edit_note == true && pos_ticks <= ( *it )->pos() + NE_LINE_WIDTH * - midiTime::ticksPerTact() / + MidiTime::ticksPerTact() / m_ppt ) ) ) @@ -1593,8 +1593,8 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me ) // +32 to quanitize the note correctly when placing notes with // the mouse. We do this here instead of in note.quantized // because live notes should still be quantized at the half. - midiTime note_pos( pos_ticks - ( quantization() / 2 ) ); - midiTime note_len( newNoteLen() ); + MidiTime note_pos( pos_ticks - ( quantization() / 2 ) ); + MidiTime note_len( newNoteLen() ); note new_note( note_len, note_pos, key_num ); new_note.setSelected( true ); @@ -1701,8 +1701,8 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me ) // clicked at the "tail" of the note? - if( pos_ticks*m_ppt/midiTime::ticksPerTact() > - ( m_currentNote->pos() + m_currentNote->length() )*m_ppt/ midiTime::ticksPerTact() - RESIZE_AREA_WIDTH && + if( pos_ticks*m_ppt/MidiTime::ticksPerTact() > + ( m_currentNote->pos() + m_currentNote->length() )*m_ppt/ MidiTime::ticksPerTact() - RESIZE_AREA_WIDTH && m_currentNote->length() > 0 ) { // then resize the note @@ -1865,16 +1865,16 @@ void pianoRoll::testPlayNote( note * n ) { m_lastKey = n->key(); - if( ! n->isPlaying() && ! m_recording && - ! engine::getSong()->isPlaying() ) + if( ! n->isPlaying() && ! m_recording && ! engine::getSong()->isPlaying() ) { n->setIsPlaying( true ); m_pattern->instrumentTrack()->pianoModel()->handleKeyPress( n->key(), volumeToMidi( n->getVolume() ) ); - midiEvent evt( MidiMetaEvent, 0, n->key(), panningToMidi( n->getPanning() ) ); - - evt.m_metaEvent = MidiNotePanning; - m_pattern->instrumentTrack()->processInEvent( evt, midiTime() ); + MidiEvent event( MidiMetaEvent, 0, n->key(), panningToMidi( n->getPanning() ) ); + + event.setMetaEvent( MidiNotePanning ); + + m_pattern->instrumentTrack()->processInEvent( event, 0 ); } } @@ -1919,10 +1919,6 @@ void pianoRoll::testPlayKey( int key, int velocity, int pan ) // play new key m_pattern->instrumentTrack()->pianoModel()->handleKeyPress( key, velocity ); - - // set panning of newly played key - midiEvent evt( MidiMetaEvent, 0, key, pan ); - evt.m_metaEvent = MidiNotePanning; } @@ -2183,9 +2179,9 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) // convert to ticks so that we can check which notes // are in the range int ticks_start = (x-pixel_range/2) * - midiTime::ticksPerTact() / m_ppt + m_currentPosition; + MidiTime::ticksPerTact() / m_ppt + m_currentPosition; int ticks_end = (x+pixel_range/2) * - midiTime::ticksPerTact() / m_ppt + m_currentPosition; + MidiTime::ticksPerTact() / m_ppt + m_currentPosition; // get note-vector of current pattern const NoteVector & notes = m_pattern->notes(); @@ -2234,14 +2230,14 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) { n->setVolume( vol ); m_pattern->instrumentTrack()->processInEvent( - midiEvent( MidiKeyPressure, 0, n->key(), volumeToMidi( vol ) ), midiTime() ); + MidiEvent( MidiKeyPressure, 0, n->key(), volumeToMidi( vol ) ), MidiTime() ); } else if( m_noteEditMode == NoteEditPanning ) { n->setPanning( pan ); - midiEvent evt( MidiMetaEvent, 0, n->key(), panningToMidi( pan ) ); - evt.m_metaEvent = MidiNotePanning; - m_pattern->instrumentTrack()->processInEvent( evt, midiTime() ); + MidiEvent evt( MidiMetaEvent, 0, n->key(), panningToMidi( pan ) ); + evt.setMetaEvent( MidiNotePanning ); + m_pattern->instrumentTrack()->processInEvent( evt, MidiTime() ); } } else @@ -2264,7 +2260,7 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) // set move- or resize-cursor // get tick in which the cursor is posated - int pos_ticks = ( x * midiTime::ticksPerTact() ) / + int pos_ticks = ( x * MidiTime::ticksPerTact() ) / m_ppt + m_currentPosition; // get note-vector of current pattern @@ -2296,10 +2292,10 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) // cursor at the "tail" of the note? if( ( *it )->length() > 0 && pos_ticks*m_ppt / - midiTime::ticksPerTact() > + MidiTime::ticksPerTact() > ( ( *it )->pos() + ( *it )->length() )*m_ppt/ - midiTime::ticksPerTact()- + MidiTime::ticksPerTact()- RESIZE_AREA_WIDTH ) { if( QApplication::overrideCursor() ) @@ -2363,7 +2359,7 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) // change size of selection // get tick in which the cursor is posated - int pos_ticks = x * midiTime::ticksPerTact() / m_ppt + + int pos_ticks = x * MidiTime::ticksPerTact() / m_ppt + m_currentPosition; m_selectedTick = pos_ticks - m_selectStartTick; @@ -2383,7 +2379,7 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) // holding down right-click to delete notes // get tick in which the user clicked - int pos_ticks = x * midiTime::ticksPerTact() / m_ppt + + int pos_ticks = x * MidiTime::ticksPerTact() / m_ppt + m_currentPosition; @@ -2396,7 +2392,7 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) // loop through whole note-vector... while( it != notes.end() ) { - midiTime len = ( *it )->length(); + MidiTime len = ( *it )->length(); if( len < 0 ) { len = 4; @@ -2413,7 +2409,7 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) ( edit_note == true && pos_ticks <= ( *it )->pos() + NE_LINE_WIDTH * - midiTime::ticksPerTact() / + MidiTime::ticksPerTact() / m_ppt ) ) ) @@ -2474,7 +2470,7 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) } // get tick in which the cursor is posated - int pos_ticks = x * midiTime::ticksPerTact()/ m_ppt + + int pos_ticks = x * MidiTime::ticksPerTact()/ m_ppt + m_currentPosition; m_selectedTick = pos_ticks - @@ -2535,7 +2531,7 @@ void pianoRoll::dragNotes( int x, int y, bool alt, bool shift ) // convert pixels to ticks and keys int off_x = x - m_moveStartX; - int off_ticks = off_x * midiTime::ticksPerTact() / m_ppt; + int off_ticks = off_x * MidiTime::ticksPerTact() / m_ppt; int off_key = getKey( y ) - getKey( m_moveStartY ); // handle scroll changes while dragging @@ -2587,7 +2583,7 @@ void pianoRoll::dragNotes( int x, int y, bool alt, bool shift ) { shifted_pos -= off_ticks; } - ( *it )->setPos( midiTime( shifted_pos ) ); + ( *it )->setPos( MidiTime( shifted_pos ) ); } if( ( *it )->selected() ) @@ -2614,7 +2610,7 @@ void pianoRoll::dragNotes( int x, int y, bool alt, bool shift ) key_num = NumKeys; } - ( *it )->setPos( midiTime( pos_ticks ) ); + ( *it )->setPos( MidiTime( pos_ticks ) ); ( *it )->setKey( key_num ); } else if( m_action == ActionResizeNote ) @@ -2636,7 +2632,7 @@ void pianoRoll::dragNotes( int x, int y, bool alt, bool shift ) shift_ref_pos = pos; } } - ( *it )->setLength( midiTime( ticks_new ) ); + ( *it )->setLength( MidiTime( ticks_new ) ); m_lenOfNewNotes = ( *it )->length(); } @@ -2941,7 +2937,7 @@ void pianoRoll::paintEvent( QPaintEvent * _pe ) // triplet mode occurs if the note duration isn't a multiple of 3 bool triplets = ( quantization() % 3 != 0 ); - int spt = midiTime::stepsPerTact(); + int spt = MidiTime::stepsPerTact(); float pp16th = (float)m_ppt / spt; int bpt = DefaultBeatsPerTact; if ( triplets ) { @@ -2953,7 +2949,7 @@ void pianoRoll::paintEvent( QPaintEvent * _pe ) int tact_16th = m_currentPosition / bpt; const int offset = ( m_currentPosition % bpt ) * - m_ppt / midiTime::ticksPerTact(); + m_ppt / MidiTime::ticksPerTact(); bool show32nds = ( m_zoomingModel.value() > 3 ); @@ -3047,9 +3043,9 @@ void pianoRoll::paintEvent( QPaintEvent * _pe ) int pos_ticks = ( *it )->pos(); int note_width = len_ticks * m_ppt / - midiTime::ticksPerTact(); + MidiTime::ticksPerTact(); const int x = ( pos_ticks - m_currentPosition ) * - m_ppt / midiTime::ticksPerTact(); + m_ppt / MidiTime::ticksPerTact(); // skip this note if not in visible area at all if( !( x + note_width >= 0 && x <= width() - WHITE_KEY_WIDTH ) ) @@ -3141,9 +3137,9 @@ void pianoRoll::paintEvent( QPaintEvent * _pe ) // now draw selection-frame int x = ( ( sel_pos_start - m_currentPosition ) * m_ppt ) / - midiTime::ticksPerTact(); + MidiTime::ticksPerTact(); int w = ( ( ( sel_pos_end - m_currentPosition ) * m_ppt ) / - midiTime::ticksPerTact() ) - x; + MidiTime::ticksPerTact() ) - x; int y = (int) y_base - sel_key_start * KEY_LINE_HEIGHT; int h = (int) y_base - sel_key_end * KEY_LINE_HEIGHT - y; p.setPen( QColor( 0, 64, 192 ) ); @@ -3407,7 +3403,7 @@ void pianoRoll::startRecordNote( const note & _n ) engine::getSong()->playMode() == song::Mode_PlayPattern ) ) { - midiTime sub; + MidiTime sub; if( engine::getSong()->playMode() == song::Mode_PlaySong ) { sub = m_pattern->startPosition(); @@ -3596,7 +3592,7 @@ void pianoRoll::copy_to_clipboard( const NoteVector & _notes ) const QDomElement note_list = mmp.createElement( "note-list" ); mmp.content().appendChild( note_list ); - midiTime start_pos( _notes.front()->pos().getTact(), 0 ); + MidiTime start_pos( _notes.front()->pos().getTact(), 0 ); for( NoteVector::ConstIterator it = _notes.begin(); it != _notes.end(); ++it ) { @@ -3752,20 +3748,20 @@ void pianoRoll::deleteSelectedNotes() -void pianoRoll::autoScroll( const midiTime & _t ) +void pianoRoll::autoScroll( const MidiTime & _t ) { const int w = width() - WHITE_KEY_WIDTH; - if( _t > m_currentPosition + w * midiTime::ticksPerTact() / m_ppt ) + if( _t > m_currentPosition + w * MidiTime::ticksPerTact() / m_ppt ) { m_leftRightScroll->setValue( _t.getTact() * - midiTime::ticksPerTact() ); + MidiTime::ticksPerTact() ); } else if( _t < m_currentPosition ) { - midiTime t = qMax( _t - w * midiTime::ticksPerTact() * - midiTime::ticksPerTact() / m_ppt, 0 ); + MidiTime t = qMax( _t - w * MidiTime::ticksPerTact() * + MidiTime::ticksPerTact() / m_ppt, 0 ); m_leftRightScroll->setValue( t.getTact() * - midiTime::ticksPerTact() ); + MidiTime::ticksPerTact() ); } m_scrollBack = false; } @@ -3773,7 +3769,7 @@ void pianoRoll::autoScroll( const midiTime & _t ) -void pianoRoll::updatePosition( const midiTime & _t ) +void pianoRoll::updatePosition( const MidiTime & _t ) { if( ( engine::getSong()->isPlaying() && engine::getSong()->playMode() == @@ -3788,14 +3784,14 @@ void pianoRoll::updatePosition( const midiTime & _t ) -void pianoRoll::updatePositionAccompany( const midiTime & _t ) +void pianoRoll::updatePositionAccompany( const MidiTime & _t ) { song * s = engine::getSong(); if( m_recording && validPattern() && s->playMode() != song::Mode_PlayPattern ) { - midiTime pos = _t; + MidiTime pos = _t; if( s->playMode() != song::Mode_PlayBB ) { pos -= m_pattern->startPosition(); @@ -3868,7 +3864,7 @@ void pianoRoll::updateSemiToneMarkerMenu() -midiTime pianoRoll::newNoteLen() const +MidiTime pianoRoll::newNoteLen() const { if( m_noteLenModel.value() == 0 ) { @@ -3906,7 +3902,7 @@ note * pianoRoll::noteUnderMouse() int key_num = getKey( pos.y() ); int pos_ticks = ( pos.x() - WHITE_KEY_WIDTH ) * - midiTime::ticksPerTact() / m_ppt + m_currentPosition; + MidiTime::ticksPerTact() / m_ppt + m_currentPosition; // will be our iterator in the following loop NoteVector::ConstIterator it = notes.begin()+notes.size()-1; diff --git a/src/gui/song_editor.cpp b/src/gui/song_editor.cpp index 60d7ed256..4a2205fbd 100644 --- a/src/gui/song_editor.cpp +++ b/src/gui/song_editor.cpp @@ -99,11 +99,11 @@ songEditor::songEditor( song * _song, songEditor * & _engine_ptr ) : pixelsPerTact(), m_s->m_playPos[song::Mode_PlaySong], m_currentPosition, this ); - connect( this, SIGNAL( positionChanged( const midiTime & ) ), + connect( this, SIGNAL( positionChanged( const MidiTime & ) ), m_s->m_playPos[song::Mode_PlaySong].m_timeLine, - SLOT( updatePosition( const midiTime & ) ) ); - connect( m_timeLine, SIGNAL( positionChanged( const midiTime & ) ), - this, SLOT( updatePosition( const midiTime & ) ) ); + SLOT( updatePosition( const MidiTime & ) ) ); + connect( m_timeLine, SIGNAL( positionChanged( const MidiTime & ) ), + this, SLOT( updatePosition( const MidiTime & ) ) ); m_positionLine = new positionLine( this ); @@ -419,7 +419,7 @@ void songEditor::setHighQuality( bool _hq ) void songEditor::scrolled( int _new_pos ) { update(); - emit positionChanged( m_currentPosition = midiTime( _new_pos, 0 ) ); + emit positionChanged( m_currentPosition = MidiTime( _new_pos, 0 ) ); } @@ -503,7 +503,7 @@ void songEditor::keyPressEvent( QKeyEvent * _ke ) } else if( _ke->key() == Qt::Key_Left ) { - tick_t t = m_s->currentTick() - midiTime::ticksPerTact(); + tick_t t = m_s->currentTick() - MidiTime::ticksPerTact(); if( t >= 0 ) { m_s->setPlayPos( t, song::Mode_PlaySong ); @@ -511,7 +511,7 @@ void songEditor::keyPressEvent( QKeyEvent * _ke ) } else if( _ke->key() == Qt::Key_Right ) { - tick_t t = m_s->currentTick() + midiTime::ticksPerTact(); + tick_t t = m_s->currentTick() + MidiTime::ticksPerTact(); if( t < MaxSongLength ) { m_s->setPlayPos( t, song::Mode_PlaySong ); @@ -706,7 +706,7 @@ static inline void animateScroll( QScrollBar *scrollBar, int newVal, bool smooth } -void songEditor::updatePosition( const midiTime & _t ) +void songEditor::updatePosition( const MidiTime & _t ) { int widgetWidth, trackOpWidth; if( configManager::inst()->value( "ui", "compacttrackbuttons" ).toInt() ) @@ -727,15 +727,15 @@ void songEditor::updatePosition( const midiTime & _t ) const int w = width() - widgetWidth - trackOpWidth - 32; // rough estimation for width of right scrollbar - if( _t > m_currentPosition + w * midiTime::ticksPerTact() / + if( _t > m_currentPosition + w * MidiTime::ticksPerTact() / pixelsPerTact() ) { animateScroll( m_leftRightScroll, _t.getTact(), m_smoothScroll ); } else if( _t < m_currentPosition ) { - midiTime t = qMax( - (int)( _t - w * midiTime::ticksPerTact() / + MidiTime t = qMax( + (int)( _t - w * MidiTime::ticksPerTact() / pixelsPerTact() ), 0 ); animateScroll( m_leftRightScroll, t.getTact(), m_smoothScroll ); diff --git a/src/tracks/AutomationTrack.cpp b/src/tracks/AutomationTrack.cpp index 5988ba3c5..3353ae3eb 100644 --- a/src/tracks/AutomationTrack.cpp +++ b/src/tracks/AutomationTrack.cpp @@ -50,7 +50,7 @@ AutomationTrack::~AutomationTrack() -bool AutomationTrack::play( const midiTime & _start, const fpp_t _frames, +bool AutomationTrack::play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _frame_base, int _tco_num ) { if( isMuted() ) @@ -77,7 +77,7 @@ bool AutomationTrack::play( const midiTime & _start, const fpp_t _frames, { continue; } - midiTime cur_start = _start; + MidiTime cur_start = _start; if( _tco_num < 0 ) { cur_start -= p->startPosition(); @@ -98,7 +98,7 @@ trackView * AutomationTrack::createView( TrackContainerView* tcv ) -trackContentObject * AutomationTrack::createTCO( const midiTime & ) +trackContentObject * AutomationTrack::createTCO( const MidiTime & ) { return new AutomationPattern( this ); } @@ -168,11 +168,11 @@ void AutomationTrackView::dropEvent( QDropEvent * _de ) journallingObject( val.toInt() ) ); if( mod != NULL ) { - midiTime pos = midiTime( trackContainerView()-> + MidiTime pos = MidiTime( trackContainerView()-> currentPosition() + ( _de->pos().x() - getTrackContentWidget()->x() ) * - midiTime::ticksPerTact() / + MidiTime::ticksPerTact() / static_cast( trackContainerView()->pixelsPerTact() ) ) .toNearestTact(); diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index a88f07fcb..8aaab7b9b 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -202,15 +202,15 @@ void InstrumentTrack::processAudioBuffer( sampleFrame * _buf, -midiEvent InstrumentTrack::applyMasterKey( const midiEvent & _me ) +MidiEvent InstrumentTrack::applyMasterKey( const MidiEvent& event ) { - midiEvent copy( _me ); - switch( _me.m_type ) + MidiEvent copy( event ); + switch( event.type() ) { case MidiNoteOn: case MidiNoteOff: case MidiKeyPressure: - copy.key() = masterKey( _me.key() ); + copy.setKey( masterKey( event.key() ) ); break; default: break; @@ -221,109 +221,92 @@ midiEvent InstrumentTrack::applyMasterKey( const midiEvent & _me ) -void InstrumentTrack::processInEvent( const midiEvent & _me, - const midiTime & _time ) +void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& time ) { engine::mixer()->lock(); - // in the special case this event comes from a MIDI port, the instrument - // is MIDI based (VST plugin, Sf2Player etc.) and the user did not set - // a dedicated MIDI output channel, directly pass the MIDI event to the - // instrument plugin - if( _me.isFromMidiPort() && m_instrument->isMidiBased()/* && - midiPort()->realOutputChannel() < 0 */ ) - { - m_instrument->handleMidiEvent( _me, _time ); - engine::mixer()->unlock(); - return; - } + bool eventHandled = false; - switch( _me.m_type ) + switch( event.type() ) { // we don't send MidiNoteOn, MidiNoteOff and MidiKeyPressure // events to instrument as notePlayHandle will send them on its // own - case MidiNoteOn: - if( _me.velocity() > 0 ) + case MidiNoteOn: + if( event.velocity() > 0 ) { - if( m_notes[_me.key()] == NULL ) + if( m_notes[event.key()] == NULL ) { - if( !configManager::inst()->value( "ui", - "manualchannelpiano" ).toInt() ) + if( !configManager::inst()->value( "ui", "manualchannelpiano" ).toInt() ) { - m_piano.setKeyState( - _me.key(), true ); + m_piano.setKeyState( event.key(), true ); } // create temporary note note n; - n.setKey( _me.key() ); - n.setVolume( _me.getVolume() ); + n.setKey( event.key() ); + n.setVolume( event.volume() ); // create (timed) note-play-handle - notePlayHandle * nph = new - notePlayHandle( this, - _time.frames( - engine::framesPerTick() ), - typeInfo::max() / 2, - n ); - if( engine::mixer()->addPlayHandle( - nph ) ) + notePlayHandle* nph = new notePlayHandle( this, time.frames( engine::framesPerTick() ), typeInfo::max() / 2, + n, NULL, false, event.channel() ); + if( engine::mixer()->addPlayHandle( nph ) ) { - m_notes[_me.key()] = nph; + m_notes[event.key()] = nph; } emit noteOn( n ); + + eventHandled = true; + } break; } case MidiNoteOff: { - notePlayHandle * n = m_notes[_me.key()]; - if( n != NULL ) + notePlayHandle* nph = m_notes[event.key()]; + if( nph != NULL ) { // create dummy-note which has the same length // as the played note for sending it later // to all slots connected to signal noteOff() // this is for example needed by piano-roll for // recording notes into a pattern - note done_note( - midiTime( static_cast( - n->totalFramesPlayed() / - engine::framesPerTick() ) ), - 0, - n->key(), - n->getVolume(), - n->getPanning() ); + note n( MidiTime( static_cast( nph->totalFramesPlayed() / engine::framesPerTick() ) ), + 0, nph->key(), nph->getVolume(), nph->getPanning() ); - n->noteOff(); - m_notes[_me.key()] = NULL; + emit noteOff( n ); - emit noteOff( done_note ); + // now do actual note off and remove internal reference to NotePlayHandle (which itself will + // be deleted later automatically) + nph->noteOff(); + m_notes[event.key()] = NULL; + + eventHandled = true; } break; } case MidiKeyPressure: - if( m_notes[_me.key()] != NULL ) + if( m_notes[event.key()] != NULL ) { - m_notes[_me.key()]->setVolume( _me.getVolume() ); + eventHandled = true; + // setVolume() calls processOutEvent() with MidiKeyPressure so the + // attached instrument will receive the event as well + m_notes[event.key()]->setVolume( event.volume() ); } break; case MidiPitchBend: - // updatePitch() is connected to - // m_pitchModel::dataChanged() which will send out + // updatePitch() is connected to m_pitchModel::dataChanged() which will send out // MidiPitchBend events - m_pitchModel.setValue( m_pitchModel.minValue() + - _me.m_data.m_param[0] * - m_pitchModel.range() / 16384 ); + m_pitchModel.setValue( m_pitchModel.minValue() + event.pitchBend() * m_pitchModel.range() / 16384 ); break; case MidiControlChange: - if( _me.controllerNumber() == MidiControllerSustain ) + if( event.controllerNumber() == MidiControllerSustain ) { - if( _me.controllerValue() > MidiMaxControllerValue/2 ) + if( event.controllerValue() > MidiMaxControllerValue/2 ) { m_sustainPedalPressed = true; } @@ -332,120 +315,99 @@ void InstrumentTrack::processInEvent( const midiEvent & _me, m_sustainPedalPressed = false; } } - if( _me.controllerNumber() == MidiControllerAllSoundOff || - _me.controllerNumber() == MidiControllerAllNotesOff || - _me.controllerNumber() == MidiControllerOmniOn || - _me.controllerNumber() == MidiControllerOmniOff || - _me.controllerNumber() == MidiControllerMonoOn || - _me.controllerNumber() == MidiControllerPolyOn ) + if( event.controllerNumber() == MidiControllerAllSoundOff || + event.controllerNumber() == MidiControllerAllNotesOff || + event.controllerNumber() == MidiControllerOmniOn || + event.controllerNumber() == MidiControllerOmniOff || + event.controllerNumber() == MidiControllerMonoOn || + event.controllerNumber() == MidiControllerPolyOn ) { silenceAllNotes(); } - m_instrument->handleMidiEvent( _me, _time ); break; - case MidiProgramChange: - m_instrument->handleMidiEvent( _me, _time ); - break; - case MidiMetaEvent: // handle special cases such as note panning - switch( _me.m_metaEvent ) + switch( event.metaEvent() ) { case MidiNotePanning: - if( m_notes[_me.key()] != NULL ) + if( m_notes[event.key()] != NULL ) { - m_notes[_me.key()]->setPanning( _me.getPanning() ); + eventHandled = true; + m_notes[event.key()]->setPanning( event.panning() ); } break; default: - printf( "instrument-track: unhandled " - "MIDI meta event: %i\n", - _me.m_metaEvent ); + qWarning( "InstrumentTrack: unhandled MIDI meta event: %i", event.metaEvent() ); break; } break; default: - if( !m_instrument->handleMidiEvent( _me, _time ) ) - { - printf( "instrument-track: unhandled " - "MIDI event %d\n", _me.m_type ); - } break; } + + if( eventHandled == false && instrument()->handleMidiEvent( event, time ) == false ) + { + qWarning( "InstrumentTrack: unhandled MIDI event %d", event.type() ); + } + engine::mixer()->unlock(); } -void InstrumentTrack::processOutEvent( const midiEvent & _me, - const midiTime & _time ) +void InstrumentTrack::processOutEvent( const MidiEvent& event, const MidiTime& time ) { int k; - switch( _me.m_type ) + switch( event.type() ) { case MidiNoteOn: - if( !configManager::inst()->value( "ui", - "manualchannelpiano" ).toInt() ) + if( !configManager::inst()->value( "ui", "manualchannelpiano" ).toInt() ) { - m_piano.setKeyState( _me.key(), true ); + m_piano.setKeyState( event.key(), true ); } - if( !configManager::inst()->value( "ui", - "disablechannelactivityindicators" ).toInt() ) + if( !configManager::inst()->value( "ui", "disablechannelactivityindicators" ).toInt() ) { - if( m_notes[_me.key()] == NULL ) + if( m_notes[event.key()] == NULL ) { emit newNote(); } } - k = masterKey( _me.key() ); + k = masterKey( event.key() ); if( k >= 0 && k < NumKeys ) { if( m_runningMidiNotes[k] > 0 ) { - m_instrument->handleMidiEvent( - midiEvent( MidiNoteOff, midiPort()->realOutputChannel(), k, 0 ), - _time ); + m_instrument->handleMidiEvent( MidiEvent( MidiNoteOff, midiPort()->realOutputChannel(), k, 0 ), time ); } ++m_runningMidiNotes[k]; - m_instrument->handleMidiEvent( - midiEvent( MidiNoteOn, midiPort()->realOutputChannel(), k, - _me.velocity() ), _time ); + m_instrument->handleMidiEvent( MidiEvent( MidiNoteOn, midiPort()->realOutputChannel(), k, event.velocity() ), time ); } break; case MidiNoteOff: - if( !configManager::inst()->value( "ui", - "manualchannelpiano" ).toInt() ) + if( !configManager::inst()->value( "ui", "manualchannelpiano" ).toInt() ) { - m_piano.setKeyState( _me.key(), false ); + m_piano.setKeyState( event.key(), false ); } - k = masterKey( _me.key() ); - if( k >= 0 && k < NumKeys && - --m_runningMidiNotes[k] <= 0 ) + k = masterKey( event.key() ); + if( k >= 0 && k < NumKeys && --m_runningMidiNotes[k] <= 0 ) { m_runningMidiNotes[k] = qMax( 0, m_runningMidiNotes[k] ); - m_instrument->handleMidiEvent( - midiEvent( MidiNoteOff, midiPort()->realOutputChannel(), k, 0 ), - _time ); + m_instrument->handleMidiEvent( MidiEvent( MidiNoteOff, midiPort()->realOutputChannel(), k, 0 ), time ); } break; default: - if( m_instrument != NULL ) - { - m_instrument->handleMidiEvent( - applyMasterKey( _me ), - _time ); - } + m_instrument->handleMidiEvent( applyMasterKey( event ), time ); break; } // if appropriate, midi-port does futher routing - m_midiPort.processOutEvent( _me, _time ); + m_midiPort.processOutEvent( event, time ); } @@ -525,7 +487,7 @@ void InstrumentTrack::deleteNotePluginData( notePlayHandle * _n ) // Notes deleted when keys still pressed if( m_notes[_n->key()] == _n ) { - note done_note( midiTime( static_cast( + note done_note( MidiTime( static_cast( _n->totalFramesPlayed() / engine::framesPerTick() ) ), 0, _n->key(), @@ -581,9 +543,7 @@ void InstrumentTrack::updateBaseNote() void InstrumentTrack::updatePitch() { updateBaseNote(); - processOutEvent( midiEvent( MidiPitchBend, - midiPort()->realOutputChannel(), - midiPitch() ), 0 ); + processOutEvent( MidiEvent( MidiPitchBend, midiPort()->realOutputChannel(), midiPitch() ), 0 ); } @@ -616,7 +576,7 @@ void InstrumentTrack::removeMidiPortNode( multimediaProject & _mmp ) -bool InstrumentTrack::play( const midiTime & _start, const fpp_t _frames, +bool InstrumentTrack::play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _offset, int _tco_num ) { const float frames_per_tick = engine::framesPerTick(); @@ -657,7 +617,7 @@ bool InstrumentTrack::play( const midiTime & _start, const fpp_t _frames, { continue; } - midiTime cur_start = _start; + MidiTime cur_start = _start; if( _tco_num < 0 ) { cur_start -= p->startPosition(); @@ -747,7 +707,7 @@ bool InstrumentTrack::play( const midiTime & _start, const fpp_t _frames, -trackContentObject * InstrumentTrack::createTCO( const midiTime & ) +trackContentObject * InstrumentTrack::createTCO( const MidiTime & ) { return new pattern( this ); } @@ -1182,8 +1142,8 @@ void InstrumentTrackView::toggleInstrumentWindow( bool _on ) void InstrumentTrackView::activityIndicatorPressed() { model()->processInEvent( - midiEvent( MidiNoteOn, 0, DefaultKey, MidiMaxVelocity ), - midiTime() ); + MidiEvent( MidiNoteOn, 0, DefaultKey, MidiMaxVelocity ), + MidiTime() ); } @@ -1191,8 +1151,8 @@ void InstrumentTrackView::activityIndicatorPressed() void InstrumentTrackView::activityIndicatorReleased() { - model()->processInEvent( midiEvent( MidiNoteOff, 0, DefaultKey, 0 ), - midiTime() ); + model()->processInEvent( MidiEvent( MidiNoteOff, 0, DefaultKey, 0 ), + MidiTime() ); } diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index 9b7e55eed..25f6eee3b 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -74,7 +74,7 @@ SampleTCO::~SampleTCO() -void SampleTCO::changeLength( const midiTime & _length ) +void SampleTCO::changeLength( const MidiTime & _length ) { trackContentObject::changeLength( qMax( static_cast( _length ), DefaultTicksPerTact ) ); } @@ -128,7 +128,7 @@ void SampleTCO::updateLength( bpm_t ) -midiTime SampleTCO::sampleLength() const +MidiTime SampleTCO::sampleLength() const { return (int)( m_sampleBuffer->frames() / engine::framesPerTick() ); } @@ -406,7 +406,7 @@ SampleTrack::~SampleTrack() -bool SampleTrack::play( const midiTime & _start, const fpp_t _frames, +bool SampleTrack::play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _offset, int /*_tco_num*/ ) { m_audioPort.effects()->startRunning(); @@ -461,7 +461,7 @@ trackView * SampleTrack::createView( TrackContainerView* tcv ) -trackContentObject * SampleTrack::createTCO( const midiTime & ) +trackContentObject * SampleTrack::createTCO( const MidiTime & ) { return new SampleTCO( this ); } diff --git a/src/tracks/bb_track.cpp b/src/tracks/bb_track.cpp index 67b2c2b59..a2c041e57 100644 --- a/src/tracks/bb_track.cpp +++ b/src/tracks/bb_track.cpp @@ -55,7 +55,7 @@ bbTCO::bbTCO( track * _track, unsigned int _color ) : if( t > 0 ) { saveJournallingState( false ); - changeLength( midiTime( t, 0 ) ); + changeLength( MidiTime( t, 0 ) ); restoreJournallingState(); } } @@ -192,7 +192,7 @@ void bbTCOView::paintEvent( QPaintEvent * ) tact_t t = engine::getBBTrackContainer()->lengthOfBB( bbTrack::numOfBBTrack( m_bbTCO->getTrack() ) ); - if( m_bbTCO->length() > midiTime::ticksPerTact() && t > 0 ) + if( m_bbTCO->length() > MidiTime::ticksPerTact() && t > 0 ) { for( int x = static_cast( t * pixelsPerTact() ); x < width()-2; @@ -341,7 +341,7 @@ bbTrack::~bbTrack() // play _frames frames of given TCO within starting with _start -bool bbTrack::play( const midiTime & _start, const fpp_t _frames, +bool bbTrack::play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _offset, int _tco_num ) { if( isMuted() ) @@ -362,8 +362,8 @@ bool bbTrack::play( const midiTime & _start, const fpp_t _frames, return false; } - midiTime lastPosition; - midiTime lastLen; + MidiTime lastPosition; + MidiTime lastLen; for( tcoVector::iterator it = tcos.begin(); it != tcos.end(); ++it ) { if( !( *it )->isMuted() && @@ -392,7 +392,7 @@ trackView * bbTrack::createView( TrackContainerView* tcv ) -trackContentObject * bbTrack::createTCO( const midiTime & _pos ) +trackContentObject * bbTrack::createTCO( const MidiTime & _pos ) { // if we're creating a new bbTCO, we colorize it according to the // previous bbTCO, so we have to get all TCOs from 0 to _pos and diff --git a/src/tracks/pattern.cpp b/src/tracks/pattern.cpp index 611f18adc..95ab237aa 100644 --- a/src/tracks/pattern.cpp +++ b/src/tracks/pattern.cpp @@ -63,7 +63,7 @@ pattern::pattern( InstrumentTrack * _instrument_track ) : trackContentObject( _instrument_track ), m_instrumentTrack( _instrument_track ), m_patternType( BeatPattern ), - m_steps( midiTime::stepsPerTact() ), + m_steps( MidiTime::stepsPerTact() ), m_frozenPattern( NULL ), m_freezing( false ), m_freezeAborted( false ) @@ -127,14 +127,14 @@ void pattern::init() -midiTime pattern::length() const +MidiTime pattern::length() const { if( m_patternType == BeatPattern ) { return beatPatternLength(); } - tick_t max_length = midiTime::ticksPerTact(); + tick_t max_length = MidiTime::ticksPerTact(); for( NoteVector::ConstIterator it = m_notes.begin(); it != m_notes.end(); ++it ) @@ -145,16 +145,16 @@ midiTime pattern::length() const ( *it )->endPos() ); } } - return midiTime( max_length ).nextFullTact() * - midiTime::ticksPerTact(); + return MidiTime( max_length ).nextFullTact() * + MidiTime::ticksPerTact(); } -midiTime pattern::beatPatternLength() const +MidiTime pattern::beatPatternLength() const { - tick_t max_length = midiTime::ticksPerTact(); + tick_t max_length = MidiTime::ticksPerTact(); for( NoteVector::ConstIterator it = m_notes.begin(); it != m_notes.end(); ++it ) @@ -163,18 +163,18 @@ midiTime pattern::beatPatternLength() const { max_length = qMax( max_length, ( *it )->pos() + - midiTime::ticksPerTact() / - midiTime::stepsPerTact() ); + MidiTime::ticksPerTact() / + MidiTime::stepsPerTact() ); } } - if( m_steps != midiTime::stepsPerTact() ) + if( m_steps != MidiTime::stepsPerTact() ) { - max_length = m_steps * midiTime::ticksPerTact() / - midiTime::stepsPerTact() ; + max_length = m_steps * MidiTime::ticksPerTact() / + MidiTime::stepsPerTact() ; } - return midiTime( max_length ).nextFullTact() * midiTime::ticksPerTact(); + return MidiTime( max_length ).nextFullTact() * MidiTime::ticksPerTact(); } @@ -385,7 +385,7 @@ void pattern::loadSettings( const QDomElement & _this ) { movePosition( _this.attribute( "pos" ).toInt() ); } - changeLength( midiTime( _this.attribute( "len" ).toInt() ) ); + changeLength( MidiTime( _this.attribute( "len" ).toInt() ) ); if( _this.attribute( "muted" ).toInt() != isMuted() ) { toggleMute(); @@ -409,7 +409,7 @@ void pattern::loadSettings( const QDomElement & _this ) m_steps = _this.attribute( "steps" ).toInt(); if( m_steps == 0 ) { - m_steps = midiTime::stepsPerTact(); + m_steps = MidiTime::stepsPerTact(); } ensureBeatNotes(); @@ -487,7 +487,7 @@ void pattern::abortFreeze() void pattern::addSteps() { - m_steps += midiTime::stepsPerTact(); + m_steps += MidiTime::stepsPerTact(); ensureBeatNotes(); emit dataChanged(); } @@ -497,7 +497,7 @@ void pattern::addSteps() void pattern::removeSteps() { - int _n = midiTime::stepsPerTact(); + int _n = MidiTime::stepsPerTact(); if( _n < m_steps ) { for( int i = m_steps - _n; i < m_steps; ++i ) @@ -506,8 +506,8 @@ void pattern::removeSteps() it != m_notes.end(); ++it ) { if( ( *it )->pos() == - i * midiTime::ticksPerTact() / - midiTime::stepsPerTact() && + i * MidiTime::ticksPerTact() / + MidiTime::stepsPerTact() && ( *it )->length() <= 0 ) { removeNote( *it ); @@ -542,8 +542,8 @@ void pattern::ensureBeatNotes() it != m_notes.end(); ++it ) { if( ( *it )->pos() == - i * midiTime::ticksPerTact() / - midiTime::stepsPerTact() && + i * MidiTime::ticksPerTact() / + MidiTime::stepsPerTact() && ( *it )->length() <= 0 ) { found = true; @@ -552,9 +552,9 @@ void pattern::ensureBeatNotes() } if( found == false ) { - addNote( note( midiTime( 0 ), midiTime( i * - midiTime::ticksPerTact() / - midiTime::stepsPerTact() ) ), false ); + addNote( note( MidiTime( 0 ), MidiTime( i * + MidiTime::ticksPerTact() / + MidiTime::stepsPerTact() ) ), false ); } } } @@ -591,17 +591,17 @@ bool pattern::empty() void pattern::changeTimeSignature() { - midiTime last_pos = midiTime::ticksPerTact(); + MidiTime last_pos = MidiTime::ticksPerTact(); for( NoteVector::ConstIterator cit = m_notes.begin(); cit != m_notes.end(); ++cit ) { if( ( *cit )->length() < 0 && ( *cit )->pos() > last_pos ) { - last_pos = ( *cit )->pos()+midiTime::ticksPerTact() / - midiTime::stepsPerTact(); + last_pos = ( *cit )->pos()+MidiTime::ticksPerTact() / + MidiTime::stepsPerTact(); } } - last_pos = last_pos.nextFullTact() * midiTime::ticksPerTact(); + last_pos = last_pos.nextFullTact() * MidiTime::ticksPerTact(); for( NoteVector::Iterator it = m_notes.begin(); it != m_notes.end(); ) { if( ( *it )->length() == 0 && ( *it )->pos() >= last_pos ) @@ -616,8 +616,8 @@ void pattern::changeTimeSignature() } } m_steps = qMax( - qMax( m_steps, midiTime::stepsPerTact() ), - last_pos.getTact() * midiTime::stepsPerTact() ); + qMax( m_steps, MidiTime::stepsPerTact() ), + last_pos.getTact() * MidiTime::stepsPerTact() ); ensureBeatNotes(); } @@ -970,7 +970,7 @@ void patternView::mouseDoubleClickEvent( QMouseEvent * _me ) if( m_pat->type() == pattern::MelodyPattern || !( m_pat->type() == pattern::BeatPattern && ( pixelsPerTact() >= 192 || - m_pat->m_steps != midiTime::stepsPerTact() ) && + m_pat->m_steps != MidiTime::stepsPerTact() ) && _me->y() > height() - s_stepBtnOff->height() ) ) { openInPianoRoll(); @@ -985,7 +985,7 @@ void patternView::mousePressEvent( QMouseEvent * _me ) if( _me->button() == Qt::LeftButton && m_pat->m_patternType == pattern::BeatPattern && ( fixedTCOs() || pixelsPerTact() >= 96 || - m_pat->m_steps != midiTime::stepsPerTact() ) && + m_pat->m_steps != MidiTime::stepsPerTact() ) && _me->y() > height() - s_stepBtnOff->height() ) { int step = ( _me->x() - TCO_BORDER_WIDTH ) * @@ -1033,7 +1033,7 @@ void patternView::wheelEvent( QWheelEvent * _we ) { if( m_pat->m_patternType == pattern::BeatPattern && ( fixedTCOs() || pixelsPerTact() >= 96 || - m_pat->m_steps != midiTime::stepsPerTact() ) && + m_pat->m_steps != MidiTime::stepsPerTact() ) && _we->y() > height() - s_stepBtnOff->height() ) { int step = ( _we->x() - TCO_BORDER_WIDTH ) * @@ -1192,9 +1192,9 @@ void patternView::paintEvent( QPaintEvent * ) { const int x1 = 2 * x_base + static_cast( ( *it )->pos() * ppt / - midiTime::ticksPerTact() ); + MidiTime::ticksPerTact() ); const int x2 = - static_cast( ( ( *it )->pos() + ( *it )->length() ) * ppt / midiTime::ticksPerTact() ); + static_cast( ( ( *it )->pos() + ( *it )->length() ) * ppt / MidiTime::ticksPerTact() ); p.drawLine( x1, y_base + y_pos, x2, y_base + y_pos ); @@ -1205,7 +1205,7 @@ void patternView::paintEvent( QPaintEvent * ) } else if( m_pat->m_patternType == pattern::BeatPattern && ( fixedTCOs() || ppt >= 96 - || m_pat->m_steps != midiTime::stepsPerTact() ) ) + || m_pat->m_steps != MidiTime::stepsPerTact() ) ) { QPixmap stepon; QPixmap stepoverlay; From 7d395c00fa2727c62d4a1d176d0fa94f1e354906 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 00:14:16 +0100 Subject: [PATCH 044/110] InstrumentTrack: removed option for disabling PianoView visual feedback Probably never used by anyone and just makes code unneccessarily complex. --- include/setup_dialog.h | 4 +--- src/gui/setup_dialog.cpp | 29 ++++------------------------- src/tracks/InstrumentTrack.cpp | 16 ++++------------ 3 files changed, 9 insertions(+), 40 deletions(-) diff --git a/include/setup_dialog.h b/include/setup_dialog.h index f5bd00676..866cea7d9 100644 --- a/include/setup_dialog.h +++ b/include/setup_dialog.h @@ -1,7 +1,7 @@ /* * setup_dialog.h - dialog for setting up LMMS * - * Copyright (c) 2005-2011 Tobias Doerffel + * Copyright (c) 2005-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -103,7 +103,6 @@ private slots: void openBackgroundArtwork(); void toggleDisableChActInd( bool _disabled ); - void toggleManualChPiano( bool _enabled ); void toggleSmoothScroll( bool _enabled ); void toggleAutoSave( bool _enabled ); void toggleOneInstrumentTrackWindow( bool _enabled ); @@ -155,7 +154,6 @@ private: QString m_backgroundArtwork; bool m_disableChActInd; - bool m_manualChPiano; bool m_smoothScroll; bool m_enableAutoSave; bool m_oneInstrumentTrackWindow; diff --git a/src/gui/setup_dialog.cpp b/src/gui/setup_dialog.cpp index 0b0526aee..5703d739c 100644 --- a/src/gui/setup_dialog.cpp +++ b/src/gui/setup_dialog.cpp @@ -1,7 +1,7 @@ /* * setup_dialog.cpp - dialog for setting up LMMS * - * Copyright (c) 2005-2013 Tobias Doerffel + * Copyright (c) 2005-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -110,8 +110,6 @@ setupDialog::setupDialog( ConfigTabs _tab_to_open ) : m_backgroundArtwork( configManager::inst()->backgroundArtwork() ), m_disableChActInd( configManager::inst()->value( "ui", "disablechannelactivityindicators" ).toInt() ), - m_manualChPiano( configManager::inst()->value( "ui", - "manualchannelpiano" ).toInt() ), m_smoothScroll( configManager::inst()->value( "ui", "smoothscroll" ).toInt() ), m_enableAutoSave( configManager::inst()->value( "ui", "enableautosave" ).toInt() ), m_oneInstrumentTrackWindow( configManager::inst()->value( "ui", @@ -524,17 +522,9 @@ setupDialog::setupDialog( ConfigTabs _tab_to_open ) : this, SLOT( toggleDisableChActInd( bool ) ) ); - ledCheckBox * manual_ch_piano = new ledCheckBox( - tr( "Only press keys on channel-piano manually" ), - ui_fx_tw ); - manual_ch_piano->move( 10, 40 ); - manual_ch_piano->setChecked( m_manualChPiano ); - connect( manual_ch_piano, SIGNAL( toggled( bool ) ), - this, SLOT( toggleManualChPiano( bool ) ) ); - ledCheckBox * smoothScroll = new ledCheckBox( tr( "Smooth scroll in Song Editor" ), ui_fx_tw ); - smoothScroll->move( 10, 60 ); + smoothScroll->move( 10, 40 ); smoothScroll->setChecked( m_smoothScroll ); connect( smoothScroll, SIGNAL( toggled( bool ) ), this, SLOT( toggleSmoothScroll( bool ) ) ); @@ -542,7 +532,7 @@ setupDialog::setupDialog( ConfigTabs _tab_to_open ) : ledCheckBox * autoSave = new ledCheckBox( tr( "Enable auto save feature" ), ui_fx_tw ); - autoSave->move( 10, 80 ); + autoSave->move( 10, 60 ); autoSave->setChecked( m_enableAutoSave ); connect( autoSave, SIGNAL( toggled( bool ) ), this, SLOT( toggleAutoSave( bool ) ) ); @@ -551,7 +541,7 @@ setupDialog::setupDialog( ConfigTabs _tab_to_open ) : ledCheckBox * animAFP = new ledCheckBox( tr( "Show playback cursor in AudioFileProcessor" ), ui_fx_tw ); - animAFP->move( 10, 100 ); + animAFP->move( 10, 80 ); animAFP->setChecked( m_animateAFP ); connect( animAFP, SIGNAL( toggled( bool ) ), this, SLOT( toggleAnimateAFP( bool ) ) ); @@ -821,8 +811,6 @@ void setupDialog::accept() configManager::inst()->setValue( "ui", "disablechannelactivityindicators", QString::number( m_disableChActInd ) ); - configManager::inst()->setValue( "ui", "manualchannelpiano", - QString::number( m_manualChPiano ) ); configManager::inst()->setValue( "ui", "smoothscroll", QString::number( m_smoothScroll ) ); configManager::inst()->setValue( "ui", "enableautosave", @@ -987,15 +975,6 @@ void setupDialog::toggleDisableChActInd( bool _disabled ) -void setupDialog::toggleManualChPiano( bool _enabled ) -{ - m_manualChPiano = _enabled; -} - - - - - void setupDialog::toggleSmoothScroll( bool _enabled ) { m_smoothScroll = _enabled; diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index 8aaab7b9b..fd16fc90d 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -237,10 +237,8 @@ void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& ti { if( m_notes[event.key()] == NULL ) { - if( !configManager::inst()->value( "ui", "manualchannelpiano" ).toInt() ) - { - m_piano.setKeyState( event.key(), true ); - } + m_piano.setKeyState( event.key(), true ); + // create temporary note note n; n.setKey( event.key() ); @@ -365,10 +363,7 @@ void InstrumentTrack::processOutEvent( const MidiEvent& event, const MidiTime& t switch( event.type() ) { case MidiNoteOn: - if( !configManager::inst()->value( "ui", "manualchannelpiano" ).toInt() ) - { - m_piano.setKeyState( event.key(), true ); - } + m_piano.setKeyState( event.key(), true ); if( !configManager::inst()->value( "ui", "disablechannelactivityindicators" ).toInt() ) { if( m_notes[event.key()] == NULL ) @@ -389,10 +384,7 @@ void InstrumentTrack::processOutEvent( const MidiEvent& event, const MidiTime& t break; case MidiNoteOff: - if( !configManager::inst()->value( "ui", "manualchannelpiano" ).toInt() ) - { - m_piano.setKeyState( event.key(), false ); - } + m_piano.setKeyState( event.key(), false ); k = masterKey( event.key() ); if( k >= 0 && k < NumKeys && --m_runningMidiNotes[k] <= 0 ) { From 1fddc81c0426011c4797648d91a8b5dfbbe9eb9e Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 00:25:32 +0100 Subject: [PATCH 045/110] InstrumentTrack: removed option for disabling activity indicators Probably never used by anyone and just makes code unneccessarily complex. --- include/setup_dialog.h | 2 -- src/gui/setup_dialog.cpp | 30 ++++-------------------------- src/tracks/InstrumentTrack.cpp | 9 ++------- 3 files changed, 6 insertions(+), 35 deletions(-) diff --git a/include/setup_dialog.h b/include/setup_dialog.h index 866cea7d9..53c2be08f 100644 --- a/include/setup_dialog.h +++ b/include/setup_dialog.h @@ -102,7 +102,6 @@ private slots: void openDefaultSoundfont(); void openBackgroundArtwork(); - void toggleDisableChActInd( bool _disabled ); void toggleSmoothScroll( bool _enabled ); void toggleAutoSave( bool _enabled ); void toggleOneInstrumentTrackWindow( bool _enabled ); @@ -153,7 +152,6 @@ private: #endif QString m_backgroundArtwork; - bool m_disableChActInd; bool m_smoothScroll; bool m_enableAutoSave; bool m_oneInstrumentTrackWindow; diff --git a/src/gui/setup_dialog.cpp b/src/gui/setup_dialog.cpp index 5703d739c..d863833b6 100644 --- a/src/gui/setup_dialog.cpp +++ b/src/gui/setup_dialog.cpp @@ -108,8 +108,6 @@ setupDialog::setupDialog( ConfigTabs _tab_to_open ) : m_stkDir( configManager::inst()->stkDir() ), #endif m_backgroundArtwork( configManager::inst()->backgroundArtwork() ), - m_disableChActInd( configManager::inst()->value( "ui", - "disablechannelactivityindicators" ).toInt() ), m_smoothScroll( configManager::inst()->value( "ui", "smoothscroll" ).toInt() ), m_enableAutoSave( configManager::inst()->value( "ui", "enableautosave" ).toInt() ), m_oneInstrumentTrackWindow( configManager::inst()->value( "ui", @@ -511,20 +509,11 @@ setupDialog::setupDialog( ConfigTabs _tab_to_open ) : tabWidget * ui_fx_tw = new tabWidget( tr( "UI effects vs. " "performance" ).toUpper(), performance ); - ui_fx_tw->setFixedHeight( 120 ); - - ledCheckBox * disable_ch_act_ind = new ledCheckBox( - tr( "Disable channel activity indicators" ), - ui_fx_tw ); - disable_ch_act_ind->move( 10, 20 ); - disable_ch_act_ind->setChecked( m_disableChActInd ); - connect( disable_ch_act_ind, SIGNAL( toggled( bool ) ), - this, SLOT( toggleDisableChActInd( bool ) ) ); - + ui_fx_tw->setFixedHeight( 80 ); ledCheckBox * smoothScroll = new ledCheckBox( tr( "Smooth scroll in Song Editor" ), ui_fx_tw ); - smoothScroll->move( 10, 40 ); + smoothScroll->move( 10, 20 ); smoothScroll->setChecked( m_smoothScroll ); connect( smoothScroll, SIGNAL( toggled( bool ) ), this, SLOT( toggleSmoothScroll( bool ) ) ); @@ -532,7 +521,7 @@ setupDialog::setupDialog( ConfigTabs _tab_to_open ) : ledCheckBox * autoSave = new ledCheckBox( tr( "Enable auto save feature" ), ui_fx_tw ); - autoSave->move( 10, 60 ); + autoSave->move( 10, 40 ); autoSave->setChecked( m_enableAutoSave ); connect( autoSave, SIGNAL( toggled( bool ) ), this, SLOT( toggleAutoSave( bool ) ) ); @@ -541,7 +530,7 @@ setupDialog::setupDialog( ConfigTabs _tab_to_open ) : ledCheckBox * animAFP = new ledCheckBox( tr( "Show playback cursor in AudioFileProcessor" ), ui_fx_tw ); - animAFP->move( 10, 80 ); + animAFP->move( 10, 60 ); animAFP->setChecked( m_animateAFP ); connect( animAFP, SIGNAL( toggled( bool ) ), this, SLOT( toggleAnimateAFP( bool ) ) ); @@ -808,9 +797,6 @@ void setupDialog::accept() QString::number( !m_MMPZ ) ); configManager::inst()->setValue( "mixer", "hqaudio", QString::number( m_hqAudioDev ) ); - configManager::inst()->setValue( "ui", - "disablechannelactivityindicators", - QString::number( m_disableChActInd ) ); configManager::inst()->setValue( "ui", "smoothscroll", QString::number( m_smoothScroll ) ); configManager::inst()->setValue( "ui", "enableautosave", @@ -967,14 +953,6 @@ void setupDialog::toggleHQAudioDev( bool _enabled ) -void setupDialog::toggleDisableChActInd( bool _disabled ) -{ - m_disableChActInd = _disabled; -} - - - - void setupDialog::toggleSmoothScroll( bool _enabled ) { m_smoothScroll = _enabled; diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index fd16fc90d..0b55bf53f 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -364,13 +364,6 @@ void InstrumentTrack::processOutEvent( const MidiEvent& event, const MidiTime& t { case MidiNoteOn: m_piano.setKeyState( event.key(), true ); - if( !configManager::inst()->value( "ui", "disablechannelactivityindicators" ).toInt() ) - { - if( m_notes[event.key()] == NULL ) - { - emit newNote(); - } - } k = masterKey( event.key() ); if( k >= 0 && k < NumKeys ) { @@ -380,6 +373,8 @@ void InstrumentTrack::processOutEvent( const MidiEvent& event, const MidiTime& t } ++m_runningMidiNotes[k]; m_instrument->handleMidiEvent( MidiEvent( MidiNoteOn, midiPort()->realOutputChannel(), k, event.velocity() ), time ); + + emit newNote(); } break; From b6e4860fdba3a2085d6ece54ca02abe6e6a2b2d2 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 00:33:51 +0100 Subject: [PATCH 046/110] InstrumentTrack: do not set state of piano in processInEvent() As processInEvent() is responsible for starting/stopping notes, we do not have to set the state of the piano. This is done in processOutEvents() already. --- src/tracks/InstrumentTrack.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index 0b55bf53f..75aff5779 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -237,8 +237,6 @@ void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& ti { if( m_notes[event.key()] == NULL ) { - m_piano.setKeyState( event.key(), true ); - // create temporary note note n; n.setKey( event.key() ); From d2aab11130c6a4c088f670b301f9a51effbc78d0 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 00:35:36 +0100 Subject: [PATCH 047/110] InstrumentTrack: work with transposed MIDI event and key in processOutEvent() In processOutEvent() initialize and use a MidiEvent object with transposed key as well as the key variable. --- src/tracks/InstrumentTrack.cpp | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index 75aff5779..eef1367c2 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -356,38 +356,39 @@ void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& ti void InstrumentTrack::processOutEvent( const MidiEvent& event, const MidiTime& time ) { - int k; + const MidiEvent transposedEvent = applyMasterKey( event ); + const int key = transposedEvent.key(); switch( event.type() ) { case MidiNoteOn: - m_piano.setKeyState( event.key(), true ); - k = masterKey( event.key() ); - if( k >= 0 && k < NumKeys ) + m_piano.setKeyState( event.key(), true ); // event.key() = original key + + if( key >= 0 && key < NumKeys ) { - if( m_runningMidiNotes[k] > 0 ) + if( m_runningMidiNotes[key] > 0 ) { - m_instrument->handleMidiEvent( MidiEvent( MidiNoteOff, midiPort()->realOutputChannel(), k, 0 ), time ); + m_instrument->handleMidiEvent( MidiEvent( MidiNoteOff, midiPort()->realOutputChannel(), key, 0 ), time ); } - ++m_runningMidiNotes[k]; - m_instrument->handleMidiEvent( MidiEvent( MidiNoteOn, midiPort()->realOutputChannel(), k, event.velocity() ), time ); + ++m_runningMidiNotes[key]; + m_instrument->handleMidiEvent( MidiEvent( MidiNoteOn, midiPort()->realOutputChannel(), key, event.velocity() ), time ); emit newNote(); } break; case MidiNoteOff: - m_piano.setKeyState( event.key(), false ); - k = masterKey( event.key() ); - if( k >= 0 && k < NumKeys && --m_runningMidiNotes[k] <= 0 ) + m_piano.setKeyState( event.key(), false ); // event.key() = original key + + if( key >= 0 && key < NumKeys && --m_runningMidiNotes[key] <= 0 ) { - m_runningMidiNotes[k] = qMax( 0, m_runningMidiNotes[k] ); - m_instrument->handleMidiEvent( MidiEvent( MidiNoteOff, midiPort()->realOutputChannel(), k, 0 ), time ); + m_runningMidiNotes[key] = qMax( 0, m_runningMidiNotes[key] ); + m_instrument->handleMidiEvent( MidiEvent( MidiNoteOff, midiPort()->realOutputChannel(), key, 0 ), time ); } break; default: - m_instrument->handleMidiEvent( applyMasterKey( event ), time ); + m_instrument->handleMidiEvent( transposedEvent, time ); break; } From 5808c8b7865cbead5a26a3ff61421a39759396a3 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 00:58:37 +0100 Subject: [PATCH 048/110] NotePlayHandle: fixed minor auto replace typo --- include/note_play_handle.h | 2 +- src/core/note_play_handle.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/note_play_handle.h b/include/note_play_handle.h index e1374276a..859498b69 100644 --- a/include/note_play_handle.h +++ b/include/note_play_handle.h @@ -53,7 +53,7 @@ public: const f_cnt_t _frames, const note & _n, notePlayHandle * _parent = NULL, const bool _part_of_arp = false, - int midiChannel = -1 ); + int midiEventChannel = -1 ); virtual ~notePlayHandle(); virtual void setVolume( const volume_t volume = DefaultVolume ); diff --git a/src/core/note_play_handle.cpp b/src/core/note_play_handle.cpp index c8845b6f6..c22d2c645 100644 --- a/src/core/note_play_handle.cpp +++ b/src/core/note_play_handle.cpp @@ -50,7 +50,7 @@ notePlayHandle::notePlayHandle( InstrumentTrack * _it, const note & _n, notePlayHandle *parent, const bool _part_of_arp, - int MidiEventChannel ) : + int midiEventChannel ) : playHandle( NotePlayHandle, _offset ), note( _n.length(), _n.pos(), _n.key(), _n.getVolume(), _n.getPanning(), _n.detuning() ), @@ -76,7 +76,7 @@ notePlayHandle::notePlayHandle( InstrumentTrack * _it, m_unpitchedFrequency( 0 ), m_baseDetuning( NULL ), m_songGlobalParentOffset( 0 ), - m_midiChannel( MidiEventChannel >= 0 ? MidiEventChannel : instrumentTrack()->midiPort()->realOutputChannel() ) + m_midiChannel( midiEventChannel >= 0 ? midiEventChannel : instrumentTrack()->midiPort()->realOutputChannel() ) { if( isTopNote() ) { From c144a2baa2851d92922a74092489cc47d4aecfb8 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 01:10:18 +0100 Subject: [PATCH 049/110] Instrument: return true in default implementation of handleMidiEvent() Supress warnings about unhandled MIDI events e.g. on PianoView focus out by returning true in Instrument::handleMidiEvent(). --- include/Instrument.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/Instrument.h b/include/Instrument.h index f0ff145c2..0a840daa3 100644 --- a/include/Instrument.h +++ b/include/Instrument.h @@ -101,7 +101,7 @@ public: // MIDI-events inline virtual bool handleMidiEvent( const MidiEvent&, const MidiTime& = MidiTime() ) { - return false; + return true; } virtual QString fullDisplayName() const; From 049951438a6104400f5328ebd3f64b9f3e8e322b Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 01:15:43 +0100 Subject: [PATCH 050/110] Do not pass default time to processInEvent() We introduced default parameters for MidiTime parameters so there's no need to construct them manually. --- src/core/midi/MidiWinMM.cpp | 17 +++++------------ src/gui/PianoView.cpp | 12 ++++++------ src/gui/piano_roll.cpp | 5 ++--- src/tracks/InstrumentTrack.cpp | 13 ++++--------- 4 files changed, 17 insertions(+), 30 deletions(-) diff --git a/src/core/midi/MidiWinMM.cpp b/src/core/midi/MidiWinMM.cpp index 7920bc3e3..3c0eba0c4 100644 --- a/src/core/midi/MidiWinMM.cpp +++ b/src/core/midi/MidiWinMM.cpp @@ -1,7 +1,7 @@ /* * MidiWinMM.cpp - WinMM MIDI client * - * Copyright (c) 2008-2009 Tobias Doerffel + * Copyright (c) 2008-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -231,28 +231,21 @@ void MidiWinMM::handleInputEvent( HMIDIIN _hm, DWORD _ev ) case MidiNoteOn: case MidiNoteOff: case MidiKeyPressure: - ( *it )->processInEvent( - MidiEvent( cmdtype, chan, par1 - KeysPerOctave, - par2 & 0xff, &_hm ), MidiTime() ); + ( *it )->processInEvent( MidiEvent( cmdtype, chan, par1 - KeysPerOctave, par2 & 0xff, &_hm ) ); break; case MidiControlChange: case MidiProgramChange: case MidiChannelPressure: - ( *it )->processInEvent( - MidiEvent( cmdtype, chan, par1, par2 & 0xff, &_hm ), - MidiTime() ); + ( *it )->processInEvent( MidiEvent( cmdtype, chan, par1, par2 & 0xff, &_hm ) ); break; case MidiPitchBend: - ( *it )->processInEvent( - MidiEvent( cmdtype, chan, par1 + par2*128, 0, &_hm ), - MidiTime() ); + ( *it )->processInEvent( MidiEvent( cmdtype, chan, par1 + par2*128, 0, &_hm ) ); break; default: - qWarning( "WinMM-MIDI: unhandled input " - "event %d\n", cmdtype ); + qWarning( "WinMM-MIDI: unhandled input event %d\n", cmdtype ); break; } } diff --git a/src/gui/PianoView.cpp b/src/gui/PianoView.cpp index 771793247..021964b50 100644 --- a/src/gui/PianoView.cpp +++ b/src/gui/PianoView.cpp @@ -465,7 +465,7 @@ void PianoView::mousePressEvent( QMouseEvent * _me ) velocity = MidiMaxVelocity; } // set note on - m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOn, 0, key_num, velocity ), MidiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOn, 0, key_num, velocity ) ); m_piano->setKeyState( key_num, true ); m_lastKey = key_num; @@ -510,7 +510,7 @@ void PianoView::mouseReleaseEvent( QMouseEvent * ) { if( m_piano != NULL ) { - m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOff, 0, m_lastKey, 0 ), MidiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOff, 0, m_lastKey, 0 ) ); m_piano->setKeyState( m_lastKey, false ); } @@ -571,7 +571,7 @@ void PianoView::mouseMoveEvent( QMouseEvent * _me ) { if( m_lastKey != -1 ) { - m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOff, 0, m_lastKey, 0 ), MidiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOff, 0, m_lastKey, 0 ) ); m_piano->setKeyState( m_lastKey, false ); m_lastKey = -1; } @@ -579,7 +579,7 @@ void PianoView::mouseMoveEvent( QMouseEvent * _me ) { if( _me->pos().y() > PIANO_BASE ) { - m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOn, 0, key_num, velocity ), MidiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOn, 0, key_num, velocity ) ); m_piano->setKeyState( key_num, true ); m_lastKey = key_num; } @@ -593,7 +593,7 @@ void PianoView::mouseMoveEvent( QMouseEvent * _me ) } else if( m_piano->isKeyPressed( key_num ) ) { - m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiKeyPressure, 0, key_num, velocity ), MidiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiKeyPressure, 0, key_num, velocity ) ); } } @@ -690,7 +690,7 @@ void PianoView::focusOutEvent( QFocusEvent * ) // hang otherwise for( int i = 0; i < NumKeys; ++i ) { - m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOff, 0, i, 0 ), MidiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOff, 0, i, 0 ) ); m_piano->setKeyState( i, false ); } update(); diff --git a/src/gui/piano_roll.cpp b/src/gui/piano_roll.cpp index bf27071fc..6eace8b46 100644 --- a/src/gui/piano_roll.cpp +++ b/src/gui/piano_roll.cpp @@ -2229,15 +2229,14 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) if( m_noteEditMode == NoteEditVolume ) { n->setVolume( vol ); - m_pattern->instrumentTrack()->processInEvent( - MidiEvent( MidiKeyPressure, 0, n->key(), volumeToMidi( vol ) ), MidiTime() ); + m_pattern->instrumentTrack()->processInEvent( MidiEvent( MidiKeyPressure, 0, n->key(), volumeToMidi( vol ) ) ); } else if( m_noteEditMode == NoteEditPanning ) { n->setPanning( pan ); MidiEvent evt( MidiMetaEvent, 0, n->key(), panningToMidi( pan ) ); evt.setMetaEvent( MidiNotePanning ); - m_pattern->instrumentTrack()->processInEvent( evt, MidiTime() ); + m_pattern->instrumentTrack()->processInEvent( evt ); } } else diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index eef1367c2..aee0c8710 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -1127,9 +1127,7 @@ void InstrumentTrackView::toggleInstrumentWindow( bool _on ) void InstrumentTrackView::activityIndicatorPressed() { - model()->processInEvent( - MidiEvent( MidiNoteOn, 0, DefaultKey, MidiMaxVelocity ), - MidiTime() ); + model()->processInEvent( MidiEvent( MidiNoteOn, 0, DefaultKey, MidiMaxVelocity ) ); } @@ -1137,8 +1135,7 @@ void InstrumentTrackView::activityIndicatorPressed() void InstrumentTrackView::activityIndicatorReleased() { - model()->processInEvent( MidiEvent( MidiNoteOff, 0, DefaultKey, 0 ), - MidiTime() ); + model()->processInEvent( MidiEvent( MidiNoteOff, 0, DefaultKey, 0 ) ); } @@ -1149,8 +1146,7 @@ void InstrumentTrackView::midiInSelected() { if( model() ) { - model()->m_midiPort.setReadable( - m_midiInputAction->isChecked() ); + model()->m_midiPort.setReadable( m_midiInputAction->isChecked() ); } } @@ -1161,8 +1157,7 @@ void InstrumentTrackView::midiOutSelected() { if( model() ) { - model()->m_midiPort.setWritable( - m_midiOutputAction->isChecked() ); + model()->m_midiPort.setWritable( m_midiOutputAction->isChecked() ); } } From 519a29e608da683b0fc77d1317a4fb2f561a47f7 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 01:18:19 +0100 Subject: [PATCH 051/110] SampleBuffer: define OV_EXCLUDE_STATIC_CALLBACKS Define OV_EXCLUDE_STATIC_CALLBACKS in order to suppress compiler warnings about unused static instances when building Win32 version. --- src/core/SampleBuffer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/SampleBuffer.cpp b/src/core/SampleBuffer.cpp index 5b21b220c..674a0a101 100644 --- a/src/core/SampleBuffer.cpp +++ b/src/core/SampleBuffer.cpp @@ -38,6 +38,7 @@ #include +#define OV_EXCLUDE_STATIC_CALLBACKS #ifdef LMMS_HAVE_OGGVORBIS #include #endif From 94f991848e6a3788679018fef64c1f9589a62bd8 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 01:47:29 +0100 Subject: [PATCH 052/110] RemoteVstPlugin: adapted MIDI changes Fixes build failure after recent API changes. Closes #157. --- plugins/vst_base/RemoteVstPlugin.cpp | 48 ++++++++++++++-------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/plugins/vst_base/RemoteVstPlugin.cpp b/plugins/vst_base/RemoteVstPlugin.cpp index 9100de316..cead22b70 100644 --- a/plugins/vst_base/RemoteVstPlugin.cpp +++ b/plugins/vst_base/RemoteVstPlugin.cpp @@ -89,7 +89,7 @@ struct ERect #include "lmms_basics.h" -#include "midi.h" +#include "Midi.h" #include "communication.h" #include "VST_sync_shm.h" @@ -132,8 +132,7 @@ public: virtual void process( const sampleFrame * _in, sampleFrame * _out ); - virtual void processMidiEvent( const midiEvent & _event, - const f_cnt_t _offset ); + virtual void processMidiEvent( const MidiEvent& event, const f_cnt_t offset ); // set given sample-rate for plugin virtual void updateSampleRate() @@ -831,36 +830,37 @@ void RemoteVstPlugin::process( const sampleFrame * _in, sampleFrame * _out ) -void RemoteVstPlugin::processMidiEvent( const midiEvent & _event, - const f_cnt_t _offset ) +void RemoteVstPlugin::processMidiEvent( const MidiEvent& event, const f_cnt_t offset ) { - VstMidiEvent event; + VstMidiEvent vme; - event.type = kVstMidiType; - event.byteSize = 24; - event.deltaFrames = _offset; - event.flags = 0; - event.detune = 0; - event.noteLength = 0; - event.noteOffset = 0; - event.noteOffVelocity = 0; - event.reserved1 = 0; - event.reserved2 = 0; - event.midiData[0] = _event.m_type + _event.m_channel; - switch( _event.m_type ) + vme.type = kVstMidiType; + vme.byteSize = 24; + vme.deltaFrames = offset; + vme.flags = 0; + vme.detune = 0; + vme.noteLength = 0; + vme.noteOffset = 0; + vme.noteOffVelocity = 0; + vme.reserved1 = 0; + vme.reserved2 = 0; + vme.midiData[0] = event.type() + event.channel(); + + switch( event.type() ) { case MidiPitchBend: - event.midiData[1] = _event.m_data.m_param[0] & 0x7f; - event.midiData[2] = _event.m_data.m_param[0] >> 7; + vme.midiData[1] = event.param( 0 ) & 0x7f; + vme.midiData[2] = event.param( 1 ) >> 7; break; // TODO: handle more special cases default: - event.midiData[1] = _event.key(); - event.midiData[2] = _event.velocity(); + vme.midiData[1] = event.key(); + vme.midiData[2] = event.velocity(); break; } - event.midiData[3] = 0; - m_midiEvents.push_back( event ); + vme.midiData[3] = 0; + + m_midiEvents.push_back( vme ); } From 0063b891a88be55ff050497b8149522de52ff3db Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 01:48:15 +0100 Subject: [PATCH 053/110] FileDialog: add EXPORT macro The FileDialog class is used by plugins and therefore needs to be exported for platforms like Win32. --- include/FileDialog.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/include/FileDialog.h b/include/FileDialog.h index ddc231546..f4d81ea3d 100644 --- a/include/FileDialog.h +++ b/include/FileDialog.h @@ -28,7 +28,9 @@ #include -class FileDialog : public QFileDialog +#include "export.h" + +class EXPORT FileDialog : public QFileDialog { Q_OBJECT public: From 417a1566a070e32bab97654f43498c92ad24f472 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 01:48:53 +0100 Subject: [PATCH 054/110] LADSPA/SWH: fixed compiler warnings resulting in Win32 build failure --- plugins/ladspa_effect/swh/CMakeLists.txt | 20 +++++++++++++------- plugins/ladspa_effect/swh/util/blo.c | 2 ++ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/plugins/ladspa_effect/swh/CMakeLists.txt b/plugins/ladspa_effect/swh/CMakeLists.txt index 85621c5dc..5a3e3d0e4 100644 --- a/plugins/ladspa_effect/swh/CMakeLists.txt +++ b/plugins/ladspa_effect/swh/CMakeLists.txt @@ -29,8 +29,14 @@ FOREACH(_item ${PLUGIN_SOURCES}) ENDFOREACH(_item ${PLUGIN_SOURCES}) +IF(LMMS_BUILD_WIN32) + SET(PIC_FLAGS "") +ELSE(LMMS_BUILD_WIN32) + SET(PIC_FLAGS "-fPIC") +ENDIF(LMMS_BUILD_WIN32) + ADD_LIBRARY(iir STATIC util/iir.c) -SET_TARGET_PROPERTIES(iir PROPERTIES COMPILE_FLAGS "-fPIC") +SET_TARGET_PROPERTIES(iir PROPERTIES COMPILE_FLAGS "${PIC_FLAGS}") TARGET_LINK_LIBRARIES(bandpass_a_iir_1893 iir) TARGET_LINK_LIBRARIES(bandpass_iir_1892 iir) TARGET_LINK_LIBRARIES(butterworth_1902 iir) @@ -40,21 +46,21 @@ TARGET_LINK_LIBRARIES(notch_iir_1894 iir) FILE(GLOB GSM_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/gsm/*.c) ADD_LIBRARY(gsm STATIC ${GSM_SOURCES}) -SET_TARGET_PROPERTIES(gsm PROPERTIES COMPILE_FLAGS "-fPIC") +SET_TARGET_PROPERTIES(gsm PROPERTIES COMPILE_FLAGS "${PIC_FLAGS}") TARGET_LINK_LIBRARIES(gsm_1215 gsm) ADD_LIBRARY(gverb STATIC gverb/gverb.c gverb/gverbdsp.c) -SET_TARGET_PROPERTIES(gverb PROPERTIES COMPILE_FLAGS "-fPIC") +SET_TARGET_PROPERTIES(gverb PROPERTIES COMPILE_FLAGS "${PIC_FLAGS}") TARGET_LINK_LIBRARIES(gverb_1216 gverb) ADD_LIBRARY(blo STATIC util/blo.c) -SET_TARGET_PROPERTIES(blo PROPERTIES COMPILE_FLAGS "-fPIC") +SET_TARGET_PROPERTIES(blo PROPERTIES COMPILE_FLAGS "${PIC_FLAGS}") TARGET_LINK_LIBRARIES(hermes_filter_1200 blo) ADD_LIBRARY(rms STATIC util/rms.c) ADD_LIBRARY(db STATIC util/db.c) -SET_TARGET_PROPERTIES(rms PROPERTIES COMPILE_FLAGS "-fPIC") -SET_TARGET_PROPERTIES(db PROPERTIES COMPILE_FLAGS "-fPIC") +SET_TARGET_PROPERTIES(rms PROPERTIES COMPILE_FLAGS "${PIC_FLAGS}") +SET_TARGET_PROPERTIES(db PROPERTIES COMPILE_FLAGS "${PIC_FLAGS}") TARGET_LINK_LIBRARIES(sc1_1425 rms db) TARGET_LINK_LIBRARIES(sc2_1426 rms db) TARGET_LINK_LIBRARIES(sc3_1427 rms db) @@ -63,6 +69,6 @@ TARGET_LINK_LIBRARIES(sc4m_1916 rms db) TARGET_LINK_LIBRARIES(se4_1883 rms db) ADD_LIBRARY(pitchscale STATIC util/pitchscale.c) -SET_TARGET_PROPERTIES(pitchscale PROPERTIES COMPILE_FLAGS "-fPIC") +SET_TARGET_PROPERTIES(pitchscale PROPERTIES COMPILE_FLAGS "${PIC_FLAGS}") TARGET_LINK_LIBRARIES(pitch_scale_1193 pitchscale) TARGET_LINK_LIBRARIES(pitch_scale_1194 pitchscale) diff --git a/plugins/ladspa_effect/swh/util/blo.c b/plugins/ladspa_effect/swh/util/blo.c index b2d05218d..9524d0e87 100644 --- a/plugins/ladspa_effect/swh/util/blo.c +++ b/plugins/ladspa_effect/swh/util/blo.c @@ -48,7 +48,9 @@ blo_h_tables *blo_h_tables_new(int table_size) unsigned int h; size_t all_tables_size = sizeof(float) * (table_size + BLO_TABLE_WR) * (BLO_N_HARMONICS - 1) * 2; +#ifndef WIN32 int shm_fd; +#endif char shm_path[128]; this = malloc(sizeof(blo_h_tables)); From 52270aebc1df6b50f4903a2085403da7b1ab1ca5 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 01:49:33 +0100 Subject: [PATCH 055/110] MidiWinMM: adapted MIDI changes Fixes build failure after recent API changes. --- src/core/midi/MidiWinMM.cpp | 143 +++++++++++++++--------------------- 1 file changed, 60 insertions(+), 83 deletions(-) diff --git a/src/core/midi/MidiWinMM.cpp b/src/core/midi/MidiWinMM.cpp index 3c0eba0c4..a4f52b914 100644 --- a/src/core/midi/MidiWinMM.cpp +++ b/src/core/midi/MidiWinMM.cpp @@ -57,33 +57,28 @@ MidiWinMM::~MidiWinMM() -void MidiWinMM::processOutEvent( const MidiEvent & _me, - const MidiTime & _time, - const MidiPort * _port ) +void MidiWinMM::processOutEvent( const MidiEvent& event, const MidiTime& time, const MidiPort* port ) { - const DWORD shortMsg = ( _me.m_type + _me.channel() ) + - ( ( _me.m_data.m_param[0] & 0xff ) << 8 ) + - ( ( _me.m_data.m_param[1] & 0xff ) << 16 ); + const DWORD shortMsg = ( event.type() + event.channel() ) + + ( ( event.param( 0 ) & 0xff ) << 8 ) + + ( ( event.param( 1 ) & 0xff ) << 16 ); - QStringList out_devs; - for( SubMap::ConstIterator it = m_outputSubs.begin(); - it != m_outputSubs.end(); ++it ) + QStringList outDevs; + for( SubMap::ConstIterator it = m_outputSubs.begin(); it != m_outputSubs.end(); ++it ) { - for( MidiPortList::ConstIterator jt = it.value().begin(); - jt != it.value().end(); ++jt ) + for( MidiPortList::ConstIterator jt = it.value().begin(); jt != it.value().end(); ++jt ) { - if( *jt == _port ) + if( *jt == port ) { - out_devs += it.key(); + outDevs += it.key(); break; } } } - for( QMap::Iterator it = m_outputDevices.begin(); - it != m_outputDevices.end(); ++it ) + for( QMap::Iterator it = m_outputDevices.begin(); it != m_outputDevices.end(); ++it ) { - if( out_devs.contains( *it ) ) + if( outDevs.contains( *it ) ) { midiOutShortMsg( it.key(), shortMsg ); } @@ -93,25 +88,23 @@ void MidiWinMM::processOutEvent( const MidiEvent & _me, -void MidiWinMM::applyPortMode( MidiPort * _port ) +void MidiWinMM::applyPortMode( MidiPort* port ) { // make sure no subscriptions exist which are not possible with // current port-mode - if( !_port->inputEnabled() ) + if( !port->inputEnabled() ) { - for( SubMap::Iterator it = m_inputSubs.begin(); - it != m_inputSubs.end(); ++it ) + for( SubMap::Iterator it = m_inputSubs.begin(); it != m_inputSubs.end(); ++it ) { - it.value().removeAll( _port ); + it.value().removeAll( port ); } } - if( !_port->outputEnabled() ) + if( !port->outputEnabled() ) { - for( SubMap::Iterator it = m_outputSubs.begin(); - it != m_outputSubs.end(); ++it ) + for( SubMap::Iterator it = m_outputSubs.begin(); it != m_outputSubs.end(); ++it ) { - it.value().removeAll( _port ); + it.value().removeAll( port ); } } } @@ -119,105 +112,97 @@ void MidiWinMM::applyPortMode( MidiPort * _port ) -void MidiWinMM::removePort( MidiPort * _port ) +void MidiWinMM::removePort( MidiPort* port ) { - for( SubMap::Iterator it = m_inputSubs.begin(); - it != m_inputSubs.end(); ++it ) + for( SubMap::Iterator it = m_inputSubs.begin(); it != m_inputSubs.end(); ++it ) { - it.value().removeAll( _port ); + it.value().removeAll( port ); } - for( SubMap::Iterator it = m_outputSubs.begin(); - it != m_outputSubs.end(); ++it ) + + for( SubMap::Iterator it = m_outputSubs.begin(); it != m_outputSubs.end(); ++it ) { - it.value().removeAll( _port ); + it.value().removeAll( port ); } - MidiClient::removePort( _port ); + + MidiClient::removePort( port ); } -QString MidiWinMM::sourcePortName( const MidiEvent & _event ) const +QString MidiWinMM::sourcePortName( const MidiEvent& event ) const { - if( _event.sourcePort() ) + if( event.sourcePort() ) { - return m_inputDevices.value( *static_cast( - _event.sourcePort() ) ); + return m_inputDevices.value( *static_cast( event.sourcePort() ) ); } - return MidiClient::sourcePortName( _event ); + + return MidiClient::sourcePortName( event ); } -void MidiWinMM::subscribeReadablePort( MidiPort * _port, - const QString & _dest, - bool _subscribe ) +void MidiWinMM::subscribeReadablePort( MidiPort* port, const QString& dest, bool subscribe ) { - if( _subscribe && _port->inputEnabled() == false ) + if( subscribe && port->inputEnabled() == false ) { - qWarning( "port %s can't be (un)subscribed!\n", - _port->displayName().toAscii().constData() ); + qWarning( "port %s can't be (un)subscribed!\n", port->displayName().toAscii().constData() ); return; } - m_inputSubs[_dest].removeAll( _port ); - if( _subscribe ) + m_inputSubs[dest].removeAll( port ); + if( subscribe ) { - m_inputSubs[_dest].push_back( _port ); + m_inputSubs[dest].push_back( port ); } } -void MidiWinMM::subscribeWritablePort( MidiPort * _port, - const QString & _dest, - bool _subscribe ) +void MidiWinMM::subscribeWritablePort( MidiPort* port, const QString& dest, bool subscribe ) { - if( _subscribe && _port->outputEnabled() == false ) + if( subscribe && port->outputEnabled() == false ) { - qWarning( "port %s can't be (un)subscribed!\n", - _port->displayName().toAscii().constData() ); + qWarning( "port %s can't be (un)subscribed!\n", port->displayName().toAscii().constData() ); return; } - m_outputSubs[_dest].removeAll( _port ); - if( _subscribe ) + m_outputSubs[dest].removeAll( port ); + if( subscribe ) { - m_outputSubs[_dest].push_back( _port ); + m_outputSubs[dest].push_back( port ); } } -void WINAPI CALLBACK MidiWinMM::inputCallback( HMIDIIN _hm, UINT _msg, DWORD_PTR _inst, - DWORD_PTR _param1, DWORD_PTR _param2 ) +void WINAPI CALLBACK MidiWinMM::inputCallback( HMIDIIN hm, UINT msg, DWORD_PTR inst, DWORD_PTR param1, DWORD_PTR param2 ) { - if( _msg == MIM_DATA ) + if( msg == MIM_DATA ) { - ( (MidiWinMM *) _inst )->handleInputEvent( _hm, _param1 ); + ( (MidiWinMM *) inst )->handleInputEvent( hm, param1 ); } } -void MidiWinMM::handleInputEvent( HMIDIIN _hm, DWORD _ev ) +void MidiWinMM::handleInputEvent( HMIDIIN hm, DWORD ev ) { - const int cmd = _ev & 0xff; + const int cmd = ev & 0xff; if( cmd == MidiActiveSensing ) { return; } - const int par1 = ( _ev >> 8 ) & 0xff; - const int par2 = _ev >> 16; - const MidiEventTypes cmdtype = - static_cast( cmd & 0xf0 ); + const int par1 = ( ev >> 8 ) & 0xff; + const int par2 = ev >> 16; + const MidiEventTypes cmdtype = static_cast( cmd & 0xf0 ); const int chan = cmd & 0x0f; - const QString d = m_inputDevices.value( _hm ); + const QString d = m_inputDevices.value( hm ); if( d.isEmpty() || !m_inputSubs.contains( d ) ) { return; @@ -231,21 +216,21 @@ void MidiWinMM::handleInputEvent( HMIDIIN _hm, DWORD _ev ) case MidiNoteOn: case MidiNoteOff: case MidiKeyPressure: - ( *it )->processInEvent( MidiEvent( cmdtype, chan, par1 - KeysPerOctave, par2 & 0xff, &_hm ) ); + ( *it )->processInEvent( MidiEvent( cmdtype, chan, par1 - KeysPerOctave, par2 & 0xff, &hm ) ); break; case MidiControlChange: case MidiProgramChange: case MidiChannelPressure: - ( *it )->processInEvent( MidiEvent( cmdtype, chan, par1, par2 & 0xff, &_hm ) ); + ( *it )->processInEvent( MidiEvent( cmdtype, chan, par1, par2 & 0xff, &hm ) ); break; case MidiPitchBend: - ( *it )->processInEvent( MidiEvent( cmdtype, chan, par1 + par2*128, 0, &_hm ) ); + ( *it )->processInEvent( MidiEvent( cmdtype, chan, par1 + par2*128, 0, &hm ) ); break; default: - qWarning( "WinMM-MIDI: unhandled input event %d\n", cmdtype ); + qWarning( "MidiWinMM: unhandled input event %d\n", cmdtype ); break; } } @@ -258,17 +243,9 @@ void MidiWinMM::updateDeviceList() { closeDevices(); openDevices(); -// if( m_readablePorts != readable_ports ) - { -// m_readablePorts = readable_ports; - emit readablePortsChanged(); - } -// if( m_writablePorts != writable_ports ) - { -// m_writablePorts = writable_ports; - emit writablePortsChanged(); - } + emit readablePortsChanged(); + emit writablePortsChanged(); } @@ -332,8 +309,8 @@ void MidiWinMM::openDevices() -MidiWinMM::setupWidget::setupWidget( QWidget * _parent ) : - MidiClient::setupWidget( MidiWinMM::name(), _parent ) +MidiWinMM::setupWidget::setupWidget( QWidget* parent ) : + MidiClient::setupWidget( MidiWinMM::name(), parent ) { } From ad554ff1e82e5a44da7a9d478314c41c7232b06a Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 02:03:29 +0100 Subject: [PATCH 056/110] sfxr: fixed Win32 build Need time.h for the time() function. --- plugins/sfxr/sfxr.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/sfxr/sfxr.cpp b/plugins/sfxr/sfxr.cpp index 01beac525..c52755c81 100644 --- a/plugins/sfxr/sfxr.cpp +++ b/plugins/sfxr/sfxr.cpp @@ -23,7 +23,8 @@ * Boston, MA 02110-1301 USA. */ -#include +#include +#include #define rnd(n) (rand()%(n+1)) From ba826e4aca4db78c86aa6f2478f985b0ffb17691 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 25 Jan 2014 20:37:23 -0500 Subject: [PATCH 057/110] clearer configure output for libsamplerate --- CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 397eecdeb..15f6cec0e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -303,9 +303,11 @@ IF(WANT_SYSTEM_SR) PKG_CHECK_MODULES(SAMPLERATE samplerate>=0.1.8) IF(SAMPLERATE_FOUND) SET(LMMS_HAVE_SAMPLERATE TRUE) + SET(STATUS_SAMPLERATE "OK") ENDIF(SAMPLERATE_FOUND) ENDIF(WANT_SYSTEM_SR) IF(NOT LMMS_HAVE_SAMPLERATE) + SET(STATUS_SAMPLERATE "bundled") INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src/3rdparty/samplerate) SET(CMAKE_CROSSCOMPILING_ORIG "${CMAKE_CROSSCOMPILING}") SET(CMAKE_CROSSCOMPILING "") @@ -569,8 +571,7 @@ MESSAGE("\n" "Installation Summary\n" "--------------------\n" "* Install Directory : ${CMAKE_INSTALL_PREFIX}\n" -#"* Build type : ${CMAKE_BUILD_TYPE}\n" -"* Use system's libsamplerate : ${LMMS_HAVE_SAMPLERATE}\n" +"* libsamplerate : ${STATUS_SAMPLERATE}\n" ) MESSAGE( From 143c801c717a54a8e5411c9e905fb2ff8797f62a Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 25 Jan 2014 21:33:33 -0500 Subject: [PATCH 058/110] add .mailmap to make git shortlog more accurate --- .mailmap | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .mailmap diff --git a/.mailmap b/.mailmap new file mode 100644 index 000000000..6b6579186 --- /dev/null +++ b/.mailmap @@ -0,0 +1,10 @@ +Tobias Doerffel +Paul Giblock +Paul Giblock +Andrew Kelley +Andrew Kelley +Janne Sinisalo +Raine M. Ekman +Raine M. Ekman +Lukas W +Vesa From 186aedda9310e56b867e4c8e51aeac793d5bfd2e Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 25 Jan 2014 21:54:00 -0500 Subject: [PATCH 059/110] add another mailmap entry --- .mailmap | 1 + 1 file changed, 1 insertion(+) diff --git a/.mailmap b/.mailmap index 6b6579186..067e8929c 100644 --- a/.mailmap +++ b/.mailmap @@ -8,3 +8,4 @@ Raine M. Ekman Raine M. Ekman Lukas W Vesa +Jonathan Aquilina From 15aaf6f4ca9753a4b4c05ccea6e9de4693bd7454 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 25 Jan 2014 22:20:34 -0500 Subject: [PATCH 060/110] add TIMEOUT 1 to git shortlog in configure script For some reason executing git shortlog in Qt Creator cmake project import hangs. This is a workaround so that it is still possible to use Qt Creator without changing the normal build, in which git shortlog will certainly complete in 1 second. --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 15f6cec0e..196cfee9d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -357,7 +357,8 @@ IF(GIT_FOUND) COMMAND ${GIT_EXECUTABLE} shortlog -sne COMMAND cut -c8- OUTPUT_FILE ${CONTRIBUTORS} - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + TIMEOUT 1) ENDIF(GIT_FOUND) SET(lmms_EMBEDDED_RESOURCES ${CMAKE_SOURCE_DIR}/AUTHORS ${CMAKE_SOURCE_DIR}/COPYING ${CONTRIBUTORS}) From 12b153a275606a1fefd24a95ad4f465a4377e4e4 Mon Sep 17 00:00:00 2001 From: Wong Cho Ching Date: Sun, 26 Jan 2014 11:37:43 +0800 Subject: [PATCH 061/110] Added pitch support: Now the pitch knob and the key being pressed have effect on the pitch produced. --- plugins/sfxr/sfxr.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/plugins/sfxr/sfxr.cpp b/plugins/sfxr/sfxr.cpp index 01beac525..b1349b811 100644 --- a/plugins/sfxr/sfxr.cpp +++ b/plugins/sfxr/sfxr.cpp @@ -299,7 +299,7 @@ void SfxrSynth::update( sampleFrame * buffer, const fpp_t frameNum ) { if(ssample>1.0f) ssample=1.0f; if(ssample<-1.0f) ssample=-1.0f; - for( ch_cnt_t j=0; j < DEFAULT_CHANNELS; j++ ) + for( ch_cnt_t j=0; j void sfxrInstrument::playNote(notePlayHandle * _n, sampleFrame * _working_buffer ) { m_synthMutex.lock(); @@ -458,7 +458,19 @@ void sfxrInstrument::playNote(notePlayHandle * _n, sampleFrame * _working_buffer _n->noteOff(); } - static_cast(_n->m_pluginData)->update( _working_buffer, frameNum ); + fpp_t pitchedFrameNum = (_n->frequency()/BaseFreq)*frameNum; + printf("%i", pitchedFrameNum); fflush(stdout); + sampleFrame * pitchedBuffer = new sampleFrame[pitchedFrameNum]; + static_cast(_n->m_pluginData)->update( pitchedBuffer, pitchedFrameNum ); + for( fpp_t i=0; iprocessAudioBuffer( _working_buffer, frameNum, NULL ); From 959d5e98e69c2bd83831143e775edcf446d8c78f Mon Sep 17 00:00:00 2001 From: Wong Cho Ching Date: Sun, 26 Jan 2014 11:38:52 +0800 Subject: [PATCH 062/110] remove debug message --- plugins/sfxr/sfxr.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/sfxr/sfxr.cpp b/plugins/sfxr/sfxr.cpp index b1349b811..9def57048 100644 --- a/plugins/sfxr/sfxr.cpp +++ b/plugins/sfxr/sfxr.cpp @@ -444,7 +444,7 @@ QString sfxrInstrument::nodeName() const -#include + void sfxrInstrument::playNote(notePlayHandle * _n, sampleFrame * _working_buffer ) { m_synthMutex.lock(); @@ -459,7 +459,6 @@ void sfxrInstrument::playNote(notePlayHandle * _n, sampleFrame * _working_buffer } fpp_t pitchedFrameNum = (_n->frequency()/BaseFreq)*frameNum; - printf("%i", pitchedFrameNum); fflush(stdout); sampleFrame * pitchedBuffer = new sampleFrame[pitchedFrameNum]; static_cast(_n->m_pluginData)->update( pitchedBuffer, pitchedFrameNum ); for( fpp_t i=0; i Date: Sat, 25 Jan 2014 23:03:48 -0500 Subject: [PATCH 063/110] fix incorrect type; makes smooth knobs actually smooth --- src/gui/widgets/knob.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/widgets/knob.cpp b/src/gui/widgets/knob.cpp index 1c8dc9eaf..44b4449b5 100644 --- a/src/gui/widgets/knob.cpp +++ b/src/gui/widgets/knob.cpp @@ -379,7 +379,7 @@ void knob::drawKnob( QPainter * _p ) float knob::getValue( const QPoint & _p ) { const float SMOOTH_FACTOR = 0.125f; - int yDist = (_p.y() - m_origMousePos.y()) * SMOOTH_FACTOR; + float yDist = (_p.y() - m_origMousePos.y()) * SMOOTH_FACTOR; if( engine::mainWindow()->isShiftPressed() ) { return m_origValue - (yDist * model()->step()); From d4e5648dca07b8ceb8e05bf53355aaee8130cc94 Mon Sep 17 00:00:00 2001 From: Wong Cho Ching Date: Sun, 26 Jan 2014 12:37:26 +0800 Subject: [PATCH 064/110] Reduced the volume --- plugins/sfxr/sfxr.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/sfxr/sfxr.cpp b/plugins/sfxr/sfxr.cpp index 9def57048..ab1132197 100644 --- a/plugins/sfxr/sfxr.cpp +++ b/plugins/sfxr/sfxr.cpp @@ -293,7 +293,7 @@ void SfxrSynth::update( sampleFrame * buffer, const fpp_t frameNum ) //ssample=ssample/8*master_vol; //ssample*=2.0f*sound_vol; - ssample*=0.05f; + ssample*=0.025f; if(buffer!=NULL) { @@ -445,7 +445,7 @@ QString sfxrInstrument::nodeName() const -void sfxrInstrument::playNote(notePlayHandle * _n, sampleFrame * _working_buffer ) +void sfxrInstrument::playNote( notePlayHandle * _n, sampleFrame * _working_buffer ) { m_synthMutex.lock(); fpp_t frameNum = _n->framesLeftForCurrentPeriod(); From 5816a2ae5d10c962a006029398999e96e6bb15ee Mon Sep 17 00:00:00 2001 From: Wong Cho Ching Date: Sun, 26 Jan 2014 13:29:52 +0800 Subject: [PATCH 065/110] Fixed OpulenZ segfault bug when it is dropped on another instrument. --- plugins/opl2/opl2instrument.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/plugins/opl2/opl2instrument.cpp b/plugins/opl2/opl2instrument.cpp index 2288e0d32..9b7f188a5 100644 --- a/plugins/opl2/opl2instrument.cpp +++ b/plugins/opl2/opl2instrument.cpp @@ -148,6 +148,13 @@ opl2instrument::opl2instrument( InstrumentTrack * _instrument_track ) : emulatorMutex.lock(); theEmulator = new CTemuopl(engine::mixer()->processingSampleRate(), true, false); theEmulator->init(); + + //Initialize voice values + for(int i=0; i<9; ++i) { + voiceNote[i] = OPL2_VOICE_FREE; + voiceLRU[i] = i; + } + // Enable waveform selection theEmulator->write(0x01,0x20); emulatorMutex.unlock(); @@ -162,11 +169,6 @@ opl2instrument::opl2instrument( InstrumentTrack * _instrument_track ) : pitchbend = 0; tuneEqual(69, 440); - for(int i=1; i<9; ++i) { - voiceNote[i] = OPL2_VOICE_FREE; - voiceLRU[i] = i; - } - connect( engine::mixer(), SIGNAL( sampleRateChanged() ), this, SLOT( reloadEmulator() ) ); // Connect knobs From b15942d12021a01d7b549a736ae00a660e5a097b Mon Sep 17 00:00:00 2001 From: Wong Cho Ching Date: Sun, 26 Jan 2014 14:19:33 +0800 Subject: [PATCH 066/110] Amended initialize code --- plugins/opl2/opl2instrument.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/opl2/opl2instrument.cpp b/plugins/opl2/opl2instrument.cpp index 9b7f188a5..50ea98b0a 100644 --- a/plugins/opl2/opl2instrument.cpp +++ b/plugins/opl2/opl2instrument.cpp @@ -150,7 +150,9 @@ opl2instrument::opl2instrument( InstrumentTrack * _instrument_track ) : theEmulator->init(); //Initialize voice values - for(int i=0; i<9; ++i) { + voiceNote[0] = 0; + voiceLRU[0] = 0; + for(int i=1; i<9; ++i) { voiceNote[i] = OPL2_VOICE_FREE; voiceLRU[i] = i; } From b502ae9da484ffa2f685f45f08c87400bf25c9d6 Mon Sep 17 00:00:00 2001 From: Wong Cho Ching Date: Sun, 26 Jan 2014 14:23:32 +0800 Subject: [PATCH 067/110] Changed the placement of code --- plugins/opl2/opl2instrument.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/plugins/opl2/opl2instrument.cpp b/plugins/opl2/opl2instrument.cpp index 50ea98b0a..3c8b425b0 100644 --- a/plugins/opl2/opl2instrument.cpp +++ b/plugins/opl2/opl2instrument.cpp @@ -148,6 +148,9 @@ opl2instrument::opl2instrument( InstrumentTrack * _instrument_track ) : emulatorMutex.lock(); theEmulator = new CTemuopl(engine::mixer()->processingSampleRate(), true, false); theEmulator->init(); + // Enable waveform selection + theEmulator->write(0x01,0x20); + emulatorMutex.unlock(); //Initialize voice values voiceNote[0] = 0; @@ -157,10 +160,6 @@ opl2instrument::opl2instrument( InstrumentTrack * _instrument_track ) : voiceLRU[i] = i; } - // Enable waveform selection - theEmulator->write(0x01,0x20); - emulatorMutex.unlock(); - updatePatch(); // Can the buffer size change suddenly? I bet that would break lots of stuff From 20333ad4ca0ba4a38251b4799ee665a638aebce8 Mon Sep 17 00:00:00 2001 From: Jonathan Aquilina Date: Sun, 26 Jan 2014 09:46:06 +0100 Subject: [PATCH 068/110] added another author to the file --- AUTHORS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/AUTHORS b/AUTHORS index 086d6c3a2..8794e0a0b 100644 --- a/AUTHORS +++ b/AUTHORS @@ -65,3 +65,7 @@ Johannes Lorenz Rubén Ibarra Pastor Developer + +LocoMatt + + 3osc skin developer From c5ab13e5c54bfbfb54d799a1b7e9f8bdacb0515d Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 09:46:20 +0100 Subject: [PATCH 069/110] InstrumentTrack: check for instrument instance in processOutEvent() There are situations where processOutEvent() is being called while loading instrument track settings e.g. when loading the pitch model whose dataChanged() signal is connected to InstrumentTrack::updatePitch() which in turn calls processOutEvent(). At this time we do not have an instrument instance and therefore have to skip processing. Closes #164. --- src/tracks/InstrumentTrack.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index aee0c8710..8cd840ced 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -356,6 +356,12 @@ void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& ti void InstrumentTrack::processOutEvent( const MidiEvent& event, const MidiTime& time ) { + // do nothing if we do not have an instrument instance (e.g. when loading settings) + if( m_instrument == NULL ) + { + return; + } + const MidiEvent transposedEvent = applyMasterKey( event ); const int key = transposedEvent.key(); From 80a58df12435ad97493497c69f3d62816df4e865 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 09:59:25 +0100 Subject: [PATCH 070/110] MidiPort: coding style improvements --- include/MidiPort.h | 47 +++++---- src/core/midi/MidiPort.cpp | 207 +++++++++++++++++-------------------- 2 files changed, 117 insertions(+), 137 deletions(-) diff --git a/include/MidiPort.h b/include/MidiPort.h index c407f1f8f..767dc932e 100644 --- a/include/MidiPort.h +++ b/include/MidiPort.h @@ -73,34 +73,35 @@ public: Output, // from MIDI-event-processor to MIDI-client Duplex // both directions } ; + typedef Modes Mode; - MidiPort( const QString & _name, - MidiClient * _mc, - MidiEventProcessor * _mep, - Model * _parent = NULL, - Modes _mode = Disabled ); + MidiPort( const QString& name, + MidiClient* client, + MidiEventProcessor* eventProcessor, + Model* parent = NULL, + Mode mode = Disabled ); virtual ~MidiPort(); - void setName( const QString & _name ); + void setName( const QString& name ); - inline Modes mode() const + Mode mode() const { return m_mode; } - void setMode( Modes _mode ); + void setMode( Mode mode ); - inline bool inputEnabled() const + bool isInputEnabled() const { return mode() == Input || mode() == Duplex; } - inline bool outputEnabled() const + bool isOutputEnabled() const { return mode() == Output || mode() == Duplex; } - inline int realOutputChannel() const + int realOutputChannel() const { return outputChannel() - 1; } @@ -109,31 +110,29 @@ public: void processOutEvent( const MidiEvent& event, const MidiTime& time = MidiTime() ); - virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); - virtual void loadSettings( const QDomElement & _this ); + virtual void saveSettings( QDomDocument& doc, QDomElement& thisElement ); + virtual void loadSettings( const QDomElement& thisElement ); virtual QString nodeName() const { return "midiport"; } - void subscribeReadablePort( const QString & _port, - bool _subscribe = true ); - void subscribeWritablePort( const QString & _port, - bool _subscribe = true ); + void subscribeReadablePort( const QString& port, bool subscribe = true ); + void subscribeWritablePort( const QString& port, bool subscribe = true ); - const Map & readablePorts() const + const Map& readablePorts() const { return m_readablePorts; } - const Map & writablePorts() const + const Map& writablePorts() const { return m_writablePorts; } - MidiPortMenu * m_readablePortsMenu; - MidiPortMenu * m_writablePortsMenu; + MidiPortMenu* m_readablePortsMenu; + MidiPortMenu* m_writablePortsMenu; public slots: @@ -147,10 +146,10 @@ private slots: private: - MidiClient * m_midiClient; - MidiEventProcessor * m_midiEventProcessor; + MidiClient* m_midiClient; + MidiEventProcessor* m_midiEventProcessor; - Modes m_mode; + Mode m_mode; IntModel m_inputChannelModel; IntModel m_outputChannelModel; diff --git a/src/core/midi/MidiPort.cpp b/src/core/midi/MidiPort.cpp index c798fd265..ffa2c97dd 100644 --- a/src/core/midi/MidiPort.cpp +++ b/src/core/midi/MidiPort.cpp @@ -31,31 +31,25 @@ -MidiPort::MidiPort( const QString & _name, MidiClient * _mc, - MidiEventProcessor * _mep, Model * _parent, - Modes _mode ) : - Model( _parent ), +MidiPort::MidiPort( const QString& name, + MidiClient* client, + MidiEventProcessor* eventProcessor, + Model* parent, + Mode mode ) : + Model( parent ), m_readablePortsMenu( NULL ), m_writablePortsMenu( NULL ), - m_midiClient( _mc ), - m_midiEventProcessor( _mep ), - m_mode( _mode ), - m_inputChannelModel( 0, 0, MidiChannelCount, this, - tr( "Input channel" ) ), - m_outputChannelModel( 1, 1, MidiChannelCount, this, - tr( "Output channel" ) ), - m_inputControllerModel( 0, 0, MidiControllerCount, this, - tr( "Input controller" ) ), - m_outputControllerModel( 0, 0, MidiControllerCount, this, - tr( "Output controller" ) ), - m_fixedInputVelocityModel( -1, -1, MidiMaxVelocity, this, - tr( "Fixed input velocity" ) ), - m_fixedOutputVelocityModel( -1, -1, MidiMaxVelocity, this, - tr( "Fixed output velocity" ) ), - m_fixedOutputNoteModel( -1, -1, MidiMaxNote, this, - tr( "Fixed output note" ) ), - m_outputProgramModel( 1, 1, MidiProgramCount, this, - tr( "Output MIDI program" ) ), + m_midiClient( client ), + m_midiEventProcessor( eventProcessor ), + m_mode( mode ), + m_inputChannelModel( 0, 0, MidiChannelCount, this, tr( "Input channel" ) ), + m_outputChannelModel( 1, 1, MidiChannelCount, this, tr( "Output channel" ) ), + m_inputControllerModel( 0, 0, MidiControllerCount, this, tr( "Input controller" ) ), + m_outputControllerModel( 0, 0, MidiControllerCount, this, tr( "Output controller" ) ), + m_fixedInputVelocityModel( -1, -1, MidiMaxVelocity, this, tr( "Fixed input velocity" ) ), + m_fixedOutputVelocityModel( -1, -1, MidiMaxVelocity, this, tr( "Fixed output velocity" ) ), + m_fixedOutputNoteModel( -1, -1, MidiMaxNote, this, tr( "Fixed output note" ) ), + m_outputProgramModel( 1, 1, MidiProgramCount, this, tr( "Output MIDI program" ) ), m_readableModel( false, this, tr( "Receive MIDI-events" ) ), m_writableModel( false, this, tr( "Send MIDI-events" ) ) { @@ -64,12 +58,9 @@ MidiPort::MidiPort( const QString & _name, MidiClient * _mc, m_readableModel.setValue( m_mode == Input || m_mode == Duplex ); m_writableModel.setValue( m_mode == Output || m_mode == Duplex ); - connect( &m_readableModel, SIGNAL( dataChanged() ), - this, SLOT( updateMidiPortMode() ) ); - connect( &m_writableModel, SIGNAL( dataChanged() ), - this, SLOT( updateMidiPortMode() ) ); - connect( &m_outputProgramModel, SIGNAL( dataChanged() ), - this, SLOT( updateOutputProgram() ) ); + connect( &m_readableModel, SIGNAL( dataChanged() ), this, SLOT( updateMidiPortMode() ) ); + connect( &m_writableModel, SIGNAL( dataChanged() ), this, SLOT( updateMidiPortMode() ) ); + connect( &m_outputProgramModel, SIGNAL( dataChanged() ), this, SLOT( updateOutputProgram() ) ); // when using with non-raw-clients we can provide buttons showing @@ -80,10 +71,8 @@ MidiPort::MidiPort( const QString & _name, MidiClient * _mc, updateWritablePorts(); // we want to get informed about port-changes! - m_midiClient->connectRPChanged( this, - SLOT( updateReadablePorts() ) ); - m_midiClient->connectWPChanged( this, - SLOT( updateWritablePorts() ) ); + m_midiClient->connectRPChanged( this, SLOT( updateReadablePorts() ) ); + m_midiClient->connectWPChanged( this, SLOT( updateWritablePorts() ) ); } updateMidiPortMode(); @@ -105,18 +94,18 @@ MidiPort::~MidiPort() -void MidiPort::setName( const QString & _name ) +void MidiPort::setName( const QString& name ) { - setDisplayName( _name ); + setDisplayName( name ); m_midiClient->applyPortName( this ); } -void MidiPort::setMode( Modes _mode ) +void MidiPort::setMode( Mode mode ) { - m_mode = _mode; + m_mode = mode; m_midiClient->applyPortMode( this ); } @@ -126,7 +115,7 @@ void MidiPort::setMode( Modes _mode ) void MidiPort::processInEvent( const MidiEvent& event, const MidiTime& time ) { // mask event - if( inputEnabled() && + if( isInputEnabled() && ( inputChannel() == 0 || inputChannel()-1 == event.channel() ) ) { MidiEvent inEvent = event; @@ -156,7 +145,7 @@ void MidiPort::processInEvent( const MidiEvent& event, const MidiTime& time ) void MidiPort::processOutEvent( const MidiEvent& event, const MidiTime& time ) { // mask event - if( outputEnabled() && realOutputChannel() == event.channel() ) + if( isOutputEnabled() && realOutputChannel() == event.channel() ) { MidiEvent outEvent = event; @@ -181,27 +170,23 @@ void MidiPort::processOutEvent( const MidiEvent& event, const MidiTime& time ) -void MidiPort::saveSettings( QDomDocument & _doc, QDomElement & _this ) +void MidiPort::saveSettings( QDomDocument& doc, QDomElement& thisElement ) { - m_inputChannelModel.saveSettings( _doc, _this, "inputchannel" ); - m_outputChannelModel.saveSettings( _doc, _this, "outputchannel" ); - m_inputControllerModel.saveSettings( _doc, _this, "inputcontroller" ); - m_outputControllerModel.saveSettings( _doc, _this, "outputcontroller" ); - m_fixedInputVelocityModel.saveSettings( _doc, _this, - "fixedinputvelocity" ); - m_fixedOutputVelocityModel.saveSettings( _doc, _this, - "fixedoutputvelocity" ); - m_fixedOutputNoteModel.saveSettings( _doc, _this, - "fixedoutputnote" ); - m_outputProgramModel.saveSettings( _doc, _this, "outputprogram" ); - m_readableModel.saveSettings( _doc, _this, "readable" ); - m_writableModel.saveSettings( _doc, _this, "writable" ); + m_inputChannelModel.saveSettings( doc, thisElement, "inputchannel" ); + m_outputChannelModel.saveSettings( doc, thisElement, "outputchannel" ); + m_inputControllerModel.saveSettings( doc, thisElement, "inputcontroller" ); + m_outputControllerModel.saveSettings( doc, thisElement, "outputcontroller" ); + m_fixedInputVelocityModel.saveSettings( doc, thisElement, "fixedinputvelocity" ); + m_fixedOutputVelocityModel.saveSettings( doc, thisElement, "fixedoutputvelocity" ); + m_fixedOutputNoteModel.saveSettings( doc, thisElement, "fixedoutputnote" ); + m_outputProgramModel.saveSettings( doc, thisElement, "outputprogram" ); + m_readableModel.saveSettings( doc, thisElement, "readable" ); + m_writableModel.saveSettings( doc, thisElement, "writable" ); - if( inputEnabled() ) + if( isInputEnabled() ) { QString rp; - for( Map::ConstIterator it = m_readablePorts.begin(); - it != m_readablePorts.end(); ++it ) + for( Map::ConstIterator it = m_readablePorts.begin(); it != m_readablePorts.end(); ++it ) { if( it.value() ) { @@ -213,14 +198,13 @@ void MidiPort::saveSettings( QDomDocument & _doc, QDomElement & _this ) { rp.truncate( rp.length() - 1 ); } - _this.setAttribute( "inports", rp ); + thisElement.setAttribute( "inports", rp ); } - if( outputEnabled() ) + if( isOutputEnabled() ) { QString wp; - for( Map::ConstIterator it = m_writablePorts.begin(); - it != m_writablePorts.end(); ++it ) + for( Map::ConstIterator it = m_writablePorts.begin(); it != m_writablePorts.end(); ++it ) { if( it.value() ) { @@ -232,32 +216,31 @@ void MidiPort::saveSettings( QDomDocument & _doc, QDomElement & _this ) { wp.truncate( wp.length() - 1 ); } - _this.setAttribute( "outports", wp ); + thisElement.setAttribute( "outports", wp ); } } -void MidiPort::loadSettings( const QDomElement & _this ) +void MidiPort::loadSettings( const QDomElement& thisElement ) { - m_inputChannelModel.loadSettings( _this, "inputchannel" ); - m_outputChannelModel.loadSettings( _this, "outputchannel" ); - m_inputControllerModel.loadSettings( _this, "inputcontroller" ); - m_outputControllerModel.loadSettings( _this, "outputcontroller" ); - m_fixedInputVelocityModel.loadSettings( _this, "fixedinputvelocity" ); - m_fixedOutputVelocityModel.loadSettings( _this, "fixedoutputvelocity" ); - m_outputProgramModel.loadSettings( _this, "outputprogram" ); - m_readableModel.loadSettings( _this, "readable" ); - m_writableModel.loadSettings( _this, "writable" ); + m_inputChannelModel.loadSettings( thisElement, "inputchannel" ); + m_outputChannelModel.loadSettings( thisElement, "outputchannel" ); + m_inputControllerModel.loadSettings( thisElement, "inputcontroller" ); + m_outputControllerModel.loadSettings( thisElement, "outputcontroller" ); + m_fixedInputVelocityModel.loadSettings( thisElement, "fixedinputvelocity" ); + m_fixedOutputVelocityModel.loadSettings( thisElement, "fixedoutputvelocity" ); + m_outputProgramModel.loadSettings( thisElement, "outputprogram" ); + m_readableModel.loadSettings( thisElement, "readable" ); + m_writableModel.loadSettings( thisElement, "writable" ); // restore connections - if( inputEnabled() ) + if( isInputEnabled() ) { - QStringList rp = _this.attribute( "inports" ).split( ',' ); - for( Map::ConstIterator it = m_readablePorts.begin(); - it != m_readablePorts.end(); ++it ) + QStringList rp = thisElement.attribute( "inports" ).split( ',' ); + for( Map::ConstIterator it = m_readablePorts.begin(); it != m_readablePorts.end(); ++it ) { if( it.value() != ( rp.indexOf( it.key() ) != -1 ) ) { @@ -267,11 +250,10 @@ void MidiPort::loadSettings( const QDomElement & _this ) emit readablePortsChanged(); } - if( outputEnabled() ) + if( isOutputEnabled() ) { - QStringList wp = _this.attribute( "outports" ).split( ',' ); - for( Map::ConstIterator it = m_writablePorts.begin(); - it != m_writablePorts.end(); ++it ) + QStringList wp = thisElement.attribute( "outports" ).split( ',' ); + for( Map::ConstIterator it = m_writablePorts.begin(); it != m_writablePorts.end(); ++it ) { if( it.value() != ( wp.indexOf( it.key() ) != -1 ) ) { @@ -285,35 +267,38 @@ void MidiPort::loadSettings( const QDomElement & _this ) -void MidiPort::subscribeReadablePort( const QString & _port, bool _subscribe ) +void MidiPort::subscribeReadablePort( const QString& port, bool subscribe ) { - m_readablePorts[_port] = _subscribe; + m_readablePorts[port] = subscribe; + // make sure, MIDI-port is configured for input - if( _subscribe == true && !inputEnabled() ) + if( subscribe == true && !isInputEnabled() ) { m_readableModel.setValue( true ); } - m_midiClient->subscribeReadablePort( this, _port, _subscribe ); + + m_midiClient->subscribeReadablePort( this, port, subscribe ); } -void MidiPort::subscribeWritablePort( const QString & _port, bool _subscribe ) +void MidiPort::subscribeWritablePort( const QString& port, bool subscribe ) { - m_writablePorts[_port] = _subscribe; + m_writablePorts[port] = subscribe; + // make sure, MIDI-port is configured for output - if( _subscribe == true && !outputEnabled() ) + if( subscribe == true && !isOutputEnabled() ) { m_writableModel.setValue( true ); } - m_midiClient->subscribeWritablePort( this, _port, _subscribe ); + m_midiClient->subscribeWritablePort( this, port, subscribe ); } -void MidiPort::updateMidiPortMode( void ) +void MidiPort::updateMidiPortMode() { // this small lookup-table makes everything easier static const Modes modeTable[2][2] = @@ -324,10 +309,9 @@ void MidiPort::updateMidiPortMode( void ) setMode( modeTable[m_readableModel.value()][m_writableModel.value()] ); // check whether we have to dis-check items in connection-menu - if( !inputEnabled() ) + if( !isInputEnabled() ) { - for( Map::ConstIterator it = m_readablePorts.begin(); - it != m_readablePorts.end(); ++it ) + for( Map::ConstIterator it = m_readablePorts.begin(); it != m_readablePorts.end(); ++it ) { // subscribed? if( it.value() ) @@ -337,10 +321,9 @@ void MidiPort::updateMidiPortMode( void ) } } - if( !outputEnabled() ) + if( !isOutputEnabled() ) { - for( Map::ConstIterator it = m_writablePorts.begin(); - it != m_writablePorts.end(); ++it ) + for( Map::ConstIterator it = m_writablePorts.begin(); it != m_writablePorts.end(); ++it ) { // subscribed? if( it.value() ) @@ -360,42 +343,41 @@ void MidiPort::updateMidiPortMode( void ) -void MidiPort::updateReadablePorts( void ) +void MidiPort::updateReadablePorts() { // first save all selected ports - QStringList selected_ports; - for( Map::ConstIterator it = m_readablePorts.begin(); - it != m_readablePorts.end(); ++it ) + QStringList selectedPorts; + for( Map::ConstIterator it = m_readablePorts.begin(); it != m_readablePorts.end(); ++it ) { - if( it.value() == true ) + if( it.value() ) { - selected_ports.push_back( it.key() ); + selectedPorts.push_back( it.key() ); } } m_readablePorts.clear(); - const QStringList & wp = m_midiClient->readablePorts(); + const QStringList& wp = m_midiClient->readablePorts(); // now insert new ports and restore selections for( QStringList::ConstIterator it = wp.begin(); it != wp.end(); ++it ) { - m_readablePorts[*it] = ( selected_ports.indexOf( *it ) != -1 ); + m_readablePorts[*it] = ( selectedPorts.indexOf( *it ) != -1 ); } + emit readablePortsChanged(); } -void MidiPort::updateWritablePorts( void ) +void MidiPort::updateWritablePorts() { // first save all selected ports - QStringList selected_ports; - for( Map::ConstIterator it = m_writablePorts.begin(); - it != m_writablePorts.end(); ++it ) + QStringList selectedPorts; + for( Map::ConstIterator it = m_writablePorts.begin(); it != m_writablePorts.end(); ++it ) { - if( it.value() == true ) + if( it.value() ) { - selected_ports.push_back( it.key() ); + selectedPorts.push_back( it.key() ); } } @@ -404,19 +386,18 @@ void MidiPort::updateWritablePorts( void ) // now insert new ports and restore selections for( QStringList::ConstIterator it = wp.begin(); it != wp.end(); ++it ) { - m_writablePorts[*it] = ( selected_ports.indexOf( *it ) != -1 ); + m_writablePorts[*it] = ( selectedPorts.indexOf( *it ) != -1 ); } + emit writablePortsChanged(); } -void MidiPort::updateOutputProgram( void ) +void MidiPort::updateOutputProgram() { - processOutEvent( MidiEvent( MidiProgramChange, - realOutputChannel(), - outputProgram()-1 ), MidiTime( 0 ) ); + processOutEvent( MidiEvent( MidiProgramChange, realOutputChannel(), outputProgram()-1 ) ); } From 5d1335f3900f873596fbe025695eef8c13b8352d Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 10:04:03 +0100 Subject: [PATCH 071/110] RemoteVstPlugin: fix build failure due to out-of-bounds-array-access-warning Newer versions of GCC seem to assume an array size of 0 for arrays whose size is not specified explicitely. This causes a warning about an out-of-bounds array access. --- include/aeffectx.h | 2 +- plugins/vst_base/RemoteVstPlugin.cpp | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/include/aeffectx.h b/include/aeffectx.h index 393249b03..4188bf41a 100644 --- a/include/aeffectx.h +++ b/include/aeffectx.h @@ -175,7 +175,7 @@ public: // 04 void *reserved; // 08 - VstEvent * events[]; + VstEvent* events[1]; } ; diff --git a/plugins/vst_base/RemoteVstPlugin.cpp b/plugins/vst_base/RemoteVstPlugin.cpp index cead22b70..9d1b278c3 100644 --- a/plugins/vst_base/RemoteVstPlugin.cpp +++ b/plugins/vst_base/RemoteVstPlugin.cpp @@ -773,16 +773,15 @@ void RemoteVstPlugin::process( const sampleFrame * _in, sampleFrame * _out ) // dispatcher-call, so we create static copies of the // data and post them #define MIDI_EVENT_BUFFER_COUNT 1024 - static char event_buf[sizeof( VstMidiEvent * ) * - MIDI_EVENT_BUFFER_COUNT + - sizeof( VstEvents )]; + static char eventsBuffer[sizeof( VstEvents ) + sizeof( VstMidiEvent * ) * MIDI_EVENT_BUFFER_COUNT]; static VstMidiEvent vme[MIDI_EVENT_BUFFER_COUNT]; - VstEvents * events = (VstEvents *) event_buf; + + VstEvents* events = (VstEvents *) eventsBuffer; events->reserved = 0; events->numEvents = m_midiEvents.size(); + int idx = 0; - for( VstMidiEventList::iterator it = m_midiEvents.begin(); - it != m_midiEvents.end(); ++it, ++idx ) + for( VstMidiEventList::iterator it = m_midiEvents.begin(); it != m_midiEvents.end(); ++it, ++idx ) { memcpy( &vme[idx], &*it, sizeof( VstMidiEvent ) ); events->events[idx] = (VstEvent *) &vme[idx]; From 4ba5edc32c35b07f6a2e3d9f876b2ee4fff3da7a Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 10:17:10 +0100 Subject: [PATCH 072/110] InstrumentTrack: generally do not forward NoteOn/NoteOff/KeyPressure events If we receive MidiNoteOn, MidiNoteOff or MidiKeyPressure events we always kind of handle them in processInEvent() so do not forward them to the instrument. This fixes a freeze when loading VST plugins as PianoView::focusOutEvent() tried to send MIDI events to the not yet completely loaded and thus locked VST plugin. Closes #160. --- src/tracks/InstrumentTrack.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index 8cd840ced..a326716fc 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -251,10 +251,9 @@ void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& ti } emit noteOn( n ); - - eventHandled = true; - } + + eventHandled = true; break; } @@ -277,20 +276,19 @@ void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& ti // be deleted later automatically) nph->noteOff(); m_notes[event.key()] = NULL; - - eventHandled = true; } + eventHandled = true; break; } case MidiKeyPressure: if( m_notes[event.key()] != NULL ) { - eventHandled = true; // setVolume() calls processOutEvent() with MidiKeyPressure so the // attached instrument will receive the event as well m_notes[event.key()]->setVolume( event.volume() ); } + eventHandled = true; break; case MidiPitchBend: From f519bec995c58295870bb0863879466fb2855066 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 12:34:12 +0100 Subject: [PATCH 073/110] MainWindow: remove undo/redo actions from edit menu for the time being As undo/redo are not working properly at the moment, do not expose according menu items to the user. This will be fixed in upcoming releases. Closes #152. --- src/gui/MainWindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 682be6868..8a92a5c76 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -275,7 +275,7 @@ void MainWindow::finalize( void ) QMenu * edit_menu = new QMenu( this ); menuBar()->addMenu( edit_menu )->setText( tr( "&Edit" ) ); - edit_menu->addAction( embed::getIconPixmap( "edit_undo" ), +/* edit_menu->addAction( embed::getIconPixmap( "edit_undo" ), tr( "Undo" ), this, SLOT( undo() ), Qt::CTRL + Qt::Key_Z ); @@ -283,7 +283,7 @@ void MainWindow::finalize( void ) tr( "Redo" ), this, SLOT( redo() ), Qt::CTRL + Qt::Key_R ); - edit_menu->addSeparator(); + edit_menu->addSeparator();*/ edit_menu->addAction( embed::getIconPixmap( "setup_general" ), tr( "Settings" ), this, SLOT( showSettingsDialog() ) ); From 91d73bba2b4bebb5f90c2c0926da7044efe55c78 Mon Sep 17 00:00:00 2001 From: Wong Cho Ching Date: Sun, 26 Jan 2014 19:40:52 +0800 Subject: [PATCH 074/110] Fixes segfault when clearSelection() is called with a new instance of FileDialog --- src/gui/dialogs/FileDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/dialogs/FileDialog.cpp b/src/gui/dialogs/FileDialog.cpp index ba25bf80e..2cd28a523 100644 --- a/src/gui/dialogs/FileDialog.cpp +++ b/src/gui/dialogs/FileDialog.cpp @@ -59,7 +59,7 @@ FileDialog::FileDialog( QWidget *parent, const QString &caption, void FileDialog::clearSelection() { - static QListView *view = findChild(); + QListView *view = findChild() Q_ASSERT( view ); view->clearSelection(); } From e4cca6a0b34e70f1c8f5ebda32e0808cb81c6aaa Mon Sep 17 00:00:00 2001 From: Wong Cho Ching Date: Sun, 26 Jan 2014 20:45:34 +0800 Subject: [PATCH 075/110] Added semi-colon to make it build --- src/gui/dialogs/FileDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/dialogs/FileDialog.cpp b/src/gui/dialogs/FileDialog.cpp index 2cd28a523..ad77018cc 100644 --- a/src/gui/dialogs/FileDialog.cpp +++ b/src/gui/dialogs/FileDialog.cpp @@ -59,7 +59,7 @@ FileDialog::FileDialog( QWidget *parent, const QString &caption, void FileDialog::clearSelection() { - QListView *view = findChild() + QListView *view = findChild(); Q_ASSERT( view ); view->clearSelection(); } From bd6fb03d44e2d546c6661c8d9fd6e5d76d48c703 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 14:02:05 +0100 Subject: [PATCH 076/110] Midi: added constants for pitch bend --- include/Midi.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/Midi.h b/include/Midi.h index 25a9fecc8..c2459223b 100644 --- a/include/Midi.h +++ b/include/Midi.h @@ -119,4 +119,7 @@ const int MidiMaxNote = 127; const int MidiMaxPanning = 127; const int MidiMinPanning = -128; +const int MidiMinPitchBend = 0; +const int MidiMaxPitchBend = 16383; + #endif From a3c7f983a34f946e968c5592704a600a09f31947 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 14:02:51 +0100 Subject: [PATCH 077/110] New header file Pitch.h for pitch-related data types and helpers --- include/Pitch.h | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 include/Pitch.h diff --git a/include/Pitch.h b/include/Pitch.h new file mode 100644 index 000000000..dc479857e --- /dev/null +++ b/include/Pitch.h @@ -0,0 +1,38 @@ +/* + * Pitch.h - declaration of some constants and types concerning instrument pitch + * + * Copyright (c) 2014 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _PITCH_H +#define _PITCH_H + +#include "lmms_basics.h" +#include "Midi.h" + +typedef int16_t pitch_t; + +const pitch_t CentsPerSemitone = 100; +const pitch_t MinPitchDefault = -CentsPerSemitone; +const pitch_t MaxPitchDefault = CentsPerSemitone; +const pitch_t DefaultPitch = 0; + +#endif From 99ea20463e7534ae3673111ac3230c5d0e94fecd Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 14:03:25 +0100 Subject: [PATCH 078/110] InstrumentTrack: fixed midiPitch() and added midiPitchRange() --- include/InstrumentTrack.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/include/InstrumentTrack.h b/include/InstrumentTrack.h index 0217cb19a..4057d7990 100644 --- a/include/InstrumentTrack.h +++ b/include/InstrumentTrack.h @@ -34,6 +34,7 @@ #include "note_play_handle.h" #include "Piano.h" #include "PianoView.h" +#include "Pitch.h" #include "track.h" @@ -111,7 +112,13 @@ public: // translate pitch to midi-pitch [0,16383] int midiPitch() const { - return (int)( ( m_pitchModel.value()+100 ) * 16383 ) / 200; + return static_cast( ( ( m_pitchModel.value() + m_pitchModel.range()/2 ) * MidiMaxPitchBend ) / m_pitchModel.range() ); + } + + /*! \brief Returns current range for pitch bend in semitones */ + int midiPitchRange() const + { + return m_pitchRangeModel.value(); } // play everything in given frame-range - creates note-play-handles From c77531fef23df80636434287cdc45ffd1588128a Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 14:03:43 +0100 Subject: [PATCH 079/110] Midi: added constants for Register Parameter Numbers (RPN) support --- include/Midi.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/include/Midi.h b/include/Midi.h index c2459223b..1b6b69383 100644 --- a/include/Midi.h +++ b/include/Midi.h @@ -87,6 +87,7 @@ enum MidiStandardControllers MidiControllerBreathController = 2, MidiControllerFootController = 4, MidiControllerPortamentoTime = 5, + MidiControllerDataEntry = 6, MidiControllerMainVolume = 7, MidiControllerBalance = 8, MidiControllerPan = 10, @@ -97,6 +98,8 @@ enum MidiStandardControllers MidiControllerSostenuto = 66, MidiControllerSoftPedal = 67, MidiControllerLegatoFootswitch = 68, + MidiControllerRegisteredParameterNumberLSB = 100, + MidiControllerRegisteredParameterNumberMSB = 101, // Channel Mode Messages are controllers too... MidiControllerAllSoundOff = 120, MidiControllerResetAllControllers = 121, @@ -109,6 +112,17 @@ enum MidiStandardControllers }; +enum MidiControllerRegisteredParameterNumbers +{ + MidiPitchBendSensitivityRPN = 0x0000, + MidiChannelFineTuningRPN = 0x0001, + MidiChannelCoarseTuningRPN = 0x0002, + MidiTuningProgramChangeRPN = 0x0003, + MidiTuningBankSelectRPN = 0x0004, + MidiModulationDepthRangeRPN = 0x0005, + MidiNullFunctionNumberRPN = 0x7F7F +}; + const int MidiChannelCount = 16; const int MidiControllerCount = 128; const int MidiProgramCount = 128; From 8c9778c945aad25936594fd08680f50923610d93 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 14:05:22 +0100 Subject: [PATCH 080/110] AutomatableModel: do not change init value when adjusting range This causes e.g. the default value of the pitch model to be changed when changing the pitch range. --- src/core/AutomatableModel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/AutomatableModel.cpp b/src/core/AutomatableModel.cpp index a9a3b5147..56791ade4 100644 --- a/src/core/AutomatableModel.cpp +++ b/src/core/AutomatableModel.cpp @@ -253,7 +253,7 @@ void AutomatableModel::setRange( const float min, const float max, setStep( step ); // re-adjust value - setInitValue( value() ); + setValue( value() ); emit propertiesChanged(); } From 0e00fc6aa129a67d508ed38594a93292987c47b0 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 14:06:46 +0100 Subject: [PATCH 081/110] InstrumentTrack: replaced numbers by newly introduced constants --- src/tracks/InstrumentTrack.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index a326716fc..8edb4ac62 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -103,7 +103,7 @@ InstrumentTrack::InstrumentTrack( TrackContainer* tc ) : tr( "Base note" ) ), m_volumeModel( DefaultVolume, MinVolume, MaxVolume, 0.1f, this, tr( "Volume" ) ), m_panningModel( DefaultPanning, PanningLeft, PanningRight, 0.1f, this, tr( "Panning" ) ), - m_pitchModel( 0, -100, 100, 1, this, tr( "Pitch" ) ), + m_pitchModel( 0, MinPitchDefault, MaxPitchDefault, 1, this, tr( "Pitch" ) ), m_pitchRangeModel( 1, 1, 24, this, tr( "Pitch range" ) ), m_effectChannelModel( 0, 0, NumFxChannels, this, tr( "FX channel" ) ), m_instrument( NULL ), @@ -294,7 +294,7 @@ void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& ti case MidiPitchBend: // updatePitch() is connected to m_pitchModel::dataChanged() which will send out // MidiPitchBend events - m_pitchModel.setValue( m_pitchModel.minValue() + event.pitchBend() * m_pitchModel.range() / 16384 ); + m_pitchModel.setValue( m_pitchModel.minValue() + event.pitchBend() * m_pitchModel.range() / MidiMaxPitchBend ); break; case MidiControlChange: From 52d2274e193ef809e57aebbfb300ec9d537c6653 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 14:07:06 +0100 Subject: [PATCH 082/110] InstrumentTrack: coding style fixes --- src/tracks/InstrumentTrack.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index 8edb4ac62..6072c42d5 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -533,7 +533,8 @@ void InstrumentTrack::updateBaseNote() void InstrumentTrack::updatePitch() { updateBaseNote(); - processOutEvent( MidiEvent( MidiPitchBend, midiPort()->realOutputChannel(), midiPitch() ), 0 ); + + processOutEvent( MidiEvent( MidiPitchBend, midiPort()->realOutputChannel(), midiPitch() ) ); } From 0a5665ae160db6c861a2788ceac467fa4b356099 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 14:07:15 +0100 Subject: [PATCH 083/110] InstrumentTrack: send RPN update in updatePitchRange() When changing the pitch range all we can do for MIDI is to update the MIDI pitch bend sensitivity RPN even though this is only supported by some MIDI instruments. Closes #129. --- src/tracks/InstrumentTrack.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index 6072c42d5..7a309c93b 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -543,7 +543,13 @@ void InstrumentTrack::updatePitch() void InstrumentTrack::updatePitchRange() { const int r = m_pitchRangeModel.value(); - m_pitchModel.setRange( -100 * r, 100 * r ); + m_pitchModel.setRange( -MinPitchDefault * r, MaxPitchDefault * r ); + + processOutEvent( MidiEvent( MidiControlChange, midiPort()->realOutputChannel(), + MidiControllerRegisteredParameterNumberLSB, MidiPitchBendSensitivityRPN & 0x7F ) ); + processOutEvent( MidiEvent( MidiControlChange, midiPort()->realOutputChannel(), + MidiControllerRegisteredParameterNumberMSB, ( MidiPitchBendSensitivityRPN >> 8 ) & 0x7F ) ); + processOutEvent( MidiEvent( MidiControlChange, midiPort()->realOutputChannel(), MidiControllerDataEntry, midiPitchRange() ) ); } From 43f76f535780b6de6bc2b1df8fcea32fae12ed99 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 14:09:05 +0100 Subject: [PATCH 084/110] Sf2Player: update pitch wheel sensitivity based on pitch range Fluidsynth supports setting the pitch wheel sensitivity, therefore make use of it and set values from the recently introduced pitch range model. --- plugins/sf2_player/sf2_player.cpp | 16 +++++++++++++--- plugins/sf2_player/sf2_player.h | 1 + 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/plugins/sf2_player/sf2_player.cpp b/plugins/sf2_player/sf2_player.cpp index 9091cafef..368a9779b 100644 --- a/plugins/sf2_player/sf2_player.cpp +++ b/plugins/sf2_player/sf2_player.cpp @@ -87,7 +87,8 @@ sf2Instrument::sf2Instrument( InstrumentTrack * _instrument_track ) : m_font( NULL ), m_fontId( 0 ), m_filename( "" ), - m_lastMidiPitch( 8192 ), + m_lastMidiPitch( -1 ), + m_lastMidiPitchRange( -1 ), m_channel( 1 ), m_bankNum( 0, 0, 999, this, tr("Bank") ), m_patchNum( 0, 0, 127, this, tr("Patch") ), @@ -679,12 +680,21 @@ void sf2Instrument::play( sampleFrame * _working_buffer ) const fpp_t frames = engine::mixer()->framesPerPeriod(); m_synthMutex.lock(); - if( m_lastMidiPitch != instrumentTrack()->midiPitch() ) + + const int currentMidiPitch = instrumentTrack()->midiPitch(); + if( m_lastMidiPitch != currentMidiPitch ) { - m_lastMidiPitch = instrumentTrack()->midiPitch(); + m_lastMidiPitch = currentMidiPitch; fluid_synth_pitch_bend( m_synth, m_channel, m_lastMidiPitch ); } + const int currentMidiPitchRange = instrumentTrack()->midiPitchRange(); + if( m_lastMidiPitchRange != currentMidiPitchRange ) + { + m_lastMidiPitchRange = currentMidiPitchRange; + fluid_synth_pitch_wheel_sens( m_synth, m_channel, m_lastMidiPitchRange ); + } + if( m_internalSampleRate < engine::mixer()->processingSampleRate() && m_srcState != NULL ) { diff --git a/plugins/sf2_player/sf2_player.h b/plugins/sf2_player/sf2_player.h index 903480605..691a2be83 100644 --- a/plugins/sf2_player/sf2_player.h +++ b/plugins/sf2_player/sf2_player.h @@ -129,6 +129,7 @@ private: int m_notesRunning[128]; sample_rate_t m_internalSampleRate; int m_lastMidiPitch; + int m_lastMidiPitchRange; int m_channel; lcdSpinBoxModel m_bankNum; From a5588d2f754b280e23a0ddf514d1f76b3300858e Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 14:11:42 +0100 Subject: [PATCH 085/110] ZynAddSubFX: default pitch wheel bend range to 100 Even though ZynAddSubFX does not support pitch wheel sensitivity RPN events and thus we can't update the pitch range from LMMS automatically, at least default to 100 semitones pitch wheel bend range so behaviour is consistent with default pitch range in LMMS. --- plugins/zynaddsubfx/src/Params/Controller.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/zynaddsubfx/src/Params/Controller.cpp b/plugins/zynaddsubfx/src/Params/Controller.cpp index 9bfa6b47d..e3fb70d8c 100644 --- a/plugins/zynaddsubfx/src/Params/Controller.cpp +++ b/plugins/zynaddsubfx/src/Params/Controller.cpp @@ -35,7 +35,7 @@ Controller::~Controller() void Controller::defaults() { - setpitchwheelbendrange(200); //2 halftones + setpitchwheelbendrange(100); //2 halftones expression.receive = 1; panning.depth = 64; filtercutoff.depth = 64; From 20700b1c715f9af5d46eedad4e9c0ee9ce76c2cd Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 14:22:41 +0100 Subject: [PATCH 086/110] InstrumentTrack: fixed range for pitch model --- src/tracks/InstrumentTrack.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index 7a309c93b..88185a883 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -543,7 +543,7 @@ void InstrumentTrack::updatePitch() void InstrumentTrack::updatePitchRange() { const int r = m_pitchRangeModel.value(); - m_pitchModel.setRange( -MinPitchDefault * r, MaxPitchDefault * r ); + m_pitchModel.setRange( MinPitchDefault * r, MaxPitchDefault * r ); processOutEvent( MidiEvent( MidiControlChange, midiPort()->realOutputChannel(), MidiControllerRegisteredParameterNumberLSB, MidiPitchBendSensitivityRPN & 0x7F ) ); From 29f04d8056c95e0868fe39ba5233f336ff3ae854 Mon Sep 17 00:00:00 2001 From: "Raine M. Ekman" Date: Sun, 26 Jan 2014 16:33:43 +0200 Subject: [PATCH 087/110] OpulenZ: added pitch bend range MIDI message handling --- plugins/opl2/opl2instrument.cpp | 34 +++++++++++++++++++++------------ plugins/opl2/opl2instrument.h | 8 +++++--- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/plugins/opl2/opl2instrument.cpp b/plugins/opl2/opl2instrument.cpp index 3c8b425b0..5f41b6454 100644 --- a/plugins/opl2/opl2instrument.cpp +++ b/plugins/opl2/opl2instrument.cpp @@ -168,6 +168,9 @@ opl2instrument::opl2instrument( InstrumentTrack * _instrument_track ) : // Some kind of sane defaults pitchbend = 0; + pitchBendRange = 100; + RPNcoarse = RPNfine = 255; + tuneEqual(69, 440); connect( engine::mixer(), SIGNAL( sampleRateChanged() ), @@ -257,7 +260,6 @@ void opl2instrument::setVoiceVelocity(int voice, int vel) { theEmulator->write(0x43+adlib_opadd[voice], ( (int)op2_scale_mdl.value() & 0x03 << 6) + ( vel_adjusted & 0x3f ) ); - // printf("vel %d for voice %d (%f)\n",vel_adjusted,voice,op2_lvl_mdl.value() ); } // Pop least recently used voice - why does it sometimes lose a voice (mostly 0)? @@ -267,10 +269,6 @@ int opl2instrument::popVoice() { voiceLRU[i] = voiceLRU[i+1]; } voiceLRU[8] = OPL2_NO_VOICE; - /* printf("pop: %d %d %d %d %d %d %d %d %d \n", - voiceLRU[0],voiceLRU[1],voiceLRU[2], - voiceLRU[3],voiceLRU[4],voiceLRU[5], - voiceLRU[6],voiceLRU[7],voiceLRU[8]); */ return tmp; } @@ -282,10 +280,6 @@ int opl2instrument::pushVoice(int v) { } } voiceLRU[i] = v; - /*printf("%d %d %d %d %d %d %d %d %d \n", - voiceLRU[0],voiceLRU[1],voiceLRU[2], - voiceLRU[3],voiceLRU[4],voiceLRU[5], - voiceLRU[6],voiceLRU[7],voiceLRU[8]); */ return i; } @@ -309,7 +303,6 @@ bool opl2instrument::handleMidiEvent( const MidiEvent& event, const MidiTime& ti setVoiceVelocity(voice, vel); voiceNote[voice] = key; velocities[key] = vel; - // printf("%d %d\n",voice,vel); } break; case MidiNoteOff: @@ -342,9 +335,8 @@ bool opl2instrument::handleMidiEvent( const MidiEvent& event, const MidiTime& ti // tmp_pb = (2*BEND_CENTS)*((float)event.m_data.m_param[0]/16383)-BEND_CENTS; // Something like 100 cents = 8192, but offset by 8192 so the +/-100 cents range goes from 0...16383? - tmp_pb = ( event.pitchBend()-8192 ) * BEND_CENTS / 8192; + tmp_pb = ( event.pitchBend()-8192 ) * pitchBendRange / 8192; - printf("Pitch bend: %d -> %d cents\n",event.pitchBend(),tmp_pb); if( tmp_pb != pitchbend ) { pitchbend = tmp_pb; tuneEqual(69, 440.0); @@ -357,6 +349,24 @@ bool opl2instrument::handleMidiEvent( const MidiEvent& event, const MidiTime& ti } } break; + case MidiControlChange: + switch (event.controllerNumber()) { + case MidiControllerRegisteredParameterNumberLSB: + RPNfine = event.controllerValue(); + break; + case MidiControllerRegisteredParameterNumberMSB: + RPNcoarse = event.controllerValue(); + break; + case MidiControllerDataEntry: + if( (RPNcoarse << 8) + RPNfine == MidiPitchBendSensitivityRPN) { + pitchBendRange = event.controllerValue() * 100; + } + break; + default: + printf("Midi CC %02x %02x\n", event.controllerNumber(), event.controllerValue() ); + break; + } + break; default: printf("Midi event type %d\n",event.type()); } diff --git a/plugins/opl2/opl2instrument.h b/plugins/opl2/opl2instrument.h index 39c9d13c2..9f47a0cfe 100644 --- a/plugins/opl2/opl2instrument.h +++ b/plugins/opl2/opl2instrument.h @@ -36,7 +36,7 @@ #define OPL2_VOICE_FREE 255 #define OPL2_NO_VOICE 255 // The "normal" range for LMMS pitchbends -#define BEND_CENTS 100 +#define DEFAULT_BEND_CENTS 100 class opl2instrument : public Instrument { @@ -119,8 +119,7 @@ private: int fnums[128]; // in cents, range defaults to +/-100 cents (should this be changeable?) int pitchbend; - - + int pitchBendRange; int popVoice(); int pushVoice(int v); @@ -128,6 +127,9 @@ private: int Hz2fnum(float Hz); static QMutex emulatorMutex; void setVoiceVelocity(int voice, int vel); + + // Pitch bend range comes through RPNs. + int RPNcoarse, RPNfine; }; From ad27039b9bbba2ab1095ddd3c163a20a02956c96 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 15:56:10 +0100 Subject: [PATCH 088/110] InstrumentTrack: removed compat code for loading old projects We should not need compat code for project files < 0.4.x anymore. Anybody who wants to load project files made before 2008 is advised to open them in LMMS 0.4.x first and save them so they get upgraded. --- src/tracks/InstrumentTrack.cpp | 51 ++-------------------------------- 1 file changed, 3 insertions(+), 48 deletions(-) diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index 88185a883..56de9a73d 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -755,37 +755,11 @@ void InstrumentTrack::loadTrackSpecificSettings( const QDomElement & _this ) engine::mixer()->lock(); m_volumeModel.loadSettings( _this, "vol" ); - - // compat-hacks - move to mmp::upgrade - if( _this.hasAttribute( "surpos" ) || _this.hasAttribute( "surpos-x" ) - || !_this.firstChildElement( "automationpattern" ). - firstChildElement( "surpos-x" ).isNull() ) - { - surroundAreaModel m( this, this ); - m.loadSettings( _this, "surpos" ); - m_panningModel.setValue( m.x() * 100 / SURROUND_AREA_SIZE ); - } - else - { - m_panningModel.loadSettings( _this, "pan" ); - } - + m_panningModel.loadSettings( _this, "pan" ); m_pitchModel.loadSettings( _this, "pitch" ); m_pitchRangeModel.loadSettings( _this, "pitchrange" ); m_effectChannelModel.loadSettings( _this, "fxch" ); - - if( _this.hasAttribute( "baseoct" ) ) - { - // TODO: move this compat code to mmp.cpp -> upgrade() - m_baseNoteModel.setInitValue( _this. - attribute( "baseoct" ).toInt() - * KeysPerOctave - + _this.attribute( "basetone" ).toInt() ); - } - else - { - m_baseNoteModel.loadSettings( _this, "basenote" ); - } + m_baseNoteModel.loadSettings( _this, "basenote" ); // clear effect-chain just in case we load an old preset without FX-data m_audioPort.effects()->clear(); @@ -826,28 +800,9 @@ void InstrumentTrack::loadTrackSpecificSettings( const QDomElement & _this ) node.firstChildElement() ); emit instrumentChanged(); } - // compat code - if node-name doesn't match any known - // one, we assume that it is an instrument-plugin - // which we'll try to load - else if( AutomationPattern::classNodeName() != node.nodeName() && - ControllerConnection::classNodeName() != node.nodeName() && - !node.toElement().hasAttribute( "id" ) ) - { - delete m_instrument; - m_instrument = NULL; - m_instrument = Instrument::instantiate( - node.nodeName(), this ); - if( m_instrument->nodeName() == - node.nodeName() ) - { - m_instrument->restoreState( - node.toElement() ); - } - emit instrumentChanged(); - } } node = node.nextSibling(); - } + } engine::mixer()->unlock(); } From 7103bb31d69ee4c4d7a72b84c4f14d780598be62 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 16:02:35 +0100 Subject: [PATCH 089/110] InstrumentTrack: more coding style improvements --- src/tracks/InstrumentTrack.cpp | 152 +++++++++++++++++---------------- 1 file changed, 77 insertions(+), 75 deletions(-) diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index 56de9a73d..c05a379f1 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -720,51 +720,50 @@ trackView * InstrumentTrack::createView( TrackContainerView* tcv ) -void InstrumentTrack::saveTrackSpecificSettings( QDomDocument & _doc, - QDomElement & _this ) +void InstrumentTrack::saveTrackSpecificSettings( QDomDocument& doc, QDomElement & thisElement ) { - m_volumeModel.saveSettings( _doc, _this, "vol" ); - m_panningModel.saveSettings( _doc, _this, "pan" ); - m_pitchModel.saveSettings( _doc, _this, "pitch" ); - m_pitchRangeModel.saveSettings( _doc, _this, "pitchrange" ); + m_volumeModel.saveSettings( doc, thisElement, "vol" ); + m_panningModel.saveSettings( doc, thisElement, "pan" ); + m_pitchModel.saveSettings( doc, thisElement, "pitch" ); + m_pitchRangeModel.saveSettings( doc, thisElement, "pitchrange" ); - m_effectChannelModel.saveSettings( _doc, _this, "fxch" ); - m_baseNoteModel.saveSettings( _doc, _this, "basenote" ); + m_effectChannelModel.saveSettings( doc, thisElement, "fxch" ); + m_baseNoteModel.saveSettings( doc, thisElement, "basenote" ); if( m_instrument != NULL ) { - QDomElement i = _doc.createElement( "instrument" ); + QDomElement i = doc.createElement( "instrument" ); i.setAttribute( "name", m_instrument->descriptor()->name ); - m_instrument->saveState( _doc, i ); - _this.appendChild( i ); + m_instrument->saveState( doc, i ); + thisElement.appendChild( i ); } - m_soundShaping.saveState( _doc, _this ); - m_noteStacking.saveState( _doc, _this ); - m_arpeggio.saveState( _doc, _this ); - m_midiPort.saveState( _doc, _this ); - m_audioPort.effects()->saveState( _doc, _this ); + m_soundShaping.saveState( doc, thisElement ); + m_noteStacking.saveState( doc, thisElement ); + m_arpeggio.saveState( doc, thisElement ); + m_midiPort.saveState( doc, thisElement ); + m_audioPort.effects()->saveState( doc, thisElement ); } -void InstrumentTrack::loadTrackSpecificSettings( const QDomElement & _this ) +void InstrumentTrack::loadTrackSpecificSettings( const QDomElement & thisElement ) { silenceAllNotes(); engine::mixer()->lock(); - m_volumeModel.loadSettings( _this, "vol" ); - m_panningModel.loadSettings( _this, "pan" ); - m_pitchModel.loadSettings( _this, "pitch" ); - m_pitchRangeModel.loadSettings( _this, "pitchrange" ); - m_effectChannelModel.loadSettings( _this, "fxch" ); - m_baseNoteModel.loadSettings( _this, "basenote" ); + m_volumeModel.loadSettings( thisElement, "vol" ); + m_panningModel.loadSettings( thisElement, "pan" ); + m_pitchModel.loadSettings( thisElement, "pitch" ); + m_pitchRangeModel.loadSettings( thisElement, "pitchrange" ); + m_effectChannelModel.loadSettings( thisElement, "fxch" ); + m_baseNoteModel.loadSettings( thisElement, "basenote" ); // clear effect-chain just in case we load an old preset without FX-data m_audioPort.effects()->clear(); - QDomNode node = _this.firstChild(); + QDomNode node = thisElement.firstChild(); while( !node.isNull() ) { if( node.isElement() ) @@ -793,11 +792,9 @@ void InstrumentTrack::loadTrackSpecificSettings( const QDomElement & _this ) { delete m_instrument; m_instrument = NULL; - m_instrument = Instrument::instantiate( - node.toElement().attribute( "name" ), - this ); - m_instrument->restoreState( - node.firstChildElement() ); + m_instrument = Instrument::instantiate( node.toElement().attribute( "name" ), this ); + m_instrument->restoreState( node.firstChildElement() ); + emit instrumentChanged(); } } @@ -1326,13 +1323,14 @@ InstrumentTrackWindow::~InstrumentTrackWindow() -void InstrumentTrackWindow::setInstrumentTrackView( InstrumentTrackView * _tv ) +void InstrumentTrackWindow::setInstrumentTrackView( InstrumentTrackView* view ) { - if( m_itv && _tv ) + if( m_itv && view ) { m_itv->m_tlb->setChecked( false ); } - m_itv = _tv; + + m_itv = view; } @@ -1382,28 +1380,27 @@ void InstrumentTrackWindow::modelChanged() void InstrumentTrackWindow::saveSettingsBtnClicked() { - FileDialog sfd( this, tr( "Save preset" ), "", - tr( "XML preset file (*.xpf)" ) ); + FileDialog sfd( this, tr( "Save preset" ), "", tr( "XML preset file (*.xpf)" ) ); - QString preset_root = configManager::inst()->userPresetsDir(); - if( !QDir( preset_root ).exists() ) + QString presetRoot = configManager::inst()->userPresetsDir(); + if( !QDir( presetRoot ).exists() ) { - QDir().mkdir( preset_root ); + QDir().mkdir( presetRoot ); } - if( !QDir( preset_root + m_track->instrumentName() ).exists() ) + if( !QDir( presetRoot + m_track->instrumentName() ).exists() ) { - QDir( preset_root ).mkdir( m_track->instrumentName() ); + QDir( presetRoot ).mkdir( m_track->instrumentName() ); } sfd.setAcceptMode( FileDialog::AcceptSave ); - sfd.setDirectory( preset_root + m_track->instrumentName() ); + sfd.setDirectory( presetRoot + m_track->instrumentName() ); sfd.setFileMode( FileDialog::AnyFile ); - if( sfd.exec () == QDialog::Accepted && - !sfd.selectedFiles().isEmpty() && sfd.selectedFiles()[0] != "" - ) + + if( sfd.exec() == QDialog::Accepted && + !sfd.selectedFiles().isEmpty() && + !sfd.selectedFiles().first().isEmpty() ) { - multimediaProject mmp( - multimediaProject::InstrumentTrackSettings ); + multimediaProject mmp( multimediaProject::InstrumentTrackSettings ); m_track->setSimpleSerializing(); m_track->saveSettings( mmp, mmp.content() ); QString f = sfd.selectedFiles()[0]; @@ -1434,8 +1431,7 @@ void InstrumentTrackWindow::updateInstrumentView() delete m_instrumentView; if( m_track->m_instrument != NULL ) { - m_instrumentView = m_track->m_instrument->createView( - m_tabWidget ); + m_instrumentView = m_track->m_instrument->createView( m_tabWidget ); m_tabWidget->addTab( m_instrumentView, tr( "PLUGIN" ), 0 ); m_tabWidget->setActiveTab( 0 ); @@ -1447,19 +1443,18 @@ void InstrumentTrackWindow::updateInstrumentView() -void InstrumentTrackWindow::textChanged( const QString & _new_name ) +void InstrumentTrackWindow::textChanged( const QString& newName ) { - m_track->setName( _new_name ); + m_track->setName( newName ); engine::getSong()->setModified(); } -void InstrumentTrackWindow::toggleVisibility( bool _on ) +void InstrumentTrackWindow::toggleVisibility( bool on ) { - - if( _on ) + if( on ) { show(); parentWidget()->show(); @@ -1474,9 +1469,10 @@ void InstrumentTrackWindow::toggleVisibility( bool _on ) -void InstrumentTrackWindow::closeEvent( QCloseEvent * _ce ) +void InstrumentTrackWindow::closeEvent( QCloseEvent* event ) { - _ce->ignore(); + event->ignore(); + if( engine::mainWindow()->workspace() ) { parentWidget()->hide(); @@ -1485,6 +1481,7 @@ void InstrumentTrackWindow::closeEvent( QCloseEvent * _ce ) { hide(); } + m_itv->m_tlb->setFocus(); m_itv->m_tlb->setChecked( false ); } @@ -1492,7 +1489,7 @@ void InstrumentTrackWindow::closeEvent( QCloseEvent * _ce ) -void InstrumentTrackWindow::focusInEvent( QFocusEvent * ) +void InstrumentTrackWindow::focusInEvent( QFocusEvent* ) { m_pianoView->setFocus(); } @@ -1500,32 +1497,34 @@ void InstrumentTrackWindow::focusInEvent( QFocusEvent * ) -void InstrumentTrackWindow::dragEnterEventGeneric( QDragEnterEvent * _dee ) +void InstrumentTrackWindow::dragEnterEventGeneric( QDragEnterEvent* event ) { - stringPairDrag::processDragEnterEvent( _dee, "instrument,presetfile," - "pluginpresetfile" ); + stringPairDrag::processDragEnterEvent( event, "instrument,presetfile,pluginpresetfile" ); } -void InstrumentTrackWindow::dragEnterEvent( QDragEnterEvent * _dee ) +void InstrumentTrackWindow::dragEnterEvent( QDragEnterEvent* event ) { - dragEnterEventGeneric( _dee ); + dragEnterEventGeneric( event ); } -void InstrumentTrackWindow::dropEvent( QDropEvent * _de ) +void InstrumentTrackWindow::dropEvent( QDropEvent* event ) { - QString type = stringPairDrag::decodeKey( _de ); - QString value = stringPairDrag::decodeValue( _de ); + QString type = stringPairDrag::decodeKey( event ); + QString value = stringPairDrag::decodeValue( event ); + if( type == "instrument" ) { m_track->loadInstrument( value ); + engine::getSong()->setModified(); - _de->accept(); + + event->accept(); } else if( type == "presetfile" ) { @@ -1533,40 +1532,43 @@ void InstrumentTrackWindow::dropEvent( QDropEvent * _de ) InstrumentTrack::removeMidiPortNode( mmp ); m_track->setSimpleSerializing(); m_track->loadSettings( mmp.content().toElement() ); + engine::getSong()->setModified(); - _de->accept(); + + event->accept(); } else if( type == "pluginpresetfile" ) { const QString ext = fileItem::extension( value ); Instrument * i = m_track->instrument(); + if( !i->descriptor()->supportsFileType( ext ) ) { - i = m_track->loadInstrument( - engine::pluginFileHandling()[ext] ); + i = m_track->loadInstrument( engine::pluginFileHandling()[ext] ); } + i->loadFile( value ); - _de->accept(); + + event->accept(); } } -void InstrumentTrackWindow::saveSettings( QDomDocument & _doc, - QDomElement & _this ) +void InstrumentTrackWindow::saveSettings( QDomDocument& doc, QDomElement & thisElement ) { - _this.setAttribute( "tab", m_tabWidget->activeTab() ); - MainWindow::saveWidgetState( this, _this ); + thisElement.setAttribute( "tab", m_tabWidget->activeTab() ); + MainWindow::saveWidgetState( this, thisElement ); } -void InstrumentTrackWindow::loadSettings( const QDomElement & _this ) +void InstrumentTrackWindow::loadSettings( const QDomElement& thisElement ) { - m_tabWidget->setActiveTab( _this.attribute( "tab" ).toInt() ); - MainWindow::restoreWidgetState( this, _this ); + m_tabWidget->setActiveTab( thisElement.attribute( "tab" ).toInt() ); + MainWindow::restoreWidgetState( this, thisElement ); if( isVisible() ) { m_itv->m_tlb->setChecked( true ); From 725ff59f0edb800d9ab3ef400680cfe2f313f433 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 16:44:54 +0100 Subject: [PATCH 090/110] NotePlayHandle: added property to track origin Using the origin property we can track where a NotePlayHandle instance originates from (Pattern, MIDI, ...) and build new functions around this. --- include/note_play_handle.h | 13 ++++++++++++- src/core/note_play_handle.cpp | 6 ++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/include/note_play_handle.h b/include/note_play_handle.h index 859498b69..9c22eea3b 100644 --- a/include/note_play_handle.h +++ b/include/note_play_handle.h @@ -48,12 +48,22 @@ public: void * m_pluginData; basicFilters<> * m_filter; + // specifies origin of NotePlayHandle + enum Origins + { + OriginPattern, /*! playback of a note from a pattern */ + OriginMidiInput, /*! playback of a MIDI note input event */ + OriginCount + }; + typedef Origins Origin; + notePlayHandle( InstrumentTrack * _instrument_track, const f_cnt_t _offset, const f_cnt_t _frames, const note & _n, notePlayHandle * _parent = NULL, const bool _part_of_arp = false, - int midiEventChannel = -1 ); + int midiEventChannel = -1, + Origin origin = OriginPattern ); virtual ~notePlayHandle(); virtual void setVolume( const volume_t volume = DefaultVolume ); @@ -281,6 +291,7 @@ private: MidiTime m_songGlobalParentOffset; const int m_midiChannel; + const Origin m_origin; } ; diff --git a/src/core/note_play_handle.cpp b/src/core/note_play_handle.cpp index c22d2c645..96d93c3de 100644 --- a/src/core/note_play_handle.cpp +++ b/src/core/note_play_handle.cpp @@ -50,7 +50,8 @@ notePlayHandle::notePlayHandle( InstrumentTrack * _it, const note & _n, notePlayHandle *parent, const bool _part_of_arp, - int midiEventChannel ) : + int midiEventChannel, + Origin origin ) : playHandle( NotePlayHandle, _offset ), note( _n.length(), _n.pos(), _n.key(), _n.getVolume(), _n.getPanning(), _n.detuning() ), @@ -76,7 +77,8 @@ notePlayHandle::notePlayHandle( InstrumentTrack * _it, m_unpitchedFrequency( 0 ), m_baseDetuning( NULL ), m_songGlobalParentOffset( 0 ), - m_midiChannel( midiEventChannel >= 0 ? midiEventChannel : instrumentTrack()->midiPort()->realOutputChannel() ) + m_midiChannel( midiEventChannel >= 0 ? midiEventChannel : instrumentTrack()->midiPort()->realOutputChannel() ), + m_origin( origin ) { if( isTopNote() ) { From 4b340f7d5f10297bd3f7198bb86877823fe89ede Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 16:46:12 +0100 Subject: [PATCH 091/110] InstrumentTrack: manage MIDI note recording in NotePlayHandle We must not record notes when receiving external MidiNoteOff events as e.g. the sustain pedal still might be pressed. State tracking for features like these is done inside NotePlayHandle so move the recording- related signal emission from InstrumentTrack to NotePlayHandle. Closes #168. --- include/InstrumentTrack.h | 4 +-- src/core/note_play_handle.cpp | 12 ++++++++ src/gui/piano_roll.cpp | 12 ++------ src/tracks/InstrumentTrack.cpp | 50 +++++++--------------------------- 4 files changed, 27 insertions(+), 51 deletions(-) diff --git a/include/InstrumentTrack.h b/include/InstrumentTrack.h index 4057d7990..d4ca720c3 100644 --- a/include/InstrumentTrack.h +++ b/include/InstrumentTrack.h @@ -204,8 +204,8 @@ public: signals: void instrumentChanged(); void newNote(); - void noteOn( const note & _n ); - void noteOff( const note & _n ); + void midiNoteOn( const note& ); + void midiNoteOff( const note& ); void nameChanged(); diff --git a/src/core/note_play_handle.cpp b/src/core/note_play_handle.cpp index 96d93c3de..6a434aea6 100644 --- a/src/core/note_play_handle.cpp +++ b/src/core/note_play_handle.cpp @@ -105,6 +105,11 @@ notePlayHandle::notePlayHandle( InstrumentTrack * _it, setFrames( _frames ); + // inform attached components about new MIDI note (used for recording in Piano Roll) + if( m_origin == OriginMidiInput ) + { + m_instrumentTrack->midiNoteOn( *this ); + } if( !isTopNote() || !instrumentTrack()->isArpeggioEnabled() ) { @@ -122,6 +127,13 @@ notePlayHandle::~notePlayHandle() { noteOff( 0 ); + // inform attached components about MIDI finished (used for recording in Piano Roll) + if( m_origin == OriginMidiInput ) + { + setLength( MidiTime( static_cast( totalFramesPlayed() / engine::framesPerTick() ) ) ); + m_instrumentTrack->midiNoteOff( *this ); + } + if( isTopNote() ) { delete m_baseDetuning; diff --git a/src/gui/piano_roll.cpp b/src/gui/piano_roll.cpp index 6eace8b46..ddd450faa 100644 --- a/src/gui/piano_roll.cpp +++ b/src/gui/piano_roll.cpp @@ -765,15 +765,9 @@ void pianoRoll::setCurrentPattern( pattern * _new_pattern ) // of start-notes and so on...) resizeEvent( NULL ); - connect( m_pattern->instrumentTrack(), - SIGNAL( noteOn( const note & ) ), - this, SLOT( startRecordNote( const note & ) ) ); - connect( m_pattern->instrumentTrack(), - SIGNAL( noteOff( const note & ) ), - this, SLOT( finishRecordNote( const note & ) ) ); - connect( m_pattern->instrumentTrack()->pianoModel(), - SIGNAL( dataChanged() ), - this, SLOT( update() ) ); + connect( m_pattern->instrumentTrack(), SIGNAL( midiNoteOn( const note& ) ), this, SLOT( startRecordNote( const note& ) ) ); + connect( m_pattern->instrumentTrack(), SIGNAL( midiNoteOff( const note& ) ), this, SLOT( finishRecordNote( const note& ) ) ); + connect( m_pattern->instrumentTrack()->pianoModel(), SIGNAL( dataChanged() ), this, SLOT( update() ) ); setWindowTitle( tr( "Piano-Roll - %1" ).arg( m_pattern->name() ) ); diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index c05a379f1..e7a58834a 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -237,20 +237,16 @@ void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& ti { if( m_notes[event.key()] == NULL ) { - // create temporary note - note n; - n.setKey( event.key() ); - n.setVolume( event.volume() ); - // create (timed) note-play-handle - notePlayHandle* nph = new notePlayHandle( this, time.frames( engine::framesPerTick() ), typeInfo::max() / 2, - n, NULL, false, event.channel() ); + notePlayHandle* nph = new notePlayHandle( this, time.frames( engine::framesPerTick() ), + typeInfo::max() / 2, + note( MidiTime(), MidiTime(), event.key(), event.volume() ), + NULL, false, event.channel(), + notePlayHandle::OriginMidiInput ); if( engine::mixer()->addPlayHandle( nph ) ) { m_notes[event.key()] = nph; } - - emit noteOn( n ); } eventHandled = true; @@ -258,28 +254,15 @@ void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& ti } case MidiNoteOff: - { - notePlayHandle* nph = m_notes[event.key()]; - if( nph != NULL ) + if( m_notes[event.key()] != NULL ) { - // create dummy-note which has the same length - // as the played note for sending it later - // to all slots connected to signal noteOff() - // this is for example needed by piano-roll for - // recording notes into a pattern - note n( MidiTime( static_cast( nph->totalFramesPlayed() / engine::framesPerTick() ) ), - 0, nph->key(), nph->getVolume(), nph->getPanning() ); - - emit noteOff( n ); - - // now do actual note off and remove internal reference to NotePlayHandle (which itself will + // do actual note off and remove internal reference to NotePlayHandle (which itself will // be deleted later automatically) - nph->noteOff(); + m_notes[event.key()]->noteOff(); m_notes[event.key()] = NULL; } eventHandled = true; break; - } case MidiKeyPressure: if( m_notes[event.key()] != NULL ) @@ -467,24 +450,11 @@ QString InstrumentTrack::instrumentName() const -void InstrumentTrack::deleteNotePluginData( notePlayHandle * _n ) +void InstrumentTrack::deleteNotePluginData( notePlayHandle* n ) { if( m_instrument != NULL ) { - m_instrument->deleteNotePluginData( _n ); - } - - // Notes deleted when keys still pressed - if( m_notes[_n->key()] == _n ) - { - note done_note( MidiTime( static_cast( - _n->totalFramesPlayed() / - engine::framesPerTick() ) ), - 0, _n->key(), - _n->getVolume(), _n->getPanning() ); - _n->noteOff(); - m_notes[_n->key()] = NULL; - emit noteOff( done_note ); + m_instrument->deleteNotePluginData( n ); } } From 09395a2f3ec5102c47fc6811958acdc56835a2f5 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 19:09:11 +0100 Subject: [PATCH 092/110] NotePlayHandle: stop properly when arpeggio is played via MIDI If a note is played via MIDI (e.g. with infinite frame count) and arpeggio is enabled the NotePlayHandle never got deleted as framesLeft() always returned a big value even after release. Closes #169. --- src/core/note_play_handle.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core/note_play_handle.cpp b/src/core/note_play_handle.cpp index 6a434aea6..16ce402fe 100644 --- a/src/core/note_play_handle.cpp +++ b/src/core/note_play_handle.cpp @@ -305,9 +305,10 @@ void notePlayHandle::play( sampleFrame * _working_buffer ) // can set m_releaseFramesDone to m_releaseFramesToDo so that // notePlayHandle::done() returns true and also this base-note is // removed from mixer's active note vector - if( isArpeggioBaseNote() && m_subNotes.size() == 0 ) + if( m_released && isArpeggioBaseNote() && m_subNotes.size() == 0 ) { m_releaseFramesDone = m_releaseFramesToDo; + m_frames = 0; } // update internal data From db0570b1309a4faceffd6facc5e58eb7df7521c4 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 23:14:59 +0100 Subject: [PATCH 093/110] InstrumentSoundShaping: more sanity checking --- src/core/InstrumentSoundShaping.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core/InstrumentSoundShaping.cpp b/src/core/InstrumentSoundShaping.cpp index 535a0d99d..16a6f5050 100644 --- a/src/core/InstrumentSoundShaping.cpp +++ b/src/core/InstrumentSoundShaping.cpp @@ -326,7 +326,8 @@ f_cnt_t InstrumentSoundShaping::releaseFrames() const { f_cnt_t ret_val = m_envLfoParameters[Volume]->isUsed() ? m_envLfoParameters[Volume]->releaseFrames() : 0; - if( m_instrumentTrack->instrument()->desiredReleaseFrames() > ret_val ) + if( m_instrumentTrack->instrument() && + m_instrumentTrack->instrument()->desiredReleaseFrames() > ret_val ) { ret_val = m_instrumentTrack->instrument()->desiredReleaseFrames(); } From ef4f9b1b60960dd4fb98c24b12d4e7ea405e4130 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 23:18:59 +0100 Subject: [PATCH 094/110] InstrumentTrack: partly revert ad27039b9bbba2ab1095ddd3c163a20a02956c96 Even though there are probably not many old projects out there, at least old presets didn't load properly anymore as of ad27039b9bbba2ab1095ddd3. Fix this by reintroducing compat code. --- src/tracks/InstrumentTrack.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index e7a58834a..b7412f19f 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -767,6 +767,22 @@ void InstrumentTrack::loadTrackSpecificSettings( const QDomElement & thisElement emit instrumentChanged(); } + // compat code - if node-name doesn't match any known + // one, we assume that it is an instrument-plugin + // which we'll try to load + else if( AutomationPattern::classNodeName() != node.nodeName() && + ControllerConnection::classNodeName() != node.nodeName() && + !node.toElement().hasAttribute( "id" ) ) + { + delete m_instrument; + m_instrument = NULL; + m_instrument = Instrument::instantiate( node.nodeName(), this ); + if( m_instrument->nodeName() == node.nodeName() ) + { + m_instrument->restoreState( node.toElement() ); + } + emit instrumentChanged(); + } } node = node.nextSibling(); } From e68f88b6980b22d19a75e0a950e77dde9c632a08 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 23:44:36 +0100 Subject: [PATCH 095/110] Export PresetPreviewPlayHandle class The PresetPreviewPlayHandle is referenced by the PeakController plugin now and therefore needs to be exported. --- include/preset_preview_play_handle.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/preset_preview_play_handle.h b/include/preset_preview_play_handle.h index e5185cfbe..abef2c78b 100644 --- a/include/preset_preview_play_handle.h +++ b/include/preset_preview_play_handle.h @@ -2,7 +2,7 @@ * preset_preview_play_handle.h - play-handle for playing a short preview-sound * of a preset or a file processed by a plugin * - * Copyright (c) 2005-2008 Tobias Doerffel + * Copyright (c) 2005-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -34,7 +34,7 @@ class InstrumentTrack; class previewTrackContainer; -class presetPreviewPlayHandle : public playHandle +class EXPORT presetPreviewPlayHandle : public playHandle { public: presetPreviewPlayHandle( const QString & _preset_file, From 84f57b776dceec21763dd180ca258ebe86c741ac Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 23:45:09 +0100 Subject: [PATCH 096/110] ZynAddSubFX: fixed compiler warning on Win32 --- plugins/zynaddsubfx/src/Seq/Sequencer.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/plugins/zynaddsubfx/src/Seq/Sequencer.cpp b/plugins/zynaddsubfx/src/Seq/Sequencer.cpp index 6dfde4679..c11e68a7c 100644 --- a/plugins/zynaddsubfx/src/Seq/Sequencer.cpp +++ b/plugins/zynaddsubfx/src/Seq/Sequencer.cpp @@ -157,10 +157,9 @@ void Sequencer::resettime(timestruct *t) t->abs = 0.0; t->rel = 0.0; - timeval tval; - t->last = 0.0; #ifndef OS_WINDOWS + timeval tval; if(gettimeofday(&tval, NULL) == 0) t->last = tval.tv_sec + tval.tv_usec * 0.000001; #endif @@ -168,9 +167,9 @@ void Sequencer::resettime(timestruct *t) void Sequencer::updatecounter(timestruct *t) { - timeval tval; double current = 0.0; #ifndef OS_WINDOWS + timeval tval; if(gettimeofday(&tval, NULL) == 0) current = tval.tv_sec + tval.tv_usec * 0.000001; #endif From d5113d0059943dde0d2478b97faddacf7853b88a Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 23:45:29 +0100 Subject: [PATCH 097/110] MidiWinMM: fixed MidiPort API calls --- src/core/midi/MidiWinMM.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/core/midi/MidiWinMM.cpp b/src/core/midi/MidiWinMM.cpp index a4f52b914..799d7f5df 100644 --- a/src/core/midi/MidiWinMM.cpp +++ b/src/core/midi/MidiWinMM.cpp @@ -92,7 +92,7 @@ void MidiWinMM::applyPortMode( MidiPort* port ) { // make sure no subscriptions exist which are not possible with // current port-mode - if( !port->inputEnabled() ) + if( !port->isInputEnabled() ) { for( SubMap::Iterator it = m_inputSubs.begin(); it != m_inputSubs.end(); ++it ) { @@ -100,7 +100,7 @@ void MidiWinMM::applyPortMode( MidiPort* port ) } } - if( !port->outputEnabled() ) + if( !port->isOutputEnabled() ) { for( SubMap::Iterator it = m_outputSubs.begin(); it != m_outputSubs.end(); ++it ) { @@ -145,7 +145,7 @@ QString MidiWinMM::sourcePortName( const MidiEvent& event ) const void MidiWinMM::subscribeReadablePort( MidiPort* port, const QString& dest, bool subscribe ) { - if( subscribe && port->inputEnabled() == false ) + if( subscribe && port->isInputEnabled() == false ) { qWarning( "port %s can't be (un)subscribed!\n", port->displayName().toAscii().constData() ); return; @@ -163,7 +163,7 @@ void MidiWinMM::subscribeReadablePort( MidiPort* port, const QString& dest, bool void MidiWinMM::subscribeWritablePort( MidiPort* port, const QString& dest, bool subscribe ) { - if( subscribe && port->outputEnabled() == false ) + if( subscribe && port->isOutputEnabled() == false ) { qWarning( "port %s can't be (un)subscribed!\n", port->displayName().toAscii().constData() ); return; From ea5f5c4f00eee047c09fe3643d765d376adcc267 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 23:45:49 +0100 Subject: [PATCH 098/110] Papu: fixed out-of-bounds array access due to too small data types Build failed on Win32 with GCC 4.8. --- plugins/papu/gb_apu/Gb_Apu.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/papu/gb_apu/Gb_Apu.h b/plugins/papu/gb_apu/Gb_Apu.h index e2f940b94..e41bdc2c2 100644 --- a/plugins/papu/gb_apu/Gb_Apu.h +++ b/plugins/papu/gb_apu/Gb_Apu.h @@ -6,8 +6,8 @@ #ifndef GB_APU_H #define GB_APU_H -typedef long gb_time_t; // clock cycle count -typedef unsigned gb_addr_t; // 16-bit address +typedef int gb_time_t; // clock cycle count +typedef int gb_addr_t; // 16-bit address #include "Gb_Oscs.h" From 62172011848f272ead878ca9ed0a3cb5cb6804fd Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 27 Jan 2014 00:08:36 +0100 Subject: [PATCH 099/110] Added initial versions of new logo --- data/lmms.ico | Bin 132711 -> 368926 bytes data/nsis_branding.bmp | Bin 34254 -> 25886 bytes data/themes/default/icon.png | Bin 6417 -> 21706 bytes src/gui/about_dialog.cpp | 2 +- 4 files changed, 1 insertion(+), 1 deletion(-) diff --git a/data/lmms.ico b/data/lmms.ico index 1b4c1d3702d0229b52bd84a9ccfb9cc6e248f798..507c1099efab21fe57d096e2a710edb948a24a6f 100644 GIT binary patch literal 368926 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 literal 132711 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�$yhSX8PW?|c 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