38 using SelectedNoteRow::SelectedNoteRow;
40 [[nodiscard]] int32_t getMaxValue()
const override {
return kNumIterancePresets + 1; }
41 [[nodiscard]] int32_t getMinValue()
const override {
return 0; }
49 char modelStackMemory[MODEL_STACK_MAX_SIZE];
53 if (modelStackWithNoteRow->getNoteRowAllowNull() !=
nullptr) {
54 NoteRow* noteRow = modelStackWithNoteRow->getNoteRowAllowNull();
56 int32_t preset = noteRow->iteranceValue.toPresetIndex();
57 this->setValue(preset);
63 int32_t newValue = instrumentClipView.setNoteRowIteranceWithOffset(offset);
66 int32_t preset = Iterance::fromInt(newValue).toPresetIndex();
67 this->setValue(preset);
73 int32_t iterancePreset = this->getValue();
74 if (iterancePreset == kCustomIterancePreset) {
77 return ¬eRowCustomIteranceRootMenu;
83 const std::string value = getIteranceDisplayValue(
"%d of %d");
84 OLED::main.drawStringCentred(value.data(), 18 + OLED_MAIN_TOPMOST_PIXEL, kTextHugeSpacingX, kTextHugeSizeY);
87 void renderInHorizontalMenu(int32_t startX, int32_t width, int32_t startY, int32_t height)
override {
88 const std::string value = getIteranceDisplayValue(
"%d:%d");
89 OLED::main.drawStringCentered(value.data(), startX, startY + kHorizontalMenuSlotYOffset, kTextSpacingX,
90 kTextSpacingY, width);
93 void drawValue()
override {
94 const std::string value = getIteranceDisplayValue(
"%dof%d");
95 display->setText(value);
100 void writeCurrentValue()
override { ; }
103 std::string getIteranceDisplayValue(
const std::string& format) {
106 int32_t iterancePreset = this->getValue();
108 if (iterancePreset == kDefaultIterancePreset) {
109 strcpy(buffer,
"OFF");
111 else if (iterancePreset == kCustomIterancePreset) {
112 strcpy(buffer,
"CUSTOM");
115 Iterance iterance = iterancePresets[iterancePreset - 1];
116 int32_t i = iterance.divisor;
117 for (; i >= 0; i--) {
119 if (iterance.iteranceStep[i]) {
123 sprintf(buffer, format.data(), i + 1, iterance.divisor);
126 return std::string(buffer);