diff options
author | Florian Jung <flo@windfisch.org> | 2011-08-29 17:31:55 +0000 |
---|---|---|
committer | Florian Jung <flo@windfisch.org> | 2011-08-29 17:31:55 +0000 |
commit | 9cfbb1578284150b7251e6f58a77c4dc07667deb (patch) | |
tree | deb329199a294436b4b17eb063b67c10959f3a30 /muse2/muse | |
parent | 6ea4a4959526136957b7e0d8ae1ebb29e48993ce (diff) |
added functions to the arranger
Diffstat (limited to 'muse2/muse')
-rw-r--r-- | muse2/muse/arranger/arrangerview.cpp | 37 | ||||
-rw-r--r-- | muse2/muse/arranger/arrangerview.h | 15 | ||||
-rw-r--r-- | muse2/muse/functions.cpp | 207 | ||||
-rw-r--r-- | muse2/muse/functions.h | 17 |
4 files changed, 275 insertions, 1 deletions
diff --git a/muse2/muse/arranger/arrangerview.cpp b/muse2/muse/arranger/arrangerview.cpp index c19280bd..fd8165cf 100644 --- a/muse2/muse/arranger/arrangerview.cpp +++ b/muse2/muse/arranger/arrangerview.cpp @@ -486,7 +486,33 @@ ArrangerView::ArrangerView(QWidget* parent) menuStructure->addAction(strCopyRangeAction); menuStructure->addSeparator(); menuStructure->addAction(strCutEventsAction); + + + + QMenu* functions_menu = menuBar()->addMenu(tr("Functions")); + QAction* func_quantize_action = functions_menu->addAction(tr("&Quantize Notes"), editSignalMapper, SLOT(map())); + QAction* func_notelen_action = functions_menu->addAction(tr("Change note &length"), editSignalMapper, SLOT(map())); + QAction* func_velocity_action = functions_menu->addAction(tr("Change note &velocity"), editSignalMapper, SLOT(map())); + QAction* func_cresc_action = functions_menu->addAction(tr("Crescendo/Decrescendo"), editSignalMapper, SLOT(map())); + QAction* func_transpose_action = functions_menu->addAction(tr("Transpose"), editSignalMapper, SLOT(map())); + QAction* func_erase_action = functions_menu->addAction(tr("Erase Events (Not Parts)"), editSignalMapper, SLOT(map())); + QAction* func_move_action = functions_menu->addAction(tr("Move Events (Not Parts)"), editSignalMapper, SLOT(map())); + QAction* func_fixed_len_action = functions_menu->addAction(tr("Set Fixed Note Length"), editSignalMapper, SLOT(map())); + QAction* func_del_overlaps_action = functions_menu->addAction(tr("Delete Overlapping Notes"), editSignalMapper, SLOT(map())); + QAction* func_legato_action = functions_menu->addAction(tr("Legato"), editSignalMapper, SLOT(map())); + editSignalMapper->setMapping(func_quantize_action, CMD_QUANTIZE); + editSignalMapper->setMapping(func_notelen_action, CMD_NOTELEN); + editSignalMapper->setMapping(func_velocity_action, CMD_VELOCITY); + editSignalMapper->setMapping(func_cresc_action, CMD_CRESCENDO); + editSignalMapper->setMapping(func_transpose_action, CMD_TRANSPOSE); + editSignalMapper->setMapping(func_erase_action, CMD_ERASE); + editSignalMapper->setMapping(func_move_action, CMD_MOVE); + editSignalMapper->setMapping(func_fixed_len_action, CMD_FIXED_LEN); + editSignalMapper->setMapping(func_del_overlaps_action, CMD_DELETE_OVERLAPS); + editSignalMapper->setMapping(func_legato_action, CMD_LEGATO); + + QMenu* menuSettings = menuBar()->addMenu(tr("Window &Config")); menuSettings->addAction(subwinAction); menuSettings->addAction(shareAction); @@ -771,6 +797,17 @@ void ArrangerView::cmd(int cmd) case CMD_EXPAND_PART: expand_parts(); break; case CMD_CLEAN_PART: clean_parts(); break; + case CMD_QUANTIZE: quantize_notes(); break; + case CMD_VELOCITY: modify_velocity(); break; + case CMD_CRESCENDO: crescendo(); break; + case CMD_NOTELEN: modify_notelen(); break; + case CMD_TRANSPOSE: transpose_notes(); break; + case CMD_ERASE: erase_notes(); break; + case CMD_MOVE: move_notes(); break; + case CMD_FIXED_LEN: set_notelen(); break; + case CMD_DELETE_OVERLAPS: delete_overlaps(); break; + case CMD_LEGATO: legato(); break; + } } diff --git a/muse2/muse/arranger/arrangerview.h b/muse2/muse/arranger/arrangerview.h index 47edf6d3..752c2728 100644 --- a/muse2/muse/arranger/arrangerview.h +++ b/muse2/muse/arranger/arrangerview.h @@ -52,7 +52,9 @@ class ArrangerView : public TopWin CMD_PASTE_TO_TRACK, CMD_PASTE_CLONE_TO_TRACK, CMD_DELETE, CMD_SELECT_ALL, CMD_SELECT_NONE, CMD_SELECT_INVERT, CMD_SELECT_ILOOP, CMD_SELECT_OLOOP, CMD_SELECT_PARTS, - CMD_DELETE_TRACK, CMD_EXPAND_PART, CMD_SHRINK_PART, CMD_CLEAN_PART }; + CMD_DELETE_TRACK, CMD_EXPAND_PART, CMD_SHRINK_PART, CMD_CLEAN_PART, + CMD_QUANTIZE, CMD_VELOCITY, CMD_CRESCENDO, CMD_NOTELEN, CMD_TRANSPOSE, + CMD_ERASE, CMD_MOVE, CMD_FIXED_LEN, CMD_DELETE_OVERLAPS, CMD_LEGATO }; virtual void closeEvent(QCloseEvent*); @@ -81,6 +83,17 @@ class ArrangerView : public TopWin QAction *midiTransformerAction; QAction *editCleanPartsAction, *editShrinkPartsAction, *editExpandPartsAction; + QAction* func_quantize_action; + QAction* func_notelen_action; + QAction* func_velocity_action; + QAction* func_cresc_action; + QAction* func_transpose_action; + QAction* func_erase_action; + QAction* func_move_action; + QAction* func_fixed_len_action; + QAction* func_del_overlaps_action; + QAction* func_legato_action; + QSignalMapper *editSignalMapper; QSignalMapper *scoreOneStaffPerTrackMapper; QSignalMapper *scoreAllInOneMapper; diff --git a/muse2/muse/functions.cpp b/muse2/muse/functions.cpp index 5861ca9e..025f6c63 100644 --- a/muse2/muse/functions.cpp +++ b/muse2/muse/functions.cpp @@ -84,6 +84,37 @@ set<Part*> part_to_set(Part* p) return result; } +set<Part*> get_all_parts() +{ + set<Part*> result; + + TrackList* tracks=song->tracks(); + for (TrackList::const_iterator t_it=tracks->begin(); t_it!=tracks->end(); t_it++) + { + const PartList* parts=(*t_it)->cparts(); + for (ciPart p_it=parts->begin(); p_it!=parts->end(); p_it++) + result.insert(p_it->second); + } + + return result; +} + +set<Part*> get_all_selected_parts() +{ + set<Part*> result; + + TrackList* tracks=song->tracks(); + for (TrackList::const_iterator t_it=tracks->begin(); t_it!=tracks->end(); t_it++) + { + const PartList* parts=(*t_it)->cparts(); + for (ciPart p_it=parts->begin(); p_it!=parts->end(); p_it++) + if (p_it->second->selected()) + result.insert(p_it->second); + } + + return result; +} + bool is_relevant(const Event& event, const Part* part, int range) { unsigned tick; @@ -115,6 +146,8 @@ map<Event*, Part*> get_events(const set<Part*>& parts, int range) } + + bool modify_notelen(const set<Part*>& parts) { if (!gatetime_dialog->exec()) @@ -226,6 +259,180 @@ bool legato(const set<Part*>& parts) +bool modify_notelen() +{ + if (!gatetime_dialog->exec()) + return false; + + set<Part*> parts; + if (gatetime_dialog->range & FUNCTION_RANGE_ONLY_SELECTED) + parts=get_all_selected_parts(); + else + parts=get_all_parts(); + + modify_notelen(parts,gatetime_dialog->range & FUNCTION_RANGE_ONLY_BETWEEN_MARKERS, gatetime_dialog->rateVal,gatetime_dialog->offsetVal); + + return true; +} + +bool modify_velocity() +{ + if (!velocity_dialog->exec()) + return false; + + set<Part*> parts; + if (velocity_dialog->range & FUNCTION_RANGE_ONLY_SELECTED) + parts=get_all_selected_parts(); + else + parts=get_all_parts(); + + modify_velocity(parts,velocity_dialog->range & FUNCTION_RANGE_ONLY_BETWEEN_MARKERS,velocity_dialog->rateVal,velocity_dialog->offsetVal); + + return true; +} + +bool quantize_notes() +{ + if (!quantize_dialog->exec()) + return false; + + set<Part*> parts; + if (quantize_dialog->range & FUNCTION_RANGE_ONLY_SELECTED) + parts=get_all_selected_parts(); + else + parts=get_all_parts(); + + quantize_notes(parts, quantize_dialog->range & FUNCTION_RANGE_ONLY_BETWEEN_MARKERS, (config.division*4)/(1<<quantize_dialog->raster_power2), + quantize_dialog->quant_len, quantize_dialog->strength, quantize_dialog->swing, + quantize_dialog->threshold); + + return true; +} + +bool erase_notes() +{ + if (!erase_dialog->exec()) + return false; + + set<Part*> parts; + if (erase_dialog->range & FUNCTION_RANGE_ONLY_SELECTED) + parts=get_all_selected_parts(); + else + parts=get_all_parts(); + + erase_notes(parts,erase_dialog->range & FUNCTION_RANGE_ONLY_BETWEEN_MARKERS, erase_dialog->velo_threshold, erase_dialog->velo_thres_used, + erase_dialog->len_threshold, erase_dialog->len_thres_used ); + + return true; +} + +bool delete_overlaps() +{ + if (!del_overlaps_dialog->exec()) + return false; + + set<Part*> parts; + if (del_overlaps_dialog->range & FUNCTION_RANGE_ONLY_SELECTED) + parts=get_all_selected_parts(); + else + parts=get_all_parts(); + + delete_overlaps(parts,erase_dialog->range & FUNCTION_RANGE_ONLY_BETWEEN_MARKERS); + + return true; +} + +bool set_notelen() +{ + if (!set_notelen_dialog->exec()) + return false; + + set<Part*> parts; + if (set_notelen_dialog->range & FUNCTION_RANGE_ONLY_SELECTED) + parts=get_all_selected_parts(); + else + parts=get_all_parts(); + + set_notelen(parts,set_notelen_dialog->range & FUNCTION_RANGE_ONLY_BETWEEN_MARKERS, set_notelen_dialog->len); + + return true; +} + +bool move_notes() +{ + if (!move_notes_dialog->exec()) + return false; + + set<Part*> parts; + if (move_notes_dialog->range & FUNCTION_RANGE_ONLY_SELECTED) + parts=get_all_selected_parts(); + else + parts=get_all_parts(); + + move_notes(parts,move_notes_dialog->range & FUNCTION_RANGE_ONLY_BETWEEN_MARKERS, move_notes_dialog->amount); + + return true; +} + +bool transpose_notes() +{ + if (!transpose_dialog->exec()) + return false; + + set<Part*> parts; + if (transpose_dialog->range & FUNCTION_RANGE_ONLY_SELECTED) + parts=get_all_selected_parts(); + else + parts=get_all_parts(); + + transpose_notes(parts,transpose_dialog->range & FUNCTION_RANGE_ONLY_BETWEEN_MARKERS, transpose_dialog->amount); + + return true; +} + +bool crescendo() +{ + if (song->rpos() <= song->lpos()) + { + QMessageBox::warning(NULL, QObject::tr("Error"), QObject::tr("Please first select the range for crescendo with the loop markers.")); + return false; + } + + if (!crescendo_dialog->exec()) + return false; + + set<Part*> parts; + if (crescendo_dialog->range & FUNCTION_RANGE_ONLY_SELECTED) + parts=get_all_selected_parts(); + else + parts=get_all_parts(); + + crescendo(parts,crescendo_dialog->range & FUNCTION_RANGE_ONLY_BETWEEN_MARKERS, crescendo_dialog->start_val,crescendo_dialog->end_val,crescendo_dialog->absolute); + + return true; +} + +bool legato() +{ + if (!legato_dialog->exec()) + return false; + + set<Part*> parts; + if (legato_dialog->range & FUNCTION_RANGE_ONLY_SELECTED) + parts=get_all_selected_parts(); + else + parts=get_all_parts(); + + legato(parts,legato_dialog->range & FUNCTION_RANGE_ONLY_BETWEEN_MARKERS, legato_dialog->min_len, !legato_dialog->allow_shortening); + + return true; +} + + + + + + bool modify_velocity(const set<Part*>& parts, int range, int rate, int offset) { map<Event*, Part*> events = get_events(parts, range); diff --git a/muse2/muse/functions.h b/muse2/muse/functions.h index 3b8a23f3..4e2e7151 100644 --- a/muse2/muse/functions.h +++ b/muse2/muse/functions.h @@ -41,6 +41,11 @@ extern Legato* legato_dialog; void init_function_dialogs(QWidget* parent); +#define FUNCTION_RANGE_ONLY_SELECTED 1 +#define FUNCTION_RANGE_ONLY_BETWEEN_MARKERS 2 + + + std::set<Part*> partlist_to_set(PartList* pl); std::set<Part*> part_to_set(Part* p); std::map<Event*, Part*> get_events(const std::set<Part*>& parts, int range); @@ -72,6 +77,18 @@ bool erase_notes(const std::set<Part*>& parts); bool delete_overlaps(const std::set<Part*>& parts); bool legato(const std::set<Part*>& parts); +//the below functions operate on selected parts +bool modify_velocity(); +bool modify_notelen(); +bool quantize_notes(); +bool set_notelen(); +bool move_notes(); +bool transpose_notes(); +bool crescendo(); +bool erase_notes(); +bool delete_overlaps(); +bool legato(); + //functions for copy'n'paste void copy_notes(const std::set<Part*>& parts, int range); |