Implement MidiNote MenuItem

This commit is contained in:
Jan-Henrik 2020-02-23 00:15:01 +01:00
parent 2e43ebf110
commit 9383e3c4cf
4 changed files with 64 additions and 24 deletions

View file

@ -2,37 +2,37 @@
#include <algorithm> #include <algorithm>
#include <u8g2.h> #include <u8g2.h>
#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) void Menu::render(u8g2_t* u8g2_, uint8_t xStart, uint8_t yStart, uint8_t width, uint8_t height)
{ {
this->width = width; this->width = width;
this->height = height; 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)); uint8_t itemsToRender = std::min(maxVisibleItems, uint8_t(this->itemCount - currentScrollStart));
u8g2_SetFont(u8g2_, u8g2_font_6x12_tf); u8g2_SetFont(u8g2_, u8g2_font_6x12_tf);
for (uint8_t i = 0; i < itemsToRender; i++) { for (uint8_t i = 0; i < itemsToRender; i++) {
bool selected = this->selectedItem == (i + this->currentScrollStart); bool selected = this->selectedItem == (i + this->currentScrollStart);
bool editing = this->currentEditingItem == (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]; AbstractMenuItem* item = this->items[i + this->currentScrollStart];
u8g2_SetDrawColor(u8g2_, selected ? 1 : 0); u8g2_SetDrawColor(u8g2_, selected ? 1 : 0);
if (editing) { if (editing) {
u8g2_DrawFrame(u8g2_, xStart, yPosition, width, MENU_ITEM_HEIGHT); u8g2_DrawFrame(u8g2_, xStart, yPosition, width, kMenuItemHeight);
} else if (selected) { } 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_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()); 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) { if (this->currentEditingItem >= 0) {
this->items[this->selectedItem]->increase(); this->items[this->selectedItem]->increase();
} else { } else {
uint8_t maxVisibleItems = height / MENU_ITEM_HEIGHT; uint8_t maxVisibleItems = height / kMenuItemHeight;
if (this->selectedItem < this->itemCount - 1) { if (this->selectedItem < this->itemCount - 1) {
if (this->selectedItem - this->currentScrollStart == maxVisibleItems - 2 && this->itemCount - this->currentScrollStart > maxVisibleItems) { if (this->selectedItem - this->currentScrollStart == maxVisibleItems - 2 && this->itemCount - this->currentScrollStart > maxVisibleItems) {
this->currentScrollStart++; this->currentScrollStart++;
@ -87,4 +87,3 @@ bool Menu::back()
} }
return true; return true;
} }

View file

@ -102,6 +102,44 @@ class UIntMenuItem : public NumberMenuItem<uint32_t> {
: NumberMenuItem(_label, _initialValue, _minimumValue, _maximumValue, _step) {}; : NumberMenuItem(_label, _initialValue, _minimumValue, _maximumValue, _step) {};
}; };
class MidiNoteMenuItem : public NumberMenuItem<uint8_t> {
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<int32_t> { class IntMenuItem : public NumberMenuItem<int32_t> {
private: private:
protected: protected:

View file

@ -5,17 +5,19 @@
PartMenu::PartMenu() PartMenu::PartMenu()
: menu(128, 64) : menu(128, 64)
, item1("wolle", 0, 0, 100, 1) , item_voice_count("Voice Count", 1, 1, 4, 1)
, item2("petry", 0, 0, 100, 1) , item_voice_detail("Voice Detail", 1, 1, 4, 1)
, item3("schale", 0, 0, 100, 1) , item_midi_filter_enabled("MIDI Filter Enabled", 0, 0, 1, 1)
, item4("eine", 0, 0, 100, 1) , item_midi_channel("MIDI Channel", 0, 0, 100, 1)
, item5("schale?", 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->item_voice_count);
this->menu.add_item(&this->item2); this->menu.add_item(&this->item_voice_detail);
this->menu.add_item(&this->item3); this->menu.add_item(&this->item_midi_filter_enabled);
this->menu.add_item(&this->item4); this->menu.add_item(&this->item_midi_channel);
this->menu.add_item(&this->item5); this->menu.add_item(&this->item_midi_lowest_note);
this->menu.add_item(&this->item_midi_highest_note);
} }
void PartMenu::up() void PartMenu::up()

View file

@ -17,9 +17,10 @@ class PartMenu {
private: private:
Menu menu; Menu menu;
UIntMenuItem item1; UIntMenuItem item_voice_count;
UIntMenuItem item2; UIntMenuItem item_voice_detail;
UIntMenuItem item3; UIntMenuItem item_midi_filter_enabled;
UIntMenuItem item4; UIntMenuItem item_midi_channel;
UIntMenuItem item5; MidiNoteMenuItem item_midi_lowest_note;
MidiNoteMenuItem item_midi_highest_note;
}; };