From 9e86990f41e4e0144ec0efad9f8db4cfa42ec9c5 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 10 Mar 2014 18:45:19 +0100 Subject: [PATCH 01/12] Song: reset milli seconds counter when looping BB or pattern Closes #252. --- src/core/song.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/core/song.cpp b/src/core/song.cpp index 167c8bd8b..3512b82a5 100644 --- a/src/core/song.cpp +++ b/src/core/song.cpp @@ -309,6 +309,9 @@ void song::processNextBuffer() // offset ticks = ticks % ( max_tact * MidiTime::ticksPerTact() ); + // wrap milli second counter + m_elapsedMilliSeconds = ( ticks * 60 * 1000 / 48 ) / getTempo(); + m_vstSyncController.setAbsolutePosition( ticks ); } } From ed6ccddc6c253fab8032267d4fc3fd3cc4512221 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 10 Mar 2014 18:50:33 +0100 Subject: [PATCH 02/12] Song: do not stop playback twice Otherwise we reset data which doesn't need to be reset when stopped already. Closes #255. --- src/core/song.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/core/song.cpp b/src/core/song.cpp index 3512b82a5..04632bc94 100644 --- a/src/core/song.cpp +++ b/src/core/song.cpp @@ -554,6 +554,12 @@ void song::togglePause() void song::stop() { + // do not stop/reset things again if we're stopped already + if( m_playMode == Mode_None ) + { + return; + } + timeLine * tl = m_playPos[m_playMode].m_timeLine; m_playing = false; m_paused = false; From 06289781e46bd99dcad4b8fb8713c93a516d7e2a Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 10 Mar 2014 19:12:50 +0100 Subject: [PATCH 03/12] AutomationEditor: update pause icon manually As we have a special semantic for automation pattern playback (i.e. we don't playback the pattern itself but its container component like Song Editor, Piano Roll etc.). Closes #292. --- src/gui/AutomationEditor.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gui/AutomationEditor.cpp b/src/gui/AutomationEditor.cpp index cdbbfc734..d6810eee2 100644 --- a/src/gui/AutomationEditor.cpp +++ b/src/gui/AutomationEditor.cpp @@ -1907,6 +1907,8 @@ void AutomationEditor::play() engine::getSong()->togglePause(); } } + + setPauseIcon( engine::getSong()->isPlaying() ); } From 288a3162c536aeb058e561ce40ee58498c9c74f1 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 10 Mar 2014 19:19:32 +0100 Subject: [PATCH 04/12] Third release candidate for 1.0.0 Bumped version number to 0.9.92 in CMakeLists.txt, README and lmms.rc.in. --- CMakeLists.txt | 2 +- README | 2 +- lmms.rc.in | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c2d941337..ba1536076 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,7 +15,7 @@ INCLUDE(FindPkgConfig) SET(VERSION_MAJOR "0") SET(VERSION_MINOR "9") -SET(VERSION_PATCH "91") +SET(VERSION_PATCH "92") #SET(VERSION_SUFFIX "") SET(VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") IF(VERSION_SUFFIX) diff --git a/README b/README index 2f8f472ef..00f4d80cb 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -LMMS 0.9.91 +LMMS 0.9.92 =========== Copyright (c) 2004-2014 by LMMS developers diff --git a/lmms.rc.in b/lmms.rc.in index 8d12b4d8f..783c84096 100644 --- a/lmms.rc.in +++ b/lmms.rc.in @@ -2,7 +2,7 @@ lmmsicon ICON data/lmms.ico #include VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,9,91,0 + FILEVERSION 0,9,92,0 FILEFLAGSMASK VS_FFI_FILEFLAGSMASK FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP From ab69c2d44bc04f2bf01afea80cbc351c2cbb65d6 Mon Sep 17 00:00:00 2001 From: "Raine M. Ekman" Date: Tue, 11 Mar 2014 21:57:31 +0200 Subject: [PATCH 05/12] LB302: make filter selection sync with GUI on initialisation and preset load --- plugins/lb302/lb302.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/lb302/lb302.cpp b/plugins/lb302/lb302.cpp index ab9a0e926..1891bee3b 100644 --- a/plugins/lb302/lb302.cpp +++ b/plugins/lb302/lb302.cpp @@ -43,7 +43,6 @@ #include "embed.cpp" #include "moc_lb302.cxx" - // Envelope Recalculation period #define ENVINC 64 @@ -340,7 +339,7 @@ lb302Synth::lb302Synth( InstrumentTrack * _instrumentTrack ) : vcfs[0] = new lb302Filter3Pole(&fs); vcfs[1] = new lb302FilterIIR2(&fs); - vcf = vcfs[1]; + db24Toggled(); sample_cnt = 0; release_frame = 1<<24; @@ -401,6 +400,7 @@ void lb302Synth::loadSettings( const QDomElement & _this ) slideToggle.loadSettings( _this, "slide"); deadToggle.loadSettings( _this, "dead"); db24Toggle.loadSettings( _this, "db24"); + db24Toggled(); filterChanged(); } From ba7e5e5f5c4ad0f6d7e376b3e8d2f25be10690bc Mon Sep 17 00:00:00 2001 From: Vesa Date: Wed, 12 Mar 2014 07:14:29 +0200 Subject: [PATCH 06/12] Highlight the currently selected instrument/automation patterns in the song editor --- include/PianoRoll.h | 33 +-- src/gui/AutomationPatternView.cpp | 12 +- src/gui/PianoRoll.cpp | 366 +++++++++++++++--------------- src/tracks/pattern.cpp | 13 +- 4 files changed, 222 insertions(+), 202 deletions(-) diff --git a/include/PianoRoll.h b/include/PianoRoll.h index c4ef75ddf..cdd198621 100644 --- a/include/PianoRoll.h +++ b/include/PianoRoll.h @@ -24,8 +24,8 @@ * */ -#ifndef _PIANO_ROLL_H -#define _PIANO_ROLL_H +#ifndef PIANO_ROLL_H +#define PIANO_ROLL_H #include @@ -147,6 +147,7 @@ protected slots: signals: + void currentPatternChanged(); void semiToneMarkerMenuScaleSetEnabled(bool); void semiToneMarkerMenuChordSetEnabled(bool); @@ -169,7 +170,7 @@ private: ActionChangeNoteProperty, ActionResizeNoteEditArea }; - + enum noteEditMode { NoteEditVolume, @@ -205,7 +206,7 @@ private: void autoScroll( const MidiTime & _t ); MidiTime newNoteLen() const; - + void shiftPos(int amount); void shiftSemiTone(int amount); bool isSelection() const; @@ -213,19 +214,19 @@ private: void testPlayNote( note * n ); void testPlayKey( int _key, int _vol, int _pan ); void pauseTestNotes( bool _pause = true ); - + inline int noteEditTop() const; inline int keyAreaBottom() const; inline int noteEditBottom() const; inline int keyAreaTop() const; inline int noteEditRight() const; inline int noteEditLeft() const; - + void dragNotes( int x, int y, bool alt, bool shift ); - + static const int cm_scrollAmtHoriz = 10; static const int cm_scrollAmtVert = 1; - + static QPixmap * s_whiteKeyBigPm; static QPixmap * s_whiteKeyBigPressedPm; static QPixmap * s_whiteKeySmallPm; @@ -252,7 +253,7 @@ private: toolButton * m_eraseButton; toolButton * m_selectButton; toolButton * m_detuneButton; - + toolButton * m_cutButton; toolButton * m_copyButton; toolButton * m_pasteButton; @@ -287,22 +288,22 @@ private: int m_selectedTick; int m_selectStartKey; int m_selectedKeys; - + // boundary box around all selected notes when dragging int m_moveBoundaryLeft; int m_moveBoundaryTop; int m_moveBoundaryRight; int m_moveBoundaryBottom; - + // remember where the scrolling started when dragging so that // we can handle dragging while scrolling with arrow keys int m_mouseDownKey; int m_mouseDownTick; - + // remember the last x and y of a mouse movement int m_lastMouseX; int m_lastMouseY; - + // x,y of when the user starts a drag int m_moveStartX; int m_moveStartY; @@ -312,7 +313,7 @@ private: int m_ppt; int m_totalKeysToScroll; - // remember these values to use them + // remember these values to use them // for the next note that is set MidiTime m_lenOfNewNotes; volume_t m_lastNoteVolume; @@ -323,7 +324,7 @@ private: editModes m_editMode; editModes m_ctrlMode; // mode they were in before they hit ctrl - + bool m_mouseDownLeft; //true if left click is being held down bool m_mouseDownRight; //true if right click is being held down @@ -337,7 +338,7 @@ private: note * noteUnderMouse(); // turn a selection rectangle into selected notes - void computeSelectedNotes( bool shift ); + void computeSelectedNotes( bool shift ); void clearSelectedNotes(); friend class engine; diff --git a/src/gui/AutomationPatternView.cpp b/src/gui/AutomationPatternView.cpp index 98a36cf62..d102e0dbc 100644 --- a/src/gui/AutomationPatternView.cpp +++ b/src/gui/AutomationPatternView.cpp @@ -48,6 +48,8 @@ AutomationPatternView::AutomationPatternView( AutomationPattern * _pattern, { connect( m_pat, SIGNAL( dataChanged() ), this, SLOT( update() ) ); + connect( engine::automationEditor(), SIGNAL( currentPatternChanged() ), + this, SLOT( update() ) ); setAttribute( Qt::WA_OpaquePaintEvent, true ); setFixedHeight( parentWidget()->height() - 2 ); @@ -228,11 +230,17 @@ void AutomationPatternView::paintEvent( QPaintEvent * ) lingrad.setColorAt( 0, c ); p.setBrush( lingrad ); - p.setPen( c.lighter( 160 ) ); + if( engine::automationEditor()->currentPattern() == m_pat ) + p.setPen( c.lighter( 160 ) ); + else + p.setPen( c.lighter( 130 ) ); p.drawRect( 1, 1, width()-3, height()-3 ); p.setBrush( QBrush() ); - p.setPen( c.darker( 300 ) ); + if( engine::automationEditor()->currentPattern() == m_pat ) + p.setPen( c.lighter( 130 ) ); + else + p.setPen( c.darker( 300 ) ); p.drawRect( 0, 0, width()-1, height()-1 ); const float ppt = fixedTCOs() ? diff --git a/src/gui/PianoRoll.cpp b/src/gui/PianoRoll.cpp index 570f6f54a..5f4ac5da9 100644 --- a/src/gui/PianoRoll.cpp +++ b/src/gui/PianoRoll.cpp @@ -175,7 +175,7 @@ PianoRoll::PianoRoll() : // gui names of edit modes m_nemStr.push_back( tr( "Note Volume" ) ); m_nemStr.push_back( tr( "Note Panning" ) ); - + QSignalMapper * signalMapper = new QSignalMapper( this ); m_noteEditMenu = new QMenu( this ); m_noteEditMenu->clear(); @@ -188,7 +188,7 @@ PianoRoll::PianoRoll() : } connect( signalMapper, SIGNAL(mapped(int)), this, SLOT(changeNoteEditMode(int)) ); - + signalMapper = new QSignalMapper( this ); m_semiToneMarkerMenu = new QMenu( this ); @@ -323,7 +323,7 @@ PianoRoll::PianoRoll() : m_recordButton = new toolButton( embed::getIconPixmap( "record" ), tr( "Record notes from MIDI-device/channel-piano" ), this, SLOT( record() ), m_toolBar ); - m_recordAccompanyButton = new toolButton( + m_recordAccompanyButton = new toolButton( embed::getIconPixmap( "record_accompany" ), tr( "Record notes from MIDI-device/channel-piano while playing song or BB track" ), this, SLOT( recordAccompany() ), m_toolBar ); @@ -331,7 +331,7 @@ 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" ); @@ -391,7 +391,7 @@ PianoRoll::PianoRoll() : this, SLOT( selectButtonToggled() ), m_toolBar ); m_selectButton->setCheckable( true ); - + m_detuneButton = new toolButton( embed::getIconPixmap( "automation"), tr( "Detune mode (Shift+T)" ), this, SLOT( detuneButtonToggled() ), @@ -502,8 +502,8 @@ PianoRoll::PianoRoll() : m_noteLenModel.addItem( tr( "Last note" ), new PixmapLoader( "edit_draw" ) ); const QString pixmaps[] = { "whole", "half", "quarter", "eighth", - "sixteenth", "thirtysecond", "triplethalf", - "tripletquarter", "tripleteighth", + "sixteenth", "thirtysecond", "triplethalf", + "tripletquarter", "tripleteighth", "tripletsixteenth", "tripletthirtysecond" } ; for( int i = 0; i < NUM_EVEN_LENGTHS; ++i ) @@ -627,7 +627,7 @@ PianoRoll::PianoRoll() : parentWidget()->resize( tb_layout->minimumSize().width()+10, INITIAL_PIANOROLL_HEIGHT ); parentWidget()->move( 5, 5 ); - + parentWidget()->hide(); } else @@ -738,6 +738,7 @@ void PianoRoll::setCurrentPattern( pattern * _new_pattern ) setWindowTitle( tr( "Piano-Roll - no pattern" ) ); update(); + emit currentPatternChanged(); return; } @@ -779,6 +780,7 @@ void PianoRoll::setCurrentPattern( pattern * _new_pattern ) setWindowTitle( tr( "Piano-Roll - %1" ).arg( m_pattern->name() ) ); update(); + emit currentPatternChanged(); } @@ -826,21 +828,21 @@ inline void PianoRoll::drawNoteRect( QPainter & _p, int _x, int _y, { _width = 2; } - + int volVal = qMin( 255, (int) ( - ( (float)( _n->getVolume() - MinVolume ) ) / + ( (float)( _n->getVolume() - MinVolume ) ) / ( (float)( MaxVolume - MinVolume ) ) * 255.0f) ); - float rightPercent = qMin( 1.0f, - ( (float)( _n->getPanning() - PanningLeft ) ) / + float rightPercent = qMin( 1.0f, + ( (float)( _n->getPanning() - PanningLeft ) ) / ( (float)( PanningRight - PanningLeft ) ) * 2.0f ); - - float leftPercent = qMin( 1.0f, - ( (float)( PanningRight - _n->getPanning() ) ) / + + float leftPercent = qMin( 1.0f, + ( (float)( PanningRight - _n->getPanning() ) ) / ( (float)( PanningRight - PanningLeft ) ) * 2.0f ); const QColor defaultNoteColor( 0x77, 0xC7, 0xD8 ); QColor col = defaultNoteColor; - + if( _n->length() < 0 ) { //step note @@ -861,7 +863,7 @@ inline void PianoRoll::drawNoteRect( QPainter & _p, int _x, int _y, QColor rcol = QColor::fromHsv( col.hue(), col.saturation(), volVal * rightPercent ); col = QColor::fromHsv( col.hue(), col.saturation(), volVal ); - + QLinearGradient gradient( _x, _y, _x+_width, _y+KEY_LINE_HEIGHT ); gradient.setColorAt( 0, lcol ); @@ -870,23 +872,23 @@ inline void PianoRoll::drawNoteRect( QPainter & _p, int _x, int _y, _p.setPen( Qt::NoPen ); _p.drawRect( _x, _y, _width, KEY_LINE_HEIGHT-1 ); } - + // hilighting lines around the note _p.setPen( Qt::SolidLine ); _p.setBrush( Qt::NoBrush ); - + col = defaultNoteColor; _p.setPen( QColor::fromHsv( col.hue(), col.saturation(), qMin( 255, volVal*1.7f ) ) ); _p.drawLine( _x, _y, _x + _width, _y ); _p.drawLine( _x, _y, _x, _y + KEY_LINE_HEIGHT - 2 ); - + col = defaultNoteColor; _p.setPen( QColor::fromHsv( col.hue(), col.saturation(), volVal/1.7 ) ); _p.drawLine( _x + _width, _y, _x + _width, _y + KEY_LINE_HEIGHT - 2 ); _p.drawLine( _x, _y + KEY_LINE_HEIGHT - 2, _x + _width, _y + KEY_LINE_HEIGHT - 2 ); - + // that little tab thing on the end hinting at the user // to resize the note _p.setPen( defaultNoteColor.lighter( 200 ) ); @@ -959,8 +961,8 @@ void PianoRoll::removeSelection() m_selectedTick = 0; m_selectStartKey = 0; m_selectedKeys = 0; - - + + } @@ -976,9 +978,9 @@ void PianoRoll::clearSelectedNotes() // will be our iterator in the following loop NoteVector::ConstIterator it = notes.begin(); while( it != notes.end() ) - { + { ( *it )->setSelected( false ); - + ++it; } } @@ -1018,11 +1020,11 @@ void PianoRoll::shiftSemiTone( int amount ) // shift notes by amount semitones ( *it )->setKey( ( *it )->key() + amount ); } } - + // we modified the song update(); engine::songEditor()->update(); - + } @@ -1032,7 +1034,7 @@ void PianoRoll::shiftPos( int amount ) //shift notes pos by amount { bool useAllNotes = ! isSelection(); const NoteVector & notes = m_pattern->notes(); - + bool first = true; for( NoteVector::ConstIterator it = notes.begin(); it != notes.end(); ++it ) @@ -1048,13 +1050,13 @@ void PianoRoll::shiftPos( int amount ) //shift notes pos by amount if( m_moveBoundaryLeft + amount < 0 ) { amount += 0 - (amount + m_moveBoundaryLeft); - } + } first = false; } ( *it )->setPos( ( *it )->pos() + amount ); } } - + // we modified the song update(); engine::songEditor()->update(); @@ -1073,7 +1075,7 @@ bool PianoRoll::isSelection() const // are any notes selected? return true; } } - + return false; } @@ -1082,7 +1084,7 @@ bool PianoRoll::isSelection() const // are any notes selected? int PianoRoll::selectionCount() const // how many notes are selected? { int sum = 0; - + const NoteVector & notes = m_pattern->notes(); for( NoteVector::ConstIterator it = notes.begin(); it != notes.end(); ++it ) { @@ -1091,7 +1093,7 @@ int PianoRoll::selectionCount() const // how many notes are selected? ++sum; } } - + return sum; } @@ -1125,8 +1127,8 @@ void PianoRoll::keyPressEvent( QKeyEvent* event ) m_topBottomScroll->setValue( m_topBottomScroll->value() - cm_scrollAmtVert ); - - // if they are moving notes around or resizing, + + // if they are moving notes around or resizing, // recalculate the note/resize position if( m_action == ActionMoveNote || m_action == ActionResizeNote ) @@ -1152,8 +1154,8 @@ void PianoRoll::keyPressEvent( QKeyEvent* event ) m_topBottomScroll->setValue( m_topBottomScroll->value() + cm_scrollAmtVert ); - - // if they are moving notes around or resizing, + + // if they are moving notes around or resizing, // recalculate the note/resize position if( m_action == ActionMoveNote || m_action == ActionResizeNote ) @@ -1189,8 +1191,8 @@ void PianoRoll::keyPressEvent( QKeyEvent* event ) m_leftRightScroll->setValue( m_leftRightScroll->value() - cm_scrollAmtHoriz ); - - // if they are moving notes around or resizing, + + // if they are moving notes around or resizing, // recalculate the note/resize position if( m_action == ActionMoveNote || m_action == ActionResizeNote ) @@ -1198,8 +1200,8 @@ void PianoRoll::keyPressEvent( QKeyEvent* event ) dragNotes( m_lastMouseX, m_lastMouseY, event->modifiers() & Qt::AltModifier, event->modifiers() & Qt::ShiftModifier ); - } - + } + } event->accept(); break; @@ -1224,8 +1226,8 @@ void PianoRoll::keyPressEvent( QKeyEvent* event ) m_leftRightScroll->setValue( m_leftRightScroll->value() + cm_scrollAmtHoriz ); - - // if they are moving notes around or resizing, + + // if they are moving notes around or resizing, // recalculate the note/resize position if( m_action == ActionMoveNote || m_action == ActionResizeNote ) @@ -1233,8 +1235,8 @@ void PianoRoll::keyPressEvent( QKeyEvent* event ) dragNotes( m_lastMouseX, m_lastMouseY, event->modifiers() & Qt::AltModifier, event->modifiers() & Qt::ShiftModifier ); - } - + } + } event->accept(); break; @@ -1296,7 +1298,7 @@ void PianoRoll::keyPressEvent( QKeyEvent* event ) m_selectButton->setChecked( true ); } break; - + case Qt::Key_T: if( event->modifiers() & Qt::ShiftModifier ) { @@ -1304,7 +1306,7 @@ void PianoRoll::keyPressEvent( QKeyEvent* event ) m_detuneButton->setChecked( true ); } break; - + case Qt::Key_Delete: deleteSelectedNotes(); event->accept(); @@ -1416,7 +1418,7 @@ void PianoRoll::leaveEvent( QEvent * _e ) inline int PianoRoll::noteEditTop() const { - return height() - PR_BOTTOM_MARGIN - + return height() - PR_BOTTOM_MARGIN - m_notesEditHeight + NOTE_EDIT_RESIZE_BAR; } @@ -1475,7 +1477,7 @@ void PianoRoll::mousePressEvent( QMouseEvent * _me ) noteUnderMouse()->editDetuningPattern(); return; } - + // if holding control, go to selection mode if( _me->modifiers() & Qt::ControlModifier && m_editMode != ModeSelect ) { @@ -1483,7 +1485,7 @@ void PianoRoll::mousePressEvent( QMouseEvent * _me ) m_editMode = ModeSelect; QApplication::changeOverrideCursor( QCursor( Qt::ArrowCursor ) ); update(); - } + } // keep track of the point where the user clicked down if( _me->button() == Qt::LeftButton ) @@ -1493,12 +1495,12 @@ void PianoRoll::mousePressEvent( QMouseEvent * _me ) } if( _me->y() > keyAreaBottom() && _me->y() < noteEditTop() ) - { + { // resizing the note edit area m_action = ActionResizeNoteEditArea; m_oldNotesEditHeight = m_notesEditHeight; return; - } + } if( _me->y() > PR_TOP_MARGIN ) { @@ -1507,7 +1509,7 @@ void PianoRoll::mousePressEvent( QMouseEvent * _me ) int key_num = getKey( _me->y() ); int x = _me->x(); - + if( x > WHITE_KEY_WIDTH ) { @@ -1580,10 +1582,10 @@ void PianoRoll::mousePressEvent( QMouseEvent * _me ) m_pattern->setType( pattern::MelodyPattern ); // then set new note - + // clear selection and select this new note clearSelectedNotes(); - + // +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. @@ -1627,7 +1629,7 @@ void PianoRoll::mousePressEvent( QMouseEvent * _me ) { ++it; } - + } @@ -1635,52 +1637,52 @@ void PianoRoll::mousePressEvent( QMouseEvent * _me ) m_lastNotePanning = ( *it )->getPanning(); m_lastNoteVolume = ( *it )->getVolume(); m_lenOfNewNotes = ( *it )->length(); - - // remember which key and tick we started with + + // remember which key and tick we started with m_mouseDownKey = m_startKey; m_mouseDownTick = m_currentPosition; - + bool first = true; it = notes.begin(); while( it != notes.end() ) { - + // remember note starting positions ( *it )->setOldKey( ( *it )->key() ); ( *it )->setOldPos( ( *it )->pos() ); ( *it )->setOldLength( ( *it )->length() ); - + if( ( *it )->selected() ) { - + // figure out the bounding box of all the selected notes if( first ) { m_moveBoundaryLeft = ( *it )->pos().getTicks(); m_moveBoundaryRight = ( *it )->pos() + ( *it )->length(); m_moveBoundaryBottom = ( *it )->key(); - m_moveBoundaryTop = ( *it )->key(); - + m_moveBoundaryTop = ( *it )->key(); + first = false; } else { - m_moveBoundaryLeft = qMin( - ( *it )->pos().getTicks(), + m_moveBoundaryLeft = qMin( + ( *it )->pos().getTicks(), m_moveBoundaryLeft ); - m_moveBoundaryRight = qMax( ( *it )->pos() + + m_moveBoundaryRight = qMax( ( *it )->pos() + ( *it )->length(), m_moveBoundaryRight ); - m_moveBoundaryBottom = qMin( ( *it )->key(), + m_moveBoundaryBottom = qMin( ( *it )->key(), m_moveBoundaryBottom ); m_moveBoundaryTop = qMax( ( *it )->key(), m_moveBoundaryTop ); } } - + ++it; } - + // if clicked on an unselected note, remove selection // and select that new note if( ! m_currentNote->selected() ) @@ -1690,10 +1692,10 @@ void PianoRoll::mousePressEvent( QMouseEvent * _me ) m_moveBoundaryLeft = m_currentNote->pos().getTicks(); m_moveBoundaryRight = m_currentNote->pos() + m_currentNote->length(); m_moveBoundaryBottom = m_currentNote->key(); - m_moveBoundaryTop = m_currentNote->key(); + m_moveBoundaryTop = m_currentNote->key(); } - + // 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 && @@ -1710,12 +1712,12 @@ void PianoRoll::mousePressEvent( QMouseEvent * _me ) { // otherwise move it m_action = ActionMoveNote; - + // set move-cursor QCursor c( Qt::SizeAllCursor ); QApplication::setOverrideCursor( c ); - - // if they're holding shift, copy all selected notes + + // if they're holding shift, copy all selected notes if( //*it != created_new_note && ! is_new_note && _me->modifiers() & Qt::ShiftModifier ) { @@ -1732,7 +1734,7 @@ void PianoRoll::mousePressEvent( QMouseEvent * _me ) } ++it; } - + if( newNotes.size() != 0 ) { //put notes from vector into piano roll @@ -1741,14 +1743,14 @@ void PianoRoll::mousePressEvent( QMouseEvent * _me ) note * newNote = m_pattern->addNote( newNotes[i] ); newNote->setSelected( false ); } - + // added new notes, so must update engine, song, etc engine::getSong()->setModified(); update(); engine::songEditor()->update(); } } - + // play the note testPlayNote( m_currentNote ); } @@ -1786,7 +1788,7 @@ void PianoRoll::mousePressEvent( QMouseEvent * _me ) m_selectedKeys = 1; m_action = ActionSelectNotes; - + // call mousemove to fix glitch where selection // appears in wrong spot on mousedown mouseMoveEvent( _me ); @@ -1842,8 +1844,8 @@ void PianoRoll::mouseDoubleClickEvent( QMouseEvent * _me ) if( validPattern() == false ) { return; - } - + } + // if they clicked in the note edit area, clear selection if( _me->x() > noteEditLeft() && _me->x() < noteEditRight() && _me->y() > noteEditTop() && _me->y() < noteEditBottom() ) @@ -1858,7 +1860,7 @@ void PianoRoll::mouseDoubleClickEvent( QMouseEvent * _me ) void PianoRoll::testPlayNote( note * n ) { m_lastKey = n->key(); - + if( n->isPlaying() == false && m_recording == false ) { n->setIsPlaying( true ); @@ -1895,7 +1897,7 @@ void PianoRoll::pauseTestNotes( bool _pause ) testPlayNote( *it ); } } - + ++it; } } @@ -1910,7 +1912,7 @@ void PianoRoll::testPlayKey( int key, int velocity, int pan ) // remember which one we're playing m_lastKey = key; - + // play new key m_pattern->instrumentTrack()->pianoModel()->handleKeyPress( key, velocity ); } @@ -1928,7 +1930,7 @@ void PianoRoll::computeSelectedNotes(bool shift) // don't bother, there's no selection return; } - + // setup selection-vars int sel_pos_start = m_selectStartTick; int sel_pos_end = m_selectStartTick+m_selectedTick; @@ -1957,7 +1959,7 @@ void PianoRoll::computeSelectedNotes(bool shift) { ( *it )->setSelected( false ); } - + int len_ticks = ( *it )->length(); if( len_ticks == 0 ) @@ -1991,7 +1993,7 @@ void PianoRoll::computeSelectedNotes(bool shift) } } } - + removeSelection(); update(); } @@ -2002,7 +2004,7 @@ void PianoRoll::computeSelectedNotes(bool shift) void PianoRoll::mouseReleaseEvent( QMouseEvent * _me ) { bool mustRepaint = false; - + if( _me->button() & Qt::LeftButton ) { m_mouseDownLeft = false; @@ -2013,26 +2015,26 @@ void PianoRoll::mouseReleaseEvent( QMouseEvent * _me ) m_mouseDownRight = false; mustRepaint = true; } - + if( _me->button() & Qt::LeftButton && m_editMode == ModeSelect && m_action == ActionSelectNotes ) { // select the notes within the selection rectangle and // then destroy the selection rectangle - + computeSelectedNotes( _me->modifiers() & Qt::ShiftModifier ); - + } - else if( _me->button() & Qt::LeftButton && + else if( _me->button() & Qt::LeftButton && m_action == ActionMoveNote ) { // we moved one or more notes so they have to be // moved properly according to new starting- // time in the note-array of pattern - m_pattern->rearrangeAllNotes(); - + m_pattern->rearrangeAllNotes(); + } if( _me->button() & Qt::LeftButton && ( m_action == ActionMoveNote || m_action == ActionResizeNote ) ) @@ -2044,8 +2046,8 @@ void PianoRoll::mouseReleaseEvent( QMouseEvent * _me ) clearSelectedNotes(); } } - - + + if( validPattern() == true ) { // turn off all notes that are playing @@ -2059,10 +2061,10 @@ void PianoRoll::mouseReleaseEvent( QMouseEvent * _me ) m_pattern->instrumentTrack()->pianoModel()->handleKeyRelease( ( *it )->key() ); ( *it )->setIsPlaying( false ); } - + ++it; } - + // stop playing keys that we let go of m_pattern->instrumentTrack()->pianoModel()->handleKeyRelease( m_lastKey ); } @@ -2075,7 +2077,7 @@ void PianoRoll::mouseReleaseEvent( QMouseEvent * _me ) { QApplication::restoreOverrideCursor(); } - + if( mustRepaint ) { repaint(); @@ -2092,7 +2094,7 @@ void PianoRoll::mouseMoveEvent( QMouseEvent * _me ) update(); return; } - + if( m_action == ActionNone && _me->buttons() == 0 ) { if( _me->y() > keyAreaBottom() && _me->y() < noteEditTop() ) @@ -2105,20 +2107,20 @@ void PianoRoll::mouseMoveEvent( QMouseEvent * _me ) else if( m_action == ActionResizeNoteEditArea ) { // change m_notesEditHeight and then repaint - m_notesEditHeight = tLimit( + m_notesEditHeight = tLimit( m_oldNotesEditHeight - ( _me->y() - m_moveStartY ), NOTE_EDIT_MIN_HEIGHT, - height() - PR_TOP_MARGIN - NOTE_EDIT_RESIZE_BAR - + height() - PR_TOP_MARGIN - NOTE_EDIT_RESIZE_BAR - PR_BOTTOM_MARGIN - KEY_AREA_MIN_HEIGHT ); repaint(); return; } - + if( _me->y() > PR_TOP_MARGIN || m_action != ActionNone ) { bool edit_note = ( _me->y() > noteEditTop() ) && m_action != ActionSelectNotes; - + int key_num = getKey( _me->y() ); int x = _me->x(); @@ -2133,29 +2135,29 @@ void PianoRoll::mouseMoveEvent( QMouseEvent * _me ) update(); return; } - + x -= WHITE_KEY_WIDTH; - if( _me->buttons() & Qt::LeftButton + if( _me->buttons() & Qt::LeftButton && m_editMode == ModeDraw && (m_action == ActionMoveNote || m_action == ActionResizeNote ) ) { // handle moving notes and resizing them - bool replay_note = key_num != m_lastKey + bool replay_note = key_num != m_lastKey && m_action == ActionMoveNote; - + if( replay_note ) { pauseTestNotes(); } - + dragNotes( _me->x(), _me->y(), _me->modifiers() & Qt::AltModifier, _me->modifiers() & Qt::ShiftModifier ); - + if( replay_note && m_action == ActionMoveNote ) { pauseTestNotes( false ); @@ -2165,16 +2167,16 @@ void PianoRoll::mouseMoveEvent( QMouseEvent * _me ) _me->buttons() & Qt::LeftButton ) { // editing note properties - + // Change notes within a certain pixel range of where // the mouse cursor is int pixel_range = 14; - + // convert to ticks so that we can check which notes // are in the range - int ticks_start = (x-pixel_range/2) * + int ticks_start = (x-pixel_range/2) * MidiTime::ticksPerTact() / m_ppt + m_currentPosition; - int ticks_end = (x+pixel_range/2) * + int ticks_end = (x+pixel_range/2) * MidiTime::ticksPerTact() / m_ppt + m_currentPosition; // get note-vector of current pattern @@ -2182,16 +2184,16 @@ void PianoRoll::mouseMoveEvent( QMouseEvent * _me ) // determine what volume/panning to set note to volume_t vol = tLimit( MinVolume + - ( ( (float)noteEditBottom() ) - ( (float)_me->y() ) ) / - ( (float)( noteEditBottom() - noteEditTop() ) ) * + ( ( (float)noteEditBottom() ) - ( (float)_me->y() ) ) / + ( (float)( noteEditBottom() - noteEditTop() ) ) * ( MaxVolume - MinVolume ), MinVolume, MaxVolume ); panning_t pan = tLimit( PanningLeft + ( (float)( noteEditBottom() - _me->y() ) ) / - ( (float)( noteEditBottom() - noteEditTop() ) ) * + ( (float)( noteEditBottom() - noteEditTop() ) ) * ( (float)( PanningRight - PanningLeft ) ), PanningLeft, PanningRight); - + if( m_noteEditMode == NoteEditVolume ) { m_lastNoteVolume = vol; @@ -2200,22 +2202,22 @@ void PianoRoll::mouseMoveEvent( QMouseEvent * _me ) { m_lastNotePanning = pan; } - - - + + + // loop through vector bool use_selection = isSelection(); NoteVector::ConstIterator it = notes.begin()+notes.size()-1; for( int i = 0; i < notes.size(); ++i ) { note * n = *it; - if( n->pos().getTicks() >= ticks_start + if( n->pos().getTicks() >= ticks_start && n->pos().getTicks() <= ticks_end && n->length().getTicks() != 0 && ( n->selected() || ! use_selection ) ) { m_pattern->dataChanged(); - + // play the note so that the user can tell how loud it is // and where it is panned testPlayNote( n ); @@ -2243,7 +2245,7 @@ void PianoRoll::mouseMoveEvent( QMouseEvent * _me ) n->setIsPlaying( false ); } } - + --it; } @@ -2370,7 +2372,7 @@ void PianoRoll::mouseMoveEvent( QMouseEvent * _me ) else if( m_editMode == ModeDraw && _me->buttons() & Qt::RightButton ) { // holding down right-click to delete notes - + // get tick in which the user clicked int pos_ticks = x * MidiTime::ticksPerTact() / m_ppt + m_currentPosition; @@ -2421,7 +2423,7 @@ void PianoRoll::mouseMoveEvent( QMouseEvent * _me ) } engine::getSong()->setModified(); } - } + } else { ++it; @@ -2508,10 +2510,10 @@ void PianoRoll::mouseMoveEvent( QMouseEvent * _me ) } QApplication::restoreOverrideCursor(); } - + m_lastMouseX = _me->x(); m_lastMouseY = _me->y(); - + update(); } @@ -2521,24 +2523,24 @@ void PianoRoll::mouseMoveEvent( QMouseEvent * _me ) void PianoRoll::dragNotes( int x, int y, bool alt, bool shift ) { // dragging one or more notes around - + // convert pixels to ticks and keys int off_x = x - m_moveStartX; int off_ticks = off_x * MidiTime::ticksPerTact() / m_ppt; int off_key = getKey( y ) - getKey( m_moveStartY ); - + // handle scroll changes while dragging off_ticks -= m_mouseDownTick - m_currentPosition; off_key -= m_mouseDownKey - m_startKey; - - + + // if they're not holding alt, quantize the offset if( ! alt ) { off_ticks = floor( off_ticks / quantization() ) * quantization(); } - + // make sure notes won't go outside boundary conditions if( m_action == ActionMoveNote ) { @@ -2581,14 +2583,14 @@ void PianoRoll::dragNotes( int x, int y, bool alt, bool shift ) if( ( *it )->selected() ) { - + if( m_action == ActionMoveNote ) { // moving note - int pos_ticks = ( *it )->oldPos().getTicks() + int pos_ticks = ( *it )->oldPos().getTicks() + off_ticks; int key_num = ( *it )->oldKey() + off_key; - + if( pos_ticks < 0 ) { pos_ticks = 0; @@ -2602,13 +2604,13 @@ void PianoRoll::dragNotes( int x, int y, bool alt, bool shift ) { key_num = NumKeys; } - + ( *it )->setPos( MidiTime( pos_ticks ) ); ( *it )->setKey( key_num ); } else if( m_action == ActionResizeNote ) { - // resizing note + // resizing note int ticks_new = ( *it )->oldLength().getTicks() + off_ticks; if( ticks_new <= 0 ) @@ -2626,13 +2628,13 @@ void PianoRoll::dragNotes( int x, int y, bool alt, bool shift ) } } ( *it )->setLength( MidiTime( ticks_new ) ); - + m_lenOfNewNotes = ( *it )->length(); } } ++it; } - + m_pattern->dataChanged(); engine::getSong()->setModified(); } @@ -2728,7 +2730,7 @@ void PianoRoll::paintEvent( QPaintEvent * _pe ) int key_line_y = keyAreaBottom() - 1; // used for aligning black-keys later int first_white_key_height = WHITE_KEY_SMALL_HEIGHT; - // key-counter - only needed for finding out whether the processed + // key-counter - only needed for finding out whether the processed // key is the first one int keys_processed = 0; @@ -2756,7 +2758,7 @@ void PianoRoll::paintEvent( QPaintEvent * _pe ) for( int y = key_line_y + 1 + y_offset; y > PR_TOP_MARGIN; key_line_y -= KEY_LINE_HEIGHT, ++keys_processed ) { - // check for white key that is only half visible on the + // check for white key that is only half visible on the // bottom of piano-roll if( keys_processed == 0 && prKeyOrder[m_startKey % KeysPerOctave] == @@ -2767,9 +2769,9 @@ void PianoRoll::paintEvent( QPaintEvent * _pe ) *s_whiteKeySmallPm ); // update y-pos y -= WHITE_KEY_SMALL_HEIGHT / 2; - // move first black key down (we didn't draw whole + // move first black key down (we didn't draw whole // white key so black key needs to be lifted down) - // (default for first_white_key_height = + // (default for first_white_key_height = // WHITE_KEY_SMALL_HEIGHT, so WHITE_KEY_SMALL_HEIGHT/2 // is smaller) first_white_key_height = WHITE_KEY_SMALL_HEIGHT / 2; @@ -2890,7 +2892,7 @@ void PianoRoll::paintEvent( QPaintEvent * _pe ) } else { - // simple workaround for increasing x if there were + // simple workaround for increasing x if there were // two white keys (e.g. between E and F) ++white_cnt; if( white_cnt > 1 ) @@ -2903,18 +2905,18 @@ void PianoRoll::paintEvent( QPaintEvent * _pe ) } - // erase the area below the piano, because there might be keys that + // erase the area below the piano, because there might be keys that // should be only half-visible p.fillRect( QRect( 0, keyAreaBottom(), WHITE_KEY_WIDTH, noteEditBottom()-keyAreaBottom() ), QColor( 0, 0, 0 ) ); - + // display note editing info QFont f = p.font(); f.setBold( false ); p.setFont( pointSize<10>( f ) ); p.setPen( QColor( 255, 255, 255) ); - p.drawText( QRect( 0, keyAreaBottom(), + p.drawText( QRect( 0, keyAreaBottom(), WHITE_KEY_WIDTH, noteEditBottom() - keyAreaBottom() ), Qt::AlignCenter | Qt::TextWordWrap, m_nemStr.at( m_noteEditMode ) + ":" ); @@ -2926,11 +2928,11 @@ void PianoRoll::paintEvent( QPaintEvent * _pe ) height() - PR_TOP_MARGIN - PR_BOTTOM_MARGIN ); // draw vertical raster - - // triplet mode occurs if the note duration isn't a multiple of 3 - bool triplets = ( quantization() % 3 != 0 ); - int spt = MidiTime::stepsPerTact(); + // triplet mode occurs if the note duration isn't a multiple of 3 + bool triplets = ( quantization() % 3 != 0 ); + + int spt = MidiTime::stepsPerTact(); float pp16th = (float)m_ppt / spt; int bpt = DefaultBeatsPerTact; if ( triplets ) { @@ -2976,7 +2978,7 @@ void PianoRoll::paintEvent( QPaintEvent * _pe ) if( show32nds ) { p.setPen( QColor( 0x22, 0x22, 0x22 ) ); - p.drawLine( (int)(x + pp16th/2) , PR_TOP_MARGIN, + p.drawLine( (int)(x + pp16th/2) , PR_TOP_MARGIN, (int)(x + pp16th/2), height() - PR_BOTTOM_MARGIN ); } @@ -2985,7 +2987,7 @@ void PianoRoll::paintEvent( QPaintEvent * _pe ) - // following code draws all notes in visible area + // following code draws all notes in visible area // and the note editing stuff (volume, panning, etc) // setup selection-vars @@ -3014,7 +3016,7 @@ void PianoRoll::paintEvent( QPaintEvent * _pe ) const int visible_keys = ( keyAreaBottom()-keyAreaTop() ) / KEY_LINE_HEIGHT + 2; - + QPolygon editHandles; for( NoteVector::ConstIterator it = notes.begin(); @@ -3056,12 +3058,12 @@ void PianoRoll::paintEvent( QPaintEvent * _pe ) y_base - key * KEY_LINE_HEIGHT, note_width, *it ); } - + // draw note editing stuff int editHandleTop = 0; if( m_noteEditMode == NoteEditVolume ) { - QColor color = QColor::fromHsv( 140, 221, + QColor color = QColor::fromHsv( 140, 221, qMin(255, 60 + ( *it )->getVolume() ) ); if( ( *it )->selected() ) { @@ -3069,12 +3071,12 @@ void PianoRoll::paintEvent( QPaintEvent * _pe ) } p.setPen( QPen( color, NE_LINE_WIDTH ) ); - editHandleTop = noteEditBottom() - - ( (float)( ( *it )->getVolume() - MinVolume ) ) / - ( (float)( MaxVolume - MinVolume ) ) * + editHandleTop = noteEditBottom() - + ( (float)( ( *it )->getVolume() - MinVolume ) ) / + ( (float)( MaxVolume - MinVolume ) ) * ( (float)( noteEditBottom() - noteEditTop() ) ); - - p.drawLine( noteEditLeft() + x, editHandleTop, + + p.drawLine( noteEditLeft() + x, editHandleTop, noteEditLeft() + x, noteEditBottom() ); } @@ -3085,14 +3087,14 @@ void PianoRoll::paintEvent( QPaintEvent * _pe ) { color.setRgb( 0x00, 0x40, 0xC0 ); } - + p.setPen( QPen( color, NE_LINE_WIDTH ) ); - + editHandleTop = noteEditBottom() - - ( (float)( ( *it )->getPanning() - PanningLeft ) ) / + ( (float)( ( *it )->getPanning() - PanningLeft ) ) / ( (float)( (PanningRight - PanningLeft ) ) ) * ( (float)( noteEditBottom() - noteEditTop() ) ); - + p.drawLine( noteEditLeft() + x, noteEditTop() + ( (float)( noteEditBottom() - noteEditTop() ) ) / 2.0f, noteEditLeft() + x, editHandleTop ); @@ -3107,11 +3109,11 @@ void PianoRoll::paintEvent( QPaintEvent * _pe ) y_base - key * KEY_LINE_HEIGHT ); } } - + p.setPen( QPen( QColor( 0x99, 0xAF, 0xFF ), NE_LINE_WIDTH+2 ) ); p.drawPoints( editHandles ); - + } else { @@ -3157,10 +3159,10 @@ void PianoRoll::paintEvent( QPaintEvent * _pe ) width() - 10, KEY_LINE_HEIGHT - 7, QColor( 64, 64, 64 ) ); } - + // bar to resize note edit area p.setClipRect( 0, 0, width(), height() ); - p.fillRect( QRect( 0, keyAreaBottom(), + p.fillRect( QRect( 0, keyAreaBottom(), width()-PR_RIGHT_MARGIN, NOTE_EDIT_RESIZE_BAR ), QColor( 64, 64, 64 ) ); @@ -3522,7 +3524,7 @@ void PianoRoll::selectAll() int pos_ticks = ( *it )->pos(); if( key <= m_selectStartKey || first_time ) { - // if we move start-key down, we have to add + // if we move start-key down, we have to add // the difference between old and new start-key // to m_selectedKeys, otherwise the selection // is just moved down... @@ -3665,20 +3667,20 @@ void PianoRoll::pasteNotes() DataFile dataFile( value.toUtf8() ); QDomNodeList list = dataFile.elementsByTagName( note::classNodeName() ); - + // remove selection and select the newly pasted notes clearSelectedNotes(); - + for( int i = 0; !list.item( i ).isNull(); ++i ) { // create the note note cur_note; cur_note.restoreState( list.item( i ).toElement() ); cur_note.setPos( cur_note.pos() + m_timeLine->pos() ); - + // select it cur_note.setSelected( true ); - + // add to pattern m_pattern->addNote( cur_note ); } @@ -3702,10 +3704,10 @@ void PianoRoll::deleteSelectedNotes() { return; } - + bool update_after_delete = false; - - + + // get note-vector of current pattern const NoteVector & notes = m_pattern->notes(); @@ -3718,7 +3720,7 @@ void PianoRoll::deleteSelectedNotes() // delete this note m_pattern->removeNote( ( *it ) ); update_after_delete = true; - + // start over, make sure we get all the notes it = notes.begin(); } @@ -3734,7 +3736,7 @@ void PianoRoll::deleteSelectedNotes() update(); engine::songEditor()->update(); } - + } @@ -3816,8 +3818,8 @@ void PianoRoll::zoomingChanged() void PianoRoll::quantizeChanged() { - if( m_quantizeModel.value() == 0 && - m_noteLenModel.value() == 0 ) + if( m_quantizeModel.value() == 0 && + m_noteLenModel.value() == 0 ) { m_quantizeModel.setValue( m_quantizeModel.findText( "1/16" ) ); return; diff --git a/src/tracks/pattern.cpp b/src/tracks/pattern.cpp index 4dea0b155..207663bdd 100644 --- a/src/tracks/pattern.cpp +++ b/src/tracks/pattern.cpp @@ -605,6 +605,9 @@ patternView::patternView( pattern * _pattern, trackView * _parent ) : m_paintPixmap(), m_needsUpdate( true ) { + connect( engine::pianoRoll(), SIGNAL( currentPatternChanged() ), + this, SLOT( update() ) ); + if( s_stepBtnOn == NULL ) { s_stepBtnOn = new QPixmap( embed::getIconPixmap( @@ -931,13 +934,19 @@ void patternView::paintEvent( QPaintEvent * ) } p.setBrush( lingrad ); - p.setPen( c.darker( 300 ) ); + if( engine::pianoRoll()->currentPattern() == m_pat && m_pat->m_patternType != pattern::BeatPattern ) + p.setPen( c.lighter( 130 ) ); + else + p.setPen( c.darker( 300 ) ); p.drawRect( QRect( 0, 0, width() - 1, height() - 1 ) ); p.setBrush( QBrush() ); if( m_pat->m_patternType != pattern::BeatPattern ) { - p.setPen( c.lighter( 130 ) ); + if( engine::pianoRoll()->currentPattern() == m_pat ) + p.setPen( c.lighter( 160 ) ); + else + p.setPen( c.lighter( 130 ) ); p.drawRect( QRect( 1, 1, width() - 3, height() - 3 ) ); } From 24c5b2367e303f37a14062ebb19ba5a4e0b748a6 Mon Sep 17 00:00:00 2001 From: Vesa Date: Wed, 12 Mar 2014 10:21:47 +0200 Subject: [PATCH 07/12] Fixes for Triple osc, LB302 logos --- plugins/lb302/logo.png | Bin 3351 -> 2854 bytes plugins/triple_oscillator/logo.png | Bin 7023 -> 7930 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/plugins/lb302/logo.png b/plugins/lb302/logo.png index dda7b6ab5ee2b1f3699232d90291c1e962891cf0..8211d52505f382758071606cd2c7d8fba64d446c 100644 GIT binary patch delta 2847 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 delta 3348 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

C6^hR`$(m?TI{Qwe(Gidmxuytw-W69GX0#t4x> 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 From fab41306acb37eb9a6e4aab9001b4e3bd7287be5 Mon Sep 17 00:00:00 2001 From: "Raine M. Ekman" Date: Wed, 12 Mar 2014 20:18:39 +0200 Subject: [PATCH 08/12] Export: check for end of export in ticks, not in tacts. This works better with time signature changes. --- include/song.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/song.h b/include/song.h index 7eaceb30c..f0d93e186 100644 --- a/include/song.h +++ b/include/song.h @@ -170,12 +170,12 @@ public: if ( m_exportLoop ) { return m_exporting == true && - m_playPos[Mode_PlaySong].getTact() >= length(); + m_playPos[Mode_PlaySong].getTicks() >= length() * ticksPerTact(); } else { return m_exporting == true && - m_playPos[Mode_PlaySong].getTact() >= length() + 1; + m_playPos[Mode_PlaySong].getTicks() >= ( length() + 1 ) * ticksPerTact(); } } From b8e2f3f785780f0406aa380362f6c3aa247f8f8e Mon Sep 17 00:00:00 2001 From: Vesa Date: Thu, 13 Mar 2014 18:23:43 +0200 Subject: [PATCH 09/12] Fix sfxr crashing on very high notes --- plugins/sfxr/sfxr.cpp | 19 +++++++++++-------- plugins/sfxr/sfxr.h | 8 ++++---- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/plugins/sfxr/sfxr.cpp b/plugins/sfxr/sfxr.cpp index 1d5d8354c..ede89888f 100644 --- a/plugins/sfxr/sfxr.cpp +++ b/plugins/sfxr/sfxr.cpp @@ -4,7 +4,7 @@ * please read readme.txt in this directory * * Copyright (c) 2014 Wong Cho Ching - * + * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * * This program is free software; you can redistribute it and/or @@ -159,7 +159,7 @@ void SfxrSynth::resetSample( bool restart ) -void SfxrSynth::update( sampleFrame * buffer, const fpp_t frameNum ) +void SfxrSynth::update( sampleFrame * buffer, const int32_t frameNum ) { for(int i=0;iprocessingSampleRate(); - + fpp_t frameNum = _n->framesLeftForCurrentPeriod(); if ( _n->totalFramesPlayed() == 0 || _n->m_pluginData == NULL ) { @@ -464,10 +464,13 @@ void sfxrInstrument::playNote( NotePlayHandle * _n, sampleFrame * _working_buffe return; } - fpp_t pitchedFrameNum = (_n->frequency()/BaseFreq)*frameNum; - + int32_t pitchedFrameNum = (_n->frequency()/BaseFreq)*frameNum; + pitchedFrameNum /= ( currentSampleRate / 44100 ); - + +// debug code +// qDebug( "pFN %d", pitchedFrameNum ); + sampleFrame * pitchedBuffer = new sampleFrame[pitchedFrameNum]; static_cast(_n->m_pluginData)->update( pitchedBuffer, pitchedFrameNum ); for( fpp_t i=0; iprocessAudioBuffer( _working_buffer, frameNum, _n ); - + } @@ -622,7 +625,7 @@ sfxrInstrumentView::sfxrInstrumentView( Instrument * _instrument, m_dSlideKnob ->setObjectName( "freqKnob" ); m_vibDepthKnob ->setObjectName( "freqKnob" ); m_vibSpeedKnob ->setObjectName( "freqKnob" ); - + 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"); diff --git a/plugins/sfxr/sfxr.h b/plugins/sfxr/sfxr.h index a3e989375..535b13e7a 100644 --- a/plugins/sfxr/sfxr.h +++ b/plugins/sfxr/sfxr.h @@ -4,7 +4,7 @@ * please read readme.txt in this directory * * Copyright (c) 2014 Wong Cho Ching - * + * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * * This program is free software; you can redistribute it and/or @@ -25,8 +25,8 @@ */ -#ifndef _SFXR_H -#define _SFXR_H +#ifndef SFXR_H +#define SFXR_H #include "Instrument.h" #include "InstrumentView.h" @@ -74,7 +74,7 @@ public: virtual ~SfxrSynth(); void resetSample( bool restart ); - void update( sampleFrame * buffer, const fpp_t frameNum ); + void update( sampleFrame * buffer, const int32_t frameNum ); bool isPlaying() const; From dbea8159315cea345c248718517ec13649b05ceb Mon Sep 17 00:00:00 2001 From: Oskar Wallgren Date: Thu, 13 Mar 2014 17:37:36 +0100 Subject: [PATCH 10/12] Fix capitalization in some plugins description --- plugins/audio_file_processor/audio_file_processor.cpp | 2 +- plugins/kicker/kicker.cpp | 2 +- plugins/triple_oscillator/TripleOscillator.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/audio_file_processor/audio_file_processor.cpp b/plugins/audio_file_processor/audio_file_processor.cpp index 2079b77a6..e6ec7b906 100644 --- a/plugins/audio_file_processor/audio_file_processor.cpp +++ b/plugins/audio_file_processor/audio_file_processor.cpp @@ -52,7 +52,7 @@ Plugin::Descriptor PLUGIN_EXPORT audiofileprocessor_plugin_descriptor = STRINGIFY( PLUGIN_NAME ), "AudioFileProcessor", QT_TRANSLATE_NOOP( "pluginBrowser", - "simple sampler with various settings for " + "Simple sampler with various settings for " "using samples (e.g. drums) in an " "instrument-track" ), "Tobias Doerffel ", diff --git a/plugins/kicker/kicker.cpp b/plugins/kicker/kicker.cpp index e721530d1..c04f69edb 100644 --- a/plugins/kicker/kicker.cpp +++ b/plugins/kicker/kicker.cpp @@ -44,7 +44,7 @@ Plugin::Descriptor PLUGIN_EXPORT kicker_plugin_descriptor = STRINGIFY( PLUGIN_NAME ), "Kicker", QT_TRANSLATE_NOOP( "pluginBrowser", - "versatile kick- & bassdrum-synthesizer" ), + "Versatile kick- & bassdrum-synthesizer" ), "Tobias Doerffel ", 0x0100, Plugin::Instrument, diff --git a/plugins/triple_oscillator/TripleOscillator.cpp b/plugins/triple_oscillator/TripleOscillator.cpp index 06aa671c6..50bce3ecc 100644 --- a/plugins/triple_oscillator/TripleOscillator.cpp +++ b/plugins/triple_oscillator/TripleOscillator.cpp @@ -49,7 +49,7 @@ Plugin::Descriptor PLUGIN_EXPORT tripleoscillator_plugin_descriptor = STRINGIFY( PLUGIN_NAME ), "TripleOscillator", QT_TRANSLATE_NOOP( "pluginBrowser", - "three powerful oscillators you can modulate " + "Three powerful oscillators you can modulate " "in several ways" ), "Tobias Doerffel ", 0x0110, From daa047620565d759df11cb2c394c83b9e35253aa Mon Sep 17 00:00:00 2001 From: Vesa Date: Fri, 14 Mar 2014 13:21:59 +0200 Subject: [PATCH 11/12] Improve pattern name text visibility --- src/gui/AutomationPatternView.cpp | 17 ++++++++--------- src/tracks/SampleTrack.cpp | 10 +++++++--- src/tracks/bb_track.cpp | 5 ++++- src/tracks/pattern.cpp | 31 +++++++++++++++---------------- 4 files changed, 34 insertions(+), 29 deletions(-) diff --git a/src/gui/AutomationPatternView.cpp b/src/gui/AutomationPatternView.cpp index d102e0dbc..9cec7920c 100644 --- a/src/gui/AutomationPatternView.cpp +++ b/src/gui/AutomationPatternView.cpp @@ -310,16 +310,15 @@ void AutomationPatternView::paintEvent( QPaintEvent * ) p.resetMatrix(); p.setFont( pointSize<8>( p.font() ) ); - if( m_pat->isMuted() || m_pat->getTrack()->isMuted() ) - { - p.setPen( QColor( 50, 50, 50 ) ); - } - else - { - p.setPen( QColor( 0, 0, 0 ) ); - } - p.drawText( 2, p.fontMetrics().height() - 1, m_pat->name() ); + QColor text_color = ( m_pat->isMuted() || m_pat->getTrack()->isMuted() ) + ? QColor( 30, 30, 30 ) + : QColor( 255, 255, 255 ); + + p.setPen( QColor( 0, 0, 0 ) ); + p.drawText( 4, p.fontMetrics().height()+1, m_pat->name() ); + p.setPen( text_color ); + p.drawText( 3, p.fontMetrics().height(), m_pat->name() ); if( m_pat->isMuted() ) { diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index 17d979336..a886b5303 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -380,9 +380,13 @@ void SampleTCOView::paintEvent( QPaintEvent * _pe ) if( m_tco->isRecord() ) { p.setFont( pointSize<7>( p.font() ) ); - p.setPen( QColor( 224, 0, 0 ) ); - p.drawText( 9, p.fontMetrics().height() - 1, "Rec" ); - p.setBrush( QBrush( QColor( 224, 0, 0 ) ) ); + + p.setPen( QColor( 0, 0, 0 ) ); + p.drawText( 10, p.fontMetrics().height()+1, "Rec" ); + p.setPen( QColor( 255, 60, 60 ) ); + p.drawText( 9, p.fontMetrics().height(), "Rec" ); + + p.setBrush( QBrush( QColor( 255, 60, 60 ) ) ); p.drawEllipse( 4, 5, 4, 4 ); } } diff --git a/src/tracks/bb_track.cpp b/src/tracks/bb_track.cpp index 8aac63a48..ff2b9b76f 100644 --- a/src/tracks/bb_track.cpp +++ b/src/tracks/bb_track.cpp @@ -212,9 +212,12 @@ void bbTCOView::paintEvent( QPaintEvent * ) p.drawRect( 0, 0, rect().right(), rect().bottom() ); p.setFont( pointSize<8>( p.font() ) ); + p.setPen( QColor( 0, 0, 0 ) ); + p.drawText( 4, p.fontMetrics().height()+1, m_bbTCO->name() ); + p.setPen( QColor( 255, 255, 255 ) ); p.drawText( 3, p.fontMetrics().height(), m_bbTCO->name() ); - + if( m_bbTCO->isMuted() ) { p.drawPixmap( 3, p.fontMetrics().height() + 1, diff --git a/src/tracks/pattern.cpp b/src/tracks/pattern.cpp index 207663bdd..c1022d991 100644 --- a/src/tracks/pattern.cpp +++ b/src/tracks/pattern.cpp @@ -607,7 +607,7 @@ patternView::patternView( pattern * _pattern, trackView * _parent ) : { connect( engine::pianoRoll(), SIGNAL( currentPatternChanged() ), this, SLOT( update() ) ); - + if( s_stepBtnOn == NULL ) { s_stepBtnOn = new QPixmap( embed::getIconPixmap( @@ -970,7 +970,7 @@ void patternView::paintEvent( QPaintEvent * ) } // melody pattern paint event - + if( m_pat->m_patternType == pattern::MelodyPattern ) { if( m_pat->m_notes.size() > 0 ) @@ -979,12 +979,12 @@ void patternView::paintEvent( QPaintEvent * ) // display the area where most of the m_notes are // also calculate min/max tones so the tonal range can be // properly stretched accross the pattern vertically - + int central_key = 0; int max_key = 0; int min_key = 9999999; int total_notes = 0; - + for( NoteVector::Iterator it = m_pat->m_notes.begin(); it != m_pat->m_notes.end(); ++it ) { @@ -1001,13 +1001,13 @@ void patternView::paintEvent( QPaintEvent * ) { central_key = central_key / total_notes; const int keyrange = qMax( qMax( max_key - central_key, central_key - min_key ), 1 ); - + // debug code // qDebug( "keyrange: %d", keyrange ); // determine height of the pattern view, sans borders const int ht = height() - 1 - TCO_BORDER_WIDTH * 2; - + // determine maximum height value for drawing bounds checking const int max_ht = height() - 1 - TCO_BORDER_WIDTH; @@ -1032,7 +1032,7 @@ void patternView::paintEvent( QPaintEvent * ) ( float( central_key - ( *it )->key() ) / keyrange + 1.0f ) / 2; // multiply that by pattern height const int y_pos = static_cast( TCO_BORDER_WIDTH + y_key * ht ); - + // debug code // if( ( *it )->length() > 0 ) qDebug( "key %d, central_key %d, y_key %f, y_pos %d", ( *it )->key(), central_key, y_key, y_pos ); @@ -1048,7 +1048,7 @@ void patternView::paintEvent( QPaintEvent * ) const int x2 = x_base + static_cast ( ( ( *it )->pos() + ( *it )->length() ) * ( ppt / MidiTime::ticksPerTact() ) ); - + // check bounds, draw line if( x1 < width() - TCO_BORDER_WIDTH ) p.drawLine( x1, y_pos, @@ -1130,17 +1130,16 @@ void patternView::paintEvent( QPaintEvent * ) } p.setFont( pointSize<8>( p.font() ) ); - if( m_pat->isMuted() || m_pat->getTrack()->isMuted() ) - { - p.setPen( QColor( 30, 30, 30 ) ); - } - else - { - p.setPen( QColor( 0, 0, 0 ) ); - } + + QColor text_color = ( m_pat->isMuted() || m_pat->getTrack()->isMuted() ) + ? QColor( 30, 30, 30 ) + : QColor( 255, 255, 255 ); if( m_pat->name() != m_pat->instrumentTrack()->name() ) { + p.setPen( QColor( 0, 0, 0 ) ); + p.drawText( 4, p.fontMetrics().height()+1, m_pat->name() ); + p.setPen( text_color ); p.drawText( 3, p.fontMetrics().height(), m_pat->name() ); } From cea7394e86a80a6c1796bec7a719d7be86c2449b Mon Sep 17 00:00:00 2001 From: Vesa Date: Fri, 14 Mar 2014 17:34:41 +0200 Subject: [PATCH 12/12] SampleBuffer: Remove mp3 from the list of supported files --- src/core/SampleBuffer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/SampleBuffer.cpp b/src/core/SampleBuffer.cpp index de348a478..2a7639a05 100644 --- a/src/core/SampleBuffer.cpp +++ b/src/core/SampleBuffer.cpp @@ -859,13 +859,13 @@ QString SampleBuffer::openAudioFile() const // set filters QStringList types; types << tr( "All Audio-Files (*.wav *.ogg *.ds *.flac *.spx *.voc " - "*.aif *.aiff *.au *.raw *.mp3)" ) + "*.aif *.aiff *.au *.raw)" ) << tr( "Wave-Files (*.wav)" ) << tr( "OGG-Files (*.ogg)" ) << tr( "DrumSynth-Files (*.ds)" ) << tr( "FLAC-Files (*.flac)" ) << tr( "SPEEX-Files (*.spx)" ) - << tr( "MP3-Files (*.mp3)" ) + //<< tr( "MP3-Files (*.mp3)" ) //<< tr( "MIDI-Files (*.mid)" ) << tr( "VOC-Files (*.voc)" ) << tr( "AIFF-Files (*.aif *.aiff)" )