diff --git a/midi2cv/menu/menu.cc b/midi2cv/menu/menu.cc index afb35b8..1d8b9ae 100644 --- a/midi2cv/menu/menu.cc +++ b/midi2cv/menu/menu.cc @@ -2,37 +2,37 @@ #include #include -#define MENU_ITEM_HEIGHT 12 +const int kMenuItemHeight = 12; void Menu::render(u8g2_t* u8g2_, uint8_t xStart, uint8_t yStart, uint8_t width, uint8_t height) { this->width = width; this->height = height; - uint8_t maxVisibleItems = height / MENU_ITEM_HEIGHT; + uint8_t maxVisibleItems = height / kMenuItemHeight; uint8_t itemsToRender = std::min(maxVisibleItems, uint8_t(this->itemCount - currentScrollStart)); u8g2_SetFont(u8g2_, u8g2_font_6x12_tf); for (uint8_t i = 0; i < itemsToRender; i++) { bool selected = this->selectedItem == (i + this->currentScrollStart); bool editing = this->currentEditingItem == (i + this->currentScrollStart); - uint8_t yPosition = yStart + i * MENU_ITEM_HEIGHT; + uint8_t yPosition = yStart + i * kMenuItemHeight; AbstractMenuItem* item = this->items[i + this->currentScrollStart]; u8g2_SetDrawColor(u8g2_, selected ? 1 : 0); if (editing) { - u8g2_DrawFrame(u8g2_, xStart, yPosition, width, MENU_ITEM_HEIGHT); + u8g2_DrawFrame(u8g2_, xStart, yPosition, width, kMenuItemHeight); } else if (selected) { - u8g2_DrawBox(u8g2_, xStart, yPosition, width, MENU_ITEM_HEIGHT); + u8g2_DrawBox(u8g2_, xStart, yPosition, width, kMenuItemHeight); } u8g2_SetDrawColor(u8g2_, editing || !selected ? 1 : 0); - u8g2_DrawStr(u8g2_, xStart + 2, yPosition + MENU_ITEM_HEIGHT - 3, item->get_label()); + u8g2_DrawStr(u8g2_, xStart + 2, yPosition + kMenuItemHeight - 3, item->get_label()); uint8_t valueStringWidth = u8g2_GetStrWidth(u8g2_, item->get_string_representation()); - u8g2_DrawStr(u8g2_, xStart + width - valueStringWidth - 2, yPosition + MENU_ITEM_HEIGHT - 3, item->get_string_representation()); + u8g2_DrawStr(u8g2_, xStart + width - valueStringWidth - 2, yPosition + kMenuItemHeight - 3, item->get_string_representation()); } } @@ -58,7 +58,7 @@ void Menu::down() if (this->currentEditingItem >= 0) { this->items[this->selectedItem]->increase(); } else { - uint8_t maxVisibleItems = height / MENU_ITEM_HEIGHT; + uint8_t maxVisibleItems = height / kMenuItemHeight; if (this->selectedItem < this->itemCount - 1) { if (this->selectedItem - this->currentScrollStart == maxVisibleItems - 2 && this->itemCount - this->currentScrollStart > maxVisibleItems) { this->currentScrollStart++; @@ -87,4 +87,3 @@ bool Menu::back() } return true; } - diff --git a/midi2cv/menu/menu_items.h b/midi2cv/menu/menu_items.h index ab8e30a..f9e7339 100644 --- a/midi2cv/menu/menu_items.h +++ b/midi2cv/menu/menu_items.h @@ -102,6 +102,44 @@ class UIntMenuItem : public NumberMenuItem { : NumberMenuItem(_label, _initialValue, _minimumValue, _maximumValue, _step) {}; }; +class MidiNoteMenuItem : public NumberMenuItem { + private: + char string_buffer[4]; + const char* note_strings[12]; + + protected: + const char* get_format_string() { return ""; } + + public: + char* get_string_representation() + { + uint8_t currentNote = this->get_value(); + int note = currentNote % 12; + int octave = (currentNote / 12) - 1; + + sprintf(this->string_buffer, "%s%d", note_strings[note], octave); + + return this->string_buffer; + } + + MidiNoteMenuItem(const char* _label, uint8_t _initialValue) + : NumberMenuItem(_label, _initialValue, 0, 127, 1) + { + note_strings[0] = "C"; + note_strings[1] = "C#"; + note_strings[2] = "D"; + note_strings[3] = "D#"; + note_strings[4] = "E"; + note_strings[5] = "F"; + note_strings[6] = "F#"; + note_strings[7] = "G"; + note_strings[8] = "G#"; + note_strings[9] = "A"; + note_strings[10] = "A#"; + note_strings[11] = "B"; + }; +}; + class IntMenuItem : public NumberMenuItem { private: protected: diff --git a/midi2cv/ui/part_menu.cc b/midi2cv/ui/part_menu.cc index cc8381f..0f36c85 100644 --- a/midi2cv/ui/part_menu.cc +++ b/midi2cv/ui/part_menu.cc @@ -5,17 +5,19 @@ PartMenu::PartMenu() : menu(128, 64) - , item1("wolle", 0, 0, 100, 1) - , item2("petry", 0, 0, 100, 1) - , item3("schale", 0, 0, 100, 1) - , item4("eine", 0, 0, 100, 1) - , item5("schale?", 0, 0, 100, 1) + , item_voice_count("Voice Count", 1, 1, 4, 1) + , item_voice_detail("Voice Detail", 1, 1, 4, 1) + , item_midi_filter_enabled("MIDI Filter Enabled", 0, 0, 1, 1) + , item_midi_channel("MIDI Channel", 0, 0, 100, 1) + , item_midi_lowest_note("MIDI Lowest Note", 0) + , item_midi_highest_note("MIDI Highest Note", 0) { - this->menu.add_item(&this->item1); - this->menu.add_item(&this->item2); - this->menu.add_item(&this->item3); - this->menu.add_item(&this->item4); - this->menu.add_item(&this->item5); + this->menu.add_item(&this->item_voice_count); + this->menu.add_item(&this->item_voice_detail); + this->menu.add_item(&this->item_midi_filter_enabled); + this->menu.add_item(&this->item_midi_channel); + this->menu.add_item(&this->item_midi_lowest_note); + this->menu.add_item(&this->item_midi_highest_note); } void PartMenu::up() diff --git a/midi2cv/ui/part_menu.h b/midi2cv/ui/part_menu.h index 7362e01..9309e9b 100644 --- a/midi2cv/ui/part_menu.h +++ b/midi2cv/ui/part_menu.h @@ -17,9 +17,10 @@ class PartMenu { private: Menu menu; - UIntMenuItem item1; - UIntMenuItem item2; - UIntMenuItem item3; - UIntMenuItem item4; - UIntMenuItem item5; + UIntMenuItem item_voice_count; + UIntMenuItem item_voice_detail; + UIntMenuItem item_midi_filter_enabled; + UIntMenuItem item_midi_channel; + MidiNoteMenuItem item_midi_lowest_note; + MidiNoteMenuItem item_midi_highest_note; };