diff --git a/src/controllers/controlpickermenu.cpp b/src/controllers/controlpickermenu.cpp index c3a1c9b06667..40d7a471463f 100644 --- a/src/controllers/controlpickermenu.cpp +++ b/src/controllers/controlpickermenu.cpp @@ -243,6 +243,12 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent) addDeckAndSamplerControl("bpm_up_small", tr("BPM +0.1"), tr("Increase BPM by 0.1"), pBpmMenu); addDeckAndSamplerControl("bpm_down_small", tr("BPM -0.1"), tr("Decrease BPM by 0.1"), pBpmMenu); addDeckAndSamplerControl("bpm_tap", tr("BPM Tap"), tr("BPM tap button"), pBpmMenu); + addDeckAndSamplerControl("beats_set_halve", tr("BPM Halve"), tr("Multiply current BPM by 0.5"), pBpmMenu); + addDeckAndSamplerControl("beats_set_twothirds", tr("BPM Two Thirds"), tr("Multiply current BPM by 0.666"), pBpmMenu); + addDeckAndSamplerControl("beats_set_threefourths", tr("BPM Three Fourths"), tr("Multiply current BPM by 0.75"), pBpmMenu); + addDeckAndSamplerControl("beats_set_fourthirds", tr("BPM Four Thirds"), tr("Multiply current BPM by 1.333"), pBpmMenu); + addDeckAndSamplerControl("beats_set_threehalves", tr("BPM Three Halves"), tr("Multiply current BPM by 1.5"), pBpmMenu); + addDeckAndSamplerControl("beats_set_double", tr("BPM Double"), tr("Multiply current BPM by 2"), pBpmMenu); pBpmMenu->addSeparator(); addDeckAndSamplerControl("beats_adjust_faster", tr("Adjust Beatgrid Faster +.01"), diff --git a/src/engine/controls/bpmcontrol.cpp b/src/engine/controls/bpmcontrol.cpp index be5016938ee5..aaf8608811ea 100644 --- a/src/engine/controls/bpmcontrol.cpp +++ b/src/engine/controls/bpmcontrol.cpp @@ -67,24 +67,24 @@ BpmControl::BpmControl(const QString& group, m_pLoopEndPosition = new ControlProxy(group, "loop_end_position", this); m_pLocalBpm = new ControlObject(ConfigKey(group, "local_bpm")); - m_pAdjustBeatsFaster = new ControlPushButton(ConfigKey(group, "beats_adjust_faster"), false); + m_pAdjustBeatsFaster = std::make_unique(ConfigKey(group, "beats_adjust_faster"), false); m_pAdjustBeatsFaster->setKbdRepeatable(true); - connect(m_pAdjustBeatsFaster, &ControlObject::valueChanged, + connect(m_pAdjustBeatsFaster.get(), &ControlObject::valueChanged, this, &BpmControl::slotAdjustBeatsFaster, Qt::DirectConnection); - m_pAdjustBeatsSlower = new ControlPushButton(ConfigKey(group, "beats_adjust_slower"), false); + m_pAdjustBeatsSlower = std::make_unique(ConfigKey(group, "beats_adjust_slower"), false); m_pAdjustBeatsSlower->setKbdRepeatable(true); - connect(m_pAdjustBeatsSlower, &ControlObject::valueChanged, + connect(m_pAdjustBeatsSlower.get(), &ControlObject::valueChanged, this, &BpmControl::slotAdjustBeatsSlower, Qt::DirectConnection); - m_pTranslateBeatsEarlier = new ControlPushButton(ConfigKey(group, "beats_translate_earlier"), false); + m_pTranslateBeatsEarlier = std::make_unique(ConfigKey(group, "beats_translate_earlier"), false); m_pTranslateBeatsEarlier->setKbdRepeatable(true); - connect(m_pTranslateBeatsEarlier, &ControlObject::valueChanged, + connect(m_pTranslateBeatsEarlier.get(), &ControlObject::valueChanged, this, &BpmControl::slotTranslateBeatsEarlier, Qt::DirectConnection); - m_pTranslateBeatsLater = new ControlPushButton(ConfigKey(group, "beats_translate_later"), false); + m_pTranslateBeatsLater = std::make_unique(ConfigKey(group, "beats_translate_later"), false); m_pTranslateBeatsLater->setKbdRepeatable(true); - connect(m_pTranslateBeatsLater, &ControlObject::valueChanged, + connect(m_pTranslateBeatsLater.get(), &ControlObject::valueChanged, this, &BpmControl::slotTranslateBeatsLater, Qt::DirectConnection); m_pTranslateBeatsMove = new ControlEncoder(ConfigKey(group, "beats_translate_move"), false); @@ -93,6 +93,61 @@ BpmControl::BpmControl(const QString& group, this, &BpmControl::slotTranslateBeatsMove, Qt::DirectConnection); + + m_pBeatsHalve = std::make_unique(ConfigKey(group, "beats_set_halve"), false); + connect(m_pBeatsHalve.get(), + &ControlObject::valueChanged, + this, + [this](int value) { + if (value > 0) { + slotScaleBpm(mixxx::Beats::BpmScale::Halve); + } + }); + m_pBeatsTwoThirds = std::make_unique(ConfigKey(group, "beats_set_twothirds"), false); + connect(m_pBeatsTwoThirds.get(), + &ControlObject::valueChanged, + this, + [this](int value) { + if (value > 0) { + slotScaleBpm(mixxx::Beats::BpmScale::TwoThirds); + } + }); + m_pBeatsThreeFourths = std::make_unique(ConfigKey(group, "beats_set_threefourths"), false); + connect(m_pBeatsThreeFourths.get(), + &ControlObject::valueChanged, + this, + [this](int value) { + if (value > 0) { + slotScaleBpm(mixxx::Beats::BpmScale::ThreeFourths); + } + }); + m_pBeatsFourThirds = std::make_unique(ConfigKey(group, "beats_set_fourthirds"), false); + connect(m_pBeatsFourThirds.get(), + &ControlObject::valueChanged, + this, + [this](int value) { + if (value > 0) { + slotScaleBpm(mixxx::Beats::BpmScale::FourThirds); + } + }); + m_pBeatsThreeHalves = std::make_unique(ConfigKey(group, "beats_set_threehalves"), false); + connect(m_pBeatsThreeHalves.get(), + &ControlObject::valueChanged, + this, + [this](int value) { + if (value > 0) { + slotScaleBpm(mixxx::Beats::BpmScale::ThreeHalves); + } + }); + m_pBeatsDouble = std::make_unique(ConfigKey(group, "beats_set_double"), false); + connect(m_pBeatsDouble.get(), + &ControlObject::valueChanged, + this, + [this](int value) { + if (value > 0) { + slotScaleBpm(mixxx::Beats::BpmScale::Double); + } + }); // Pick a wide range (kBpmRangeMin to kBpmRangeMax) and allow out of bounds sets. This lets you // map a soft-takeover MIDI knob to the BPM. This also creates bpm_up and diff --git a/src/engine/controls/bpmcontrol.h b/src/engine/controls/bpmcontrol.h index e08a31640880..d374c0575e03 100644 --- a/src/engine/controls/bpmcontrol.h +++ b/src/engine/controls/bpmcontrol.h @@ -118,6 +118,7 @@ class BpmControl : public EngineControl { } double calcSyncAdjustment(bool userTweakingSync); void adjustBeatsBpm(double deltaBpm); + void slotScaleBpm(mixxx::Beats::BpmScale bpmScale); friend class SyncControl; @@ -139,12 +140,19 @@ class BpmControl : public EngineControl { // The average bpm around the current playposition; ControlObject* m_pLocalBpm; - ControlPushButton* m_pAdjustBeatsFaster; - ControlPushButton* m_pAdjustBeatsSlower; - ControlPushButton* m_pTranslateBeatsEarlier; - ControlPushButton* m_pTranslateBeatsLater; + std::unique_ptr m_pAdjustBeatsFaster; + std::unique_ptr m_pAdjustBeatsSlower; + std::unique_ptr m_pTranslateBeatsEarlier; + std::unique_ptr m_pTranslateBeatsLater; ControlEncoder* m_pTranslateBeatsMove; + std::unique_ptr m_pBeatsHalve; + std::unique_ptr m_pBeatsTwoThirds; + std::unique_ptr m_pBeatsThreeFourths; + std::unique_ptr m_pBeatsFourThirds; + std::unique_ptr m_pBeatsThreeHalves; + std::unique_ptr m_pBeatsDouble; + // The current effective BPM of the engine ControlLinPotmeter* m_pEngineBpm;