diff --git a/midi2cv/drivers/display.h b/midi2cv/drivers/display.h index 9ecee24..e19f419 100644 --- a/midi2cv/drivers/display.h +++ b/midi2cv/drivers/display.h @@ -5,6 +5,9 @@ #include #include +#define DISPLAY_WIDTH 128 +#define DISPLAY_HEIGHT 64 + class Display { public: Display() {} diff --git a/midi2cv/midi2cv.cc b/midi2cv/midi2cv.cc index 03dd69a..aedca29 100644 --- a/midi2cv/midi2cv.cc +++ b/midi2cv/midi2cv.cc @@ -12,7 +12,7 @@ GPIO gpio; Display display; UI ui; //SystemClock system_clock; -Part part[4]; +Part part[PART_COUNT]; // Default interrupt handlers. extern "C" { diff --git a/midi2cv/part.h b/midi2cv/part.h index b93715d..21dc04e 100644 --- a/midi2cv/part.h +++ b/midi2cv/part.h @@ -1,11 +1,15 @@ #ifndef MIDI2CV_PART_H #define MIDI2CV_PART_H -enum MIDIThruMode { OFF, - ON, - POLYCHAIN }; +#define PART_COUNT 4 -enum BiOutputType { +#define TOTAL_COLUMN_COUNT 4 + +typedef enum { MIDI_THRU_OFF, + MIDI_THRU_ON, + MIDI_THRU_POLYCHAIN } MIDIThruMode_t; + +typedef enum { BI_OFF = 0, BI_PITCH_UNI, BI_PITCH_BI, @@ -13,9 +17,9 @@ enum BiOutputType { BI_SQUARE, BI_SINE, BI_TRIANGLE -}; +} BiOutputType_t; -enum UniOutputType { +typedef enum { UNI_OFF = 0, UNI_PITCH, UNI_VELOCITY, @@ -24,26 +28,40 @@ enum UniOutputType { UNI_BREATH, UNI_EXP, UNI_GATE -}; +} UniOutputType_t; -enum GateOutputType { +typedef enum { GATE_OFF = 0, GATE_GATE, GATE_TRIGGER -}; +} GateOutputType_t; + +typedef enum { + VOICE_COUNT_1 = 1, + VOICE_COUNT_2 = 2, + VOICE_COUNT_3 = 3, + VOICE_COUNT_4 = 4 +} PartVoiceCount_t; + +typedef enum { + VOICE_DETAIL_S, + VOICE_DETAIL_M, + VOICE_DETAIL_L, + VOICE_DETAIL_XL +} PartVoiceDetail_t; class Part { public: Part() - : poly_voice_count(1) - , output_column_count(1) + : part_voice_count(VOICE_COUNT_1) + , part_voice_detail(VOICE_DETAIL_S) , midi_filter_channel_enabled(true) , midi_filter_channel(1) , midi_filter_lowest_note(0) , midi_filter_highest_note(127) - , midi_thru_mode(OFF) + , midi_thru_mode(MIDI_THRU_OFF) { - for (int i = 0; i < 4; i++) { + for (int i = 0; i < TOTAL_COLUMN_COUNT; i++) { output_type_row_0[i] = BI_OFF; output_type_row_1[i] = UNI_OFF; output_type_row_2[i] = UNI_OFF; @@ -52,18 +70,22 @@ class Part { } void ProcessMidiInput(/* TODO: Inputs */); + uint8_t RequiredColumns(); + private: - uint8_t poly_voice_count; - uint8_t output_column_count; + PartVoiceCount_t part_voice_count; + PartVoiceDetail_t part_voice_detail; bool midi_filter_channel_enabled; uint8_t midi_filter_channel; uint8_t midi_filter_lowest_note; uint8_t midi_filter_highest_note; - MIDIThruMode midi_thru_mode; - BiOutputType output_type_row_0[4]; - UniOutputType output_type_row_1[4]; - UniOutputType output_type_row_2[4]; - GateOutputType output_type_row_3[4]; + MIDIThruMode_t midi_thru_mode; + BiOutputType_t output_type_row_0[TOTAL_COLUMN_COUNT]; + UniOutputType_t output_type_row_1[TOTAL_COLUMN_COUNT]; + UniOutputType_t output_type_row_2[TOTAL_COLUMN_COUNT]; + GateOutputType_t output_type_row_3[TOTAL_COLUMN_COUNT]; }; +extern Part parts[]; + #endif diff --git a/midi2cv/ui.cc b/midi2cv/ui.cc index 8643b15..8c6d9f8 100644 --- a/midi2cv/ui.cc +++ b/midi2cv/ui.cc @@ -1,36 +1,53 @@ #include "ui.h" #include "drivers/display.h" +#include "part.h" #include "stmlib/utils/random.h" #include + using namespace stmlib; +#define HEADER_HEIGHT 16 + +const char part_names[4][2] = { "A", "B", "C", "D" }; + void UI::Update() { - u8g2_t* u8g2_ = display.u8g2(); - static float x = 0, y = 16, dx = 1, dy = 1, ddx = .2, ddy = .2; - u8g2_ClearBuffer(u8g2_); - u8g2_SetFont(u8g2_, u8g2_font_6x10_mf); - u8g2_DrawStr(u8g2_, (int)x, (int)y, "send nudes"); - x += dx * ddx; - y += dy * ddy; - if (x >= 70 || x <= 0) { - ddx = Random::GetFloat() / 4.0 + 0.1; - } - if (x >= 70) - dx = -1; - if (x <= 0) - dx = 1; - if (y >= 64 || y <= 7) { - ddy = Random::GetFloat() / 4.0 + 0.1; - } - if (y >= 64) - dy = -1; - if (y <= 7) - dy = 1; - display.Swap(); + + switch (current_menu) { + case MENU_PART_1: + case MENU_PART_2: + case MENU_PART_3: + case MENU_PART_4: + DrawHeader(); + DrawPartMenu(current_menu); + break; + default: + + break; + } +} + +void UI::DrawHeader() +{ + for (int i = 0; i < PART_COUNT; i++) { + u8g2_SetFontMode(display.u8g2(), 1); + u8g2_SetDrawColor(display.u8g2(), 1); + if (current_menu == i) + u8g2_DrawBox(display.u8g2(), i * (DISPLAY_WIDTH / PART_COUNT), 0, (DISPLAY_WIDTH / PART_COUNT), HEADER_HEIGHT); + else + u8g2_DrawFrame(display.u8g2(), i * (DISPLAY_WIDTH / PART_COUNT), 0, (DISPLAY_WIDTH / PART_COUNT), HEADER_HEIGHT); + + u8g2_SetDrawColor(display.u8g2(), 2); + u8g2_DrawStr(display.u8g2(), i * (DISPLAY_WIDTH / PART_COUNT) + 2, 2, part_names[i]); + u8g2_SetDrawColor(display.u8g2(), 1); + } +} + +void UI::DrawPartMenu(Menu_t menu) +{ } void UI::Flush() { - display.Flush(); + display.Flush(); } diff --git a/midi2cv/ui.h b/midi2cv/ui.h index 351cd5d..8b37947 100644 --- a/midi2cv/ui.h +++ b/midi2cv/ui.h @@ -3,16 +3,29 @@ #include "stmlib/stmlib.h" +typedef enum { + MENU_PART_1, + MENU_PART_2, + MENU_PART_3, + MENU_PART_4, + MENU_COUNT +} Menu_t; + class UI { -public: - UI() {} - ~UI() {} + public: + UI() {} + ~UI() {} - void Update(); - void Flush(); + void Update(); + void Flush(); -private: - DISALLOW_COPY_AND_ASSIGN(UI); + private: + Menu_t current_menu; + + void DrawHeader(); + void DrawPartMenu(Menu_t menu); + + DISALLOW_COPY_AND_ASSIGN(UI); }; extern UI ui;