diff --git a/include/PianoRoll.h b/include/PianoRoll.h index e874c802e..28f323def 100644 --- a/include/PianoRoll.h +++ b/include/PianoRoll.h @@ -181,6 +181,7 @@ protected slots: void zoomingChanged(); void quantizeChanged(); + void quantizeNotes(); void updateSemiToneMarkerMenu(); diff --git a/src/gui/editors/PianoRoll.cpp b/src/gui/editors/PianoRoll.cpp index 8fd7e0f10..3fafca3eb 100644 --- a/src/gui/editors/PianoRoll.cpp +++ b/src/gui/editors/PianoRoll.cpp @@ -3890,6 +3890,36 @@ int PianoRoll::quantization() const } +void PianoRoll::quantizeNotes() +{ + NoteVector notes = getSelectedNotes(); + + if (notes.empty()) + { + for (Note* n : m_pattern->notes()) + { + notes.push_back(n); + } + } + + for (Note* n : notes) + { + if (n->length() == MidiTime(0)) + { + continue; + } + + Note copy(*n); + m_pattern->removeNote(n); + copy.quantizePos(quantization()); + m_pattern->addNote(copy); + } + + update(); + gui->songEditor()->update(); +} + + void PianoRoll::updateSemiToneMarkerMenu() @@ -4047,10 +4077,15 @@ PianoRollWindow::PianoRollWindow() : connect(editModeGroup, SIGNAL(triggered(int)), m_editor, SLOT(setEditMode(int))); + QAction* quantizeAction = new QAction(embed::getIconPixmap("quantize"), tr("Quantize"), this); + connect(quantizeAction, SIGNAL(triggered()), m_editor, SLOT(quantizeNotes())); + notesActionsToolBar->addAction( drawAction ); notesActionsToolBar->addAction( eraseAction ); notesActionsToolBar->addAction( selectAction ); notesActionsToolBar->addAction( detuneAction ); + notesActionsToolBar->addSeparator(); + notesActionsToolBar->addAction( quantizeAction ); // Copy + paste actions DropToolBar *copyPasteActionsToolBar = addDropToolBarToTop(tr("Copy paste controls"));