34 using SelectedNote::SelectedNote;
36 [[nodiscard]] int32_t getMaxValue()
const override {
return kNumIterancePresets + 1; }
37 [[nodiscard]] int32_t getMinValue()
const override {
return 0; }
45 Note* leftMostNote = instrumentClipView.getLeftMostNotePressed();
49 int32_t preset = leftMostNote->getIterance().toPresetIndex();
50 this->setValue(preset);
55 instrumentClipView.adjustNoteIteranceWithOffset(offset);
60 int32_t iterancePreset = this->getValue();
61 if (iterancePreset == kCustomIterancePreset) {
64 return ¬eCustomIteranceRootMenu;
70 const std::string value = getIteranceDisplayValue(
"%d of %d");
71 OLED::main.drawStringCentred(value.data(), 18 + OLED_MAIN_TOPMOST_PIXEL, kTextHugeSpacingX, kTextHugeSizeY);
75 const std::string value = getIteranceDisplayValue(
"%d:%d");
76 OLED::main.drawStringCentered(value.data(), slot.start_x, slot.start_y + kHorizontalMenuSlotYOffset,
77 kTextSpacingX, kTextSpacingY, slot.width);
80 void drawValue()
override {
81 const std::string value = getIteranceDisplayValue(
"%dof%d");
82 display->setText(value);
87 void writeCurrentValue()
override { ; }
90 std::string getIteranceDisplayValue(
const std::string& format) {
93 int32_t iterancePreset = this->getValue();
95 if (iterancePreset == kDefaultIterancePreset) {
96 strcpy(buffer,
"OFF");
98 else if (iterancePreset == kCustomIterancePreset) {
99 strcpy(buffer,
"CUSTOM");
102 Iterance iterance = iterancePresets[iterancePreset - 1];
103 int32_t i = iterance.divisor;
104 for (; i >= 0; i--) {
106 if (iterance.iteranceStep[i]) {
110 sprintf(buffer, format.data(), i + 1, iterance.divisor);
113 return std::string(buffer);