@@ -300,7 +300,7 @@ template <typename T> | |||
ui::MenuItem* createIndexPtrSubmenuItem(std::string text, std::vector<std::string> labels, T* ptr) { | |||
return createIndexSubmenuItem(text, labels, | |||
[=]() {return *ptr;}, | |||
[=](T index) {*ptr = index;} | |||
[=](size_t index) {*ptr = T(index);} | |||
); | |||
} | |||
@@ -560,31 +560,12 @@ struct AudioInterfaceWidget : ModuleWidget { | |||
menu->addChild(new MenuSeparator); | |||
struct PrimaryModuleItem : MenuItem { | |||
TAudioInterface* module; | |||
void onAction(const ActionEvent& e) override { | |||
module->setPrimary(); | |||
} | |||
}; | |||
PrimaryModuleItem* primaryModuleItem = new PrimaryModuleItem; | |||
primaryModuleItem->text = "Primary audio module"; | |||
primaryModuleItem->rightText = CHECKMARK(module->isPrimary()); | |||
primaryModuleItem->module = module; | |||
menu->addChild(primaryModuleItem); | |||
struct DCFilterItem : MenuItem { | |||
TAudioInterface* module; | |||
void onAction(const ActionEvent& e) override { | |||
module->dcFilterEnabled ^= true; | |||
} | |||
}; | |||
menu->addChild(createCheckMenuItem("Primary audio module", | |||
[=]() {return module->isPrimary();}, | |||
[=]() {module->setPrimary();} | |||
)); | |||
DCFilterItem* dcFilterItem = new DCFilterItem; | |||
dcFilterItem->text = "DC blocker"; | |||
dcFilterItem->rightText = CHECKMARK(module->dcFilterEnabled); | |||
dcFilterItem->module = module; | |||
menu->addChild(dcFilterItem); | |||
menu->addChild(createBoolPtrMenuItem("DC blocker", &module->dcFilterEnabled)); | |||
} | |||
}; | |||
@@ -162,22 +162,6 @@ struct CV_Gate : Module { | |||
}; | |||
struct CV_GateVelocityItem : MenuItem { | |||
CV_Gate* module; | |||
void onAction(const ActionEvent& e) override { | |||
module->velocityMode ^= true; | |||
} | |||
}; | |||
struct CV_GatePanicItem : MenuItem { | |||
CV_Gate* module; | |||
void onAction(const ActionEvent& e) override { | |||
module->midiOutput.panic(); | |||
} | |||
}; | |||
struct CV_GateWidget : ModuleWidget { | |||
CV_GateWidget(CV_Gate* module) { | |||
setModule(module); | |||
@@ -217,14 +201,12 @@ struct CV_GateWidget : ModuleWidget { | |||
CV_Gate* module = dynamic_cast<CV_Gate*>(this->module); | |||
menu->addChild(new MenuSeparator); | |||
CV_GateVelocityItem* velocityItem = createMenuItem<CV_GateVelocityItem>("Velocity mode", CHECKMARK(module->velocityMode)); | |||
velocityItem->module = module; | |||
menu->addChild(velocityItem); | |||
CV_GatePanicItem* panicItem = new CV_GatePanicItem; | |||
panicItem->text = "Panic"; | |||
panicItem->module = module; | |||
menu->addChild(panicItem); | |||
menu->addChild(createBoolPtrMenuItem("Velocity mode", &module->velocityMode)); | |||
menu->addChild(createMenuItem("Panic", "", | |||
[=]() {module->midiOutput.panic();} | |||
)); | |||
} | |||
}; | |||
@@ -180,10 +180,9 @@ struct CV_MIDIWidget : ModuleWidget { | |||
menu->addChild(new MenuSeparator); | |||
CV_MIDIPanicItem* panicItem = new CV_MIDIPanicItem; | |||
panicItem->text = "Panic"; | |||
panicItem->module = module; | |||
menu->addChild(panicItem); | |||
menu->addChild(createMenuItem("Panic", "", | |||
[=]() {module->midiOutput.panic();} | |||
)); | |||
} | |||
}; | |||
@@ -255,41 +255,11 @@ struct MIDI_CCWidget : ModuleWidget { | |||
menu->addChild(new MenuSeparator); | |||
struct SmoothItem : MenuItem { | |||
MIDI_CC* module; | |||
void onAction(const ActionEvent& e) override { | |||
module->smooth ^= true; | |||
} | |||
}; | |||
SmoothItem* smoothItem = new SmoothItem; | |||
smoothItem->text = "Smooth CC"; | |||
smoothItem->rightText = CHECKMARK(module->smooth); | |||
smoothItem->module = module; | |||
menu->addChild(smoothItem); | |||
struct MpeModeItem : MenuItem { | |||
MIDI_CC* module; | |||
void onAction(const ActionEvent& e) override { | |||
module->mpeMode ^= true; | |||
} | |||
}; | |||
MpeModeItem* mpeModeItem = new MpeModeItem; | |||
mpeModeItem->text = "MPE mode"; | |||
mpeModeItem->rightText = CHECKMARK(module->mpeMode); | |||
mpeModeItem->module = module; | |||
menu->addChild(mpeModeItem); | |||
struct LsbModeItem : MenuItem { | |||
MIDI_CC* module; | |||
void onAction(const ActionEvent& e) override { | |||
module->lsbMode ^= true; | |||
} | |||
}; | |||
LsbModeItem* lsbItem = new LsbModeItem; | |||
lsbItem->text = "CC 0-31 controls are 14-bit"; | |||
lsbItem->rightText = CHECKMARK(module->lsbMode); | |||
lsbItem->module = module; | |||
menu->addChild(lsbItem); | |||
menu->addChild(createBoolPtrMenuItem("Smooth CC", &module->smooth)); | |||
menu->addChild(createBoolPtrMenuItem("MPE mode", &module->mpeMode)); | |||
menu->addChild(createBoolPtrMenuItem("CC 0-31 controls are 14-bit", &module->lsbMode)); | |||
} | |||
}; | |||
@@ -505,38 +505,19 @@ struct MIDI_CVWidget : ModuleWidget { | |||
menu->addChild(new MenuSeparator); | |||
struct SmoothItem : MenuItem { | |||
MIDI_CV* module; | |||
void onAction(const ActionEvent& e) override { | |||
module->smooth ^= true; | |||
} | |||
}; | |||
SmoothItem* smoothItem = new SmoothItem; | |||
smoothItem->text = "Smooth pitch/mod wheel"; | |||
smoothItem->rightText = CHECKMARK(module->smooth); | |||
smoothItem->module = module; | |||
menu->addChild(smoothItem); | |||
menu->addChild(createBoolPtrMenuItem("Smooth pitch/mod wheel", &module->smooth)); | |||
struct ClockDivisionValueItem : MenuItem { | |||
MIDI_CV* module; | |||
int clockDivision; | |||
void onAction(const ActionEvent& e) override { | |||
module->clockDivision = clockDivision; | |||
} | |||
}; | |||
static const std::vector<int> clockDivisions = {24 * 4, 24 * 2, 24, 24 / 2, 24 / 4, 24 / 8, 2, 1}; | |||
static const std::vector<std::string> clockDivisionLabels = {"Whole", "Half", "Quarter", "8th", "16th", "32nd", "12 PPQN", "24 PPQN"}; | |||
struct ClockDivisionItem : MenuItem { | |||
MIDI_CV* module; | |||
Menu* createChildMenu() override { | |||
Menu* menu = new Menu; | |||
std::vector<int> divisions = {24 * 4, 24 * 2, 24, 24 / 2, 24 / 4, 24 / 8, 2, 1}; | |||
std::vector<std::string> divisionNames = {"Whole", "Half", "Quarter", "8th", "16th", "32nd", "12 PPQN", "24 PPQN"}; | |||
for (size_t i = 0; i < divisions.size(); i++) { | |||
ClockDivisionValueItem* item = new ClockDivisionValueItem; | |||
item->text = divisionNames[i]; | |||
item->rightText = CHECKMARK(module->clockDivision == divisions[i]); | |||
item->module = module; | |||
item->clockDivision = divisions[i]; | |||
menu->addChild(item); | |||
for (size_t i = 0; i < clockDivisions.size(); i++) { | |||
menu->addChild(createCheckMenuItem(clockDivisionLabels[i], | |||
[=]() {return module->clockDivision == clockDivisions[i];}, | |||
[=]() {module->clockDivision = clockDivisions[i];} | |||
)); | |||
} | |||
return menu; | |||
} | |||
@@ -547,82 +528,35 @@ struct MIDI_CVWidget : ModuleWidget { | |||
clockDivisionItem->module = module; | |||
menu->addChild(clockDivisionItem); | |||
struct ChannelValueItem : MenuItem { | |||
MIDI_CV* module; | |||
int channels; | |||
void onAction(const ActionEvent& e) override { | |||
module->setChannels(channels); | |||
} | |||
}; | |||
struct ChannelItem : MenuItem { | |||
MIDI_CV* module; | |||
Menu* createChildMenu() override { | |||
Menu* menu = new Menu; | |||
for (int channels = 1; channels <= 16; channels++) { | |||
ChannelValueItem* item = new ChannelValueItem; | |||
if (channels == 1) | |||
item->text = "Monophonic"; | |||
else | |||
item->text = string::f("%d", channels); | |||
item->rightText = CHECKMARK(module->channels == channels); | |||
item->module = module; | |||
item->channels = channels; | |||
menu->addChild(item); | |||
for (int c = 1; c <= 16; c++) { | |||
menu->addChild(createCheckMenuItem((c == 1) ? "Monophonic" : string::f("%d", c), | |||
[=]() {return module->channels == c;}, | |||
[=]() {module->setChannels(c);} | |||
)); | |||
} | |||
return menu; | |||
} | |||
}; | |||
ChannelItem* channelItem = new ChannelItem; | |||
channelItem->text = "Polyphony channels"; | |||
channelItem->rightText = string::f("%d", module->channels) + " " + RIGHT_ARROW; | |||
channelItem->rightText = string::f("%d", module->channels) + " " + RIGHT_ARROW; | |||
channelItem->module = module; | |||
menu->addChild(channelItem); | |||
struct PolyModeValueItem : MenuItem { | |||
MIDI_CV* module; | |||
MIDI_CV::PolyMode polyMode; | |||
void onAction(const ActionEvent& e) override { | |||
module->setPolyMode(polyMode); | |||
} | |||
}; | |||
struct PolyModeItem : MenuItem { | |||
MIDI_CV* module; | |||
Menu* createChildMenu() override { | |||
Menu* menu = new Menu; | |||
std::vector<std::string> polyModeNames = { | |||
"Rotate", | |||
"Reuse", | |||
"Reset", | |||
"MPE", | |||
}; | |||
for (int i = 0; i < MIDI_CV::NUM_POLY_MODES; i++) { | |||
MIDI_CV::PolyMode polyMode = (MIDI_CV::PolyMode) i; | |||
PolyModeValueItem* item = new PolyModeValueItem; | |||
item->text = polyModeNames[i]; | |||
item->rightText = CHECKMARK(module->polyMode == polyMode); | |||
item->module = module; | |||
item->polyMode = polyMode; | |||
menu->addChild(item); | |||
} | |||
return menu; | |||
} | |||
}; | |||
PolyModeItem* polyModeItem = new PolyModeItem; | |||
polyModeItem->text = "Polyphony mode"; | |||
polyModeItem->rightText = RIGHT_ARROW; | |||
polyModeItem->module = module; | |||
menu->addChild(polyModeItem); | |||
menu->addChild(createIndexPtrSubmenuItem("Polyphony mode", { | |||
"Rotate", | |||
"Reuse", | |||
"Reset", | |||
"MPE", | |||
}, &module->polyMode)); | |||
struct PanicItem : MenuItem { | |||
MIDI_CV* module; | |||
void onAction(const ActionEvent& e) override { | |||
module->panic(); | |||
} | |||
}; | |||
PanicItem* panicItem = new PanicItem; | |||
panicItem->text = "Panic"; | |||
panicItem->module = module; | |||
menu->addChild(panicItem); | |||
menu->addChild(createMenuItem("Panic", "", | |||
[=]() {module->panic();} | |||
)); | |||
// Example of using appendMidiMenu() | |||
// menu->addChild(new MenuSeparator); | |||
@@ -221,39 +221,15 @@ struct MIDI_GateWidget : ModuleWidget { | |||
void appendContextMenu(Menu* menu) override { | |||
MIDI_Gate* module = dynamic_cast<MIDI_Gate*>(this->module); | |||
struct VelocityItem : MenuItem { | |||
MIDI_Gate* module; | |||
void onAction(const ActionEvent& e) override { | |||
module->velocityMode ^= true; | |||
} | |||
}; | |||
menu->addChild(new MenuSeparator); | |||
VelocityItem* velocityItem = createMenuItem<VelocityItem>("Velocity mode", CHECKMARK(module->velocityMode)); | |||
velocityItem->module = module; | |||
menu->addChild(velocityItem); | |||
struct MpeModeItem : MenuItem { | |||
MIDI_Gate* module; | |||
void onAction(const ActionEvent& e) override { | |||
module->mpeMode ^= true; | |||
} | |||
}; | |||
MpeModeItem* mpeModeItem = new MpeModeItem; | |||
mpeModeItem->text = "MPE mode"; | |||
mpeModeItem->rightText = CHECKMARK(module->mpeMode); | |||
mpeModeItem->module = module; | |||
menu->addChild(mpeModeItem); | |||
struct PanicItem : MenuItem { | |||
MIDI_Gate* module; | |||
void onAction(const ActionEvent& e) override { | |||
module->panic(); | |||
} | |||
}; | |||
PanicItem* panicItem = new PanicItem; | |||
panicItem->text = "Panic"; | |||
panicItem->module = module; | |||
menu->addChild(panicItem); | |||
menu->addChild(createBoolPtrMenuItem("Velocity mode", &module->velocityMode)); | |||
menu->addChild(createBoolPtrMenuItem("MPE mode", &module->mpeMode)); | |||
menu->addChild(createMenuItem("Panic", "", | |||
[=]() {module->panic();} | |||
)); | |||
} | |||
}; | |||
@@ -496,18 +496,7 @@ struct MIDI_MapWidget : ModuleWidget { | |||
menu->addChild(new MenuSeparator); | |||
struct SmoothItem : MenuItem { | |||
MIDI_Map* module; | |||
void onAction(const ActionEvent& e) override { | |||
module->smooth ^= true; | |||
} | |||
}; | |||
SmoothItem* smoothItem = new SmoothItem; | |||
smoothItem->text = "Smooth CC"; | |||
smoothItem->rightText = CHECKMARK(module->smooth); | |||
smoothItem->module = module; | |||
menu->addChild(smoothItem); | |||
menu->addChild(createBoolPtrMenuItem("Smooth CC", &module->smooth)); | |||
} | |||
}; | |||