summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Holthuis <jan.holthuis@ruhr-uni-bochum.de>2020-10-25 15:28:46 +0100
committerGitHub <noreply@github.com>2020-10-25 15:28:46 +0100
commita4d5c8ff136d22666833160081aa541a8ff63358 (patch)
treead90ddd7acd7a612ebd7c3387bd9ddfefe7a3713
parent0ef7064a72a8b45759b5bf43974c6e278cfad309 (diff)
parent9a7ef97a210a4ccea6e12993bff833a227a07bbb (diff)
Merge pull request #3207 from ronso0/midiwizard-control-groups
Midiwizard: improve UX in controls menus
-rw-r--r--src/controllers/controlpickermenu.cpp742
1 files changed, 495 insertions, 247 deletions
diff --git a/src/controllers/controlpickermenu.cpp b/src/controllers/controlpickermenu.cpp
index bc2a95b3ba..09b9d23c6d 100644
--- a/src/controllers/controlpickermenu.cpp
+++ b/src/controllers/controlpickermenu.cpp
@@ -20,34 +20,150 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent)
m_auxStr = tr("Auxiliary %1");
m_resetStr = tr("Reset to default");
m_effectRackStr = tr("Effect Rack %1");
- m_effectUnitStr = tr("Unit %1");
+ m_effectUnitStr = tr("Effect Unit %1");
m_effectStr = tr("Slot %1");
m_parameterStr = tr("Parameter %1");
m_libraryStr = tr("Library");
- // Master Controls
+ // Mixer Controls
QMenu* mixerMenu = addSubmenu(tr("Mixer"));
- addControl("[Master]", "crossfader", tr("Crossfader"), tr("Master crossfader"), mixerMenu, true);
- addControl("[Master]", "gain", tr("Master Gain"), tr("Master gain"), mixerMenu, true);
- addControl("[Master]", "balance", tr("Master Balance"), tr("Master balance"), mixerMenu, true);
- addControl("[Master]", "delay", tr("Master Delay"), tr("Master delay"), mixerMenu, true);
- addControl("[Master]", "headGain", tr("Headphone Gain"), tr("Headphone gain"), mixerMenu, true);
- addControl("[Master]", "headMix", tr("Headphone Mix"), tr("Headphone mix (pre/main)"), mixerMenu, true);
- addControl("[Master]", "headSplit", tr("Headphone Split Cue"), tr("Toggle headphone split cueing"), mixerMenu);
- addControl("[Master]", "headDelay", tr("Headphone Delay"), tr("Headphone delay"), mixerMenu, true);
- addDeckAndSamplerControl("orientation", tr("Orientation"),
- tr("Mix orientation (e.g. left, right, center)"), mixerMenu);
- addDeckAndSamplerControl("orientation_left", tr("Orient Left"),
- tr("Set mix orientation to left"), mixerMenu);
- addDeckAndSamplerControl("orientation_center", tr("Orient Center"),
- tr("Set mix orientation to center"), mixerMenu);
- addDeckAndSamplerControl("orientation_right", tr("Orient Right"),
- tr("Set mix orientation to right"), mixerMenu);
+ // Crossfader / Orientation
+ QMenu* crossfaderMenu = addSubmenu(tr("Crossfader / Orientation"), mixerMenu);
+ addControl("[Master]",
+ "crossfader",
+ tr("Crossfader"),
+ tr("Master crossfader"),
+ crossfaderMenu,
+ true);
+ addDeckAndSamplerControl("orientation",
+ tr("Orientation"),
+ tr("Mix orientation (e.g. left, right, center)"),
+ crossfaderMenu);
+ addDeckAndSamplerControl("orientation_left",
+ tr("Orient Left"),
+ tr("Set mix orientation to left"),
+ crossfaderMenu);
+ addDeckAndSamplerControl("orientation_center",
+ tr("Orient Center"),
+ tr("Set mix orientation to center"),
+ crossfaderMenu);
+ addDeckAndSamplerControl("orientation_right",
+ tr("Orient Right"),
+ tr("Set mix orientation to right"),
+ crossfaderMenu);
+ // Main Output
+ QMenu* mainOutputMenu = addSubmenu(tr("Main Output"), mixerMenu);
+ addControl("[Master]",
+ "gain",
+ tr("Main Output Gain"),
+ tr("Main Output gain"),
+ mainOutputMenu,
+ true);
+ addControl("[Master]",
+ "balance",
+ tr("Main Output Balance"),
+ tr("Main Output balance"),
+ mainOutputMenu,
+ true);
+ addControl("[Master]",
+ "delay",
+ tr("Main Output Delay"),
+ tr("Main Output delay"),
+ mainOutputMenu,
+ true);
+ // Headphone
+ QMenu* headphoneMenu = addSubmenu(tr("Headphone"), mixerMenu);
+ addControl("[Master]",
+ "headGain",
+ tr("Headphone Gain"),
+ tr("Headphone gain"),
+ headphoneMenu,
+ true);
+ addControl("[Master]",
+ "headMix",
+ tr("Headphone Mix"),
+ tr("Headphone mix (pre/main)"),
+ headphoneMenu,
+ true);
+ addControl("[Master]",
+ "headSplit",
+ tr("Headphone Split Cue"),
+ tr("Toggle headphone split cueing"),
+ headphoneMenu);
+ addControl("[Master]",
+ "headDelay",
+ tr("Headphone Delay"),
+ tr("Headphone delay"),
+ headphoneMenu,
+ true);
+ mixerMenu->addSeparator();
+ // EQs
+ QMenu* eqMenu = addSubmenu(tr("Equalizers"), mixerMenu);
+ constexpr int kNumEqRacks = 1;
+ const int iNumDecks = static_cast<int>(ControlObject::get(ConfigKey("[Master]", "num_decks")));
+ for (int iRackNumber = 0; iRackNumber < kNumEqRacks; ++iRackNumber) {
+ // TODO: Although there is a mode with 4-band EQs, it's not feasible
+ // right now to add support for learning both it and regular 3-band eqs.
+ // Since 3-band is by far the most common, stick with that.
+ const int kMaxEqs = 3;
+ QList<QString> eqNames;
+ eqNames.append(tr("Low EQ"));
+ eqNames.append(tr("Mid EQ"));
+ eqNames.append(tr("High EQ"));
+ for (int deck = 1; deck <= iNumDecks; ++deck) {
+ QMenu* deckMenu = addSubmenu(QString("Deck %1").arg(deck), eqMenu);
+ for (int effect = kMaxEqs - 1; effect >= 0; --effect) {
+ const QString group = EqualizerRack::formatEffectSlotGroupString(
+ iRackNumber, 0, QString("[Channel%1]").arg(deck));
+ QMenu* bandMenu = addSubmenu(eqNames[effect], deckMenu);
+ QString control = "parameter%1";
+ addControl(group,
+ control.arg(effect + 1),
+ tr("Adjust %1").arg(eqNames[effect]),
+ tr("Adjust %1").arg(eqNames[effect]),
+ bandMenu,
+ true,
+ tr("Deck %1").arg(deck));
+
+ control = "button_parameter%1";
+ addControl(group,
+ control.arg(effect + 1),
+ tr("Kill %1").arg(eqNames[effect]),
+ tr("Kill %1").arg(eqNames[effect]),
+ bandMenu,
+ false,
+ tr("Deck %1").arg(deck));
+ }
+ }
+ }
+ mixerMenu->addSeparator();
+ // Volume / Pfl controls
+ addDeckAndSamplerControl("volume", tr("Volume"), tr("Volume Fader"), mixerMenu, true);
+ addDeckAndSamplerControl("volume_set_one",
+ tr("Full Volume"),
+ tr("Set to full volume"),
+ mixerMenu);
+ addDeckAndSamplerControl("volume_set_zero",
+ tr("Zero Volume"),
+ tr("Set to zero volume"),
+ mixerMenu);
+ addDeckAndSamplerAndPreviewDeckControl("pregain",
+ tr("Track Gain"),
+ tr("Track Gain knob"),
+ mixerMenu,
+ true);
+ addDeckAndSamplerControl("mute", tr("Mute"), tr("Mute button"), mixerMenu);
+ mixerMenu->addSeparator();
+ addDeckAndSamplerControl("pfl",
+ tr("Headphone Listen"),
+ tr("Headphone listen (pfl) button"),
+ mixerMenu);
+
+ addSeparator();
// Transport
QMenu* transportMenu = addSubmenu(tr("Transport"));
addDeckAndSamplerAndPreviewDeckControl("play", tr("Play"), tr("Play button"), transportMenu);
- // Preview deck does not go to master so volume does not matter.
addDeckAndSamplerAndPreviewDeckControl("back", tr("Fast Rewind"), tr("Fast Rewind button"), transportMenu);
addDeckAndSamplerAndPreviewDeckControl("fwd", tr("Fast Forward"), tr("Fast Forward button"), transportMenu);
addDeckAndSamplerAndPreviewDeckControl("playposition", tr("Strip Search"),
@@ -62,24 +178,20 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent)
addDeckAndSamplerAndPreviewDeckControl("start_stop", tr("Stop And Jump To Start"),
tr("Stop playback and jump to start of track"), transportMenu);
addDeckAndSamplerAndPreviewDeckControl("end", tr("Jump To End"), tr("Jump to end of track"), transportMenu);
- addDeckAndSamplerControl("volume", tr("Volume"), tr("Volume Fader"), transportMenu, true);
- addDeckAndSamplerControl("volume_set_one", tr("Full Volume"), tr("Set to full volume"), transportMenu);
- addDeckAndSamplerControl("volume_set_zero", tr("Zero Volume"), tr("Set to zero volume"), transportMenu);
- addDeckAndSamplerAndPreviewDeckControl("pregain", tr("Track Gain"), tr("Track Gain knob"), transportMenu, true);
- addDeckAndSamplerControl("mute", tr("Mute"), tr("Mute button"), transportMenu);
+ transportMenu->addSeparator();
addDeckAndSamplerAndPreviewDeckControl("eject", tr("Eject"), tr("Eject track"), transportMenu);
- addDeckAndSamplerControl("pfl", tr("Headphone Listen"), tr("Headphone listen (pfl) button"), transportMenu);
addDeckAndSamplerControl("repeat", tr("Repeat Mode"), tr("Toggle repeat mode"), transportMenu);
addDeckAndSamplerControl("slip_enabled", tr("Slip Mode"), tr("Toggle slip mode"), transportMenu);
- // BPM & Sync
- QMenu* bpmMenu = addSubmenu(tr("BPM"));
+ // BPM / Beatgrid
+ QMenu* bpmMenu = addSubmenu(tr("BPM / Beatgrid"));
addDeckAndSamplerControl("bpm", tr("BPM"), tr("BPM"), bpmMenu, true);
addDeckAndSamplerControl("bpm_up", tr("BPM +1"), tr("Increase BPM by 1"), bpmMenu);
addDeckAndSamplerControl("bpm_down", tr("BPM -1"), tr("Decrease BPM by 1"), bpmMenu);
addDeckAndSamplerControl("bpm_up_small", tr("BPM +0.1"), tr("Increase BPM by 0.1"), bpmMenu);
addDeckAndSamplerControl("bpm_down_small", tr("BPM -0.1"), tr("Decrease BPM by 0.1"), bpmMenu);
addDeckAndSamplerControl("bpm_tap", tr("BPM Tap"), tr("BPM tap button"), bpmMenu);
+ bpmMenu->addSeparator();
addDeckAndSamplerControl("beats_adjust_faster", tr("Adjust Beatgrid Faster +.01"), tr("Increase track's average BPM by 0.01"), bpmMenu);
addDeckAndSamplerControl("beats_adjust_slower", tr("Adjust Beatgrid Slower -.01"), tr("Decrease track's average BPM by 0.01"), bpmMenu);
addDeckAndSamplerControl("beats_translate_earlier", tr("Move Beatgrid Earlier"), tr("Adjust the beatgrid to the left"), bpmMenu);
@@ -88,11 +200,28 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent)
tr("Align beatgrid to current position"), bpmMenu);
addDeckControl("beats_translate_match_alignment", tr("Adjust Beatgrid - Match Alignment"),
tr("Adjust beatgrid to match another playing deck."), bpmMenu);
+ bpmMenu->addSeparator();
addDeckAndSamplerControl("quantize", tr("Quantize Mode"), tr("Toggle quantize mode"), bpmMenu);
QMenu* syncMenu = addSubmenu(tr("Sync"));
- addDeckAndSamplerControl("sync_enabled", tr("Sync Mode"),
- tr("Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync"), syncMenu);
+ addDeckAndSamplerControl("sync_enabled",
+ tr("Sync / Sync Lock"),
+ tr("Tap to sync tempo (and phase with quantize enabled), hold to "
+ "enable permanent sync"),
+ syncMenu);
+ addDeckAndSamplerControl("beatsync",
+ tr("Beat Sync One-Shot"),
+ tr("One-time beat sync tempo (and phase with quantize enabled)"),
+ syncMenu);
+ addDeckAndSamplerControl("beatsync_tempo",
+ tr("Sync Tempo One-Shot"),
+ tr("One-time beat sync (tempo only)"),
+ syncMenu);
+ addDeckAndSamplerControl("beatsync_phase",
+ tr("Sync Phase One-Shot"),
+ tr("One-time beat sync (phase only)"),
+ syncMenu);
+ syncMenu->addSeparator();
addControl("[InternalClock]", "sync_master", tr("Internal Sync Master"),
tr("Toggle Internal Sync Master"), syncMenu);
addControl("[InternalClock]", "bpm", tr("Internal Master BPM"),
@@ -107,36 +236,16 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent)
tr("Increase internal master BPM by 0.1"), syncMenu);
addControl("[InternalClock]", "bpm_down_small", tr("Internal Master BPM -0.1"),
tr("Decrease internal master BPM by 0.1"), syncMenu);
+ syncMenu->addSeparator();
addDeckAndSamplerControl("sync_master", tr("Sync Master"), tr("Toggle sync master"), syncMenu);
addDeckAndSamplerControl("sync_mode", tr("Sync Mode"),
tr("Sync mode 3-state toggle (OFF, FOLLOWER, MASTER)"), syncMenu);
- addDeckAndSamplerControl("beatsync", tr("Beat Sync One-Shot"),
- tr("One-time beat sync tempo (and phase with quantize enabled)"), syncMenu);
- addDeckAndSamplerControl("beatsync_tempo", tr("Sync Tempo One-Shot"),
- tr("One-time beat sync (tempo only)"), syncMenu);
- addDeckAndSamplerControl("beatsync_phase", tr("Sync Phase One-Shot"),
- tr("One-time beat sync (phase only)"), syncMenu);
// Speed
- QMenu* speedMenu = addSubmenu(tr("Speed (Pitch/Tempo)"));
- addDeckAndSamplerControl("keylock", tr("Keylock Mode"),
- tr("Toggle keylock mode"), speedMenu);
+ QMenu* speedMenu = addSubmenu(tr("Speed"));
addDeckAndSamplerControl("rate", tr("Playback Speed"),
tr("Playback speed control (Vinyl \"Pitch\" slider)"), speedMenu, true);
- addDeckAndSamplerControl("pitch", tr("Pitch (Musical key)"),
- tr("Pitch control (does not affect tempo), center is original pitch"), speedMenu, true);
- addDeckAndSamplerControl("pitch_up", tr("Increase Pitch"),
- tr("Increases the pitch by one semitone"), speedMenu);
- addDeckAndSamplerControl("pitch_up_small", tr("Increase Pitch (Fine)"),
- tr("Increases the pitch by 10 cents"), speedMenu);
- addDeckAndSamplerControl("pitch_down", tr("Decrease Pitch"),
- tr("Decreases the pitch by one semitone"), speedMenu);
- addDeckAndSamplerControl("pitch_down_small", tr("Decrease Pitch (Fine)"),
- tr("Decreases the pitch by 10 cents"), speedMenu);
- addDeckAndSamplerControl("pitch_adjust", tr("Pitch Adjust"),
- tr("Adjust pitch from speed slider pitch"), speedMenu, true);
- addDeckAndSamplerControl("sync_key", tr("Match Key"), tr("Match musical key"), speedMenu);
- addDeckAndSamplerControl("reset_key", tr("Reset Key"), tr("Resets key to original"), speedMenu);
+ speedMenu->addSeparator();
addDeckAndSamplerControl("rate_perm_up", tr("Increase Speed"),
tr("Adjust speed faster (coarse)"), speedMenu);
addDeckAndSamplerControl("rate_perm_up_small", tr("Increase Speed (Fine)"),
@@ -145,6 +254,7 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent)
tr("Adjust speed slower (coarse)"), speedMenu);
addDeckAndSamplerControl("rate_perm_down_small", tr("Increase Speed (Fine)"),
tr("Adjust speed slower (fine)"), speedMenu);
+ speedMenu->addSeparator();
addDeckAndSamplerControl("rate_temp_up", tr("Temporarily Increase Speed"),
tr("Temporarily increase speed (coarse)"), speedMenu);
addDeckAndSamplerControl("rate_temp_up_small", tr("Temporarily Increase Speed (Fine)"),
@@ -153,40 +263,39 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent)
tr("Temporarily decrease speed (coarse)"), speedMenu);
addDeckAndSamplerControl("rate_temp_down_small", tr("Temporarily Decrease Speed (Fine)"),
tr("Temporarily decrease speed (fine)"), speedMenu);
-
- // EQs
- QMenu* eqMenu = addSubmenu(tr("Equalizers"));
- constexpr int kNumEqRacks = 1;
- const int iNumDecks = static_cast<int>(ControlObject::get(ConfigKey("[Master]", "num_decks")));
- for (int iRackNumber = 0; iRackNumber < kNumEqRacks; ++iRackNumber) {
- // TODO: Although there is a mode with 4-band EQs, it's not feasible
- // right now to add support for learning both it and regular 3-band eqs.
- // Since 3-band is by far the most common, stick with that.
- const int kMaxEqs = 3;
- QList<QString> eqNames;
- eqNames.append(tr("Low EQ"));
- eqNames.append(tr("Mid EQ"));
- eqNames.append(tr("High EQ"));
- for (int deck = 1; deck <= iNumDecks; ++deck) {
- QMenu* deckMenu = addSubmenu(QString("Deck %1").arg(deck), eqMenu);
- for (int effect = kMaxEqs - 1; effect >= 0; --effect) {
- const QString group = EqualizerRack::formatEffectSlotGroupString(
- iRackNumber, 0, QString("[Channel%1]").arg(deck));
- QMenu* bandMenu = addSubmenu(eqNames[effect], deckMenu);
- QString control = "parameter%1";
- addControl(group, control.arg(effect+1),
- tr("Adjust %1").arg(eqNames[effect]),
- tr("Adjust %1").arg(eqNames[effect]),
- bandMenu, true, tr("Deck %1").arg(deck));
-
- control = "button_parameter%1";
- addControl(group, control.arg(effect+1),
- tr("Kill %1").arg(eqNames[effect]),
- tr("Kill %1").arg(eqNames[effect]),
- bandMenu, false, tr("Deck %1").arg(deck));
- }
- }
- }
+ // Pitch (Musical Key)
+ QMenu* pitchMenu = addSubmenu(tr("Pitch (Musical Key)"));
+ addDeckAndSamplerControl("pitch",
+ tr("Pitch (Musical key)"),
+ tr("Pitch control (does not affect tempo), center is original "
+ "pitch"),
+ pitchMenu,
+ true);
+ addDeckAndSamplerControl("pitch_up",
+ tr("Increase Pitch"),
+ tr("Increases the pitch by one semitone"),
+ pitchMenu);
+ addDeckAndSamplerControl("pitch_up_small",
+ tr("Increase Pitch (Fine)"),
+ tr("Increases the pitch by 10 cents"),
+ pitchMenu);
+ addDeckAndSamplerControl("pitch_down",
+ tr("Decrease Pitch"),
+ tr("Decreases the pitch by one semitone"),
+ pitchMenu);
+ addDeckAndSamplerControl("pitch_down_small",
+ tr("Decrease Pitch (Fine)"),
+ tr("Decreases the pitch by 10 cents"),
+ pitchMenu);
+ addDeckAndSamplerControl("pitch_adjust",
+ tr("Pitch Adjust"),
+ tr("Adjust pitch from speed slider pitch"),
+ pitchMenu,
+ true);
+ pitchMenu->addSeparator();
+ addDeckAndSamplerControl("sync_key", tr("Match Key"), tr("Match musical key"), pitchMenu);
+ addDeckAndSamplerControl("reset_key", tr("Reset Key"), tr("Resets key to original"), pitchMenu);
+ addDeckAndSamplerControl("keylock", tr("Keylock"), tr("Toggle keylock mode"), pitchMenu);
// Vinyl Control
QMenu* vinylControlMenu = addSubmenu(tr("Vinyl Control"));
@@ -220,7 +329,7 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent)
tr("Go to cue point and play after release"), cueMenu);
// Hotcues
- QMenu* hotcueMenu = addSubmenu(tr("Hotcues"));
+ QMenu* hotcueMainMenu = addSubmenu(tr("Hotcues"));
QString hotcueActivateTitle = tr("Hotcue %1");
QString hotcueClearTitle = tr("Clear Hotcue %1");
QString hotcueSetTitle = tr("Set Hotcue %1");
@@ -235,8 +344,25 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent)
QString hotcueGotoAndStopDescription = tr("Jump to hotcue %1 and stop");
QString hotcueGotoAndPlayDescription = tr("Jump to hotcue %1 and play");
QString hotcuePreviewDescription = tr("Preview from hotcue %1");
+ // add menus for hotcues 1-16.
+ // though, keep the menu small put additional hotcues in a separate menu,
+ // but don't create that submenu for less than 4 additional hotcues.
+ int preferredHotcuesVisible = 16;
+ int moreMenuThreshold = 4;
+ QMenu* parentMenu = hotcueMainMenu;
+ QMenu* hotcueMoreMenu = nullptr;
+ bool moreHotcues = NUM_HOT_CUES >= preferredHotcuesVisible + moreMenuThreshold;
+ if (moreHotcues) {
+ // populate menu here, add it below #preferredHotcuesVisible
+ hotcueMoreMenu = new QMenu(
+ tr("Hotcues %1-%2").arg(preferredHotcuesVisible + 1).arg(NUM_HOT_CUES),
+ hotcueMainMenu);
+ }
for (int i = 1; i <= NUM_HOT_CUES; ++i) {
- QMenu* hotcueSubMenu = addSubmenu(tr("Hotcue %1").arg(QString::number(i)), hotcueMenu);
+ if (moreHotcues && i > preferredHotcuesVisible) {
+ parentMenu = hotcueMoreMenu;
+ }
+ QMenu* hotcueSubMenu = addSubmenu(tr("Hotcue %1").arg(QString::number(i)), parentMenu);
addDeckAndSamplerControl(QString("hotcue_%1_activate").arg(i),
hotcueActivateTitle.arg(QString::number(i)),
hotcueActivateDescription.arg(QString::number(i)),
@@ -266,6 +392,10 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent)
hotcuePreviewDescription.arg(QString::number(i)),
hotcueSubMenu);
}
+ if (moreHotcues) {
+ hotcueMainMenu->addSeparator();
+ hotcueMainMenu->addMenu(hotcueMoreMenu);
+ }
// Loops
QMenu* loopMenu = addSubmenu(tr("Looping"));
@@ -275,16 +405,10 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent)
QString beatloopActivateDescription = tr("Create a beat loop of selected beat size");
QString beatloopRollActivateTitle = tr("Loop Roll Selected Beats");
QString beatloopRollActivateDescription = tr("Create a rolling beat loop of selected beat size");
-
- addDeckControl("loop_in", tr("Loop In"), tr("Loop In button"), loopMenu);
- addDeckControl("loop_out", tr("Loop Out"), tr("Loop Out button"), loopMenu);
- addDeckControl("loop_exit", tr("Loop Exit"), tr("Loop Exit button"), loopMenu);
- addDeckControl("reloop_toggle", tr("Reloop/Exit Loop"), tr("Toggle loop on/off and jump to Loop In point if loop is behind play position"), loopMenu);
- addDeckControl("reloop_andstop", tr("Reloop And Stop"), tr("Enable loop, jump to Loop In point, and stop"), loopMenu);
- addDeckControl("loop_halve", tr("Loop Halve"), tr("Halve the loop length"), loopMenu);
- addDeckControl("loop_double", tr("Loop Double"), tr("Double the loop length"), loopMenu);
- addDeckControl("beatloop_activate", beatloopActivateTitle, beatloopActivateDescription, loopMenu);
- addDeckControl("beatlooproll_activate", beatloopRollActivateTitle, beatloopRollActivateDescription, loopMenu);
+ QString beatLoopTitle = tr("Loop %1 Beats");
+ QString beatLoopRollTitle = tr("Loop Roll %1 Beats");
+ QString beatLoopDescription = tr("Create %1-beat loop");
+ QString beatLoopRollDescription = tr("Create temporary %1-beat loop roll");
QList<double> beatSizes = LoopingControl::getBeatSizes();
@@ -302,50 +426,51 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent)
humanBeatSizes[32] = tr("32");
humanBeatSizes[64] = tr("64");
- // Loop moving
- QString loopMoveForwardTitle = tr("Move Loop +%1 Beats");
- QString loopMoveBackwardTitle = tr("Move Loop -%1 Beats");
- QString loopMoveForwardDescription = tr("Move loop forward by %1 beats");
- QString loopMoveBackwardDescription = tr("Move loop backward by %1 beats");
-
- foreach (double beats, beatSizes) {
- QString humanBeats = humanBeatSizes.value(beats, QString::number(beats));
- addDeckControl(QString("loop_move_%1_forward").arg(beats),
- loopMoveForwardTitle.arg(humanBeats),
- loopMoveForwardDescription.arg(humanBeats), loopMenu);
- }
-
- foreach (double beats, beatSizes) {
- QString humanBeats = humanBeatSizes.value(beats, QString::number(beats));
- addDeckControl(QString("loop_move_%1_backward").arg(beats),
- loopMoveBackwardTitle.arg(humanBeats),
- loopMoveBackwardDescription.arg(humanBeats), loopMenu);
- }
-
// Beatloops
- QMenu* beatLoopMenu = addSubmenu(tr("Beat-Looping"));
- QString beatLoopTitle = tr("Loop %1 Beats");
- QString beatLoopRollTitle = tr("Loop Roll %1 Beats");
- QString beatLoopDescription = tr("Create %1-beat loop");
- QString beatLoopRollDescription = tr("Create temporary %1-beat loop roll");
-
- addDeckControl("beatloop_activate", beatloopActivateTitle, beatloopActivateDescription, beatLoopMenu);
- addDeckControl("beatlooproll_activate", beatloopRollActivateTitle, beatloopRollActivateDescription, beatLoopMenu);
+ addDeckControl("beatloop_activate",
+ beatloopActivateTitle,
+ beatloopActivateDescription,
+ loopMenu);
+ QMenu* loopActivateMenu = addSubmenu(tr("Loop Beats"), loopMenu);
foreach (double beats, beatSizes) {
QString humanBeats = humanBeatSizes.value(beats, QString::number(beats));
addDeckControl(QString("beatloop_%1_toggle").arg(beats),
- beatLoopTitle.arg(humanBeats),
- beatLoopDescription.arg(humanBeats), beatLoopMenu);
+ beatLoopTitle.arg(humanBeats),
+ beatLoopDescription.arg(humanBeats),
+ loopActivateMenu);
}
+ loopMenu->addSeparator();
+ addDeckControl("beatlooproll_activate",
+ beatloopRollActivateTitle,
+ beatloopRollActivateDescription,
+ loopMenu);
+ QMenu* looprollActivateMenu = addSubmenu(tr("Loop Roll Beats"), loopMenu);
foreach (double beats, beatSizes) {
QString humanBeats = humanBeatSizes.value(beats, QString::number(beats));
addDeckControl(QString("beatlooproll_%1_activate").arg(beats),
- beatLoopRollTitle.arg(humanBeats),
- beatLoopRollDescription.arg(humanBeats), beatLoopMenu);
+ beatLoopRollTitle.arg(humanBeats),
+ beatLoopRollDescription.arg(humanBeats),
+ looprollActivateMenu);
}
+ loopMenu->addSeparator();
- // Beat jumping
+ addDeckControl("loop_in", tr("Loop In"), tr("Loop In button"), loopMenu);
+ addDeckControl("loop_out", tr("Loop Out"), tr("Loop Out button"), loopMenu);
+ addDeckControl("loop_exit", tr("Loop Exit"), tr("Loop Exit button"), loopMenu);
+ addDeckControl("reloop_toggle",
+ tr("Reloop/Exit Loop"),
+ tr("Toggle loop on/off and jump to Loop In point if loop is behind "
+ "play position"),
+ loopMenu);
+ addDeckControl("reloop_andstop",
+ tr("Reloop And Stop"),
+ tr("Enable loop, jump to Loop In point, and stop"),
+ loopMenu);
+ addDeckControl("loop_halve", tr("Loop Halve"), tr("Halve the loop length"), loopMenu);
+ addDeckControl("loop_double", tr("Loop Double"), tr("Double the loop length"), loopMenu);
+
+ // Beat Jump / Loop Move
QMenu* beatJumpMenu = addSubmenu(tr("Beat Jump / Loop Move"));
QString beatJumpForwardTitle = tr("Jump / Move Loop Forward %1 Beats");
QString beatJumpBackwardTitle = tr("Jump / Move Loop Backward %1 Beats");
@@ -353,75 +478,160 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent)
QString beatJumpBackwardDescription = tr("Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats");
addDeckControl("beatjump_forward", tr("Beat Jump / Loop Move Forward Selected Beats"), tr("Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats"), beatJumpMenu);
addDeckControl("beatjump_backward", tr("Beat Jump / Loop Move Backward Selected Beats"), tr("Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats"), beatJumpMenu);
+ beatJumpMenu->addSeparator();
+ QMenu* beatjumpFwdSubmenu = addSubmenu(tr("Beat Jump / Loop Move Forward"), beatJumpMenu);
foreach (double beats, beatSizes) {
QString humanBeats = humanBeatSizes.value(beats, QString::number(beats));
addDeckControl(QString("beatjump_%1_forward").arg(beats),
- beatJumpForwardTitle.arg(humanBeats),
- beatJumpForwardDescription.arg(humanBeats), beatJumpMenu);
+ beatJumpForwardTitle.arg(humanBeats),
+ beatJumpForwardDescription.arg(humanBeats),
+ beatjumpFwdSubmenu);
}
+ QMenu* beatjumpBwdSubmenu = addSubmenu(tr("Beat Jump / Loop Move Backward"), beatJumpMenu);
foreach (double beats, beatSizes) {
QString humanBeats = humanBeatSizes.value(beats, QString::number(beats));
addDeckControl(QString("beatjump_%1_backward").arg(beats),
- beatJumpBackwardTitle.arg(humanBeats),
- beatJumpBackwardDescription.arg(humanBeats), beatJumpMenu);
+ beatJumpBackwardTitle.arg(humanBeats),
+ beatJumpBackwardDescription.arg(humanBeats),
+ beatjumpBwdSubmenu);
}
+ // Loop moving
+ QString loopMoveForwardTitle = tr("Move Loop +%1 Beats");
+ QString loopMoveBackwardTitle = tr("Move Loop -%1 Beats");
+ QString loopMoveForwardDescription = tr("Move loop forward by %1 beats");
+ QString loopMoveBackwardDescription = tr("Move loop backward by %1 beats");
+
+ QMenu* loopmoveFwdSubmenu = addSubmenu(tr("Loop Move Forward"), beatJumpMenu);
+ foreach (double beats, beatSizes) {
+ QString humanBeats = humanBeatSizes.value(beats, QString::number(beats));
+ addDeckControl(QString("loop_move_%1_forward").arg(beats),
+ loopMoveForwardTitle.arg(humanBeats),
+ loopMoveForwardDescription.arg(humanBeats),
+ loopmoveFwdSubmenu);
+ }
+
+ QMenu* loopmoveBwdSubmenu = addSubmenu(tr("Loop Move Backward"), beatJumpMenu);
+ foreach (double beats, beatSizes) {
+ QString humanBeats = humanBeatSizes.value(beats, QString::number(beats));
+ addDeckControl(QString("loop_move_%1_backward").arg(beats),
+ loopMoveBackwardTitle.arg(humanBeats),
+ loopMoveBackwardDescription.arg(humanBeats),
+ loopmoveBwdSubmenu);
+ }
+
+ addSeparator();
+
// Library Controls
QMenu* libraryMenu = addSubmenu(tr("Library"));
- addControl("[Library]", "MoveUp",
- tr("Move up"),
- tr("Equivalent to pressing the UP key on the keyboard"),
- libraryMenu, false, m_libraryStr);
- addControl("[Library]", "MoveDown",
- tr("Move down"),
- tr("Equivalent to pressing the DOWN key on the keyboard"),
- libraryMenu, false, m_libraryStr);
- addControl("[Library]", "MoveVertical",
- tr("Move up/down"),
- tr("Move vertically in either direction using a knob, as if pressing UP/DOWN keys"),
- libraryMenu, false, m_libraryStr);
- addControl("[Library]", "ScrollUp",
- tr("Scroll Up"),
- tr("Equivalent to pressing the PAGE UP key on the keyboard"),
- libraryMenu, false, m_libraryStr);
- addControl("[Library]", "ScrollDown",
- tr("Scroll Down"),
- tr("Equivalent to pressing the PAGE DOWN key on the keyboard"),
- libraryMenu, false, m_libraryStr);
- addControl("[Library]", "ScrollVertical",
- tr("Scroll up/down"),
- tr("Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys"),
- libraryMenu, false, m_libraryStr);
- addControl("[Library]", "MoveLeft",
- tr("Move left"),
- tr("Equivalent to pressing the LEFT key on the keyboard"),
- libraryMenu, false, m_libraryStr);
- addControl("[Library]", "MoveRight",
- tr("Move right"),
- tr("Equivalent to pressing the RIGHT key on the keyboard"),
- libraryMenu, false, m_libraryStr);
- addControl("[Library]", "MoveHorizontal",
- tr("Move left/right"),
- tr("Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys"),
- libraryMenu, false, m_libraryStr);
- addControl("[Library]", "MoveFocusForward",
- tr("Move focus to right pane"),
- tr("Equivalent to pressing the TAB key on the keyboard"),
- libraryMenu, false, m_libraryStr);
- addControl("[Library]", "MoveFocusBackward",
- tr("Move focus to left pane"),
- tr("Equivalent to pressing the SHIFT+TAB key on the keyboard"),
- libraryMenu, false, m_libraryStr);
- addControl("[Library]", "MoveFocus",
- tr("Move focus to right/left pane"),
- tr("Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys"),
- libraryMenu, false, m_libraryStr);
+ QMenu* navigationMenu = addSubmenu(tr("Navigation"), libraryMenu);
+ addControl("[Library]",
+ "MoveUp",
+ tr("Move up"),
+ tr("Equivalent to pressing the UP key on the keyboard"),
+ navigationMenu,
+ false,
+ m_libraryStr);
+ addControl("[Library]",
+ "MoveDown",
+ tr("Move down"),
+ tr("Equivalent to pressing the DOWN key on the keyboard"),
+ navigationMenu,
+ false,
+ m_libraryStr);
+ addControl("[Library]",
+ "MoveVertical",
+ tr("Move up/down"),
+ tr("Move vertically in either direction using a knob, as if "
+ "pressing UP/DOWN keys"),
+ navigationMenu,
+ false,
+ m_libraryStr);
+ addControl("[Library]",
+ "ScrollUp",
+ tr("Scroll Up"),
+ tr("Equivalent to pressing the PAGE UP key on the keyboard"),
+ navigationMenu,
+ false,
+ m_libraryStr);
+ addControl("[Library]",
+ "ScrollDown",
+ tr("Scroll Down"),
+ tr("Equivalent to pressing the PAGE DOWN key on the keyboard"),
+ navigationMenu,
+ false,
+ m_libraryStr);
+ addControl("[Library]",
+ "ScrollVertical",
+ tr("Scroll up/down"),
+ tr("Scroll vertically in either direction using a knob, as if "
+ "pressing PGUP/PGDOWN keys"),
+ navigationMenu,
+ false,
+ m_libraryStr);
+ addControl("[Library]",
+ "MoveLeft",
+ tr("Move left"),
+ tr("Equivalent to pressing the LEFT key on the keyboard"),
+ navigationMenu,
+ false,
+ m_libraryStr);
+ addControl("[Library]",
+ "MoveRight",
+ tr("Move right"),
+ tr("Equivalent to pressing the RIGHT key on the keyboard"),
+ navigationMenu,
+ false,
+ m_libraryStr);
+ addControl("[Library]",
+ "MoveHorizontal",
+ tr("Move left/right"),
+ tr("Move horizontally in either direction using a knob, as if "
+ "pressing LEFT/RIGHT keys"),
+ navigationMenu,
+ false,
+ m_libraryStr);
+ navigationMenu->addSeparator();
+ addControl("[Library]",
+ "MoveFocusForward",
+ tr("Move focus to right pane"),
+ tr("Equivalent to pressing the TAB key on the keyboard"),
+ navigationMenu,
+ false,
+ m_libraryStr);
+ addControl("[Library]",
+ "MoveFocusBackward",
+ tr("Move focus to left pane"),
+ tr("Equivalent to pressing the SHIFT+TAB key on the keyboard"),
+ navigationMenu,
+ false,
+ m_libraryStr);
+ addControl("[Library]",
+ "MoveFocus",
+ tr("Move focus to right/left pane"),
+ tr("Move focus one pane to right or left using a knob, as if "
+ "pressing TAB/SHIFT+TAB keys"),
+ navigationMenu,
+ false,
+ m_libraryStr);
+ libraryMenu->addSeparator();
addControl("[Library]", "GoToItem",
tr("Go to the currently selected item"),
tr("Choose the currently selected item and advance forward one pane if appropriate"),
libraryMenu, false, m_libraryStr);
+ // Load track (these can be loaded into any channel)
+ addDeckAndSamplerControl("LoadSelectedTrack",
+ tr("Load Track"),
+ tr("Load selected track"),
+ libraryMenu);
+ addDeckAndSamplerAndPreviewDeckControl("LoadSelectedTrackAndPlay",
+ tr("Load Track and Play"),
+ tr("Load selected track and play"),
+ libraryMenu);
+ libraryMenu->addSeparator();
+ // Auto DJ
addControl("[Library]", "AutoDjAddBottom",
tr("Add to Auto DJ Queue (bottom)"),
tr("Append the selected track to the Auto DJ Queue"),
@@ -434,15 +644,7 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent)
tr("Add to Auto DJ Queue (replace)"),
tr("Replace Auto DJ Queue with selected tracks"),
libraryMenu, false, m_libraryStr);
-
-
- // Load track (these can be loaded into any channel)
- addDeckAndSamplerControl("LoadSelectedTrack",
- tr("Load Track"),
- tr("Load selected track"), libraryMenu);
- addDeckAndSamplerAndPreviewDeckControl("LoadSelectedTrackAndPlay", tr("Track Load and Play"),
- tr("Load selected track and play"), libraryMenu);
-
+ libraryMenu->addSeparator();
addControl("[Recording]", "toggle_recording",
tr("Record Mix"),
tr("Toggle mix recording"),
@@ -464,17 +666,16 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent)
quickEffectMenu, false, tr("Quick Effect"));
}
+ effectsMenu->addSeparator();
+
+ // When kNumEffectRacks is changed to >1 put effect unit actions into
+ // separate "Effect Rack N" submenus.
const int kNumEffectRacks = 1;
for (int iRackNumber = 1; iRackNumber <= kNumEffectRacks; ++iRackNumber) {
const QString rackGroup = StandardEffectRack::formatGroupString(
iRackNumber - 1);
- QMenu* rackMenu = addSubmenu(m_effectRackStr.arg(iRackNumber), effectsMenu);
QString descriptionPrefix = m_effectRackStr.arg(iRackNumber);
- addControl(rackGroup, "clear",
- tr("Clear Effect Rack"), tr("Clear effect rack"),
- rackMenu, false, descriptionPrefix);
-
const int numEffectUnits = static_cast<int>(ControlObject::get(
ConfigKey(rackGroup, "num_effectunits")));
for (int iEffectUnitNumber = 1; iEffectUnitNumber <= numEffectUnits;
@@ -483,11 +684,10 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent)
StandardEffectRack::formatEffectChainSlotGroupString(
iRackNumber - 1, iEffectUnitNumber - 1);
- descriptionPrefix = QString("%1, %2").arg(m_effectRackStr.arg(iRackNumber),
- m_effectUnitStr.arg(iEffectUnitNumber));
+ descriptionPrefix = QString("%1").arg(m_effectUnitStr.arg(iEffectUnitNumber));
QMenu* effectUnitMenu = addSubmenu(m_effectUnitStr.arg(iEffectUnitNumber),
- rackMenu);
+ effectsMenu);
addControl(effectUnitGroup, "clear",
tr("Clear Unit"),
tr("Clear effect unit"),
@@ -525,33 +725,39 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent)