Skip to content

Commit

Permalink
feat: add new BPM scaling buttons and switch ControlPushButton to uni…
Browse files Browse the repository at this point in the history
…que_ptr for memory management.
  • Loading branch information
Milkii Brewster committed Mar 11, 2024
1 parent a928d1c commit d95620f
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 12 deletions.
6 changes: 6 additions & 0 deletions src/controllers/controlpickermenu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"),
Expand Down
71 changes: 63 additions & 8 deletions src/engine/controls/bpmcontrol.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<ControlPushButton>(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<ControlPushButton>(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<ControlPushButton>(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<ControlPushButton>(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);
Expand All @@ -93,6 +93,61 @@ BpmControl::BpmControl(const QString& group,
this,
&BpmControl::slotTranslateBeatsMove,
Qt::DirectConnection);

m_pBeatsHalve = std::make_unique<ControlPushButton>(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<ControlPushButton>(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<ControlPushButton>(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<ControlPushButton>(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<ControlPushButton>(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<ControlPushButton>(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
Expand Down
16 changes: 12 additions & 4 deletions src/engine/controls/bpmcontrol.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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<ControlPushButton> m_pAdjustBeatsFaster;
std::unique_ptr<ControlPushButton> m_pAdjustBeatsSlower;
std::unique_ptr<ControlPushButton> m_pTranslateBeatsEarlier;
std::unique_ptr<ControlPushButton> m_pTranslateBeatsLater;
ControlEncoder* m_pTranslateBeatsMove;

std::unique_ptr<ControlPushButton> m_pBeatsHalve;
std::unique_ptr<ControlPushButton> m_pBeatsTwoThirds;
std::unique_ptr<ControlPushButton> m_pBeatsThreeFourths;
std::unique_ptr<ControlPushButton> m_pBeatsFourThirds;
std::unique_ptr<ControlPushButton> m_pBeatsThreeHalves;
std::unique_ptr<ControlPushButton> m_pBeatsDouble;

// The current effective BPM of the engine
ControlLinPotmeter* m_pEngineBpm;

Expand Down

0 comments on commit d95620f

Please sign in to comment.