diff --git a/src/core/plugin.hpp b/src/core/plugin.hpp index ad4f3842..56d78316 100644 --- a/src/core/plugin.hpp +++ b/src/core/plugin.hpp @@ -76,25 +76,28 @@ struct CcChoice : LedDisplayChoice { } void step() override { + int cc; if (!module) { - text = string::f("%d", id); - return; + cc = id; } - if (module->learningId == id) { - if (0 <= focusCc) - text = string::f("%d", focusCc); - else - text = "--"; + else if (module->learningId == id) { + cc = focusCc; color.a = 0.5; } else { - text = string::f("%d", module->learnedCcs[id]); + cc = module->learnedCcs[id]; color.a = 1.0; - // HACK - if (APP->event->selectedWidget == this) + // Cancel focus if no longer learning + if (APP->event->getSelectedWidget() == this) APP->event->setSelected(NULL); } + + // Set text + if (cc < 0) + text = "--"; + else + text = string::f("%d", cc); } void onSelect(const event::Select& e) override { @@ -117,14 +120,14 @@ struct CcChoice : LedDisplayChoice { } void onSelectText(const event::SelectText& e) override { - int c = e.codepoint - '0'; - if (0 <= c && c <= 9) { + int c = e.codepoint; + if ('0' <= c && c <= '9') { if (focusCc < 0) focusCc = 0; - focusCc = focusCc * 10 + c; + focusCc = focusCc * 10 + (c - '0'); } if (focusCc >= 128) - focusCc = 0; + focusCc = -1; e.consume(this); } @@ -143,6 +146,7 @@ template struct NoteChoice : LedDisplayChoice { TModule* module; int id; + int focusNote; NoteChoice() { box.size.y = mm2px(6.666); @@ -159,34 +163,40 @@ struct NoteChoice : LedDisplayChoice { } void step() override { + int note; if (!module) { - text = "C4"; - return; + note = id + 36; } - if (module->learningId == id) { - text = "--"; + else if (module->learningId == id) { + note = focusNote; color.a = 0.5; } else { - uint8_t note = module->learnedNotes[id]; - static const char* noteNames[] = { - "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B" - }; - int oct = note / 12 - 1; - int semi = note % 12; - text = string::f("%s%d", noteNames[semi], oct); + note = module->learnedNotes[id]; color.a = 1.0; - // HACK - if (APP->event->selectedWidget == this) + // Cancel focus if no longer learning + if (APP->event->getSelectedWidget() == this) APP->event->setSelected(NULL); } + + // Set text + if (note < 0) { + text = "--"; + } + else { + static const char* noteNames[12] = {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"}; + int oct = note / 12 - 1; + int semi = note % 12; + text = string::f("%s%d", noteNames[semi], oct); + } } void onSelect(const event::Select& e) override { if (!module) return; module->learningId = id; + focusNote = -1; e.consume(this); } @@ -194,9 +204,43 @@ struct NoteChoice : LedDisplayChoice { if (!module) return; if (module->learningId == id) { + if (0 <= focusNote && focusNote < 128) { + module->learnedNotes[id] = focusNote; + } module->learningId = -1; } } + + void onSelectText(const event::SelectText& e) override { + int c = e.codepoint; + if ('a' <= c && c <= 'g') { + static const int majorNotes[7] = {9, 11, 0, 2, 4, 5, 7}; + focusNote = majorNotes[c - 'a']; + } + else if (c == '#') { + if (focusNote >= 0) { + focusNote += 1; + } + } + else if ('0' <= c && c <= '9') { + if (focusNote >= 0) { + focusNote = focusNote % 12; + focusNote += 12 * (c - '0' + 1); + } + } + if (focusNote >= 128) + focusNote = -1; + e.consume(this); + } + + void onSelectKey(const event::SelectKey& e) override { + if ((e.key == GLFW_KEY_ENTER || e.key == GLFW_KEY_KP_ENTER) && e.action == GLFW_PRESS && (e.mods & RACK_MOD_MASK) == 0) { + event::Deselect eDeselect; + onDeselect(eDeselect); + APP->event->selectedWidget = NULL; + e.consume(this); + } + } };