From 159eb2e34d5404dec908031c944ed77d5028d016 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 3 Apr 2023 19:46:44 +1000 Subject: [PATCH 001/413] Allow slot selection across both grids --- avr/cores/megacommand/MCL/GridPage.cpp | 88 +++++++++++++++++++++---- avr/cores/megacommand/MCL/GridPage.h | 3 +- avr/cores/megacommand/MCL/GridPages.cpp | 2 +- 3 files changed, 78 insertions(+), 15 deletions(-) diff --git a/avr/cores/megacommand/MCL/GridPage.cpp b/avr/cores/megacommand/MCL/GridPage.cpp index 2b0f24c37..b8566ba74 100644 --- a/avr/cores/megacommand/MCL/GridPage.cpp +++ b/avr/cores/megacommand/MCL/GridPage.cpp @@ -22,6 +22,7 @@ void GridPage::init() { void GridPage::setup() { encoders[0]->cur = encoders[0]->old = mcl_cfg.col; encoders[1]->cur = encoders[1]->old = mcl_cfg.row; + encoders[2]->cur = 1; cur_col = mcl_cfg.cur_col; cur_row = mcl_cfg.cur_row; memset(active_slots, SLOT_DISABLED, sizeof(active_slots)); @@ -91,10 +92,37 @@ void GridPage::close_bank_popup() { MD.set_trigleds(0, TRIGLED_EXCLUSIVENDYNAMIC, 1); } +void GridPage::load_old_col() { + cur_col = old_col; + param1.cur = cur_col; + param1.old = cur_col; + encoders[2]->cur = GRID_WIDTH - cur_col; + encoders[2]->old = encoders[2]->cur; + grid_page.grid_select_apply = 0; + proj.grid_select = 0; + ((MCLEncoder *)encoders[2])->max = getWidth() + 1 - getCol(); +} + void GridPage::loop() { int8_t diff, new_val; if (show_slot_menu) { - + if (encoders[2]->hasChanged()) { + if ((proj.get_grid() == 0) && (encoders[2]->cur + cur_col > GRID_WIDTH)) { + old_col = cur_col; + cur_col = 0; + param1.cur = grid_page.cur_col; + param2.old = grid_page.cur_col; + encoders[2]->cur = 1; + encoders[2]->old = 1; + grid_page.grid_select_apply = 1; + proj.grid_select = 1; + ((MCLEncoder *)encoders[2])->max = getWidth() - getCol(); + } + else if ((proj.get_grid() == 1) && (encoders[2]->cur == 0) && (old_col != 255)) { + load_old_col(); + } + if (encoders[2]->cur == 0) { encoders[2]->cur = 1; encoders[2]->old = 1; } + } if (encoders[3]->hasChanged()) { if (cur_row + encoders[3]->cur > MAX_VISIBLE_ROWS - 1) { load_slot_models(); @@ -114,6 +142,9 @@ void GridPage::loop() { } } */ + if (encoders[2]->hasChanged()) { + if (encoders[2]->cur == 0) { encoders[2]->cur = 1; encoders[2]->old = 1; } + } if (encoders[0]->hasChanged()) { diff = encoders[0]->cur - encoders[0]->old; new_val = cur_col + diff; @@ -149,7 +180,7 @@ void GridPage::loop() { } encoders[2]->cur = 1; encoders[3]->cur = 1; - ((MCLEncoder *)encoders[2])->max = getWidth() - getCol(); + //((MCLEncoder *)encoders[2])->max = getWidth() + 1 - getCol(); ((MCLEncoder *)encoders[3])->max = GRID_LENGTH - getRow(); if (!reload_slot_models) { @@ -580,15 +611,28 @@ void GridPage::apply_slot_changes(bool ignore_undo, bool ignore_func) { uint8_t width; uint8_t height; + + uint8_t _col = getCol();; + + //old_col != 255 indicates that the grid selection spans grids x and y. + if (old_col != 255) { + _col = old_col; + proj.select_grid(0); + } + GridTrack temp_slot; + temp_slot.load_from_grid(_col, getRow()); - temp_slot.load_from_grid(getCol(), getRow()); + if (old_col == 255) { + swap_grids(); + } uint8_t load_mode_old = mcl_cfg.load_mode; - uint8_t undo = slot_undo && !ignore_undo && slot_undo_x == getCol() && + uint8_t undo = slot_undo && !ignore_undo && slot_undo_x == _col && slot_undo_y == getRow(); DEBUG_PRINTLN("apply slot"); - swap_grids(); + + if (!ignore_func) { void (*row_func)() = grid_slot_page.menu.get_row_function(grid_slot_page.encoders[1]->cur); @@ -598,7 +642,7 @@ void GridPage::apply_slot_changes(bool ignore_undo, bool ignore_func) { return; } } - width = encoders[2]->cur; + width = old_col != 255 ? GRID_WIDTH - cur_col : encoders[2]->cur; height = encoders[3]->cur; uint8_t slot_update = 0; @@ -641,7 +685,7 @@ void GridPage::apply_slot_changes(bool ignore_undo, bool ignore_func) { if (slot_copy == 1 || (slot_clear == 1 && !undo)) { if (slot_clear == 1) { - slot_undo_x = getCol(); + slot_undo_x = _col; slot_undo_y = getRow(); if (width > 0) { oled_display.textbox("CLEAR ", "SLOTS"); @@ -657,7 +701,7 @@ void GridPage::apply_slot_changes(bool ignore_undo, bool ignore_func) { oled_display.textbox("COPY ", "SLOT"); } } - mcl_clipboard.copy(getCol(), getRow(), width, height, proj.get_grid()); + mcl_clipboard.copy(_col, getRow(), width, height, proj.get_grid()); if (slot_clear) { goto run; } @@ -670,7 +714,7 @@ void GridPage::apply_slot_changes(bool ignore_undo, bool ignore_func) { oled_display.textbox("PASTE", ""); } slot_undo = 0; - mcl_clipboard.paste(getCol(), getRow(), proj.get_grid()); + mcl_clipboard.paste(_col, getRow(), proj.get_grid()); } else { if (slot_update == 1) { oled_display.textbox("SLOT ", "UPDATE"); @@ -686,6 +730,7 @@ void GridPage::apply_slot_changes(bool ignore_undo, bool ignore_func) { oled_display.display(); + bool activate_header = false; uint8_t track_select_array[GRID_LENGTH] = {0}; @@ -694,6 +739,8 @@ void GridPage::apply_slot_changes(bool ignore_undo, bool ignore_func) { SeqTrack seq_track; uint16_t target_length = slot.link.length * seq_track.get_speed_multiplier(slot.link.speed) * slot.link.loops; + again: + for (uint8_t y = 0; y < height && y + getRow() < GRID_LENGTH; y++) { uint8_t ypos = y + getRow(); proj.read_grid_row_header(&header, y + getRow()); @@ -703,8 +750,8 @@ void GridPage::apply_slot_changes(bool ignore_undo, bool ignore_func) { if (slot_clear && height > 8) { mcl_gui.draw_progress("", y, height); } - for (uint8_t x = 0; x < width && x + getCol() < getWidth(); x++) { - uint8_t xpos = x + getCol(); + for (uint8_t x = 0; x < width && x + _col < getWidth(); x++) { + uint8_t xpos = x + _col; if (slot_clear == 1) { // Delete slot(s) proj.clear_slot_grid(xpos, ypos); @@ -749,9 +796,22 @@ void GridPage::apply_slot_changes(bool ignore_undo, bool ignore_func) { } } end: - if ((slot_clear == 1) || (slot_paste == 1) || (slot_update == 1) || + if ((slot_clear == 1) || (slot_paste == 1) || (slot_update == 1) || (insert_rows == 1)) { proj.sync_grid(); + } + + if (old_col != 255) { + if (proj.get_grid() == 0) { + proj.select_grid(1); + width = encoders[2]->cur; + goto again; + } + load_old_col(); + } + + if ((slot_clear == 1) || (slot_paste == 1) || (slot_update == 1) || + (insert_rows == 1)) { load_slot_models(); } mcl_cfg.load_mode = load_mode_old; @@ -761,7 +821,8 @@ void GridPage::apply_slot_changes(bool ignore_undo, bool ignore_func) { slot_copy = 0; slot_paste = 0; insert_rows = 0; - slot.load_from_grid(getCol(), getRow()); + slot.load_from_grid(_col, getRow()); + old_col = 255; } bool GridPage::handleEvent(gui_event_t *event) { @@ -1033,6 +1094,7 @@ bool GridPage::handleEvent(gui_event_t *event) { encoders[2]->cur = 1; encoders[3]->cur = 1; slot_apply = 0; + old_col = 255; if (!slot.is_ext_track()) { grid_slot_page.menu.enable_entry(2, true); grid_slot_page.menu.enable_entry(3, false); diff --git a/avr/cores/megacommand/MCL/GridPage.h b/avr/cores/megacommand/MCL/GridPage.h index 3ebefdeeb..05ab57d28 100644 --- a/avr/cores/megacommand/MCL/GridPage.h +++ b/avr/cores/megacommand/MCL/GridPage.h @@ -25,6 +25,7 @@ class GridPage : public LightPage { uint8_t row = 0; uint8_t cur_col = 0; uint8_t cur_row = 0; + uint8_t old_col = 0; uint8_t display_name = 0; uint8_t bank = 0; @@ -88,7 +89,7 @@ class GridPage : public LightPage { void prepare(); void swap_grids(); void apply_slot_changes(bool ignore_undo = false, bool ignore_func = false); - + void load_old_col(); void close_bank_popup(); void loop(); diff --git a/avr/cores/megacommand/MCL/GridPages.cpp b/avr/cores/megacommand/MCL/GridPages.cpp index 4ec69ac45..20e96b7a2 100644 --- a/avr/cores/megacommand/MCL/GridPages.cpp +++ b/avr/cores/megacommand/MCL/GridPages.cpp @@ -3,7 +3,7 @@ MCLEncoder param1(GRID_WIDTH - 1, 0, 1); MCLEncoder param2(GRID_LENGTH - 1, 0 , 1); -MCLEncoder param3(GRID_WIDTH, 1, ENCODER_RES_GRID); +MCLEncoder param3(GRID_WIDTH + 1, 0, ENCODER_RES_GRID); MCLEncoder param4(6, 1, ENCODER_RES_GRID); GridPage grid_page(¶m1, ¶m2, ¶m3, ¶m4); From 630991a9927d1a5b94819df468175a6c6f8973fb Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 3 Apr 2023 19:47:05 +1000 Subject: [PATCH 002/413] Allow EmptyTrack length to be changed from 16 steps --- avr/cores/megacommand/MCL/GridPage.cpp | 4 ++++ avr/cores/megacommand/MCL/GridTrack.cpp | 2 +- avr/cores/megacommand/MCL/GridTrack.h | 3 ++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/GridPage.cpp b/avr/cores/megacommand/MCL/GridPage.cpp index b8566ba74..9c23ee806 100644 --- a/avr/cores/megacommand/MCL/GridPage.cpp +++ b/avr/cores/megacommand/MCL/GridPage.cpp @@ -117,6 +117,8 @@ void GridPage::loop() { grid_page.grid_select_apply = 1; proj.grid_select = 1; ((MCLEncoder *)encoders[2])->max = getWidth() - getCol(); + load_slot_models(); + reload_slot_models = true; } else if ((proj.get_grid() == 1) && (encoders[2]->cur == 0) && (old_col != 255)) { load_old_col(); @@ -702,6 +704,8 @@ void GridPage::apply_slot_changes(bool ignore_undo, bool ignore_func) { } } mcl_clipboard.copy(_col, getRow(), width, height, proj.get_grid()); + } + if (slot_clear) { goto run; } diff --git a/avr/cores/megacommand/MCL/GridTrack.cpp b/avr/cores/megacommand/MCL/GridTrack.cpp index 5247f3c28..f4459e668 100644 --- a/avr/cores/megacommand/MCL/GridTrack.cpp +++ b/avr/cores/megacommand/MCL/GridTrack.cpp @@ -61,7 +61,7 @@ bool GridTrack::load_from_grid(uint8_t column, uint16_t row) { ::new (this) GridTrack; this->active = tmp; - if ((active == EMPTY_TRACK_TYPE) || (active == 255)) { + if ((active == 255)) { init(); } diff --git a/avr/cores/megacommand/MCL/GridTrack.h b/avr/cores/megacommand/MCL/GridTrack.h index a05f7d402..384b4af68 100644 --- a/avr/cores/megacommand/MCL/GridTrack.h +++ b/avr/cores/megacommand/MCL/GridTrack.h @@ -75,9 +75,10 @@ class GridTrack { return true; } - void init() { + void init() { link.length = 16; link.speed = SEQ_SPEED_1X; + link.loops = 0; } /* Load track from Grid in to sequencer, place in payload to be transmitted to device*/ From 06fca2b23520b9dade59c1805d72c882b9b4cd45 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 3 Apr 2023 21:58:35 +1000 Subject: [PATCH 003/413] prevent MidiClock loopback on port2 if elektron driver is present --- avr/cores/megacommand/MCL/MidiSetup.cpp | 36 ++++++++++++++++++------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/avr/cores/megacommand/MCL/MidiSetup.cpp b/avr/cores/megacommand/MCL/MidiSetup.cpp index 49f9b8e24..c27cc47a5 100644 --- a/avr/cores/megacommand/MCL/MidiSetup.cpp +++ b/avr/cores/megacommand/MCL/MidiSetup.cpp @@ -23,6 +23,11 @@ void MidiSetup::cfg_ports(bool boot) { DEBUG_PRINT_FN(); // Always receive transport on port1 for MD. + ElektronDevice *elektron_devs[2] = { + midi_active_peering.get_device(UART1_PORT)->asElektronDevice(), + midi_active_peering.get_device(UART2_PORT)->asElektronDevice(), + }; + MidiClock.uart_transport_recv1 = &MidiUart; MidiClock.uart_transport_forward1 = &MidiUart; @@ -43,13 +48,21 @@ void MidiSetup::cfg_ports(bool boot) { MidiClock.uart_transport_forward3 = nullptr; switch (mcl_cfg.midi_transport_send) { case 1: - MidiClock.uart_transport_forward2 = &MidiUart2; + if (MidiClock.uart_transport_recv2 == &MidiUart2 && mcl_cfg.uart2_device > 0) { + } + else { + MidiClock.uart_transport_forward2 = &MidiUart2; + } break; case 2: MidiClock.uart_transport_forward3 = &MidiUartUSB; break; case 3: - MidiClock.uart_transport_forward2 = &MidiUart2; + if (MidiClock.uart_transport_recv2 == &MidiUart2 && mcl_cfg.uart2_device > 0) { + } + else { + MidiClock.uart_transport_forward2 = &MidiUart2; + } MidiClock.uart_transport_forward3 = &MidiUartUSB; break; } @@ -58,7 +71,11 @@ void MidiSetup::cfg_ports(bool boot) { MidiClock.uart_clock_forward3 = nullptr; switch (mcl_cfg.clock_send) { case 1: - MidiClock.uart_clock_forward2 = &MidiUart2; + if (MidiClock.uart_clock_recv == &MidiUart2 && mcl_cfg.uart2_device > 0) { + } + else { + MidiClock.uart_clock_forward2 = &MidiUart2; + } break; case 2: #ifndef DEBUGMODE @@ -66,8 +83,12 @@ void MidiSetup::cfg_ports(bool boot) { #endif break; case 3: - MidiClock.uart_clock_forward2 = &MidiUart2; - #ifndef DEBUGMODE + if (MidiClock.uart_clock_recv == &MidiUart2 && mcl_cfg.uart2_device > 0) { + } + else { + MidiClock.uart_clock_forward2 = &MidiUart2; + } +#ifndef DEBUGMODE MidiClock.uart_clock_forward3 = &MidiUartUSB; #endif break; @@ -109,11 +130,6 @@ void MidiSetup::cfg_ports(bool boot) { MidiUSB.uart); } - ElektronDevice *elektron_devs[2] = { - midi_active_peering.get_device(UART1_PORT)->asElektronDevice(), - midi_active_peering.get_device(UART2_PORT)->asElektronDevice(), - }; - if (elektron_devs[0]) { turbo_light.set_speed(turbo_light.lookup_speed(mcl_cfg.uart1_turbo), Midi.uart); From 15276f387816ff7a8a97088970b9bb33bfff8e07 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 5 Apr 2023 22:38:46 +1000 Subject: [PATCH 004/413] Fix bug with turbo speed change on MidiUSB --- avr/cores/megacommand/MCL/MidiActivePeering.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/MidiActivePeering.cpp b/avr/cores/megacommand/MCL/MidiActivePeering.cpp index dd10c54f3..94063748e 100644 --- a/avr/cores/megacommand/MCL/MidiActivePeering.cpp +++ b/avr/cores/megacommand/MCL/MidiActivePeering.cpp @@ -61,6 +61,8 @@ static MidiDevice *connected_midi_devices[2] = {&null_midi_device, &null_midi_device}; void MidiActivePeering::disconnect(uint8_t port) { + DEBUG_PRINTLN("disconnect"); + DEBUG_PRINTLN(port); MidiUartClass *pmidi = _getMidiUart(port); if (!pmidi) { return; } MidiDevice **drivers; @@ -182,7 +184,7 @@ void MidiActivePeering::run() { resource_loaded = false; //Setting USB turbo speed too early can cause OS upload to fail - if (turbo_light.lookup_speed(mcl_cfg.usb_turbo) != MidiUartUSB.speed && slowclock > 4000 && usb_set_speed) { + if (turbo_light.tmSpeeds[turbo_light.lookup_speed(mcl_cfg.usb_turbo)] != MidiUartUSB.speed && slowclock > 4000 && usb_set_speed) { turbo_light.set_speed(turbo_light.lookup_speed(mcl_cfg.usb_turbo), MidiUSB.uart); usb_set_speed = false; } From 587728b395352ce38695c7bafb9983cc501fbec2 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 5 Apr 2023 23:33:39 +1000 Subject: [PATCH 005/413] checkpoint --- avr/cores/megacommand/MCL/GridPage.cpp | 28 ++++--- avr/cores/megacommand/MCL/MCLClipBoard.cpp | 80 ++++++++++++------- avr/cores/megacommand/MCL/MCLClipBoard.h | 4 +- .../megacommand/MCL/MidiActivePeering.cpp | 2 + 4 files changed, 75 insertions(+), 39 deletions(-) diff --git a/avr/cores/megacommand/MCL/GridPage.cpp b/avr/cores/megacommand/MCL/GridPage.cpp index 9c23ee806..96f0e279c 100644 --- a/avr/cores/megacommand/MCL/GridPage.cpp +++ b/avr/cores/megacommand/MCL/GridPage.cpp @@ -122,7 +122,9 @@ void GridPage::loop() { } else if ((proj.get_grid() == 1) && (encoders[2]->cur == 0) && (old_col != 255)) { load_old_col(); - } + load_slot_models(); + reload_slot_models = true; + } if (encoders[2]->cur == 0) { encoders[2]->cur = 1; encoders[2]->old = 1; } } if (encoders[3]->hasChanged()) { @@ -644,7 +646,7 @@ void GridPage::apply_slot_changes(bool ignore_undo, bool ignore_func) { return; } } - width = old_col != 255 ? GRID_WIDTH - cur_col : encoders[2]->cur; + width = old_col != 255 ? GRID_WIDTH - _col : encoders[2]->cur; height = encoders[3]->cur; uint8_t slot_update = 0; @@ -660,9 +662,9 @@ void GridPage::apply_slot_changes(bool ignore_undo, bool ignore_func) { for (uint8_t g = 0; g < 2; g++) { for (uint8_t n = 0; n < row_count; n++) { if (n % 8) mcl_gui.draw_progress("INSERT ROWS", n + g * row_count, row_count * 2); - mcl_clipboard.copy(0, getRow() + row_count - n - insert_rows, - GRID_WIDTH, 1, g); - mcl_clipboard.paste(0, getRow() + row_count - n, g); + mcl_clipboard.copy(g * GRID_WIDTH, getRow() + row_count - n - insert_rows, + GRID_WIDTH, 1); + mcl_clipboard.paste(g * GRID_WIDTH, getRow() + row_count - n); } for (uint8_t n = 0; n < insert_rows; n++) { proj.clear_row_grid(getRow() + n, g); @@ -703,13 +705,18 @@ void GridPage::apply_slot_changes(bool ignore_undo, bool ignore_func) { oled_display.textbox("COPY ", "SLOT"); } } - mcl_clipboard.copy(_col, getRow(), width, height, proj.get_grid()); + mcl_clipboard.copy(_col + 16 * proj.get_grid(), getRow(), width, height); + if (old_col != 255 && proj.get_grid() == 0) { + mcl_clipboard.copy(16, getRow(), encoders[2]->cur, height); + mcl_clipboard.t_col = _col; + mcl_clipboard.t_w += GRID_WIDTH - cur_col; + DEBUG_PRINTLN("copy grid 1+2"); + DEBUG_PRINTLN(mcl_clipboard.t_w); + } } - if (slot_clear) { goto run; } - } else if (slot_paste == 1) { if (undo) { @@ -718,7 +725,7 @@ void GridPage::apply_slot_changes(bool ignore_undo, bool ignore_func) { oled_display.textbox("PASTE", ""); } slot_undo = 0; - mcl_clipboard.paste(_col, getRow(), proj.get_grid()); + mcl_clipboard.paste(_col + 16 * proj.get_grid(), getRow()); } else { if (slot_update == 1) { oled_display.textbox("SLOT ", "UPDATE"); @@ -799,7 +806,8 @@ void GridPage::apply_slot_changes(bool ignore_undo, bool ignore_func) { } } } -end: + end: + if ((slot_clear == 1) || (slot_paste == 1) || (slot_update == 1) || (insert_rows == 1)) { proj.sync_grid(); diff --git a/avr/cores/megacommand/MCL/MCLClipBoard.cpp b/avr/cores/megacommand/MCL/MCLClipBoard.cpp index 06a18aced..c5795d783 100644 --- a/avr/cores/megacommand/MCL/MCLClipBoard.cpp +++ b/avr/cores/megacommand/MCL/MCLClipBoard.cpp @@ -169,8 +169,7 @@ bool MCLClipBoard::paste_sequencer_track(uint8_t source_track, uint8_t track) { return true; } -bool MCLClipBoard::copy(uint16_t col, uint16_t row, uint16_t w, uint16_t h, - uint8_t grid) { +bool MCLClipBoard::copy(uint8_t col, uint16_t row, uint8_t w, uint16_t h) { DEBUG_PRINT_FN(); uint8_t old_grid = proj.get_grid(); t_col = col; @@ -186,6 +185,12 @@ bool MCLClipBoard::copy(uint16_t col, uint16_t row, uint16_t w, uint16_t h, bool ret; GridRowHeader header; + DEBUG_PRINTLN("copy"); + DEBUG_PRINTLN(col); + DEBUG_PRINTLN(row); + DEBUG_PRINTLN(w); + + uint8_t grid = col / 16; for (int y = 0; y < h; y++) { proj.select_grid(grid); proj.read_grid_row_header(&header, y + row); @@ -195,18 +200,24 @@ bool MCLClipBoard::copy(uint16_t col, uint16_t row, uint16_t w, uint16_t h, mcl_gui.draw_progress("", y, h); } for (int x = 0; x < w; x++) { - ret = proj.read_grid(&temp_track, sizeof(temp_track), x + col, y + row); + uint8_t s_col = x + col; + if (x + col >= 16) { s_col -= 16; grid = 1; } + proj.select_grid(grid); + DEBUG_PRINT("Copy: "); DEBUG_PRINT(s_col); DEBUG_PRINT(" "); DEBUG_PRINT(y + row); DEBUG_PRINT(" "); DEBUG_PRINTLN(grid); + auto *ptrack = temp_track.load_from_grid_512(s_col, y + row); DEBUG_DUMP(temp_track.active); - if (ret) { - ret = grids[grid].write(&temp_track, sizeof(temp_track), x + col, - y + row); + if (ptrack != nullptr) { + bool merge = false; + bool online = false; + ptrack->store_in_grid(s_col, y + row, nullptr, merge, online, grids + grid); } + else { DEBUG_PRINTLN("ptrack null"); } } } close(); proj.select_grid(old_grid); } -bool MCLClipBoard::paste(uint16_t col, uint16_t row, uint8_t grid) { +bool MCLClipBoard::paste(uint8_t col, uint16_t row) { DEBUG_PRINT_FN(); uint8_t old_grid = proj.get_grid(); if (!open()) { @@ -214,48 +225,55 @@ bool MCLClipBoard::paste(uint16_t col, uint16_t row, uint8_t grid) { return false; } DEBUG_PRINTLN("paste here"); - bool destination_same = (col == t_col); - if (t_w == 1) { - destination_same = true; - } + bool destination_same = (col == t_col || t_w == 1); // setup buffer frame EmptyTrack empty_track; - GridRowHeader header; + GridRowHeader headers[2]; + GridRowHeader header_copy; uint8_t track_idx, dev_idx; + uint8_t grid = col / 16; + for (int y = 0; y < t_h && y + row < GRID_LENGTH; y++) { - proj.select_grid(grid); - proj.read_grid_row_header(&header, y + row); - if ((!header.active) || (strlen(header.name) == 0) || + proj.select_grid(0); + proj.read_grid_row_header(headers, y + row); + proj.select_grid(1); + proj.read_grid_row_header(headers + 1, y + row); + if ((!headers[0].active) || (strlen(headers[0].name) == 0) || (t_w == GRID_WIDTH && col == 0)) { grids[grid].read_row_header(&header_copy, y + t_row); - header.active = true; + headers[0].active = true; + headers[1].active = true; if (header_copy.active) { - strncpy(&(header.name[0]), &(header_copy.name[0]), sizeof(header.name)); + strncpy(&(headers[0].name[0]), &(header_copy.name[0]), sizeof(headers[0].name)); + strncpy(&(headers[1].name[0]), &(header_copy.name[0]), sizeof(headers[0].name)); } else { - header.name[0] = '\0'; + headers[0].name[0] = '\0'; + headers[1].name[0] = '\0'; } } if (t_h > 8) { mcl_gui.draw_progress("", y, t_h); } - for (int x = 0; x < t_w && x + col < GRID_WIDTH; x++) { + for (int x = 0; x < t_w && x + col < GRID_WIDTH * 2; x++) { - // track now has full data and correct type uint8_t s_col = x + t_col; uint8_t d_col = x + col; - uint8_t slot_n = grid * GRID_WIDTH + d_col; + uint8_t slot_n = d_col; + + grid = s_col / 16; - grids[grid].read(&empty_track, sizeof(EmptyTrack), s_col, y + t_row); + if (s_col >= GRID_WIDTH) { s_col -= GRID_WIDTH; } - DeviceTrack *ptrack = - ((DeviceTrack *)&empty_track)->init_track_type(empty_track.active); - DEBUG_DUMP(ptrack->active); + auto *ptrack = empty_track.load_from_grid_512(s_col, y + t_row, grids + grid); + if (ptrack == nullptr) { continue; } + + DEBUG_PRINTLN(slot_n); GridDeviceTrack *gdt = mcl_actions.get_grid_dev_track(slot_n, &track_idx, &dev_idx); @@ -273,12 +291,20 @@ bool MCLClipBoard::paste(uint16_t col, uint16_t row, uint8_t grid) { } else if (new_link_row < 0) { new_link_row = y + row; } + grid = d_col / 16; + if (d_col >= GRID_WIDTH) { d_col -= GRID_WIDTH; } + + DEBUG_PRINT("PASTE: "); DEBUG_PRINT(s_col); DEBUG_PRINT("->"); DEBUG_PRINT(d_col); DEBUG_PRINT(" "); DEBUG_PRINTLN(grid); + proj.select_grid(grid); ptrack->link.row = new_link_row; - header.update_model(d_col, ptrack->get_model(), ptrack->active); + headers[grid].update_model(d_col, ptrack->get_model(), ptrack->active); ptrack->on_copy(s_col, d_col, destination_same); ptrack->store_in_grid(d_col, y + row); } - proj.write_grid_row_header(&header, y + row); + proj.select_grid(0); + proj.write_grid_row_header(headers, y + row); + proj.select_grid(1); + proj.write_grid_row_header(headers + 1, y + row); } close(); proj.select_grid(old_grid); diff --git a/avr/cores/megacommand/MCL/MCLClipBoard.h b/avr/cores/megacommand/MCL/MCLClipBoard.h index 416bc3f1a..4169073d6 100644 --- a/avr/cores/megacommand/MCL/MCLClipBoard.h +++ b/avr/cores/megacommand/MCL/MCLClipBoard.h @@ -30,8 +30,8 @@ class MCLClipBoard { bool paste_sequencer(uint8_t offset = 0); bool paste_sequencer_track(uint8_t source_track, uint8_t track); - bool copy(uint16_t col, uint16_t row, uint16_t w, uint16_t h, uint8_t grid); - bool paste(uint16_t col, uint16_t row, uint8_t grid); + bool copy(uint8_t col, uint16_t row, uint8_t w, uint16_t h); + bool paste(uint8_t col, uint16_t row); }; diff --git a/avr/cores/megacommand/MCL/MidiActivePeering.cpp b/avr/cores/megacommand/MCL/MidiActivePeering.cpp index 94063748e..bc417ec66 100644 --- a/avr/cores/megacommand/MCL/MidiActivePeering.cpp +++ b/avr/cores/megacommand/MCL/MidiActivePeering.cpp @@ -184,10 +184,12 @@ void MidiActivePeering::run() { resource_loaded = false; //Setting USB turbo speed too early can cause OS upload to fail + #ifndef DEBUGMODE if (turbo_light.tmSpeeds[turbo_light.lookup_speed(mcl_cfg.usb_turbo)] != MidiUartUSB.speed && slowclock > 4000 && usb_set_speed) { turbo_light.set_speed(turbo_light.lookup_speed(mcl_cfg.usb_turbo), MidiUSB.uart); usb_set_speed = false; } + #endif probePort(UART1_PORT, port1_drivers, countof(port1_drivers), &connected_midi_devices[0], resource_buf); From e1f692b630717a6f1015ef9c2c0f37f08d0d4b88 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 5 Apr 2023 23:48:47 +1000 Subject: [PATCH 006/413] Copy/paste across both grids seems to be working --- avr/cores/megacommand/MCL/MCLClipBoard.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/MCLClipBoard.cpp b/avr/cores/megacommand/MCL/MCLClipBoard.cpp index c5795d783..94a97b073 100644 --- a/avr/cores/megacommand/MCL/MCLClipBoard.cpp +++ b/avr/cores/megacommand/MCL/MCLClipBoard.cpp @@ -196,7 +196,7 @@ bool MCLClipBoard::copy(uint8_t col, uint16_t row, uint8_t w, uint16_t h) { proj.read_grid_row_header(&header, y + row); ret = grids[grid].write_row_header(&header, y + row); DEBUG_PRINTLN(header.name); - if (h > 8) { + if (h > 4) { mcl_gui.draw_progress("", y, h); } for (int x = 0; x < w; x++) { From 72b5605fef8477dd16721ca28901e0d0070150cc Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 6 Apr 2023 10:07:21 +1000 Subject: [PATCH 007/413] Init link data on invalid tracks --- avr/cores/megacommand/MCL/MCLActions.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/MCLActions.cpp b/avr/cores/megacommand/MCL/MCLActions.cpp index fbb4b1398..07d043dc8 100644 --- a/avr/cores/megacommand/MCL/MCLActions.cpp +++ b/avr/cores/megacommand/MCL/MCLActions.cpp @@ -371,6 +371,7 @@ void MCLActions::collect_tracks(uint8_t *slot_select_array, if (device_track == nullptr || device_track->active != gdt->track_type && device_track->get_parent_model() != gdt->track_type) { empty_track.clear(); + if (device_track->active != EMPTY_TRACK_TYPE) { device_track->init(); } //Init link data for invalid tracks device_track = device_track->init_track_type(gdt->track_type); if (device_track) { device_track->init(track_idx, gdt->seq_track); @@ -499,12 +500,12 @@ bool MCLActions::load_track(uint8_t track_idx, uint8_t row, uint8_t pos, return false; } // read failure - ptrack->link.store_in_mem(pos, &(links[0])); if (ptrack->active != gdt->track_type && ptrack->get_parent_model() != gdt->track_type) { empty_track.clear(); DEBUG_PRINTLN("Clearing track"); DEBUG_PRINTLN(pos); + if (ptrack->active != EMPTY_TRACK_TYPE) { ptrack->init(); } ptrack->init_track_type(gdt->track_type); ptrack->init(track_idx, gdt->seq_track); ptrack->load_seq_data(gdt->seq_track); @@ -517,6 +518,8 @@ bool MCLActions::load_track(uint8_t track_idx, uint8_t row, uint8_t pos, ptrack->store_in_mem(track_idx); send_masks[pos] = 1; } + + ptrack->link.store_in_mem(pos, &(links[0])); return true; } @@ -759,6 +762,7 @@ void MCLActions::cache_next_tracks(uint8_t *slot_select_array, // EMPTY_TRACK_TYPE ////DEBUG_PRINTLN(F("clear track")); empty_track.clear(); + if (ptrack->active != EMPTY_TRACK_TYPE) { ptrack->init(); } ptrack = empty_track.init_track_type(gdt->track_type); ptrack->init(track_idx, gdt->seq_track); } else { From 353240af5c0bc4ac79b4b022ee38cdd653dcc1e9 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 5 May 2023 16:23:00 +1000 Subject: [PATCH 008/413] Add parameter locking to the piano roll note editor --- avr/cores/megacommand/MCL/SeqPtcPage.cpp | 146 ++++++++++++++--------- 1 file changed, 87 insertions(+), 59 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.cpp b/avr/cores/megacommand/MCL/SeqPtcPage.cpp index f3b2994af..91ec6d319 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPtcPage.cpp @@ -147,19 +147,22 @@ void SeqPtcPage::loop() { } uint8_t SeqPtcPage::find_arp_track(uint8_t channel_event) { uint8_t track = last_md_track; - if (channel_event == POLY_EVENT) { - uint16_t mask = mcl_cfg.poly_mask; - uint8_t n = 0; - while (mask) { - if (mask & 1) { return n; } - n++; - mask = mask >> 1; + if (channel_event == POLY_EVENT) { + uint16_t mask = mcl_cfg.poly_mask; + uint8_t n = 0; + while (mask) { + if (mask & 1) { + return n; } + n++; + mask = mask >> 1; } + } return track; } -void SeqPtcPage::render_arp(bool recalc_notemask_, MidiDevice *midi_dev, uint8_t track) { +void SeqPtcPage::render_arp(bool recalc_notemask_, MidiDevice *midi_dev, + uint8_t track) { if (recalc_notemask_) { recalc_notemask(); } @@ -169,8 +172,7 @@ void SeqPtcPage::render_arp(bool recalc_notemask_, MidiDevice *midi_dev, uint8_t if (midi_dev == &MD) { seq_track = &mcl_seq.md_tracks[track]; arp_track = &mcl_seq.md_arp_tracks[track]; - } - else { + } else { seq_track = &mcl_seq.ext_tracks[track]; arp_track = &mcl_seq.ext_arp_tracks[track]; } @@ -285,24 +287,24 @@ uint8_t SeqPtcPage::calc_scale_note(uint8_t note_num, bool padded) { return scales[ptc_param_scale.cur]->pitches[pos] + oct * 12 + transpose; } -uint8_t SeqPtcPage::get_next_voice(uint8_t pitch, uint8_t track_number, uint8_t channel_event) { +uint8_t SeqPtcPage::get_next_voice(uint8_t pitch, uint8_t track_number, + uint8_t channel_event) { uint8_t voice = 255; if (channel_event == POLY_EVENT) { goto poly; - } - else if (channel_event == CTRL_EVENT) { + } else if (channel_event == CTRL_EVENT) { - // mono - if (!mcl_cfg.poly_mask || (!IS_BIT_SET16(mcl_cfg.poly_mask, track_number))) { + // mono + if (!mcl_cfg.poly_mask || + (!IS_BIT_SET16(mcl_cfg.poly_mask, track_number))) { return track_number; } - } - else { + } else { return 255; } - poly: +poly: // If track previously played pitch, re-use this track for (uint8_t x = 0; x < 16; x++) { if (MD.isMelodicTrack(x) && IS_BIT_SET16(mcl_cfg.poly_mask, x)) { @@ -618,7 +620,8 @@ uint8_t SeqPtcPage::seq_ext_pitch(uint8_t note_num) { return (pitch < 128) ? pitch : 255; } -uint8_t SeqPtcPage::process_ext_event(uint8_t note_num, bool note_type, uint8_t channel) { +uint8_t SeqPtcPage::process_ext_event(uint8_t note_num, bool note_type, + uint8_t channel) { uint8_t pitch = seq_ptc_page.seq_ext_pitch(note_num); uint8_t dev = (midi_device == &MD) ? 0 : 1; @@ -641,11 +644,14 @@ uint8_t SeqPtcPage::process_ext_event(uint8_t note_num, bool note_type, uint8_t } uint8_t SeqPtcPage::is_md_midi(uint8_t channel) { - if ((mcl_cfg.uart2_poly_chan - 1 == channel) || (mcl_cfg.uart2_poly_chan == MIDI_OMNI_MODE)) { + if ((mcl_cfg.uart2_poly_chan - 1 == channel) || + (mcl_cfg.uart2_poly_chan == MIDI_OMNI_MODE)) { return POLY_EVENT; } - if (((mcl_cfg.uart2_ctrl_chan - 1 == channel) || (mcl_cfg.uart2_ctrl_chan == MIDI_OMNI_MODE)) && (GUI.currentPage() != &seq_extstep_page)) { + if (((mcl_cfg.uart2_ctrl_chan - 1 == channel) || + (mcl_cfg.uart2_ctrl_chan == MIDI_OMNI_MODE)) && + (GUI.currentPage() != &seq_extstep_page)) { return CTRL_EVENT; } if (mcl_cfg.md_trig_channel - 1 == channel) { @@ -653,13 +659,12 @@ uint8_t SeqPtcPage::is_md_midi(uint8_t channel) { } return NO_EVENT; -/* - return (mcl_cfg.uart2_ctrl_chan != MIDI_LOCAL_MODE) && - (GUI.currentPage() != &seq_extstep_page); -*/ + /* + return (mcl_cfg.uart2_ctrl_chan != MIDI_LOCAL_MODE) && + (GUI.currentPage() != &seq_extstep_page); + */ } - void SeqPtcMidiEvents::onNoteOnCallback_Midi2(uint8_t *msg) { uint8_t note_num = msg[1]; uint8_t channel = MIDI_VOICE_CHANNEL(msg[0]); @@ -680,13 +685,15 @@ void SeqPtcMidiEvents::onNoteOnCallback_Midi2(uint8_t *msg) { if (note_num < MIDI_NOTE_C4) { if (mcl_cfg.md_trig_channel - 1 == channel) { - uint8_t pos = note_num - MIDI_NOTE_C2; - if (pos > 15) { return; } - MD.triggerTrack(pos, msg[2]); - if ((seq_ptc_page.recording) && (MidiClock.state == 2)) { - reset_undo(); - mcl_seq.md_tracks[pos].record_track(msg[2]); - } + uint8_t pos = note_num - MIDI_NOTE_C2; + if (pos > 15) { + return; + } + MD.triggerTrack(pos, msg[2]); + if ((seq_ptc_page.recording) && (MidiClock.state == 2)) { + reset_undo(); + mcl_seq.md_tracks[pos].record_track(msg[2]); + } } } uint8_t note = note_num - (note_num / 12) * 12; @@ -696,7 +703,7 @@ void SeqPtcMidiEvents::onNoteOnCallback_Midi2(uint8_t *msg) { uint8_t n = seq_ptc_page.find_arp_track(channel_event); if (channel_event == CTRL_EVENT) { - arp_page.track_update(n); + arp_page.track_update(n); } seq_ptc_page.render_arp(false, SeqPage::midi_device, n); @@ -773,7 +780,8 @@ void SeqPtcMidiEvents::onNoteOffCallback_Midi2(uint8_t *msg) { return; } - last_ext_track = min(n, NUM_EXT_TRACKS - 1);; + last_ext_track = min(n, NUM_EXT_TRACKS - 1); + ; seq_ptc_page.config_encoders(); seq_ptc_page.render_arp(false, SeqPage::midi_device, n); @@ -796,7 +804,7 @@ void SeqPtcMidiEvents::onControlChangeCallback_Midi2(uint8_t *msg) { bool send_uart2 = true; - //CC_FWD + // CC_FWD // if (mcl_cfg.uart_cc_loopback) { MidiUart2.sendCC(channel, param, value); @@ -820,7 +828,7 @@ void SeqPtcMidiEvents::onControlChangeCallback_Midi2(uint8_t *msg) { for (uint8_t n = 0; n < NUM_MD_TRACKS; n++) { if (IS_BIT_SET16(mcl_cfg.poly_mask, n)) { if (track_param < 24) { - mcl_seq.md_tracks[n].update_param(param - 16, value); + mcl_seq.md_tracks[n].update_param(param - 16, value); } MD.setTrackParam(n, param - 16, value, nullptr, true); } @@ -829,30 +837,48 @@ void SeqPtcMidiEvents::onControlChangeCallback_Midi2(uint8_t *msg) { return; } - uint8_t n = mcl_seq.find_ext_track(channel); + uint8_t n = mcl_seq.find_ext_track(channel); if (n == 255) { return; } - //Send mod wheel CC#1 or bank select CC#0 + // Send mod wheel CC#1 or bank select CC#0 if (send_uart2 && param < 2) { mcl_seq.ext_tracks[n].send_cc(param, value); } - if (GUI.currentPage() == &seq_extstep_page && SeqPage::pianoroll_mode > 0) { - if (mcl_seq.ext_tracks[n].locks_params[SeqPage::pianoroll_mode - 1] - 1 == - PARAM_LEARN) { - mcl_seq.ext_tracks[n].locks_params[SeqPage::pianoroll_mode - 1] = - param + 1; - SeqPage::param_select = param; - } - if (mcl_seq.ext_tracks[n].locks_params[SeqPage::pianoroll_mode - 1] - 1 == - param) { - seq_extstep_page.lock_cur_y = value; + if (GUI.currentPage() == &seq_extstep_page) { + if (SeqPage::pianoroll_mode > 0) { + if (mcl_seq.ext_tracks[n].locks_params[SeqPage::pianoroll_mode - 1] - 1 == + PARAM_LEARN) { + mcl_seq.ext_tracks[n].locks_params[SeqPage::pianoroll_mode - 1] = + param + 1; + SeqPage::param_select = param; + } + if (mcl_seq.ext_tracks[n].locks_params[SeqPage::pianoroll_mode - 1] - 1 == + param) { + seq_extstep_page.lock_cur_y = value; + } + } else { + auto &active_track = mcl_seq.ext_tracks[n]; + uint8_t timing_mid = active_track.get_timing_mid(); + int a = 16 * timing_mid; + for (uint8_t i = 0; i < 16; i++) { + + if (note_interface.is_note_on(i)) { + auto &active_track = mcl_seq.ext_tracks[n]; + + uint8_t step = ((seq_extstep_page.cur_x / a) * 16) + i; + + active_track.clear_track_locks(step, param, 255); + active_track.set_track_locks(step, timing_mid, param, value, + SeqPage::slide); + } + } } } - if (SeqPage::recording && (MidiClock.state == 2)) { + if (SeqPage::recording && (MidiClock.state == 2) && note_interface.notes_all_off()) { if (param != midi_active_peering.get_device(UART2_PORT)->get_mute_cc()) { mcl_seq.ext_tracks[n].record_track_locks(param, value, SeqPage::slide); } @@ -917,7 +943,9 @@ void SeqPtcMidiEvents::onControlChangeCallback_Midi(uint8_t *msg) { } MD.parseCC(channel, param, &track, &track_param); - if (track > 15) { return; } + if (track > 15) { + return; + } uint8_t start_track; if (track_param == 32) { return; @@ -927,12 +955,13 @@ void SeqPtcMidiEvents::onControlChangeCallback_Midi(uint8_t *msg) { for (uint8_t n = 0; n < 16; n++) { if (IS_BIT_SET16(mcl_cfg.poly_mask, n) && (n != track)) { - if ((track_param < 24 && track_param > 7) || (track_param < 8 && MD.kit.models[n] == MD.kit.models[track])) { - mcl_seq.md_tracks[n].update_param(track_param, value); - MD.setTrackParam(n, track_param, value, nullptr, true); - display_polylink = 1; - } + if ((track_param < 24 && track_param > 7) || + (track_param < 8 && MD.kit.models[n] == MD.kit.models[track])) { + mcl_seq.md_tracks[n].update_param(track_param, value); + MD.setTrackParam(n, track_param, value, nullptr, true); + display_polylink = 1; } + } // in_sysex = 0; } } @@ -984,10 +1013,10 @@ void SeqPtcMidiEvents::setup_callbacks() { return; } if (mcl_cfg.midi_ctrl_port == 1 || mcl_cfg.midi_ctrl_port == 3) { - setup_midi(&Midi2); + setup_midi(&Midi2); } if (mcl_cfg.midi_ctrl_port == 2 || mcl_cfg.midi_ctrl_port == 3) { - setup_midi(&MidiUSB); + setup_midi(&MidiUSB); } Midi.addOnControlChangeCallback( this, @@ -995,7 +1024,6 @@ void SeqPtcMidiEvents::setup_callbacks() { state = true; } - void SeqPtcMidiEvents::remove_callbacks() { if (!state) { return; From 1309574a9bf66590beb9bc3e98547f7d72a35c13 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 5 May 2023 22:21:52 +1000 Subject: [PATCH 009/413] Improve PianoRoll grid --- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 78 +++++++++++++++----- avr/cores/megacommand/MCL/SeqExtStepPage.h | 2 +- 2 files changed, 59 insertions(+), 21 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index a7f3ba047..1a5b72f58 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -98,8 +98,8 @@ void SeqExtStepPage::cleanup() { void SeqExtStepPage::draw_seq_pos() { auto &active_track = mcl_seq.ext_tracks[last_ext_track]; - uint16_t cur_tick_x = active_track.step_count * active_track.get_timing_mid(); - +active_track.mod12_counter; + uint16_t cur_tick_x = active_track.step_count * active_track.get_timing_mid();// + active_track.mod12_counter; + // Draw sequencer position.. if (is_within_fov(cur_tick_x)) { @@ -113,6 +113,35 @@ void SeqExtStepPage::draw_seq_pos() { void SeqExtStepPage::draw_grid() { auto &active_track = mcl_seq.ext_tracks[last_ext_track]; uint8_t h = fov_h / fov_notes; + + uint8_t m = 4, n = 16; + + switch (active_track.speed) { + default: + break; + //case SEQ_SPEED_2X: + //m = 2; n = 8; + //break; + case SEQ_SPEED_3_2X: + case SEQ_SPEED_3_4X: + m = 3; n = 12; + break; + /* + case SEQ_SPEED_3_2X: + m = 3; n = 6; + break; + case SEQ_SPEED_1_2X: + m = 8; n = 32; + break; + case SEQ_SPEED_1_4X: + m = 16; n = 64; + break; + case SEQ_SPEED_1_8X: + m = 32; n = 128; + break; + */ + } + for (uint8_t i = 0; i < active_track.length; i++) { uint16_t grid_tick_x = i * active_track.get_timing_mid(); if (is_within_fov(grid_tick_x)) { @@ -124,17 +153,26 @@ void SeqExtStepPage::draw_grid() { // if ((fov_y + k + i) % 2 == 0) { oled_display.drawPixel( // grid_fov_x, (k * (fov_h / fov_notes)), WHITE); } bool draw = false; + uint8_t v = draw_y + (k * h); if ((pianoroll_mode > 0 && k == 3) || i % 16 == 0) { draw = true; } if (pianoroll_mode == 0) { draw = true; } + if (i % n == 0) { + //if ((fov_y + k + i) % 2 == 0) { + if (k % 2 == 0) { + oled_display.drawLine(grid_fov_x, v, grid_fov_x, v + 4, WHITE); + } + continue; + } if (draw) { - oled_display.drawPixel(grid_fov_x, draw_y + (k * (h)), WHITE); + oled_display.drawPixel(grid_fov_x, v, WHITE); } - if (i % 16 == 0) { - oled_display.drawPixel(grid_fov_x, draw_y + (k * h) + (h / 2), WHITE); + + if (i % m == 0) { + oled_display.drawPixel(grid_fov_x, v + (h / 2), WHITE); } } } @@ -299,6 +337,11 @@ void SeqExtStepPage::draw_lockeditor() { oled_display.drawPixel(draw_x + fov_cur_x, draw_y + fov_cur_y + 1 - 2, WHITE); } +void SeqExtStepPage::draw_note(uint8_t x, uint8_t y, uint8_t w) { + oled_display.drawRect(x, y, w, fov_h / fov_notes, WHITE); + oled_display.fillRect(x + 1, y + 1, w - 2, fov_h / fov_notes - 2, BLACK); +} + void SeqExtStepPage::draw_pianoroll() { auto &active_track = mcl_seq.ext_tracks[last_ext_track]; uint8_t timing_mid = active_track.get_timing_mid(); @@ -373,7 +416,7 @@ void SeqExtStepPage::draw_pianoroll() { if (note_start < fov_offset + fov_length) { oled_display.drawRect(note_fov_start + draw_x, proj_y, - pattern_end_fov_x - note_fov_start, 1, + pattern_end_fov_x - note_fov_start, 1, WHITE); } @@ -383,8 +426,8 @@ void SeqExtStepPage::draw_pianoroll() { } else { // Standard note. - oled_display.drawRect(note_fov_start + draw_x, proj_y, - note_fov_end - note_fov_start, 1, WHITE); + draw_note(note_fov_start + draw_x, proj_y, + note_fov_end - note_fov_start); } } // Draw notes @@ -392,22 +435,19 @@ void SeqExtStepPage::draw_pianoroll() { if (note_end < note_start) { // Wrap around note if (note_start < fov_offset + fov_length) { - oled_display.drawRect(note_fov_start + draw_x, + draw_note(note_fov_start + draw_x, draw_y + note_fov_y, - pattern_end_fov_x - note_fov_start, - (fov_h / fov_notes), WHITE); + pattern_end_fov_x - note_fov_start); } if (note_end > fov_offset) { - oled_display.drawRect(draw_x, draw_y + note_fov_y, note_fov_end, - (fov_h / fov_notes), WHITE); + draw_note(draw_x, draw_y + note_fov_y, note_fov_end); } } else { // Standard note. - oled_display.drawRect(note_fov_start + draw_x, draw_y + note_fov_y, - note_fov_end - note_fov_start, - (fov_h / fov_notes), WHITE); + draw_note(note_fov_start + draw_x, draw_y + note_fov_y, + note_fov_end - note_fov_start); } } } @@ -449,9 +489,6 @@ void SeqExtStepPage::draw_viewport_minimap() { oled_display.drawPixel(pidx_x0 + 1 + p, pidx_y + 1, INVERT); } -void SeqExtStepPage::draw_note(uint8_t note_val, uint16_t note_start, - uint16_t note_end) {} - void SeqExtStepPage::pos_cur_x(int16_t diff) { uint8_t w = cur_w; if (pianoroll_mode >= 1) { @@ -675,7 +712,6 @@ void SeqExtStepPage::display() { draw_viewport_minimap(); draw_grid(); - draw_seq_pos(); mcl_gui.put_value_at(cur_x/timing_mid + 1,info1); if (pianoroll_mode == 0) { @@ -695,6 +731,7 @@ void SeqExtStepPage::display() { mcl_gui.put_value_at(lock_cur_y, info1); draw_lockeditor(); } + draw_seq_pos(); SeqPage::display(); // Draw vertical keyboard @@ -797,6 +834,7 @@ bool SeqExtStepPage::handleEvent(gui_event_t *event) { int w = timing_mid; if (trig_interface.is_key_down(MDX_KEY_FUNC)) { inc = 4; + if (pianoroll_mode > 0) { inc = 8; } w = w * 2; } diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.h b/avr/cores/megacommand/MCL/SeqExtStepPage.h index e09ae33b6..67147cb36 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.h +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.h @@ -62,7 +62,7 @@ class SeqExtStepPage : public SeqPage { void draw_thick_line(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t color = WHITE); - void draw_note(uint8_t note_val, uint16_t note_start, uint16_t note_end); + void draw_note(uint8_t x, uint8_t y, uint8_t w); void draw_pianoroll(); void draw_lockeditor(); void draw_viewport_minimap(); From 1f2a8e9b96660b7d1ff13df40fb3034e743d2fe7 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 6 May 2023 12:12:09 +1000 Subject: [PATCH 010/413] MixerPage track mutes, hold down global --- avr/cores/megacommand/MCL/MixerPage.cpp | 66 ++++++++++++++++--------- avr/cores/megacommand/MCL/MixerPage.h | 2 +- avr/cores/megacommand/MCL/SeqPage.cpp | 18 +++++++ avr/cores/megacommand/MCL/SeqPage.h | 3 ++ 4 files changed, 64 insertions(+), 25 deletions(-) diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 143810dec..f2ddd9ee1 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -1,7 +1,7 @@ #include "MCL_impl.h" #define FADER_LEN 18 -#define FADE_RATE 16 +#define FADE_RATE 0.0625 void MixerPage::set_display_mode(uint8_t param) { if (display_mode != param) { @@ -10,7 +10,8 @@ void MixerPage::set_display_mode(uint8_t param) { } } -static void oled_draw_routing() { +static void oled_draw_mutes() { + for (int i = 0; i < 16; ++i) { // draw routing if (note_interface.is_note(i)) { @@ -18,7 +19,7 @@ static void oled_draw_routing() { oled_display.fillRect(0 + i * 8, 2, 6, 6, WHITE); } - else if (mcl_cfg.routing[i] == 6) { + else if (mcl_seq.md_tracks[i].mute_state == SEQ_MUTE_OFF) { oled_display.fillRect(0 + i * 8, 2, 6, 6, BLACK); oled_display.drawRect(0 + i * 8, 2, 6, 6, WHITE); @@ -54,10 +55,12 @@ void MixerPage::init() { bool switch_tracks = false; midi_events.setup_callbacks(); oled_display.clearDisplay(); - oled_draw_routing(); + MD.set_trigleds(0, TRIGLED_OVERLAY); + oled_draw_mutes(); set_display_mode(MODEL_LEVEL); first_track = 255; redraw_mask = -1; + show_mixer_menu = 0; } void MixerPage::cleanup() { @@ -73,7 +76,8 @@ void MixerPage::set_level(int curtrack, int value) { // in_sysex = 0; } -void MixerPage::loop() {} +void MixerPage::loop() { +} void MixerPage::draw_levels() {} @@ -165,9 +169,11 @@ void MixerPage::display() { if (oled_display.textbox_enabled) { oled_display.clearDisplay(); - oled_draw_routing(); + oled_draw_mutes(); redraw_mask = -1; } + if (seq_step_page.display_md_mute_mask()) { oled_draw_mutes(); } + for (int i = 0; i < 16; i++) { if (display_mode == MODEL_LEVEL) { @@ -201,7 +207,7 @@ void MixerPage::display() { CLEAR_BIT16(redraw_mask, i); } - uint8_t dec = MidiClock.get_tempo() / FADE_RATE; + uint8_t dec = MidiClock.get_tempo() * FADE_RATE; for (uint8_t n = 0; n < 16; n++) { if (disp_levels[n] < dec) { disp_levels[n] = 0; @@ -229,11 +235,16 @@ bool MixerPage::handleEvent(gui_event_t *event) { return false; } - trig_interface.send_md_leds(TRIGLED_OVERLAY); + if (!show_mixer_menu) { trig_interface.send_md_leds(TRIGLED_OVERLAY); } if (event->mask == EVENT_BUTTON_PRESSED) { if (note_interface.is_note(track)) { - if (first_track == 255) { + if (show_mixer_menu) { + mcl_seq.md_tracks[track].mute_state = !mcl_seq.md_tracks[track].mute_state; + MD.muteTrack(track, mcl_seq.md_tracks[track].mute_state); + oled_draw_mutes(); + } + else if (first_track == 255) { first_track = track; MD.setStatus(0x22, track); } @@ -253,7 +264,7 @@ bool MixerPage::handleEvent(gui_event_t *event) { route_page.toggle_routes_batch(true); } note_interface.init_notes(); - oled_draw_routing(); + oled_draw_mutes(); } return true; } @@ -277,20 +288,6 @@ bool MixerPage::handleEvent(gui_event_t *event) { GUI.setPage(&grid_page); return true; } - - goto reset_params; - } - } - } - } - if (EVENT_PRESSED(event, Buttons.BUTTON2)) { - trig_interface.on(); - GUI.setPage(&page_select_page); - return true; - } - - if (EVENT_PRESSED(event, Buttons.BUTTON3)) { - reset_params: for (uint8_t i = 0; i < 16; i++) { if (note_interface.is_note_on(i)) { for (uint8_t c = 0; c < 24; c++) { @@ -299,6 +296,27 @@ bool MixerPage::handleEvent(gui_event_t *event) { mcl_seq.md_tracks[i].update_params(); } } + + } + } + } + } + if (EVENT_PRESSED(event, Buttons.BUTTON3) && !BUTTON_DOWN(Buttons.BUTTON4)) { + seq_step_page.md_mute_mask = 0; + show_mixer_menu = true; + return true; + } + + + if (EVENT_RELEASED(event, Buttons.BUTTON3)) { + show_mixer_menu = false; + MD.set_trigleds(0, TRIGLED_EXCLUSIVE); + return true; + } + + if (EVENT_PRESSED(event, Buttons.BUTTON2)) { + trig_interface.on(); + GUI.setPage(&page_select_page); return true; } diff --git a/avr/cores/megacommand/MCL/MixerPage.h b/avr/cores/megacommand/MCL/MixerPage.h index b27a10df3..d2bae897d 100644 --- a/avr/cores/megacommand/MCL/MixerPage.h +++ b/avr/cores/megacommand/MCL/MixerPage.h @@ -31,10 +31,10 @@ class MixerPage : public LightPage { uint8_t level_pressmode = 0; int8_t disp_levels[16]; - char info_line2[9]; uint8_t display_mode; uint8_t first_track; uint16_t redraw_mask; + bool show_mixer_menu; MixerPage(Encoder *e1 = NULL, Encoder *e2 = NULL, Encoder *e3 = NULL, Encoder *e4 = NULL) : LightPage(e1, e2, e3, e4) { diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index 0877781f8..f2fb1b59b 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -26,6 +26,7 @@ bool SeqPage::show_seq_menu = false; bool SeqPage::show_step_menu = false; bool SeqPage::toggle_device = true; +uint16_t SeqPage::md_mute_mask = 0; uint16_t SeqPage::ext_mute_mask = 0; uint8_t SeqPage::step_select = 255; @@ -248,6 +249,23 @@ void SeqPage::select_track(MidiDevice *device, uint8_t track, bool send) { } } +bool SeqPage::display_md_mute_mask() { + uint16_t last_mute_mask = md_mute_mask; + md_mute_mask = 0; + for (uint8_t n = 0; n < mcl_seq.num_md_tracks; n++) { + if (mcl_seq.md_tracks[n].mute_state == SEQ_MUTE_OFF) { + SET_BIT16(md_mute_mask, n); + } + } + if (last_mute_mask != md_mute_mask) { + MD.set_trigleds(md_mute_mask, TRIGLED_EXCLUSIVE); + return true; + } + return false; +} + + + void SeqPage::display_ext_mute_mask() { uint16_t last_mute_mask = ext_mute_mask; ext_mute_mask = 0; diff --git a/avr/cores/megacommand/MCL/SeqPage.h b/avr/cores/megacommand/MCL/SeqPage.h index 978c5a748..b9d5e87de 100644 --- a/avr/cores/megacommand/MCL/SeqPage.h +++ b/avr/cores/megacommand/MCL/SeqPage.h @@ -102,6 +102,8 @@ class SeqPage : public LightPage { static uint32_t last_md_model; static bool recording; + + static uint16_t md_mute_mask; static uint16_t ext_mute_mask; bool display_page_index = true; @@ -149,6 +151,7 @@ class SeqPage : public LightPage { void params_reset(); + bool display_md_mute_mask(); void display_ext_mute_mask(); virtual bool handleEvent(gui_event_t *event); From ac60f8bfd7ac8af733bca4a9d4ec9c3cc6609611 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 7 May 2023 13:20:56 +1000 Subject: [PATCH 011/413] Add recordable step mutes to Mixer Page. Hold global + song --- avr/cores/megacommand/MCL/MDSeqTrack.cpp | 5 +++ avr/cores/megacommand/MCL/MDSeqTrack.h | 5 +++ avr/cores/megacommand/MCL/MixerPage.cpp | 50 +++++++++++++++++++----- avr/cores/megacommand/MCL/MixerPage.h | 1 + 4 files changed, 52 insertions(+), 9 deletions(-) diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.cpp b/avr/cores/megacommand/MCL/MDSeqTrack.cpp index 3b0867139..d69e3e3cc 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/MDSeqTrack.cpp @@ -121,6 +121,11 @@ void MDSeqTrack::seq(MidiUartParent *uart_) { } } + if (record_mutes) { + if (mute_state == SEQ_MUTE_ON) { SET_BIT64(oneshot_mask, step_count); } + if (mute_state == SEQ_MUTE_OFF) { CLEAR_BIT64(oneshot_mask, step_count); } + } + if ((mute_state == SEQ_MUTE_OFF) && (ignore_step != step_count)) { diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.h b/avr/cores/megacommand/MCL/MDSeqTrack.h index 5cc778faf..2ee89069a 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.h +++ b/avr/cores/megacommand/MCL/MDSeqTrack.h @@ -18,9 +18,13 @@ class MDTrack; class MDSeqTrack : public MDSeqTrackData, public SeqSlideTrack { public: + uint64_t oneshot_mask; + uint8_t locks_params_orig[NUM_LOCKS]; + bool record_mutes; + static uint16_t sync_cursor; static uint16_t md_trig_mask; static uint16_t load_machine_cache; @@ -29,6 +33,7 @@ class MDSeqTrack : public MDSeqTrackData, public SeqSlideTrack { ALWAYS_INLINE() void reset() { SeqTrack::reset(); oneshot_mask = 0; + record_mutes = false; } void get_mask(uint64_t *_pmask, uint8_t mask_type) const; diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index f2ddd9ee1..7bbaeb7ea 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -20,14 +20,11 @@ static void oled_draw_mutes() { } else if (mcl_seq.md_tracks[i].mute_state == SEQ_MUTE_OFF) { - oled_display.fillRect(0 + i * 8, 2, 6, 6, BLACK); oled_display.drawRect(0 + i * 8, 2, 6, 6, WHITE); - } else { - oled_display.fillRect(0 + i * 8, 2, 6, 6, BLACK); oled_display.drawLine(+i * 8, 5, 5 + (i * 8), 5, WHITE); } @@ -77,7 +74,7 @@ void MixerPage::set_level(int curtrack, int value) { } void MixerPage::loop() { -} + } void MixerPage::draw_levels() {} @@ -172,7 +169,7 @@ void MixerPage::display() { oled_draw_mutes(); redraw_mask = -1; } - if (seq_step_page.display_md_mute_mask()) { oled_draw_mutes(); } + if (show_mixer_menu && seq_step_page.display_md_mute_mask()) { oled_draw_mutes(); } for (int i = 0; i < 16; i++) { @@ -223,6 +220,21 @@ void MixerPage::display() { oled_display.setFont(oldfont); } +void MixerPage::disable_record_mutes() { + for (uint8_t n = 0; n < 16; n++) { + if (mcl_seq.md_tracks[n].record_mutes) { + mcl_seq.md_tracks[n].record_mutes = false; + /* + if (mcl_seq.md_tracks[n].mute_state == SEQ_MUTE_ON) { + mcl_seq.md_tracks[n].mute_state = SEQ_MUTE_OFF; + MD.muteTrack(n, mcl_seq.md_tracks[n].mute_state); + } + */ + } + } + if (!seq_step_page.recording) { clearLed2(); } +} + bool MixerPage::handleEvent(gui_event_t *event) { if (note_interface.is_event(event)) { uint8_t mask = event->mask; @@ -240,9 +252,14 @@ bool MixerPage::handleEvent(gui_event_t *event) { if (event->mask == EVENT_BUTTON_PRESSED) { if (note_interface.is_note(track)) { if (show_mixer_menu) { - mcl_seq.md_tracks[track].mute_state = !mcl_seq.md_tracks[track].mute_state; - MD.muteTrack(track, mcl_seq.md_tracks[track].mute_state); - oled_draw_mutes(); + + mcl_seq.md_tracks[track].mute_state = !mcl_seq.md_tracks[track].mute_state; + MD.muteTrack(track, mcl_seq.md_tracks[track].mute_state); + + if (trig_interface.is_key_down(MDX_KEY_PATSONGKIT)) { + mcl_seq.md_tracks[track].record_mutes = true; + } + oled_draw_mutes(); } else if (first_track == 255) { first_track = track; @@ -283,8 +300,13 @@ bool MixerPage::handleEvent(gui_event_t *event) { uint8_t key = event->source - 64; if (event->mask == EVENT_BUTTON_PRESSED) { switch (key) { + case MDX_KEY_PATSONGKIT: { + setLed2(); + break; + } case MDX_KEY_NO: { if (note_interface.notes_count_on() == 0) { + disable_record_mutes(); GUI.setPage(&grid_page); return true; } @@ -296,10 +318,18 @@ bool MixerPage::handleEvent(gui_event_t *event) { mcl_seq.md_tracks[i].update_params(); } } - } } } + if (event->mask == EVENT_BUTTON_RELEASED) { + switch (key) { + case MDX_KEY_PATSONGKIT: { + disable_record_mutes(); + MD.set_trigleds(0, TRIGLED_OVERLAY); + break; + } + } + } } if (EVENT_PRESSED(event, Buttons.BUTTON3) && !BUTTON_DOWN(Buttons.BUTTON4)) { seq_step_page.md_mute_mask = 0; @@ -310,12 +340,14 @@ bool MixerPage::handleEvent(gui_event_t *event) { if (EVENT_RELEASED(event, Buttons.BUTTON3)) { show_mixer_menu = false; + disable_record_mutes(); MD.set_trigleds(0, TRIGLED_EXCLUSIVE); return true; } if (EVENT_PRESSED(event, Buttons.BUTTON2)) { trig_interface.on(); + disable_record_mutes(); GUI.setPage(&page_select_page); return true; } diff --git a/avr/cores/megacommand/MCL/MixerPage.h b/avr/cores/megacommand/MCL/MixerPage.h index d2bae897d..6756c3fc5 100644 --- a/avr/cores/megacommand/MCL/MixerPage.h +++ b/avr/cores/megacommand/MCL/MixerPage.h @@ -44,6 +44,7 @@ class MixerPage : public LightPage { void draw_levels(); void set_level(int curtrack, int value); void set_display_mode(uint8_t param); + void disable_record_mutes(); virtual bool handleEvent(gui_event_t *event); virtual void display(); From df52719dc92dfe633f813118649bb6167107f533 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 7 May 2023 18:55:48 +1000 Subject: [PATCH 012/413] pianoroll projection regression --- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index 1a5b72f58..3d41d7c77 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -426,8 +426,8 @@ void SeqExtStepPage::draw_pianoroll() { } else { // Standard note. - draw_note(note_fov_start + draw_x, proj_y, - note_fov_end - note_fov_start); + oled_display.drawRect(note_fov_start + draw_x, proj_y, + note_fov_end - note_fov_start, 1, WHITE); } } // Draw notes From c4530daa94d4c7253e699a5d59b19a0fd6dc469e Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 7 May 2023 20:53:52 +1000 Subject: [PATCH 013/413] check in --- avr/cores/megacommand/MCL/MixerPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 7bbaeb7ea..b5fc5f82a 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -169,7 +169,7 @@ void MixerPage::display() { oled_draw_mutes(); redraw_mask = -1; } - if (show_mixer_menu && seq_step_page.display_md_mute_mask()) { oled_draw_mutes(); } + if (seq_step_page.display_md_mute_mask()) { oled_draw_mutes(); } for (int i = 0; i < 16; i++) { From 5c7ce3394096d520e24f59526ef0b47a800c7523 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 7 May 2023 20:54:05 +1000 Subject: [PATCH 014/413] Bug: pattern length change was not always reflected on MD --- avr/cores/megacommand/MCL/SeqPage.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index f2fb1b59b..1d0843add 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -667,6 +667,9 @@ void pattern_len_handler(EncoderParent *enc) { mcl_seq.md_tracks[last_md_track].set_length(enc_->cur); } } + auto &active_track = mcl_seq.md_tracks[last_md_track]; + MD.sync_seqtrack(active_track.length, active_track.speed, + active_track.step_count); } else { if (BUTTON_DOWN(Buttons.BUTTON4)) { for (uint8_t c = 0; c < NUM_EXT_TRACKS; c++) { From 3b0b8a76de9738808227baba255f25c151627c22 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 7 May 2023 22:09:13 +1000 Subject: [PATCH 015/413] track expansion --- avr/cores/megacommand/MCL/MDSeqTrack.cpp | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.cpp b/avr/cores/megacommand/MCL/MDSeqTrack.cpp index d69e3e3cc..1127a1fa9 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/MDSeqTrack.cpp @@ -27,23 +27,21 @@ void MDSeqTrack::set_length(uint8_t len, bool expand) { step_count = step; CLEAR_LOCK(); - if (expand && old_length <= 16 && length > 16) { - for (uint8_t n = 16; n < length; n++) { + if (expand && old_length <= 16 && length >= 16) { + for (uint8_t n = old_length; n < length; n++) { if ((*(int *)&(steps[n])) != 0) { expand = false; - break; + return; } } - if (expand) { MDSeqStep empty_step; memset(&empty_step, 0, sizeof(empty_step)); - for (uint8_t y = 1; y < 4; y++) { - for (uint8_t n = 0; n < 16; n++) { - copy_step(n, &empty_step); - paste_step(n + y * 16, &empty_step); - } + uint8_t a = 0; + for (uint8_t n = old_length; n < 64; n++) { + copy_step(a++, &empty_step); + paste_step(n, &empty_step); + if (a == old_length) { a = 0; } } - } } } From 78dbbd8bbc731f74ae5982c77dcb45621dba3c1d Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 8 May 2023 15:55:21 +1000 Subject: [PATCH 016/413] remove toggle routing from Mixer --- avr/cores/megacommand/MCL/MixerPage.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index b5fc5f82a..cfbeeba56 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -273,13 +273,6 @@ bool MixerPage::handleEvent(gui_event_t *event) { SET_BIT16(redraw_mask, track); if (note_interface.notes_count_on() == 0) { first_track = 255; - // encoder_level_handle(mixer_page.encoders[0]); - if (BUTTON_DOWN(Buttons.BUTTON4)) { - route_page.toggle_routes_batch(); - } - if (BUTTON_DOWN(Buttons.BUTTON1)) { - route_page.toggle_routes_batch(true); - } note_interface.init_notes(); oled_draw_mutes(); } From bc73191001892e3549fa5dfe5bafd7f667f376e6 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 8 May 2023 18:00:07 +1000 Subject: [PATCH 017/413] Mixer page now has an ext track mode --- avr/cores/megacommand/A4/A4.cpp | 6 +- avr/cores/megacommand/A4/A4.h | 2 +- avr/cores/megacommand/Elektron/Elektron.h | 1 + avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 1 + avr/cores/megacommand/MCL/MDSeqTrack.h | 2 - avr/cores/megacommand/MCL/MixerPage.cpp | 176 ++++++++++++------- avr/cores/megacommand/MCL/MixerPage.h | 6 + avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 4 +- avr/cores/megacommand/MCL/SeqExtStepPage.h | 2 - avr/cores/megacommand/MCL/SeqPage.cpp | 46 +++-- avr/cores/megacommand/MCL/SeqPage.h | 6 +- avr/cores/megacommand/MCL/SeqPtcPage.cpp | 4 +- avr/cores/megacommand/MCL/SeqTrack.h | 4 +- avr/cores/megacommand/MD/MD.cpp | 8 +- avr/cores/megacommand/MD/MD.h | 2 +- avr/cores/megacommand/MNM/MNM.cpp | 27 +-- avr/cores/megacommand/MNM/MNM.h | 6 +- 17 files changed, 176 insertions(+), 127 deletions(-) diff --git a/avr/cores/megacommand/A4/A4.cpp b/avr/cores/megacommand/A4/A4.cpp index a40c90f55..ee8ec3d7c 100644 --- a/avr/cores/megacommand/A4/A4.cpp +++ b/avr/cores/megacommand/A4/A4.cpp @@ -220,9 +220,9 @@ bool A4Class::getBlockingSettingsX(uint8_t settings, uint16_t timeout) { return connected; } - -void A4Class::muteTrack(uint8_t track, bool mute) { - MidiUart2.sendCC(track, 94, mute ? 1 : 0); +void A4Class::muteTrack(uint8_t track, bool mute = true, MidiUartParent *uart_ = nullptr) { + if (uart_ == nullptr) { uart_ = uart; } + uart->sendCC(track, 94, mute ? 1 : 0); } void A4Class::setLevel(uint8_t track, uint8_t value) { diff --git a/avr/cores/megacommand/A4/A4.h b/avr/cores/megacommand/A4/A4.h index 8faf64763..1d5161631 100644 --- a/avr/cores/megacommand/A4/A4.h +++ b/avr/cores/megacommand/A4/A4.h @@ -89,7 +89,7 @@ class A4Class : public ElektronDevice { bool getBlockingSoundX(uint8_t pattern, uint16_t timeout = 3000); bool getBlockingSettingsX(uint8_t global, uint16_t timeout = 3000); - void muteTrack(uint8_t track, bool mute = true); + void muteTrack(uint8_t track, bool mute = true, MidiUartParent *uart_ = nullptr); void unmuteTrack(uint8_t track) { muteTrack(track, false); } void setLevel(uint8_t track, uint8_t value); diff --git a/avr/cores/megacommand/Elektron/Elektron.h b/avr/cores/megacommand/Elektron/Elektron.h index 034b7e875..291f499aa 100644 --- a/avr/cores/megacommand/Elektron/Elektron.h +++ b/avr/cores/megacommand/Elektron/Elektron.h @@ -217,6 +217,7 @@ class MidiDevice { virtual void disconnect() { cleanup(); connected = false; } virtual bool probe() = 0; virtual uint8_t get_mute_cc() { return 255; } + virtual void muteTrack(uint8_t track, bool mute = true, MidiUartParent *uart_ = nullptr) {}; // 34x42 bitmap icon of the device virtual uint8_t *icon() { return nullptr; } }; diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index 656756582..49e46fd3a 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -676,6 +676,7 @@ void ExtSeqTrack::note_on(uint8_t note, uint8_t velocity, if (uart_ == nullptr) { uart_ = uart; } + mixer_page.ext_disp_levels[track_number] = 127; uart_->sendNoteOn(channel, note, velocity); SET_BIT128_P(note_buffer, note); } diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.h b/avr/cores/megacommand/MCL/MDSeqTrack.h index 2ee89069a..b9d6ba42c 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.h +++ b/avr/cores/megacommand/MCL/MDSeqTrack.h @@ -23,8 +23,6 @@ class MDSeqTrack : public MDSeqTrackData, public SeqSlideTrack { uint8_t locks_params_orig[NUM_LOCKS]; - bool record_mutes; - static uint16_t sync_cursor; static uint16_t md_trig_mask; static uint16_t load_machine_cache; diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index cfbeeba56..3fafd6174 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -10,23 +10,29 @@ void MixerPage::set_display_mode(uint8_t param) { } } -static void oled_draw_mutes() { +void MixerPage::oled_draw_mutes() { - for (int i = 0; i < 16; ++i) { + SeqTrack *seq_tracks = (SeqTrack *) mcl_seq.md_tracks; + uint8_t len = mcl_seq.num_md_tracks; + + if (midi_device != &MD) { + seq_tracks = (SeqTrack *) mcl_seq.ext_tracks; + len = mcl_seq.num_ext_tracks; + } + + for (uint8_t i = 0; i < len; ++i) { // draw routing if (note_interface.is_note(i)) { - oled_display.fillRect(0 + i * 8, 2, 6, 6, WHITE); } - else if (mcl_seq.md_tracks[i].mute_state == SEQ_MUTE_OFF) { + else if (seq_tracks[i].mute_state == SEQ_MUTE_OFF) { oled_display.fillRect(0 + i * 8, 2, 6, 6, BLACK); oled_display.drawRect(0 + i * 8, 2, 6, 6, WHITE); } - else { oled_display.fillRect(0 + i * 8, 2, 6, 6, BLACK); - oled_display.drawLine(+i * 8, 5, 5 + (i * 8), 5, WHITE); + oled_display.drawLine(i * 8, 5, 5 + (i * 8), 5, WHITE); } } } @@ -36,10 +42,6 @@ void MixerPage::setup() { encoders[1]->handler = encoder_filtf_handle; encoders[2]->handler = encoder_filtw_handle; encoders[3]->handler = encoder_filtq_handle; - if (route_page.encoders[0]->cur == 0) { - route_page.encoders[0]->cur = 2; - } - oled_display.clearDisplay(); } void MixerPage::init() { @@ -73,13 +75,16 @@ void MixerPage::set_level(int curtrack, int value) { // in_sysex = 0; } -void MixerPage::loop() { - } +void MixerPage::loop() {} void MixerPage::draw_levels() {} void encoder_level_handle(EncoderParent *enc) { + if (mixer_page.midi_device != &MD) { + return; + } + mixer_page.set_display_mode(MODEL_LEVEL); int dir = enc->getValue() - enc->old; @@ -127,6 +132,10 @@ void encoder_lastparam_handle(EncoderParent *enc) { void MixerPage::adjust_param(EncoderParent *enc, uint8_t param) { + if (midi_device != &MD) { + return; + } + set_display_mode(param); int dir = enc->getValue() - enc->old; @@ -169,18 +178,33 @@ void MixerPage::display() { oled_draw_mutes(); redraw_mask = -1; } - if (seq_step_page.display_md_mute_mask()) { oled_draw_mutes(); } + SeqTrack *seq_tracks = (SeqTrack *)&mcl_seq.md_tracks; + uint8_t len = mcl_seq.num_md_tracks; + uint8_t *levels = disp_levels; + if (seq_step_page.display_mute_mask(midi_device)) { + oled_draw_mutes(); + } + if (midi_device != &MD) { + seq_tracks = (SeqTrack *)&mcl_seq.ext_tracks; + len = mcl_seq.num_ext_tracks; + levels = ext_disp_levels; + } + uint8_t dec = MidiClock.get_tempo() * FADE_RATE; - for (int i = 0; i < 16; i++) { + for (int i = 0; i < len; i++) { - if (display_mode == MODEL_LEVEL) { - fader_level = MD.kit.levels[i]; + if (midi_device == &MD) { + if (display_mode == MODEL_LEVEL) { + fader_level = MD.kit.levels[i]; + } else { + fader_level = MD.kit.params[i][display_mode]; + } } else { - fader_level = MD.kit.params[i][display_mode]; + fader_level = 127; } fader_level = ((fader_level * 0.00787) * FADER_LEN) + 0; - meter_level = ((disp_levels[i] * 0.00787) * FADER_LEN) + 0; + meter_level = ((levels[i] * 0.00787) * FADER_LEN) + 0; meter_level = min(fader_level, meter_level); if (IS_BIT_SET16(redraw_mask, i)) { @@ -201,17 +225,16 @@ void MixerPage::display() { meter_level + 1, WHITE); } fader_x += 8; + CLEAR_BIT16(redraw_mask, i); - } - uint8_t dec = MidiClock.get_tempo() * FADE_RATE; - for (uint8_t n = 0; n < 16; n++) { - if (disp_levels[n] < dec) { - disp_levels[n] = 0; + if (levels[i] < dec) { + levels[i] = 0; } else { - disp_levels[n] -= dec; + levels[i] -= dec; } } + if (!redraw_mask) { oled_display.display(); } else { @@ -221,18 +244,19 @@ void MixerPage::display() { } void MixerPage::disable_record_mutes() { - for (uint8_t n = 0; n < 16; n++) { - if (mcl_seq.md_tracks[n].record_mutes) { - mcl_seq.md_tracks[n].record_mutes = false; - /* - if (mcl_seq.md_tracks[n].mute_state == SEQ_MUTE_ON) { - mcl_seq.md_tracks[n].mute_state = SEQ_MUTE_OFF; - MD.muteTrack(n, mcl_seq.md_tracks[n].mute_state); - } - */ - } - } - if (!seq_step_page.recording) { clearLed2(); } + for (uint8_t n = 0; n < mcl_seq.num_md_tracks; n++) { + if (n < mcl_seq.num_ext_tracks) { + if (mcl_seq.ext_tracks[n].record_mutes) { + mcl_seq.ext_tracks[n].record_mutes = false; + } + } + if (mcl_seq.md_tracks[n].record_mutes) { + mcl_seq.md_tracks[n].record_mutes = false; + } + } + if (!seq_step_page.recording) { + clearLed2(); + } } bool MixerPage::handleEvent(gui_event_t *event) { @@ -243,25 +267,34 @@ bool MixerPage::handleEvent(gui_event_t *event) { uint8_t track = event->source - 128; - if (track > 16) { + SeqTrack *seq_tracks = (SeqTrack*) mcl_seq.md_tracks; + uint8_t len = mcl_seq.num_md_tracks; + if (midi_device != &MD) { + seq_tracks = (SeqTrack*) mcl_seq.ext_tracks; + len = mcl_seq.num_ext_tracks; + } + + if (track > len) { return false; } - if (!show_mixer_menu) { trig_interface.send_md_leds(TRIGLED_OVERLAY); } + if (!show_mixer_menu) { + trig_interface.send_md_leds(TRIGLED_OVERLAY); + } if (event->mask == EVENT_BUTTON_PRESSED) { if (note_interface.is_note(track)) { if (show_mixer_menu) { - mcl_seq.md_tracks[track].mute_state = !mcl_seq.md_tracks[track].mute_state; - MD.muteTrack(track, mcl_seq.md_tracks[track].mute_state); + seq_tracks[track].mute_state = !seq_tracks[track].mute_state; - if (trig_interface.is_key_down(MDX_KEY_PATSONGKIT)) { - mcl_seq.md_tracks[track].record_mutes = true; - } - oled_draw_mutes(); - } - else if (first_track == 255) { + midi_device->muteTrack(track, seq_tracks[track].mute_state); + + if (trig_interface.is_key_down(MDX_KEY_PATSONGKIT)) { + seq_tracks[track].record_mutes = true; + } + oled_draw_mutes(); + } else if (first_track == 255) { first_track = track; MD.setStatus(0x22, track); } @@ -303,39 +336,52 @@ bool MixerPage::handleEvent(gui_event_t *event) { GUI.setPage(&grid_page); return true; } - for (uint8_t i = 0; i < 16; i++) { - if (note_interface.is_note_on(i)) { - for (uint8_t c = 0; c < 24; c++) { - MD.restore_kit_param(i, c); + if (midi_device == &MD) { + for (uint8_t i = 0; i < 16; i++) { + if (note_interface.is_note_on(i)) { + for (uint8_t c = 0; c < 24; c++) { + MD.restore_kit_param(i, c); + } + mcl_seq.md_tracks[i].update_params(); + } + } } - mcl_seq.md_tracks[i].update_params(); + break; } - } + case MDX_KEY_YES: { + if (midi_device != &MD) { + midi_device = &MD; + } else { + midi_device = midi_active_peering.get_device(UART2_PORT); + } + redraw_mask = -1; + oled_display.clearDisplay(); + oled_draw_mutes(); + break; } } } if (event->mask == EVENT_BUTTON_RELEASED) { switch (key) { - case MDX_KEY_PATSONGKIT: { - disable_record_mutes(); - MD.set_trigleds(0, TRIGLED_OVERLAY); - break; - } + case MDX_KEY_PATSONGKIT: { + disable_record_mutes(); + MD.set_trigleds(0, TRIGLED_OVERLAY); + break; + } } } } if (EVENT_PRESSED(event, Buttons.BUTTON3) && !BUTTON_DOWN(Buttons.BUTTON4)) { - seq_step_page.md_mute_mask = 0; - show_mixer_menu = true; - return true; + seq_step_page.mute_mask = 0; + show_mixer_menu = true; + return true; } - if (EVENT_RELEASED(event, Buttons.BUTTON3)) { - show_mixer_menu = false; - disable_record_mutes(); - MD.set_trigleds(0, TRIGLED_EXCLUSIVE); - return true; + show_mixer_menu = false; + disable_record_mutes(); + MD.set_trigleds(0, TRIGLED_EXCLUSIVE); + return true; } if (EVENT_PRESSED(event, Buttons.BUTTON2)) { diff --git a/avr/cores/megacommand/MCL/MixerPage.h b/avr/cores/megacommand/MCL/MixerPage.h index 6756c3fc5..d011fc896 100644 --- a/avr/cores/megacommand/MCL/MixerPage.h +++ b/avr/cores/megacommand/MCL/MixerPage.h @@ -31,6 +31,10 @@ class MixerPage : public LightPage { uint8_t level_pressmode = 0; int8_t disp_levels[16]; + int8_t ext_disp_levels[6]; + + MidiDevice* midi_device; + uint8_t display_mode; uint8_t first_track; uint16_t redraw_mask; @@ -38,6 +42,7 @@ class MixerPage : public LightPage { MixerPage(Encoder *e1 = NULL, Encoder *e2 = NULL, Encoder *e3 = NULL, Encoder *e4 = NULL) : LightPage(e1, e2, e3, e4) { + midi_device = &MD; } void adjust_param(EncoderParent *enc, uint8_t param); @@ -45,6 +50,7 @@ class MixerPage : public LightPage { void set_level(int curtrack, int value); void set_display_mode(uint8_t param); void disable_record_mutes(); + void oled_draw_mutes(); virtual bool handleEvent(gui_event_t *event); virtual void display(); diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index 3d41d7c77..6ffb533b5 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -630,7 +630,7 @@ void SeqExtStepPage::loop() { // If pianoroll_edit mode changed. if (show_seq_menu) { - display_ext_mute_mask(); + display_mute_mask(midi_device, 8); if (last_pianoroll_mode != pianoroll_mode) { if (pianoroll_mode > 0) { @@ -984,7 +984,7 @@ bool SeqExtStepPage::handleEvent(gui_event_t *event) { } if (EVENT_PRESSED(event, Buttons.BUTTON3)) { - ext_mute_mask = 128; + mute_mask = 128; param_select_update(); } if (SeqPage::handleEvent(event)) { diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.h b/avr/cores/megacommand/MCL/SeqExtStepPage.h index 67147cb36..f0656795b 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.h +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.h @@ -73,8 +73,6 @@ class SeqExtStepPage : public SeqPage { void pos_cur_y(int16_t diff); void pos_cur_w(int16_t diff); - void display_mute_mask(); - bool is_within_fov(uint16_t x) { if ((x >= fov_offset) && (x < fov_offset + fov_length)) { return true; diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index 1d0843add..bdfaad7c3 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -26,8 +26,7 @@ bool SeqPage::show_seq_menu = false; bool SeqPage::show_step_menu = false; bool SeqPage::toggle_device = true; -uint16_t SeqPage::md_mute_mask = 0; -uint16_t SeqPage::ext_mute_mask = 0; +uint16_t SeqPage::mute_mask = 0; uint8_t SeqPage::step_select = 255; @@ -249,37 +248,34 @@ void SeqPage::select_track(MidiDevice *device, uint8_t track, bool send) { } } -bool SeqPage::display_md_mute_mask() { - uint16_t last_mute_mask = md_mute_mask; - md_mute_mask = 0; - for (uint8_t n = 0; n < mcl_seq.num_md_tracks; n++) { - if (mcl_seq.md_tracks[n].mute_state == SEQ_MUTE_OFF) { - SET_BIT16(md_mute_mask, n); - } - } - if (last_mute_mask != md_mute_mask) { - MD.set_trigleds(md_mute_mask, TRIGLED_EXCLUSIVE); - return true; - } - return false; -} +bool SeqPage::display_mute_mask(MidiDevice* device, uint8_t offset) { + uint16_t last_mute_mask = mute_mask; + mute_mask = 0; + uint8_t len = mcl_seq.num_md_tracks; + SeqTrack *seq_tracks = (SeqTrack*) mcl_seq.md_tracks; + if (device != &MD) { + len = mcl_seq.num_ext_tracks; + seq_tracks = (SeqTrack*) mcl_seq.ext_tracks; + } -void SeqPage::display_ext_mute_mask() { - uint16_t last_mute_mask = ext_mute_mask; - ext_mute_mask = 0; - for (uint8_t n = 0; n < mcl_seq.num_ext_tracks; n++) { - if (mcl_seq.ext_tracks[n].mute_state == SEQ_MUTE_OFF) { - SET_BIT16(ext_mute_mask, 8 + n); + for (uint8_t n = 0; n < len; n++) { + if (seq_tracks[n].mute_state == SEQ_MUTE_OFF) { + uint8_t d = offset + n; + if (d < 16) { + SET_BIT16(mute_mask, d); + } } } - SET_BIT16(ext_mute_mask, last_ext_track); - if (last_mute_mask != ext_mute_mask) { - MD.set_trigleds(ext_mute_mask, TRIGLED_EXCLUSIVE); + if (last_mute_mask != mute_mask) { + MD.set_trigleds(mute_mask, TRIGLED_EXCLUSIVE); + return true; } + return false; } + bool SeqPage::handleEvent(gui_event_t *event) { if (note_interface.is_event(event)) { uint8_t port = event->port; diff --git a/avr/cores/megacommand/MCL/SeqPage.h b/avr/cores/megacommand/MCL/SeqPage.h index b9d5e87de..8b9ba7528 100644 --- a/avr/cores/megacommand/MCL/SeqPage.h +++ b/avr/cores/megacommand/MCL/SeqPage.h @@ -103,8 +103,7 @@ class SeqPage : public LightPage { static bool recording; - static uint16_t md_mute_mask; - static uint16_t ext_mute_mask; + static uint16_t mute_mask; bool display_page_index = true; char info1[8] = { '\0' }; @@ -151,8 +150,7 @@ class SeqPage : public LightPage { void params_reset(); - bool display_md_mute_mask(); - void display_ext_mute_mask(); + bool display_mute_mask(MidiDevice *device, uint8_t offset = 0); virtual bool handleEvent(gui_event_t *event); virtual void loop(); diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.cpp b/avr/cores/megacommand/MCL/SeqPtcPage.cpp index 91ec6d319..eac32eefa 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPtcPage.cpp @@ -253,7 +253,7 @@ void SeqPtcPage::display() { mcl_gui.draw_keyboard(32, 23, 6, 9, NUM_KEYS, mask); SeqPage::display(); if (show_seq_menu) { - display_ext_mute_mask(); + display_mute_mask(midi_active_peering.get_device(UART2_PORT), 8); } oled_display.display(); oled_display.setFont(oldfont); @@ -605,7 +605,7 @@ bool SeqPtcPage::handleEvent(gui_event_t *event) { } } if (EVENT_PRESSED(event, Buttons.BUTTON3)) { - ext_mute_mask = 128; + mute_mask = 128; } if (SeqPage::handleEvent(event)) { return true; diff --git a/avr/cores/megacommand/MCL/SeqTrack.h b/avr/cores/megacommand/MCL/SeqTrack.h index 662ea0312..46dfffe20 100644 --- a/avr/cores/megacommand/MCL/SeqTrack.h +++ b/avr/cores/megacommand/MCL/SeqTrack.h @@ -59,6 +59,8 @@ class SeqTrackBase { MidiUartParent *uart = &MidiUart; uint8_t mute_state = SEQ_MUTE_OFF; + bool record_mutes; + uint8_t length; uint8_t speed; uint8_t track_number; @@ -66,7 +68,7 @@ class SeqTrackBase { uint8_t step_count; uint8_t mod12_counter; - SeqTrackBase() { active = EMPTY_TRACK_TYPE; } + SeqTrackBase() { active = EMPTY_TRACK_TYPE; record_mutes = false; } ALWAYS_INLINE() void step_count_inc() { if (step_count == length - 1) { diff --git a/avr/cores/megacommand/MD/MD.cpp b/avr/cores/megacommand/MD/MD.cpp index 8d2f9ab01..f4759dbbb 100644 --- a/avr/cores/megacommand/MD/MD.cpp +++ b/avr/cores/megacommand/MD/MD.cpp @@ -772,14 +772,16 @@ uint8_t MDClass::sendMachine(uint8_t track, MDMachine *machine, bool send_level, return bytes; } -void MDClass::muteTrack(uint8_t track, bool mute) { +void MDClass::muteTrack(uint8_t track, bool mute, MidiUartParent *uart_) { if (global.baseChannel == 127) return; - + if (uart_ == nullptr) { + uart_ = uart; + } uint8_t channel = track >> 2; uint8_t b = track & 3; uint8_t cc = 12 + b; - uart->sendCC(channel + global.baseChannel, cc, mute ? 1 : 0); + uart_->sendCC(channel + global.baseChannel, cc, mute ? 1 : 0); } void MDClass::setGlobal(uint8_t id) { diff --git a/avr/cores/megacommand/MD/MD.h b/avr/cores/megacommand/MD/MD.h index d32be5ed4..09bde6e58 100644 --- a/avr/cores/megacommand/MD/MD.h +++ b/avr/cores/megacommand/MD/MD.h @@ -276,7 +276,7 @@ class MDClass : public ElektronDevice { * Mute/unmute the given track (0 to 15) by sending a CC * message. This uses the global channel settings. **/ - void muteTrack(uint8_t track, bool mute = true); + void muteTrack(uint8_t track, bool mute = true, MidiUartParent *uart_ = nullptr); /** Unmute the given track. **/ void unmuteTrack(uint8_t track) { muteTrack(track, false); } diff --git a/avr/cores/megacommand/MNM/MNM.cpp b/avr/cores/megacommand/MNM/MNM.cpp index 2e982b6dd..cfc954825 100644 --- a/avr/cores/megacommand/MNM/MNM.cpp +++ b/avr/cores/megacommand/MNM/MNM.cpp @@ -31,7 +31,7 @@ const ElektronSysexProtocol mnm_protocol = { MNMClass::MNMClass() : ElektronDevice(&Midi2, "MM", DEVICE_MNM, mnm_protocol) { global.baseChannel = 0; - midiuart = &MidiUart2; + uart = &MidiUart2; } void MNMClass::init_grid_devices() { @@ -124,48 +124,49 @@ void MNMClass::requestKit(uint8_t kit) { void MNMClass::triggerTrack(uint8_t track, bool amp, bool lfo, bool filter) { - midiuart->sendNRPN(global.baseChannel, (uint16_t)(0x7F << 7), + uart->sendNRPN(global.baseChannel, (uint16_t)(0x7F << 7), (uint8_t)((track << 3) | (amp ? 4 : 0) | (lfo ? 2 : 0) | (filter ? 1 : 0))); } void MNMClass::setMultiEnvParam(uint8_t param, uint8_t value) { - midiuart->sendNRPN(global.baseChannel, 0x40 + param, value); + uart->sendNRPN(global.baseChannel, 0x40 + param, value); } -void MNMClass::setMute(uint8_t track, bool mute) { - midiuart->sendCC(track + global.baseChannel, 3, mute ? 0 : 1); +void MNMClass::muteTrack(uint8_t track, bool mute = true, MidiUartParent *uart_ = nullptr) { + if (uart_ == nullptr) { uart_ = uart; } + uart->sendCC(track + global.baseChannel, 3, mute ? 0 : 1); } void MNMClass::setAutoMute(bool mute) { - midiuart->sendCC(global.autotrackChannel, 3, mute ? 0 : 1); + uart->sendCC(global.autotrackChannel, 3, mute ? 0 : 1); } void MNMClass::setMidiParam(uint8_t track, uint8_t param, uint8_t value) { - midiuart->sendNRPN(global.baseChannel, (track << 7) | (0x38 + param), value); + uart->sendNRPN(global.baseChannel, (track << 7) | (0x38 + param), value); } void MNMClass::setTrackPitch(uint8_t track, uint8_t pitch) { - midiuart->sendNRPN(global.baseChannel, (112 + track) << 7, pitch); + uart->sendNRPN(global.baseChannel, (112 + track) << 7, pitch); } uint8_t MNMClass::setTrackLevel(uint8_t track, uint8_t level, bool send) { if (send) { - midiuart->sendCC(global.baseChannel + track, 7, level); + uart->sendCC(global.baseChannel + track, 7, level); } return 3; } void MNMClass::setAutoParam(uint8_t param, uint8_t value) { if (param < 0x30) { - midiuart->sendCC(global.autotrackChannel, param + 0x30, value); + uart->sendCC(global.autotrackChannel, param + 0x30, value); } else { - midiuart->sendCC(global.autotrackChannel, param + 0x38, value); + uart->sendCC(global.autotrackChannel, param + 0x38, value); } } void MNMClass::setAutoLevel(uint8_t level) { - midiuart->sendCC(global.autotrackChannel, 7, level); + uart->sendCC(global.autotrackChannel, 7, level); } uint8_t MNMClass::setParam(uint8_t track, uint8_t param, uint8_t value, bool send) { @@ -182,7 +183,7 @@ uint8_t MNMClass::setParam(uint8_t track, uint8_t param, uint8_t value, bool sen cc = param + 0x40; } if (send) { - midiuart->sendCC(global.baseChannel + track, cc, value); + uart->sendCC(global.baseChannel + track, cc, value); } return 3; } diff --git a/avr/cores/megacommand/MNM/MNM.h b/avr/cores/megacommand/MNM/MNM.h index f5e9616cc..aea43b57c 100644 --- a/avr/cores/megacommand/MNM/MNM.h +++ b/avr/cores/megacommand/MNM/MNM.h @@ -12,7 +12,6 @@ class MNMClass : public ElektronDevice { public: MNMClass(); - MidiUartClass *midiuart; MNMGlobal global; MNMKit kit; @@ -110,12 +109,13 @@ class MNMClass : public ElektronDevice { uint8_t setMachine(uint8_t idx) { return setMachine(currentTrack, idx); } uint8_t setMachine(uint8_t track, uint8_t idx, bool send = true); - void setMute(bool mute) { setMute(currentTrack, mute); } - void setMute(uint8_t track, bool mute); + void muteTrack(uint8_t track, bool mute = true, MidiUartParent *uart_ = nullptr); + /* void muteTrack() { muteTrack(currentTrack); } void muteTrack(uint8_t track) { setMute(track, true); } void unmuteTrack() { unmuteTrack(currentTrack); } void unmuteTrack(uint8_t track) { setMute(track, false); } + */ void setAutoMute(bool mute); void muteAutoTrack() { setAutoMute(true); } void unmuteAutoTrack() { setAutoMute(false); } From 26f794d5cee545cf6a841cbdb53481a808f4ba74 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 9 May 2023 11:48:29 +1000 Subject: [PATCH 018/413] fixes for the new MixerPage functionality --- avr/cores/megacommand/Elektron/Elektron.h | 2 + avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 17 ++++++ avr/cores/megacommand/MCL/ExtSeqTrack.h | 1 + avr/cores/megacommand/MCL/MDSeqTrack.cpp | 2 +- avr/cores/megacommand/MCL/MixerPage.cpp | 66 +++++++++++------------ avr/cores/megacommand/MCL/SeqPage.cpp | 24 +++------ avr/cores/megacommand/MCL/SeqTrack.h | 2 + 7 files changed, 63 insertions(+), 51 deletions(-) diff --git a/avr/cores/megacommand/Elektron/Elektron.h b/avr/cores/megacommand/Elektron/Elektron.h index 291f499aa..e8dc255f2 100644 --- a/avr/cores/megacommand/Elektron/Elektron.h +++ b/avr/cores/megacommand/Elektron/Elektron.h @@ -435,6 +435,8 @@ class ElektronDevice : public MidiDevice { **/ virtual const char* getMachineName(uint8_t machine) { return nullptr; } + virtual void muteTrack(uint8_t track, bool mute = true, MidiUartParent *uart_ = nullptr) {}; + bool get_tempo(uint16_t &tempo); bool get_mute_state(uint16_t &mute_state); bool get_fw_caps(); diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index 49e46fd3a..d5364173c 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -628,6 +628,11 @@ void ExtSeqTrack::seq(MidiUartParent *uart_) { uint16_t ev_idx, ev_end; + if (record_mutes) { + if (mute_state == SEQ_MUTE_ON) { SET_BIT128_P(oneshot_mask, step_count); } + else { CLEAR_BIT128_P(oneshot_mask, step_count); } + } + if ((is_generic_midi || (!is_generic_midi && count_down == 0)) && (mute_state == SEQ_MUTE_OFF)) { // SEQ_MUTE_OFF)) { // the range we're interested in: @@ -1201,3 +1206,15 @@ void ExtSeqTrack::modify_track(uint8_t dir) { mute_state = old_mute_state; } + +void ExtSeqTrack::toggle_mute() { + if (mute_state == SEQ_MUTE_ON) { + mute_state = SEQ_MUTE_OFF; + } + else { + mute_state = SEQ_MUTE_ON; + uint8_t mod12_counter_ = MidiClock.mod12_counter; + while (MidiClock.state == 2 && mod12_counter_ == MidiClock.mod12_counter) {}; + buffer_notesoff(); + } +} diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.h b/avr/cores/megacommand/MCL/ExtSeqTrack.h index b7efdd18f..acee1eec7 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.h +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.h @@ -247,6 +247,7 @@ class ExtSeqTrack : public ExtSeqTrackData, public SeqSlideTrack { ev_end += ev_idx; } + void toggle_mute(); void buffer_notesoff() { init_notes_on(); diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.cpp b/avr/cores/megacommand/MCL/MDSeqTrack.cpp index 1127a1fa9..a1f267985 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/MDSeqTrack.cpp @@ -121,7 +121,7 @@ void MDSeqTrack::seq(MidiUartParent *uart_) { if (record_mutes) { if (mute_state == SEQ_MUTE_ON) { SET_BIT64(oneshot_mask, step_count); } - if (mute_state == SEQ_MUTE_OFF) { CLEAR_BIT64(oneshot_mask, step_count); } + else { CLEAR_BIT64(oneshot_mask, step_count); } } if ((mute_state == SEQ_MUTE_OFF) && diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 3fafd6174..7e575a107 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -11,29 +11,28 @@ void MixerPage::set_display_mode(uint8_t param) { } void MixerPage::oled_draw_mutes() { + bool is_md_device = (midi_device == &MD); - SeqTrack *seq_tracks = (SeqTrack *) mcl_seq.md_tracks; - uint8_t len = mcl_seq.num_md_tracks; - - if (midi_device != &MD) { - seq_tracks = (SeqTrack *) mcl_seq.ext_tracks; - len = mcl_seq.num_ext_tracks; - } + uint8_t len = is_md_device ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; + uint8_t fader_x = 0; for (uint8_t i = 0; i < len; ++i) { // draw routing + SeqTrack *seq_track = is_md_device ? (SeqTrack*) &mcl_seq.md_tracks[i] : (SeqTrack*) &mcl_seq.ext_tracks[i]; + if (note_interface.is_note(i)) { - oled_display.fillRect(0 + i * 8, 2, 6, 6, WHITE); + oled_display.fillRect(fader_x, 2, 6, 6, WHITE); } - else if (seq_tracks[i].mute_state == SEQ_MUTE_OFF) { - oled_display.fillRect(0 + i * 8, 2, 6, 6, BLACK); - oled_display.drawRect(0 + i * 8, 2, 6, 6, WHITE); + else if (seq_track->mute_state == SEQ_MUTE_OFF) { + oled_display.fillRect(fader_x, 2, 6, 6, BLACK); + oled_display.drawRect(fader_x, 2, 6, 6, WHITE); } else { - oled_display.fillRect(0 + i * 8, 2, 6, 6, BLACK); - oled_display.drawLine(i * 8, 5, 5 + (i * 8), 5, WHITE); + oled_display.fillRect(fader_x, 2, 6, 6, BLACK); + oled_display.drawLine(fader_x, 5, 5 + (i * 8), 5, WHITE); } + fader_x += 8; } } @@ -178,22 +177,20 @@ void MixerPage::display() { oled_draw_mutes(); redraw_mask = -1; } - SeqTrack *seq_tracks = (SeqTrack *)&mcl_seq.md_tracks; - uint8_t len = mcl_seq.num_md_tracks; - uint8_t *levels = disp_levels; + bool is_md_device = (midi_device == &MD); + + uint8_t len = is_md_device ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; + uint8_t *levels = is_md_device ? disp_levels : ext_disp_levels; + if (seq_step_page.display_mute_mask(midi_device)) { oled_draw_mutes(); } - if (midi_device != &MD) { - seq_tracks = (SeqTrack *)&mcl_seq.ext_tracks; - len = mcl_seq.num_ext_tracks; - levels = ext_disp_levels; - } + uint8_t dec = MidiClock.get_tempo() * FADE_RATE; for (int i = 0; i < len; i++) { - if (midi_device == &MD) { + if (is_md_device) { if (display_mode == MODEL_LEVEL) { fader_level = MD.kit.levels[i]; } else { @@ -208,7 +205,7 @@ void MixerPage::display() { meter_level = min(fader_level, meter_level); if (IS_BIT_SET16(redraw_mask, i)) { - oled_display.fillRect(0 + i * 8, fader_y - 1, 6, FADER_LEN + 1, BLACK); + oled_display.fillRect(fader_x, fader_y - 1, 6, FADER_LEN + 1, BLACK); oled_display.drawRect(fader_x, fader_y + (FADER_LEN - fader_level), 6, fader_level + 2, WHITE); } @@ -267,14 +264,11 @@ bool MixerPage::handleEvent(gui_event_t *event) { uint8_t track = event->source - 128; - SeqTrack *seq_tracks = (SeqTrack*) mcl_seq.md_tracks; - uint8_t len = mcl_seq.num_md_tracks; - if (midi_device != &MD) { - seq_tracks = (SeqTrack*) mcl_seq.ext_tracks; - len = mcl_seq.num_ext_tracks; - } + bool is_md_device = (midi_device == &MD); - if (track > len) { + uint8_t len = is_md_device ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; + + if (track > 16) { return false; } @@ -282,16 +276,19 @@ bool MixerPage::handleEvent(gui_event_t *event) { trig_interface.send_md_leds(TRIGLED_OVERLAY); } - if (event->mask == EVENT_BUTTON_PRESSED) { + if (event->mask == EVENT_BUTTON_PRESSED && track <= len) { if (note_interface.is_note(track)) { if (show_mixer_menu) { - seq_tracks[track].mute_state = !seq_tracks[track].mute_state; + SeqTrack *seq_track = is_md_device ? (SeqTrack*) &mcl_seq.md_tracks[track] : (SeqTrack*) &mcl_seq.ext_tracks[track]; + + if (is_md_device) { seq_track->toggle_mute(); } + else { mcl_seq.ext_tracks[track].toggle_mute(); } - midi_device->muteTrack(track, seq_tracks[track].mute_state); + midi_device->muteTrack(track, seq_track->mute_state); if (trig_interface.is_key_down(MDX_KEY_PATSONGKIT)) { - seq_tracks[track].record_mutes = true; + seq_track->record_mutes = true; } oled_draw_mutes(); } else if (first_track == 255) { @@ -452,6 +449,7 @@ void MixerMidiEvents::onControlChangeCallback_Midi(uint8_t *msg) { if (track_param == 32) { return; } // don't process mute + if (mixer_page.midi_device != &MD) { return; } SET_BIT16(mixer_page.redraw_mask, track); for (int i = 0; i < 16; i++) { if (note_interface.is_note_on(i) && (i != track)) { diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index bdfaad7c3..33b70dc41 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -197,14 +197,7 @@ void SeqPage::toggle_ext_mask(uint8_t track) { if (track >= mcl_seq.num_ext_tracks) { return true; } - if (mcl_seq.ext_tracks[track].mute_state == SEQ_MUTE_ON) { - mcl_seq.ext_tracks[track].mute_state = SEQ_MUTE_OFF; - } else { - mcl_seq.ext_tracks[track].mute_state = SEQ_MUTE_ON; - uint8_t mod12_counter = MidiClock.mod12_counter; - while (MidiClock.state == 2 && mod12_counter == MidiClock.mod12_counter) {}; - mcl_seq.ext_tracks[track].buffer_notesoff(); - } + mcl_seq.ext_tracks[track].toggle_mute(); } else { if (track >= mcl_seq.num_ext_tracks) { return true; @@ -250,18 +243,17 @@ void SeqPage::select_track(MidiDevice *device, uint8_t track, bool send) { bool SeqPage::display_mute_mask(MidiDevice* device, uint8_t offset) { uint16_t last_mute_mask = mute_mask; + + bool is_md_device = (device == &MD); mute_mask = 0; - uint8_t len = mcl_seq.num_md_tracks; - SeqTrack *seq_tracks = (SeqTrack*) mcl_seq.md_tracks; - - if (device != &MD) { - len = mcl_seq.num_ext_tracks; - seq_tracks = (SeqTrack*) mcl_seq.ext_tracks; - } + uint8_t len = is_md_device ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; for (uint8_t n = 0; n < len; n++) { - if (seq_tracks[n].mute_state == SEQ_MUTE_OFF) { + + SeqTrack *seq_track = is_md_device ? (SeqTrack*) &mcl_seq.md_tracks[n] : (SeqTrack*) &mcl_seq.ext_tracks[n]; + + if (seq_track->mute_state == SEQ_MUTE_OFF) { uint8_t d = offset + n; if (d < 16) { SET_BIT16(mute_mask, d); diff --git a/avr/cores/megacommand/MCL/SeqTrack.h b/avr/cores/megacommand/MCL/SeqTrack.h index 46dfffe20..c91f53387 100644 --- a/avr/cores/megacommand/MCL/SeqTrack.h +++ b/avr/cores/megacommand/MCL/SeqTrack.h @@ -84,6 +84,8 @@ class SeqTrackBase { step_count = 0; } + void toggle_mute() { mute_state = !mute_state; } + uint8_t get_timing_mid(uint8_t speed_) { uint8_t timing_mid; switch (speed_) { From d8c7af97668b12fd44d3cf0261a49014d1a90de5 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 9 May 2023 15:58:28 +1000 Subject: [PATCH 019/413] use correct step position for mute recording, unmute on muterecord release. refactor --- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 79 +++------------- avr/cores/megacommand/MCL/MDSeqTrack.cpp | 105 +++++++--------------- avr/cores/megacommand/MCL/MDSeqTrack.h | 3 +- avr/cores/megacommand/MCL/MixerPage.cpp | 13 +++ avr/cores/megacommand/MCL/SeqTrack.cpp | 27 ++++++ avr/cores/megacommand/MCL/SeqTrack.h | 10 +++ 6 files changed, 95 insertions(+), 142 deletions(-) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index d5364173c..6a76d2561 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -629,8 +629,11 @@ void ExtSeqTrack::seq(MidiUartParent *uart_) { uint16_t ev_idx, ev_end; if (record_mutes) { - if (mute_state == SEQ_MUTE_ON) { SET_BIT128_P(oneshot_mask, step_count); } - else { CLEAR_BIT128_P(oneshot_mask, step_count); } + uint8_t u = 0; + uint8_t q = 0; + uint8_t s = get_quantized_step(u,q); + if (mute_state == SEQ_MUTE_ON) { SET_BIT128_P(oneshot_mask, s); } + else { CLEAR_BIT128_P(oneshot_mask, s); } } if ((is_generic_midi || (!is_generic_midi && count_down == 0)) && (mute_state == SEQ_MUTE_OFF)) { @@ -835,29 +838,8 @@ void ExtSeqTrack::record_track_locks(uint8_t track_param, uint8_t value, return; } - uint8_t timing_mid = get_timing_mid(); - - int8_t mod12 = mod12_counter - 1; - - uint8_t step = step_count; - - if ((step == 0) && (mod12 < 0)) { - mod12 += timing_mid; - step = length - 1; - } - - uint8_t utiming = mod12 + timing_mid; - - if (mcl_cfg.rec_quant) { - if (mod12 > timing_mid / 2) { - step++; - if (step == length) { - step = 0; - } - } - utiming = timing_mid; - } - + uint8_t utiming = 0; + uint8_t step = get_quantized_step(utiming); // clear all locks on step clear_track_locks(step, track_param, 255); set_track_locks(step, utiming, track_param, value, slide); @@ -1027,29 +1009,9 @@ bool ExtSeqTrack::set_track_step(uint8_t &step, uint8_t utiming, void ExtSeqTrack::record_track_noteoff(uint8_t note_num) { uint8_t condition = 0; - uint8_t timing_mid = get_timing_mid(); - - int8_t mod12 = mod12_counter - 1; - - uint8_t step = step_count; - - if ((step == 0) && (mod12 < 0)) { - mod12 += timing_mid; - step = length - 1; - } - - uint8_t utiming = mod12 + timing_mid; - - if (mcl_cfg.rec_quant) { - if (mod12 > timing_mid / 2) { - step++; - if (step == length) { - step = 0; - } - } - utiming = timing_mid; - } + uint8_t utiming = 0; + uint8_t step = get_quantized_step(utiming); uint16_t ev_idx; @@ -1083,27 +1045,8 @@ void ExtSeqTrack::record_track_noteon(uint8_t note_num, uint8_t velocity) { uint8_t condition = 0; uint8_t timing_mid = get_timing_mid(); - - int8_t mod12 = mod12_counter - 1; - - uint8_t step = step_count; - - if ((step == 0) && (mod12 < 0)) { - mod12 += timing_mid; - step = length - 1; - } - - uint8_t utiming = mod12 + timing_mid; - - if (mcl_cfg.rec_quant) { - if (mod12 > timing_mid / 2) { - step++; - if (step == length) { - step = 0; - } - } - utiming = timing_mid; - } + uint8_t utiming = 0; + uint8_t step = get_quantized_step(utiming); ignore_step = step; SET_BIT128_P(ignore_notes, note_num); diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.cpp b/avr/cores/megacommand/MCL/MDSeqTrack.cpp index a1f267985..5d41bd8f9 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/MDSeqTrack.cpp @@ -120,8 +120,11 @@ void MDSeqTrack::seq(MidiUartParent *uart_) { } if (record_mutes) { - if (mute_state == SEQ_MUTE_ON) { SET_BIT64(oneshot_mask, step_count); } - else { CLEAR_BIT64(oneshot_mask, step_count); } + uint8_t u = 0; + uint8_t q = 0; + uint8_t s = get_quantized_step(u, q); + if (mute_state == SEQ_MUTE_ON) { SET_BIT64(oneshot_mask, s); } + else { CLEAR_BIT64(oneshot_mask, s); } } if ((mute_state == SEQ_MUTE_OFF) && @@ -152,14 +155,14 @@ void MDSeqTrack::seq(MidiUartParent *uart_) { } auto &step = steps[current_step]; - bool send_trig = trig_conditional(step.cond_id); - if (send_trig || !step.cond_plock) { + uint8_t send_trig = trig_conditional(step.cond_id); + if (send_trig == TRIG_TRUE || (!step.cond_plock && send_trig != TRIG_ONESHOT)) { send_parameter_locks_inline(current_step, step.trig, lock_idx); if (step.slide) { locks_slides_recalc = current_step; locks_slides_idx = lock_idx; } - if (send_trig && step.trig) { + if (send_trig == TRIG_TRUE && step.trig) { send_trig_inline(); } } @@ -465,80 +468,81 @@ void MDSeqTrack::send_trig_inline() { SET_BIT16(MDSeqTrack::md_trig_mask, track_number); } -bool MDSeqTrack::trig_conditional(uint8_t condition) { - bool send_trig = false; +uint8_t MDSeqTrack::trig_conditional(uint8_t condition) { + + bool send_trig = TRIG_FALSE; if (IS_BIT_SET64(oneshot_mask, step_count)) { - return false; + return TRIG_ONESHOT; } switch (condition) { case 0: case 1: - send_trig = true; + send_trig = TRIG_TRUE; break; case 2: if (!IS_BIT_SET(iterations_8, 0)) { - send_trig = true; + send_trig = TRIG_TRUE; } break; case 3: if ((iterations_6 == 3) || (iterations_6 == 6)) { - send_trig = true; + send_trig = TRIG_TRUE; } break; case 6: if (iterations_6 == 6) { - send_trig = true; + send_trig = TRIG_TRUE; } break; case 4: if ((iterations_8 == 4) || (iterations_8 == 8)) { - send_trig = true; + send_trig = TRIG_TRUE; } break; case 8: if ((iterations_8 == 8)) { - send_trig = true; + send_trig = TRIG_TRUE; } break; case 5: if (iterations_5 == 5) { - send_trig = true; + send_trig = TRIG_TRUE; } break; case 7: if (iterations_7 == 7) { - send_trig = true; + send_trig = TRIG_TRUE; } break; case 9: if (get_random_byte() <= 13) { - send_trig = true; + send_trig = TRIG_TRUE; } break; case 10: if (get_random_byte() <= 32) { - send_trig = true; + send_trig = TRIG_TRUE; } break; case 11: if (get_random_byte() <= 64) { - send_trig = true; + send_trig = TRIG_TRUE; } break; case 12: if (get_random_byte() <= 96) { - send_trig = true; + send_trig = TRIG_TRUE; } break; case 13: if (get_random_byte() <= 115) { - send_trig = true; + send_trig = TRIG_TRUE; } break; case 14: if (!IS_BIT_SET64(oneshot_mask, step_count)) { SET_BIT64(oneshot_mask, step_count); - send_trig = true; + send_trig = TRIG_TRUE; } } return send_trig; @@ -610,38 +614,13 @@ bool MDSeqTrack::set_track_locks_i(uint8_t step, uint8_t lockidx, return true; } -uint8_t MDSeqTrack::get_quantized_step() { - uint8_t timing_mid = get_timing_mid(); - - int8_t mod12 = mod12_counter - 1; - - uint8_t step = step_count; - - if ((step == 0) && (mod12 < 0)) { - mod12 += timing_mid; - step = length - 1; - } - - uint8_t utiming = mod12 + timing_mid; - - if (mcl_cfg.rec_quant) { - if (mod12 > timing_mid / 2) { - step++; - if (step == length) { - step = 0; - } - } - } - return step; -} - void MDSeqTrack::record_track_locks(uint8_t track_param, uint8_t value) { if (step_count >= length) { return; } - - set_track_locks(get_quantized_step(), track_param, value); + uint8_t utiming = 0; + set_track_locks(get_quantized_step(utiming), track_param, value); } void MDSeqTrack::set_track_pitch(uint8_t step, uint8_t pitch) { @@ -653,7 +632,8 @@ void MDSeqTrack::record_track_pitch(uint8_t pitch) { if (step_count >= length) { return; } - set_track_pitch(get_quantized_step(), pitch); + uint8_t utiming = 0; + set_track_pitch(get_quantized_step(utiming), pitch); } void MDSeqTrack::record_track(uint8_t velocity) { @@ -661,29 +641,10 @@ void MDSeqTrack::record_track(uint8_t velocity) { if (step_count >= length) { return; } - uint8_t timing_mid = get_timing_mid(); - - int8_t mod12 = mod12_counter - 1; - - uint8_t step = step_count; + uint8_t utiming = 0; + uint8_t step = get_quantized_step(utiming); + ignore_step = step; - if ((step == 0) && (mod12 < 0)) { - mod12 += timing_mid; - step = length - 1; - } - - uint8_t utiming = mod12 + timing_mid; - - if (mcl_cfg.rec_quant) { - if (mod12 > timing_mid / 2) { - step++; - if (step == length) { - step = 0; - } - ignore_step = step; - } - utiming = timing_mid; - } set_track_step(step, utiming, velocity); } diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.h b/avr/cores/megacommand/MCL/MDSeqTrack.h index b9d6ba42c..ee93539b7 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.h +++ b/avr/cores/megacommand/MCL/MDSeqTrack.h @@ -46,7 +46,7 @@ class MDSeqTrack : public MDSeqTrackData, public SeqSlideTrack { void send_trig(); void send_trig_inline(); - bool trig_conditional(uint8_t condition); + uint8_t trig_conditional(uint8_t condition); void send_parameter_locks(uint8_t step, bool trig, uint16_t lock_idx = 0xFFFF); void send_parameter_locks_inline(uint8_t step, bool trig, uint16_t lock_idx); void get_step_locks(uint8_t step, uint8_t *params, bool ignore_locks_disabled = false); @@ -65,7 +65,6 @@ class MDSeqTrack : public MDSeqTrackData, public SeqSlideTrack { uint8_t get_track_lock(uint8_t step, uint8_t lockidx); uint8_t get_track_lock_implicit(uint8_t step, uint8_t param); - uint8_t get_quantized_step(); void record_track(uint8_t velocity); void record_track_locks(uint8_t track_param, uint8_t value); void record_track_pitch(uint8_t pitch); diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 7e575a107..8b3d618c8 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -241,14 +241,27 @@ void MixerPage::display() { } void MixerPage::disable_record_mutes() { + + MidiDevice *devs[2] = { + midi_active_peering.get_device(UART1_PORT), + midi_active_peering.get_device(UART2_PORT), + }; + + ElektronDevice *elektron_devs[2] = { + devs[0]->asElektronDevice(), + devs[1]->asElektronDevice(), + }; + for (uint8_t n = 0; n < mcl_seq.num_md_tracks; n++) { if (n < mcl_seq.num_ext_tracks) { if (mcl_seq.ext_tracks[n].record_mutes) { mcl_seq.ext_tracks[n].record_mutes = false; + if (mcl_seq.ext_tracks[n].mute_state == SEQ_MUTE_ON) { mcl_seq.ext_tracks[n].toggle_mute(); devs[1]->muteTrack(n, SEQ_MUTE_OFF); } } } if (mcl_seq.md_tracks[n].record_mutes) { mcl_seq.md_tracks[n].record_mutes = false; + if (mcl_seq.md_tracks[n].mute_state == SEQ_MUTE_ON) { mcl_seq.md_tracks[n].toggle_mute(); devs[0]->muteTrack(n, SEQ_MUTE_OFF); } } } if (!seq_step_page.recording) { diff --git a/avr/cores/megacommand/MCL/SeqTrack.cpp b/avr/cores/megacommand/MCL/SeqTrack.cpp index b4b4b9534..c0efab1d8 100644 --- a/avr/cores/megacommand/MCL/SeqTrack.cpp +++ b/avr/cores/megacommand/MCL/SeqTrack.cpp @@ -127,3 +127,30 @@ void SeqSlideTrack::send_slides(volatile uint8_t *locks_params, uint8_t channel) } } } + +uint8_t SeqTrackBase::get_quantized_step(uint8_t &utiming, uint8_t quant) { + uint8_t timing_mid = get_timing_mid(); + + int8_t mod12 = mod12_counter - 1; + + uint8_t step = step_count; + + if ((step == 0) && (mod12 < 0)) { + mod12 += timing_mid; + step = length - 1; + } + + utiming = mod12 + timing_mid; + + if (quant) { + if (mod12 > timing_mid / 2) { + step++; + if (step == length) { + step = 0; + } + } + utiming = timing_mid; + } + return step; +} + diff --git a/avr/cores/megacommand/MCL/SeqTrack.h b/avr/cores/megacommand/MCL/SeqTrack.h index c91f53387..a8c445689 100644 --- a/avr/cores/megacommand/MCL/SeqTrack.h +++ b/avr/cores/megacommand/MCL/SeqTrack.h @@ -29,6 +29,10 @@ #define NUM_LOCKS 8 +#define TRIG_FALSE 0 +#define TRIG_TRUE 1 +#define TRIG_ONESHOT 3 + class SeqTrack_270 {}; class SlideData { @@ -176,6 +180,12 @@ class SeqTrackBase { } return multi; } + + uint8_t get_quantized_step() { + uint8_t u = 0; + get_quantized_step(u); + } + uint8_t get_quantized_step(uint8_t &utiming, uint8_t quant = mcl_cfg.rec_quant); }; class SeqTrack : public SeqTrackBase { From d67edcc3fa5b5af93023b3b93ff52a94ccccc508 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 9 May 2023 22:44:28 +1000 Subject: [PATCH 020/413] Add mixer page mute states --- avr/cores/megacommand/MCL/MixerPage.cpp | 207 +++++++++++++++++++++--- avr/cores/megacommand/MCL/MixerPage.h | 8 + 2 files changed, 191 insertions(+), 24 deletions(-) diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 8b3d618c8..e49ffbd10 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -18,17 +18,22 @@ void MixerPage::oled_draw_mutes() { for (uint8_t i = 0; i < len; ++i) { // draw routing - SeqTrack *seq_track = is_md_device ? (SeqTrack*) &mcl_seq.md_tracks[i] : (SeqTrack*) &mcl_seq.ext_tracks[i]; + SeqTrack *seq_track = is_md_device ? (SeqTrack *)&mcl_seq.md_tracks[i] + : (SeqTrack *)&mcl_seq.ext_tracks[i]; + + uint8_t mute_state = + preview_mute_set != 255 + ? IS_BIT_SET16(mute_sets[!is_md_device][preview_mute_set], i) + : seq_track->mute_state == SEQ_MUTE_OFF; if (note_interface.is_note(i)) { oled_display.fillRect(fader_x, 2, 6, 6, WHITE); - } - - else if (seq_track->mute_state == SEQ_MUTE_OFF) { + } else if (mute_state) { + // No Mute (SEQ_MUTE_OFF) oled_display.fillRect(fader_x, 2, 6, 6, BLACK); oled_display.drawRect(fader_x, 2, 6, 6, WHITE); - } - else { + } else { + // Mute (SEQ_MUTE_ON) oled_display.fillRect(fader_x, 2, 6, 6, BLACK); oled_display.drawLine(fader_x, 5, 5 + (i * 8), 5, WHITE); } @@ -49,7 +54,9 @@ void MixerPage::init() { encoders[i]->cur = 64; encoders[i]->old = 64; } + MD.set_key_repeat(0); trig_interface.on(); + preview_mute_set = 255; bool switch_tracks = false; midi_events.setup_callbacks(); oled_display.clearDisplay(); @@ -59,11 +66,13 @@ void MixerPage::init() { first_track = 255; redraw_mask = -1; show_mixer_menu = 0; + populate_mute_set(); } void MixerPage::cleanup() { // md_exploit.off(); oled_display.clearDisplay(); + MD.set_key_repeat(1); trig_interface.off(); midi_events.remove_callbacks(); } @@ -182,7 +191,14 @@ void MixerPage::display() { uint8_t len = is_md_device ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; uint8_t *levels = is_md_device ? disp_levels : ext_disp_levels; - if (seq_step_page.display_mute_mask(midi_device)) { + if (preview_mute_set != 255) { + if (mute_sets[!is_md_device][preview_mute_set] != seq_step_page.mute_mask) { + seq_step_page.mute_mask = mute_sets[!is_md_device][preview_mute_set]; + MD.set_trigleds(mute_sets[!is_md_device][preview_mute_set], + TRIGLED_EXCLUSIVE); + oled_draw_mutes(); + } + } else if (seq_step_page.display_mute_mask(midi_device)) { oled_draw_mutes(); } @@ -256,12 +272,18 @@ void MixerPage::disable_record_mutes() { if (n < mcl_seq.num_ext_tracks) { if (mcl_seq.ext_tracks[n].record_mutes) { mcl_seq.ext_tracks[n].record_mutes = false; - if (mcl_seq.ext_tracks[n].mute_state == SEQ_MUTE_ON) { mcl_seq.ext_tracks[n].toggle_mute(); devs[1]->muteTrack(n, SEQ_MUTE_OFF); } + if (mcl_seq.ext_tracks[n].mute_state == SEQ_MUTE_ON) { + mcl_seq.ext_tracks[n].toggle_mute(); + devs[1]->muteTrack(n, SEQ_MUTE_OFF); + } } } if (mcl_seq.md_tracks[n].record_mutes) { mcl_seq.md_tracks[n].record_mutes = false; - if (mcl_seq.md_tracks[n].mute_state == SEQ_MUTE_ON) { mcl_seq.md_tracks[n].toggle_mute(); devs[0]->muteTrack(n, SEQ_MUTE_OFF); } + if (mcl_seq.md_tracks[n].mute_state == SEQ_MUTE_ON) { + mcl_seq.md_tracks[n].toggle_mute(); + devs[0]->muteTrack(n, SEQ_MUTE_OFF); + } } } if (!seq_step_page.recording) { @@ -269,6 +291,61 @@ void MixerPage::disable_record_mutes() { } } +void MixerPage::populate_mute_set() { + for (uint8_t dev = 0; dev < 2; dev++) { + + uint8_t len = (dev == 0) ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; + + for (uint8_t n = 0; n < len; n++) { + SeqTrack *seq_track = (dev == 0) ? (SeqTrack *)&mcl_seq.md_tracks[n] + : (SeqTrack *)&mcl_seq.ext_tracks[n]; + if (seq_track->mute_state == SEQ_MUTE_ON) { + SET_BIT16(mute_sets[dev][current_mute_set], n); + } else { + CLEAR_BIT16(mute_sets[dev][current_mute_set], n); + } + } + } +} + +void MixerPage::switch_mute_set(uint8_t state) { + if (current_mute_set == state) { + return; + } + MidiDevice *devs[2] = { + midi_active_peering.get_device(UART1_PORT), + midi_active_peering.get_device(UART2_PORT), + }; + + ElektronDevice *elektron_devs[2] = { + devs[0]->asElektronDevice(), + devs[1]->asElektronDevice(), + }; + for (uint8_t dev = 0; dev < 2; dev++) { + + uint8_t len = (dev == 0) ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; + + for (uint8_t n = 0; n < len; n++) { + SeqTrack *seq_track = (dev == 0) ? (SeqTrack *)&mcl_seq.md_tracks[n] + : (SeqTrack *)&mcl_seq.ext_tracks[n]; + + if (IS_BIT_CLEAR16(mute_sets[dev][state], n)) { + if (seq_track->mute_state == SEQ_MUTE_OFF) { + seq_track->toggle_mute(); + devs[dev]->muteTrack(n, SEQ_MUTE_ON); + } + } else { + if (seq_track->mute_state == SEQ_MUTE_ON) { + seq_track->toggle_mute(); + devs[dev]->muteTrack(n, SEQ_MUTE_OFF); + } + } + } + } + current_mute_set = state; + oled_draw_mutes(); +} + bool MixerPage::handleEvent(gui_event_t *event) { if (note_interface.is_event(event)) { uint8_t mask = event->mask; @@ -277,7 +354,7 @@ bool MixerPage::handleEvent(gui_event_t *event) { uint8_t track = event->source - 128; - bool is_md_device = (midi_device == &MD); + uint8_t is_md_device = (midi_device == &MD); uint8_t len = is_md_device ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; @@ -285,25 +362,46 @@ bool MixerPage::handleEvent(gui_event_t *event) { return false; } - if (!show_mixer_menu) { + if (!show_mixer_menu && preview_mute_set == 255) { trig_interface.send_md_leds(TRIGLED_OVERLAY); } if (event->mask == EVENT_BUTTON_PRESSED && track <= len) { if (note_interface.is_note(track)) { - if (show_mixer_menu) { + if (show_mixer_menu || preview_mute_set != 255) { - SeqTrack *seq_track = is_md_device ? (SeqTrack*) &mcl_seq.md_tracks[track] : (SeqTrack*) &mcl_seq.ext_tracks[track]; + SeqTrack *seq_track = is_md_device + ? (SeqTrack *)&mcl_seq.md_tracks[track] + : (SeqTrack *)&mcl_seq.ext_tracks[track]; - if (is_md_device) { seq_track->toggle_mute(); } - else { mcl_seq.ext_tracks[track].toggle_mute(); } + uint8_t mute_set = current_mute_set; + uint8_t state = 0; - midi_device->muteTrack(track, seq_track->mute_state); + if (preview_mute_set == 255 || preview_mute_set == current_mute_set) { + if (is_md_device) { + seq_track->toggle_mute(); + } else { + mcl_seq.ext_tracks[track].toggle_mute(); + } + midi_device->muteTrack(track, seq_track->mute_state); + state = seq_track->mute_state; + if (preview_mute_set == current_mute_set) { goto update_mute_set; } + } else { + update_mute_set: + mute_set = preview_mute_set; + state = IS_BIT_SET16(mute_sets[!is_md_device][mute_set], track); + } + + if (state == SEQ_MUTE_ON) { + CLEAR_BIT16(mute_sets[!is_md_device][mute_set], track); + } else { + SET_BIT16(mute_sets[!is_md_device][mute_set], track); + } if (trig_interface.is_key_down(MDX_KEY_PATSONGKIT)) { seq_track->record_mutes = true; } - oled_draw_mutes(); + // oled_draw_mutes(); } else if (first_track == 255) { first_track = track; MD.setStatus(0x22, track); @@ -359,14 +457,47 @@ bool MixerPage::handleEvent(gui_event_t *event) { break; } case MDX_KEY_YES: { - if (midi_device != &MD) { - midi_device = &MD; + if (trig_interface.is_key_down(MDX_KEY_LEFT)) { + switch_mute_set(1); + break; + } else if (trig_interface.is_key_down(MDX_KEY_UP)) { + switch_mute_set(2); + break; + } else if (trig_interface.is_key_down(MDX_KEY_RIGHT)) { + switch_mute_set(3); + break; + } else if (trig_interface.is_key_down(MDX_KEY_DOWN)) { + switch_mute_set(0); + break; } else { - midi_device = midi_active_peering.get_device(UART2_PORT); + if (midi_device != &MD) { + midi_device = &MD; + } else { + midi_device = midi_active_peering.get_device(UART2_PORT); + } + redraw_mask = -1; + oled_display.clearDisplay(); + oled_draw_mutes(); } - redraw_mask = -1; - oled_display.clearDisplay(); - oled_draw_mutes(); + break; + } + case MDX_KEY_LEFT: { + preview_mute_set = 1; + break; + } + + case MDX_KEY_UP: { + preview_mute_set = 2; + break; + } + + case MDX_KEY_RIGHT: { + preview_mute_set = 3; + break; + } + + case MDX_KEY_DOWN: { + preview_mute_set = 0; break; } } @@ -378,6 +509,15 @@ bool MixerPage::handleEvent(gui_event_t *event) { MD.set_trigleds(0, TRIGLED_OVERLAY); break; } + + case MDX_KEY_LEFT: + case MDX_KEY_UP: + case MDX_KEY_RIGHT: + case MDX_KEY_DOWN: { + trig_interface.send_md_leds(TRIGLED_OVERLAY); + preview_mute_set = 255; + break; + } } } } @@ -388,6 +528,23 @@ bool MixerPage::handleEvent(gui_event_t *event) { } if (EVENT_RELEASED(event, Buttons.BUTTON3)) { + /* + if (trig_interface.is_key_down(MDX_KEY_LEFT)) { + switch_mute_set(1); + } + + else if (trig_interface.is_key_down(MDX_KEY_UP)) { + switch_mute_set(2); + } + + else if (trig_interface.is_key_down(MDX_KEY_RIGHT)) { + switch_mute_set(3); + } + + else if (trig_interface.is_key_down(MDX_KEY_DOWN)) { + switch_mute_set(0); + } + */ show_mixer_menu = false; disable_record_mutes(); MD.set_trigleds(0, TRIGLED_EXCLUSIVE); @@ -462,7 +619,9 @@ void MixerMidiEvents::onControlChangeCallback_Midi(uint8_t *msg) { if (track_param == 32) { return; } // don't process mute - if (mixer_page.midi_device != &MD) { return; } + if (mixer_page.midi_device != &MD) { + return; + } SET_BIT16(mixer_page.redraw_mask, track); for (int i = 0; i < 16; i++) { if (note_interface.is_note_on(i) && (i != track)) { diff --git a/avr/cores/megacommand/MCL/MixerPage.h b/avr/cores/megacommand/MCL/MixerPage.h index d011fc896..664f3d1e3 100644 --- a/avr/cores/megacommand/MCL/MixerPage.h +++ b/avr/cores/megacommand/MCL/MixerPage.h @@ -39,10 +39,16 @@ class MixerPage : public LightPage { uint8_t first_track; uint16_t redraw_mask; bool show_mixer_menu; + + uint8_t current_mute_set = 0; + uint8_t preview_mute_set = 255; + uint16_t mute_sets[2][4]; + MixerPage(Encoder *e1 = NULL, Encoder *e2 = NULL, Encoder *e3 = NULL, Encoder *e4 = NULL) : LightPage(e1, e2, e3, e4) { midi_device = &MD; + memset(mute_sets,0xFF,sizeof(mute_sets)); } void adjust_param(EncoderParent *enc, uint8_t param); @@ -51,6 +57,8 @@ class MixerPage : public LightPage { void set_display_mode(uint8_t param); void disable_record_mutes(); void oled_draw_mutes(); + void switch_mute_set(uint8_t state); + void populate_mute_set(); virtual bool handleEvent(gui_event_t *event); virtual void display(); From 0e024d8878f82756af54ed98934b44f7f56f449e Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 10 May 2023 11:07:33 +1000 Subject: [PATCH 021/413] MD arrow key_repeat enable/disable --- avr/cores/megacommand/Elektron/Elektron.cpp | 2 +- avr/cores/megacommand/MD/MD.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/avr/cores/megacommand/Elektron/Elektron.cpp b/avr/cores/megacommand/Elektron/Elektron.cpp index b371c0f70..ff5254043 100644 --- a/avr/cores/megacommand/Elektron/Elektron.cpp +++ b/avr/cores/megacommand/Elektron/Elektron.cpp @@ -158,7 +158,7 @@ void ElektronDevice::set_rec_mode(uint8_t mode) { } void ElektronDevice::set_key_repeat(uint8_t mode) { - uint8_t data[3] = {0x70, 0x4D, mode}; + uint8_t data[3] = {0x70, 0x4E, mode}; sendRequest(data, sizeof(data)); // waitBlocking(); } diff --git a/avr/cores/megacommand/MD/MD.cpp b/avr/cores/megacommand/MD/MD.cpp index f4759dbbb..e31598c5b 100644 --- a/avr/cores/megacommand/MD/MD.cpp +++ b/avr/cores/megacommand/MD/MD.cpp @@ -233,6 +233,7 @@ bool MDClass::probe() { md_track_select.on(); activate_enhanced_gui(); activate_enhanced_midi(); + MD.set_key_repeat(1); MD.set_trigleds(0, TRIGLED_EXCLUSIVE); MD.global.extendedMode = 2; seq_ptc_page.setup(); From 9fb0950306801e976543466e9ef92bab51744ade Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 10 May 2023 11:52:16 +1000 Subject: [PATCH 022/413] close bank popup immediately after load, edge case --- avr/cores/megacommand/MCL/GridPage.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/GridPage.cpp b/avr/cores/megacommand/MCL/GridPage.cpp index 2b0f24c37..1413e7861 100644 --- a/avr/cores/megacommand/MCL/GridPage.cpp +++ b/avr/cores/megacommand/MCL/GridPage.cpp @@ -779,8 +779,10 @@ bool GridPage::handleEvent(gui_event_t *event) { if (event->mask == EVENT_BUTTON_RELEASED) { if (grid_page.bank_popup > 0) { if (note_interface.notes_all_off()) { - note_interface.init_notes(); + //note_interface.init_notes(); grid_page.bank_popup_loadmask = 0; + //grid_page.bank_popup = 0; + grid_page.close_bank_popup(); } return true; } From 21e5dec1ee513a6cbaae50037f39864f5d23df14 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 10 May 2023 12:15:54 +1000 Subject: [PATCH 023/413] checkpoint --- avr/cores/megacommand/MCL/MixerPage.cpp | 51 +++++++++++++------------ 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index e49ffbd10..56943fb4d 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -385,9 +385,11 @@ bool MixerPage::handleEvent(gui_event_t *event) { } midi_device->muteTrack(track, seq_track->mute_state); state = seq_track->mute_state; - if (preview_mute_set == current_mute_set) { goto update_mute_set; } + if (preview_mute_set == current_mute_set) { + goto update_mute_set; + } } else { - update_mute_set: + update_mute_set: mute_set = preview_mute_set; state = IS_BIT_SET16(mute_sets[!is_md_device][mute_set], track); } @@ -482,22 +484,35 @@ bool MixerPage::handleEvent(gui_event_t *event) { break; } case MDX_KEY_LEFT: { + + if (trig_interface.is_key_down(MDX_KEY_YES)) { switch_mute_set(1); } + else { preview_mute_set = 1; + } break; } case MDX_KEY_UP: { - preview_mute_set = 2; + if (trig_interface.is_key_down(MDX_KEY_YES)) { switch_mute_set(2); } + else { + preview_mute_set = 2; + } break; } case MDX_KEY_RIGHT: { - preview_mute_set = 3; + if (trig_interface.is_key_down(MDX_KEY_YES)) { switch_mute_set(3); } + else { + preview_mute_set = 3; + } break; } case MDX_KEY_DOWN: { - preview_mute_set = 0; + if (trig_interface.is_key_down(MDX_KEY_YES)) { switch_mute_set(0); } + else { + preview_mute_set = 0; + } break; } } @@ -514,8 +529,13 @@ bool MixerPage::handleEvent(gui_event_t *event) { case MDX_KEY_UP: case MDX_KEY_RIGHT: case MDX_KEY_DOWN: { - trig_interface.send_md_leds(TRIGLED_OVERLAY); - preview_mute_set = 255; + if (!trig_interface.is_key_down(MDX_KEY_LEFT) && + !trig_interface.is_key_down(MDX_KEY_UP) && + !trig_interface.is_key_down(MDX_KEY_RIGHT) && + !trig_interface.is_key_down(MDX_KEY_DOWN)) { + trig_interface.send_md_leds(TRIGLED_OVERLAY); + preview_mute_set = 255; + } break; } } @@ -528,23 +548,6 @@ bool MixerPage::handleEvent(gui_event_t *event) { } if (EVENT_RELEASED(event, Buttons.BUTTON3)) { - /* - if (trig_interface.is_key_down(MDX_KEY_LEFT)) { - switch_mute_set(1); - } - - else if (trig_interface.is_key_down(MDX_KEY_UP)) { - switch_mute_set(2); - } - - else if (trig_interface.is_key_down(MDX_KEY_RIGHT)) { - switch_mute_set(3); - } - - else if (trig_interface.is_key_down(MDX_KEY_DOWN)) { - switch_mute_set(0); - } - */ show_mixer_menu = false; disable_record_mutes(); MD.set_trigleds(0, TRIGLED_EXCLUSIVE); From fd3202598344b9051b9f6e015a333d73f86deca4 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 10 May 2023 16:19:04 +1000 Subject: [PATCH 024/413] Bug fixes, change key binding --- avr/cores/megacommand/MCL/GridIOPage.cpp | 2 +- avr/cores/megacommand/MCL/GridPage.cpp | 14 ++--- avr/cores/megacommand/MCL/MCLSeq.cpp | 4 ++ avr/cores/megacommand/MCL/MixerPage.cpp | 78 ++++++++++++++---------- 4 files changed, 58 insertions(+), 40 deletions(-) diff --git a/avr/cores/megacommand/MCL/GridIOPage.cpp b/avr/cores/megacommand/MCL/GridIOPage.cpp index ab97b3bd9..8ed19a4c9 100644 --- a/avr/cores/megacommand/MCL/GridIOPage.cpp +++ b/avr/cores/megacommand/MCL/GridIOPage.cpp @@ -56,7 +56,7 @@ bool GridIOPage::handleEvent(gui_event_t *event) { group_select(); return true; } - case MDX_KEY_BANKGROUP: { + case MDX_KEY_SCALE: { goto toggle_grid; } } diff --git a/avr/cores/megacommand/MCL/GridPage.cpp b/avr/cores/megacommand/MCL/GridPage.cpp index 1413e7861..f53e6748f 100644 --- a/avr/cores/megacommand/MCL/GridPage.cpp +++ b/avr/cores/megacommand/MCL/GridPage.cpp @@ -834,13 +834,7 @@ bool GridPage::handleEvent(gui_event_t *event) { uint8_t key = event->source - 64; if (trig_interface.is_key_down(MDX_KEY_PATSONG)) { - if (key == MDX_KEY_PATSONGKIT && event->mask == EVENT_BUTTON_PRESSED) { - grid_page.grid_select_apply = !grid_page.grid_select_apply; - swap_grids(); - init(); - return true; - } - if (show_slot_menu) { + if (show_slot_menu) { if (event->mask == EVENT_BUTTON_PRESSED) { switch (key) { case MDX_KEY_BANKA: @@ -933,6 +927,12 @@ bool GridPage::handleEvent(gui_event_t *event) { } } switch (key) { + case MDX_KEY_SCALE: { + grid_page.grid_select_apply = !grid_page.grid_select_apply; + swap_grids(); + init(); + return true; + } case MDX_KEY_UP: { up: param2.cur -= inc; diff --git a/avr/cores/megacommand/MCL/MCLSeq.cpp b/avr/cores/megacommand/MCL/MCLSeq.cpp index b31724b5d..3fe39299f 100644 --- a/avr/cores/megacommand/MCL/MCLSeq.cpp +++ b/avr/cores/megacommand/MCL/MCLSeq.cpp @@ -319,6 +319,8 @@ void MCLSeqMidiEvents::onControlChangeCallback_Midi(uint8_t *msg) { if (track_param == 32) { // Mute mcl_seq.md_tracks[track].mute_state = value > 0; + if (value > 0) { CLEAR_BIT16(mixer_page.mute_sets[0][mixer_page.current_mute_set], track); } + else { SET_BIT16(mixer_page.mute_sets[0][mixer_page.current_mute_set], track); } } if (track_param > 23) { return; @@ -344,9 +346,11 @@ void MCLSeqMidiEvents::onControlChangeCallback_Midi2(uint8_t *msg) { if (mcl_seq.ext_tracks[n].channel == channel) { if (param == midi_active_peering.get_device(UART2_PORT)->get_mute_cc()) { if (value > 0) { + CLEAR_BIT16(mixer_page.mute_sets[1][mixer_page.current_mute_set], n); mcl_seq.ext_tracks[n].mute_state = SEQ_MUTE_ON; mcl_seq.ext_tracks[n].buffer_notesoff(); } else { + SET_BIT16(mixer_page.mute_sets[1][mixer_page.current_mute_set], n); mcl_seq.ext_tracks[n].mute_state = SEQ_MUTE_OFF; } } else { diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 56943fb4d..115103dfb 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -198,7 +198,7 @@ void MixerPage::display() { TRIGLED_EXCLUSIVE); oled_draw_mutes(); } - } else if (seq_step_page.display_mute_mask(midi_device)) { + } else if (show_mixer_menu && seq_step_page.display_mute_mask(midi_device)) { oled_draw_mutes(); } @@ -300,9 +300,9 @@ void MixerPage::populate_mute_set() { SeqTrack *seq_track = (dev == 0) ? (SeqTrack *)&mcl_seq.md_tracks[n] : (SeqTrack *)&mcl_seq.ext_tracks[n]; if (seq_track->mute_state == SEQ_MUTE_ON) { - SET_BIT16(mute_sets[dev][current_mute_set], n); - } else { CLEAR_BIT16(mute_sets[dev][current_mute_set], n); + } else { + SET_BIT16(mute_sets[dev][current_mute_set], n); } } } @@ -400,8 +400,8 @@ bool MixerPage::handleEvent(gui_event_t *event) { SET_BIT16(mute_sets[!is_md_device][mute_set], track); } - if (trig_interface.is_key_down(MDX_KEY_PATSONGKIT)) { - seq_track->record_mutes = true; + if (trig_interface.is_key_down(MDX_KEY_PATSONG)) { + seq_track->record_mutes = true; } // oled_draw_mutes(); } else if (first_track == 255) { @@ -436,10 +436,6 @@ bool MixerPage::handleEvent(gui_event_t *event) { uint8_t key = event->source - 64; if (event->mask == EVENT_BUTTON_PRESSED) { switch (key) { - case MDX_KEY_PATSONGKIT: { - setLed2(); - break; - } case MDX_KEY_NO: { if (note_interface.notes_count_on() == 0) { disable_record_mutes(); @@ -472,22 +468,19 @@ bool MixerPage::handleEvent(gui_event_t *event) { switch_mute_set(0); break; } else { - if (midi_device != &MD) { - midi_device = &MD; - } else { - midi_device = midi_active_peering.get_device(UART2_PORT); - } - redraw_mask = -1; - oled_display.clearDisplay(); - oled_draw_mutes(); + seq_step_page.mute_mask = 0; + show_mixer_menu = true; } break; } + case MDX_KEY_LEFT: { if (trig_interface.is_key_down(MDX_KEY_YES)) { switch_mute_set(1); } else { - preview_mute_set = 1; + preview_mute_set = 1; + //force redraw in display() + seq_step_page.mute_mask++; } break; } @@ -495,7 +488,9 @@ bool MixerPage::handleEvent(gui_event_t *event) { case MDX_KEY_UP: { if (trig_interface.is_key_down(MDX_KEY_YES)) { switch_mute_set(2); } else { - preview_mute_set = 2; + preview_mute_set = 2; + //force redraw in display() + seq_step_page.mute_mask++; } break; } @@ -504,6 +499,8 @@ bool MixerPage::handleEvent(gui_event_t *event) { if (trig_interface.is_key_down(MDX_KEY_YES)) { switch_mute_set(3); } else { preview_mute_set = 3; + //force redraw in display() + seq_step_page.mute_mask++; } break; } @@ -512,19 +509,30 @@ bool MixerPage::handleEvent(gui_event_t *event) { if (trig_interface.is_key_down(MDX_KEY_YES)) { switch_mute_set(0); } else { preview_mute_set = 0; + //force redraw in display() + seq_step_page.mute_mask++; } break; } + case MDX_KEY_SCALE: { + if (midi_device != &MD) { + midi_device = &MD; + } else { + midi_device = midi_active_peering.get_device(UART2_PORT); + } + redraw_mask = -1; + oled_display.clearDisplay(); + oled_draw_mutes(); + break; + } } } if (event->mask == EVENT_BUTTON_RELEASED) { switch (key) { - case MDX_KEY_PATSONGKIT: { - disable_record_mutes(); - MD.set_trigleds(0, TRIGLED_OVERLAY); - break; + case MDX_KEY_GLOBAL: + case MDX_KEY_YES: { + goto global_release; } - case MDX_KEY_LEFT: case MDX_KEY_UP: case MDX_KEY_RIGHT: @@ -532,7 +540,9 @@ bool MixerPage::handleEvent(gui_event_t *event) { if (!trig_interface.is_key_down(MDX_KEY_LEFT) && !trig_interface.is_key_down(MDX_KEY_UP) && !trig_interface.is_key_down(MDX_KEY_RIGHT) && - !trig_interface.is_key_down(MDX_KEY_DOWN)) { + !trig_interface.is_key_down(MDX_KEY_DOWN) && + !trig_interface.is_key_down(MDX_KEY_YES) + ) { trig_interface.send_md_leds(TRIGLED_OVERLAY); preview_mute_set = 255; } @@ -542,16 +552,20 @@ bool MixerPage::handleEvent(gui_event_t *event) { } } if (EVENT_PRESSED(event, Buttons.BUTTON3) && !BUTTON_DOWN(Buttons.BUTTON4)) { - seq_step_page.mute_mask = 0; - show_mixer_menu = true; - return true; + seq_step_page.mute_mask = 0; + show_mixer_menu = true; + setLed2(); + + return true; } if (EVENT_RELEASED(event, Buttons.BUTTON3)) { - show_mixer_menu = false; - disable_record_mutes(); - MD.set_trigleds(0, TRIGLED_EXCLUSIVE); - return true; +global_release: + show_mixer_menu = false; + disable_record_mutes(); + MD.set_trigleds(0, TRIGLED_EXCLUSIVE); + + return true; } if (EVENT_PRESSED(event, Buttons.BUTTON2)) { From 17e245a6c3e1b1c1be563e2e01db33b384b1d27a Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 10 May 2023 16:41:33 +1000 Subject: [PATCH 025/413] Another display glitch --- avr/cores/megacommand/MCL/MixerPage.cpp | 88 ++++++++++++++----------- 1 file changed, 48 insertions(+), 40 deletions(-) diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 115103dfb..51f0f1f53 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -201,6 +201,10 @@ void MixerPage::display() { } else if (show_mixer_menu && seq_step_page.display_mute_mask(midi_device)) { oled_draw_mutes(); } + else if (mute_sets[!is_md_device][current_mute_set] != seq_step_page.mute_mask) { + seq_step_page.mute_mask = mute_sets[!is_md_device][current_mute_set]; + oled_draw_mutes(); + } uint8_t dec = MidiClock.get_tempo() * FADE_RATE; @@ -401,7 +405,7 @@ bool MixerPage::handleEvent(gui_event_t *event) { } if (trig_interface.is_key_down(MDX_KEY_PATSONG)) { - seq_track->record_mutes = true; + seq_track->record_mutes = true; } // oled_draw_mutes(); } else if (first_track == 255) { @@ -476,54 +480,58 @@ bool MixerPage::handleEvent(gui_event_t *event) { case MDX_KEY_LEFT: { - if (trig_interface.is_key_down(MDX_KEY_YES)) { switch_mute_set(1); } - else { - preview_mute_set = 1; - //force redraw in display() - seq_step_page.mute_mask++; + if (trig_interface.is_key_down(MDX_KEY_YES)) { + switch_mute_set(1); + } else { + preview_mute_set = 1; + // force redraw in display() + seq_step_page.mute_mask++; } break; } case MDX_KEY_UP: { - if (trig_interface.is_key_down(MDX_KEY_YES)) { switch_mute_set(2); } - else { - preview_mute_set = 2; - //force redraw in display() - seq_step_page.mute_mask++; + if (trig_interface.is_key_down(MDX_KEY_YES)) { + switch_mute_set(2); + } else { + preview_mute_set = 2; + // force redraw in display() + seq_step_page.mute_mask++; } break; } case MDX_KEY_RIGHT: { - if (trig_interface.is_key_down(MDX_KEY_YES)) { switch_mute_set(3); } - else { + if (trig_interface.is_key_down(MDX_KEY_YES)) { + switch_mute_set(3); + } else { preview_mute_set = 3; - //force redraw in display() + // force redraw in display() seq_step_page.mute_mask++; } break; } case MDX_KEY_DOWN: { - if (trig_interface.is_key_down(MDX_KEY_YES)) { switch_mute_set(0); } - else { + if (trig_interface.is_key_down(MDX_KEY_YES)) { + switch_mute_set(0); + } else { preview_mute_set = 0; - //force redraw in display() + // force redraw in display() seq_step_page.mute_mask++; } break; } case MDX_KEY_SCALE: { - if (midi_device != &MD) { - midi_device = &MD; - } else { - midi_device = midi_active_peering.get_device(UART2_PORT); - } - redraw_mask = -1; - oled_display.clearDisplay(); - oled_draw_mutes(); - break; + if (midi_device != &MD) { + midi_device = &MD; + } else { + midi_device = midi_active_peering.get_device(UART2_PORT); + } + redraw_mask = -1; + oled_display.clearDisplay(); + oled_draw_mutes(); + break; } } } @@ -531,7 +539,7 @@ bool MixerPage::handleEvent(gui_event_t *event) { switch (key) { case MDX_KEY_GLOBAL: case MDX_KEY_YES: { - goto global_release; + goto global_release; } case MDX_KEY_LEFT: case MDX_KEY_UP: @@ -541,10 +549,10 @@ bool MixerPage::handleEvent(gui_event_t *event) { !trig_interface.is_key_down(MDX_KEY_UP) && !trig_interface.is_key_down(MDX_KEY_RIGHT) && !trig_interface.is_key_down(MDX_KEY_DOWN) && - !trig_interface.is_key_down(MDX_KEY_YES) - ) { + !trig_interface.is_key_down(MDX_KEY_YES)) { trig_interface.send_md_leds(TRIGLED_OVERLAY); preview_mute_set = 255; + oled_draw_mutes(); } break; } @@ -552,20 +560,20 @@ bool MixerPage::handleEvent(gui_event_t *event) { } } if (EVENT_PRESSED(event, Buttons.BUTTON3) && !BUTTON_DOWN(Buttons.BUTTON4)) { - seq_step_page.mute_mask = 0; - show_mixer_menu = true; - setLed2(); - - return true; + seq_step_page.mute_mask = 0; + show_mixer_menu = true; + setLed2(); + + return true; } if (EVENT_RELEASED(event, Buttons.BUTTON3)) { -global_release: - show_mixer_menu = false; - disable_record_mutes(); - MD.set_trigleds(0, TRIGLED_EXCLUSIVE); - - return true; + global_release: + show_mixer_menu = false; + disable_record_mutes(); + MD.set_trigleds(0, TRIGLED_EXCLUSIVE); + oled_draw_mutes(); + return true; } if (EVENT_PRESSED(event, Buttons.BUTTON2)) { From 2d1c9eb026d32de3b2ad3cdc2c138af3b8dff978 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 11 May 2023 12:48:47 +1000 Subject: [PATCH 026/413] Optimise a bit --- avr/cores/megacommand/MCL/MixerPage.cpp | 69 +++++++++---------------- avr/cores/megacommand/MCL/MixerPage.h | 2 + 2 files changed, 26 insertions(+), 45 deletions(-) diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 51f0f1f53..106b73cdd 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -200,8 +200,8 @@ void MixerPage::display() { } } else if (show_mixer_menu && seq_step_page.display_mute_mask(midi_device)) { oled_draw_mutes(); - } - else if (mute_sets[!is_md_device][current_mute_set] != seq_step_page.mute_mask) { + } else if (mute_sets[!is_md_device][current_mute_set] != + seq_step_page.mute_mask) { seq_step_page.mute_mask = mute_sets[!is_md_device][current_mute_set]; oled_draw_mutes(); } @@ -349,7 +349,17 @@ void MixerPage::switch_mute_set(uint8_t state) { current_mute_set = state; oled_draw_mutes(); } - +uint8_t MixerPage::get_mute_set(uint8_t key) { + switch (key) { + case MDX_KEY_LEFT: + return 1; + case MDX_KEY_UP: + return 2; + case MDX_KEY_RIGHT: + return 3; + } + return 0; +} bool MixerPage::handleEvent(gui_event_t *event) { if (note_interface.is_event(event)) { uint8_t mask = event->mask; @@ -478,45 +488,15 @@ bool MixerPage::handleEvent(gui_event_t *event) { break; } - case MDX_KEY_LEFT: { - - if (trig_interface.is_key_down(MDX_KEY_YES)) { - switch_mute_set(1); - } else { - preview_mute_set = 1; - // force redraw in display() - seq_step_page.mute_mask++; - } - break; - } - - case MDX_KEY_UP: { - if (trig_interface.is_key_down(MDX_KEY_YES)) { - switch_mute_set(2); - } else { - preview_mute_set = 2; - // force redraw in display() - seq_step_page.mute_mask++; - } - break; - } - - case MDX_KEY_RIGHT: { - if (trig_interface.is_key_down(MDX_KEY_YES)) { - switch_mute_set(3); - } else { - preview_mute_set = 3; - // force redraw in display() - seq_step_page.mute_mask++; - } - break; - } - + case MDX_KEY_LEFT: + case MDX_KEY_UP: + case MDX_KEY_RIGHT: case MDX_KEY_DOWN: { + uint8_t set = get_mute_set(key); if (trig_interface.is_key_down(MDX_KEY_YES)) { - switch_mute_set(0); + switch_mute_set(set); } else { - preview_mute_set = 0; + preview_mute_set = set; // force redraw in display() seq_step_page.mute_mask++; } @@ -545,12 +525,11 @@ bool MixerPage::handleEvent(gui_event_t *event) { case MDX_KEY_UP: case MDX_KEY_RIGHT: case MDX_KEY_DOWN: { - if (!trig_interface.is_key_down(MDX_KEY_LEFT) && - !trig_interface.is_key_down(MDX_KEY_UP) && - !trig_interface.is_key_down(MDX_KEY_RIGHT) && - !trig_interface.is_key_down(MDX_KEY_DOWN) && - !trig_interface.is_key_down(MDX_KEY_YES)) { - trig_interface.send_md_leds(TRIGLED_OVERLAY); + uint64_t mask = _BV(MDX_KEY_LEFT) | _BV(MDX_KEY_UP) | + _BV(MDX_KEY_RIGHT) | _BV(MDX_KEY_DOWN) | + _BV(MDX_KEY_YES); + if ((trig_interface.cmd_key_state & mask) == 0) { + trig_interface.send_md_leds(TRIGLED_OVERLAY); preview_mute_set = 255; oled_draw_mutes(); } diff --git a/avr/cores/megacommand/MCL/MixerPage.h b/avr/cores/megacommand/MCL/MixerPage.h index 664f3d1e3..44fc07b94 100644 --- a/avr/cores/megacommand/MCL/MixerPage.h +++ b/avr/cores/megacommand/MCL/MixerPage.h @@ -44,6 +44,8 @@ class MixerPage : public LightPage { uint8_t preview_mute_set = 255; uint16_t mute_sets[2][4]; + uint8_t get_mute_set(uint8_t key); + MixerPage(Encoder *e1 = NULL, Encoder *e2 = NULL, Encoder *e3 = NULL, Encoder *e4 = NULL) : LightPage(e1, e2, e3, e4) { From 1f495c2c590719e36dca7925b55a41f9a1be6c2f Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 11 May 2023 12:53:46 +1000 Subject: [PATCH 027/413] toggle mute tentative --- avr/cores/megacommand/MCL/MixerPage.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 106b73cdd..744b824fe 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -392,11 +392,7 @@ bool MixerPage::handleEvent(gui_event_t *event) { uint8_t state = 0; if (preview_mute_set == 255 || preview_mute_set == current_mute_set) { - if (is_md_device) { - seq_track->toggle_mute(); - } else { - mcl_seq.ext_tracks[track].toggle_mute(); - } + seq_track->toggle_mute(); midi_device->muteTrack(track, seq_track->mute_state); state = seq_track->mute_state; if (preview_mute_set == current_mute_set) { From b891d56cd385b1fbc4be808d875bae5829585675 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 19 May 2023 11:55:44 +1000 Subject: [PATCH 028/413] Manual transition headroom now in ms, dynamically scailed with tempo, at 32th resolution --- avr/cores/megacommand/MCL/GridTask.cpp | 5 ++++- avr/cores/megacommand/MCL/MCLActions.cpp | 16 ++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/avr/cores/megacommand/MCL/GridTask.cpp b/avr/cores/megacommand/MCL/GridTask.cpp index 7fd5ebcba..6fb6fac6c 100644 --- a/avr/cores/megacommand/MCL/GridTask.cpp +++ b/avr/cores/megacommand/MCL/GridTask.cpp @@ -87,8 +87,11 @@ void GridTask::transition_handler() { GUI.removeTask(&grid_task); + //240ms headroom = 0.240 * (MidiClock.get_tempo()* 0.133333333333 + // = 0.032 * MidiClock.get_tempo() + // while (MidiClock.clock_less_than( - MidiClock.div32th_counter + 0.240 * (MidiClock.get_tempo()* 0.133333333333f), + MidiClock.div32th_counter + 0.032 * MidiClock.get_tempo(), (uint32_t)mcl_actions.next_transition * 2) <= 0) { float div32th_per_second = MidiClock.get_tempo() * 0.133333333333f; diff --git a/avr/cores/megacommand/MCL/MCLActions.cpp b/avr/cores/megacommand/MCL/MCLActions.cpp index fbb4b1398..3c8a72765 100644 --- a/avr/cores/megacommand/MCL/MCLActions.cpp +++ b/avr/cores/megacommand/MCL/MCLActions.cpp @@ -407,6 +407,8 @@ void MCLActions::manual_transition(uint8_t *slot_select_array, uint8_t track_idx, dev_idx; bool recalc_latency = true; + //100ms headroom = 0.100f * (MidiClock.get_tempo()* 0.133333333333f) + uint8_t headroom = ceil(MidiClock.get_tempo()* 0.0133333333333f); ////DEBUG_PRINTLN("manual trans"); again: bool overflow = next_step < MidiClock.div16th_counter; @@ -469,13 +471,15 @@ void MCLActions::manual_transition(uint8_t *slot_select_array, // MidiClock.div16th_counter; next transition should always be at least 2 // steps away. - uint32_t next32 = (uint32_t)next_transition; + uint32_t next_16th = (uint32_t)next_transition; if (next_transition == next_step) { if (overflow) { - next32 += (uint16_t)-1; + next_16th += (uint16_t)-1; } - if (next32 - (div192th_total_latency / 12) - 2 < - (uint32_t)MidiClock.div16th_counter) { + uint32_t next_32th = next_16th * 2; + + if (next_32th - (div192th_total_latency / 6) - headroom < + (uint32_t)MidiClock.div16th_counter * 2) { if (q == 255) { loops += 1; @@ -978,9 +982,9 @@ void MCLActions::calc_latency() { // latency_in_seconds += (float) dev_latency[a].load_latency * .0002; dev_latency[a].div32th_latency = - floor(div32th_per_second * latency_in_seconds) + 1; + ceil(div32th_per_second * latency_in_seconds); dev_latency[a].div192th_latency = - floor(div192th_per_second * latency_in_seconds) + 1; + ceil(div192th_per_second * latency_in_seconds); // Program change minimum delay = 1 x 16th. if (mcl_cfg.uart2_prg_out > 0 && a == 1) { From 601f4ecdb9cd67129959d13a10498eb4cc02408b Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 19 May 2023 12:12:31 +1000 Subject: [PATCH 029/413] display CC when setting lock via piano roll --- avr/cores/megacommand/MCL/SeqPtcPage.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.cpp b/avr/cores/megacommand/MCL/SeqPtcPage.cpp index eac32eefa..a0fca96b8 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPtcPage.cpp @@ -873,6 +873,11 @@ void SeqPtcMidiEvents::onControlChangeCallback_Midi2(uint8_t *msg) { active_track.clear_track_locks(step, param, 255); active_track.set_track_locks(step, timing_mid, param, value, SeqPage::slide); + char str[] = "CC:"; + char str2[] = "-- "; + mcl_gui.put_value_at(value, str2); + oled_display.textbox(str, str2); + } } } From df8519367a8bccfd80d97473805a164390642b5b Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 28 May 2023 13:32:49 +1000 Subject: [PATCH 030/413] Manual transitions with no quantization and speeds less than 1x would go out of sync --- avr/cores/megacommand/MCL/MCLActions.cpp | 58 +++++++++++++----------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCLActions.cpp b/avr/cores/megacommand/MCL/MCLActions.cpp index 3c8a72765..85a8fa24a 100644 --- a/avr/cores/megacommand/MCL/MCLActions.cpp +++ b/avr/cores/megacommand/MCL/MCLActions.cpp @@ -400,15 +400,15 @@ void MCLActions::manual_transition(uint8_t *slot_select_array, collect_tracks(slot_select_array, row_array); - uint16_t next_step = (MidiClock.div16th_counter / q) * q + q; + uint16_t next_step = q == 255 ? (uint16_t) -1 : (MidiClock.div16th_counter / q) * q + q; - uint8_t loops = 1; + bool increase_loops = 0; uint8_t track_idx, dev_idx; bool recalc_latency = true; - //100ms headroom = 0.100f * (MidiClock.get_tempo()* 0.133333333333f) - uint8_t headroom = ceil(MidiClock.get_tempo()* 0.0133333333333f); + uint8_t headroom = 4; + //uint8_t headroom = ceil(MidiClock.get_tempo()* 0.133333333333f * 0.200f); ////DEBUG_PRINTLN("manual trans"); again: bool overflow = next_step < MidiClock.div16th_counter; @@ -422,15 +422,30 @@ void MCLActions::manual_transition(uint8_t *slot_select_array, GridDeviceTrack *gdt = get_grid_dev_track(n, &track_idx, &dev_idx); if (gdt != nullptr) { transition_level[n] = 0; - next_transitions[n] = - div16th_counter - ((float)gdt->seq_track->step_count * - gdt->seq_track->get_speed_multiplier()); + if (increase_loops) { + if (next_transitions[n] == next_transition) { + DEBUG_PRINTLN("increasing loops"); + links[n].loops++; + } + } + else { + links[n].loops = 1; + } links[n].speed = gdt->seq_track->speed; links[n].length = gdt->seq_track->length; links[n].row = row; - links[n].loops = loops; + + next_transitions[n] = MidiClock.div16th_counter - ((float)gdt->seq_track->step_count * + gdt->seq_track->get_speed_multiplier() + (gdt->seq_track->mod12_counter / 12) ); + + bool ignore_chain_settings = true; - calc_next_slot_transition(n, ignore_chain_settings); + bool ignore_overflow = true; + calc_next_slot_transition(n, ignore_chain_settings, ignore_overflow); + + if (MidiClock.clock_less_than(next_transitions[n], next_step)) { + next_step = next_transitions[n]; + } grid_page.active_slots[n] = SLOT_PENDING; } } else { @@ -472,6 +487,9 @@ void MCLActions::manual_transition(uint8_t *slot_select_array, // steps away. uint32_t next_16th = (uint32_t)next_transition; + + //only recalculate if next_transition is a manual transition. + if (next_transition == next_step) { if (overflow) { next_16th += (uint16_t)-1; @@ -482,7 +500,7 @@ void MCLActions::manual_transition(uint8_t *slot_select_array, (uint32_t)MidiClock.div16th_counter * 2) { if (q == 255) { - loops += 1; + increase_loops = 1; } else { // DEBUG_PRINTLN("try again"); next_step += q; @@ -788,23 +806,9 @@ void MCLActions::cache_next_tracks(uint8_t *slot_select_array, void MCLActions::calc_next_slot_transition(uint8_t n, bool ignore_chain_settings, - bool auto_check) { - - // DEBUG_PRINT_FN(); - - if (auto_check) { - switch (chains[n].mode) { - case LOAD_AUTO: { - if (links[n].loops == 0) { - next_transitions[n] = -1; - return; - } - break; - } - } - } + bool ignore_overflow) { - if (!ignore_chain_settings) { + if (!ignore_chain_settings) { switch (chains[n].mode) { case LOAD_QUEUE: { break; @@ -824,7 +828,7 @@ void MCLActions::calc_next_slot_transition(uint8_t n, } // next transition[n] already valid, use this. - if (next_transitions[n] == -1 || next_transitions[n] > next_transition) { + if (next_transitions[n] == -1 || (next_transitions[n] > next_transition && !ignore_overflow)) { return; } From c3706a418b9ad6f63b55245babe81dd7e3f58159 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 28 May 2023 13:33:05 +1000 Subject: [PATCH 031/413] Hold trig, + yes for mute --- avr/cores/megacommand/MCL/MixerPage.cpp | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 744b824fe..8e7c276eb 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -26,10 +26,11 @@ void MixerPage::oled_draw_mutes() { ? IS_BIT_SET16(mute_sets[!is_md_device][preview_mute_set], i) : seq_track->mute_state == SEQ_MUTE_OFF; - if (note_interface.is_note(i)) { - oled_display.fillRect(fader_x, 2, 6, 6, WHITE); - } else if (mute_state) { + // if (note_interface.is_note(i)) { + // oled_display.fillRect(fader_x, 2, 6, 6, WHITE); + // } else if (mute_state) { // No Mute (SEQ_MUTE_OFF) + if (mute_state) { oled_display.fillRect(fader_x, 2, 6, 6, BLACK); oled_display.drawRect(fader_x, 2, 6, 6, WHITE); } else { @@ -478,8 +479,21 @@ bool MixerPage::handleEvent(gui_event_t *event) { switch_mute_set(0); break; } else { - seq_step_page.mute_mask = 0; - show_mixer_menu = true; + if (!note_interface.notes_on) { + seq_step_page.mute_mask = 0; + show_mixer_menu = true; + } + else { + uint8_t is_md_device = (midi_device == &MD); + for (int i = 0; i < 16; i++) { + if (note_interface.is_note_on(i)) { + SeqTrack *seq_track = is_md_device ? (SeqTrack *)&mcl_seq.md_tracks[i] : (SeqTrack *)&mcl_seq.ext_tracks[i]; + seq_track->toggle_mute(); + midi_device->muteTrack(i, seq_track->mute_state); + } + } + } + } break; } From e83ec80fa3d97d210bbc48c3529b042e0a6a3478 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 28 May 2023 14:13:49 +1000 Subject: [PATCH 032/413] Checkin --- avr/cores/megacommand/MCL/GridTask.cpp | 6 +++- avr/cores/megacommand/MCL/MCLActions.h | 2 +- avr/cores/megacommand/MCL/MixerPage.cpp | 41 +++++++++++++++---------- 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/avr/cores/megacommand/MCL/GridTask.cpp b/avr/cores/megacommand/MCL/GridTask.cpp index 6fb6fac6c..474de9f43 100644 --- a/avr/cores/megacommand/MCL/GridTask.cpp +++ b/avr/cores/megacommand/MCL/GridTask.cpp @@ -220,7 +220,11 @@ void GridTask::transition_handler() { ignore_chain_settings = false; auto_check = false; } - mcl_actions.calc_next_slot_transition(n, ignore_chain_settings, auto_check); + else if (mcl_actions.chains[n].mode == LOAD_AUTO && mcl_actions.links[n].loops == 0) { + mcl_actions.next_transitions[n] = -1; + continue; + } + mcl_actions.calc_next_slot_transition(n, ignore_chain_settings); } if (last_slot != 255 && slots_changed[last_slot] < GRID_LENGTH) { diff --git a/avr/cores/megacommand/MCL/MCLActions.h b/avr/cores/megacommand/MCL/MCLActions.h index 4081bca08..d38f21e33 100644 --- a/avr/cores/megacommand/MCL/MCLActions.h +++ b/avr/cores/megacommand/MCL/MCLActions.h @@ -105,7 +105,7 @@ class MCLActions : public LinkModeData { void manual_transition(uint8_t *slot_select_array, uint8_t *row_array); void cache_next_tracks(uint8_t *slot_select_array, bool gui_update = false); - void calc_next_slot_transition(uint8_t n, bool ignore_chain_settings = false, bool auto_check = false); + void calc_next_slot_transition(uint8_t n, bool ignore_chain_settings = false, bool ignore_overflow = false); void calc_next_transition(); void calc_latency(); private: diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 8e7c276eb..005775e1f 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -26,10 +26,10 @@ void MixerPage::oled_draw_mutes() { ? IS_BIT_SET16(mute_sets[!is_md_device][preview_mute_set], i) : seq_track->mute_state == SEQ_MUTE_OFF; - // if (note_interface.is_note(i)) { - // oled_display.fillRect(fader_x, 2, 6, 6, WHITE); - // } else if (mute_state) { - // No Mute (SEQ_MUTE_OFF) + // if (note_interface.is_note(i)) { + // oled_display.fillRect(fader_x, 2, 6, 6, WHITE); + // } else if (mute_state) { + // No Mute (SEQ_MUTE_OFF) if (mute_state) { oled_display.fillRect(fader_x, 2, 6, 6, BLACK); oled_display.drawRect(fader_x, 2, 6, 6, WHITE); @@ -482,18 +482,25 @@ bool MixerPage::handleEvent(gui_event_t *event) { if (!note_interface.notes_on) { seq_step_page.mute_mask = 0; show_mixer_menu = true; - } - else { - uint8_t is_md_device = (midi_device == &MD); - for (int i = 0; i < 16; i++) { - if (note_interface.is_note_on(i)) { - SeqTrack *seq_track = is_md_device ? (SeqTrack *)&mcl_seq.md_tracks[i] : (SeqTrack *)&mcl_seq.ext_tracks[i]; - seq_track->toggle_mute(); - midi_device->muteTrack(i, seq_track->mute_state); + } else { + uint8_t is_md_device = (midi_device == &MD); + for (int i = 0; i < 16; i++) { + if (note_interface.is_note_on(i)) { + SeqTrack *seq_track = is_md_device + ? (SeqTrack *)&mcl_seq.md_tracks[i] + : (SeqTrack *)&mcl_seq.ext_tracks[i]; + seq_track->toggle_mute(); + midi_device->muteTrack(i, seq_track->mute_state); + uint8_t state = + IS_BIT_SET16(mute_sets[!is_md_device][current_mute_set], i); + if (state == SEQ_MUTE_ON) { + CLEAR_BIT16(mute_sets[!is_md_device][current_mute_set], i); + } else { + SET_BIT16(mute_sets[!is_md_device][current_mute_set], i); + } + } } } - } - } break; } @@ -536,10 +543,10 @@ bool MixerPage::handleEvent(gui_event_t *event) { case MDX_KEY_RIGHT: case MDX_KEY_DOWN: { uint64_t mask = _BV(MDX_KEY_LEFT) | _BV(MDX_KEY_UP) | - _BV(MDX_KEY_RIGHT) | _BV(MDX_KEY_DOWN) | - _BV(MDX_KEY_YES); + _BV(MDX_KEY_RIGHT) | _BV(MDX_KEY_DOWN) | + _BV(MDX_KEY_YES); if ((trig_interface.cmd_key_state & mask) == 0) { - trig_interface.send_md_leds(TRIGLED_OVERLAY); + trig_interface.send_md_leds(TRIGLED_OVERLAY); preview_mute_set = 255; oled_draw_mutes(); } From 80c8ea8ced67ab0f335317b678a2af26cfc43433 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 28 May 2023 16:04:52 +1000 Subject: [PATCH 033/413] Seems okay? --- avr/cores/megacommand/MCL/MCLActions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/MCLActions.cpp b/avr/cores/megacommand/MCL/MCLActions.cpp index 85a8fa24a..32845da47 100644 --- a/avr/cores/megacommand/MCL/MCLActions.cpp +++ b/avr/cores/megacommand/MCL/MCLActions.cpp @@ -407,7 +407,7 @@ void MCLActions::manual_transition(uint8_t *slot_select_array, uint8_t track_idx, dev_idx; bool recalc_latency = true; - uint8_t headroom = 4; + uint8_t headroom = 2; //uint8_t headroom = ceil(MidiClock.get_tempo()* 0.133333333333f * 0.200f); ////DEBUG_PRINTLN("manual trans"); again: From d42410f439b02fc7d711d0e12ab6e170697d2d1b Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 29 May 2023 11:15:37 +1000 Subject: [PATCH 034/413] Change piano roll length via MD scale menu --- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 2 +- avr/cores/megacommand/MCL/ExtSeqTrack.h | 2 +- avr/cores/megacommand/MCL/MDTrackSelect.cpp | 58 ++++++++++++++++----- 3 files changed, 48 insertions(+), 14 deletions(-) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index 6a76d2561..18640625b 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -14,7 +14,7 @@ void ExtSeqTrack::set_speed(uint8_t _speed) { } } -void ExtSeqTrack::set_length(uint8_t len) { +void ExtSeqTrack::set_length(uint8_t len, bool expand) { if (len == 0) { len = 1; } diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.h b/avr/cores/megacommand/MCL/ExtSeqTrack.h index acee1eec7..c7d17927b 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.h +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.h @@ -209,7 +209,7 @@ class ExtSeqTrack : public ExtSeqTrackData, public SeqSlideTrack { uint8_t value = 255); bool clear_track_locks_idx(uint8_t step, uint8_t lock_idx, uint8_t value = 255); void clear_track(); - void set_length(uint8_t len); + void set_length(uint8_t len, bool expand = false); void re_sync(); void reset_params(); void handle_event(uint16_t index, uint8_t step); diff --git a/avr/cores/megacommand/MCL/MDTrackSelect.cpp b/avr/cores/megacommand/MCL/MDTrackSelect.cpp index b830fce42..717a41c3e 100644 --- a/avr/cores/megacommand/MCL/MDTrackSelect.cpp +++ b/avr/cores/megacommand/MCL/MDTrackSelect.cpp @@ -45,39 +45,73 @@ void MDTrackSelect::end() { DEBUG_PRINTLN(sysex->get_recordLen()); DEBUG_PRINTLN(msg_rd); if (sysex->get_recordLen() == 8) { + bool is_md_device = opt_midi_device_capture == &MD && (GUI.currentPage() != &seq_extstep_page); bool expand = true; reset_undo(); uint8_t length = sysex->getByte(6); uint8_t new_speed = sysex->getByte(7); - if (GUI.currentPage() == &seq_step_page) { + if (GUI.currentPage() == &seq_step_page || GUI.currentPage() == &seq_extstep_page) { if (seq_step_page.recording) { goto update_pattern; } uint8_t b = sysex->getByte(3); MD.currentTrack = b & 0xF; - mcl_seq.md_tracks[MD.currentTrack].set_length(length, expand); - mcl_seq.md_tracks[MD.currentTrack].set_speed(new_speed); + uint8_t n = is_md_device ? MD.currentTrack : last_ext_track; + SeqTrack *seq_track = is_md_device ? (SeqTrack *)&mcl_seq.md_tracks[n] + : (SeqTrack *)&mcl_seq.ext_tracks[n]; + + if (is_md_device) { + mcl_seq.md_tracks[n].set_length(length, expand); + mcl_seq.md_tracks[n].set_speed(new_speed); + } + else{ + mcl_seq.ext_tracks[n].set_length(length, expand); + mcl_seq.ext_tracks[n].set_speed(new_speed); + } + seq_step_page.config_encoders(); } else { update_pattern: uint8_t old_speeds[16]; uint8_t old_mutes[16]; - for (uint8_t n = 0; n < 16; n++) { - mcl_seq.md_tracks[n].set_length(length, expand); - old_speeds[n] = mcl_seq.md_tracks[n].speed; + uint8_t len = is_md_device ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; + for (uint8_t n = 0; n < len; n++) { + SeqTrack *seq_track = is_md_device ? (SeqTrack *)&mcl_seq.md_tracks[n] + : (SeqTrack *)&mcl_seq.ext_tracks[n]; + + if (is_md_device) { + mcl_seq.md_tracks[n].set_length(length, expand); + } + else{ + mcl_seq.ext_tracks[n].set_length(length, expand); + } + old_speeds[n] = seq_track->speed; if (old_speeds[n] == new_speed) { old_speeds[n] = 255; continue; } - old_mutes[n] = mcl_seq.md_tracks[n].mute_state; - mcl_seq.md_tracks[n].set_speed(new_speed, 255, false); - mcl_seq.md_tracks[n].mute_state = SEQ_MUTE_ON; + + old_mutes[n] = seq_track->mute_state; + if (is_md_device) { + mcl_seq.md_tracks[n].set_speed(new_speed, 255, false); + } + else { + mcl_seq.ext_tracks[n].set_speed(new_speed); + } + seq_track->mute_state = SEQ_MUTE_ON; } - for (uint8_t n = 0; n < 16; n++) { + for (uint8_t n = 0; n < len; n++) { if (old_speeds[n] == 255) continue; - mcl_seq.md_tracks[n].set_speed(new_speed, old_speeds[n], true); - mcl_seq.md_tracks[n].mute_state = old_mutes[n]; + SeqTrack *seq_track = is_md_device ? (SeqTrack *)&mcl_seq.md_tracks[n] + : (SeqTrack *)&mcl_seq.ext_tracks[n]; + if (is_md_device) { + mcl_seq.md_tracks[n].set_speed(new_speed, old_speeds[n], true); + } + else { + mcl_seq.ext_tracks[n].set_speed(new_speed); + } + seq_track->mute_state = old_mutes[n]; } } } else { From d829c57c252950e1b6437b553a1af0d560cdf8c2 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 29 May 2023 11:16:29 +1000 Subject: [PATCH 035/413] MixerPage: Hold no to quickly open the FX pages, use arrow keys left/down to toggle --- avr/cores/megacommand/MCL/FXPage.cpp | 40 ++++++++++++++++++++++++- avr/cores/megacommand/MCL/FXPage.h | 2 ++ avr/cores/megacommand/MCL/MixerPage.cpp | 36 +++++++++++++++++++++- avr/cores/megacommand/MCL/MixerPage.h | 1 + 4 files changed, 77 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/FXPage.cpp b/avr/cores/megacommand/MCL/FXPage.cpp index fdefbc79f..59d6fcc99 100644 --- a/avr/cores/megacommand/MCL/FXPage.cpp +++ b/avr/cores/megacommand/MCL/FXPage.cpp @@ -4,6 +4,9 @@ #define FX_TYPE 0 #define FX_PARAM 1 #define INTERPOLATE + +LightPage *FXPage::last_page = &fx_page_a; + void FXPage::setup() { DEBUG_PRINT_FN(); } void FXPage::init() { @@ -12,10 +15,11 @@ void FXPage::init() { oled_display.setFont(); trig_interface.off(); update_encoders(); - + MD.set_key_repeat(0); R.Clear(); R.use_icons_page(); R.use_machine_param_names(); + last_page = this; } void FXPage::update_encoders() { @@ -48,6 +52,7 @@ void FXPage::update_encoders() { void FXPage::cleanup() { // md_exploit.off(); + MD.set_key_repeat(1); oled_display.clearDisplay(); } @@ -176,6 +181,37 @@ bool FXPage::handleEvent(gui_event_t *event) { return true; } } + if (EVENT_CMD(event)) { + uint8_t key = event->source - 64; + if (event->mask == EVENT_BUTTON_RELEASED) { + switch (key) { + case MDX_KEY_NO: + GUI.setPage(&mixer_page); + break; + } + } + if (event->mask == EVENT_BUTTON_PRESSED) { + switch (key) { + case MDX_KEY_SCALE: + case MDX_KEY_DOWN: + if (GUI.currentPage() == &fx_page_b) { + goto toggle_mode; + } + else { + GUI.setPage(&fx_page_b); + } + break; + case MDX_KEY_LEFT: + if (GUI.currentPage() == &fx_page_a) { + goto toggle_mode; + } + else { + GUI.setPage(&fx_page_a); + } + break; + } + } + } if (event->mask == EVENT_BUTTON_RELEASED) { return true; } @@ -186,8 +222,10 @@ bool FXPage::handleEvent(gui_event_t *event) { // GUI.setPage(&grid_page); } if (EVENT_PRESSED(event, Buttons.BUTTON1)) { + toggle_mode: page_mode = !(page_mode); update_encoders(); + return true; } if (EVENT_PRESSED(event, Buttons.BUTTON3)) { diff --git a/avr/cores/megacommand/MCL/FXPage.h b/avr/cores/megacommand/MCL/FXPage.h index a431a3b94..e78ff29db 100644 --- a/avr/cores/megacommand/MCL/FXPage.h +++ b/avr/cores/megacommand/MCL/FXPage.h @@ -27,6 +27,8 @@ class FXPage : public LightPage, MidiCallback { } } + static LightPage *last_page; + bool handleEvent(gui_event_t *event); bool midi_state = false; diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 005775e1f..eb1baae23 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -1,4 +1,5 @@ #include "MCL_impl.h" +#include "ResourceManager.h" #define FADER_LEN 18 #define FADE_RATE 0.0625 @@ -68,6 +69,8 @@ void MixerPage::init() { redraw_mask = -1; show_mixer_menu = 0; populate_mute_set(); +// R.Clear(); +// R.use_machine_param_names(); } void MixerPage::cleanup() { @@ -123,6 +126,37 @@ void encoder_level_handle(EncoderParent *enc) { enc->old = 64; } +void send_fx(uint8_t param, EncoderParent *enc, uint8_t type) { + // for (int val = enc->old; val > enc->cur; val--) { + MD.sendFXParam(param, enc->cur, type); + // } + // for (int val = enc->old; val > enc->cur; val++) { + // MD.sendFXParam(param, val, type); + // } + PGM_P param_name = NULL; + switch (type) { + case MD_FX_ECHO: + MD.kit.delay[param] = enc->cur; + break; + case MD_FX_DYN: + MD.kit.dynamics[param] = enc->cur; + break; + case MD_FX_REV: + MD.kit.reverb[param] = enc->cur; + break; + case MD_FX_EQ: + MD.kit.eq[param] = enc->cur; + break; + } + char str[4]; + char str2[] = "-- "; + + param_name = fx_param_name(type, param); + strncpy(str, param_name, 4); + mcl_gui.put_value_at(enc->cur, str2); + oled_display.textbox(str, str2); +} + void encoder_filtf_handle(EncoderParent *enc) { mixer_page.adjust_param(enc, MODEL_FLTF); } @@ -450,7 +484,7 @@ bool MixerPage::handleEvent(gui_event_t *event) { case MDX_KEY_NO: { if (note_interface.notes_count_on() == 0) { disable_record_mutes(); - GUI.setPage(&grid_page); + GUI.setPage(fx_page_a.last_page); return true; } if (midi_device == &MD) { diff --git a/avr/cores/megacommand/MCL/MixerPage.h b/avr/cores/megacommand/MCL/MixerPage.h index 44fc07b94..9e888f23e 100644 --- a/avr/cores/megacommand/MCL/MixerPage.h +++ b/avr/cores/megacommand/MCL/MixerPage.h @@ -42,6 +42,7 @@ class MixerPage : public LightPage { uint8_t current_mute_set = 0; uint8_t preview_mute_set = 255; + void send_fx(uint8_t param, Encoder *enc, uint8_t type); uint16_t mute_sets[2][4]; uint8_t get_mute_set(uint8_t key); From 2f6dd058e8c06837a25d6290eec2acc0a8a0b677 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 29 May 2023 11:17:04 +1000 Subject: [PATCH 036/413] Transition headroom increased to 1.5 steps, change order of queue processing --- avr/cores/megacommand/MCL/GridTask.cpp | 5 +++-- avr/cores/megacommand/MCL/MCLActions.cpp | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/avr/cores/megacommand/MCL/GridTask.cpp b/avr/cores/megacommand/MCL/GridTask.cpp index 474de9f43..029faa073 100644 --- a/avr/cores/megacommand/MCL/GridTask.cpp +++ b/avr/cores/megacommand/MCL/GridTask.cpp @@ -34,6 +34,8 @@ void GridTask::run() { // A4Track *a4_track = (A4Track *)&temp_track; // ExtTrack *ext_track = (ExtTrack *)&temp_track; // MD GUI update. + + if (stop_hard_callback) { mcl_actions_callbacks.StopHardCallback(); stop_hard_callback = false; @@ -42,7 +44,6 @@ void GridTask::run() { } sync_cursor(); - GridTask::transition_handler(); if (!load_queue.is_empty()) { uint8_t mode; @@ -60,7 +61,7 @@ void GridTask::run() { mcl_actions.write_original = 1; mcl_actions.load_tracks(255, track_select, row_select_array, mode); } - + GridTask::transition_handler(); } void GridTask::transition_handler() { diff --git a/avr/cores/megacommand/MCL/MCLActions.cpp b/avr/cores/megacommand/MCL/MCLActions.cpp index 32845da47..7fa024132 100644 --- a/avr/cores/megacommand/MCL/MCLActions.cpp +++ b/avr/cores/megacommand/MCL/MCLActions.cpp @@ -407,7 +407,7 @@ void MCLActions::manual_transition(uint8_t *slot_select_array, uint8_t track_idx, dev_idx; bool recalc_latency = true; - uint8_t headroom = 2; + uint8_t headroom = 3; //uint8_t headroom = ceil(MidiClock.get_tempo()* 0.133333333333f * 0.200f); ////DEBUG_PRINTLN("manual trans"); again: From 40c89ebcabcd0b660ccc48253979f6fae533d5c1 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 29 May 2023 11:32:37 +1000 Subject: [PATCH 037/413] minor --- avr/cores/megacommand/MCL/MixerPage.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index eb1baae23..73a917815 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -31,12 +31,10 @@ void MixerPage::oled_draw_mutes() { // oled_display.fillRect(fader_x, 2, 6, 6, WHITE); // } else if (mute_state) { // No Mute (SEQ_MUTE_OFF) + oled_display.fillRect(fader_x, 2, 6, 6, BLACK); if (mute_state) { - oled_display.fillRect(fader_x, 2, 6, 6, BLACK); oled_display.drawRect(fader_x, 2, 6, 6, WHITE); } else { - // Mute (SEQ_MUTE_ON) - oled_display.fillRect(fader_x, 2, 6, 6, BLACK); oled_display.drawLine(fader_x, 5, 5 + (i * 8), 5, WHITE); } fader_x += 8; From eee3fbb11558704be617eab1ed17a6c96f083410 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 29 May 2023 11:43:44 +1000 Subject: [PATCH 038/413] remove interpolation, it's done internally in the MD anyway. --- avr/cores/megacommand/MCL/FXPage.cpp | 10 --------- avr/cores/megacommand/MCL/MixerPage.cpp | 29 ++----------------------- 2 files changed, 2 insertions(+), 37 deletions(-) diff --git a/avr/cores/megacommand/MCL/FXPage.cpp b/avr/cores/megacommand/MCL/FXPage.cpp index 59d6fcc99..fd7379521 100644 --- a/avr/cores/megacommand/MCL/FXPage.cpp +++ b/avr/cores/megacommand/MCL/FXPage.cpp @@ -3,7 +3,6 @@ #define FX_TYPE 0 #define FX_PARAM 1 -#define INTERPOLATE LightPage *FXPage::last_page = &fx_page_a; @@ -66,15 +65,6 @@ void FXPage::loop() { uint8_t fx_type = params[n].type; uint8_t val; - // Interpolation. -#ifdef INTERPOLATE - for (val = encoders[i]->old; val < encoders[i]->cur; val++) { - MD.sendFXParam(fx_param, val, fx_type); - } - for (val = encoders[i]->old; val > encoders[i]->cur; val--) { - MD.sendFXParam(fx_param, val, fx_type); - } -#endif MD.sendFXParam(fx_param, encoders[i]->cur, fx_type); switch (fx_type) { case MD_FX_ECHO: diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 73a917815..f2e8f753b 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -102,20 +102,7 @@ void encoder_level_handle(EncoderParent *enc) { for (int i = 0; i < 16; i++) { if (note_interface.is_note_on(i)) { - track_newval = MD.kit.levels[i] + dir; - if (track_newval < 0) { - track_newval = 0; - } - if (track_newval > 127) { - track_newval = 127; - } - for (uint8_t level = MD.kit.levels[i]; level < track_newval; level++) { - mixer_page.set_level(i, level); - } - for (uint8_t level = MD.kit.levels[i]; level > track_newval; level--) { - mixer_page.set_level(i, level); - } - // if ((MD.kit.levels[i] < 127) && (MD.kit.levels[i] > 0)) { + track_newval = min(max(MD.kit.levels[i] + dir,0),127); mixer_page.set_level(i, track_newval); SET_BIT16(mixer_page.redraw_mask, i); } @@ -184,19 +171,7 @@ void MixerPage::adjust_param(EncoderParent *enc, uint8_t param) { for (int i = 0; i < 16; i++) { if (note_interface.is_note_on(i)) { - newval = MD.kit.params[i][param] + dir; - if (newval < 0) { - newval = 0; - } - if (newval > 127) { - newval = 127; - } - for (uint8_t value = MD.kit.params[i][param]; value < newval; value++) { - MD.setTrackParam(i, param, value, nullptr, true); - } - for (uint8_t value = MD.kit.params[i][param]; value > newval; value--) { - MD.setTrackParam(i, param, value, nullptr, true); - } + newval =min(max(MD.kit.params[i][param] + dir,0),127); MD.setTrackParam(i, param, newval, nullptr, true); SET_BIT16(redraw_mask, i); } From d31b0006d18509a92b5f5d7ba82b733356d5a292 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 29 May 2023 14:10:38 +1000 Subject: [PATCH 039/413] Expand Ext tracks --- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 30 ++++++++++++++++++++++- avr/cores/megacommand/MCL/ExtSeqTrack.h | 1 + 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index 18640625b..9f398f0b0 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -21,7 +21,7 @@ void ExtSeqTrack::set_length(uint8_t len, bool expand) { if (len > 128) { len = 16; } - + uint8_t old_length = length; length = len; uint8_t step = step_count; if (step >= length && length > 0) { @@ -34,6 +34,34 @@ void ExtSeqTrack::set_length(uint8_t len, bool expand) { step_count = step; cur_event_idx = idx; CLEAR_LOCK(); + + if (expand && old_length <= 16 && length >= 16) { + for (uint8_t n = old_length; n < length; n++) { + if (timing_buckets.get(n) != 0) { + expand = false; + return; + } + } + ext_event_t empty_event; + uint8_t a = 0; + for (uint8_t n = old_length; n < 64; n++) { + // memset(&empty_event, 0, sizeof(ext_event_t)); + uint16_t ev_idx, ev_end; + locate(a, ev_idx, ev_end); + for (; ev_idx != ev_end; ++ev_idx) { + memcpy(&empty_event, events + ev_idx, sizeof(ext_event_t)); + add_event(n, &empty_event); + } + a++; + if (a == old_length) { a = 0; } + } + } +} + +void ExtSeqTrack::copy_event(uint8_t step, ext_event_t *event) { + uint16_t ev_idx, ev_end; + locate(step, ev_idx, ev_end); + memcpy(event, events + ev_idx, sizeof(ext_event_t)); } void ExtSeqTrack::re_sync() { diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.h b/avr/cores/megacommand/MCL/ExtSeqTrack.h index c7d17927b..8f4be2f6d 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.h +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.h @@ -213,6 +213,7 @@ class ExtSeqTrack : public ExtSeqTrackData, public SeqSlideTrack { void re_sync(); void reset_params(); void handle_event(uint16_t index, uint8_t step); + void copy_event(uint8_t step, ext_event_t *event); void remove_event(uint16_t index); uint16_t add_event(uint8_t step, ext_event_t *e); From 6d87154bd10d005f3f2eeb3aee1e2166ed724e66 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 29 May 2023 14:57:24 +1000 Subject: [PATCH 040/413] improve ext track lock entering --- avr/cores/megacommand/MCL/SeqPtcPage.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.cpp b/avr/cores/megacommand/MCL/SeqPtcPage.cpp index a0fca96b8..feb39edec 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPtcPage.cpp @@ -859,7 +859,8 @@ void SeqPtcMidiEvents::onControlChangeCallback_Midi2(uint8_t *msg) { param) { seq_extstep_page.lock_cur_y = value; } - } else { + } + auto &active_track = mcl_seq.ext_tracks[n]; uint8_t timing_mid = active_track.get_timing_mid(); int a = 16 * timing_mid; @@ -873,17 +874,18 @@ void SeqPtcMidiEvents::onControlChangeCallback_Midi2(uint8_t *msg) { active_track.clear_track_locks(step, param, 255); active_track.set_track_locks(step, timing_mid, param, value, SeqPage::slide); - char str[] = "CC:"; - char str2[] = "-- "; - mcl_gui.put_value_at(value, str2); - oled_display.textbox(str, str2); + if (SeqPage::pianoroll_mode == 0) { + char str[] = "CC:"; + char str2[] = "-- "; + mcl_gui.put_value_at(value, str2); + oled_display.textbox(str, str2); + } } - } } } - if (SeqPage::recording && (MidiClock.state == 2) && note_interface.notes_all_off()) { + if (SeqPage::recording && (MidiClock.state == 2) && !note_interface.notes_on) { if (param != midi_active_peering.get_device(UART2_PORT)->get_mute_cc()) { mcl_seq.ext_tracks[n].record_track_locks(param, value, SeqPage::slide); } From f569b68518538bf142a8602a5fd0f4229e17face Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 29 May 2023 21:41:46 +1000 Subject: [PATCH 041/413] fix expansion, missed velocity --- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index 9f398f0b0..07ea5ce65 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -3,7 +3,7 @@ void ExtSeqTrack::set_speed(uint8_t _speed) { uint8_t old_speed = speed; float mult = get_speed_multiplier(_speed) / get_speed_multiplier(old_speed); - for (uint16_t i = 0; i < NUM_EXT_EVENTS; i++) { + for (uint16_t i = 0; i < event_count; i++) { events[i].micro_timing = round(mult * (float)events[i].micro_timing); } speed = _speed; @@ -27,6 +27,7 @@ void ExtSeqTrack::set_length(uint8_t len, bool expand) { if (step >= length && length > 0) { step = step % length; } + uint16_t idx, end; locate(step, idx, end); USE_LOCK(); @@ -42,20 +43,21 @@ void ExtSeqTrack::set_length(uint8_t len, bool expand) { return; } } - ext_event_t empty_event; + ext_event_t empty_events[8]; uint8_t a = 0; for (uint8_t n = old_length; n < 64; n++) { - // memset(&empty_event, 0, sizeof(ext_event_t)); uint16_t ev_idx, ev_end; - locate(a, ev_idx, ev_end); - for (; ev_idx != ev_end; ++ev_idx) { - memcpy(&empty_event, events + ev_idx, sizeof(ext_event_t)); - add_event(n, &empty_event); - } + locate(a, ev_idx, ev_end); + memcpy(empty_events, &events[ev_idx], sizeof(empty_events)); + for (uint8_t m = 0; m < (ev_end - ev_idx); m++) { + add_event(n, &empty_events[m]); + } + velocities[n] = velocities[a]; a++; if (a == old_length) { a = 0; } } } + } void ExtSeqTrack::copy_event(uint8_t step, ext_event_t *event) { From 9541fa2f8c5acaac12a80faf7c7d2cf66102c986 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 29 May 2023 21:42:05 +1000 Subject: [PATCH 042/413] update zoom on ext track length change --- avr/cores/megacommand/MCL/MDTrackSelect.cpp | 2 ++ avr/cores/megacommand/MCL/SeqPage.cpp | 3 +++ 2 files changed, 5 insertions(+) diff --git a/avr/cores/megacommand/MCL/MDTrackSelect.cpp b/avr/cores/megacommand/MCL/MDTrackSelect.cpp index 717a41c3e..a1fc7b44a 100644 --- a/avr/cores/megacommand/MCL/MDTrackSelect.cpp +++ b/avr/cores/megacommand/MCL/MDTrackSelect.cpp @@ -67,6 +67,7 @@ void MDTrackSelect::end() { else{ mcl_seq.ext_tracks[n].set_length(length, expand); mcl_seq.ext_tracks[n].set_speed(new_speed); + if (GUI.currentPage() == &seq_extstep_page) { seq_extparam4.cur = length; } } seq_step_page.config_encoders(); @@ -97,6 +98,7 @@ void MDTrackSelect::end() { } else { mcl_seq.ext_tracks[n].set_speed(new_speed); + if (last_ext_track == n) { seq_extparam4.cur = length; } } seq_track->mute_state = SEQ_MUTE_ON; } diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index 33b70dc41..d69f16846 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -662,11 +662,13 @@ void pattern_len_handler(EncoderParent *enc) { if (BUTTON_DOWN(Buttons.BUTTON4)) { for (uint8_t c = 0; c < NUM_EXT_TRACKS; c++) { mcl_seq.ext_tracks[c].set_length(enc_->cur); + if (last_ext_track == c) { seq_extparam4.cur = enc_->cur; } } GUI.ignoreNextEvent(Buttons.BUTTON4); } else { mcl_seq.ext_tracks[last_ext_track].buffer_notesoff(); mcl_seq.ext_tracks[last_ext_track].set_length(enc_->cur); + seq_extparam4.cur = enc_->cur; } } } @@ -680,6 +682,7 @@ void opt_length_handler() { } else { mcl_seq.ext_tracks[last_ext_track].buffer_notesoff(); mcl_seq.ext_tracks[last_ext_track].set_length(opt_length); + seq_extparam4.cur = opt_length; } } From a1d3ac41c430f70cecdace06fe5c5129032a9164 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 13 Jun 2023 17:09:14 +1000 Subject: [PATCH 043/413] auto automation switching --- avr/cores/megacommand/MCL/SeqPtcPage.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.cpp b/avr/cores/megacommand/MCL/SeqPtcPage.cpp index feb39edec..73b1f164c 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPtcPage.cpp @@ -314,11 +314,11 @@ uint8_t SeqPtcPage::get_next_voice(uint8_t pitch, uint8_t track_number, } } + int oldest_val = -1; if (voice != 255) { goto end; } // Reuse oldest note - int oldest_val = -1; for (uint8_t x = 0; x < 16; x++) { if (MD.isMelodicTrack(x) && IS_BIT_SET16(mcl_cfg.poly_mask, x)) { @@ -860,7 +860,7 @@ void SeqPtcMidiEvents::onControlChangeCallback_Midi2(uint8_t *msg) { seq_extstep_page.lock_cur_y = value; } } - + if (last_ext_track == n) { auto &active_track = mcl_seq.ext_tracks[n]; uint8_t timing_mid = active_track.get_timing_mid(); int a = 16 * timing_mid; @@ -879,13 +879,19 @@ void SeqPtcMidiEvents::onControlChangeCallback_Midi2(uint8_t *msg) { char str2[] = "-- "; mcl_gui.put_value_at(value, str2); oled_display.textbox(str, str2); + } else { + uint8_t lock_idx = active_track.find_lock_idx(param); + if (lock_idx != 255) { + SeqPage::pianoroll_mode = lock_idx + 1; + } } - } + } } } - if (SeqPage::recording && (MidiClock.state == 2) && !note_interface.notes_on) { + if (SeqPage::recording && (MidiClock.state == 2) && + !note_interface.notes_on) { if (param != midi_active_peering.get_device(UART2_PORT)->get_mute_cc()) { mcl_seq.ext_tracks[n].record_track_locks(param, value, SeqPage::slide); } From f0d47cd60021623f084f9d3d23ca4ff9fa63e574 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 14 Jun 2023 15:49:16 +1000 Subject: [PATCH 044/413] This was bad --- avr/cores/megacommand/wiring.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/avr/cores/megacommand/wiring.c b/avr/cores/megacommand/wiring.c index 932f7a117..743ff1152 100644 --- a/avr/cores/megacommand/wiring.c +++ b/avr/cores/megacommand/wiring.c @@ -48,10 +48,11 @@ ISR(TIMER0_OVF_vect) { // copy these to local variables so they can be stored in registers // (volatile variables must be read from memory on every access) - unsigned long m = timer0_millis; - unsigned char f = timer0_fract; - uint8_t old_bank = switch_ram_bank(0); + uint8_t old_bank = switch_ram_bank(0); + + unsigned long m = timer0_millis; + unsigned char f = timer0_fract; m += MILLIS_INC; f += FRACT_INC; From 2a05b34ae604f1d168e510f85a59e8c5f89a83d3 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 14 Jun 2023 16:10:46 +1000 Subject: [PATCH 045/413] gcc version, should use 8.5 --- avr-gcc-version.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/avr-gcc-version.md b/avr-gcc-version.md index cfbbefb17..7211806aa 100644 --- a/avr-gcc-version.md +++ b/avr-gcc-version.md @@ -41,3 +41,7 @@ FEATURE_FLAGS = -ffunction-sections -fdata-sections -flto -fno-split-wide-types text data bss dec hex filename 218312 6030 42415 266757 41205 main.elf ``` + +avr-gcc 8.5 appears to produce a slightly smaller binary than 7.3. There is also discussion that 8.2+ produces more optimized code for interrupts by +introducing pseduo-instructions. +https://sourceware.org/bugzilla/show_bug.cgi?id=21683#c4 From 0fe84a4b200a1a8bfcbeca9a801726f23e068daa Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 15 Jun 2023 12:49:57 +1000 Subject: [PATCH 046/413] small optimization --- avr/cores/megacommand/MidiUart.h | 43 ++++++++++++++------------------ 1 file changed, 19 insertions(+), 24 deletions(-) diff --git a/avr/cores/megacommand/MidiUart.h b/avr/cores/megacommand/MidiUart.h index 7c332cee0..5de445d5b 100644 --- a/avr/cores/megacommand/MidiUart.h +++ b/avr/cores/megacommand/MidiUart.h @@ -6,9 +6,9 @@ #include #include #include "Midi.h" -//#define TXEN 3 -//#define RXEN 4 -//#define RXCIE 7 +// #define TXEN 3 +// #define RXEN 4 +// #define RXCIE 7 #ifdef MEGACOMMAND #define TIMER1_CHECK_INT() IS_BIT_SET8(TIFR1, OCF1A) @@ -87,7 +87,7 @@ #define TX_IRQ 1 -//#define RX_BUF_SIZE 2048 +// #define RX_BUF_SIZE 2048 #if (RX_BUF_SIZE >= 256) #define RX_BUF_TYPE uint16_t #else @@ -120,10 +120,10 @@ class MidiUartClass : public MidiUartParent { int8_t in_message_tx; - #ifdef RUNNING_STATUS_OUT +#ifdef RUNNING_STATUS_OUT uint8_t running_status; bool running_status_enabled; - #endif +#endif volatile uint8_t *udr; volatile uint8_t *ubrrh() { return udr - 1; } @@ -132,14 +132,14 @@ class MidiUartClass : public MidiUartParent { volatile uint8_t *ucsrb() { return udr - 5; } volatile uint8_t *ucsra() { return udr - 6; } - #ifdef RUNNING_STATUS_OUT +#ifdef RUNNING_STATUS_OUT ALWAYS_INLINE() bool write_char(uint8_t c) { if (!running_status_enabled) { *udr = c; return true; } if (MIDI_IS_STATUS_BYTE(c) && MIDI_IS_VOICE_STATUS_BYTE(c)) { - if (c != running_status) { + if (c != running_status) { running_status = c; *udr = c; return true; @@ -150,11 +150,9 @@ class MidiUartClass : public MidiUartParent { return true; } } - #else - ALWAYS_INLINE() void write_char(uint8_t c) { - *udr = c; - } - #endif +#else + ALWAYS_INLINE() void write_char(uint8_t c) { *udr = c; } +#endif uint8_t read_char() { return *udr; } bool check_empty_tx() { @@ -192,7 +190,7 @@ class MidiUartClass : public MidiUartParent { } switch (midi->live_state) { - case midi_wait_sysex: { + case midi_wait_sysex: if (MIDI_IS_STATUS_BYTE(c)) { if (c != MIDI_SYSEX_END) { @@ -207,28 +205,23 @@ class MidiUartClass : public MidiUartParent { midi->midiSysex.handleByte(c); } break; - } - case midi_wait_status: { + case midi_wait_status: if (c == MIDI_SYSEX_START) { midi->live_state = midi_wait_sysex; midi->midiSysex.reset(); - } else { - rxRb.put_h_isr(c); + break; } - } break; - default: { + default: rxRb.put_h_isr(c); break; } - } } - ALWAYS_INLINE() void tx_isr() { #ifdef RUNNING_STATUS_OUT bool rs = 1; #endif - again: + again: if ((txRb_sidechannel != nullptr) && (in_message_tx == 0)) { // sidechannel mounted, and no active messages in normal channel // ==> flush the sidechannel now @@ -305,7 +298,9 @@ class MidiUartClass : public MidiUartParent { clear_tx(); } #ifdef RUNNING_STATUS_OUT - if (!rs) { goto again; } + if (!rs) { + goto again; + } #endif if (txRb.isEmpty_isr() && (txRb_sidechannel == nullptr)) { clear_tx(); From 6625aaa329f5d9bb857d4f94ccae5fb74e2b5058 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 15 Jun 2023 17:14:00 +1000 Subject: [PATCH 047/413] compiler warnings, warn when float to double promotion --- avr/cores/megacommand/Arduino.h | 2 +- avr/cores/megacommand/Elektron/Elektron.cpp | 9 ++++++--- avr/cores/megacommand/GUI/LCDParent.h | 9 ++++----- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 6 ------ avr/cores/megacommand/MCL/ExtSeqTrack.h | 1 - avr/cores/megacommand/MCL/LFO.cpp | 10 +++++----- avr/cores/megacommand/MCL/LFO.h | 4 ++-- avr/cores/megacommand/MCL/MCLActionsEvents.cpp | 2 +- avr/cores/megacommand/MCL/MCLClipBoard.cpp | 4 ++-- avr/cores/megacommand/MCL/MDSeqTrack.cpp | 2 +- avr/cores/megacommand/MCL/Wav.cpp | 2 +- avr/cores/megacommand/MD/MD.cpp | 2 +- avr/cores/megacommand/Midi/MidiSDS.cpp | 4 ++-- avr/cores/megacommand/Midi/MidiUartParent.h | 4 ++-- avr/cores/megacommand/WProgram.h | 12 ++++++------ avr/cores/megacommand/memory.h | 8 ++++---- 16 files changed, 38 insertions(+), 43 deletions(-) diff --git a/avr/cores/megacommand/Arduino.h b/avr/cores/megacommand/Arduino.h index b1861b2e9..40a093072 100644 --- a/avr/cores/megacommand/Arduino.h +++ b/avr/cores/megacommand/Arduino.h @@ -86,7 +86,7 @@ void yield(void); #define max(a,b) ((a)>(b)?(a):(b)) #define abs(x) ((x)>0?(x):-(x)) #define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt))) -#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5)) +#define round(x) ((x)>=0?(long)((x)+0.5f):(long)((x)-0.5f)) #define radians(deg) ((deg)*DEG_TO_RAD) #define degrees(rad) ((rad)*RAD_TO_DEG) #define sq(x) ((x)*(x)) diff --git a/avr/cores/megacommand/Elektron/Elektron.cpp b/avr/cores/megacommand/Elektron/Elektron.cpp index ff5254043..75e3abff7 100644 --- a/avr/cores/megacommand/Elektron/Elektron.cpp +++ b/avr/cores/megacommand/Elektron/Elektron.cpp @@ -172,7 +172,7 @@ void ElektronDevice::popup_text(uint8_t action_string, uint8_t persistent) { void ElektronDevice::popup_text(char *str, uint8_t persistent) { uint8_t data[67] = {0x70, 0x3B, persistent}; uint8_t len = strlen(str); - strcpy(data + 3, str); + strcpy((char*) (data + 3), str); sendRequest(data, 3 + len + 1); // waitBlocking(); } @@ -190,7 +190,9 @@ void ElektronDevice::draw_close_bank() { void ElektronDevice::draw_microtiming(uint8_t speed, uint8_t timing) { - uint8_t data[6] = {0x70, 0x3C, 0x20, speed, timing >> 7, timing & 0x7F}; + uint8_t a = timing >> 7; + uint8_t b = timing & 0x7F; + uint8_t data[6] = {0x70, 0x3C, 0x20, speed, a, b}; sendRequest(data, 6); // waitBlocking(); } @@ -433,7 +435,7 @@ void ElektronDevice::setKitName(const char *name, MidiUartParent *uart_) { } uint8_t ElektronDevice::setTempo(float tempo, bool send) { - uint16_t qtempo = round(tempo * 24.0); + uint16_t qtempo = round(tempo * 24.0f); uint8_t data[3] = {sysex_protocol.tempo_set_id, (uint8_t)(qtempo >> 7), (uint8_t)(qtempo & 0x7F)}; return sendRequest(data, countof(data), send); @@ -471,4 +473,5 @@ const char *getMachineNameShort(uint8_t machine, uint8_t type, } } } + return nullptr; } diff --git a/avr/cores/megacommand/GUI/LCDParent.h b/avr/cores/megacommand/GUI/LCDParent.h index 459431977..7d223bf53 100644 --- a/avr/cores/megacommand/GUI/LCDParent.h +++ b/avr/cores/megacommand/GUI/LCDParent.h @@ -37,16 +37,15 @@ class LCDParentClass { * \addtogroup lcd_parent * @{ **/ - protected: /** Toggle the enable line (left to child). **/ - virtual void enable() { } + virtual void enable() = 0; /** Send a nibble to the display (left to child). **/ - virtual void putnibble(uint8_t nibble) { } + virtual void putnibble(uint8_t nibble) = 0; /** Send a command byte to the display (left to child). **/ - virtual void putcommand(uint8_t command) { } + virtual void putcommand(uint8_t command) = 0; /** Send a data byte to the display (left to child). **/ - virtual void putdata(uint8_t data) { } + virtual void putdata(uint8_t data) = 0; public: #ifdef HOST_MIDIDUINO diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index 07ea5ce65..1dce081df 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -60,12 +60,6 @@ void ExtSeqTrack::set_length(uint8_t len, bool expand) { } -void ExtSeqTrack::copy_event(uint8_t step, ext_event_t *event) { - uint16_t ev_idx, ev_end; - locate(step, ev_idx, ev_end); - memcpy(event, events + ev_idx, sizeof(ext_event_t)); -} - void ExtSeqTrack::re_sync() { // uint32_t q = length * 12; // start_step = (MidiClock.div16th_counter / q) * q + q; diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.h b/avr/cores/megacommand/MCL/ExtSeqTrack.h index 8f4be2f6d..c7d17927b 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.h +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.h @@ -213,7 +213,6 @@ class ExtSeqTrack : public ExtSeqTrackData, public SeqSlideTrack { void re_sync(); void reset_params(); void handle_event(uint16_t index, uint8_t step); - void copy_event(uint8_t step, ext_event_t *event); void remove_event(uint16_t index); uint16_t add_event(uint8_t step, ext_event_t *e); diff --git a/avr/cores/megacommand/MCL/LFO.cpp b/avr/cores/megacommand/MCL/LFO.cpp index c45cd6b57..5b5717b7b 100644 --- a/avr/cores/megacommand/MCL/LFO.cpp +++ b/avr/cores/megacommand/MCL/LFO.cpp @@ -2,7 +2,7 @@ #include "LFO.h" #include "math.h" -#define DIV_1_127 (1.00 / 127.0) +#define DIV_1_127 (1.00f / 127.0f) // Exponential Rise Formua: // y = M * (1-e^(-x/a)); // M = Maximum @@ -65,11 +65,11 @@ uint8_t TriLFO::get_sample(uint8_t sample_number) { } uint8_t SinLFO::get_sample(uint8_t sample_number) { - float sample_duration = (float)1.0 / (float)LFO_LENGTH; + float sample_duration = (float)1.0f / (float)LFO_LENGTH; - uint8_t y = (float)(amplitude / 2.0) * - sin(2.0 * PI * (float) sample_number * sample_duration - (0.5 * PI)) + - (float)(amplitude / 2.0); + uint8_t y = (float)(amplitude / 2.0f) * + (float) sin(2.0f * (float)M_PI * (float) sample_number * sample_duration - (0.5f * (float)M_PI)) + + (float)(amplitude / 2.0f); return y; } diff --git a/avr/cores/megacommand/MCL/LFO.h b/avr/cores/megacommand/MCL/LFO.h index 8fd31a627..ab3c016f4 100644 --- a/avr/cores/megacommand/MCL/LFO.h +++ b/avr/cores/megacommand/MCL/LFO.h @@ -19,7 +19,7 @@ class ExpLFO : public LFO { float time_constant; public: - ExpLFO(float time_constant_ = 40) { time_constant = 1.00 / time_constant_; } + ExpLFO(float time_constant_ = 40) { time_constant = 1.00f / time_constant_; } uint8_t get_sample(uint8_t sample_number); }; @@ -28,7 +28,7 @@ class IExpLFO : public LFO { float time_constant; public: - IExpLFO(float time_constant_ = 40) { time_constant = 1.00 / time_constant_; } + IExpLFO(float time_constant_ = 40) { time_constant = 1.00f / time_constant_; } uint8_t get_sample(uint8_t sample_number); }; diff --git a/avr/cores/megacommand/MCL/MCLActionsEvents.cpp b/avr/cores/megacommand/MCL/MCLActionsEvents.cpp index 09e26785a..e400572f1 100644 --- a/avr/cores/megacommand/MCL/MCLActionsEvents.cpp +++ b/avr/cores/megacommand/MCL/MCLActionsEvents.cpp @@ -98,11 +98,11 @@ void MCLActionsCallbacks::StopHardCallback() { } } + uint8_t _midi_lock_tmp = MidiUartParent::handle_midi_lock; if (!proceed) { goto end; } - uint8_t _midi_lock_tmp = MidiUartParent::handle_midi_lock; MidiUartParent::handle_midi_lock = 1; /* ElektronDevice *elektron_devs[2] = { diff --git a/avr/cores/megacommand/MCL/MCLClipBoard.cpp b/avr/cores/megacommand/MCL/MCLClipBoard.cpp index 06a18aced..ce2784b8d 100644 --- a/avr/cores/megacommand/MCL/MCLClipBoard.cpp +++ b/avr/cores/megacommand/MCL/MCLClipBoard.cpp @@ -86,10 +86,10 @@ bool MCLClipBoard::copy_sequencer_track(uint8_t track) { auto device_track = ((DeviceTrack *)&empty_track)->init_track_type(gdt->track_type); - if (device_track == nullptr) { goto end; } - bool merge = false; bool online = true; + if (device_track == nullptr) { goto end; } + ret = device_track->store_in_grid(track_idx, GRID_LENGTH, gdt->seq_track, merge, online, &grids[grid_idx]); diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.cpp b/avr/cores/megacommand/MCL/MDSeqTrack.cpp index 5d41bd8f9..596c40ead 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/MDSeqTrack.cpp @@ -254,8 +254,8 @@ void MDSeqTrack::recalc_slides() { cur_mask <<= 1; } - if (find_mask == 0) { goto end; } auto lockidx = locks_slides_idx; + if (find_mask == 0) { goto end; } find_next_locks(lockidx, step, find_mask); for (uint8_t c = 0; c < NUM_LOCKS; c++) { diff --git a/avr/cores/megacommand/MCL/Wav.cpp b/avr/cores/megacommand/MCL/Wav.cpp index 8ce2da2ee..9dcc9f228 100644 --- a/avr/cores/megacommand/MCL/Wav.cpp +++ b/avr/cores/megacommand/MCL/Wav.cpp @@ -508,7 +508,7 @@ bool Wav::apply_gain(float gain, uint8_t channel, uint32_t num_samples, } else { - uint32_t num_of_samples = + num_of_samples = (header.data.chunk_size / header.fmt.numChannels) / sample_size; } diff --git a/avr/cores/megacommand/MD/MD.cpp b/avr/cores/megacommand/MD/MD.cpp index e31598c5b..1e7430a4e 100644 --- a/avr/cores/megacommand/MD/MD.cpp +++ b/avr/cores/megacommand/MD/MD.cpp @@ -669,6 +669,7 @@ uint8_t MDClass::assignMachineBulk(uint8_t track, MDMachine *machine, } i++; + bool set_level = false; if (mode == 0) { goto end; } @@ -690,7 +691,6 @@ uint8_t MDClass::assignMachineBulk(uint8_t track, MDMachine *machine, } data[i++] = machine->trigGroup; data[i++] = machine->muteGroup; - bool set_level = false; if (level != 255) { data[i++] = level; set_level = true; diff --git a/avr/cores/megacommand/Midi/MidiSDS.cpp b/avr/cores/megacommand/Midi/MidiSDS.cpp index fcd9110c0..1c17e6cf8 100644 --- a/avr/cores/megacommand/Midi/MidiSDS.cpp +++ b/avr/cores/megacommand/Midi/MidiSDS.cpp @@ -114,7 +114,7 @@ bool MidiSDSClass::sendSyx(const char *filename, uint16_t sample_number) { uint32_t fsize; int show_progress = 0; uint8_t n_retry = 0; - + uint16_t latency_ms = 0; if (state != SDS_READY || !file.open(filename, O_READ)) { return false; } @@ -141,7 +141,7 @@ bool MidiSDSClass::sendSyx(const char *filename, uint16_t sample_number) { oled_display.clearDisplay(); - uint16_t latency_ms = (float) (1000 * sizeof(buf) / ( (float) MidiUart.speed * 0.1f)) + 20; + latency_ms = (float) (1000 * sizeof(buf) / ( (float) MidiUart.speed * 0.1f)) + 20; DEBUG_PRINTLN("latency"); DEBUG_PRINTLN(latency_ms); diff --git a/avr/cores/megacommand/Midi/MidiUartParent.h b/avr/cores/megacommand/Midi/MidiUartParent.h index 988b8d769..bec871e63 100644 --- a/avr/cores/megacommand/Midi/MidiUartParent.h +++ b/avr/cores/megacommand/Midi/MidiUartParent.h @@ -80,8 +80,8 @@ class MidiUartParent { virtual void initSerial() { } virtual uint8_t m_getc() {} - virtual void m_putc(uint8_t *src, uint16_t size) { } - virtual void m_putc(uint8_t c) {} + virtual void m_putc(uint8_t *src, uint16_t size) = 0; + virtual void m_putc(uint8_t c) = 0; virtual void m_putc_immediate(uint8_t c) { m_putc(c); } virtual bool avail() { return false; } diff --git a/avr/cores/megacommand/WProgram.h b/avr/cores/megacommand/WProgram.h index 7d44eec57..39fb718e1 100644 --- a/avr/cores/megacommand/WProgram.h +++ b/avr/cores/megacommand/WProgram.h @@ -29,12 +29,12 @@ #define DEBUG_PRINTLN(x) MidiUartUSB.println(x) #define DEBUG_DUMP(x) { \ } -// __PRETTY_FUNCTION__ is a gcc extension -// #define DEBUG_PRINT_FN(x) { \ -// DEBUG_PRINT(F("func_call: ")); \ -// Serial.println(__PRETTY_FUNCTION__); \ -// } -// +/* __PRETTY_FUNCTION__ is a gcc extension + #define DEBUG_PRINT_FN(x) { \ + DEBUG_PRINT(F("func_call: ")); \ + Serial.println(__PRETTY_FUNCTION__); \ + } +*/ #define DEBUG_CHECK_STACK() { if ((int) SP < 0x200 || (int)SP > 0x2200) { cli(); setLed2(); setLed(); while (1); } } #define DEBUG_PRINT_FN(x) diff --git a/avr/cores/megacommand/memory.h b/avr/cores/megacommand/memory.h index c01e0bd4a..71197d5d1 100644 --- a/avr/cores/megacommand/memory.h +++ b/avr/cores/megacommand/memory.h @@ -150,25 +150,25 @@ FORCED_INLINE() extern inline uint8_t get_byte_bank1(volatile uint8_t *dst) { FORCED_INLINE() extern inline void get_bank2(volatile void *dst, volatile const void *src, uint16_t len) { ram_access_fringe(); - memcpy((void*)dst, (void*)src + 0x4000, len); + memcpy((void*)dst, (uint8_t*)src + 0x4000, len); } FORCED_INLINE() extern inline void get_bank3(volatile void *dst, volatile const void *src, uint16_t len) { ram_access_fringe(); select_bank(1); - memcpy((void*)dst, (void*)src + 0x4000, len); + memcpy((void*)dst, (uint8_t*)src + 0x4000, len); } FORCED_INLINE() extern inline void put_bank2(volatile void *dst, volatile const void *src, uint16_t len) { ram_access_fringe(); - memcpy((void*)dst + 0x4000, (void*)src, len); + memcpy((uint8_t*)dst + 0x4000, (uint8_t*)src, len); } FORCED_INLINE() extern inline void put_bank3(volatile void *dst, volatile const void *src, uint16_t len) { ram_access_fringe(); select_bank(1); - memcpy((void*)dst + 0x4000, (void*)src, len); + memcpy((uint8_t*)dst + 0x4000, (uint8_t*)src, len); } From 03671e447d664737abf3ef8eb20f8368960ed35c Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 15 Jun 2023 17:14:20 +1000 Subject: [PATCH 048/413] small optimization to ring buffer checking --- avr/cores/megacommand/CommonTools/RingBuffer.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/avr/cores/megacommand/CommonTools/RingBuffer.h b/avr/cores/megacommand/CommonTools/RingBuffer.h index e331b05cf..897408741 100644 --- a/avr/cores/megacommand/CommonTools/RingBuffer.h +++ b/avr/cores/megacommand/CommonTools/RingBuffer.h @@ -116,7 +116,7 @@ void CRingBuffer::get_h_isr(C *dst, T n) volatile { #ifdef CHECKING if (isFull() && check) { overflow++; - return false; + return; } #endif @@ -151,7 +151,7 @@ void CRingBuffer::put_h_isr(C *src, T n) volatile { #ifdef CHECKING if (isFull() && check) { overflow++; - return false; + return; } #endif @@ -185,7 +185,7 @@ void CRingBuffer::put_h_isr(C c) volatile { #ifdef CHECKING if (isFull() && check) { overflow++; - return false; + return; } #endif @@ -235,8 +235,10 @@ void CRingBuffer::putp(C *c) volatile { template C CRingBuffer::get_h_isr() volatile { C ret; + #ifdef CHECKING if (isEmpty_isr()) - return ret; + return; + #endif if constexpr (N == 0) { ret = get_bank1(ptr + rd); From 0ef7cdb4677754c913884e95bc26890e04b7b327 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 18 Jun 2023 17:29:27 +1000 Subject: [PATCH 049/413] makefile, check for float -> double --- avr/cores/megacommand/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/Makefile b/avr/cores/megacommand/Makefile index 09e12a7b9..1e1bd6eff 100644 --- a/avr/cores/megacommand/Makefile +++ b/avr/cores/megacommand/Makefile @@ -35,7 +35,7 @@ F_CPU = 16000000L INOFILES=$(wildcard *.pde) OPTIM_FLAGS = -Os -WARN_FLAGS = -Wall -Wextra +WARN_FLAGS = -Wall -Wextra -Wdouble-promotion COMPILE_FLAGS = -c $(OPTIM_FLAGS) $(WARN_FLAGS) -MMD FEATURE_FLAGS = -ffunction-sections -fdata-sections -flto=jobserver LINK_FLAGS = -lm -Wl,--gc-sections,--defsym=__stack=0x801FA1,--section-start,.sdcard=0x801FA2,--section-start,.data=0x802200,--defsym=__heap_end=0x80ffff,--relax From 357badc00677d726e2ae4fdf03771ccec632f1d0 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 19 Jun 2023 14:36:15 +1000 Subject: [PATCH 050/413] Revert these from merge, suspect it was an attempt to allow empty slots to have adjustable loop values. See: 72b5605fef8477dd16721ca28901e0d0070150cc ? --- avr/cores/megacommand/MCL/GridTrack.cpp | 2 +- avr/cores/megacommand/MCL/GridTrack.h | 3 +-- avr/cores/megacommand/MCL/MCLActions.cpp | 6 +----- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/avr/cores/megacommand/MCL/GridTrack.cpp b/avr/cores/megacommand/MCL/GridTrack.cpp index f4459e668..5247f3c28 100644 --- a/avr/cores/megacommand/MCL/GridTrack.cpp +++ b/avr/cores/megacommand/MCL/GridTrack.cpp @@ -61,7 +61,7 @@ bool GridTrack::load_from_grid(uint8_t column, uint16_t row) { ::new (this) GridTrack; this->active = tmp; - if ((active == 255)) { + if ((active == EMPTY_TRACK_TYPE) || (active == 255)) { init(); } diff --git a/avr/cores/megacommand/MCL/GridTrack.h b/avr/cores/megacommand/MCL/GridTrack.h index 384b4af68..a05f7d402 100644 --- a/avr/cores/megacommand/MCL/GridTrack.h +++ b/avr/cores/megacommand/MCL/GridTrack.h @@ -75,10 +75,9 @@ class GridTrack { return true; } - void init() { + void init() { link.length = 16; link.speed = SEQ_SPEED_1X; - link.loops = 0; } /* Load track from Grid in to sequencer, place in payload to be transmitted to device*/ diff --git a/avr/cores/megacommand/MCL/MCLActions.cpp b/avr/cores/megacommand/MCL/MCLActions.cpp index 62a60f3a7..7fa024132 100644 --- a/avr/cores/megacommand/MCL/MCLActions.cpp +++ b/avr/cores/megacommand/MCL/MCLActions.cpp @@ -371,7 +371,6 @@ void MCLActions::collect_tracks(uint8_t *slot_select_array, if (device_track == nullptr || device_track->active != gdt->track_type && device_track->get_parent_model() != gdt->track_type) { empty_track.clear(); - if (device_track->active != EMPTY_TRACK_TYPE) { device_track->init(); } //Init link data for invalid tracks device_track = device_track->init_track_type(gdt->track_type); if (device_track) { device_track->init(track_idx, gdt->seq_track); @@ -522,12 +521,12 @@ bool MCLActions::load_track(uint8_t track_idx, uint8_t row, uint8_t pos, return false; } // read failure + ptrack->link.store_in_mem(pos, &(links[0])); if (ptrack->active != gdt->track_type && ptrack->get_parent_model() != gdt->track_type) { empty_track.clear(); DEBUG_PRINTLN("Clearing track"); DEBUG_PRINTLN(pos); - if (ptrack->active != EMPTY_TRACK_TYPE) { ptrack->init(); } ptrack->init_track_type(gdt->track_type); ptrack->init(track_idx, gdt->seq_track); ptrack->load_seq_data(gdt->seq_track); @@ -540,8 +539,6 @@ bool MCLActions::load_track(uint8_t track_idx, uint8_t row, uint8_t pos, ptrack->store_in_mem(track_idx); send_masks[pos] = 1; } - - ptrack->link.store_in_mem(pos, &(links[0])); return true; } @@ -784,7 +781,6 @@ void MCLActions::cache_next_tracks(uint8_t *slot_select_array, // EMPTY_TRACK_TYPE ////DEBUG_PRINTLN(F("clear track")); empty_track.clear(); - if (ptrack->active != EMPTY_TRACK_TYPE) { ptrack->init(); } ptrack = empty_track.init_track_type(gdt->track_type); ptrack->init(track_idx, gdt->seq_track); } else { From ebc068a593b25ecbcd9155f6d5e1563c72ad3d59 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 19 Jun 2023 15:55:04 +1000 Subject: [PATCH 051/413] fix expansion of ext tracks --- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index 1dce081df..76c3bdfff 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -45,7 +45,7 @@ void ExtSeqTrack::set_length(uint8_t len, bool expand) { } ext_event_t empty_events[8]; uint8_t a = 0; - for (uint8_t n = old_length; n < 64; n++) { + for (uint8_t n = old_length; n < 128; n++) { uint16_t ev_idx, ev_end; locate(a, ev_idx, ev_end); memcpy(empty_events, &events[ev_idx], sizeof(empty_events)); From 7e8062e6e930b5eee55f051a33c93e9642d9e360 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 19 Jun 2023 17:25:46 +1000 Subject: [PATCH 052/413] encoder optimization --- avr/cores/megacommand/GUI/Encoders.cpp | 10 +--- avr/cores/megacommand/GUI/Encoders.h | 23 -------- avr/cores/megacommand/MCL/GridEncoder.cpp | 33 ----------- avr/cores/megacommand/MCL/GridEncoder.h | 69 ----------------------- avr/cores/megacommand/MCL/GridPage.h | 1 - avr/cores/megacommand/MCL/GridPages.h | 1 - avr/cores/megacommand/MCL/MCLEncoder.cpp | 4 +- avr/cores/megacommand/MCL/MCL_impl.h | 1 - 8 files changed, 3 insertions(+), 139 deletions(-) delete mode 100644 avr/cores/megacommand/MCL/GridEncoder.cpp delete mode 100644 avr/cores/megacommand/MCL/GridEncoder.h diff --git a/avr/cores/megacommand/GUI/Encoders.cpp b/avr/cores/megacommand/GUI/Encoders.cpp index 252a5cd40..87c3c0ab7 100644 --- a/avr/cores/megacommand/GUI/Encoders.cpp +++ b/avr/cores/megacommand/GUI/Encoders.cpp @@ -62,15 +62,7 @@ void EncoderParent::clear() { Encoder::Encoder(const char *_name, encoder_handle_t _handler) : EncoderParent(_handler) { - setName(_name); fastmode = true; - pressmode = false; -} - -void Encoder::setName(const char *_name) { - if (_name != NULL) - m_strncpy_fill(name, _name, 4); - name[3] = '\0'; } int Encoder::update_rotations(encoder_t *enc) { @@ -103,7 +95,7 @@ int Encoder::update_rotations(encoder_t *enc) { int Encoder::update(encoder_t *enc) { int inc = update_rotations(enc); - inc = inc + (pressmode ? 0 : (fastmode ? 4 * enc->button : enc->button)); + inc = inc + (fastmode ? 4 * enc->button : enc->button); cur += inc; return cur; diff --git a/avr/cores/megacommand/GUI/Encoders.h b/avr/cores/megacommand/GUI/Encoders.h index 0af1657c0..c87d2d8c4 100644 --- a/avr/cores/megacommand/GUI/Encoders.h +++ b/avr/cores/megacommand/GUI/Encoders.h @@ -105,30 +105,7 @@ class Encoder : public EncoderParent { /** Short name. **/ public: Encoder(const char *_name = NULL, encoder_handle_t _handler = NULL); - // } - //) : public EncoderParent(encoder_handle_t _handler); - char name[4]; - /** - * If this variable is set to true, and pressmode to false, an - * encoder-turn with the encoder pressed down will lead to an - * increment by 5 times the value (default true). - * - * This will work with the parent update() method, not if update() - * is overloaded. - **/ bool fastmode; - /** - * If this variable is set to true, turning the encoder while the - * button is pressed will have no effect on the encoder value. - * - * This will work with the parent update() method, not if update() - * is overloaded. - **/ - bool pressmode; - /** Returns the encoder name. **/ - virtual char *getName() { return name; } - /** Set the encoder name (max 3 characters). **/ - virtual void setName(const char *_name); /** * Updates the value of an encoder according to the movements of the * hardware (recorded in the encoder_t structure). The default diff --git a/avr/cores/megacommand/MCL/GridEncoder.cpp b/avr/cores/megacommand/MCL/GridEncoder.cpp deleted file mode 100644 index e214a69aa..000000000 --- a/avr/cores/megacommand/MCL/GridEncoder.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include "MCL_impl.h" - -int GridEncoder::update(encoder_t *enc) { - uint8_t amount = abs(enc->normal); - int inc = 0; - - while (amount > 0) { - if (enc->normal > 0) { - rot_counter_up += 1; - if (rot_counter_up > rot_res) { - rot_counter_up = 0; - inc += 1; - } - rot_counter_down = 0; - } - if (enc->normal < 0) { - rot_counter_down += 1; - if (rot_counter_down > rot_res) { - rot_counter_down = 0; - inc -= 1; - } - - rot_counter_up = 0; - } - amount--; - } - inc = inc + (pressmode ? 0 : (fastmode ? 5 * enc->button : enc->button)); - cur = limit_value(cur, inc, min, max); - - return cur; -} - -void GridEncoder::displayAt(int i) {} diff --git a/avr/cores/megacommand/MCL/GridEncoder.h b/avr/cores/megacommand/MCL/GridEncoder.h deleted file mode 100644 index bdd47b2fc..000000000 --- a/avr/cores/megacommand/MCL/GridEncoder.h +++ /dev/null @@ -1,69 +0,0 @@ -/* Copyright 2018, Justin Mammarella jmamma@gmail.com */ - -#ifndef GRIDENCODER_H__ -#define GRIDENCODER_H__ - -#include "GUI.h" - -class GridEncoder : public Encoder { - /** - \addtogroup gui_rangeencoder_class - @{ - **/ - -public: - /** Minimum value of the encoder. **/ - int min; - /** Maximum value of the encoder. **/ - int max; - - uint8_t fxparam; - uint8_t effect; - uint8_t num; - bool scroll_fastmode = false; - /** - Create a new range-limited encoder with max and min value, short - name, initial value, and handling function. The initRangeEncoder - will be called with the constructor arguments. - **/ - - GridEncoder(int _max = 127, int _min = 0, int res = 1) { - initGridEncoder(_max, _min, (int)0, res, - (encoder_handle_t)NULL); - } - - /** - Initialize the encoder with the same argument as the constructor. - - The initRangeEncoder functions automatically determines which of - min and max is the minimum value. As of now this can't be used to - have an "inverted" encoder. - - The initial value is called without calling the handling function. - **/ - void initGridEncoder(int _max = 128, int _min = 0, - int init = 0, int res = 1, - encoder_handle_t _handler = NULL) { - rot_res = res; - handler = _handler; - if (_min > _max) { - min = _max; - max = _min; - } else { - min = _min; - max = _max; - } - setValue(init); - } - - /** - Update the value of the encoder according to pressmode and - fastmode, and limit the resulting value using limit_value(). - **/ - virtual int update(encoder_t *enc); - virtual void displayAt(int i); - - /* @} */ -}; - -#endif /* GRIDENCODER_H__ */ diff --git a/avr/cores/megacommand/MCL/GridPage.h b/avr/cores/megacommand/MCL/GridPage.h index 05ab57d28..6919d0a02 100644 --- a/avr/cores/megacommand/MCL/GridPage.h +++ b/avr/cores/megacommand/MCL/GridPage.h @@ -4,7 +4,6 @@ #define GRIDPAGE_H__ #include "GUI.h" -#include "GridEncoder.h" #include "GridRowHeader.h" #define MAX_VISIBLE_ROWS 4 diff --git a/avr/cores/megacommand/MCL/GridPages.h b/avr/cores/megacommand/MCL/GridPages.h index 108c1ffb3..f2ceb1d34 100644 --- a/avr/cores/megacommand/MCL/GridPages.h +++ b/avr/cores/megacommand/MCL/GridPages.h @@ -7,7 +7,6 @@ #define ENCODER_RES_GRID 1 #define ENCODER_RES_PAT 2 -#include "GridEncoder.h" #include "GridPage.h" #include "MCLEncoder.h" diff --git a/avr/cores/megacommand/MCL/MCLEncoder.cpp b/avr/cores/megacommand/MCL/MCLEncoder.cpp index 60f4290d7..8705b33f7 100644 --- a/avr/cores/megacommand/MCL/MCLEncoder.cpp +++ b/avr/cores/megacommand/MCL/MCLEncoder.cpp @@ -3,7 +3,7 @@ int MCLEncoder::update(encoder_t *enc) { int inc = update_rotations(enc); - inc = inc + (pressmode ? 0 : (fastmode ? 4 * enc->button : enc->button)); + inc = inc + fastmode ? 4 * enc->button : enc->button; cur = limit_value(cur, inc, min, max); return cur; @@ -12,7 +12,7 @@ int MCLEncoder::update(encoder_t *enc) { int MCLExpEncoder::update(encoder_t *enc) { int inc = update_rotations(enc); - if (!pressmode && fastmode && inc != 0) { + if (fastmode && inc != 0) { int8_t r = 0; while (cur >>= 1) { r++; diff --git a/avr/cores/megacommand/MCL/MCL_impl.h b/avr/cores/megacommand/MCL/MCL_impl.h index 05d7b4652..324838629 100644 --- a/avr/cores/megacommand/MCL/MCL_impl.h +++ b/avr/cores/megacommand/MCL/MCL_impl.h @@ -57,7 +57,6 @@ #include "AuxPages.h" #include "GridPages.h" -#include "GridEncoder.h" #include "MCLEncoder.h" #include "Grid.h" From 13c842d5cb46f4254ec80d554591e742e1db8106 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 19 Jun 2023 18:13:09 +1000 Subject: [PATCH 053/413] Remove verticle range check with deleting automation --- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index 76c3bdfff..fda40c536 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -883,16 +883,16 @@ bool ExtSeqTrack::del_track_locks(int16_t cur_x, uint8_t lock_idx, end = start_idx; bool ret = false; - uint8_t r = 2; + uint8_t r = 4; for (uint8_t n = step; n < min(length, step + 3); n++) { end += timing_buckets.get(n); for (; start_idx < end; start_idx++) { DEBUG_DUMP(start_idx); uint8_t i = start_idx; - if (!events[i].is_lock || events[i].lock_idx != lock_idx || - (events[i].event_value > value + r || - events[i].event_value < min(0, value - r))) + if (!events[i].is_lock || events[i].lock_idx != lock_idx) + //|| (events[i].event_value > value + r || + //events[i].event_value < min(0, value - r))) continue; int16_t event_x = n * timing_mid + events[i].micro_timing - timing_mid; if (event_x == cur_x || (event_x <= cur_x + r && event_x >= cur_x - r)) { From 0ecf8b8020a75e1fe01fe264bd4ad9507525f109 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 19 Jun 2023 18:36:48 +1000 Subject: [PATCH 054/413] improve cursor movement for automation editing --- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index 6ffb533b5..0ad5b5556 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -834,13 +834,18 @@ bool SeqExtStepPage::handleEvent(gui_event_t *event) { int w = timing_mid; if (trig_interface.is_key_down(MDX_KEY_FUNC)) { inc = 4; - if (pianoroll_mode > 0) { inc = 8; } w = w * 2; } if (pianoroll_mode > 0) { - w = inc; + inc = 1; + w = seq_extparam4.cur / 2; + if (trig_interface.is_key_down(MDX_KEY_FUNC)) { + w *= 2; + inc = 8; + } } + if (event->mask == EVENT_BUTTON_PRESSED) { if (trig_interface.is_key_down(MDX_KEY_YES)) { w = 1; From 191559458c5263effba8f4f6be90fc43d0540eb1 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 20 Jun 2023 22:10:57 +1000 Subject: [PATCH 055/413] Simplify SoundBrowser GUI, remove MDSound features --- avr/cores/megacommand/MCL/FileBrowserPage.cpp | 123 ++++++------- avr/cores/megacommand/MCL/FileBrowserPage.h | 83 +++++++-- avr/cores/megacommand/MCL/LoadProjectPage.cpp | 1 + .../megacommand/MCL/SoundBrowserPage.cpp | 172 +++++------------- avr/cores/megacommand/MCL/SoundBrowserPage.h | 6 +- avr/cores/megacommand/MCL/WavDesigner.cpp | 1 - 6 files changed, 172 insertions(+), 214 deletions(-) diff --git a/avr/cores/megacommand/MCL/FileBrowserPage.cpp b/avr/cores/megacommand/MCL/FileBrowserPage.cpp index 201321288..d9c71c1eb 100644 --- a/avr/cores/megacommand/MCL/FileBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/FileBrowserPage.cpp @@ -20,16 +20,15 @@ bool FileBrowserPage::show_filemenu = true; bool FileBrowserPage::show_overwrite = false; bool FileBrowserPage::show_samplemgr = false; -bool FileBrowserPage::show_filetypes = false; -uint8_t FileBrowserPage::filetype_idx = 0; -uint8_t FileBrowserPage::filetype_max = 0; -const char *FileBrowserPage::filetypes[MAX_FT_SELECT]; -const char *FileBrowserPage::filetype_names[MAX_FT_SELECT]; bool FileBrowserPage::filemenu_active = false; bool FileBrowserPage::call_handle_filemenu = false; +FileSystemPosition FileBrowserPage::position; + +FileBrowserFileTypes FileBrowserPage::file_types; + void FileBrowserPage::cleanup() { // always call setup() when entering this page. this->isSetup = false; @@ -41,7 +40,7 @@ void FileBrowserPage::setup() { // strcpy(match, mcl); strcpy(title, "Files"); SD.chdir(); - strcpy(lwd,"/"); + strcpy(lwd, "/"); } void FileBrowserPage::get_entry(uint16_t n, const char *entry) { @@ -65,15 +64,6 @@ bool FileBrowserPage::add_entry(const char *entry) { } void FileBrowserPage::query_filesystem() { - if (show_filetypes) { - if (filetype_idx > filetype_max) - filetype_idx = filetype_max; - if (filetype_idx < 0) - filetype_idx = 0; - strcpy(match, filetypes[filetype_idx]); - ((MCLEncoder *)param1)->min = 0; - ((MCLEncoder *)param1)->max = filetype_max; - } char temp_entry[FILE_ENTRY_SIZE]; call_handle_filemenu = false; @@ -99,23 +89,21 @@ void FileBrowserPage::query_filesystem() { d.rewind(); numEntries = 0; cur_file = 255; + +// cur_row = 0; + encoders[1]->cur = 1; + encoders[2]->cur = 1; + if (show_save) { - if (filetype_idx == FILETYPE_WAV) { - add_entry("[ RECV ]"); - } else { - add_entry("[ SAVE ]"); - } + add_entry("[ RECV ]"); } - //SD.vwd()->getName(temp_entry, FILE_ENTRY_SIZE); - //SD.vwd()->getName(temp_entry, FILE_ENTRY_SIZE); + // SD.vwd()->getName(temp_entry, FILE_ENTRY_SIZE); + // SD.vwd()->getName(temp_entry, FILE_ENTRY_SIZE); file.getName(temp_entry, FILE_ENTRY_SIZE); if ((show_parent) && !(strcmp(temp_entry, "/") == 0)) { add_entry(".."); } - cur_row = 1; - encoders[1]->cur = 1; - encoders[1]->old = 1; // iterate through the files while (file.openNext(&d, O_READ) && (numEntries < MAX_ENTRIES)) { for (uint8_t c = 0; c < FILE_ENTRY_SIZE; c++) { @@ -131,10 +119,7 @@ void FileBrowserPage::query_filesystem() { is_match_file = true; } else { // XXX only 3char suffix - char *arg1 = &temp_entry[strlen(temp_entry) - 4]; - if (strcmp(arg1, match) == 0) { - is_match_file = true; - } + is_match_file = file_types.compare(&temp_entry[strlen(temp_entry) - 4]); } if (is_match_file && (strlen(temp_entry) > 0)) { DEBUG_PRINTLN(F("file matched")); @@ -142,7 +127,6 @@ void FileBrowserPage::query_filesystem() { if (strcmp(temp_entry, mcl_cfg.project) == 0) { DEBUG_DUMP(temp_entry); DEBUG_DUMP(mcl_cfg.project); - cur_file = numEntries - 1; encoders[1]->cur = numEntries - 1; } @@ -163,7 +147,7 @@ void FileBrowserPage::query_filesystem() { void FileBrowserPage::init() { filemenu_active = false; show_samplemgr = false; - show_filetypes = false; + file_types.reset(); query_filesystem(); } @@ -216,15 +200,6 @@ void FileBrowserPage::display() { draw_scrollbar(120); } - if (show_filetypes) { - oled_display.setTextColor(WHITE, BLACK); - for (int i = 0; i <= filetype_max; ++i) { - oled_display.setCursor(2, 17 + i * 7); - oled_display.println(filetype_names[i]); - } - oled_display.fillRect(0, 11 + filetype_idx * 7, 35, 7, INVERT); - } - oled_display.display(); return; } @@ -254,12 +229,6 @@ void FileBrowserPage::loop() { // MD.assignMachine(0, encoders[1]->cur); cur_row = new_val; } - - if (show_filetypes && param1->hasChanged()) { - filetype_idx = param1->cur; - chdir_type(); - init(); - } } bool FileBrowserPage::create_folder() { @@ -307,6 +276,12 @@ void FileBrowserPage::_cd_up() { DEBUG_PRINTLN("bad directory change"); } init(); + uint16_t pos = 0; + uint8_t row = 0; + position.pop(pos, row); + encoders[1]->cur = pos; + encoders[1]->old = pos; + cur_row = row; } bool FileBrowserPage::_cd(const char *child) { @@ -315,6 +290,7 @@ bool FileBrowserPage::_cd(const char *child) { DEBUG_PRINTLN(lwd); + file.close(); char *ptr = child; @@ -329,7 +305,6 @@ bool FileBrowserPage::_cd(const char *child) { return false; } - uint8_t len_lwd = strlen(lwd); if (len_lwd == 1) { @@ -346,7 +321,10 @@ bool FileBrowserPage::_cd(const char *child) { } strcat(lwd, child); DEBUG_PRINTLN(lwd); + uint16_t pos = encoders[1]->getValue(); + uint8_t row = cur_row; init(); + position.push(pos, row); return true; } @@ -410,19 +388,20 @@ bool FileBrowserPage::_handle_filemenu() { bool FileBrowserPage::rm_dir(const char *dir) { char temp_entry[FILE_ENTRY_SIZE]; - //SD.vwd()->getName(temp_entry, FILE_ENTRY_SIZE); + // SD.vwd()->getName(temp_entry, FILE_ENTRY_SIZE); DEBUG_PRINTLN("preparing to delete"); DEBUG_PRINTLN(dir); if (_cd(dir)) { File d; d.open(lwd); d.rewind(); - // bool ret = SD.vwd()->rmRfStar(); // extra 276 bytes + // bool ret = SD.vwd()->rmRfStar(); // extra 276 bytes while (file.openNext(&d, O_READ)) { - file.getName(temp_entry, FILE_ENTRY_SIZE); - DEBUG_PRINT("deleting "); DEBUG_PRINTLN(temp_entry); - file.close(); - SD.remove(temp_entry); + file.getName(temp_entry, FILE_ENTRY_SIZE); + DEBUG_PRINT("deleting "); + DEBUG_PRINTLN(temp_entry); + file.close(); + SD.remove(temp_entry); } SD.chdir("/"); _cd_up(); @@ -461,6 +440,8 @@ bool FileBrowserPage::handleEvent(gui_event_t *event) { if (note_interface.is_event(event)) { return false; } + bool dir_only = false; + if (EVENT_CMD(event)) { uint8_t key = event->source - 64; if (event->mask == EVENT_BUTTON_PRESSED) { @@ -482,11 +463,11 @@ bool FileBrowserPage::handleEvent(gui_event_t *event) { encoders[1]->cur += inc; break; case MDX_KEY_LEFT: - encoders[0]->cur -= inc; + _cd_up(); break; case MDX_KEY_RIGHT: - encoders[0]->cur += inc; - break; + dir_only = true; + goto YES; } } } @@ -514,23 +495,26 @@ bool FileBrowserPage::handleEvent(gui_event_t *event) { int i_save; _calcindices(i_save); - if (encoders[1]->getValue() == i_save) { - on_new(); - return true; - } - char temp_entry[FILE_ENTRY_SIZE]; get_entry(encoders[1]->getValue(), temp_entry); + if (!dir_only) { - // chdir to parent - if ((temp_entry[0] == '.') && (temp_entry[1] == '.')) { - _cd_up(); - return true; - } + if (encoders[1]->getValue() == i_save) { + on_new(); + return true; + } + // chdir to parent + if ((temp_entry[0] == '.') && (temp_entry[1] == '.')) { + _cd_up(); + return true; + } + } DEBUG_DUMP(temp_entry); // chdir to child if (!show_samplemgr) { + + child: file.open(temp_entry, O_READ); // chdir to child if (!select_dirs && file.isDirectory()) { @@ -539,9 +523,10 @@ bool FileBrowserPage::handleEvent(gui_event_t *event) { } } - // select an entry - GUI.ignoreNextEvent(event->source); - on_select(temp_entry); + if (!dir_only) { + GUI.ignoreNextEvent(event->source); + on_select(temp_entry); + } return true; } diff --git a/avr/cores/megacommand/MCL/FileBrowserPage.h b/avr/cores/megacommand/MCL/FileBrowserPage.h index a174fc0aa..0943d3152 100644 --- a/avr/cores/megacommand/MCL/FileBrowserPage.h +++ b/avr/cores/megacommand/MCL/FileBrowserPage.h @@ -5,10 +5,10 @@ #include "GUI.h" #include "MCLEncoder.h" -#include "SdFat.h" -#include "SeqPage.h" #include "Menu.h" #include "MenuPage.h" +#include "SdFat.h" +#include "SeqPage.h" #define MAX_ENTRIES 1024 @@ -31,7 +31,60 @@ #define FM_RECVALL 5 #define FM_SENDALL 6 -#define FILETYPE_WAV 1 +class FileBrowserFileTypes { + constexpr static uint8_t size = 2; + char types[size][5]; + uint8_t count = 0; + public: + void add(char *str) { + if (count < size) { + strcpy(types[count], str); + count++; + } + } + void reset() { count = 0; } + + bool compare(char *str) { + for (uint8_t n = 0; n < count; n++) { + DEBUG_PRINT("Comparing "); DEBUG_PRINT(str); DEBUG_PRINT(" "); DEBUG_PRINTLN(types[n]); + if (strcmp(str, types[n]) == 0) { + DEBUG_PRINTLN("match"); + return true; + } + } + return false; + } +}; + +class FileSystemPosition { + constexpr static uint8_t size = 8; + uint16_t last_pos[8]; + uint8_t last_cur_row[8]; + uint8_t depth; + public: + void push(uint16_t pos, uint8_t row) { + if (depth < size) { + last_pos[depth] = pos; + last_cur_row[depth] = row; + } + depth++; + } + void pop(uint16_t &pos, uint8_t &row) { + if (depth != 0) { + depth--; + if (depth >= size) { + goto end; + } + pos = last_pos[depth]; + row = last_cur_row[depth]; + return true; + } + end: + pos = 1; + row = 1; + } + void reset() { depth = 0; } +}; class FileBrowserPage : public LightPage { public: @@ -55,26 +108,25 @@ class FileBrowserPage : public LightPage { static bool show_overwrite; static bool show_samplemgr; - static bool show_filetypes; - static uint8_t filetype_idx; - static uint8_t filetype_max; - static const char* filetypes[MAX_FT_SELECT]; - static const char* filetype_names[MAX_FT_SELECT]; static bool filemenu_active; static bool call_handle_filemenu; - Encoder* param1; - Encoder* param2; + static FileBrowserFileTypes file_types; + + static FileSystemPosition position; + + Encoder *param1; + Encoder *param2; FileBrowserPage(Encoder *e1 = NULL, Encoder *e2 = NULL, Encoder *e3 = NULL, Encoder *e4 = NULL) : LightPage(e1, e2, e3, e4) { - param1 = e1; - param2 = e2; - lwd[0] = '\0'; - } + param1 = e1; + param2 = e2; + lwd[0] = '\0'; + } virtual bool handleEvent(gui_event_t *event); virtual void display(); @@ -100,14 +152,13 @@ class FileBrowserPage : public LightPage { virtual void on_cancel() { GUI.popPage(); } virtual void chdir_type() {} virtual bool _handle_filemenu(); + protected: void _cd_up(); bool _cd(const char *); - void query_filesystem(); private: - void _calcindices(int &); }; diff --git a/avr/cores/megacommand/MCL/LoadProjectPage.cpp b/avr/cores/megacommand/MCL/LoadProjectPage.cpp index feef26a4c..4710bd8c2 100644 --- a/avr/cores/megacommand/MCL/LoadProjectPage.cpp +++ b/avr/cores/megacommand/MCL/LoadProjectPage.cpp @@ -1,5 +1,6 @@ #include "MCL_impl.h" + void LoadProjectPage::init() { DEBUG_PRINT_FN(); diff --git a/avr/cores/megacommand/MCL/SoundBrowserPage.cpp b/avr/cores/megacommand/MCL/SoundBrowserPage.cpp index 5ec186012..58c929259 100644 --- a/avr/cores/megacommand/MCL/SoundBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/SoundBrowserPage.cpp @@ -1,157 +1,92 @@ #include "MCL_impl.h" #include "ResourceManager.h" -const char *c_sound_root = "/Sounds/MD"; const char *c_wav_root = "/Samples/WAV"; const char *c_syx_root = "/Samples/SYX"; -const char *c_snd_suffix = ".snd"; const char *c_wav_suffix = ".wav"; const char *c_syx_suffix = ".syx"; -const char *c_snd_name = "SOUND"; const char *c_wav_name = "WAV"; const char *c_syx_name = "SYSEX"; static bool s_query_returned = false; void SoundBrowserPage::setup() { - SD.mkdir(c_sound_root, true); SD.mkdir(c_wav_root, true); SD.mkdir(c_syx_root, true); - show_samplemgr = false; sysex = &(Midi.midiSysex); + show_samplemgr = false; FileBrowserPage::setup(); - chdir_type(); -} - -void SoundBrowserPage::chdir_type() { - DEBUG_PRINTLN("chdir type"); - if (filetype_idx == FT_WAV) { - _cd(c_wav_root); - } - else if (filetype_idx == FT_SND) { - _cd(c_sound_root); - } - else { - _cd(c_syx_root); - } + _cd(c_wav_root); + position.reset(); } void SoundBrowserPage::init() { + file_types.reset(); + file_types.add(c_wav_suffix); + file_types.add(c_syx_suffix); + trig_interface.off(); filemenu_active = false; select_dirs = false; - - filetypes[0] = c_snd_suffix; - filetypes[1] = c_wav_suffix; - filetypes[2] = c_syx_suffix; - filetype_names[0] = c_snd_name; - filetype_names[1] = c_wav_name; - filetype_names[2] = c_syx_name; - filetype_max = FT_SYX; - show_overwrite = false; + if (show_samplemgr) { strcpy(title, "MD-ROM"); show_dirs = false; show_save = false; show_filemenu = false; show_new_folder = false; - show_filetypes = false; show_parent = false; query_sample_slots(); } else { - strcpy(match, ".snd"); strcpy(title, "Select:"); show_dirs = true; - show_save = (filetype_idx != FT_SYX); + show_save = true; show_filemenu = true; show_new_folder = true; - show_filetypes = true; show_parent = true; query_filesystem(); + } R.Clear(); R.use_machine_names_short(); } -void SoundBrowserPage::save_sound() { - - MDSound sound; - char sound_name[9] = " "; - - grid_page.prepare(); - memcpy(sound_name, MD.kit.name, 4); - const char *tmp = getMDMachineNameShort(MD.kit.get_model(MD.currentTrack), 2); - copyMachineNameShort(tmp, sound_name + 4); - sound_name[6] = '\0'; - - if (mcl_gui.wait_for_input(sound_name, "Sound Name", 8)) { - char temp_entry[FILE_ENTRY_SIZE]; - strcpy(temp_entry, sound_name); - strcat(temp_entry, ".snd"); - sound.file.open(temp_entry, O_RDWR | O_CREAT); - sound.fetch_sound(MD.currentTrack); - sound.write_sound(); - sound.file.close(); - gfx.alert("File Saved", temp_entry); - } -} - -void SoundBrowserPage::load_sound() { - - grid_page.prepare(); - if (file.isOpen()) { - char temp_entry[FILE_ENTRY_SIZE]; - MDSound sound; - file.getName(temp_entry, FILE_ENTRY_SIZE); - file.close(); - DEBUG_PRINTLN(F("loading sound")); - DEBUG_PRINTLN(temp_entry); - if (!sound.file.open(temp_entry, O_READ)) { - gfx.alert("Error", "Opening"); - return; - } - sound.read_sound(); - if (sound.id != SOUND_ID) { - sound.file.close(); - gfx.alert("Error", "Not compatible"); - return; - } - sound.load_sound(MD.currentTrack); - gfx.alert("Loaded", "Sound"); - sound.file.close(); - } -} - // send current selected sample file to slot -void SoundBrowserPage::send_sample(int slot, bool is_syx, char *newname, bool silent) { +void SoundBrowserPage::send_sample(int slot, char *newname, bool silent) { bool success; if (file.isOpen()) { char temp_entry[FILE_ENTRY_SIZE]; file.getName(temp_entry, FILE_ENTRY_SIZE); file.close(); + bool is_syx = + strcmp(c_syx_suffix, &temp_entry[strlen(temp_entry) - 4]) == 0; if (!silent) { - if (!mcl_gui.wait_for_confirm("Sample Slot", "Overwrite?")) { - return; - } + if (!mcl_gui.wait_for_confirm("Sample Slot", "Overwrite?")) { + return; + } } if (is_syx) { success = midi_sds.sendSyx(temp_entry, slot); } else { char *ptr = newname; if (newname == nullptr) { - if (isdigit(temp_entry[0]) && isdigit(temp_entry[1]) && (temp_entry[2] != '.') && (temp_entry[2] != '\0')) { ptr = temp_entry + 2; } + if (isdigit(temp_entry[0]) && isdigit(temp_entry[1]) && + (temp_entry[2] != '.') && (temp_entry[2] != '\0')) { + ptr = temp_entry + 2; + } } - success = midi_sds.sendWav(temp_entry, ptr, slot, /* show progress */ true); + success = + midi_sds.sendWav(temp_entry, ptr, slot, /* show progress */ true); } if (!silent) { - if (success) { - gfx.alert("Sample sent", temp_entry); - } else { - gfx.alert("Send failed", temp_entry); - } + if (success) { + gfx.alert("Sample sent", temp_entry); + } else { + gfx.alert("Send failed", temp_entry); + } } } } @@ -190,16 +125,9 @@ void SoundBrowserPage::recv_wav(int slot, bool silent) { void SoundBrowserPage::on_new() { if (!show_samplemgr) { - switch (filetype_idx) { - case FT_SND: - save_sound(); - break; - case FT_WAV: - pending_action = PA_NEW; - show_samplemgr = true; - show_ram_slots = true; - break; - } + pending_action = PA_NEW; + show_samplemgr = true; + show_ram_slots = true; init(); } else { // shouldn't happen. @@ -215,24 +143,17 @@ void SoundBrowserPage::on_cancel() { show_samplemgr = false; } else { // TODO cd .. ? - _cd_up(); + _cd_up(); } } void SoundBrowserPage::on_select(const char *__) { if (!show_samplemgr) { - switch (filetype_idx) { - case FT_SND: - load_sound(); - break; - case FT_WAV: - case FT_SYX: - pending_action = PA_SELECT; - show_samplemgr = true; - show_ram_slots = false; - init(); - break; - } + pending_action = PA_SELECT; + show_samplemgr = true; + show_ram_slots = false; + DEBUG_PRINTLN("on select"); + init(); } else { auto slot = encoders[1]->cur; switch (pending_action) { @@ -240,7 +161,7 @@ void SoundBrowserPage::on_select(const char *__) { recv_wav(slot); break; case PA_SELECT: - send_sample(slot, (filetype_idx == FT_SYX)); + send_sample(slot); break; } pending_action = 0; @@ -252,7 +173,7 @@ void SoundBrowserPage::on_select(const char *__) { bool SoundBrowserPage::handleEvent(gui_event_t *event) { if (EVENT_PRESSED(event, Buttons.BUTTON3) && show_filemenu) { FileBrowserPage::handleEvent(event); - bool state = (param2->cur == 0) && filetype_idx == FILETYPE_WAV; + bool state = (param2->cur == 0); file_menu_page.menu.enable_entry(FM_NEW_FOLDER, !state); file_menu_page.menu.enable_entry(FM_DELETE, !state); // delete file_menu_page.menu.enable_entry(FM_RENAME, !state); // rename @@ -335,7 +256,9 @@ bool SoundBrowserPage::_handle_filemenu() { char wav_name[FILE_ENTRY_SIZE] = ""; get_entry(n, wav_name); DEBUG_PRINTLN(wav_name); - if (wav_name[5] != '[') { recv_wav(n, true); } + if (wav_name[5] != '[') { + recv_wav(n, true); + } } end: show_samplemgr = false; @@ -350,17 +273,20 @@ bool SoundBrowserPage::_handle_filemenu() { for (uint8_t n = 0; n < numEntries; n++) { get_entry(n, wav_name); DEBUG_PRINTLN(wav_name); - if (!isdigit(wav_name[0]) || !isdigit(wav_name[1])) continue; + if (!isdigit(wav_name[0]) || !isdigit(wav_name[1])) + continue; uint8_t slot = (wav_name[0] - '0') * 10 + wav_name[1] - '0' - 1; DEBUG_PRINTLN("slot pos:"); DEBUG_PRINTLN(slot); - DEBUG_PRINTLN((uint8_t) wav_name[0]); - DEBUG_PRINTLN((uint8_t) wav_name[1]); - if (slot > 48) { continue; } + DEBUG_PRINTLN((uint8_t)wav_name[0]); + DEBUG_PRINTLN((uint8_t)wav_name[1]); + if (slot > 48) { + continue; + } file.open(wav_name); mcl_gui.draw_progress("Send Samples", n, numEntries); - send_sample(slot, false, wav_name + 2, true); + send_sample(slot, wav_name + 2, true); } break; } diff --git a/avr/cores/megacommand/MCL/SoundBrowserPage.h b/avr/cores/megacommand/MCL/SoundBrowserPage.h index c611ce831..620be3de3 100644 --- a/avr/cores/megacommand/MCL/SoundBrowserPage.h +++ b/avr/cores/megacommand/MCL/SoundBrowserPage.h @@ -29,17 +29,13 @@ class SoundBrowserPage : public FileBrowserPage, public MidiSysexListenerClass { virtual void on_new(); virtual void on_select(const char*); virtual void on_cancel(); - virtual void chdir_type(); virtual bool handleEvent(gui_event_t *event); void draw_scrollbar(uint8_t x_offset); void init(); void setup(); - void save_sound(); - void load_sound(); - void send_sample(int slot, bool is_syx, char *newname = nullptr, bool silent = false); + void send_sample(int slot, char *newname = nullptr, bool silent = false); void recv_wav(int slot, bool silent = false); - // MidiSysexListenerClass virtual void start(); virtual void end(); virtual bool _handle_filemenu(); diff --git a/avr/cores/megacommand/MCL/WavDesigner.cpp b/avr/cores/megacommand/MCL/WavDesigner.cpp index 9f3dbb6c8..84414d822 100644 --- a/avr/cores/megacommand/MCL/WavDesigner.cpp +++ b/avr/cores/megacommand/MCL/WavDesigner.cpp @@ -11,7 +11,6 @@ void WavDesigner::prompt_send() { GUI.pushPage(&sound_browser); sound_browser.show_samplemgr = true; sound_browser.pending_action = PA_SELECT; - sound_browser.filetype_idx = FT_WAV; sound_browser.setup(); sound_browser.show_samplemgr = true; wd.render(); From 3b77011707cc028602d3263b495d2a4d34a56263 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 20 Jun 2023 22:45:05 +1000 Subject: [PATCH 056/413] encoder bug --- avr/cores/megacommand/MCL/MCLEncoder.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/MCLEncoder.cpp b/avr/cores/megacommand/MCL/MCLEncoder.cpp index 8705b33f7..ffaa6e703 100644 --- a/avr/cores/megacommand/MCL/MCLEncoder.cpp +++ b/avr/cores/megacommand/MCL/MCLEncoder.cpp @@ -3,7 +3,7 @@ int MCLEncoder::update(encoder_t *enc) { int inc = update_rotations(enc); - inc = inc + fastmode ? 4 * enc->button : enc->button; + inc = inc + (fastmode ? 4 * enc->button : enc->button); cur = limit_value(cur, inc, min, max); return cur; From 31d7a973ee52858edf3008bfe187e56eaa1ea66c Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 21 Jun 2023 00:23:18 +1000 Subject: [PATCH 057/413] Simplify note triggering in SeqPtcPage. Allow ExtMIDI to be played via MD --- avr/cores/megacommand/MCL/SeqPtcPage.cpp | 69 +++++++++++++----------- avr/cores/megacommand/MCL/SeqPtcPage.h | 4 ++ 2 files changed, 42 insertions(+), 31 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.cpp b/avr/cores/megacommand/MCL/SeqPtcPage.cpp index 73b1f164c..994175de8 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPtcPage.cpp @@ -88,11 +88,7 @@ void SeqPtcPage::init() { DEBUG_PRINTLN(mcl_cfg.uart2_ctrl_chan); trig_interface.on(); trig_interface.send_md_leds(TRIGLED_EXCLUSIVE); - if (mcl_cfg.uart2_ctrl_chan == MIDI_LOCAL_MODE) { - trig_interface.on(); - } else { - trig_interface.off(); - } + trig_interface.on(); config(); re_init = false; } @@ -499,6 +495,7 @@ bool SeqPtcPage::handleEvent(gui_event_t *event) { return true; } + /* if (mask == EVENT_BUTTON_PRESSED) { SET_BIT128_P(dev_note_masks[0], note); } else { @@ -508,31 +505,26 @@ bool SeqPtcPage::handleEvent(gui_event_t *event) { uint8_t pitch = calc_scale_note(note); if (pitch > 127) return false; - DEBUG_PRINTLN(F("yep")); + */ // note interface presses are treated as musical notes here - if (mask == EVENT_BUTTON_PRESSED) { + scale_padding = false; + bool is_md = midi_device == &MD; + uint8_t channel_event = NO_EVENT; + + if (is_md) { + note += MIDI_NOTE_C4; + bool is_poly = IS_BIT_SET16(mcl_cfg.poly_mask, last_md_track); + channel_event = is_poly ? POLY_EVENT : CTRL_EVENT; + } - if (midi_device != &MD) { - midi_device = &MD; - config(); - } else { - config_encoders(); - } - scale_padding = false; + uint8_t msg[] = {MIDI_NOTE_ON | (is_md ? last_md_track : last_ext_track), + note, 127}; - SET_BIT128_P(note_mask, pitch); + if (mask == EVENT_BUTTON_PRESSED) { + midi_events.note_on(msg, channel_event); - arp_page.track_update(); - ArpSeqTrack *arp_track = &mcl_seq.md_arp_tracks[last_md_track]; - if ((!arp_track->enabled) || (MidiClock.state != 2)) { - trig_md(pitch + ptc_param_oct.cur * 12); - } - render_arp(false, device, last_md_track); } else if (mask == EVENT_BUTTON_RELEASED) { - if (arp_enabled.cur != ARP_LATCH) { - CLEAR_BIT128_P(note_mask, pitch); - render_arp(false, device, last_md_track); - } + midi_events.note_off(msg, channel_event); } trig_interface.send_md_leds(TRIGLED_EXCLUSIVE); @@ -615,7 +607,6 @@ bool SeqPtcPage::handleEvent(gui_event_t *event) { } uint8_t SeqPtcPage::seq_ext_pitch(uint8_t note_num) { - scale_padding = true; uint8_t pitch = calc_scale_note(note_num, scale_padding); return (pitch < 128) ? pitch : 255; } @@ -638,7 +629,7 @@ uint8_t SeqPtcPage::process_ext_event(uint8_t note_num, bool note_type, CLEAR_BIT128_P(seq_ptc_page.note_mask, pitch); } } - + if (pitch == 255) { return 255; } pitch += ptc_param_oct.cur * 12; return pitch; } @@ -666,6 +657,13 @@ uint8_t SeqPtcPage::is_md_midi(uint8_t channel) { } void SeqPtcMidiEvents::onNoteOnCallback_Midi2(uint8_t *msg) { + uint8_t channel = MIDI_VOICE_CHANNEL(msg[0]); + uint8_t channel_event = seq_ptc_page.is_md_midi(channel); + seq_ptc_page.scale_padding = true; + note_on(msg, channel_event); +} + +void SeqPtcMidiEvents::note_on(uint8_t *msg, uint8_t channel_event) { uint8_t note_num = msg[1]; uint8_t channel = MIDI_VOICE_CHANNEL(msg[0]); DEBUG_PRINTLN("note on"); @@ -679,12 +677,11 @@ void SeqPtcMidiEvents::onNoteOnCallback_Midi2(uint8_t *msg) { // uint8_t pitch; bool note_on = true; - uint8_t channel_event = seq_ptc_page.is_md_midi(channel); if (channel_event) { SeqPage::midi_device = midi_active_peering.get_device(UART1_PORT); - if (note_num < MIDI_NOTE_C4) { - if (mcl_cfg.md_trig_channel - 1 == channel) { + if (channel_event == TRIG_EVENT) { + if (note_num < MIDI_NOTE_C4) { uint8_t pos = note_num - MIDI_NOTE_C2; if (pos > 15) { return; @@ -741,6 +738,8 @@ void SeqPtcMidiEvents::onNoteOnCallback_Midi2(uint8_t *msg) { arp_page.track_update(); seq_ptc_page.render_arp(false, SeqPage::midi_device, n); + if (pitch == 255) + return; seq_extstep_page.set_cur_y(pitch); @@ -752,12 +751,18 @@ void SeqPtcMidiEvents::onNoteOnCallback_Midi2(uint8_t *msg) { } void SeqPtcMidiEvents::onNoteOffCallback_Midi2(uint8_t *msg) { + uint8_t channel = MIDI_VOICE_CHANNEL(msg[0]); + uint8_t channel_event = seq_ptc_page.is_md_midi(channel); + seq_ptc_page.scale_padding = true; + note_off(msg, channel_event); +} + +void SeqPtcMidiEvents::note_off(uint8_t *msg, uint8_t channel_event) { DEBUG_PRINTLN(F("note off midi2")); uint8_t note_num = msg[1]; uint8_t channel = MIDI_VOICE_CHANNEL(msg[0]); uint8_t pitch; - uint8_t channel_event = seq_ptc_page.is_md_midi(channel); if (channel_event) { if (note_num < MIDI_NOTE_C4) { return; @@ -786,6 +791,8 @@ void SeqPtcMidiEvents::onNoteOffCallback_Midi2(uint8_t *msg) { seq_ptc_page.render_arp(false, SeqPage::midi_device, n); arp_page.track_update(); + if (pitch == 255) + return; ArpSeqTrack *arp_track = &mcl_seq.ext_arp_tracks[last_ext_track]; if (!arp_track->enabled) { diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.h b/avr/cores/megacommand/MCL/SeqPtcPage.h index 2cc156e77..24b0d21f3 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.h +++ b/avr/cores/megacommand/MCL/SeqPtcPage.h @@ -26,8 +26,12 @@ class SeqPtcMidiEvents : public MidiCallback { void setup_callbacks(); void remove_callbacks(); + void note_on(uint8_t *msg, uint8_t channel_event); + void note_off(uint8_t *msg, uint8_t channel_event); + void onNoteOnCallback_Midi2(uint8_t *msg); void onNoteOffCallback_Midi2(uint8_t *msg); + void onControlChangeCallback_Midi(uint8_t *msg); void onControlChangeCallback_Midi2(uint8_t *msg); From 573d28b7649842c143a794e4c3dd0173f2719656 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 21 Jun 2023 11:13:51 +1000 Subject: [PATCH 058/413] scale_padding variable restore --- avr/cores/megacommand/MCL/SeqPtcPage.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.cpp b/avr/cores/megacommand/MCL/SeqPtcPage.cpp index 994175de8..8e09c7988 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPtcPage.cpp @@ -659,8 +659,19 @@ uint8_t SeqPtcPage::is_md_midi(uint8_t channel) { void SeqPtcMidiEvents::onNoteOnCallback_Midi2(uint8_t *msg) { uint8_t channel = MIDI_VOICE_CHANNEL(msg[0]); uint8_t channel_event = seq_ptc_page.is_md_midi(channel); + uint8_t scale_padding_old = seq_ptc_page.scale_padding; seq_ptc_page.scale_padding = true; note_on(msg, channel_event); + seq_ptc_page.scale_padding = scale_padding_old; +} + +void SeqPtcMidiEvents::onNoteOffCallback_Midi2(uint8_t *msg) { + uint8_t channel = MIDI_VOICE_CHANNEL(msg[0]); + uint8_t channel_event = seq_ptc_page.is_md_midi(channel); + uint8_t scale_padding_old = seq_ptc_page.scale_padding; + seq_ptc_page.scale_padding = true; + note_off(msg, channel_event); + seq_ptc_page.scale_padding = scale_padding_old; } void SeqPtcMidiEvents::note_on(uint8_t *msg, uint8_t channel_event) { @@ -750,13 +761,6 @@ void SeqPtcMidiEvents::note_on(uint8_t *msg, uint8_t channel_event) { return; } -void SeqPtcMidiEvents::onNoteOffCallback_Midi2(uint8_t *msg) { - uint8_t channel = MIDI_VOICE_CHANNEL(msg[0]); - uint8_t channel_event = seq_ptc_page.is_md_midi(channel); - seq_ptc_page.scale_padding = true; - note_off(msg, channel_event); -} - void SeqPtcMidiEvents::note_off(uint8_t *msg, uint8_t channel_event) { DEBUG_PRINTLN(F("note off midi2")); From 069736e513307db36669e641a1f69c36fac923d1 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 21 Jun 2023 11:26:21 +1000 Subject: [PATCH 059/413] Focus match for project name, now dynamic --- avr/cores/megacommand/MCL/FileBrowserPage.cpp | 5 +++-- avr/cores/megacommand/MCL/FileBrowserPage.h | 3 ++- avr/cores/megacommand/MCL/LoadProjectPage.cpp | 2 ++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/avr/cores/megacommand/MCL/FileBrowserPage.cpp b/avr/cores/megacommand/MCL/FileBrowserPage.cpp index d9c71c1eb..ef040bd11 100644 --- a/avr/cores/megacommand/MCL/FileBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/FileBrowserPage.cpp @@ -4,9 +4,9 @@ File FileBrowserPage::file; int FileBrowserPage::numEntries; -char FileBrowserPage::match[5]; char FileBrowserPage::lwd[128]; char FileBrowserPage::title[12]; +char FileBrowserPage::focus_match[14]; uint8_t FileBrowserPage::cur_col = 0; uint8_t FileBrowserPage::cur_row = 0; uint8_t FileBrowserPage::cur_file = 0; @@ -124,7 +124,7 @@ void FileBrowserPage::query_filesystem() { if (is_match_file && (strlen(temp_entry) > 0)) { DEBUG_PRINTLN(F("file matched")); if (add_entry(temp_entry)) { - if (strcmp(temp_entry, mcl_cfg.project) == 0) { + if (strlen(focus_match) > 0 && strcmp(temp_entry, focus_match) == 0) { DEBUG_DUMP(temp_entry); DEBUG_DUMP(mcl_cfg.project); cur_file = numEntries - 1; @@ -147,6 +147,7 @@ void FileBrowserPage::query_filesystem() { void FileBrowserPage::init() { filemenu_active = false; show_samplemgr = false; + strcpy(focus_match,""); file_types.reset(); query_filesystem(); } diff --git a/avr/cores/megacommand/MCL/FileBrowserPage.h b/avr/cores/megacommand/MCL/FileBrowserPage.h index 0943d3152..0846c76ef 100644 --- a/avr/cores/megacommand/MCL/FileBrowserPage.h +++ b/avr/cores/megacommand/MCL/FileBrowserPage.h @@ -91,9 +91,9 @@ class FileBrowserPage : public LightPage { static File file; static int numEntries; - static char match[5]; static char lwd[128]; static char title[12]; + static uint8_t cur_col; static uint8_t cur_row; static uint8_t cur_file; @@ -113,6 +113,7 @@ class FileBrowserPage : public LightPage { static bool call_handle_filemenu; + static char focus_match[PRJ_NAME_LEN]; static FileBrowserFileTypes file_types; static FileSystemPosition position; diff --git a/avr/cores/megacommand/MCL/LoadProjectPage.cpp b/avr/cores/megacommand/MCL/LoadProjectPage.cpp index 4710bd8c2..348a403a9 100644 --- a/avr/cores/megacommand/MCL/LoadProjectPage.cpp +++ b/avr/cores/megacommand/MCL/LoadProjectPage.cpp @@ -13,6 +13,8 @@ void LoadProjectPage::init() { show_overwrite = false; FileBrowserPage::init(); + strncpy(focus_match,mcl_cfg.project,PRJ_NAME_LEN); + query_filesystem(); } void LoadProjectPage::setup() { From a2059c0d71b4806caa6f88eee19c7227550f7f8e Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 21 Jun 2023 11:54:08 +1000 Subject: [PATCH 060/413] Remove insert rows functionality, replaced by multi grid copy/paste --- avr/cores/megacommand/MCL/GridPage.cpp | 30 ++------------------------ avr/cores/megacommand/MCL/MCLMenus.h | 2 +- resource/menu_layouts.cpp | 1 - 3 files changed, 3 insertions(+), 30 deletions(-) diff --git a/avr/cores/megacommand/MCL/GridPage.cpp b/avr/cores/megacommand/MCL/GridPage.cpp index 801dd5459..d0d7ca522 100644 --- a/avr/cores/megacommand/MCL/GridPage.cpp +++ b/avr/cores/megacommand/MCL/GridPage.cpp @@ -651,29 +651,6 @@ void GridPage::apply_slot_changes(bool ignore_undo, bool ignore_func) { uint8_t slot_update = 0; - if (insert_rows) { - int8_t row_count = GRID_LENGTH - getRow() - insert_rows; - uint8_t row_dst = getRow() + insert_rows; - if (row_dst > GRID_LENGTH || row_count < 1) { - return; - } - - if (mcl_gui.wait_for_confirm("Insert", "Rows?")) { - for (uint8_t g = 0; g < 2; g++) { - for (uint8_t n = 0; n < row_count; n++) { - if (n % 8) mcl_gui.draw_progress("INSERT ROWS", n + g * row_count, row_count * 2); - mcl_clipboard.copy(g * GRID_WIDTH, getRow() + row_count - n - insert_rows, - GRID_WIDTH, 1); - mcl_clipboard.paste(g * GRID_WIDTH, getRow() + row_count - n); - } - for (uint8_t n = 0; n < insert_rows; n++) { - proj.clear_row_grid(getRow() + n, g); - } - } - } - goto end; - } - if (slot_copy + slot_paste + slot_clear + slot_load + undo == 0) { if ((temp_slot.link.row != slot.link.row) || (temp_slot.link.loops != slot.link.loops) || @@ -808,8 +785,7 @@ void GridPage::apply_slot_changes(bool ignore_undo, bool ignore_func) { } end: - if ((slot_clear == 1) || (slot_paste == 1) || (slot_update == 1) || - (insert_rows == 1)) { + if ((slot_clear == 1) || (slot_paste == 1) || (slot_update == 1)) { proj.sync_grid(); } @@ -822,8 +798,7 @@ void GridPage::apply_slot_changes(bool ignore_undo, bool ignore_func) { load_old_col(); } - if ((slot_clear == 1) || (slot_paste == 1) || (slot_update == 1) || - (insert_rows == 1)) { + if ((slot_clear == 1) || (slot_paste == 1) || (slot_update == 1)) { load_slot_models(); } mcl_cfg.load_mode = load_mode_old; @@ -832,7 +807,6 @@ void GridPage::apply_slot_changes(bool ignore_undo, bool ignore_func) { slot_clear = 0; slot_copy = 0; slot_paste = 0; - insert_rows = 0; slot.load_from_grid(_col, getRow()); old_col = 255; } diff --git a/avr/cores/megacommand/MCL/MCLMenus.h b/avr/cores/megacommand/MCL/MCLMenus.h index 8425d5654..53400b20b 100644 --- a/avr/cores/megacommand/MCL/MCLMenus.h +++ b/avr/cores/megacommand/MCL/MCLMenus.h @@ -69,7 +69,7 @@ extern MenuPage<4> step_menu_page; extern MCLEncoder grid_slot_param1; extern MCLEncoder grid_slot_param2; -constexpr size_t grid_slot_page_N = 11; +constexpr size_t grid_slot_page_N = 10; extern MenuPage grid_slot_page; extern MCLEncoder wavdesign_menu_value_encoder; diff --git a/resource/menu_layouts.cpp b/resource/menu_layouts.cpp index 995bb4240..114518440 100644 --- a/resource/menu_layouts.cpp +++ b/resource/menu_layouts.cpp @@ -245,7 +245,6 @@ menu_t slot_menu_layout = { {"CLEAR:", 0, 2, 2, 36, 0, 0, 33}, {"COPY: ", 0, 2, 2, 37, 0, 0, 33}, {"PASTE:", 0, 2, 2, 38, 0, 0, 33}, - {"INSROW:", 0, 127, 1, 50, 0, 0, 33}, {"RENAME", 0, 0, 0, 0, 0, 20, 0}, }, 21, 0, From 980ccb7de3362fb09b02a0e00eb89d75d55e20d5 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 21 Jun 2023 14:18:19 +1000 Subject: [PATCH 061/413] Add seq_menu DEV option for SeqPtcPage. Use constexpr for menu item count --- avr/cores/megacommand/MCL/GridPage.cpp | 1 + avr/cores/megacommand/MCL/MCLMemory.h | 2 + avr/cores/megacommand/MCL/MCLMenus.cpp | 43 +- avr/cores/megacommand/MCL/MCLMenus.h | 76 +- avr/cores/megacommand/MCL/MCLSysConfig.cpp | 1 + avr/cores/megacommand/MCL/MCLSysConfig.h | 3 +- avr/cores/megacommand/MCL/MenuPage.cpp | 15 +- avr/cores/megacommand/MCL/MenuPage.h | 1 + avr/cores/megacommand/MCL/Project.h | 1 - avr/cores/megacommand/MCL/SeqPage.cpp | 4 + avr/cores/megacommand/MCL/SeqPages.h | 37 +- avr/cores/megacommand/MCL/SeqPtcPage.cpp | 1 + avr/cores/megacommand/resources/R.h | 8 +- .../megacommand/resources/R_menu_layouts.cpp | 693 +++++++++--------- 14 files changed, 466 insertions(+), 420 deletions(-) diff --git a/avr/cores/megacommand/MCL/GridPage.cpp b/avr/cores/megacommand/MCL/GridPage.cpp index d0d7ca522..08df73da6 100644 --- a/avr/cores/megacommand/MCL/GridPage.cpp +++ b/avr/cores/megacommand/MCL/GridPage.cpp @@ -1092,6 +1092,7 @@ bool GridPage::handleEvent(gui_event_t *event) { } show_slot_menu = true; grid_slot_page.init(); + grid_slot_page.gen_menu_row_names(); return true; } diff --git a/avr/cores/megacommand/MCL/MCLMemory.h b/avr/cores/megacommand/MCL/MCLMemory.h index 8866cdc0c..aff45b4d5 100644 --- a/avr/cores/megacommand/MCL/MCLMemory.h +++ b/avr/cores/megacommand/MCL/MCLMemory.h @@ -12,6 +12,8 @@ constexpr size_t GRID_WIDTH = 16; constexpr size_t GRID_LENGTH = 128; constexpr size_t GRID_SLOT_BYTES = 4096; +constexpr size_t PRJ_NAME_LEN = 14; + constexpr size_t NUM_SLOTS = GRID_WIDTH * NUM_GRIDS; constexpr size_t NUM_MD_TRACKS = 16; diff --git a/avr/cores/megacommand/MCL/MCLMenus.cpp b/avr/cores/megacommand/MCL/MCLMenus.cpp index 96a950723..949e32b99 100644 --- a/avr/cores/megacommand/MCL/MCLMenus.cpp +++ b/avr/cores/megacommand/MCL/MCLMenus.cpp @@ -116,7 +116,7 @@ const uint8_t *const menu_target_param[] PROGMEM = { // 49 &mcl_cfg.uart2_prg_mode, // 50 - &grid_page.insert_rows, + &mcl_cfg.seq_dev, // 51 &mcl_cfg.midi_forward_2, // 52 @@ -130,7 +130,7 @@ const uint8_t *const menu_target_param[] PROGMEM = { // 56 &mcl_cfg.midi_ctrl_port, // 57 - &mcl_cfg.md_trig_channel + &mcl_cfg.md_trig_channel, }; const menu_function_t menu_target_functions[] PROGMEM = { @@ -188,25 +188,24 @@ const menu_function_t menu_target_functions[] PROGMEM = { // 29 mcl_setup, }; +MenuPage aux_config_page(&config_param1, &config_param6); -MenuPage<1> aux_config_page(&config_param1, &config_param6); +MenuPage boot_menu_page(&options_param1, &options_param2); +MenuPage start_menu_page(&options_param1, &options_param2); +MenuPage system_page(&options_param1, &options_param2); +MenuPage midi_config_page(&config_param1, &config_param3); -MenuPage<4> boot_menu_page(&options_param1, &options_param2); -MenuPage<2> start_menu_page(&options_param1, &options_param2); -MenuPage<6> system_page(&options_param1, &options_param2); -MenuPage<5> midi_config_page(&config_param1, &config_param3); +MenuPage md_config_page(&config_param1, &config_param4); +MenuPage chain_config_page(&config_param1, &config_param6); +MenuPage mcl_config_page(&config_param1, &config_param5); +MenuPage ram_config_page(&config_param1, &config_param7); +MenuPage md_import_page(&config_param1, &config_param8); -MenuPage<3> md_config_page(&config_param1, &config_param4); -MenuPage<3> chain_config_page(&config_param1, &config_param6); -MenuPage<1> mcl_config_page(&config_param1, &config_param5); -MenuPage<1> ram_config_page(&config_param1, &config_param7); -MenuPage<4> md_import_page(&config_param1, &config_param8); - -MenuPage<5> midiport_menu_page(&config_param1, &config_param9); -MenuPage<3> midiprogram_menu_page(&config_param1, &config_param10); -MenuPage<4> midiclock_menu_page(&config_param1, &config_param11); -MenuPage<4> midiroute_menu_page(&config_param1, &config_param12); -MenuPage<3> midimachinedrum_menu_page(&config_param1, &config_param13); +MenuPage midiport_menu_page(&config_param1, &config_param9); +MenuPage midiprogram_menu_page(&config_param1, &config_param10); +MenuPage midiclock_menu_page(&config_param1, &config_param11); +MenuPage midiroute_menu_page(&config_param1, &config_param12); +MenuPage midimachinedrum_menu_page(&config_param1, &config_param13); MCLEncoder input_encoder1(0, 127, ENCODER_RES_SYS); MCLEncoder input_encoder2(0, 127, ENCODER_RES_SYS); @@ -214,15 +213,15 @@ MCLEncoder input_encoder2(0, 127, ENCODER_RES_SYS); TextInputPage text_input_page(&input_encoder1, &input_encoder2); MCLEncoder file_menu_encoder(0, 4, ENCODER_RES_PAT); -MenuPage<7> file_menu_page(&config_param1, &file_menu_encoder); +MenuPage file_menu_page(&config_param1, &file_menu_encoder); MCLEncoder seq_menu_value_encoder(0, 16, ENCODER_RES_PAT); MCLEncoder seq_menu_entry_encoder(0, 9, ENCODER_RES_PAT); -MenuPage<20> seq_menu_page(&seq_menu_value_encoder, &seq_menu_entry_encoder); +MenuPage seq_menu_page(&seq_menu_value_encoder, &seq_menu_entry_encoder); MCLEncoder step_menu_value_encoder(0, 16, ENCODER_RES_PAT); MCLEncoder step_menu_entry_encoder(0, 9, ENCODER_RES_PAT); -MenuPage<4> step_menu_page(&step_menu_value_encoder, &step_menu_entry_encoder); +MenuPage step_menu_page(&step_menu_value_encoder, &step_menu_entry_encoder); MCLEncoder grid_slot_param1(0, 7, ENCODER_RES_PAT); MCLEncoder grid_slot_param2(0, 16, ENCODER_RES_PAT); @@ -230,4 +229,4 @@ MenuPage grid_slot_page(&grid_slot_param1, &grid_slot_param2); MCLEncoder wavdesign_menu_value_encoder(0, 16, ENCODER_RES_PAT); MCLEncoder wavdesign_menu_entry_encoder(0, 4, ENCODER_RES_PAT); -MenuPage<3> wavdesign_menu_page(&wavdesign_menu_value_encoder, &wavdesign_menu_entry_encoder); +MenuPage wavdesign_menu_page(&wavdesign_menu_value_encoder, &wavdesign_menu_entry_encoder); diff --git a/avr/cores/megacommand/MCL/MCLMenus.h b/avr/cores/megacommand/MCL/MCLMenus.h index 53400b20b..b5a1fb6cc 100644 --- a/avr/cores/megacommand/MCL/MCLMenus.h +++ b/avr/cores/megacommand/MCL/MCLMenus.h @@ -33,22 +33,50 @@ extern MCLEncoder config_param13; extern void new_proj_handler(); -extern MenuPage<4> boot_menu_page; -extern MenuPage<2> start_menu_page; -extern MenuPage<6> system_page; -extern MenuPage<5> midi_config_page; -extern MenuPage<3> md_config_page; -extern MenuPage<1> mcl_config_page; -extern MenuPage<3> chain_config_page; -extern MenuPage<1> aux_config_page; -extern MenuPage<1> ram_config_page; -extern MenuPage<4> md_import_page; - -extern MenuPage<5> midiport_menu_page; -extern MenuPage<3> midiprogram_menu_page; -extern MenuPage<4> midiclock_menu_page; -extern MenuPage<4> midiroute_menu_page; -extern MenuPage<3> midimachinedrum_menu_page; +constexpr size_t boot_menu_page_N = 4; +extern MenuPage boot_menu_page; + +constexpr size_t start_menu_page_N = 2; +extern MenuPage start_menu_page; + +constexpr size_t system_page_N = 6; +extern MenuPage system_page; + +constexpr size_t midi_config_page_N = 5; +extern MenuPage midi_config_page; + +constexpr size_t md_config_page_N = 3; +extern MenuPage md_config_page; + +constexpr size_t mcl_config_page_N = 1; +extern MenuPage mcl_config_page; + +constexpr size_t chain_config_page_N = 3; +extern MenuPage chain_config_page; + +constexpr size_t aux_config_page_N = 1; +extern MenuPage aux_config_page; + +constexpr size_t ram_config_page_N = 1; +extern MenuPage ram_config_page; + +constexpr size_t md_import_page_N = 4; +extern MenuPage md_import_page; + +constexpr size_t midiport_menu_page_N = 5; +extern MenuPage midiport_menu_page; + +constexpr size_t midiprogram_menu_page_N = 3; +extern MenuPage midiprogram_menu_page; + +constexpr size_t midiclock_menu_page_N = 4; +extern MenuPage midiclock_menu_page; + +constexpr size_t midiroute_menu_page_N = 4; +extern MenuPage midiroute_menu_page; + +constexpr size_t midimachinedrum_menu_page_N = 3; +extern MenuPage midimachinedrum_menu_page; extern MCLEncoder input_encoder1; extern MCLEncoder input_encoder2; @@ -56,15 +84,21 @@ extern MCLEncoder input_encoder2; extern TextInputPage text_input_page; extern MCLEncoder file_menu_encoder; -extern MenuPage<7> file_menu_page; + +constexpr size_t file_menu_page_N = 7; +extern MenuPage file_menu_page; extern MCLEncoder seq_menu_value_encoder; extern MCLEncoder seq_menu_entry_encoder; -extern MenuPage<20> seq_menu_page; + +constexpr size_t seq_menu_page_N = 20; +extern MenuPage seq_menu_page; extern MCLEncoder step_menu_value_encoder; extern MCLEncoder step_menu_entry_encoder; -extern MenuPage<4> step_menu_page; + +constexpr size_t step_menu_page_N = 4; +extern MenuPage step_menu_page; extern MCLEncoder grid_slot_param1; extern MCLEncoder grid_slot_param2; @@ -74,7 +108,9 @@ extern MenuPage grid_slot_page; extern MCLEncoder wavdesign_menu_value_encoder; extern MCLEncoder wavdesign_menu_entry_encoder; -extern MenuPage<3> wavdesign_menu_page; + +constexpr size_t wavdesign_menu_page_N = 3; +extern MenuPage wavdesign_menu_page; extern uint8_t opt_import_src; extern uint8_t opt_import_dest; diff --git a/avr/cores/megacommand/MCL/MCLSysConfig.cpp b/avr/cores/megacommand/MCL/MCLSysConfig.cpp index 742f275e4..873c01e6c 100644 --- a/avr/cores/megacommand/MCL/MCLSysConfig.cpp +++ b/avr/cores/megacommand/MCL/MCLSysConfig.cpp @@ -150,6 +150,7 @@ bool MCLSysConfig::cfg_init() { midi_transport_send = 0; midi_ctrl_port = 1; md_trig_channel = 0; + seq_dev = 0; cfgfile.close(); ret = write_cfg(); if (!ret) { diff --git a/avr/cores/megacommand/MCL/MCLSysConfig.h b/avr/cores/megacommand/MCL/MCLSysConfig.h index 9fcffa77d..cf7d18b13 100644 --- a/avr/cores/megacommand/MCL/MCLSysConfig.h +++ b/avr/cores/megacommand/MCL/MCLSysConfig.h @@ -4,7 +4,7 @@ #define MCLSYSCONFIG_H__ #include "SdFat.h" -#define CONFIG_VERSION 4006 +#define CONFIG_VERSION 4007 #define MIDI_OMNI_MODE 17 #define MIDI_LOCAL_MODE 0 @@ -64,6 +64,7 @@ class MCLSysConfigData { uint8_t midi_transport_send; uint8_t midi_ctrl_port; uint8_t md_trig_channel; + uint8_t seq_dev; }; class MCLSysConfig : public MCLSysConfigData { diff --git a/avr/cores/megacommand/MCL/MenuPage.cpp b/avr/cores/megacommand/MCL/MenuPage.cpp index 5fe13bda6..36412d5fa 100644 --- a/avr/cores/megacommand/MCL/MenuPage.cpp +++ b/avr/cores/megacommand/MCL/MenuPage.cpp @@ -10,7 +10,6 @@ void MenuPageBase::init() { DEBUG_PRINT("R.Size() = "); DEBUG_PRINTLN(R.Size()); R.restore_menu_layout_deps(); - gen_menu_row_names(); ((MCLEncoder *)encoders[1])->max = get_menu()->get_number_of_items() - 1; if (((MCLEncoder *)encoders[1])->cur > ((MCLEncoder *)encoders[1])->max) { @@ -29,6 +28,20 @@ void MenuPageBase::init() { encoders[1]->old = encoders[1]->cur; } +void MenuPageBase::gen_menu_device_names() { + MenuBase *m = get_menu(); + menu_option_t *p = (menu_option_t *)R.Allocate(sizeof(menu_option_t) * NUM_DEVS); + m->set_custom_options(p); + + for (uint8_t n = 0; n < NUM_DEVS; n++) { + uint8_t row_id = n; + p->pos = n; + strcpy(p->name,midi_active_peering.get_device(UART1_PORT)->name); + p++; + } + +} + void MenuPageBase::gen_menu_row_names() { MenuBase *m = get_menu(); menu_option_t *p = (menu_option_t *)R.Allocate(sizeof(menu_option_t) * 128); diff --git a/avr/cores/megacommand/MCL/MenuPage.h b/avr/cores/megacommand/MCL/MenuPage.h index e9b208e9a..5e4b670e1 100644 --- a/avr/cores/megacommand/MCL/MenuPage.h +++ b/avr/cores/megacommand/MCL/MenuPage.h @@ -39,6 +39,7 @@ class MenuPageBase : public LightPage { void init(); bool enter(); bool exit(); + void gen_menu_device_names(); void gen_menu_row_names(); virtual bool handleEvent(gui_event_t *event); diff --git a/avr/cores/megacommand/MCL/Project.h b/avr/cores/megacommand/MCL/Project.h index 5ec9fb96d..9e46e5684 100644 --- a/avr/cores/megacommand/MCL/Project.h +++ b/avr/cores/megacommand/MCL/Project.h @@ -9,7 +9,6 @@ #include "ProjectPages.h" #define PROJ_VERSION 3000 -#define PRJ_NAME_LEN 14 #define PRJ_DIR "/Projects" class ProjectHeader { diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index d69f16846..3a426a6da 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -106,6 +106,7 @@ void SeqPage::init() { seqpage_midi_events.setup_callbacks(); oled_display.clearDisplay(); toggle_device = true; + seq_menu_page.menu.enable_entry(SEQ_MENU_DEVICE, false); seq_menu_page.menu.enable_entry(SEQ_MENU_LENGTH, false); seq_menu_page.menu.enable_entry(SEQ_MENU_CHANNEL, false); seq_menu_page.menu.enable_entry(SEQ_MENU_MASK, false); @@ -436,6 +437,8 @@ bool SeqPage::handleEvent(gui_event_t *event) { encoders[0] = &seq_menu_value_encoder; encoders[1] = &seq_menu_entry_encoder; seq_menu_page.init(); + step_menu_page.gen_menu_device_names(); + mcl_cfg.seq_dev = midi_device == &MD ? 0 : 1; return true; } } @@ -470,6 +473,7 @@ bool SeqPage::handleEvent(gui_event_t *event) { show_seq_menu = false; show_step_menu = false; + midi_device = midi_active_peering.get_device(mcl_cfg.seq_dev); mcl_gui.init_encoders_used_clock(); init(); return true; diff --git a/avr/cores/megacommand/MCL/SeqPages.h b/avr/cores/megacommand/MCL/SeqPages.h index c7809cfa7..97e50a9e4 100644 --- a/avr/cores/megacommand/MCL/SeqPages.h +++ b/avr/cores/megacommand/MCL/SeqPages.h @@ -14,24 +14,25 @@ #define NUM_PARAM_PAGES 4 #define SEQ_MENU_TRACK 0 -#define SEQ_MENU_MASK 1 -#define SEQ_MENU_PIANOROLL 2 -#define SEQ_MENU_PARAMSELECT 3 -#define SEQ_MENU_SLIDE 4 -#define SEQ_MENU_ARP 5 -#define SEQ_MENU_TRANSPOSE 6 -#define SEQ_MENU_VEL 7 -#define SEQ_MENU_PROB 8 -#define SEQ_MENU_SPEED 9 -#define SEQ_MENU_LENGTH 10 -#define SEQ_MENU_CHANNEL 11 -#define SEQ_MENU_COPY 12 -#define SEQ_MENU_CLEAR_TRACK 13 -#define SEQ_MENU_CLEAR_LOCKS 14 -#define SEQ_MENU_PASTE 15 -#define SEQ_MENU_SHIFT 16 -#define SEQ_MENU_REVERSE 17 -#define SEQ_MENU_POLY 18 +#define SEQ_MENU_DEVICE 1 +#define SEQ_MENU_MASK 2 +#define SEQ_MENU_PIANOROLL 3 +#define SEQ_MENU_PARAMSELECT 4 +#define SEQ_MENU_SLIDE 5 +#define SEQ_MENU_ARP 6 +#define SEQ_MENU_TRANSPOSE 7 +#define SEQ_MENU_VEL 8 +#define SEQ_MENU_PROB 9 +#define SEQ_MENU_SPEED 10 +#define SEQ_MENU_LENGTH 11 +#define SEQ_MENU_CHANNEL 12 +#define SEQ_MENU_COPY 13 +#define SEQ_MENU_CLEAR_TRACK 14 +#define SEQ_MENU_CLEAR_LOCKS 15 +#define SEQ_MENU_PASTE 16 +#define SEQ_MENU_SHIFT 17 +#define SEQ_MENU_REVERSE 18 +#define SEQ_MENU_POLY 19 extern MCLEncoder seq_param1; extern MCLEncoder seq_param2; diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.cpp b/avr/cores/megacommand/MCL/SeqPtcPage.cpp index 8e09c7988..76340198d 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPtcPage.cpp @@ -77,6 +77,7 @@ void SeqPtcPage::init_poly() { void SeqPtcPage::init() { DEBUG_PRINT_FN(); SeqPage::init(); + seq_menu_page.menu.enable_entry(SEQ_MENU_DEVICE, true); seq_menu_page.menu.enable_entry(SEQ_MENU_TRACK, true); seq_menu_page.menu.enable_entry(SEQ_MENU_ARP, true); seq_menu_page.menu.enable_entry(SEQ_MENU_TRANSPOSE, true); diff --git a/avr/cores/megacommand/resources/R.h b/avr/cores/megacommand/resources/R.h index 19055c4fd..0e4ae21cb 100644 --- a/avr/cores/megacommand/resources/R.h +++ b/avr/cores/megacommand/resources/R.h @@ -302,10 +302,10 @@ struct __T_menu_layouts { static constexpr size_t sizeofof_wavdesign_menu_layout = 75; union { menu_t slot_menu_layout[0]; - char zz__slot_menu_layout[243]; + char zz__slot_menu_layout[222]; }; - static constexpr size_t countof_slot_menu_layout = 243 / sizeof(menu_t); - static constexpr size_t sizeofof_slot_menu_layout = 243; + static constexpr size_t countof_slot_menu_layout = 222 / sizeof(menu_t); + static constexpr size_t sizeofof_slot_menu_layout = 222; union { menu_t<4> step_menu_layout[0]; char zz__step_menu_layout[96]; @@ -408,7 +408,7 @@ struct __T_menu_layouts { }; static constexpr size_t countof_boot_menu_layout = 96 / sizeof(menu_t<4>); static constexpr size_t sizeofof_boot_menu_layout = 96; - static constexpr size_t __total_size = 2139; + static constexpr size_t __total_size = 2118; }; extern const unsigned char __R_menu_options[] PROGMEM; diff --git a/avr/cores/megacommand/resources/R_menu_layouts.cpp b/avr/cores/megacommand/resources/R_menu_layouts.cpp index 4989a395e..4eb2a3f6d 100644 --- a/avr/cores/megacommand/resources/R_menu_layouts.cpp +++ b/avr/cores/megacommand/resources/R_menu_layouts.cpp @@ -154,865 +154,852 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 221, 38, 20, - 73, - 111, - 219, - 82, - 79, - 87, - 100, - 21, - 247, - 127, - 1, - 50, - 20, - 91, 82, - 146, + 111, + 125, 65, - 216, 77, 69, - 240, - 11, - 187, - 187, + 96, + 219, + 46, + 166, + 237, 0, 21, 0, - 62, - 108, + 41, + 176, 80, 13, - 22, - 116, - 83, + 89, + 95, + 79, 30, - 231, 0, 15, + 158, 30, - 186, 32, - 98, + 235, + 77, 80, - 203, 53, - 216, + 47, 16, 0, - 116, - 176, + 98, + 95, + 194, 21, - 191, + 253, 17, 0, 77, 85, - 100, + 145, 19, - 126, + 251, 0, 18, 0, 19, - 221, 95, + 118, 69, 81, - 130, 13, - 27, - 115, + 8, + 110, + 94, 67, 75, - 182, 32, + 221, 15, 76, - 198, - 99, - 1, - 222, + 58, + 139, + 254, 49, + 120, 14, 0, 3, - 18, - 178, - 187, + 74, + 157, + 237, 15, 3, - 108, + 178, 48, 20, - 135, + 30, 9, 1, - 183, 16, + 223, 4, 54, 67, - 216, 67, 58, + 96, 187, - 31, + 125, 133, 5, 17, - 111, + 188, 4, 55, 83, 76, - 10, - 166, - 194, - 254, - 109, + 43, + 145, + 233, + 9, + 182, 18, 4, - 183, 25, + 223, 197, 80, 69, - 252, 71, 71, + 240, 73, 65, 84, 79, - 33, - 223, - 218, + 135, + 202, 10, + 104, 125, - 17, - 241, - 236, + 71, + 220, 80, 79, + 176, 83, 45, - 27, + 109, 12, 154, - 93, + 117, 5, 86, - 98, + 136, 140, - 18, - 124, - 195, + 75, + 103, + 12, 17, - 6, + 27, 7, - 225, 79, 78, + 132, 68, - 229, - 1, - 237, + 208, + 7, 15, 15, + 183, 21, 5, - 219, 60, 83, + 109, 82, 69, - 96, + 128, 21, - 56, + 227, 7, 7, - 220, - 46, + 25, + 112, 5, 41, - 55, - 229, + 222, + 208, 71, 84, 72, - 146, 58, - 71, - 65, - 91, + 73, + 29, + 44, 6, + 109, 62, 72, - 109, + 182, 104, 78, - 146, 87, - 235, + 75, 230, + 173, 24, 45, - 97, + 132, 0, - 187, - 33, - 252, + 166, + 135, 3, 3, + 240, 25, 0, 8, 27, - 33, + 133, 112, - 110, + 186, 20, - 181, 26, + 214, 234, - 128, 20, - 120, + 1, + 225, 10, 30, - 66, - 229, - 221, + 208, + 11, + 119, 20, 27, - 254, 0, 11, + 248, 27, 83, 72, 73, 70, - 16, + 64, 38, - 30, + 123, 5, 5, 28, - 216, 213, + 97, 35, - 86, 229, + 91, 211, - 220, 82, + 115, 228, - 201, 41, - 246, + 39, 29, 0, + 219, 13, 27, 246, - 251, 76, + 237, 89, 80, 72, 214, - 97, + 132, 89, 82, - 45, - 173, + 182, 2, + 183, 41, - 246, 67, 32, + 218, 81, 85, 171, - 180, + 208, 66, - 32, + 131, 58, - 204, 42, - 23, + 48, + 93, 146, 70, 73, - 104, + 163, 128, - 193, 15, - 109, + 5, + 182, 27, 67, - 182, 199, + 216, 0, 0, - 22, - 220, + 91, 217, + 112, 87, 32, - 46, + 187, 157, 82, 46, - 194, 20, - 66, + 9, + 10, 130, - 181, + 214, 51, - 172, 159, + 178, 41, - 132, - 101, + 17, + 149, 111, - 110, - 0, 186, + 0, 79, + 234, 157, 87, - 149, - 90, - 133, + 86, + 69, 44, - 187, + 22, + 239, 137, 86, 32, - 216, 65, 76, + 97, 106, - 91, + 109, 195, - 66, + 10, 133, - 178, + 202, 20, - 151, + 93, 22, - 67, 89, + 13, 9, - 88, 77, + 99, 116, - 194, 73, + 11, 147, - 225, 76, + 133, 65, 85, - 66, + 9, 250, - 77, + 54, 13, - 184, 4, + 227, 23, 1, - 219, 134, + 108, 68, 42, - 39, + 157, 82, 67, - 76, - 88, - 144, - 89, - 27, + 50, + 67, + 64, + 68, + 110, 43, 4, - 154, + 107, 170, - 212, 63, - 132, - 110, - 207, + 82, + 89, + 19, 44, + 62, 79, - 134, 85, + 24, 6, - 9, + 36, 241, - 35, + 141, 6, - 111, + 189, 45, 149, - 107, + 172, 19, 123, - 11, - 12, + 44, + 51, 30, - 214, 3, + 88, 95, - 3, + 13, 73, - 74, - 184, - 54, + 40, + 163, + 219, 96, 84, - 192, 31, - 225, + 3, + 134, 11, 31, - 155, + 109, 18, 77, - 111, + 188, 181, 73, 90, 69, - 8, + 33, 85, - 116, + 211, 8, - 193, 48, + 7, 127, - 227, + 142, 32, 86, - 130, + 11, 91, - 194, 71, + 9, 127, - 75, + 44, 74, - 30, + 123, 32, 77, 73, - 208, 198, - 244, + 67, 106, + 248, 72, - 177, - 175, + 82, + 79, 32, - 236, + 246, 56, 53, - 251, + 125, 18, 2, 9, + 207, 4, - 158, 53, - 194, + 97, 20, - 67, + 33, 116, - 70, + 163, 88, 198, - 181, + 90, 67, - 132, + 194, 20, - 221, + 110, 57, 4, + 181, 24, - 107, 172, + 161, 193, - 66, 83, - 11, + 5, + 255, 81, - 254, 32, 49, 32, 70, 87, - 53, + 26, 173, - 39, + 147, 80, + 142, 7, - 28, 254, - 198, + 99, 20, 50, - 64, - 109, + 32, + 54, 51, 4, - 246, + 251, 92, 85, 83, 66, 17, - 10, - 65, + 5, + 32, 122, - 183, + 219, 52, 4, 96, + 141, 67, - 26, 20, - 188, - 166, - 37, + 94, + 145, + 18, 85, - 187, + 221, 211, 86, + 134, 24, - 12, 118, - 53, + 26, 11, - 97, + 176, 37, - 211, + 233, 79, 197, - 7, + 131, 178, - 140, + 198, 58, 96, - 233, + 116, 5, + 201, 13, - 146, 92, - 44, + 22, 20, - 14, + 7, 53, - 102, + 51, 41, - 97, + 48, + 204, 199, - 152, 116, - 118, + 59, 6, 4, - 216, + 108, 100, 41, - 176, + 88, 20, - 57, + 28, 54, - 155, + 205, 95, + 182, 80, - 109, 192, 71, - 161, + 208, 25, + 206, 215, - 156, 9, - 208, + 104, 223, - 37, - 103, - 186, + 18, + 82, + 221, 128, 49, - 219, + 109, 4, 90, + 246, 20, - 236, 73, 242, - 88, + 44, 245, - 48, + 24, 47, - 207, + 103, 10, 20, - 115, + 185, 246, + 135, 21, - 15, 17, + 220, 2, - 185, 48, 20, - 193, + 224, 74, + 213, 148, - 171, 83, + 159, 112, - 63, 85, 82, 66, + 133, 79, - 10, 11, - 203, + 101, 224, - 185, + 220, 2, 79, - 156, + 206, 20, 50, - 151, + 75, + 146, 3, - 36, - 134, + 67, 16, - 176, + 88, 58, 20, - 102, + 51, 55, - 133, + 66, 68, 106, - 28, + 142, 173, - 214, + 107, 42, 137, - 77, + 38, 4, - 214, + 235, 82, 67, 192, - 239, + 119, 76, 32, 98, - 89, + 172, 196, - 182, + 219, 41, 56, - 196, + 98, 191, - 38, + 19, 199, - 230, + 115, 0, 126, - 33, + 16, + 132, 235, - 9, - 92, + 174, 106, - 19, + 9, 62, - 96, + 176, 0, - 107, + 53, + 193, 251, - 130, 179, - 45, + 22, 212, - 176, + 216, 71, 20, - 21, - 161, + 10, + 208, 251, + 134, 8, - 13, - 128, + 192, 20, - 198, + 99, 13, 40, - 88, - 16, + 44, + 8, 131, - 49, - 206, + 24, + 231, 161, 39, - 110, + 55, 138, 65, 71, - 26, + 13, 247, 76, - 218, + 109, 71, 75, - 203, + 101, 200, - 117, + 186, 170, 1, - 143, + 199, 7, 65, 85, + 177, 88, - 99, 32, + 179, 83, - 103, 42, + 236, 97, - 217, 103, 101, 35, - 112, + 184, 8, - 236, + 118, 204, 167, - 176, - 182, + 88, + 91, 171, 65, 100, - 187, + 93, 124, 74, + 181, 69, - 106, 225, - 65, + 32, 6, - 72, + 164, 236, - 176, + 88, 19, - 183, + 91, 90, - 50, + 153, 234, - 214, + 107, 142, - 91, + 45, + 209, 161, - 163, 65, + 173, 147, - 90, 131, - 5, + 2, 33, - 74, + 165, 52, - 195, + 97, 186, - 176, + 216, 4, 126, - 17, - 37, - 124, - 164, + 8, + 146, + 103, + 210, 192, + 2, 4, - 9, 75, - 97, + 176, + 236, 54, - 216, 102, - 44, + 22, 137, - 32, - 221, + 16, + 110, 3, + 141, 66, - 26, 170, - 193, + 96, 15, - 2, + 129, 216, - 133, + 66, 190, - 134, + 195, 80, 57, - 172, + 86, 68, 89, - 186, + 93, 27, - 220, + 110, 34, 70, 85, - 98, + 49, 75, - 192, + 96, 108, - 64, - 163, + 32, + 81, 77, + 235, 246, - 215, 59, - 88, + 172, 75, 20, - 12, + 6, 28, - 27, + 13, 134, + 173, 88, - 90, 147, - 146, + 73, 236, - 27, + 13, 29, + 192, 3, - 128, 0, 0, 0, 0, - 1, - 63, + 0, + 159, 255, }; From 5a29a43e70deeb8e55a4e043f09d87922b6ecf00 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 21 Jun 2023 17:12:01 +1000 Subject: [PATCH 062/413] Note triggering, further simplification --- avr/cores/megacommand/MCL/SeqPtcPage.cpp | 73 ++++++++++++------------ 1 file changed, 35 insertions(+), 38 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.cpp b/avr/cores/megacommand/MCL/SeqPtcPage.cpp index 76340198d..fd212db70 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPtcPage.cpp @@ -495,18 +495,14 @@ bool SeqPtcPage::handleEvent(gui_event_t *event) { } return true; } - /* if (mask == EVENT_BUTTON_PRESSED) { SET_BIT128_P(dev_note_masks[0], note); } else { CLEAR_BIT128_P(dev_note_masks[0], note); } - - uint8_t pitch = calc_scale_note(note); - if (pitch > 127) - return false; */ + // note interface presses are treated as musical notes here scale_padding = false; bool is_md = midi_device == &MD; @@ -630,7 +626,9 @@ uint8_t SeqPtcPage::process_ext_event(uint8_t note_num, bool note_type, CLEAR_BIT128_P(seq_ptc_page.note_mask, pitch); } } - if (pitch == 255) { return 255; } + if (pitch == 255) { + return 255; + } pitch += ptc_param_oct.cur * 12; return pitch; } @@ -656,10 +654,26 @@ uint8_t SeqPtcPage::is_md_midi(uint8_t channel) { (GUI.currentPage() != &seq_extstep_page); */ } - void SeqPtcMidiEvents::onNoteOnCallback_Midi2(uint8_t *msg) { uint8_t channel = MIDI_VOICE_CHANNEL(msg[0]); uint8_t channel_event = seq_ptc_page.is_md_midi(channel); + + if (channel_event) { + SeqPage::midi_device = midi_active_peering.get_device(UART1_PORT); + } else { + auto active_device = midi_active_peering.get_device(UART2_PORT); + uint8_t n = mcl_seq.find_ext_track(channel); + if (n == 255) { + return; + } + if (SeqPage::midi_device != active_device || (last_ext_track != n)) { + SeqPage::midi_device = active_device; + last_ext_track = min(n, NUM_EXT_TRACKS - 1); + seq_ptc_page.config(); + } else { + SeqPage::midi_device = active_device; + } + } uint8_t scale_padding_old = seq_ptc_page.scale_padding; seq_ptc_page.scale_padding = true; note_on(msg, channel_event); @@ -669,6 +683,14 @@ void SeqPtcMidiEvents::onNoteOnCallback_Midi2(uint8_t *msg) { void SeqPtcMidiEvents::onNoteOffCallback_Midi2(uint8_t *msg) { uint8_t channel = MIDI_VOICE_CHANNEL(msg[0]); uint8_t channel_event = seq_ptc_page.is_md_midi(channel); + if (channel_event) { + + } else { + uint8_t n = mcl_seq.find_ext_track(channel); + if (n == 255) { + return; + } + } uint8_t scale_padding_old = seq_ptc_page.scale_padding; seq_ptc_page.scale_padding = true; note_off(msg, channel_event); @@ -681,17 +703,12 @@ void SeqPtcMidiEvents::note_on(uint8_t *msg, uint8_t channel_event) { DEBUG_PRINTLN("note on"); DEBUG_DUMP(channel); - // matches control channel, or MIDI2 is OMNI? - // then route midi message to MD - // - // pitch - MIDI_NOTE_C4 // uint8_t pitch; bool note_on = true; - if (channel_event) { - SeqPage::midi_device = midi_active_peering.get_device(UART1_PORT); + if (channel_event) { if (channel_event == TRIG_EVENT) { if (note_num < MIDI_NOTE_C4) { uint8_t pos = note_num - MIDI_NOTE_C2; @@ -729,29 +746,15 @@ void SeqPtcMidiEvents::note_on(uint8_t *msg, uint8_t channel_event) { } #ifdef EXT_TRACKS // otherwise, translate the message and send it back to MIDI2. - auto active_device = midi_active_peering.get_device(UART2_PORT); - uint8_t n = mcl_seq.find_ext_track(channel); - if (n == 255) { - return; - } - - if (SeqPage::midi_device != active_device || (last_ext_track != n)) { - SeqPage::midi_device = active_device; - last_ext_track = min(n, NUM_EXT_TRACKS - 1); - seq_ptc_page.config(); - } else { - SeqPage::midi_device = active_device; - } - pitch = seq_ptc_page.process_ext_event(note_num, note_on, channel); seq_ptc_page.config_encoders(); ArpSeqTrack *arp_track = &mcl_seq.ext_arp_tracks[last_ext_track]; arp_page.track_update(); - seq_ptc_page.render_arp(false, SeqPage::midi_device, n); + seq_ptc_page.render_arp(false, SeqPage::midi_device, last_ext_track); if (pitch == 255) - return; + return; seq_extstep_page.set_cur_y(pitch); @@ -785,19 +788,13 @@ void SeqPtcMidiEvents::note_off(uint8_t *msg, uint8_t channel_event) { #ifdef EXT_TRACKS SeqPage::midi_device = midi_active_peering.get_device(UART2_PORT); pitch = seq_ptc_page.process_ext_event(note_num, false, channel); - uint8_t n = mcl_seq.find_ext_track(channel); - if (n == 255) { - return; - } - last_ext_track = min(n, NUM_EXT_TRACKS - 1); - ; seq_ptc_page.config_encoders(); - - seq_ptc_page.render_arp(false, SeqPage::midi_device, n); + seq_ptc_page.render_arp(false, SeqPage::midi_device, last_ext_track); arp_page.track_update(); + if (pitch == 255) - return; + return; ArpSeqTrack *arp_track = &mcl_seq.ext_arp_tracks[last_ext_track]; if (!arp_track->enabled) { From 2d6509f3482b70829b0dc6ea2f638e5fa86c4ed9 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 21 Jun 2023 20:43:48 +1000 Subject: [PATCH 063/413] minor --- avr/cores/megacommand/MCL/ConvertProjectPage.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/ConvertProjectPage.cpp b/avr/cores/megacommand/MCL/ConvertProjectPage.cpp index 479f5778d..ef3ce5f87 100644 --- a/avr/cores/megacommand/MCL/ConvertProjectPage.cpp +++ b/avr/cores/megacommand/MCL/ConvertProjectPage.cpp @@ -3,7 +3,6 @@ void ConvertProjectPage::init() { DEBUG_PRINT_FN(); - strcpy(match, ".mcl"); strcpy(title, "Project"); strcpy(lwd, "/"); SD.chdir("/"); From aaec6fc7ce72687cbdd335ec31a9a26c5397101e Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 21 Jun 2023 21:04:31 +1000 Subject: [PATCH 064/413] fix, layouts --- avr/cores/megacommand/MCL/MCLMenus.cpp | 2 +- avr/cores/megacommand/MCL/MCLMenus.h | 6 +- avr/cores/megacommand/resources/R.h | 74 +- .../megacommand/resources/R_menu_layouts.cpp | 675 +++++++++--------- resource/menu_layouts.cpp | 35 +- 5 files changed, 403 insertions(+), 389 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCLMenus.cpp b/avr/cores/megacommand/MCL/MCLMenus.cpp index 949e32b99..eece03e28 100644 --- a/avr/cores/megacommand/MCL/MCLMenus.cpp +++ b/avr/cores/megacommand/MCL/MCLMenus.cpp @@ -192,7 +192,7 @@ MenuPage aux_config_page(&config_param1, &config_param6); MenuPage boot_menu_page(&options_param1, &options_param2); MenuPage start_menu_page(&options_param1, &options_param2); -MenuPage system_page(&options_param1, &options_param2); +MenuPage system_page(&options_param1, &options_param2); MenuPage midi_config_page(&config_param1, &config_param3); MenuPage md_config_page(&config_param1, &config_param4); diff --git a/avr/cores/megacommand/MCL/MCLMenus.h b/avr/cores/megacommand/MCL/MCLMenus.h index b5a1fb6cc..5fefa759a 100644 --- a/avr/cores/megacommand/MCL/MCLMenus.h +++ b/avr/cores/megacommand/MCL/MCLMenus.h @@ -39,8 +39,8 @@ extern MenuPage boot_menu_page; constexpr size_t start_menu_page_N = 2; extern MenuPage start_menu_page; -constexpr size_t system_page_N = 6; -extern MenuPage system_page; +constexpr size_t system_menu_page_N = 6; +extern MenuPage system_page; constexpr size_t midi_config_page_N = 5; extern MenuPage midi_config_page; @@ -91,7 +91,7 @@ extern MenuPage file_menu_page; extern MCLEncoder seq_menu_value_encoder; extern MCLEncoder seq_menu_entry_encoder; -constexpr size_t seq_menu_page_N = 20; +constexpr size_t seq_menu_page_N = 21; extern MenuPage seq_menu_page; extern MCLEncoder step_menu_value_encoder; diff --git a/avr/cores/megacommand/resources/R.h b/avr/cores/megacommand/resources/R.h index 0e4ae21cb..3608a5c69 100644 --- a/avr/cores/megacommand/resources/R.h +++ b/avr/cores/megacommand/resources/R.h @@ -307,108 +307,108 @@ struct __T_menu_layouts { static constexpr size_t countof_slot_menu_layout = 222 / sizeof(menu_t); static constexpr size_t sizeofof_slot_menu_layout = 222; union { - menu_t<4> step_menu_layout[0]; + menu_t step_menu_layout[0]; char zz__step_menu_layout[96]; }; - static constexpr size_t countof_step_menu_layout = 96 / sizeof(menu_t<4>); + static constexpr size_t countof_step_menu_layout = 96 / sizeof(menu_t); static constexpr size_t sizeofof_step_menu_layout = 96; union { - menu_t<20> seq_menu_layout[0]; - char zz__seq_menu_layout[432]; + menu_t seq_menu_layout[0]; + char zz__seq_menu_layout[453]; }; - static constexpr size_t countof_seq_menu_layout = 432 / sizeof(menu_t<20>); - static constexpr size_t sizeofof_seq_menu_layout = 432; + static constexpr size_t countof_seq_menu_layout = 453 / sizeof(menu_t); + static constexpr size_t sizeofof_seq_menu_layout = 453; union { - menu_t<7> file_menu_layout[0]; + menu_t file_menu_layout[0]; char zz__file_menu_layout[159]; }; - static constexpr size_t countof_file_menu_layout = 159 / sizeof(menu_t<7>); + static constexpr size_t countof_file_menu_layout = 159 / sizeof(menu_t); static constexpr size_t sizeofof_file_menu_layout = 159; union { - menu_t<1> mclconfig_menu_layout[0]; + menu_t mclconfig_menu_layout[0]; char zz__mclconfig_menu_layout[33]; }; - static constexpr size_t countof_mclconfig_menu_layout = 33 / sizeof(menu_t<1>); + static constexpr size_t countof_mclconfig_menu_layout = 33 / sizeof(menu_t); static constexpr size_t sizeofof_mclconfig_menu_layout = 33; union { - menu_t<4> mdimport_menu_layout[0]; + menu_t mdimport_menu_layout[0]; char zz__mdimport_menu_layout[96]; }; - static constexpr size_t countof_mdimport_menu_layout = 96 / sizeof(menu_t<4>); + static constexpr size_t countof_mdimport_menu_layout = 96 / sizeof(menu_t); static constexpr size_t sizeofof_mdimport_menu_layout = 96; union { - menu_t<3> mdconfig_menu_layout[0]; + menu_t mdconfig_menu_layout[0]; char zz__mdconfig_menu_layout[75]; }; - static constexpr size_t countof_mdconfig_menu_layout = 75 / sizeof(menu_t<3>); + static constexpr size_t countof_mdconfig_menu_layout = 75 / sizeof(menu_t); static constexpr size_t sizeofof_mdconfig_menu_layout = 75; union { - menu_t<3> midimachinedrum_menu_layout[0]; + menu_t midimachinedrum_menu_layout[0]; char zz__midimachinedrum_menu_layout[75]; }; - static constexpr size_t countof_midimachinedrum_menu_layout = 75 / sizeof(menu_t<3>); + static constexpr size_t countof_midimachinedrum_menu_layout = 75 / sizeof(menu_t); static constexpr size_t sizeofof_midimachinedrum_menu_layout = 75; union { - menu_t<4> midiroute_menu_layout[0]; + menu_t midiroute_menu_layout[0]; char zz__midiroute_menu_layout[96]; }; - static constexpr size_t countof_midiroute_menu_layout = 96 / sizeof(menu_t<4>); + static constexpr size_t countof_midiroute_menu_layout = 96 / sizeof(menu_t); static constexpr size_t sizeofof_midiroute_menu_layout = 96; union { - menu_t<4> midiclock_menu_layout[0]; + menu_t midiclock_menu_layout[0]; char zz__midiclock_menu_layout[96]; }; - static constexpr size_t countof_midiclock_menu_layout = 96 / sizeof(menu_t<4>); + static constexpr size_t countof_midiclock_menu_layout = 96 / sizeof(menu_t); static constexpr size_t sizeofof_midiclock_menu_layout = 96; union { - menu_t<3> midiprogram_menu_layout[0]; + menu_t midiprogram_menu_layout[0]; char zz__midiprogram_menu_layout[75]; }; - static constexpr size_t countof_midiprogram_menu_layout = 75 / sizeof(menu_t<3>); + static constexpr size_t countof_midiprogram_menu_layout = 75 / sizeof(menu_t); static constexpr size_t sizeofof_midiprogram_menu_layout = 75; union { - menu_t<5> midiport_menu_layout[0]; + menu_t midiport_menu_layout[0]; char zz__midiport_menu_layout[117]; }; - static constexpr size_t countof_midiport_menu_layout = 117 / sizeof(menu_t<5>); + static constexpr size_t countof_midiport_menu_layout = 117 / sizeof(menu_t); static constexpr size_t sizeofof_midiport_menu_layout = 117; union { - menu_t<5> midiconfig_menu_layout[0]; + menu_t midiconfig_menu_layout[0]; char zz__midiconfig_menu_layout[117]; }; - static constexpr size_t countof_midiconfig_menu_layout = 117 / sizeof(menu_t<5>); + static constexpr size_t countof_midiconfig_menu_layout = 117 / sizeof(menu_t); static constexpr size_t sizeofof_midiconfig_menu_layout = 117; union { - menu_t<1> rampage1_menu_layout[0]; + menu_t rampage1_menu_layout[0]; char zz__rampage1_menu_layout[33]; }; - static constexpr size_t countof_rampage1_menu_layout = 33 / sizeof(menu_t<1>); + static constexpr size_t countof_rampage1_menu_layout = 33 / sizeof(menu_t); static constexpr size_t sizeofof_rampage1_menu_layout = 33; union { - menu_t<1> auxconfig_menu_layout[0]; + menu_t auxconfig_menu_layout[0]; char zz__auxconfig_menu_layout[33]; }; - static constexpr size_t countof_auxconfig_menu_layout = 33 / sizeof(menu_t<1>); + static constexpr size_t countof_auxconfig_menu_layout = 33 / sizeof(menu_t); static constexpr size_t sizeofof_auxconfig_menu_layout = 33; union { - menu_t<6> system_menu_layout[0]; + menu_t system_menu_layout[0]; char zz__system_menu_layout[138]; }; - static constexpr size_t countof_system_menu_layout = 138 / sizeof(menu_t<6>); + static constexpr size_t countof_system_menu_layout = 138 / sizeof(menu_t); static constexpr size_t sizeofof_system_menu_layout = 138; union { - menu_t<2> start_menu_layout[0]; + menu_t start_menu_layout[0]; char zz__start_menu_layout[54]; }; - static constexpr size_t countof_start_menu_layout = 54 / sizeof(menu_t<2>); + static constexpr size_t countof_start_menu_layout = 54 / sizeof(menu_t); static constexpr size_t sizeofof_start_menu_layout = 54; union { - menu_t<4> boot_menu_layout[0]; + menu_t boot_menu_layout[0]; char zz__boot_menu_layout[96]; }; - static constexpr size_t countof_boot_menu_layout = 96 / sizeof(menu_t<4>); + static constexpr size_t countof_boot_menu_layout = 96 / sizeof(menu_t); static constexpr size_t sizeofof_boot_menu_layout = 96; - static constexpr size_t __total_size = 2118; + static constexpr size_t __total_size = 2139; }; extern const unsigned char __R_menu_options[] PROGMEM; diff --git a/avr/cores/megacommand/resources/R_menu_layouts.cpp b/avr/cores/megacommand/resources/R_menu_layouts.cpp index 4eb2a3f6d..1aae21123 100644 --- a/avr/cores/megacommand/resources/R_menu_layouts.cpp +++ b/avr/cores/megacommand/resources/R_menu_layouts.cpp @@ -222,784 +222,797 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 139, 254, 49, - 120, + 124, 14, 0, 3, - 74, - 157, - 237, + 0, + 47, + 59, + 86, + 73, + 67, + 107, + 171, + 116, + 46, + 50, + 224, + 233, + 148, + 178, + 219, 15, 3, - 178, 48, + 100, 20, - 30, + 61, 9, 1, 16, - 223, + 190, 4, 54, 67, 67, 58, - 96, - 187, - 125, + 192, + 208, + 251, 133, 5, 17, - 188, 4, + 120, 55, 83, 76, - 43, - 145, - 233, - 9, - 182, + 86, + 166, + 254, + 19, 18, + 109, 4, 25, - 223, - 197, + 191, + 218, 80, 69, 71, 71, - 240, 73, + 225, 65, 84, 79, - 135, - 202, + 223, + 14, 10, - 104, - 125, - 71, - 220, + 208, + 146, + 143, + 241, 80, 79, - 176, 83, + 96, 45, - 109, + 218, 12, - 154, - 117, + 175, + 235, 5, 86, - 136, - 140, - 75, - 103, - 12, - 17, - 27, - 7, + 161, + 16, + 150, + 124, + 24, + 38, + 55, + 28, 79, 78, - 132, 68, - 208, - 7, + 8, + 229, + 15, 15, 15, - 183, 21, + 110, 5, 60, 83, - 109, + 219, 82, 69, - 128, 21, - 227, + 1, + 198, 7, 7, - 25, - 112, + 46, + 225, 5, 41, - 222, - 208, + 229, + 188, 71, 84, 72, 58, - 73, - 29, - 44, + 146, + 58, + 65, 6, - 109, + 219, 62, 72, - 182, 104, + 108, 78, 87, - 75, - 230, - 173, + 151, + 251, + 91, 24, 45, - 132, 0, - 166, - 135, + 9, + 187, + 15, 3, 3, - 240, 25, + 225, 0, 8, 27, 133, - 112, - 186, + 11, + 117, 20, 26, - 214, + 172, 234, 20, - 1, - 225, + 3, + 194, 10, 30, - 208, - 11, - 119, + 229, + 22, + 239, 20, 27, 0, 11, - 248, 27, + 240, 83, 72, 73, 70, - 64, + 128, 38, - 123, + 246, 5, 5, 28, 213, - 97, + 194, 35, - 229, - 91, + 250, + 182, 211, 82, - 115, + 230, 228, 41, - 39, + 79, 29, 0, - 219, 13, + 183, 27, 246, 76, - 237, 89, + 219, 80, 72, 214, - 132, 89, + 9, 82, - 182, + 109, 2, - 183, + 111, 41, 67, 32, - 218, 81, + 181, 85, 171, - 208, + 161, 66, - 131, 58, + 6, 42, - 48, - 93, - 146, + 96, + 187, + 167, 70, 73, - 163, 128, - 15, - 5, - 182, + 70, + 36, + 11, 27, + 109, 67, 199, - 216, + 176, 0, 0, - 91, + 182, 217, - 112, + 225, 87, 32, - 187, 157, + 118, 82, 46, 20, - 9, - 10, - 130, - 214, + 6, + 25, + 217, + 173, 51, 159, - 178, + 100, 41, - 17, - 149, - 111, - 186, + 35, + 132, + 43, + 117, 0, 79, - 234, + 212, 157, 87, - 86, - 69, + 172, + 90, 44, - 22, - 239, + 45, + 222, 137, 86, 32, 65, 76, - 97, + 194, 106, - 109, + 218, 195, - 10, + 21, 133, - 202, + 148, 20, - 93, + 186, 22, 89, - 13, + 26, 9, 77, - 99, + 198, 116, 73, - 11, + 23, 147, 76, - 133, 65, + 10, 85, - 9, + 18, 250, - 54, + 109, 13, 4, - 227, + 198, 23, 1, - 134, - 108, + 155, + 217, 68, 42, - 157, + 58, 82, 67, - 50, - 67, - 64, - 68, - 110, + 100, + 88, + 128, + 89, + 220, 43, 4, - 107, + 214, 170, 63, - 82, - 89, - 19, + 164, + 110, + 38, 44, - 62, + 124, 79, 85, - 24, + 48, 6, - 36, + 73, 241, - 141, + 27, 6, - 189, 45, + 123, 149, - 172, 19, + 88, 123, - 44, - 51, + 88, + 102, 30, 3, - 88, + 176, 95, - 13, + 26, 73, - 40, - 163, - 219, + 81, + 184, + 182, 96, 84, 31, - 3, - 134, + 7, 11, + 12, 31, - 109, + 219, 18, 77, - 188, 181, + 120, 73, 90, 69, - 33, + 67, 85, - 211, + 166, 8, - 48, - 7, + 69, + 15, 127, - 142, 32, + 28, 86, - 11, + 22, 91, 71, - 9, + 18, 127, - 44, + 88, 74, - 123, + 246, 32, 77, 73, 198, - 67, + 135, 106, - 248, + 241, 72, 82, 79, 32, - 246, + 236, 56, 53, - 125, + 251, 18, 2, 9, - 207, 4, + 158, 53, - 97, + 194, 20, - 33, + 67, 116, - 163, + 70, 88, 198, - 90, + 181, 67, - 194, + 132, 20, - 110, + 221, 57, 4, - 181, 24, + 107, 172, - 161, 193, + 66, 83, - 5, - 255, + 11, 81, + 254, 32, 49, 32, 70, 87, - 26, + 53, 173, - 147, + 39, 80, - 142, 7, + 28, 254, - 99, + 198, 20, 50, - 32, - 54, + 64, + 109, 51, 4, - 251, + 246, 92, 85, 83, 66, 17, - 5, - 32, + 10, + 65, 122, - 219, + 183, 52, 4, 96, - 141, 67, + 26, 20, - 94, - 145, - 18, + 188, + 166, + 37, 85, - 221, + 187, 211, 86, - 134, 24, + 12, 118, - 26, - 11, - 176, - 37, - 233, + 53, + 11, + 97, + 58, + 211, 79, - 197, - 131, + 218, + 7, 178, - 198, + 140, 58, 96, - 116, + 233, 5, - 201, 13, + 146, 92, - 22, + 44, 20, - 7, + 14, 53, - 51, + 102, 41, - 48, - 204, + 97, 199, + 152, 116, - 59, + 118, 6, 4, - 108, + 216, 100, 41, - 88, + 176, 20, - 28, + 57, 54, - 205, + 155, 95, - 182, 80, + 109, 192, 71, - 208, + 161, 25, - 206, 215, + 156, 9, - 104, + 208, 223, - 18, - 82, - 221, + 37, + 103, + 186, 128, 49, - 109, + 219, 4, 90, - 246, 20, + 236, 73, 242, - 44, + 88, 245, - 24, + 48, 47, - 103, + 207, 10, 20, - 185, + 115, 246, - 135, 21, + 15, 17, - 220, 2, + 185, 48, 20, - 224, + 193, 74, - 213, 148, + 171, 83, - 159, - 112, + 133, + 63, 85, 82, 66, - 133, 79, + 10, 11, - 101, + 203, 224, - 220, + 185, 2, 79, - 206, + 156, 20, 50, - 75, - 146, + 151, 3, - 67, + 36, + 134, 16, - 88, + 176, 58, 20, - 51, + 102, 55, - 66, + 133, 68, 106, - 142, + 28, 173, - 107, + 214, 42, 137, - 38, + 77, 4, - 235, + 214, 82, 67, 192, - 119, + 239, 76, 32, 98, - 172, - 196, - 219, + 89, + 217, + 182, 41, 56, - 98, + 196, 191, - 19, + 38, 199, - 115, + 230, 0, 126, - 16, - 132, + 33, 235, - 174, - 106, 9, + 92, + 106, + 19, 62, - 176, + 97, 0, - 53, - 193, - 251, + 41, + 104, + 66, 179, - 22, + 45, 212, - 216, + 176, 71, 20, - 10, - 208, + 21, + 161, 251, - 134, 8, - 192, + 13, + 128, 20, - 99, + 198, 13, 40, - 44, - 8, - 131, - 24, - 231, + 88, + 16, + 152, + 49, + 206, 161, 39, - 55, + 110, 138, 65, 71, - 13, + 26, 247, 76, - 109, + 218, 71, 75, - 101, + 203, 200, - 186, + 117, 170, 1, - 199, + 143, 7, 65, 85, - 177, 88, + 99, 32, - 179, 83, + 103, 42, - 236, 97, + 217, 103, 101, 35, - 184, + 112, 8, - 118, + 236, 204, 167, - 88, - 91, + 176, + 182, 171, 65, 100, - 93, + 187, 124, 74, - 181, 69, + 106, 225, - 32, + 65, 6, - 164, + 72, 236, - 88, + 176, 19, - 91, + 183, 90, - 153, + 50, 234, - 107, + 214, 142, - 45, - 209, + 91, 161, + 163, 65, - 173, 147, + 90, 131, - 2, + 5, 33, - 165, + 74, 52, - 97, + 195, 186, - 216, + 176, 4, 126, - 8, - 146, - 103, - 210, + 17, + 37, + 124, + 164, 192, - 2, 4, + 9, 75, - 176, - 236, + 97, 54, + 216, 102, - 22, + 44, 137, - 16, - 110, + 32, + 221, 3, - 141, 66, + 26, 170, - 96, + 193, 15, - 129, + 2, 216, - 66, + 133, 190, - 195, + 134, 80, 57, - 86, + 172, 68, 89, - 93, + 186, 27, - 110, + 220, 34, 70, 85, - 49, + 98, 75, - 96, + 192, 108, - 32, - 81, + 64, + 163, 77, - 235, 246, + 215, 59, - 172, + 88, 75, 20, - 6, + 12, 28, - 13, - 134, - 173, + 91, + 57, 88, + 90, 147, - 73, + 146, 236, - 13, + 27, 29, - 192, 3, + 128, 0, 0, 0, 0, - 0, - 159, + 1, + 63, 255, }; diff --git a/resource/menu_layouts.cpp b/resource/menu_layouts.cpp index 114518440..3d9300db4 100644 --- a/resource/menu_layouts.cpp +++ b/resource/menu_layouts.cpp @@ -11,7 +11,7 @@ ExitPage ***/ -menu_t<4> boot_menu_layout = { +menu_t boot_menu_layout = { "BOOT", { // m r n d p f o @@ -24,7 +24,7 @@ menu_t<4> boot_menu_layout = { }; -menu_t<2> start_menu_layout = { +menu_t start_menu_layout = { "PROJECT", { // m r n d p f o @@ -34,7 +34,7 @@ menu_t<2> start_menu_layout = { 0, 0 }; -menu_t<6> system_menu_layout = { +menu_t system_menu_layout = { "CONFIG", { // m r n d p f o @@ -49,7 +49,7 @@ menu_t<6> system_menu_layout = { 0, 0 }; -menu_t<1> auxconfig_menu_layout = { +menu_t auxconfig_menu_layout = { "AUX PAGES", { // m r n d p f o @@ -58,7 +58,7 @@ menu_t<1> auxconfig_menu_layout = { 0, 0, }; -menu_t<1> rampage1_menu_layout = { +menu_t rampage1_menu_layout = { "RAM PAGE", { // m r n d p f o @@ -67,7 +67,7 @@ menu_t<1> rampage1_menu_layout = { 0, 0 }; -menu_t<5> midiconfig_menu_layout = { +menu_t midiconfig_menu_layout = { "MIDI", { {"PORT CONFIG", 0, 0, 0, 0, 12, 0, 0}, @@ -79,7 +79,7 @@ menu_t<5> midiconfig_menu_layout = { 0, 0 }; -menu_t<5> midiport_menu_layout = { +menu_t midiport_menu_layout = { "PORTS", { {"TURBO 1:", 0, 4, 4, 2, 0, 0, 2}, @@ -91,7 +91,7 @@ menu_t<5> midiport_menu_layout = { 24, 0 }; -menu_t<3> midiprogram_menu_layout = { +menu_t midiprogram_menu_layout = { "PROGRAM", { {"PRG MODE:", 0, 2, 2, 49, 0, 0, 90}, @@ -102,7 +102,7 @@ menu_t<3> midiprogram_menu_layout = { }; -menu_t<4> midiclock_menu_layout = { +menu_t midiclock_menu_layout = { "SYNC", { {"CLOCK RECV:", 0, 3, 3, 5, 0, 0, 7}, @@ -113,7 +113,7 @@ menu_t<4> midiclock_menu_layout = { 24, 0 }; -menu_t<4> midiroute_menu_layout = { +menu_t midiroute_menu_layout = { "ROUTE", { // m r n d p f o @@ -127,7 +127,7 @@ menu_t<4> midiroute_menu_layout = { 24, 0 }; -menu_t<3> midimachinedrum_menu_layout = { +menu_t midimachinedrum_menu_layout = { "MD MIDI", { // m r n d p f o @@ -139,7 +139,7 @@ menu_t<3> midimachinedrum_menu_layout = { }; -menu_t<3> mdconfig_menu_layout = { +menu_t mdconfig_menu_layout = { "MD", { // m r n d p f o @@ -150,7 +150,7 @@ menu_t<3> mdconfig_menu_layout = { 0, 0 }; -menu_t<4> mdimport_menu_layout = { +menu_t mdimport_menu_layout = { "MD", { // m r n d p f o @@ -162,7 +162,7 @@ menu_t<4> mdimport_menu_layout = { 0, 0 }; -menu_t<1> mclconfig_menu_layout = { +menu_t mclconfig_menu_layout = { "SYSTEM", { // m r n d p f o @@ -171,7 +171,7 @@ menu_t<1> mclconfig_menu_layout = { 1, 0 }; -menu_t<7> file_menu_layout = { +menu_t file_menu_layout = { "FILE", { // m r n d p f o @@ -186,11 +186,12 @@ menu_t<7> file_menu_layout = { 0, 0 }; -menu_t<20> seq_menu_layout = { +menu_t seq_menu_layout = { "SEQ", { // m r n d p f o {"TRACK SEL:", 1, 17, 0, 14, 0, 3, 0}, + {"DEVICE:", 0, 2, 2, 50, 0, 0, 128}, {"EDIT:", 0, 4, 4, 15, 0, 4, 48}, {"EDIT:", 0, 1 + NUM_LOCKS, 1, 16, 0, 0, 54}, {"CC:", 0, 133, 5, 17, 0, 0, 55}, @@ -214,7 +215,7 @@ menu_t<20> seq_menu_layout = { 14, 0 }; -menu_t<4> step_menu_layout = { +menu_t step_menu_layout = { "STP", { // m r n d p f o From ff0aa0e9db7e9c066d0d5d1cfb3cfebfa7c2d955 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 21 Jun 2023 21:29:29 +1000 Subject: [PATCH 065/413] fix gen device names --- avr/cores/megacommand/MCL/MenuPage.cpp | 5 +- avr/cores/megacommand/MCL/SeqPage.cpp | 4 +- avr/cores/megacommand/resources/R.h | 4 +- .../megacommand/resources/R_menu_layouts.cpp | 589 +++++++++--------- resource/menu_layouts.cpp | 2 +- 5 files changed, 303 insertions(+), 301 deletions(-) diff --git a/avr/cores/megacommand/MCL/MenuPage.cpp b/avr/cores/megacommand/MCL/MenuPage.cpp index 36412d5fa..f4981d616 100644 --- a/avr/cores/megacommand/MCL/MenuPage.cpp +++ b/avr/cores/megacommand/MCL/MenuPage.cpp @@ -34,9 +34,8 @@ void MenuPageBase::gen_menu_device_names() { m->set_custom_options(p); for (uint8_t n = 0; n < NUM_DEVS; n++) { - uint8_t row_id = n; - p->pos = n; - strcpy(p->name,midi_active_peering.get_device(UART1_PORT)->name); + p->pos = n + 1; + strcpy(p->name,midi_active_peering.get_device(n + 1)->name); p++; } diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index 3a426a6da..fa9aa24fa 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -437,8 +437,8 @@ bool SeqPage::handleEvent(gui_event_t *event) { encoders[0] = &seq_menu_value_encoder; encoders[1] = &seq_menu_entry_encoder; seq_menu_page.init(); - step_menu_page.gen_menu_device_names(); - mcl_cfg.seq_dev = midi_device == &MD ? 0 : 1; + seq_menu_page.gen_menu_device_names(); + mcl_cfg.seq_dev = midi_device == &MD ? UART1_PORT : UART2_PORT; return true; } } diff --git a/avr/cores/megacommand/resources/R.h b/avr/cores/megacommand/resources/R.h index 3608a5c69..1fb79cac9 100644 --- a/avr/cores/megacommand/resources/R.h +++ b/avr/cores/megacommand/resources/R.h @@ -391,10 +391,10 @@ struct __T_menu_layouts { static constexpr size_t countof_auxconfig_menu_layout = 33 / sizeof(menu_t); static constexpr size_t sizeofof_auxconfig_menu_layout = 33; union { - menu_t system_menu_layout[0]; + menu_t system_menu_layout[0]; char zz__system_menu_layout[138]; }; - static constexpr size_t countof_system_menu_layout = 138 / sizeof(menu_t); + static constexpr size_t countof_system_menu_layout = 138 / sizeof(menu_t); static constexpr size_t sizeofof_system_menu_layout = 138; union { menu_t start_menu_layout[0]; diff --git a/avr/cores/megacommand/resources/R_menu_layouts.cpp b/avr/cores/megacommand/resources/R_menu_layouts.cpp index 1aae21123..189664bf2 100644 --- a/avr/cores/megacommand/resources/R_menu_layouts.cpp +++ b/avr/cores/megacommand/resources/R_menu_layouts.cpp @@ -232,787 +232,790 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 86, 73, 67, - 107, + 100, 171, - 116, - 46, + 251, + 1, + 3, + 2, 50, - 224, 233, - 148, + 130, 178, - 219, + 83, 15, + 109, 3, 48, - 100, + 144, 20, - 61, + 246, 9, 1, 16, - 190, 4, + 251, 54, 67, 67, 58, - 192, 208, - 251, + 3, + 237, 133, 5, 17, 4, - 120, + 225, 55, 83, 76, - 86, 166, + 88, 254, - 19, + 77, 18, - 109, + 182, 4, 25, - 191, 218, + 255, 80, 69, 71, 71, 73, - 225, 65, 84, + 132, 79, 223, - 14, + 59, 10, - 208, 146, - 143, + 66, 241, + 61, 80, 79, 83, - 96, + 131, 45, - 218, 12, + 107, 175, - 235, 5, + 172, 86, 161, - 16, - 150, + 66, 124, - 24, + 88, + 96, 38, - 55, + 220, 28, 79, 78, 68, - 8, + 32, 229, - 15, + 61, 15, 15, 21, - 110, + 187, 5, 60, 83, - 219, 82, + 108, 69, 21, - 1, - 198, 7, 7, + 7, + 27, 46, - 225, 5, + 134, 41, 229, - 188, + 236, 71, 84, 72, - 58, - 146, - 58, + 209, + 152, + 129, + 235, 65, 6, - 219, 62, + 109, 72, 104, - 108, + 178, 78, 87, - 151, + 93, 251, - 91, 24, + 108, 45, 0, - 9, + 36, 187, - 15, + 63, 3, 3, 25, - 225, 0, 8, + 132, 27, 133, - 11, - 117, + 45, + 214, 20, 26, - 172, 234, + 176, 20, - 3, - 194, + 15, 10, 30, + 8, 229, - 22, - 239, + 91, 20, + 191, 27, 0, 11, 27, - 240, 83, 72, + 194, 73, 70, - 128, 38, - 246, + 3, 5, + 219, 5, 28, 213, - 194, 35, + 10, 250, - 182, + 219, 211, 82, - 230, 228, + 153, 41, - 79, + 62, 29, 0, 13, - 183, 27, + 223, 246, 76, 89, - 219, 80, 72, + 108, 214, 89, - 9, + 37, 82, - 109, + 181, 2, - 111, + 190, 41, 67, 32, 81, - 181, 85, + 214, 171, - 161, 66, + 132, 58, - 6, + 25, 42, - 96, - 187, + 130, 167, + 237, 70, 73, 128, - 70, + 24, 36, - 11, + 45, 27, - 109, + 182, 67, 199, - 176, 0, + 194, 0, - 182, + 219, 217, - 225, 87, + 133, 32, 157, - 118, + 216, 82, 46, 20, - 6, - 25, + 24, + 102, 217, - 173, 51, + 181, 159, - 100, + 144, 41, - 35, + 140, 132, - 43, - 117, + 173, + 215, 0, 79, - 212, 157, + 82, 87, - 172, 90, + 176, 44, - 45, - 222, + 183, 137, + 123, 86, 32, 65, 76, - 194, 106, - 218, + 11, + 104, 195, - 21, + 86, 133, - 148, 20, - 186, + 82, + 232, 22, 89, - 26, + 107, 9, 77, - 198, 116, + 24, 73, - 23, + 92, 147, 76, 65, - 10, + 40, 85, - 18, + 73, 250, - 109, + 183, 13, 4, - 198, 23, 1, + 27, 155, - 217, 68, + 100, 42, - 58, + 233, 82, 67, - 100, 88, - 128, + 146, 89, - 220, + 3, 43, + 115, 4, - 214, 170, + 90, 63, - 164, + 144, 110, - 38, + 153, 44, - 124, + 240, 79, 85, - 48, + 193, 6, - 73, 241, - 27, + 36, + 109, 6, 45, - 123, + 237, 149, 19, - 88, + 97, 123, - 88, - 102, + 97, 30, + 154, 3, - 176, + 192, 95, - 26, + 105, 73, - 81, 184, - 182, + 70, 96, + 216, 84, 31, - 7, + 28, 11, - 12, + 51, 31, - 219, 18, + 109, 77, 181, - 120, + 225, 73, 90, 69, - 67, 85, - 166, + 14, 8, + 152, 69, - 15, + 60, 127, 32, - 28, + 112, 86, - 22, + 88, 91, 71, - 18, + 73, 127, - 88, + 99, 74, - 246, 32, + 218, 77, 73, 198, - 135, + 31, 106, - 241, 72, 82, + 199, 79, 32, - 236, 56, + 179, 53, - 251, + 238, 18, 2, 9, 4, - 158, + 123, 53, - 194, 20, - 67, + 9, + 13, 116, - 70, 88, + 26, 198, - 181, + 214, 67, - 132, 20, - 221, + 19, 57, + 117, 4, 24, - 107, + 173, 172, 193, - 66, + 8, 83, - 11, + 47, 81, - 254, + 248, 32, 49, 32, 70, 87, - 53, + 212, 173, - 39, + 156, 80, 7, - 28, + 115, 254, - 198, 20, + 25, 50, - 64, - 109, + 1, + 183, 51, 4, - 246, 92, 85, + 216, 83, 66, 17, - 10, - 65, + 41, 122, - 183, + 6, 52, + 220, 4, 96, 67, - 26, + 106, 20, - 188, + 240, 166, - 37, + 150, 85, - 187, + 236, 211, 86, 24, - 12, + 48, 118, - 53, + 213, 11, - 97, + 135, 58, - 211, 79, + 76, 218, - 7, + 30, 178, - 140, 58, + 51, 96, - 233, + 166, 5, 13, - 146, + 72, 92, - 44, + 176, 20, - 14, + 57, 53, - 102, + 153, 41, - 97, + 134, 199, - 152, + 97, 116, - 118, + 219, 6, 4, - 216, 100, + 98, 41, - 176, + 192, 20, - 57, + 230, 54, - 155, + 109, 95, 80, - 109, + 182, 192, 71, - 161, 25, + 134, 215, - 156, + 115, 9, - 208, 223, - 37, + 64, + 150, 103, - 186, + 235, 128, 49, - 219, 4, + 111, 90, 20, - 236, + 177, 73, 242, - 88, + 96, 245, - 48, + 195, 47, - 207, 10, + 61, 20, - 115, + 204, 246, 21, - 15, + 62, 17, 2, - 185, 48, + 231, 20, - 193, 74, + 6, 148, - 171, + 172, 83, 133, - 63, + 252, 85, 82, 66, 79, - 10, + 43, 11, - 203, 224, - 185, + 46, 2, + 230, 79, - 156, 20, + 114, 50, - 151, + 92, 3, - 36, - 134, + 146, + 26, 16, - 176, 58, + 193, 20, - 102, + 154, 55, - 133, 68, + 20, 106, - 28, + 115, 173, - 214, 42, + 89, 137, - 77, + 55, 4, - 214, 82, + 91, 67, 192, - 239, 76, + 189, 32, 98, - 89, + 102, 217, - 182, + 219, 41, 56, - 196, 191, - 38, + 16, + 155, 199, - 230, 0, + 152, 126, - 33, + 132, 235, - 9, - 92, + 37, + 112, 106, - 19, + 77, 62, - 97, + 132, 0, - 41, + 165, 104, - 66, + 8, 179, - 45, + 182, 212, - 176, 71, + 192, 20, - 21, - 161, + 86, 251, + 132, 8, - 13, - 128, + 54, 20, - 198, + 3, 13, + 25, 40, - 88, - 16, + 96, + 64, 152, - 49, - 206, + 199, 161, + 57, 39, - 110, + 184, 138, 65, 71, - 26, + 107, 247, 76, - 218, 71, + 107, 75, - 203, 200, - 117, + 45, + 214, 170, 1, - 143, 7, + 61, 65, 85, 88, - 99, + 141, 32, 83, - 103, + 159, 42, 97, - 217, 103, 101, + 101, 35, - 112, + 195, 8, - 236, 204, + 178, 167, - 176, - 182, + 194, 171, + 218, 65, 100, - 187, + 237, 124, 74, 69, - 106, + 169, 225, - 65, 6, - 72, + 5, + 34, 236, - 176, + 194, 19, - 183, + 220, 90, - 50, + 203, 234, - 214, + 89, 142, - 91, + 110, 161, - 163, + 141, 65, 147, - 90, + 104, 131, - 5, + 21, 33, - 74, + 43, 52, - 195, 186, - 176, + 14, 4, + 192, 126, - 17, - 37, + 68, + 150, 124, - 164, + 144, 192, - 4, - 9, + 16, + 37, 75, - 97, + 135, 54, - 216, + 96, 102, - 44, + 176, 137, - 32, - 221, + 131, + 116, 3, 66, - 26, + 107, 170, - 193, 15, - 2, + 4, + 10, 216, - 133, + 22, 190, - 134, 80, + 26, 57, - 172, 68, + 178, 89, - 186, + 235, 27, - 220, 34, + 113, 70, 85, - 98, + 139, 75, - 192, 108, - 64, - 163, + 1, + 2, 77, + 143, 246, - 215, + 93, 59, - 88, 75, + 96, 20, - 12, + 49, 28, - 91, + 109, 57, 88, - 90, + 106, 147, - 146, + 72, 236, - 27, + 110, 29, 3, - 128, 0, 0, 0, 0, - 1, - 63, + 0, + 4, + 255, 255, }; diff --git a/resource/menu_layouts.cpp b/resource/menu_layouts.cpp index 3d9300db4..9c93b00a0 100644 --- a/resource/menu_layouts.cpp +++ b/resource/menu_layouts.cpp @@ -191,7 +191,7 @@ menu_t seq_menu_layout = { { // m r n d p f o {"TRACK SEL:", 1, 17, 0, 14, 0, 3, 0}, - {"DEVICE:", 0, 2, 2, 50, 0, 0, 128}, + {"DEVICE:", 1, 3, 2, 50, 0, 0, 128}, {"EDIT:", 0, 4, 4, 15, 0, 4, 48}, {"EDIT:", 0, 1 + NUM_LOCKS, 1, 16, 0, 0, 54}, {"CC:", 0, 133, 5, 17, 0, 0, 55}, From 9e3c16c92ba2f4838fc61eb60f84fbcabc6edc1a Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 22 Jun 2023 10:53:30 +1000 Subject: [PATCH 066/413] Fix LED state MixerPage --- avr/cores/megacommand/MCL/MixerPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index f2e8f753b..bd8d8f159 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -574,7 +574,7 @@ bool MixerPage::handleEvent(gui_event_t *event) { global_release: show_mixer_menu = false; disable_record_mutes(); - MD.set_trigleds(0, TRIGLED_EXCLUSIVE); + MD.set_trigleds(0, TRIGLED_OVERLAY); oled_draw_mutes(); return true; } From 0feacd968e4e54cd90051a3a96833a4e93e5da0a Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 22 Jun 2023 10:54:17 +1000 Subject: [PATCH 067/413] Allow device toggle via Scale button in SeqPtcPage --- avr/cores/megacommand/MCL/SeqPtcPage.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.cpp b/avr/cores/megacommand/MCL/SeqPtcPage.cpp index fd212db70..f360160e3 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPtcPage.cpp @@ -566,6 +566,11 @@ bool SeqPtcPage::handleEvent(gui_event_t *event) { draw_popup_octave(); return true; } + case MDX_KEY_SCALE: { + midi_device = midi_device == &MD ? midi_active_peering.get_device(UART2_PORT) : midi_active_peering.get_device(UART1_PORT); + config(); + return true; + } } } } From 479f9e5589e54bec65039a2b5009d477efd36bc2 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 22 Jun 2023 11:52:14 +1000 Subject: [PATCH 068/413] offset midi note from MD by 12 --- avr/cores/megacommand/MCL/SeqPtcPage.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.cpp b/avr/cores/megacommand/MCL/SeqPtcPage.cpp index f360160e3..b809cf6ba 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPtcPage.cpp @@ -513,7 +513,9 @@ bool SeqPtcPage::handleEvent(gui_event_t *event) { bool is_poly = IS_BIT_SET16(mcl_cfg.poly_mask, last_md_track); channel_event = is_poly ? POLY_EVENT : CTRL_EVENT; } - + else { + note += MIDI_NOTE_C1; + } uint8_t msg[] = {MIDI_NOTE_ON | (is_md ? last_md_track : last_ext_track), note, 127}; @@ -635,7 +637,7 @@ uint8_t SeqPtcPage::process_ext_event(uint8_t note_num, bool note_type, return 255; } pitch += ptc_param_oct.cur * 12; - return pitch; + return (pitch < 128) ? pitch : 255; } uint8_t SeqPtcPage::is_md_midi(uint8_t channel) { From 32969f1e4c87eec21517ad3319d89553960045cc Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 22 Jun 2023 12:15:30 +1000 Subject: [PATCH 069/413] Improve arp LATCH mode, latch resets on new chord --- avr/cores/megacommand/MCL/SeqPtcPage.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.cpp b/avr/cores/megacommand/MCL/SeqPtcPage.cpp index b809cf6ba..f251d96af 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPtcPage.cpp @@ -623,6 +623,11 @@ uint8_t SeqPtcPage::process_ext_event(uint8_t note_num, bool note_type, dev_note_channels[dev] = channel; if (note_type) { + if (arp_enabled.cur == ARP_LATCH) { + if (seq_ptc_page.dev_note_masks[dev][0] == 0 && seq_ptc_page.dev_note_masks[dev][1] == 0) { + memset(seq_ptc_page.note_mask,0,sizeof(seq_ptc_page.note_mask)); + } + } SET_BIT128_P(seq_ptc_page.dev_note_masks[dev], note_num); if (pitch != 255) { SET_BIT128_P(seq_ptc_page.note_mask, pitch); From 2f4a6b55a599aaa43a913fb4a7a38295629f31e1 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 22 Jun 2023 18:03:57 +1000 Subject: [PATCH 070/413] Update seqptcpage encoders upon ext track length change --- avr/cores/megacommand/MCL/MDTrackSelect.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/avr/cores/megacommand/MCL/MDTrackSelect.cpp b/avr/cores/megacommand/MCL/MDTrackSelect.cpp index a1fc7b44a..46d7cdc26 100644 --- a/avr/cores/megacommand/MCL/MDTrackSelect.cpp +++ b/avr/cores/megacommand/MCL/MDTrackSelect.cpp @@ -45,12 +45,12 @@ void MDTrackSelect::end() { DEBUG_PRINTLN(sysex->get_recordLen()); DEBUG_PRINTLN(msg_rd); if (sysex->get_recordLen() == 8) { - bool is_md_device = opt_midi_device_capture == &MD && (GUI.currentPage() != &seq_extstep_page); + bool is_md_device = SeqPage::midi_device == &MD && (GUI.currentPage() != &seq_extstep_page); bool expand = true; reset_undo(); uint8_t length = sysex->getByte(6); uint8_t new_speed = sysex->getByte(7); - if (GUI.currentPage() == &seq_step_page || GUI.currentPage() == &seq_extstep_page) { + if (GUI.currentPage() == &seq_step_page || GUI.currentPage() == &seq_extstep_page || GUI.currentPage() == &seq_ptc_page) { if (seq_step_page.recording) { goto update_pattern; } @@ -69,8 +69,12 @@ void MDTrackSelect::end() { mcl_seq.ext_tracks[n].set_speed(new_speed); if (GUI.currentPage() == &seq_extstep_page) { seq_extparam4.cur = length; } } - - seq_step_page.config_encoders(); + if (GUI.currentPage() == &seq_ptc_page) { + seq_ptc_page.config_encoders(); + } + if (GUI.currentPage() == &seq_step_page) { + seq_step_page.config_encoders(); + } } else { update_pattern: uint8_t old_speeds[16]; From b59caeb326906f1ca006f234fd6b409ac1bdd679 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 22 Jun 2023 18:25:36 +1000 Subject: [PATCH 071/413] fix seq_menu track select + mute, dont enter menu functions --- avr/cores/megacommand/MCL/MenuPage.h | 1 + avr/cores/megacommand/MCL/SeqPage.cpp | 56 ++--------------------- avr/cores/megacommand/MCL/SeqStepPage.cpp | 8 +++- 3 files changed, 12 insertions(+), 53 deletions(-) diff --git a/avr/cores/megacommand/MCL/MenuPage.h b/avr/cores/megacommand/MCL/MenuPage.h index 5e4b670e1..4f8975e58 100644 --- a/avr/cores/megacommand/MCL/MenuPage.h +++ b/avr/cores/megacommand/MCL/MenuPage.h @@ -32,6 +32,7 @@ class MenuPageBase : public LightPage { void select_item(uint8_t item = 0) { cur_row = 0; encoders[1]->cur = 0; + encoders[1]->old = 0; } void loop(); void display(); diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index fa9aa24fa..1a14b8ca2 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -275,60 +275,12 @@ bool SeqPage::handleEvent(gui_event_t *event) { MidiDevice *device = midi_active_peering.get_device(port); uint8_t track = event->source - 128; - // =================== seq menu mode TI events ================ - if (show_seq_menu) { - // TI + SHIFT2 = select track. - if (BUTTON_DOWN(Buttons.BUTTON3) && (mcl_cfg.track_select == 0)) { - opt_trackid = track + 1; - note_interface.ignoreNextEvent(track); - select_track(device, track); - seq_menu_page.select_item(0); - } - - return true; - } - - // =================== normal mode TI events ================ - - // TI + WRITE (BUTTON4): adjust track seq length. - // Ignore WRITE release event so it won't trigger - // a page select action. + //Removing this block causes progmem to balloon by 1K ?? if (BUTTON_DOWN(Buttons.BUTTON4)) { // calculate the intended seq length. uint8_t step = track; step += 1 + page_select * 16; - // Further, if SHIFT2 is pressed, set all tracks. - /* not required. pattern_len_handler will detect change when - * encoder is updated below */ - /* - if (SeqPage::midi_device == DEVICE_MD) { - char str[4]; - itoa(step, str, 10); - - if (BUTTON_DOWN(Buttons.BUTTON3)) { - oled_display.textbox("MD TRACKS LEN:", str); - GUI.ignoreNextEvent(Buttons.BUTTON3); - for (uint8_t n = 0; n < NUM_MD_TRACKS; n++) { - mcl_seq.md_tracks[n].length = step; - } - } - else { - oled_display.textbox("MD TRACK LEN:", str); - mcl_seq.md_tracks[last_md_track].length = step; - } - } -#ifdef EXT_TRACKS - else { - if (BUTTON_DOWN(Buttons.BUTTON3)) { - for (uint8_t n = 0; n < NUM_EXT_TRACKS; n++) { - mcl_seq.ext_tracks[n].length = step; - } - } - mcl_seq.ext_tracks[last_ext_track].length = step; - } -#endif -*/ encoders[2]->cur = step; note_interface.ignoreNextEvent(track); if (event->mask == EVENT_BUTTON_RELEASED) { @@ -338,9 +290,9 @@ bool SeqPage::handleEvent(gui_event_t *event) { if (BUTTON_DOWN(Buttons.BUTTON3)) { GUI.ignoreNextEvent(Buttons.BUTTON3); } + return true; } - // notify derived class about unhandled TI event return false; } // end TI events @@ -396,8 +348,8 @@ bool SeqPage::handleEvent(gui_event_t *event) { if (EVENT_PRESSED(event, Buttons.BUTTON2)) { GUI.setPage(&page_select_page); } - // activate show_seq_menu only if S2 press is not a key combination - if (EVENT_PRESSED(event, Buttons.BUTTON3) && !BUTTON_DOWN(Buttons.BUTTON4)) { + + if (EVENT_PRESSED(event, Buttons.BUTTON3)) { // If MD trig is held and BUTTON3 is pressed, launch note menu if ((note_interface.notes_count_on() != 0) && (!show_step_menu) && (GUI.currentPage() != &seq_ptc_page)) { diff --git a/avr/cores/megacommand/MCL/SeqStepPage.cpp b/avr/cores/megacommand/MCL/SeqStepPage.cpp index f4e4fd116..58ae1c7a9 100644 --- a/avr/cores/megacommand/MCL/SeqStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqStepPage.cpp @@ -312,7 +312,13 @@ bool SeqStepPage::handleEvent(gui_event_t *event) { if (device != &MD) { return true; } - + if (show_seq_menu) { + opt_trackid = track + 1; + note_interface.ignoreNextEvent(track); + select_track(device, track); + seq_menu_page.select_item(0); + return true; + } uint8_t step = track + (page_select * 16); step_select = track; From 8a9f4e6ee5974fa4b33aa0c7b7071ede4024f5be Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 22 Jun 2023 23:20:53 +1000 Subject: [PATCH 072/413] bugs related to multi slot select --- avr/cores/megacommand/MCL/GridPage.cpp | 21 +++++++-------------- avr/cores/megacommand/MCL/GridPage.h | 2 +- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/avr/cores/megacommand/MCL/GridPage.cpp b/avr/cores/megacommand/MCL/GridPage.cpp index 08df73da6..4f142c6c7 100644 --- a/avr/cores/megacommand/MCL/GridPage.cpp +++ b/avr/cores/megacommand/MCL/GridPage.cpp @@ -72,8 +72,6 @@ void GridPage::send_row_led() { if (row >= GRID_LENGTH) { return; } SET_BIT128_P(&rows, grid_task.last_active_row); uint16_t *blink_mask = (uint16_t *)&rows[0]; - DEBUG_PRINTLN("Sending row led"); - DEBUG_PRINTLN(blink_mask[grid_page.bank]); MD.set_trigleds(blink_mask[grid_page.bank], TRIGLED_EXCLUSIVENDYNAMIC, 1); } void GridPage::close_bank_popup() { @@ -100,7 +98,7 @@ void GridPage::load_old_col() { encoders[2]->old = encoders[2]->cur; grid_page.grid_select_apply = 0; proj.grid_select = 0; - ((MCLEncoder *)encoders[2])->max = getWidth() + 1 - getCol(); + ((MCLEncoder *)encoders[2])->max = getWidth() + 1; } void GridPage::loop() { @@ -111,12 +109,12 @@ void GridPage::loop() { old_col = cur_col; cur_col = 0; param1.cur = grid_page.cur_col; - param2.old = grid_page.cur_col; + param1.old = grid_page.cur_col; encoders[2]->cur = 1; encoders[2]->old = 1; grid_page.grid_select_apply = 1; proj.grid_select = 1; - ((MCLEncoder *)encoders[2])->max = getWidth() - getCol(); + ((MCLEncoder *)encoders[2])->max = getWidth(); load_slot_models(); reload_slot_models = true; } @@ -262,7 +260,7 @@ uint8_t GridPage::getCol() { return param1.cur; } uint8_t GridPage::getWidth() { return GRID_WIDTH; } void GridPage::load_slot_models() { - DEBUG_PRINT_FN(); + DEBUG_PRINTLN("load slot models"); uint8_t row_shift = 0; if ((cur_row + encoders[3]->cur > MAX_VISIBLE_ROWS - 1)) { row_shift = cur_row + encoders[3]->cur - MAX_VISIBLE_ROWS; @@ -602,11 +600,11 @@ void rename_row() { void apply_slot_changes_cb() { grid_page.apply_slot_changes(); } -void GridPage::swap_grids() { +bool GridPage::swap_grids() { if (grid_select_apply != proj.grid_select) { proj.grid_select = grid_select_apply; ((MCLEncoder *)encoders[0])->max = getWidth() - 1; - // load_slot_models(); + //load_slot_models(); return; } } @@ -615,7 +613,6 @@ void GridPage::apply_slot_changes(bool ignore_undo, bool ignore_func) { uint8_t width; uint8_t height; - uint8_t _col = getCol();; //old_col != 255 indicates that the grid selection spans grids x and y. @@ -628,7 +625,7 @@ void GridPage::apply_slot_changes(bool ignore_undo, bool ignore_func) { temp_slot.load_from_grid(_col, getRow()); if (old_col == 255) { - swap_grids(); + if (swap_grids()) { return; } } uint8_t load_mode_old = mcl_cfg.load_mode; @@ -797,10 +794,6 @@ void GridPage::apply_slot_changes(bool ignore_undo, bool ignore_func) { } load_old_col(); } - - if ((slot_clear == 1) || (slot_paste == 1) || (slot_update == 1)) { - load_slot_models(); - } mcl_cfg.load_mode = load_mode_old; slot_apply = 0; slot_load = 0; diff --git a/avr/cores/megacommand/MCL/GridPage.h b/avr/cores/megacommand/MCL/GridPage.h index 6919d0a02..0f93775d5 100644 --- a/avr/cores/megacommand/MCL/GridPage.h +++ b/avr/cores/megacommand/MCL/GridPage.h @@ -86,7 +86,7 @@ class GridPage : public LightPage { void cleanup(); void init(); void prepare(); - void swap_grids(); + bool swap_grids(); void apply_slot_changes(bool ignore_undo = false, bool ignore_func = false); void load_old_col(); void close_bank_popup(); From 16cbee508f83fcca9d3d837c4d3ba87de804b388 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 23 Jun 2023 00:15:48 +1000 Subject: [PATCH 073/413] wrong col cached --- avr/cores/megacommand/MCL/GridPage.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/avr/cores/megacommand/MCL/GridPage.cpp b/avr/cores/megacommand/MCL/GridPage.cpp index 4f142c6c7..6d570f3da 100644 --- a/avr/cores/megacommand/MCL/GridPage.cpp +++ b/avr/cores/megacommand/MCL/GridPage.cpp @@ -106,10 +106,10 @@ void GridPage::loop() { if (show_slot_menu) { if (encoders[2]->hasChanged()) { if ((proj.get_grid() == 0) && (encoders[2]->cur + cur_col > GRID_WIDTH)) { - old_col = cur_col; + old_col = getCol(); cur_col = 0; - param1.cur = grid_page.cur_col; - param1.old = grid_page.cur_col; + param1.cur = 0; + param1.old = 0; encoders[2]->cur = 1; encoders[2]->old = 1; grid_page.grid_select_apply = 1; From f2bc78e37349e854ed0848eb6693f6da4d01314a Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 23 Jun 2023 00:29:51 +1000 Subject: [PATCH 074/413] Fix cd --- avr/cores/megacommand/MCL/FileBrowserPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/FileBrowserPage.cpp b/avr/cores/megacommand/MCL/FileBrowserPage.cpp index ef040bd11..d8459512f 100644 --- a/avr/cores/megacommand/MCL/FileBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/FileBrowserPage.cpp @@ -515,13 +515,13 @@ bool FileBrowserPage::handleEvent(gui_event_t *event) { // chdir to child if (!show_samplemgr) { - child: file.open(temp_entry, O_READ); // chdir to child if (!select_dirs && file.isDirectory()) { _cd(temp_entry); return true; } + file.close(); } if (!dir_only) { From bf9274527841e3c8c2d59307b6973b422eac6a1e Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 23 Jun 2023 11:38:08 +1000 Subject: [PATCH 075/413] REC release now reverts back to last loaded page, not gridpage --- avr/cores/megacommand/MCL/MCL.cpp | 11 +++++++---- avr/cores/megacommand/MCL/SeqStepPage.h | 1 + 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCL.cpp b/avr/cores/megacommand/MCL/MCL.cpp index 83b2644ff..76d10e415 100644 --- a/avr/cores/megacommand/MCL/MCL.cpp +++ b/avr/cores/megacommand/MCL/MCL.cpp @@ -200,10 +200,11 @@ bool mcl_handleEvent(gui_event_t *event) { return false; } case MDX_KEY_REC: { - if (GUI.currentPage() != &seq_step_page && - GUI.currentPage() != &seq_ptc_page && - GUI.currentPage() != &seq_extstep_page) { + if (GUI.currentPage() != &seq_step_page && + GUI.currentPage() != &seq_ptc_page && + GUI.currentPage() != &seq_extstep_page) { seq_step_page.prepare = true; + seq_step_page.last_page = GUI.currentPage(); GUI.setPage(&seq_step_page); } else { if (seq_step_page.recording) { @@ -213,7 +214,8 @@ bool mcl_handleEvent(gui_event_t *event) { trig_interface.ignoreNextEvent(MDX_KEY_REC); } else { if (GUI.currentPage() == &seq_step_page) { - GUI.setPage(&grid_page); + trig_interface.ignoreNextEvent(MDX_KEY_REC); + GUI.setPage(seq_step_page.last_page); } } } @@ -297,6 +299,7 @@ bool mcl_handleEvent(gui_event_t *event) { GUI.currentPage() == &seq_extstep_page)) { if (GUI.currentPage() != &seq_step_page) { seq_step_page.prepare = true; + seq_step_page.last_page = GUI.currentPage(); GUI.setPage(&seq_step_page); } return true; diff --git a/avr/cores/megacommand/MCL/SeqStepPage.h b/avr/cores/megacommand/MCL/SeqStepPage.h index 0ee944d07..f76dc3d2d 100644 --- a/avr/cores/megacommand/MCL/SeqStepPage.h +++ b/avr/cores/megacommand/MCL/SeqStepPage.h @@ -25,6 +25,7 @@ class SeqStepPage : public SeqPage { uint16_t update_params_clock; uint8_t last_param_id; uint8_t last_rec_event; + LightPage *last_page = nullptr; SeqStepMidiEvents midi_events; SeqStepPage(Encoder *e1 = NULL, Encoder *e2 = NULL, Encoder *e3 = NULL, Encoder *e4 = NULL) From 6409748234a9938ab89ce94fadb6a28c2c95fae0 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 23 Jun 2023 14:42:26 +1000 Subject: [PATCH 076/413] Massive refactor, use uint8_t PageIndex instead of *LightPage --- .../megacommand/MCL/ConvertProjectPage.cpp | 2 +- avr/cores/megacommand/MCL/DSP.h | 2 +- avr/cores/megacommand/MCL/DiagnosticPage.cpp | 2 +- avr/cores/megacommand/MCL/ExtSeqTrack.h | 2 +- avr/cores/megacommand/MCL/FXPage.cpp | 18 +-- avr/cores/megacommand/MCL/FXPage.h | 2 +- avr/cores/megacommand/MCL/GridIOPage.cpp | 2 +- avr/cores/megacommand/MCL/GridLoadPage.cpp | 6 +- avr/cores/megacommand/MCL/GridPage.cpp | 16 +-- avr/cores/megacommand/MCL/GridPage.h | 2 +- avr/cores/megacommand/MCL/GridSavePage.cpp | 6 +- avr/cores/megacommand/MCL/GridTask.cpp | 2 +- avr/cores/megacommand/MCL/GridTask.h | 2 +- avr/cores/megacommand/MCL/LFO.h | 2 +- avr/cores/megacommand/MCL/LFOPage.cpp | 6 +- avr/cores/megacommand/MCL/LoadProjectPage.cpp | 2 +- avr/cores/megacommand/MCL/MCL.cpp | 119 +++++++++++----- avr/cores/megacommand/MCL/MCL.h | 91 ++++++++++--- avr/cores/megacommand/MCL/MCLActions.cpp | 2 +- avr/cores/megacommand/MCL/MCLClipBoard.cpp | 4 +- avr/cores/megacommand/MCL/MCLGUI.cpp | 12 +- avr/cores/megacommand/MCL/MCLMenus.cpp | 39 +++--- avr/cores/megacommand/MCL/MCL_impl.h | 2 +- avr/cores/megacommand/MCL/MDTrackSelect.cpp | 10 +- avr/cores/megacommand/MCL/Menu.cpp | 4 +- avr/cores/megacommand/MCL/Menu.h | 6 +- avr/cores/megacommand/MCL/MenuPage.cpp | 6 +- avr/cores/megacommand/MCL/MixerPage.cpp | 6 +- avr/cores/megacommand/MCL/Osc.h | 2 +- avr/cores/megacommand/MCL/PageSelectPage.cpp | 14 +- avr/cores/megacommand/MCL/PageSelectPage.h | 2 +- avr/cores/megacommand/MCL/Project.cpp | 4 +- avr/cores/megacommand/MCL/RAMPage.cpp | 4 +- avr/cores/megacommand/MCL/RoutePage.cpp | 6 +- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 2 +- avr/cores/megacommand/MCL/SeqPage.cpp | 14 +- avr/cores/megacommand/MCL/SeqPtcPage.cpp | 16 +-- avr/cores/megacommand/MCL/SeqStepPage.cpp | 2 +- avr/cores/megacommand/MCL/SeqStepPage.h | 2 +- avr/cores/megacommand/MCL/Shared.h | 2 +- .../megacommand/MCL/SoundBrowserPage.cpp | 2 +- avr/cores/megacommand/MCL/TrackInfoEncoder.h | 2 +- avr/cores/megacommand/MCL/WavDesigner.cpp | 6 +- avr/cores/megacommand/MCL/WavDesigner.h | 2 +- avr/cores/megacommand/MCL/WavDesignerPage.cpp | 6 +- avr/cores/megacommand/MCL/WavDesignerPage.h | 2 +- avr/cores/megacommand/ResourceManager.cpp | 29 ++-- .../megacommand/resources/R_page_entries.cpp | 128 +++++++++++------- resource/page_entries.cpp | 31 ++--- 49 files changed, 387 insertions(+), 266 deletions(-) diff --git a/avr/cores/megacommand/MCL/ConvertProjectPage.cpp b/avr/cores/megacommand/MCL/ConvertProjectPage.cpp index ef3ce5f87..1cb3ac4bd 100644 --- a/avr/cores/megacommand/MCL/ConvertProjectPage.cpp +++ b/avr/cores/megacommand/MCL/ConvertProjectPage.cpp @@ -23,7 +23,7 @@ void ConvertProjectPage::on_select(const char *entry) { DEBUG_DUMP(entry); file.close(); if (proj.convert_project(entry)) { - GUI.setPage(&grid_page); + mcl.setPage(GRID_PAGE); } else { // gfx.alert("PROJECT ERROR", "NOT COMPATIBLE"); } diff --git a/avr/cores/megacommand/MCL/DSP.h b/avr/cores/megacommand/MCL/DSP.h index 7d4744935..d9ea762c2 100644 --- a/avr/cores/megacommand/MCL/DSP.h +++ b/avr/cores/megacommand/MCL/DSP.h @@ -3,7 +3,7 @@ #ifndef DSP_H__ #define DSP_H__ -#include "MCL.h" +#include "mcl.h" #include "math.h" #define FULL_SCALE 0xFFFF diff --git a/avr/cores/megacommand/MCL/DiagnosticPage.cpp b/avr/cores/megacommand/MCL/DiagnosticPage.cpp index f823ecb53..7681bfaaf 100644 --- a/avr/cores/megacommand/MCL/DiagnosticPage.cpp +++ b/avr/cores/megacommand/MCL/DiagnosticPage.cpp @@ -93,7 +93,7 @@ bool DiagnosticPage::handleEvent(gui_event_t *event) { EVENT_PRESSED(event, Buttons.ENCODER2) || EVENT_PRESSED(event, Buttons.ENCODER3) || EVENT_PRESSED(event, Buttons.ENCODER4)) { - GUI.setPage(&grid_page); + mcl.setPage(GRID_PAGE); } if (EVENT_PRESSED(event, Buttons.BUTTON3)) { diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.h b/avr/cores/megacommand/MCL/ExtSeqTrack.h index c7d17927b..cdded0d72 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.h +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.h @@ -6,7 +6,7 @@ #include "MidiUartParent.h" //#include "MidiUart.h" #include "CommonTools/NibbleArray.h" -#include "MCL.h" +#include "mcl.h" #include "SeqTrack.h" #include "WProgram.h" diff --git a/avr/cores/megacommand/MCL/FXPage.cpp b/avr/cores/megacommand/MCL/FXPage.cpp index fd7379521..1bfb653c5 100644 --- a/avr/cores/megacommand/MCL/FXPage.cpp +++ b/avr/cores/megacommand/MCL/FXPage.cpp @@ -4,7 +4,7 @@ #define FX_TYPE 0 #define FX_PARAM 1 -LightPage *FXPage::last_page = &fx_page_a; +PageIndex FXPage::last_page = FX_PAGE_A; void FXPage::setup() { DEBUG_PRINT_FN(); } @@ -18,7 +18,7 @@ void FXPage::init() { R.Clear(); R.use_icons_page(); R.use_machine_param_names(); - last_page = this; + last_page = mcl.currentPage(); } void FXPage::update_encoders() { @@ -176,7 +176,7 @@ bool FXPage::handleEvent(gui_event_t *event) { if (event->mask == EVENT_BUTTON_RELEASED) { switch (key) { case MDX_KEY_NO: - GUI.setPage(&mixer_page); + mcl.setPage(MIXER_PAGE); break; } } @@ -184,19 +184,19 @@ bool FXPage::handleEvent(gui_event_t *event) { switch (key) { case MDX_KEY_SCALE: case MDX_KEY_DOWN: - if (GUI.currentPage() == &fx_page_b) { + if (mcl.currentPage() == FX_PAGE_B) { goto toggle_mode; } else { - GUI.setPage(&fx_page_b); + mcl.setPage(FX_PAGE_B); } break; case MDX_KEY_LEFT: - if (GUI.currentPage() == &fx_page_a) { + if (mcl.currentPage() == FX_PAGE_A) { goto toggle_mode; } else { - GUI.setPage(&fx_page_a); + mcl.setPage(FX_PAGE_A); } break; } @@ -209,7 +209,7 @@ bool FXPage::handleEvent(gui_event_t *event) { EVENT_PRESSED(event, Buttons.ENCODER2) || EVENT_PRESSED(event, Buttons.ENCODER3) || EVENT_PRESSED(event, Buttons.ENCODER4)) { - // GUI.setPage(&grid_page); + //mcl.setPage(GRID_PAGE); } if (EVENT_PRESSED(event, Buttons.BUTTON1)) { toggle_mode: @@ -224,7 +224,7 @@ bool FXPage::handleEvent(gui_event_t *event) { if (EVENT_PRESSED(event, Buttons.BUTTON4)) { } if (EVENT_PRESSED(event, Buttons.BUTTON2)) { - GUI.setPage(&page_select_page); + mcl.setPage(PAGE_SELECT_PAGE); return true; } diff --git a/avr/cores/megacommand/MCL/FXPage.h b/avr/cores/megacommand/MCL/FXPage.h index e78ff29db..ff0445547 100644 --- a/avr/cores/megacommand/MCL/FXPage.h +++ b/avr/cores/megacommand/MCL/FXPage.h @@ -27,7 +27,7 @@ class FXPage : public LightPage, MidiCallback { } } - static LightPage *last_page; + static PageIndex last_page; bool handleEvent(gui_event_t *event); bool midi_state = false; diff --git a/avr/cores/megacommand/MCL/GridIOPage.cpp b/avr/cores/megacommand/MCL/GridIOPage.cpp index 8ed19a4c9..fb37c4531 100644 --- a/avr/cores/megacommand/MCL/GridIOPage.cpp +++ b/avr/cores/megacommand/MCL/GridIOPage.cpp @@ -93,7 +93,7 @@ bool GridIOPage::handleEvent(gui_event_t *event) { if (EVENT_RELEASED(event, Buttons.BUTTON1) || EVENT_RELEASED(event, Buttons.BUTTON4)) { close: - GUI.setPage(&grid_page); + mcl.setPage(GRID_PAGE); return true; } return false; diff --git a/avr/cores/megacommand/MCL/GridLoadPage.cpp b/avr/cores/megacommand/MCL/GridLoadPage.cpp index f4459be36..8a0307577 100644 --- a/avr/cores/megacommand/MCL/GridLoadPage.cpp +++ b/avr/cores/megacommand/MCL/GridLoadPage.cpp @@ -197,7 +197,7 @@ void GridLoadPage::load() { track_select_array[n] = 1; } } - GUI.setPage(&grid_page); + mcl.setPage(GRID_PAGE); trig_interface.off(); grid_task.load_queue.put(mcl_cfg.load_mode, grid_page.getRow(), track_select_array); @@ -262,7 +262,7 @@ bool GridLoadPage::handleEvent(gui_event_t *event) { if (event->mask == EVENT_BUTTON_PRESSED) { switch (key) { default: { - GUI.setPage(&grid_page); + mcl.setPage(GRID_PAGE); return false; } case MDX_KEY_YES: { @@ -299,7 +299,7 @@ bool GridLoadPage::handleEvent(gui_event_t *event) { group_load(grid_page.getRow()); - GUI.setPage(&grid_page); + mcl.setPage(GRID_PAGE); return true; } } diff --git a/avr/cores/megacommand/MCL/GridPage.cpp b/avr/cores/megacommand/MCL/GridPage.cpp index 6d570f3da..2dc0b0161 100644 --- a/avr/cores/megacommand/MCL/GridPage.cpp +++ b/avr/cores/megacommand/MCL/GridPage.cpp @@ -9,7 +9,7 @@ void GridPage::init() { show_slot_menu = false; reload_slot_models = false; // Edge case, prevent R.Clear being called if we're outside of GridPage - if (GUI.currentPage() != &grid_page) { + if (mcl.currentPage() != GRID_PAGE) { return; } trig_interface.off(); @@ -79,11 +79,11 @@ void GridPage::close_bank_popup() { MD.draw_close_bank(); } trig_interface.off(); - if (last_page != nullptr) { + if (last_page != 255) { DEBUG_PRINTLN("setting page"); - GUI.setPage(last_page); + mcl.setPage(last_page); } - last_page = nullptr; + last_page = 255; bank_popup = 0; note_interface.init_notes(); // Clear blink leds @@ -1049,14 +1049,14 @@ bool GridPage::handleEvent(gui_event_t *event) { if (!show_slot_menu) { if (EVENT_RELEASED(event, Buttons.BUTTON1)) { save: - GUI.setPage(&grid_save_page); + mcl.setPage(GRID_SAVE_PAGE); return true; } if (EVENT_RELEASED(event, Buttons.BUTTON4)) { load: - GUI.setPage(&grid_load_page); + mcl.setPage(GRID_LOAD_PAGE); return true; } @@ -1116,11 +1116,11 @@ bool GridPage::handleEvent(gui_event_t *event) { (EVENT_PRESSED(event, Buttons.BUTTON4) && BUTTON_DOWN(Buttons.BUTTON1))) { system: system_page.isSetup = false; - GUI.pushPage(&system_page); + mcl.pushPage(SYSTEM_PAGE); return true; } if (EVENT_PRESSED(event, Buttons.BUTTON2)) { - GUI.setPage(&page_select_page); + mcl.setPage(PAGE_SELECT_PAGE); return true; } diff --git a/avr/cores/megacommand/MCL/GridPage.h b/avr/cores/megacommand/MCL/GridPage.h index 0f93775d5..6d0cfe182 100644 --- a/avr/cores/megacommand/MCL/GridPage.h +++ b/avr/cores/megacommand/MCL/GridPage.h @@ -52,7 +52,7 @@ class GridPage : public LightPage { uint8_t row_scan = 0; uint64_t row_states[2]; - LightPage *last_page = nullptr; + PageIndex last_page = 255; uint8_t bank_popup = 0; uint16_t bank_popup_lastclock; diff --git a/avr/cores/megacommand/MCL/GridSavePage.cpp b/avr/cores/megacommand/MCL/GridSavePage.cpp index fe4fe0e65..c073be6a8 100644 --- a/avr/cores/megacommand/MCL/GridSavePage.cpp +++ b/avr/cores/megacommand/MCL/GridSavePage.cpp @@ -98,7 +98,7 @@ void GridSavePage::save() { } } - GUI.setPage(&grid_page); + mcl.setPage(GRID_PAGE); trig_interface.off(); mcl_actions.save_tracks(grid_page.getRow(), track_select_array, save_mode); } @@ -147,7 +147,7 @@ bool GridSavePage::handleEvent(gui_event_t *event) { if (event->mask == EVENT_BUTTON_PRESSED) { switch (key) { default: { - GUI.setPage(&grid_page); + mcl.setPage(GRID_PAGE); return false; } case MDX_KEY_YES: { @@ -189,7 +189,7 @@ bool GridSavePage::handleEvent(gui_event_t *event) { uint8_t save_mode = SAVE_SEQ; mcl_actions.save_tracks(grid_page.getRow(), track_select_array, save_mode); - GUI.setPage(&grid_page); + mcl.setPage(GRID_PAGE); return true; } } diff --git a/avr/cores/megacommand/MCL/GridTask.cpp b/avr/cores/megacommand/MCL/GridTask.cpp index 029faa073..1862a80ae 100644 --- a/avr/cores/megacommand/MCL/GridTask.cpp +++ b/avr/cores/megacommand/MCL/GridTask.cpp @@ -8,7 +8,7 @@ void GridTask::destroy() {} void GridTask::gui_update() { auto &active_track = mcl_seq.md_tracks[last_md_track]; - if (GUI.currentPage() == &seq_step_page && + if (mcl.currentPage() == SEQ_STEP_PAGE && IS_BIT_SET(MDSeqTrack::sync_cursor, last_md_track)) { MD.sync_seqtrack(active_track.length, active_track.speed, active_track.length - 1); diff --git a/avr/cores/megacommand/MCL/GridTask.h b/avr/cores/megacommand/MCL/GridTask.h index a4bad79ca..de6f5a157 100644 --- a/avr/cores/megacommand/MCL/GridTask.h +++ b/avr/cores/megacommand/MCL/GridTask.h @@ -1,7 +1,7 @@ #ifndef GRID_TASK_H__ #define GRID_TASK_H__ -#include "MCL.h" +#include "mcl.h" #include "Task.h" #include "Elektron.h" #include "GridChain.h" diff --git a/avr/cores/megacommand/MCL/LFO.h b/avr/cores/megacommand/MCL/LFO.h index ab3c016f4..c3a819553 100644 --- a/avr/cores/megacommand/MCL/LFO.h +++ b/avr/cores/megacommand/MCL/LFO.h @@ -3,7 +3,7 @@ #ifndef LFOOSC_H__ #define LFOOSC_H__ -#include "MCL.h" +#include "mcl.h" #include "math.h" #define EXP_LFO 1 diff --git a/avr/cores/megacommand/MCL/LFOPage.cpp b/avr/cores/megacommand/MCL/LFOPage.cpp index 9e8cce8fb..45dd969d3 100644 --- a/avr/cores/megacommand/MCL/LFOPage.cpp +++ b/avr/cores/megacommand/MCL/LFOPage.cpp @@ -339,7 +339,7 @@ bool LFOPage::handleEvent(gui_event_t *event) { uint8_t step = track + (page_select * 16); if (event->mask == EVENT_BUTTON_PRESSED) { if (device == &Analog4) { - // GUI.setPage(&seq_extstep_page) + // mcl.setPage(SEQ_EXTSTEP_PAGE) return true; } if (!IS_BIT_SET64(lfo_track->pattern_mask, step)) { @@ -361,7 +361,7 @@ bool LFOPage::handleEvent(gui_event_t *event) { EVENT_PRESSED(event, Buttons.ENCODER2) || EVENT_PRESSED(event, Buttons.ENCODER3) || EVENT_PRESSED(event, Buttons.ENCODER4)) { - GUI.setPage(&grid_page); + mcl.setPage(GRID_PAGE); } */ if (EVENT_PRESSED(event, Buttons.BUTTON4)) { @@ -389,7 +389,7 @@ bool LFOPage::handleEvent(gui_event_t *event) { lfo_track->enable = !(lfo_track->enable); } if (EVENT_PRESSED(event, Buttons.BUTTON2)) { - GUI.setPage(&page_select_page); + mcl.setPage(PAGE_SELECT_PAGE); return true; } diff --git a/avr/cores/megacommand/MCL/LoadProjectPage.cpp b/avr/cores/megacommand/MCL/LoadProjectPage.cpp index 348a403a9..3204781a7 100644 --- a/avr/cores/megacommand/MCL/LoadProjectPage.cpp +++ b/avr/cores/megacommand/MCL/LoadProjectPage.cpp @@ -34,7 +34,7 @@ void LoadProjectPage::on_select(const char *entry) { while (count--) { if (proj.load_project(proj_filename)) { DEBUG_PRINTLN("loaded, setting grid"); - GUI.setPage(&grid_page); + mcl.setPage(GRID_PAGE); return; } else { gfx.alert("PROJECT ERROR", "NOT COMPATIBLE"); diff --git a/avr/cores/megacommand/MCL/MCL.cpp b/avr/cores/megacommand/MCL/MCL.cpp index 76d10e415..a2d0ddfa2 100644 --- a/avr/cores/megacommand/MCL/MCL.cpp +++ b/avr/cores/megacommand/MCL/MCL.cpp @@ -1,3 +1,4 @@ +#include "mcl.h" #include "MCL_impl.h" #include "ResourceManager.h" @@ -33,6 +34,50 @@ void sdcard_bench() { void mcl_setup() { mcl.setup(); } +static LightPage *const MCL::pages_table[NUM_PAGES] = { + &grid_page, // Index: 0 + &page_select_page, // Index: 1 + &system_page, // Index: 2 + &mixer_page, // Index: 3 + &grid_save_page, // Index: 4 + &grid_load_page, // Index: 5 + &wd.mixer, // Index: 6 + &seq_step_page, // Index: 7 + &seq_extstep_page, // Index: 8 + &seq_ptc_page, // Index: 9 + &text_input_page, // Index: 10 + &poly_page, // Index: 11 + &sound_browser, // Index: 12 + &questiondialog_page, // Index: 13 + &start_menu_page, // Index: 14 + &boot_menu_page, // Index: 15 + &fx_page_a, // Index: 16 + &fx_page_b, // Index: 17 +#ifdef WAV_DESIGNER + &wd.pages[0], // Index: 18 + &wd.pages[1], // Index: 19 + &wd.pages[2], // Index: 20 +#endif + &route_page, // Index: 21 + &lfo_page, // Index: 22 + &ram_page_a, // Index: 23 + &ram_page_b, // Index: 24 + &load_proj_page, // Index: 25 + &midi_config_page, // Index: 26 + &md_config_page, // Index: 27 + &chain_config_page, // Index: 28 + &aux_config_page, // Index: 29 + &mcl_config_page, // Index: 30 + &ram_config_page, // Index: 31 + &arp_page, // Index: 32 + &md_import_page, // Index: 33 + &midiport_menu_page, // Index: 34 + &midiprogram_menu_page, // Index: 35 + &midiclock_menu_page, // Index: 36 + &midiroute_menu_page, // Index: 37 + &midimachinedrum_menu_page // Index: 38 +}; + void MCL::setup() { DEBUG_PRINTLN(F("Welcome to MegaCommand Live")); @@ -62,8 +107,8 @@ void MCL::setup() { if (BUTTON_DOWN(Buttons.BUTTON2)) { // gfx.draw_evil(R.icons_boot->evilknievel_bitmap); - GUI.setPage(&boot_menu_page); - while (GUI.currentPage() == &boot_menu_page) { + mcl.setPage(BOOT_MENU_PAGE); + while (mcl.currentPage() == BOOT_MENU_PAGE) { GUI.loop(); } return; @@ -82,7 +127,7 @@ void MCL::setup() { GUI.addEventHandler((event_handler_t)&mcl_handleEvent); if (ret) { - GUI.setPage(&grid_page); + mcl.setPage(GRID_PAGE); } DEBUG_PRINTLN(F("tempo:")); @@ -163,18 +208,18 @@ bool mcl_handleEvent(gui_event_t *event) { case MDX_KEY_BANKB: case MDX_KEY_BANKC: case MDX_KEY_BANKD: { - if (GUI.currentPage() == &grid_load_page || - GUI.currentPage() == &grid_save_page || - (GUI.currentPage() == &grid_page && grid_page.show_slot_menu)) { + if (mcl.currentPage() == GRID_LOAD_PAGE || + mcl.currentPage() == GRID_SAVE_PAGE || + (mcl.currentPage() == GRID_PAGE && grid_page.show_slot_menu)) { return false; } if (trig_interface.is_key_down(MDX_KEY_FUNC)) { return false; } - if (grid_page.last_page == nullptr) { - grid_page.last_page = GUI.currentPage(); + if (grid_page.last_page == 255) { + grid_page.last_page = mcl.currentPage(); } - GUI.setPage(&grid_page); + mcl.setPage(GRID_PAGE); grid_page.bank_popup = 1; grid_page.bank_popup_loadmask = 0; bool clear_states = false; @@ -190,32 +235,32 @@ bool mcl_handleEvent(gui_event_t *event) { return true; } case MDX_KEY_BANKGROUP: { - if (GUI.currentPage() != &text_input_page && - GUI.currentPage() != &grid_save_page && - GUI.currentPage() != &grid_load_page && + if (mcl.currentPage() != TEXT_INPUT_PAGE && + mcl.currentPage() != GRID_SAVE_PAGE && + mcl.currentPage() != GRID_LOAD_PAGE && !trig_interface.is_key_down(MDX_KEY_PATSONG)) { - GUI.setPage(&page_select_page); + mcl.setPage(PAGE_SELECT_PAGE); return true; } return false; } case MDX_KEY_REC: { - if (GUI.currentPage() != &seq_step_page && - GUI.currentPage() != &seq_ptc_page && - GUI.currentPage() != &seq_extstep_page) { + if (mcl.currentPage() != SEQ_STEP_PAGE && + mcl.currentPage() != SEQ_PTC_PAGE && + mcl.currentPage() != SEQ_EXTSTEP_PAGE) { seq_step_page.prepare = true; - seq_step_page.last_page = GUI.currentPage(); - GUI.setPage(&seq_step_page); + seq_step_page.last_page = mcl.currentPage(); + mcl.setPage(SEQ_STEP_PAGE); } else { if (seq_step_page.recording) { seq_step_page.recording = 0; - MD.set_rec_mode(GUI.currentPage() == &seq_step_page); + MD.set_rec_mode(mcl.currentPage() == SEQ_STEP_PAGE); clearLed2(); trig_interface.ignoreNextEvent(MDX_KEY_REC); } else { - if (GUI.currentPage() == &seq_step_page) { + if (mcl.currentPage() == SEQ_STEP_PAGE) { trig_interface.ignoreNextEvent(MDX_KEY_REC); - GUI.setPage(seq_step_page.last_page); + mcl.setPage(seq_step_page.last_page); } } } @@ -226,34 +271,34 @@ bool mcl_handleEvent(gui_event_t *event) { return true; } case MDX_KEY_COPY: { - if (GUI.currentPage() == &seq_step_page) + if (mcl.currentPage() == SEQ_STEP_PAGE) break; - if (GUI.currentPage() != &seq_ptc_page && + if (mcl.currentPage() != SEQ_PTC_PAGE && (trig_interface.is_key_down(MDX_KEY_SCALE) || trig_interface.is_key_down(MDX_KEY_NO))) { // Ignore scale + copy if page != seq_step_page break; } opt_copy = 2; - if (GUI.currentPage() == &seq_ptc_page || - GUI.currentPage() == &seq_extstep_page) { + if (mcl.currentPage() == SEQ_PTC_PAGE || + mcl.currentPage() == SEQ_EXTSTEP_PAGE) { opt_copy = SeqPage::recording ? 2 : 1; } opt_copy_track_handler_cb(); break; } case MDX_KEY_PASTE: { - if (GUI.currentPage() == &seq_step_page) + if (mcl.currentPage() == SEQ_STEP_PAGE) break; - if (GUI.currentPage() != &seq_ptc_page && + if (mcl.currentPage() != SEQ_PTC_PAGE && (trig_interface.is_key_down(MDX_KEY_SCALE) || trig_interface.is_key_down(MDX_KEY_NO))) { // Ignore scale + copy if page != seq_step_page break; } opt_paste = 2; - if (GUI.currentPage() == &seq_ptc_page || - GUI.currentPage() == &seq_extstep_page) { + if (mcl.currentPage() == SEQ_PTC_PAGE || + mcl.currentPage() == SEQ_EXTSTEP_PAGE) { opt_paste = SeqPage::recording ? 2 : 1; } reset_undo(); @@ -261,7 +306,7 @@ bool mcl_handleEvent(gui_event_t *event) { break; } case MDX_KEY_CLEAR: { - if (GUI.currentPage() == &seq_step_page) + if (mcl.currentPage() == SEQ_STEP_PAGE) break; if ((note_interface.notes_count_on() > 0) || (trig_interface.is_key_down(MDX_KEY_SCALE) || @@ -269,8 +314,8 @@ bool mcl_handleEvent(gui_event_t *event) { break; opt_clear = 2; // MidiDevice *dev = midi_active_peering.get_device(UART2_PORT); - if (GUI.currentPage() == &seq_ptc_page || - GUI.currentPage() == &seq_extstep_page) { + if (mcl.currentPage() == SEQ_PTC_PAGE || + mcl.currentPage() == SEQ_EXTSTEP_PAGE) { // if (SeqPage::midi_device == dev) { opt_clear = 1; // } else { @@ -295,12 +340,12 @@ bool mcl_handleEvent(gui_event_t *event) { switch (key) { case MDX_KEY_REC: { - if (!SeqPage::recording && (GUI.currentPage() == &seq_ptc_page || - GUI.currentPage() == &seq_extstep_page)) { - if (GUI.currentPage() != &seq_step_page) { + if (!SeqPage::recording && (mcl.currentPage() == SEQ_PTC_PAGE || + mcl.currentPage() == SEQ_EXTSTEP_PAGE)) { + if (mcl.currentPage() != SEQ_STEP_PAGE) { seq_step_page.prepare = true; - seq_step_page.last_page = GUI.currentPage(); - GUI.setPage(&seq_step_page); + seq_step_page.last_page = mcl.currentPage(); + mcl.setPage(SEQ_STEP_PAGE); } return true; } diff --git a/avr/cores/megacommand/MCL/MCL.h b/avr/cores/megacommand/MCL/MCL.h index 91a88be03..6a3748e18 100644 --- a/avr/cores/megacommand/MCL/MCL.h +++ b/avr/cores/megacommand/MCL/MCL.h @@ -8,13 +8,13 @@ #include "WProgram.h" #ifdef MEGACOMMAND - #define WAV_DESIGNER - #define SOUND_PAGE +#define WAV_DESIGNER +#define SOUND_PAGE #endif -//MCL Fonts -#include "Fonts/TomThumb.h" +// MCL Fonts #include "Fonts/Elektrothic.h" +#include "Fonts/TomThumb.h" #define VERSION 4043 #define VERSION_STR "4.43" @@ -22,19 +22,6 @@ #define CALLBACK_TIMEOUT 500 #define GUI_NAME_TIMEOUT 800 -#define CUE_PAGE 5 -#define NEW_PROJECT_PAGE 7 -#define MIXER_PAGE 10 -#define S_PAGE 3 -#define W_PAGE 4 -#define SEQ_STEP_PAGE 1 -#define SEQ_EXTSTEP_PAGE 18 -#define SEQ_PTC_PAGE 16 -#define SEQ_EUC_PAGE 20 -#define SEQ_EUCPTC_PAGE 21 -#define SEQ_RPTC_PAGE 14 -#define LOAD_PROJECT_PAGE 8 - #define MD_KITBUF_POS 63 // Sequencer editing constants @@ -44,8 +31,78 @@ extern void mcl_setup(); +enum PageIndex { + GRID_PAGE, // Index: 0 + PAGE_SELECT_PAGE, // Index: 1 + SYSTEM_PAGE, // Index: 2 + MIXER_PAGE, // Index: 3 + GRID_SAVE_PAGE, // Index: 4 + GRID_LOAD_PAGE, // Index: 5 + WD_MIXER_PAGE, // Index: 6 + SEQ_STEP_PAGE, // Index: 7 + SEQ_EXTSTEP_PAGE, // Index: 8 + SEQ_PTC_PAGE, // Index: 9 + TEXT_INPUT_PAGE, // Index: 10 + POLY_PAGE, // Index: 11 + SOUND_BROWSER, // Index: 12 + QUESTIONDIALOG_PAGE, // Index: 13 + START_MENU_PAGE, // Index: 14 + BOOT_MENU_PAGE, // Index: 15 + FX_PAGE_A, // Index: 16 + FX_PAGE_B, // Index: 17 +#ifdef WAV_DESIGNER + WD_PAGE_0, // Index: 18 + WD_PAGE_1, // Index: 19 + WD_PAGE_2, // Index: 20 +#endif + ROUTE_PAGE, // Index: 21 + LFO_PAGE, // Index: 22 + RAM_PAGE_A, // Index: 23 + RAM_PAGE_B, // Index: 24 + + LOAD_PROJ_PAGE, // Index: 25 + MIDI_CONFIG_PAGE, // Index: 26 + MD_CONFIG_PAGE, // Index: 27 + CHAIN_CONFIG_PAGE, // Index: 28 + AUX_CONFIG_PAGE, // Index: 29 + MCL_CONFIG_PAGE, // Index: 30 + RAM_CONFIG_PAGE, // Index: 31 + ARP_PAGE, // Index: 32 + MD_IMPORT_PAGE, // Index: 33 + MIDIPORT_MENU_PAGE, // Index: 34 + MIDIPROGRAM_MENU_PAGE, // Index: 35 + MIDICLOCK_MENU_PAGE, // Index: 36 + MIDIROUTE_MENU_PAGE, // Index: 37 + MIDIMACHINEDRUM_MENU_PAGE // Index: 38 + }; + + class MCL { public: + static constexpr uint8_t NUM_PAGES = 39; + + static LightPage *const pages_table[NUM_PAGES]; + + PageIndex current_page = 0; + + void setPage(PageIndex page) { + if (page >= NUM_PAGES) { + page = 0; + } + current_page = page; + GUI.setPage(pages_table[page]); + } + + void pushPage(PageIndex page) { + if (page >= NUM_PAGES) { + page = 0; + } + current_page = page; + GUI.setPage(pages_table[page]); + } + + PageIndex currentPage() { return current_page; } + void setup(); }; diff --git a/avr/cores/megacommand/MCL/MCLActions.cpp b/avr/cores/megacommand/MCL/MCLActions.cpp index 7fa024132..93fb37f60 100644 --- a/avr/cores/megacommand/MCL/MCLActions.cpp +++ b/avr/cores/megacommand/MCL/MCLActions.cpp @@ -135,7 +135,7 @@ void md_import() { grid_page.row_scan = GRID_LENGTH; grid_page.reload_slot_models = false; - GUI.setPage(&grid_page); + mcl.setPage(GRID_PAGE); } void MCLActions::save_tracks(int row, uint8_t *slot_select_array, uint8_t merge, diff --git a/avr/cores/megacommand/MCL/MCLClipBoard.cpp b/avr/cores/megacommand/MCL/MCLClipBoard.cpp index c7400cd40..ad24795fe 100644 --- a/avr/cores/megacommand/MCL/MCLClipBoard.cpp +++ b/avr/cores/megacommand/MCL/MCLClipBoard.cpp @@ -158,10 +158,10 @@ bool MCLClipBoard::paste_sequencer_track(uint8_t source_track, uint8_t track) { midi_active_peering.get_device(UART2_PORT), }; if (devs[0] == &MD && track_idx == last_md_track) { - if (GUI.currentPage() == &seq_step_page) { + if (mcl.currentPage() == SEQ_STEP_PAGE) { seq_step_page.config(); } - if (GUI.currentPage() == &seq_ptc_page) { + if (mcl.currentPage() == SEQ_PTC_PAGE) { seq_ptc_page.config(); } } diff --git a/avr/cores/megacommand/MCL/MCLGUI.cpp b/avr/cores/megacommand/MCL/MCLGUI.cpp index 42ff5eafb..1edb3be6f 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.cpp +++ b/avr/cores/megacommand/MCL/MCLGUI.cpp @@ -44,8 +44,8 @@ void MCLGUI::draw_textbox(const char *text, const char *text2) { bool MCLGUI::wait_for_input(char *dst, const char *title, uint8_t len) { text_input_page.init(); text_input_page.init_text(dst, title, len); - GUI.pushPage(&text_input_page); - while (GUI.currentPage() == &text_input_page) { + mcl.pushPage(TEXT_INPUT_PAGE); + while (mcl.currentPage() == TEXT_INPUT_PAGE) { GUI.loop(); } m_trim_space(dst); @@ -54,8 +54,8 @@ bool MCLGUI::wait_for_input(char *dst, const char *title, uint8_t len) { bool MCLGUI::wait_for_confirm(const char *title, const char *text) { questiondialog_page.init(title, text); - GUI.pushPage(&questiondialog_page); - while (GUI.currentPage() == &questiondialog_page) { + mcl.pushPage(QUESTIONDIALOG_PAGE); + while (mcl.currentPage() == QUESTIONDIALOG_PAGE) { GUI.loop(); } return questiondialog_page.return_state; @@ -63,8 +63,8 @@ bool MCLGUI::wait_for_confirm(const char *title, const char *text) { void MCLGUI::wait_for_project() { again: - GUI.setPage(&start_menu_page); - while (GUI.currentPage() == &start_menu_page || GUI.currentPage() == &text_input_page || GUI.currentPage() == &load_proj_page) { + mcl.setPage(START_MENU_PAGE); + while (mcl.currentPage() == START_MENU_PAGE || mcl.currentPage() == TEXT_INPUT_PAGE || mcl.currentPage() == LOAD_PROJ_PAGE) { GUI.loop(); } if (!proj.project_loaded) { goto again; } diff --git a/avr/cores/megacommand/MCL/MCLMenus.cpp b/avr/cores/megacommand/MCL/MCLMenus.cpp index eece03e28..89775cd1d 100644 --- a/avr/cores/megacommand/MCL/MCLMenus.cpp +++ b/avr/cores/megacommand/MCL/MCLMenus.cpp @@ -28,42 +28,41 @@ uint8_t opt_import_count = 16; void new_proj_handler() { proj.new_project_prompt(); } -const Page *const menu_target_pages[] PROGMEM = { - nullptr, +const PageIndex menu_target_pages[] PROGMEM = { + 255, // 1 - load_proj_page - (Page *)&load_proj_page, - (Page *)nullptr, - //(Page *)&convert_proj_page, - (Page *)&midi_config_page, - (Page *)&md_config_page, - (Page *)&chain_config_page, - (Page *)&aux_config_page, + LOAD_PROJ_PAGE, + 255, + // CONVERT_PROJ_PAGE, + MIDI_CONFIG_PAGE, + MD_CONFIG_PAGE, + CHAIN_CONFIG_PAGE, + AUX_CONFIG_PAGE, // 7 - (Page *)&mcl_config_page, + MCL_CONFIG_PAGE, // 8 - ram_config_page - (Page *)&ram_config_page, + RAM_CONFIG_PAGE, // 9 - (Page *)&poly_page, + POLY_PAGE, // 10 - (Page *)&arp_page, + ARP_PAGE, // 11 - (Page *)&md_import_page, + MD_IMPORT_PAGE, // 12 - (Page *)&midiport_menu_page, + MIDIPORT_MENU_PAGE, // 13 - (Page *)&midiprogram_menu_page, + MIDIPROGRAM_MENU_PAGE, // 14 - (Page *)&midiclock_menu_page, + MIDICLOCK_MENU_PAGE, // 15 - (Page *)&midiroute_menu_page, + MIDIROUTE_MENU_PAGE, // 16 - (Page *)&midimachinedrum_menu_page + MIDIMACHINEDRUM_MENU_PAGE }; - const uint8_t *const menu_target_param[] PROGMEM = { nullptr, diff --git a/avr/cores/megacommand/MCL/MCL_impl.h b/avr/cores/megacommand/MCL/MCL_impl.h index 324838629..b9bc2feb1 100644 --- a/avr/cores/megacommand/MCL/MCL_impl.h +++ b/avr/cores/megacommand/MCL/MCL_impl.h @@ -1,6 +1,6 @@ #pragma once -#include "MCL.h" +#include "mcl.h" #include "new.h" #include "A4.h" diff --git a/avr/cores/megacommand/MCL/MDTrackSelect.cpp b/avr/cores/megacommand/MCL/MDTrackSelect.cpp index 46d7cdc26..ddc4e8dce 100644 --- a/avr/cores/megacommand/MCL/MDTrackSelect.cpp +++ b/avr/cores/megacommand/MCL/MDTrackSelect.cpp @@ -45,12 +45,12 @@ void MDTrackSelect::end() { DEBUG_PRINTLN(sysex->get_recordLen()); DEBUG_PRINTLN(msg_rd); if (sysex->get_recordLen() == 8) { - bool is_md_device = SeqPage::midi_device == &MD && (GUI.currentPage() != &seq_extstep_page); + bool is_md_device = SeqPage::midi_device == &MD && (mcl.currentPage() != SEQ_EXTSTEP_PAGE); bool expand = true; reset_undo(); uint8_t length = sysex->getByte(6); uint8_t new_speed = sysex->getByte(7); - if (GUI.currentPage() == &seq_step_page || GUI.currentPage() == &seq_extstep_page || GUI.currentPage() == &seq_ptc_page) { + if (mcl.currentPage() == SEQ_STEP_PAGE || mcl.currentPage() == SEQ_EXTSTEP_PAGE || mcl.currentPage() == SEQ_PTC_PAGE) { if (seq_step_page.recording) { goto update_pattern; } @@ -67,12 +67,12 @@ void MDTrackSelect::end() { else{ mcl_seq.ext_tracks[n].set_length(length, expand); mcl_seq.ext_tracks[n].set_speed(new_speed); - if (GUI.currentPage() == &seq_extstep_page) { seq_extparam4.cur = length; } + if (mcl.currentPage() == SEQ_EXTSTEP_PAGE) { seq_extparam4.cur = length; } } - if (GUI.currentPage() == &seq_ptc_page) { + if (mcl.currentPage() == SEQ_PTC_PAGE) { seq_ptc_page.config_encoders(); } - if (GUI.currentPage() == &seq_step_page) { + if (mcl.currentPage() == SEQ_STEP_PAGE) { seq_step_page.config_encoders(); } } else { diff --git a/avr/cores/megacommand/MCL/Menu.cpp b/avr/cores/megacommand/MCL/Menu.cpp index c2d0ea173..510c1554a 100644 --- a/avr/cores/megacommand/MCL/Menu.cpp +++ b/avr/cores/megacommand/MCL/Menu.cpp @@ -58,9 +58,9 @@ const char* MenuBase::get_item_name(uint8_t item_n) { return item->name; } -LightPage *MenuBase::get_page_callback(uint8_t item_n) { +PageIndex MenuBase::get_page_callback(uint8_t item_n) { auto *item = get_item(item_n); - return (LightPage*)pgm_read_word(menu_target_pages + item->page_callback_id); + return (PageIndex)pgm_read_word(menu_target_pages + item->page_callback_id); } uint8_t *MenuBase::get_dest_variable(uint8_t item_n) { diff --git a/avr/cores/megacommand/MCL/Menu.h b/avr/cores/megacommand/MCL/Menu.h index 8959cdbcd..703bd5057 100644 --- a/avr/cores/megacommand/MCL/Menu.h +++ b/avr/cores/megacommand/MCL/Menu.h @@ -1,9 +1,11 @@ #pragma once +#include "mcl.h" + #define MAX_MENU_ITEMS 16 typedef void (*menu_function_t)(); -extern const Page* const menu_target_pages[] PROGMEM; +extern const PageIndex menu_target_pages[] PROGMEM; extern const menu_function_t menu_target_functions[] PROGMEM; extern const uint8_t* const menu_target_param[] PROGMEM; @@ -56,7 +58,7 @@ class MenuBase { uint8_t get_option_range(uint8_t item_n); uint8_t get_number_of_options(uint8_t item_n); uint8_t get_options_offset(uint8_t item_n); - LightPage *get_page_callback(uint8_t item_n); + PageIndex get_page_callback(uint8_t item_n); uint8_t get_number_of_items(); const menu_item_t *get_item(uint8_t item_n); const char* get_item_name(uint8_t item_n); diff --git a/avr/cores/megacommand/MCL/MenuPage.cpp b/avr/cores/megacommand/MCL/MenuPage.cpp index f4981d616..48a688b2c 100644 --- a/avr/cores/megacommand/MCL/MenuPage.cpp +++ b/avr/cores/megacommand/MCL/MenuPage.cpp @@ -178,11 +178,11 @@ void MenuPageBase::display() { bool MenuPageBase::enter() { DEBUG_PRINT_FN(); void (*row_func)() = get_menu()->get_row_function(encoders[1]->cur); - LightPage *page_callback = get_menu()->get_page_callback(encoders[1]->cur); - if (page_callback != NULL) { + PageIndex page_callback = get_menu()->get_page_callback(encoders[1]->cur); + if (page_callback != 255) { DEBUG_PRINTLN("pushing page"); DEBUG_PRINTLN((uint16_t)page_callback); - GUI.pushPage(page_callback); + mcl.pushPage(page_callback); return true; } if (row_func != NULL) { diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index bd8d8f159..9015f0b4a 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -457,7 +457,7 @@ bool MixerPage::handleEvent(gui_event_t *event) { case MDX_KEY_NO: { if (note_interface.notes_count_on() == 0) { disable_record_mutes(); - GUI.setPage(fx_page_a.last_page); + mcl.setPage(fx_page_a.last_page); return true; } if (midi_device == &MD) { @@ -582,7 +582,7 @@ bool MixerPage::handleEvent(gui_event_t *event) { if (EVENT_PRESSED(event, Buttons.BUTTON2)) { trig_interface.on(); disable_record_mutes(); - GUI.setPage(&page_select_page); + mcl.setPage(PAGE_SELECT_PAGE); return true; } @@ -593,7 +593,7 @@ bool MixerPage::handleEvent(gui_event_t *event) { EVENT_PRESSED(event, Buttons.ENCODER4)) { // if (note_interface.notes_count() == 0) { // route_page.update_globals(); - // GUI.setPage(&grid_page); + // mcl.setPage(GRID_PAGE); // } return true; } diff --git a/avr/cores/megacommand/MCL/Osc.h b/avr/cores/megacommand/MCL/Osc.h index 0fc0398a2..c6bc922c1 100644 --- a/avr/cores/megacommand/MCL/Osc.h +++ b/avr/cores/megacommand/MCL/Osc.h @@ -3,7 +3,7 @@ #ifndef OSC_H__ #define OSC_H__ -#include "MCL.h" +#include "mcl.h" #include "math.h" #define SIN_OSC 1 diff --git a/avr/cores/megacommand/MCL/PageSelectPage.cpp b/avr/cores/megacommand/MCL/PageSelectPage.cpp index 7c9a2d702..4f9d9a8a4 100644 --- a/avr/cores/megacommand/MCL/PageSelectPage.cpp +++ b/avr/cores/megacommand/MCL/PageSelectPage.cpp @@ -21,7 +21,7 @@ static uint8_t get_pageidx(uint8_t page_number) { return i; } -static LightPage *get_page(uint8_t pageidx, char *str) { +static PageIndex get_page(uint8_t pageidx, char *str) { if (pageidx < R.page_entries->countof_Entries) { if (str) { strcpy(str, R.page_entries->Entries[pageidx].Name); @@ -354,14 +354,14 @@ bool PageSelectPage::handleEvent(gui_event_t *event) { } if (EVENT_RELEASED(event, Buttons.BUTTON2)) { release: - LightPage *p; + PageIndex p; p = get_page(get_pageidx(page_select), nullptr); if (BUTTON_DOWN(Buttons.BUTTON1) || (!p)) { GUI.ignoreNextEvent(Buttons.BUTTON1); // md_exploit.off(); - GUI.setPage(&grid_page); + mcl.setPage(GRID_PAGE); } else { - GUI.setPage(p); + mcl.setPage(p); } return true; } @@ -369,13 +369,13 @@ bool PageSelectPage::handleEvent(gui_event_t *event) { if (EVENT_PRESSED(event, Buttons.BUTTON1)) { load_grid: GUI.ignoreNextEvent(event->source); - GUI.setPage(&grid_page); + mcl.setPage(GRID_PAGE); return true; } if (EVENT_PRESSED(event, Buttons.BUTTON3)) { //PAT SONG - GUI.setPage(&grid_page); - GUI.pushPage(&system_page); + mcl.setPage(GRID_PAGE); + mcl.pushPage(SYSTEM_PAGE); return true; } diff --git a/avr/cores/megacommand/MCL/PageSelectPage.h b/avr/cores/megacommand/MCL/PageSelectPage.h index b09ce67ed..a83cc5391 100644 --- a/avr/cores/megacommand/MCL/PageSelectPage.h +++ b/avr/cores/megacommand/MCL/PageSelectPage.h @@ -17,7 +17,7 @@ struct PageCategory { struct PageSelectEntry { char Name[16]; - LightPage *Page; + PageIndex Page; uint8_t PageNumber; // same as trig id uint8_t CategoryId; uint8_t IconWidth; diff --git a/avr/cores/megacommand/MCL/Project.cpp b/avr/cores/megacommand/MCL/Project.cpp index 866ddb9a6..a30470de7 100644 --- a/avr/cores/megacommand/MCL/Project.cpp +++ b/avr/cores/megacommand/MCL/Project.cpp @@ -75,7 +75,7 @@ bool Project::new_project_prompt() { if (proj.load_project(newprj)) { grid_page.reload_slot_models = false; DEBUG_PRINTLN("project loaded, setting page to grid"); - GUI.setPage(&grid_page); + mcl.setPage(GRID_PAGE); return true; } else { gfx.alert("ERROR", "SD ERROR"); @@ -83,7 +83,7 @@ bool Project::new_project_prompt() { } } if (proj.project_loaded) { - GUI.setPage(&grid_page); + mcl.setPage(GRID_PAGE); return true; } return false; diff --git a/avr/cores/megacommand/MCL/RAMPage.cpp b/avr/cores/megacommand/MCL/RAMPage.cpp index 309c7a7bf..9e3fc3067 100644 --- a/avr/cores/megacommand/MCL/RAMPage.cpp +++ b/avr/cores/megacommand/MCL/RAMPage.cpp @@ -714,7 +714,7 @@ bool RAMPage::handleEvent(gui_event_t *event) { EVENT_PRESSED(event, Buttons.ENCODER2) || EVENT_PRESSED(event, Buttons.ENCODER3) || EVENT_PRESSED(event, Buttons.ENCODER4)) { - GUI.setPage(&grid_page); + mcl.setPage(GRID_PAGE); } if (EVENT_PRESSED(event, Buttons.BUTTON1)) { yes: @@ -770,7 +770,7 @@ bool RAMPage::handleEvent(gui_event_t *event) { } if (EVENT_PRESSED(event, Buttons.BUTTON2)) { - GUI.setPage(&page_select_page); + mcl.setPage(PAGE_SELECT_PAGE); return true; } diff --git a/avr/cores/megacommand/MCL/RoutePage.cpp b/avr/cores/megacommand/MCL/RoutePage.cpp index 42c0630dc..a19b6574f 100644 --- a/avr/cores/megacommand/MCL/RoutePage.cpp +++ b/avr/cores/megacommand/MCL/RoutePage.cpp @@ -160,11 +160,11 @@ bool RoutePage::handleEvent(gui_event_t *event) { // update_globals(); // md_exploit.off(); // md_exploit.on(); - // GUI.setPage(&mixer_page); + // mcl.setPage(MIXER_PAGE); // return true; //} if (EVENT_PRESSED(event, Buttons.BUTTON2)) { - GUI.setPage(&page_select_page); + mcl.setPage(PAGE_SELECT_PAGE); return true; } /* @@ -173,7 +173,7 @@ bool RoutePage::handleEvent(gui_event_t *event) { EVENT_PRESSED(event, Buttons.ENCODER3) || EVENT_PRESSED(event, Buttons.ENCODER1)) { update_globals(); - GUI.setPage(&grid_page); + mcl.setPage(GRID_PAGE); return true; } diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index 0ad5b5556..e9cae48f2 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -525,7 +525,7 @@ void SeqExtStepPage::pos_cur_x(int16_t diff) { } void SeqExtStepPage::set_cur_y(uint8_t cur_y_) { - if (GUI.currentPage() != this || show_seq_menu) { return; } + if (mcl.currentPage() != SEQ_EXTSTEP_PAGE || show_seq_menu) { return; } uint8_t fov_y_ = fov_y; if (fov_y >= cur_y_ && cur_y_ != 0) { fov_y_ = cur_y_ - 1; diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index 1a14b8ca2..395d11114 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -92,7 +92,7 @@ void SeqPage::enable_record() { } void SeqPage::disable_record() { - MD.set_rec_mode((GUI.currentPage() == &seq_step_page)); + MD.set_rec_mode((mcl.currentPage() == SEQ_STEP_PAGE)); recording = false; clearLed2(); } @@ -157,10 +157,10 @@ void SeqPage::params_reset() { } void SeqPage::bootstrap_record() { - if (GUI.currentPage() != &seq_step_page && - GUI.currentPage() != &seq_extstep_page && - GUI.currentPage() != &seq_ptc_page) { - GUI.setPage(&seq_step_page); + if (mcl.currentPage() != SEQ_STEP_PAGE && + mcl.currentPage() != SEQ_EXTSTEP_PAGE && + mcl.currentPage() != SEQ_PTC_PAGE) { + mcl.setPage(SEQ_STEP_PAGE); } trig_interface.send_md_leds(TRIGLED_OVERLAY); enable_record(); @@ -346,13 +346,13 @@ bool SeqPage::handleEvent(gui_event_t *event) { } if (EVENT_PRESSED(event, Buttons.BUTTON2)) { - GUI.setPage(&page_select_page); + mcl.setPage(PAGE_SELECT_PAGE); } if (EVENT_PRESSED(event, Buttons.BUTTON3)) { // If MD trig is held and BUTTON3 is pressed, launch note menu if ((note_interface.notes_count_on() != 0) && (!show_step_menu) && - (GUI.currentPage() != &seq_ptc_page)) { + (mcl.currentPage() != SEQ_PTC_PAGE)) { uint8_t note = 255; note = note_interface.get_first_md_note(); if (note == 255) { diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.cpp b/avr/cores/megacommand/MCL/SeqPtcPage.cpp index f251d96af..a151ce76d 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPtcPage.cpp @@ -413,7 +413,7 @@ void SeqPtcPage::trig_md_fromext(uint8_t note_num, uint8_t channel_event) { if (machine_pitch == 255) { return; } - if (GUI.currentPage() == &seq_step_page && channel_event == CTRL_EVENT) { + if (mcl.currentPage() == SEQ_STEP_PAGE && channel_event == CTRL_EVENT) { seq_step_page.pitch_param = note_num; // get_note_from_machine_pitch(machine_pitch); } @@ -580,7 +580,7 @@ bool SeqPtcPage::handleEvent(gui_event_t *event) { if (EVENT_RELEASED(event, Buttons.BUTTON1)) { if (BUTTON_DOWN(Buttons.BUTTON4)) { re_init = true; - GUI.pushPage(&poly_page); + mcl.pushPage(POLY_PAGE); return true; } mcl_seq.ext_tracks[last_ext_track].init_notes_on(); @@ -589,14 +589,14 @@ bool SeqPtcPage::handleEvent(gui_event_t *event) { } /* if (EVENT_PRESSED(event, Buttons.ENCODER4)) { - GUI.setPage(&grid_page); + mcl.setPage(GRID_PAGE); return true; } */ if (EVENT_RELEASED(event, Buttons.BUTTON4)) { if (BUTTON_DOWN(Buttons.BUTTON1)) { re_init = true; - GUI.pushPage(&poly_page); + mcl.pushPage(POLY_PAGE); return true; } } @@ -653,7 +653,7 @@ uint8_t SeqPtcPage::is_md_midi(uint8_t channel) { if (((mcl_cfg.uart2_ctrl_chan - 1 == channel) || (mcl_cfg.uart2_ctrl_chan == MIDI_OMNI_MODE)) && - (GUI.currentPage() != &seq_extstep_page)) { + (mcl.currentPage() != SEQ_EXTSTEP_PAGE)) { return CTRL_EVENT; } if (mcl_cfg.md_trig_channel - 1 == channel) { @@ -663,7 +663,7 @@ uint8_t SeqPtcPage::is_md_midi(uint8_t channel) { return NO_EVENT; /* return (mcl_cfg.uart2_ctrl_chan != MIDI_LOCAL_MODE) && - (GUI.currentPage() != &seq_extstep_page); + (mcl.currentPage() != SEQ_EXTSTEP_PAGE); */ } void SeqPtcMidiEvents::onNoteOnCallback_Midi2(uint8_t *msg) { @@ -868,7 +868,7 @@ void SeqPtcMidiEvents::onControlChangeCallback_Midi2(uint8_t *msg) { mcl_seq.ext_tracks[n].send_cc(param, value); } - if (GUI.currentPage() == &seq_extstep_page) { + if (mcl.currentPage() == SEQ_EXTSTEP_PAGE) { if (SeqPage::pianoroll_mode > 0) { if (mcl_seq.ext_tracks[n].locks_params[SeqPage::pianoroll_mode - 1] - 1 == PARAM_LEARN) { @@ -1000,7 +1000,7 @@ void SeqPtcMidiEvents::onControlChangeCallback_Midi(uint8_t *msg) { } } - if (display_polylink && GUI.currentPage() != &mixer_page) { + if (display_polylink && mcl.currentPage() != MIXER_PAGE) { oled_display.textbox("POLY-", "LINK"); } } diff --git a/avr/cores/megacommand/MCL/SeqStepPage.cpp b/avr/cores/megacommand/MCL/SeqStepPage.cpp index 58ae1c7a9..3895f86f4 100644 --- a/avr/cores/megacommand/MCL/SeqStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqStepPage.cpp @@ -181,7 +181,7 @@ void SeqStepPage::display() { void SeqStepPage::loop() { if (MD.global.extendedMode != 2) { - GUI.setPage(&grid_page); + mcl.setPage(GRID_PAGE); return; } SeqPage::loop(); diff --git a/avr/cores/megacommand/MCL/SeqStepPage.h b/avr/cores/megacommand/MCL/SeqStepPage.h index f76dc3d2d..5c02c9efd 100644 --- a/avr/cores/megacommand/MCL/SeqStepPage.h +++ b/avr/cores/megacommand/MCL/SeqStepPage.h @@ -25,7 +25,7 @@ class SeqStepPage : public SeqPage { uint16_t update_params_clock; uint8_t last_param_id; uint8_t last_rec_event; - LightPage *last_page = nullptr; + PageIndex last_page = 255; SeqStepMidiEvents midi_events; SeqStepPage(Encoder *e1 = NULL, Encoder *e2 = NULL, Encoder *e3 = NULL, Encoder *e4 = NULL) diff --git a/avr/cores/megacommand/MCL/Shared.h b/avr/cores/megacommand/MCL/Shared.h index 9d7e0b407..a322def5f 100644 --- a/avr/cores/megacommand/MCL/Shared.h +++ b/avr/cores/megacommand/MCL/Shared.h @@ -3,7 +3,7 @@ #ifndef SHARED_H__ #define SHARED_H__ -#include "MCL.h" +#include "mcl.h" #include "math.h" struct MusicalNotes { diff --git a/avr/cores/megacommand/MCL/SoundBrowserPage.cpp b/avr/cores/megacommand/MCL/SoundBrowserPage.cpp index 58c929259..6808d9a4b 100644 --- a/avr/cores/megacommand/MCL/SoundBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/SoundBrowserPage.cpp @@ -184,7 +184,7 @@ bool SoundBrowserPage::handleEvent(gui_event_t *event) { } if (EVENT_PRESSED(event, Buttons.BUTTON2)) { - GUI.setPage(&page_select_page); + mcl.setPage(PAGE_SELECT_PAGE); return true; } diff --git a/avr/cores/megacommand/MCL/TrackInfoEncoder.h b/avr/cores/megacommand/MCL/TrackInfoEncoder.h index c038ca449..f66c7cfdb 100644 --- a/avr/cores/megacommand/MCL/TrackInfoEncoder.h +++ b/avr/cores/megacommand/MCL/TrackInfoEncoder.h @@ -2,7 +2,7 @@ #ifndef TRACKINFOENCODER_H__ #define TRACKINFOENCODER_H__ -#include "MCL.h" +#include "mcl.h" class TrackInfoEncoder : public Encoder { /** diff --git a/avr/cores/megacommand/MCL/WavDesigner.cpp b/avr/cores/megacommand/MCL/WavDesigner.cpp index 84414d822..c271978b3 100644 --- a/avr/cores/megacommand/MCL/WavDesigner.cpp +++ b/avr/cores/megacommand/MCL/WavDesigner.cpp @@ -8,7 +8,7 @@ void WavDesigner::prompt_send() { oled_display.textbox("Render", ""); oled_display.display(); //Order of statements important for directory switching. - GUI.pushPage(&sound_browser); + mcl.pushPage(SOUND_BROWSER); sound_browser.show_samplemgr = true; sound_browser.pending_action = PA_SELECT; sound_browser.setup(); @@ -16,14 +16,14 @@ void WavDesigner::prompt_send() { wd.render(); sound_browser.init(); if (sound_browser.file.open(WAV_NAME, O_READ)) { - while (GUI.currentPage() == &sound_browser && + while (mcl.currentPage() == SOUND_BROWSER && sound_browser.pending_action == PA_SELECT && sound_browser.show_samplemgr) { GUI.loop(); } } DEBUG_PRINTLN("cleaning up"); sound_browser.file.close(); - GUI.setPage(&wd.mixer); + mcl.setPage(WD_MIXER_PAGE); // oled_display.textbox("Sending..",""); // // oled_display.display(); diff --git a/avr/cores/megacommand/MCL/WavDesigner.h b/avr/cores/megacommand/MCL/WavDesigner.h index 71e13d44d..0afce5532 100644 --- a/avr/cores/megacommand/MCL/WavDesigner.h +++ b/avr/cores/megacommand/MCL/WavDesigner.h @@ -3,7 +3,7 @@ #ifndef WAVDESIGNER_H__ #define WAVDESIGNER_H__ -#include "MCL.h" +#include "mcl.h" #include "math.h" #include "OscPage.h" #include "OscMixerPage.h" diff --git a/avr/cores/megacommand/MCL/WavDesignerPage.cpp b/avr/cores/megacommand/MCL/WavDesignerPage.cpp index 5ed066e28..4afbaf1b8 100644 --- a/avr/cores/megacommand/MCL/WavDesignerPage.cpp +++ b/avr/cores/megacommand/MCL/WavDesignerPage.cpp @@ -19,9 +19,9 @@ void wavdesign_menu_handler() { } WavDesignerPage::last_mode = WavDesignerPage::opt_mode; if (WavDesignerPage::opt_mode == 3) { - GUI.setPage(&wd.mixer); + mcl.setPage(WD_MIXER_PAGE); } else { - GUI.setPage(&wd.pages[WavDesignerPage::opt_mode]); + mcl.setPage(WD_PAGE_0 + WavDesignerPage::opt_mode); } } @@ -103,7 +103,7 @@ bool WavDesignerPage::handleEvent(gui_event_t *event) { return true; } if (EVENT_PRESSED(event, Buttons.BUTTON2)) { - GUI.setPage(&page_select_page); + mcl.setPage(PAGE_SELECT_PAGE); return true; } return false; diff --git a/avr/cores/megacommand/MCL/WavDesignerPage.h b/avr/cores/megacommand/MCL/WavDesignerPage.h index bce37bd1f..70187e449 100644 --- a/avr/cores/megacommand/MCL/WavDesignerPage.h +++ b/avr/cores/megacommand/MCL/WavDesignerPage.h @@ -3,7 +3,7 @@ #ifndef WAVDESIGNERPAGE_H__ #define WAVDESIGNERPAGE_H__ -#include "MCL.h" +#include "mcl.h" extern void wavdesign_menu_handler(); extern void wav_render(); diff --git a/avr/cores/megacommand/ResourceManager.cpp b/avr/cores/megacommand/ResourceManager.cpp index c1703b8d0..378fd7737 100644 --- a/avr/cores/megacommand/ResourceManager.cpp +++ b/avr/cores/megacommand/ResourceManager.cpp @@ -45,53 +45,52 @@ void ResourceManager::Restore(uint8_t *buf, size_t sz) { void ResourceManager::restore_page_entry_deps() { // calibrate references - R.page_entries->Entries[0].Page = &grid_page; + R.page_entries->Entries[0].Page = GRID_PAGE; R.page_entries->Entries[0].IconData = R.icons_page->icon_grid; - R.page_entries->Entries[1].Page = &mixer_page; + R.page_entries->Entries[1].Page = MIXER_PAGE; R.page_entries->Entries[1].IconData = R.icons_page->icon_mixer; - R.page_entries->Entries[2].Page = &route_page; + R.page_entries->Entries[2].Page = ROUTE_PAGE; R.page_entries->Entries[2].IconData = R.icons_page->icon_route; - R.page_entries->Entries[3].Page = &lfo_page; + R.page_entries->Entries[3].Page = LFO_PAGE; R.page_entries->Entries[3].IconData = R.icons_page->icon_lfo; - R.page_entries->Entries[4].Page = &seq_step_page; + R.page_entries->Entries[4].Page = SEQ_STEP_PAGE; R.page_entries->Entries[4].IconData = R.icons_page->icon_step; - R.page_entries->Entries[5].Page = &seq_extstep_page; + R.page_entries->Entries[5].Page = SEQ_EXTSTEP_PAGE; R.page_entries->Entries[5].IconData = R.icons_page->icon_pianoroll; - R.page_entries->Entries[6].Page = &seq_ptc_page; + R.page_entries->Entries[6].Page = SEQ_PTC_PAGE; R.page_entries->Entries[6].IconData = R.icons_page->icon_chroma; uint8_t idx = 7; #ifdef SOUND_PAGE - R.page_entries->Entries[idx].Page = &sound_browser; + R.page_entries->Entries[idx].Page = SOUND_BROWSER; R.page_entries->Entries[idx].IconData = R.icons_page->icon_sound; ++idx; #endif #ifdef WAV_DESIGNER - R.page_entries->Entries[idx].Page = &wd.pages[0]; + R.page_entries->Entries[idx].Page = WD_PAGE_0; R.page_entries->Entries[idx].IconData = R.icons_page->icon_wavd; ++idx; #endif #ifdef LOUDNESS_PAGE - R.page_entries->Entries[idx].Page = &loudness_page; + R.page_entries->Entries[idx].Page = LOUDNESS_PAGE; R.page_entries->Entries[idx].IconData = R.icons_page->icon_loudness; ++idx; #endif - R.page_entries->Entries[idx].Page = &fx_page_a; + R.page_entries->Entries[idx].Page = FX_PAGE_A; R.page_entries->Entries[idx].IconData = R.icons_page->icon_rhytmecho; ++idx; - R.page_entries->Entries[idx].Page = &fx_page_b; + R.page_entries->Entries[idx].Page = FX_PAGE_B; R.page_entries->Entries[idx].IconData = R.icons_page->icon_gatebox; ++idx; - R.page_entries->Entries[idx].Page = &ram_page_a; + R.page_entries->Entries[idx].Page = RAM_PAGE_A; R.page_entries->Entries[idx].IconData = R.icons_page->icon_ram1; ++idx; - R.page_entries->Entries[idx].Page = &ram_page_b; + R.page_entries->Entries[idx].Page = RAM_PAGE_B; R.page_entries->Entries[idx].IconData = R.icons_page->icon_ram2; // calibration complete - } size_t ResourceManager::Size() { diff --git a/avr/cores/megacommand/resources/R_page_entries.cpp b/avr/cores/megacommand/resources/R_page_entries.cpp index ff2e2a0b8..85344bbe2 100644 --- a/avr/cores/megacommand/resources/R_page_entries.cpp +++ b/avr/cores/megacommand/resources/R_page_entries.cpp @@ -18,105 +18,118 @@ const unsigned char __R_page_entries[] PROGMEM = { 69, 176, 82, - 21, - 155, + 19, + 30, + 3, + 0, 1, + 219, 23, - 109, 16, - 5, - 251, + 7, + 126, 82, 79, 85, 84, 69, + 192, 23, - 9, - 145, + 121, + 21, + 0, 2, - 236, + 30, 76, 70, 79, - 69, - 134, - 3, + 194, + 67, + 110, + 22, + 49, 219, - 23, 24, - 5, - 109, + 24, + 7, 83, + 111, 45, - 253, 80, 32, 69, + 236, 68, 73, 84, - 147, 23, + 31, + 7, + 0, 4, - 237, 1, + 219, 24, 25, - 5, - 253, + 7, 80, + 251, 73, 65, 78, 79, 32, - 187, 77, + 118, 76, 76, 23, - 14, + 124, + 8, + 0, 6, - 71, + 142, 67, 72, - 111, + 223, 19, 77, 65, 84, - 217, 73, + 176, 67, 47, - 54, - 7, + 109, + 9, + 49, + 99, 23, - 54, 83, + 111, 119, - 251, 78, 68, 32, + 183, 77, 52, - 118, 65, 71, + 99, 151, - 15, - 8, + 12, + 111, + 49, 2, 24, - 183, 19, - 5, + 111, + 7, 87, 65, - 255, 86, + 254, 32, 68, 69, @@ -124,53 +137,64 @@ const unsigned char __R_page_entries[] PROGMEM = { 73, 71, 78, - 97, + 206, 174, - 216, - 9, + 18, + 214, + 49, 23, - 183, + 45, 19, + 236, 76, 65, - 176, 89, 143, - 157, - 12, + 6, + 16, + 219, + 49, 3, - 253, 71, + 251, 82, 69, 86, - 182, 40, + 108, 66, 23, - 7, + 190, + 17, + 0, 13, - 39, + 79, 65, - 236, 77, + 216, 45, 49, 47, - 38, + 15, + 23, + 0, 14, - 201, + 100, 23, - 144, + 194, 50, - 153, + 27, + 7, + 0, + 177, 15, - 16, + 23, 0, 0, 0, 0, 0, - 79, + 4, + 255, 255, }; diff --git a/resource/page_entries.cpp b/resource/page_entries.cpp index 5e5e28bb6..97457efcc 100644 --- a/resource/page_entries.cpp +++ b/resource/page_entries.cpp @@ -2,26 +2,21 @@ #include "MCL_impl.h" PageSelectEntry Entries[] = { - {"GRID", &grid_page, 0, 0, 24, 15, nullptr}, - {"MIXER", &mixer_page, 1, 0, 24, 16, nullptr}, - {"ROUTE", &route_page, 2, 0, 24, 16, nullptr}, - {"LFO", &lfo_page, 3, 0, 24, 24, nullptr}, - - {"STEP EDIT", &seq_step_page, 4, 1, 24, 25, nullptr}, - {"PIANO ROLL", &seq_extstep_page, 6, 1, 24, 25, nullptr}, - {"CHROMATIC", &seq_ptc_page, 7, 1, 24, 25, nullptr}, + {"GRID", GRID_PAGE, 0, 0, 24, 15, nullptr}, + {"MIXER", MIXER_PAGE, 1, 0, 24, 16, nullptr}, + {"ROUTE", ROUTE_PAGE, 2, 0, 24, 16, nullptr}, + {"LFO", LFO_PAGE, 3, 0, 24, 24, nullptr}, + {"STEP EDIT", SEQ_STEP_PAGE, 4, 1, 24, 25, nullptr}, + {"PIANO ROLL", SEQ_EXTSTEP_PAGE, 6, 1, 24, 25, nullptr}, + {"CHROMATIC", SEQ_PTC_PAGE, 7, 1, 24, 25, nullptr}, #ifdef SOUND_PAGE - {"SOUND MANAGER", &sound_browser, 8, 2, 24, 19, nullptr}, + {"SOUND MANAGER", SOUND_BROWSER, 8, 2, 24, 19, nullptr}, #endif #ifdef WAV_DESIGNER - {"WAV DESIGNER", &wd.pages[0], 9, 2, 24, 19, nullptr}, -#endif -#ifdef LOUDNESS_PAGE - {"LOUDNESS", &loudness_page, 10, 2, 24, 16, nullptr}, + {"WAV DESIGNER", WD_PAGE_0, 9, 2, 24, 19, nullptr}, #endif - {"DELAY", &fx_page_a, 12, 3, 24, 25, nullptr}, - {"REVERB", &fx_page_b, 13, 3, 24, 25, nullptr}, - {"RAM-1", &ram_page_a, 14, 3, 24, 25, nullptr}, - {"RAM-2", &ram_page_b, 15, 3, 24, 25, nullptr}, + {"DELAY", FX_PAGE_A, 12, 3, 24, 25, nullptr}, + {"REVERB", FX_PAGE_B, 13, 3, 24, 25, nullptr}, + {"RAM-1", RAM_PAGE_A, 14, 3, 24, 25, nullptr}, + {"RAM-2", RAM_PAGE_B, 15, 3, 24, 25, nullptr}, }; - From d13158f914a7cf7b5715587f042a7e991fea482d Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 23 Jun 2023 16:05:14 +1000 Subject: [PATCH 077/413] PageIndex fixes --- avr/cores/megacommand/MCL/MCL.h | 14 +++++++++++++- avr/cores/megacommand/MCL/OscMixerPage.cpp | 2 +- avr/cores/megacommand/MCL/OscPage.cpp | 3 ++- avr/cores/megacommand/MCL/WavDesigner.h | 4 ++-- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCL.h b/avr/cores/megacommand/MCL/MCL.h index 6a3748e18..e4bc411bf 100644 --- a/avr/cores/megacommand/MCL/MCL.h +++ b/avr/cores/megacommand/MCL/MCL.h @@ -98,9 +98,21 @@ class MCL { page = 0; } current_page = page; - GUI.setPage(pages_table[page]); + GUI.pushPage(pages_table[page]); } + void popPage() { + GUI.popPage(); + for (uint8_t n = 0; n < NUM_PAGES; n++) { + if (GUI.currentPage() == pages_table[n]) { + current_page = n; + return; + } + } + current_page = 255; + } + + PageIndex currentPage() { return current_page; } void setup(); diff --git a/avr/cores/megacommand/MCL/OscMixerPage.cpp b/avr/cores/megacommand/MCL/OscMixerPage.cpp index edc8b19b8..407ea8392 100644 --- a/avr/cores/megacommand/MCL/OscMixerPage.cpp +++ b/avr/cores/megacommand/MCL/OscMixerPage.cpp @@ -7,7 +7,7 @@ void OscMixerPage::setup() {} void OscMixerPage::init() { WavDesignerPage::init(); trig_interface.off(); - wd.last_page = this; + wd.last_page = mcl.currentPage(); wavdesign_menu_page.menu.enable_entry(1, false); wavdesign_menu_page.menu.enable_entry(2, true); } diff --git a/avr/cores/megacommand/MCL/OscPage.cpp b/avr/cores/megacommand/MCL/OscPage.cpp index 3727baf4a..d8256e706 100644 --- a/avr/cores/megacommand/MCL/OscPage.cpp +++ b/avr/cores/megacommand/MCL/OscPage.cpp @@ -21,8 +21,9 @@ float OscPage::get_freq() { return fout; } void OscPage::init() { + if (wd.last_page != 255 && wd.last_page != WD_PAGE_0 + id) { mcl.setPage(wd.last_page); wd.last_page = 255; return; } WavDesignerPage::init(); - wd.last_page = this; + wd.last_page = mcl.currentPage(); wavdesign_menu_page.menu.enable_entry(1, true); wavdesign_menu_page.menu.enable_entry(2, false); oled_display.clearDisplay(); diff --git a/avr/cores/megacommand/MCL/WavDesigner.h b/avr/cores/megacommand/MCL/WavDesigner.h index 0afce5532..51dae15ed 100644 --- a/avr/cores/megacommand/MCL/WavDesigner.h +++ b/avr/cores/megacommand/MCL/WavDesigner.h @@ -16,7 +16,7 @@ class WavDesigner { OscMixerPage mixer; uint32_t loop_start; uint32_t loop_end; - LightPage *last_page; + PageIndex last_page; WavDesigner() { for (uint8_t i = 0; i < 3; i++) { pages[i].id = i; @@ -24,7 +24,7 @@ class WavDesigner { mixer.id = MIXER_ID; pages[0].osc_waveform = 1; mixer.enc4.cur = 0; - last_page = &(pages[0]); + last_page = WD_PAGE_0; } void prompt_send(); bool render(); From a83a97d023e6b01ff4fa9531ef4384fe43544dae Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 23 Jun 2023 19:12:05 +1000 Subject: [PATCH 078/413] SoundBrowser -> SampleBrowser, improvements --- avr/cores/megacommand/MCL/FileBrowserPage.cpp | 52 ++-- avr/cores/megacommand/MCL/FileBrowserPage.h | 6 + avr/cores/megacommand/MCL/MCL.cpp | 2 +- avr/cores/megacommand/MCL/MCL.h | 2 +- avr/cores/megacommand/MCL/MCL_impl.h | 2 +- ...dBrowserPage.cpp => SampleBrowserPage.cpp} | 95 +++++-- ...SoundBrowserPage.h => SampleBrowserPage.h} | 7 +- avr/cores/megacommand/MCL/Wav.h | 5 + avr/cores/megacommand/MCL/WavDesigner.cpp | 20 +- avr/cores/megacommand/Midi/MidiSDS.cpp | 3 +- avr/cores/megacommand/ResourceManager.cpp | 4 +- avr/cores/megacommand/resources/R.h | 10 +- .../megacommand/resources/R_icons_page.cpp | 234 ++++++++++-------- .../megacommand/resources/R_page_entries.cpp | 73 +++--- resource/icons_page.cpp | 10 + resource/page_entries.cpp | 2 +- 16 files changed, 322 insertions(+), 205 deletions(-) rename avr/cores/megacommand/MCL/{SoundBrowserPage.cpp => SampleBrowserPage.cpp} (75%) rename avr/cores/megacommand/MCL/{SoundBrowserPage.h => SampleBrowserPage.h} (81%) diff --git a/avr/cores/megacommand/MCL/FileBrowserPage.cpp b/avr/cores/megacommand/MCL/FileBrowserPage.cpp index d8459512f..b4ff1bde1 100644 --- a/avr/cores/megacommand/MCL/FileBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/FileBrowserPage.cpp @@ -29,6 +29,10 @@ FileSystemPosition FileBrowserPage::position; FileBrowserFileTypes FileBrowserPage::file_types; +bool FileBrowserPage::selection_change = false; + +uint16_t FileBrowserPage::selection_change_clock = 0; + void FileBrowserPage::cleanup() { // always call setup() when entering this page. this->isSetup = false; @@ -90,7 +94,7 @@ void FileBrowserPage::query_filesystem() { numEntries = 0; cur_file = 255; -// cur_row = 0; + // cur_row = 0; encoders[1]->cur = 1; encoders[2]->cur = 1; @@ -101,7 +105,7 @@ void FileBrowserPage::query_filesystem() { // SD.vwd()->getName(temp_entry, FILE_ENTRY_SIZE); file.getName(temp_entry, FILE_ENTRY_SIZE); - if ((show_parent) && !(strcmp(temp_entry, "/") == 0)) { + if ((show_parent) && !(strcmp(lwd, "/") == 0)) { add_entry(".."); } // iterate through the files @@ -147,28 +151,31 @@ void FileBrowserPage::query_filesystem() { void FileBrowserPage::init() { filemenu_active = false; show_samplemgr = false; - strcpy(focus_match,""); + strcpy(focus_match, ""); file_types.reset(); query_filesystem(); } -void FileBrowserPage::display() { - if (filemenu_active) { - oled_display.fillRect(0, 3, 45, 28, BLACK); - oled_display.drawRect(1, 4, 43, 26, WHITE); - file_menu_page.draw_menu(6, 12, 39); - oled_display.display(); - return; - } +void FileBrowserPage::draw_menu() { + oled_display.fillRect(0, 3, 45, 28, BLACK); + oled_display.drawRect(1, 4, 43, 26, WHITE); + file_menu_page.draw_menu(6, 12, 39); + oled_display.display(); +} - constexpr uint8_t x_offset = 43, y_offset = 8, width = MENU_WIDTH; +void FileBrowserPage::draw_sidebar() { + constexpr uint8_t x_offset = 43; oled_display.clearDisplay(); oled_display.setFont(&TomThumb); oled_display.setCursor(0, 8); oled_display.setTextColor(WHITE, BLACK); oled_display.println(title); mcl_gui.draw_vertical_dashline(x_offset - 6); +} + +void FileBrowserPage::draw_filebrowser() { + constexpr uint8_t x_offset = 43, y_offset = 8, width = MENU_WIDTH; oled_display.setCursor(x_offset, 8); uint8_t max_items; if (numEntries > MAX_VISIBLE_ROWS) { @@ -200,7 +207,15 @@ void FileBrowserPage::display() { if (numEntries > MAX_VISIBLE_ROWS) { draw_scrollbar(120); } +} +void FileBrowserPage::display() { + if (filemenu_active) { + draw_menu(); + return; + } + draw_sidebar(); + draw_filebrowser(); oled_display.display(); return; } @@ -217,7 +232,8 @@ void FileBrowserPage::loop() { } if (encoders[1]->hasChanged()) { - + selection_change = true; + selection_change_clock = slowclock; uint8_t diff = encoders[1]->cur - encoders[1]->old; int8_t new_val = cur_row + diff; @@ -291,7 +307,6 @@ bool FileBrowserPage::_cd(const char *child) { DEBUG_PRINTLN(lwd); - file.close(); char *ptr = child; @@ -486,8 +501,13 @@ bool FileBrowserPage::handleEvent(gui_event_t *event) { encoders[0] = param1; encoders[1] = param2; - _handle_filemenu(); - init(); + if (_handle_filemenu()) { + init(); + return true; + } + filemenu_active = false; + selection_change = true; + display(); return true; } diff --git a/avr/cores/megacommand/MCL/FileBrowserPage.h b/avr/cores/megacommand/MCL/FileBrowserPage.h index 0846c76ef..36adb40e6 100644 --- a/avr/cores/megacommand/MCL/FileBrowserPage.h +++ b/avr/cores/megacommand/MCL/FileBrowserPage.h @@ -118,6 +118,8 @@ class FileBrowserPage : public LightPage { static FileSystemPosition position; + static bool selection_change; + static uint16_t selection_change_clock; Encoder *param1; Encoder *param2; @@ -129,6 +131,10 @@ class FileBrowserPage : public LightPage { lwd[0] = '\0'; } virtual bool handleEvent(gui_event_t *event); + void draw_sidebar(); + void draw_filebrowser(); + void draw_menu(); + virtual void display(); bool add_entry(const char *entry); diff --git a/avr/cores/megacommand/MCL/MCL.cpp b/avr/cores/megacommand/MCL/MCL.cpp index a2d0ddfa2..6e5e25966 100644 --- a/avr/cores/megacommand/MCL/MCL.cpp +++ b/avr/cores/megacommand/MCL/MCL.cpp @@ -47,7 +47,7 @@ static LightPage *const MCL::pages_table[NUM_PAGES] = { &seq_ptc_page, // Index: 9 &text_input_page, // Index: 10 &poly_page, // Index: 11 - &sound_browser, // Index: 12 + &sample_browser, // Index: 12 &questiondialog_page, // Index: 13 &start_menu_page, // Index: 14 &boot_menu_page, // Index: 15 diff --git a/avr/cores/megacommand/MCL/MCL.h b/avr/cores/megacommand/MCL/MCL.h index e4bc411bf..0203fee2c 100644 --- a/avr/cores/megacommand/MCL/MCL.h +++ b/avr/cores/megacommand/MCL/MCL.h @@ -44,7 +44,7 @@ enum PageIndex { SEQ_PTC_PAGE, // Index: 9 TEXT_INPUT_PAGE, // Index: 10 POLY_PAGE, // Index: 11 - SOUND_BROWSER, // Index: 12 + SAMPLE_BROWSER, // Index: 12 QUESTIONDIALOG_PAGE, // Index: 13 START_MENU_PAGE, // Index: 14 BOOT_MENU_PAGE, // Index: 15 diff --git a/avr/cores/megacommand/MCL/MCL_impl.h b/avr/cores/megacommand/MCL/MCL_impl.h index b9bc2feb1..f24d2265b 100644 --- a/avr/cores/megacommand/MCL/MCL_impl.h +++ b/avr/cores/megacommand/MCL/MCL_impl.h @@ -34,7 +34,7 @@ #include "PolyPage.h" #ifdef SOUND_PAGE -#include "SoundBrowserPage.h" +#include "SampleBrowserPage.h" #endif #ifdef LOUDNESS_PAGE diff --git a/avr/cores/megacommand/MCL/SoundBrowserPage.cpp b/avr/cores/megacommand/MCL/SampleBrowserPage.cpp similarity index 75% rename from avr/cores/megacommand/MCL/SoundBrowserPage.cpp rename to avr/cores/megacommand/MCL/SampleBrowserPage.cpp index 6808d9a4b..3607556ac 100644 --- a/avr/cores/megacommand/MCL/SoundBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/SampleBrowserPage.cpp @@ -11,7 +11,7 @@ const char *c_syx_name = "SYSEX"; static bool s_query_returned = false; -void SoundBrowserPage::setup() { +void SampleBrowserPage::setup() { SD.mkdir(c_wav_root, true); SD.mkdir(c_syx_root, true); sysex = &(Midi.midiSysex); @@ -21,7 +21,69 @@ void SoundBrowserPage::setup() { position.reset(); } -void SoundBrowserPage::init() { +void SampleBrowserPage::display() { + if (filemenu_active) { + draw_menu(); + return; + } + if (FileBrowserPage::selection_change) { + draw_sidebar(); + if (clock_diff(FileBrowserPage::selection_change_clock, slowclock) < 200) { + goto end; + } + char temp_entry[FILE_ENTRY_SIZE]; + + get_entry(encoders[1]->getValue(), temp_entry); + uint8_t len = strlen(temp_entry); + + if (len > 4) { + bool is_wav = strcmp(c_wav_suffix, (&temp_entry[len - 4])) == 0; + Wav wav_file; + + if (!is_wav || !wav_file.open(temp_entry, false)) { + FileBrowserPage::selection_change = false; + goto end; + } + + oled_display.setCursor(0, 16); + + float sample_rate_f = (wav_file.header.fmt.sampleRate * 0.001f); + uint16_t sample_rate = (uint16_t)sample_rate_f; + oled_display.print(sample_rate); + oled_display.print("."); + + uint8_t decimal = + ((sample_rate_f - (float)sample_rate) * (float)10.0f) + 0.5f; + oled_display.print(decimal); + oled_display.print("k "); + + oled_display.print(wav_file.header.fmt.bitRate); + oled_display.print("/"); + oled_display.print(wav_file.header.fmt.numChannels); + + float seconds = wav_file.header.get_length() / (float)wav_file.header.fmt.sampleRate; + int16_t minutes = seconds * 0.01666666667f; + int16_t ms = ((float)seconds - int(seconds)) * 1000; + + oled_display.setCursor(0, 23); + + oled_display.print(minutes); + oled_display.print(":"); + oled_display.print(int(seconds)); + oled_display.print(":"); + oled_display.print(ms); + + wav_file.close(); + } + } + FileBrowserPage::selection_change = false; +end: + draw_filebrowser(); + oled_display.display(); +} + +void SampleBrowserPage::init() { + FileBrowserPage::selection_change = true; file_types.reset(); file_types.add(c_wav_suffix); file_types.add(c_syx_suffix); @@ -40,14 +102,13 @@ void SoundBrowserPage::init() { show_parent = false; query_sample_slots(); } else { - strcpy(title, "Select:"); + strcpy(title, "SAMPLE"); show_dirs = true; show_save = true; show_filemenu = true; show_new_folder = true; show_parent = true; query_filesystem(); - } R.Clear(); @@ -55,7 +116,7 @@ void SoundBrowserPage::init() { } // send current selected sample file to slot -void SoundBrowserPage::send_sample(int slot, char *newname, bool silent) { +void SampleBrowserPage::send_sample(int slot, char *newname, bool silent) { bool success; if (file.isOpen()) { char temp_entry[FILE_ENTRY_SIZE]; @@ -91,7 +152,7 @@ void SoundBrowserPage::send_sample(int slot, char *newname, bool silent) { } } -void SoundBrowserPage::recv_wav(int slot, bool silent) { +void SampleBrowserPage::recv_wav(int slot, bool silent) { char wav_name[FILE_ENTRY_SIZE] = ""; // should be of form "ID - NAME..." // ^--~~~~~~~ @@ -123,7 +184,7 @@ void SoundBrowserPage::recv_wav(int slot, bool silent) { } } -void SoundBrowserPage::on_new() { +void SampleBrowserPage::on_new() { if (!show_samplemgr) { pending_action = PA_NEW; show_samplemgr = true; @@ -137,7 +198,7 @@ void SoundBrowserPage::on_new() { } } -void SoundBrowserPage::on_cancel() { +void SampleBrowserPage::on_cancel() { pending_action = 0; if (show_samplemgr) { show_samplemgr = false; @@ -147,7 +208,7 @@ void SoundBrowserPage::on_cancel() { } } -void SoundBrowserPage::on_select(const char *__) { +void SampleBrowserPage::on_select(const char *__) { if (!show_samplemgr) { pending_action = PA_SELECT; show_samplemgr = true; @@ -170,7 +231,7 @@ void SoundBrowserPage::on_select(const char *__) { } } -bool SoundBrowserPage::handleEvent(gui_event_t *event) { +bool SampleBrowserPage::handleEvent(gui_event_t *event) { if (EVENT_PRESSED(event, Buttons.BUTTON3) && show_filemenu) { FileBrowserPage::handleEvent(event); bool state = (param2->cur == 0); @@ -191,7 +252,7 @@ bool SoundBrowserPage::handleEvent(gui_event_t *event) { return FileBrowserPage::handleEvent(event); } -void SoundBrowserPage::query_sample_slots() { +void SampleBrowserPage::query_sample_slots() { encoders[1]->cur = 0; encoders[1]->old = 0; numEntries = 0; @@ -233,7 +294,7 @@ void SoundBrowserPage::query_sample_slots() { // MidiSysexListenerClass implementation -bool SoundBrowserPage::_handle_filemenu() { +bool SampleBrowserPage::_handle_filemenu() { if (FileBrowserPage::_handle_filemenu()) { return true; } @@ -291,9 +352,9 @@ bool SoundBrowserPage::_handle_filemenu() { break; } } -void SoundBrowserPage::start() {} +void SampleBrowserPage::start() {} -void SoundBrowserPage::end() { +void SampleBrowserPage::end() { if (sysex->getByte(3) != 0x02) return; if (sysex->getByte(4) != 0x00) @@ -334,6 +395,6 @@ void SoundBrowserPage::end() { s_query_returned = true; } -MCLEncoder soundbrowser_param1(0, 1, ENCODER_RES_SYS); -MCLEncoder soundbrowser_param2(0, 36, ENCODER_RES_SYS); -SoundBrowserPage sound_browser(&soundbrowser_param1, &soundbrowser_param2); +MCLEncoder samplebrowser_param1(0, 1, ENCODER_RES_SYS); +MCLEncoder samplebrowser_param2(0, 36, ENCODER_RES_SYS); +SampleBrowserPage sample_browser(&samplebrowser_param1, &samplebrowser_param2); diff --git a/avr/cores/megacommand/MCL/SoundBrowserPage.h b/avr/cores/megacommand/MCL/SampleBrowserPage.h similarity index 81% rename from avr/cores/megacommand/MCL/SoundBrowserPage.h rename to avr/cores/megacommand/MCL/SampleBrowserPage.h index 620be3de3..0da93aa1a 100644 --- a/avr/cores/megacommand/MCL/SoundBrowserPage.h +++ b/avr/cores/megacommand/MCL/SampleBrowserPage.h @@ -13,10 +13,10 @@ #define PA_NEW 0 #define PA_SELECT 1 -class SoundBrowserPage : public FileBrowserPage, public MidiSysexListenerClass { +class SampleBrowserPage : public FileBrowserPage, public MidiSysexListenerClass { public: - SoundBrowserPage(Encoder *e1 = NULL, Encoder *e2 = NULL, Encoder *e3 = NULL, + SampleBrowserPage(Encoder *e1 = NULL, Encoder *e2 = NULL, Encoder *e3 = NULL, Encoder *e4 = NULL) : FileBrowserPage(e1, e2, e3, e4), MidiSysexListenerClass(){ ids[0] = 0; ids[1] = 0x20; @@ -30,6 +30,7 @@ class SoundBrowserPage : public FileBrowserPage, public MidiSysexListenerClass { virtual void on_select(const char*); virtual void on_cancel(); virtual bool handleEvent(gui_event_t *event); + virtual void display(); void draw_scrollbar(uint8_t x_offset); void init(); void setup(); @@ -43,6 +44,6 @@ class SoundBrowserPage : public FileBrowserPage, public MidiSysexListenerClass { void query_sample_slots(); }; -extern SoundBrowserPage sound_browser; +extern SampleBrowserPage sample_browser; #endif /* SOUNDBROWSERPAGE_H__ */ diff --git a/avr/cores/megacommand/MCL/Wav.h b/avr/cores/megacommand/MCL/Wav.h index dab10ca23..0a51c90e0 100644 --- a/avr/cores/megacommand/MCL/Wav.h +++ b/avr/cores/megacommand/MCL/Wav.h @@ -158,6 +158,10 @@ struct WavHeader { datachunk_t data; smplchunk_t smpl; + uint32_t get_length() { + return (data.chunk_size / fmt.numChannels) / (fmt.bitRate / 8); + } + uint32_t total_len() const { uint32_t sz = 12; sz += fmt.total_len(); @@ -222,6 +226,7 @@ class Wav { char filename[16]; File file; Wav() {} + bool open(const char *file_name, bool write = false, uint16_t numChannels = 1, uint32_t sampleRate = 44100, uint8_t bitRate = 16, bool loop = false); diff --git a/avr/cores/megacommand/MCL/WavDesigner.cpp b/avr/cores/megacommand/MCL/WavDesigner.cpp index c271978b3..a72d69f6f 100644 --- a/avr/cores/megacommand/MCL/WavDesigner.cpp +++ b/avr/cores/megacommand/MCL/WavDesigner.cpp @@ -8,21 +8,21 @@ void WavDesigner::prompt_send() { oled_display.textbox("Render", ""); oled_display.display(); //Order of statements important for directory switching. - mcl.pushPage(SOUND_BROWSER); - sound_browser.show_samplemgr = true; - sound_browser.pending_action = PA_SELECT; - sound_browser.setup(); - sound_browser.show_samplemgr = true; + mcl.pushPage(SAMPLE_BROWSER); + sample_browser.show_samplemgr = true; + sample_browser.pending_action = PA_SELECT; + sample_browser.setup(); + sample_browser.show_samplemgr = true; wd.render(); - sound_browser.init(); - if (sound_browser.file.open(WAV_NAME, O_READ)) { - while (mcl.currentPage() == SOUND_BROWSER && - sound_browser.pending_action == PA_SELECT && sound_browser.show_samplemgr) { + sample_browser.init(); + if (sample_browser.file.open(WAV_NAME, O_READ)) { + while (mcl.currentPage() == SAMPLE_BROWSER && + sample_browser.pending_action == PA_SELECT && sample_browser.show_samplemgr) { GUI.loop(); } } DEBUG_PRINTLN("cleaning up"); - sound_browser.file.close(); + sample_browser.file.close(); mcl.setPage(WD_MIXER_PAGE); // oled_display.textbox("Sending..",""); // diff --git a/avr/cores/megacommand/Midi/MidiSDS.cpp b/avr/cores/megacommand/Midi/MidiSDS.cpp index 1c17e6cf8..827df6a34 100644 --- a/avr/cores/megacommand/Midi/MidiSDS.cpp +++ b/avr/cores/megacommand/Midi/MidiSDS.cpp @@ -215,8 +215,7 @@ bool MidiSDSClass::sendWav(const char *filename, const char *samplename, uint16_ samplesSoFar = 0; sampleNumber = sample_number; setSampleRate(wav_file.header.fmt.sampleRate); - sampleLength = (wav_file.header.data.chunk_size / wav_file.header.fmt.numChannels) / - (wav_file.header.fmt.bitRate / 8); + sampleLength = wav_file.header.get_length(); sampleFormat = wav_file.header.fmt.bitRate; if (wav_file.header.smpl.is_active()) { diff --git a/avr/cores/megacommand/ResourceManager.cpp b/avr/cores/megacommand/ResourceManager.cpp index 378fd7737..a3132712f 100644 --- a/avr/cores/megacommand/ResourceManager.cpp +++ b/avr/cores/megacommand/ResourceManager.cpp @@ -64,8 +64,8 @@ void ResourceManager::restore_page_entry_deps() { uint8_t idx = 7; #ifdef SOUND_PAGE - R.page_entries->Entries[idx].Page = SOUND_BROWSER; - R.page_entries->Entries[idx].IconData = R.icons_page->icon_sound; + R.page_entries->Entries[idx].Page = SAMPLE_BROWSER; + R.page_entries->Entries[idx].IconData = R.icons_page->icon_sample; ++idx; #endif #ifdef WAV_DESIGNER diff --git a/avr/cores/megacommand/resources/R.h b/avr/cores/megacommand/resources/R.h index 1fb79cac9..54585c8c8 100644 --- a/avr/cores/megacommand/resources/R.h +++ b/avr/cores/megacommand/resources/R.h @@ -179,11 +179,11 @@ struct __T_icons_page { static constexpr size_t countof_icon_ram2 = 75 / sizeof(unsigned char); static constexpr size_t sizeofof_icon_ram2 = 75; union { - unsigned char icon_sound[0]; - char zz__icon_sound[57]; + unsigned char icon_sample[0]; + char zz__icon_sample[75]; }; - static constexpr size_t countof_icon_sound = 57 / sizeof(unsigned char); - static constexpr size_t sizeofof_icon_sound = 57; + static constexpr size_t countof_icon_sample = 75 / sizeof(unsigned char); + static constexpr size_t sizeofof_icon_sample = 75; union { unsigned char icon_route[0]; char zz__icon_route[48]; @@ -238,7 +238,7 @@ struct __T_icons_page { }; static constexpr size_t countof_icon_grid = 45 / sizeof(unsigned char); static constexpr size_t sizeofof_icon_grid = 45; - static constexpr size_t __total_size = 900; + static constexpr size_t __total_size = 918; }; extern const unsigned char __R_machine_names_long[] PROGMEM; diff --git a/avr/cores/megacommand/resources/R_icons_page.cpp b/avr/cores/megacommand/resources/R_icons_page.cpp index c94985e02..31130adc1 100644 --- a/avr/cores/megacommand/resources/R_icons_page.cpp +++ b/avr/cores/megacommand/resources/R_icons_page.cpp @@ -194,79 +194,90 @@ const unsigned char __R_icons_page[] PROGMEM = { 219, 11, 56, - 190, + 176, 224, - 24, + 71, + 237, + 224, + 44, + 182, + 48, + 2, + 56, + 91, + 60, + 53, + 237, 3, - 223, - 5, + 62, + 182, 63, - 224, - 1, - 255, - 108, 2, 252, - 178, + 89, 192, - 83, + 11, + 151, 195, - 44, 199, - 251, - 7, + 196, + 255, + 35, 199, - 125, - 125, - 195, - 128, - 15, - 192, - 182, - 71, + 132, + 39, + 131, + 4, + 39, 128, - 149, - 178, - 129, - 93, - 61, + 107, + 113, + 122, + 152, + 2, + 44, + 101, + 183, + 0, + 125, + 3, 241, - 237, 248, 7, 227, - 74, - 221, + 187, + 92, 3, 0, 2, + 182, 31, - 183, 143, - 35, + 179, + 238, 7, 128, - 115, 8, - 110, - 157, + 115, + 128, 8, + 183, 25, - 189, 140, 14, - 204, - 43, - 176, - 7, + 185, + 41, + 128, + 194, + 239, 254, 63, - 126, 2, + 253, 252, 0, - 221, - 108, + 1, + 252, 7, 225, 223, @@ -276,143 +287,144 @@ const unsigned char __R_icons_page[] PROGMEM = { 199, 240, 15, - 237, + 220, 255, 240, - 31, - 125, - 107, + 146, + 208, 2, - 133, - 127, + 191, + 174, 127, 128, 63, 31, 192, + 253, 126, - 251, 15, 224, 126, 7, 240, + 221, 44, - 187, 123, 219, 124, + 223, 2, - 190, 99, 27, 108, 123, 31, - 119, + 59, 8, - 51, + 153, 17, - 96, + 176, 75, - 134, - 86, - 182, + 67, + 104, + 91, 30, 92, 126, - 217, - 155, + 255, + 224, + 1, 254, - 127, + 224, + 7, 255, 144, 3, + 246, 254, 112, 12, - 182, 249, 74, + 219, 38, - 223, 2, 220, + 253, 240, 239, 211, - 237, 55, 15, 223, + 191, 122, - 255, 159, 240, 14, 95, 224, + 251, 9, 223, 128, - 219, 7, 222, 109, - 216, 109, + 216, 44, + 191, 64, - 255, 52, 61, 239, + 255, 72, 33, 41, - 251, 72, 45, 233, 48, 37, + 107, 5, - 92, 11, - 235, + 157, 17, 238, + 97, 0, - 13, - 157, + 179, 85, + 177, 14, - 141, 2, + 181, 238, - 175, 4, + 238, 2, - 117, 28, + 185, 224, - 204, 2, + 129, 32, - 13, - 214, + 186, 0, 215, + 223, 243, - 254, 221, 0, 12, 245, - 0, - 56, + 10, + 63, 55, - 97, + 115, 224, 60, 255, @@ -445,7 +457,7 @@ const unsigned char __R_icons_page[] PROGMEM = { 198, 233, 134, - 75, + 93, 242, 25, 224, @@ -475,7 +487,7 @@ const unsigned char __R_icons_page[] PROGMEM = { 44, 170, 47, - 210, + 228, 153, 17, 16, @@ -529,89 +541,91 @@ const unsigned char __R_icons_page[] PROGMEM = { 231, 14, 20, - 5, - 202, - 239, + 125, + 1, + 255, 128, 1, 231, + 238, 2, - 115, 8, + 107, 38, - 89, 49, - 97, - 227, - 190, + 46, + 224, + 223, + 15, 16, 30, 0, 8, + 181, 96, - 214, 2, + 183, 22, - 220, 9, 116, - 219, + 54, 0, 12, + 214, 5, - 89, 2, - 204, + 115, 8, - 199, + 49, 35, + 225, 192, 62, - 133, 28, 128, - 247, + 125, 62, 192, 96, 99, + 225, 2, - 133, 123, - 182, + 109, 224, 2, + 183, 112, - 223, 8, 62, 96, + 247, 62, 14, - 222, 96, 28, 29, - 215, + 181, 2, + 221, 196, - 119, 54, 219, 108, + 214, 2, - 89, 0, 8, - 7, + 65, + 199, 1, - 28, 23, 0, 0, 0, 0, 0, - 9, + 2, + 127, 255, }; diff --git a/avr/cores/megacommand/resources/R_page_entries.cpp b/avr/cores/megacommand/resources/R_page_entries.cpp index 85344bbe2..ce602d031 100644 --- a/avr/cores/megacommand/resources/R_page_entries.cpp +++ b/avr/cores/megacommand/resources/R_page_entries.cpp @@ -106,95 +106,96 @@ const unsigned char __R_page_entries[] PROGMEM = { 99, 23, 83, - 111, - 119, - 78, - 68, + 254, + 65, + 77, + 80, + 76, + 69, 32, - 183, 77, - 52, + 221, + 53, 65, 71, - 99, - 151, + 246, + 152, 12, - 111, 49, + 223, 2, - 24, - 19, - 111, - 7, + 23, 87, + 255, 65, 86, - 254, 32, 68, 69, 83, 73, 71, + 179, 78, - 206, 174, + 181, 18, - 214, 49, + 182, 23, - 45, 19, - 236, + 7, + 183, + 19, 76, 65, + 176, 89, 143, - 6, + 27, 16, - 219, 49, + 111, 3, - 71, - 251, + 47, + 237, 82, 69, 86, 40, - 108, + 178, 66, 23, - 190, + 249, 17, 0, 13, - 79, - 65, - 77, - 216, + 54, + 95, + 236, 45, 49, 47, - 15, + 7, 23, 0, + 178, 14, - 100, 23, - 194, + 97, 50, 27, - 7, + 3, + 216, 0, - 177, 15, 23, + 128, 0, 0, 0, 0, - 0, - 4, - 255, + 2, + 127, 255, }; diff --git a/resource/icons_page.cpp b/resource/icons_page.cpp index e9857ddff..37f3cd5f6 100644 --- a/resource/icons_page.cpp +++ b/resource/icons_page.cpp @@ -76,6 +76,15 @@ unsigned char icon_route[] = { 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x07, 0x80, 0x19, 0x8c, 0xc0, 0x0f, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +// 'sample', 24x25 +unsigned char icon_sample [] = { + 0x00, 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x20, 0x00, 0x30, 0x20, 0x00, 0x38, 0x20, 0x00, 0x3c, 0x20, + 0x00, 0x04, 0x20, 0x03, 0xc4, 0x20, 0x3f, 0xc4, 0x20, 0xfc, 0xc4, 0x20, 0xc0, 0xc4, 0x20, 0xc0, + 0xc4, 0x20, 0xc0, 0xc4, 0x20, 0xc0, 0xc4, 0x20, 0xc0, 0xc4, 0x20, 0xc3, 0xc4, 0x20, 0xc7, 0xc4, + 0x23, 0xc7, 0x84, 0x27, 0x83, 0x04, 0x27, 0x80, 0x04, 0x23, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, + 0x00, 0x04, 0x20, 0x00, 0x04, 0x1f, 0xff, 0xf8, 0x00, 0x00, 0x00 +}; +/* // 'sound', 24x19px unsigned char icon_sound[] = { 0x00, 0x03, 0xe0, 0x00, 0x3f, 0xe0, 0x01, 0xff, 0xe0, 0x01, 0xfc, 0xe0, @@ -83,6 +92,7 @@ unsigned char icon_sound[] = { 0x01, 0xc0, 0xe0, 0x01, 0xc0, 0xe0, 0x01, 0xc3, 0xe0, 0x01, 0xc7, 0xe0, 0x01, 0xc7, 0xe0, 0x07, 0xc7, 0xc0, 0x0f, 0xc3, 0x80, 0x0f, 0xc0, 0x00, 0x0f, 0x80, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00}; +*/ // 'ram_2_icon2', 24x25px unsigned char icon_ram2[] = { diff --git a/resource/page_entries.cpp b/resource/page_entries.cpp index 97457efcc..a64def4cf 100644 --- a/resource/page_entries.cpp +++ b/resource/page_entries.cpp @@ -10,7 +10,7 @@ PageSelectEntry Entries[] = { {"PIANO ROLL", SEQ_EXTSTEP_PAGE, 6, 1, 24, 25, nullptr}, {"CHROMATIC", SEQ_PTC_PAGE, 7, 1, 24, 25, nullptr}, #ifdef SOUND_PAGE - {"SOUND MANAGER", SOUND_BROWSER, 8, 2, 24, 19, nullptr}, + {"SAMPLE MANAGER", SAMPLE_BROWSER, 8, 2, 24, 25, nullptr}, #endif #ifdef WAV_DESIGNER {"WAV DESIGNER", WD_PAGE_0, 9, 2, 24, 19, nullptr}, From 2c5c0777289ddbd553c734335cb022e8ccda1397 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 23 Jun 2023 19:25:21 +1000 Subject: [PATCH 079/413] Forgot popPage --- avr/cores/megacommand/MCL/ArpPage.cpp | 2 +- avr/cores/megacommand/MCL/FileBrowserPage.h | 2 +- avr/cores/megacommand/MCL/MenuPage.cpp | 2 +- avr/cores/megacommand/MCL/PolyPage.cpp | 2 +- avr/cores/megacommand/MCL/QuestionDialogPage.cpp | 6 +++--- avr/cores/megacommand/MCL/TextInputPage.cpp | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/avr/cores/megacommand/MCL/ArpPage.cpp b/avr/cores/megacommand/MCL/ArpPage.cpp index eb48854c2..0ee6c4fe8 100644 --- a/avr/cores/megacommand/MCL/ArpPage.cpp +++ b/avr/cores/megacommand/MCL/ArpPage.cpp @@ -153,7 +153,7 @@ bool ArpPage::handleEvent(gui_event_t *event) { EVENT_PRESSED(event, Buttons.BUTTON4)) { GUI.ignoreNextEvent(event->source); exit: - GUI.popPage(); + mcl.popPage(); return true; } if (note_interface.is_event(event)) { diff --git a/avr/cores/megacommand/MCL/FileBrowserPage.h b/avr/cores/megacommand/MCL/FileBrowserPage.h index 36adb40e6..429fdf90d 100644 --- a/avr/cores/megacommand/MCL/FileBrowserPage.h +++ b/avr/cores/megacommand/MCL/FileBrowserPage.h @@ -156,7 +156,7 @@ class FileBrowserPage : public LightPage { virtual void on_rename(const char *from, const char *to); // on cancel, the page will be popped, // and there's a last chance to clean up. - virtual void on_cancel() { GUI.popPage(); } + virtual void on_cancel() { mcl.popPage(); } virtual void chdir_type() {} virtual bool _handle_filemenu(); diff --git a/avr/cores/megacommand/MCL/MenuPage.cpp b/avr/cores/megacommand/MCL/MenuPage.cpp index 48a688b2c..be6810e49 100644 --- a/avr/cores/megacommand/MCL/MenuPage.cpp +++ b/avr/cores/megacommand/MCL/MenuPage.cpp @@ -201,7 +201,7 @@ bool MenuPageBase::exit() { // } // if (exit_page_callback != NULL) { - GUI.popPage(); + mcl.popPage(); //} } diff --git a/avr/cores/megacommand/MCL/PolyPage.cpp b/avr/cores/megacommand/MCL/PolyPage.cpp index a40fca55b..8244685f0 100644 --- a/avr/cores/megacommand/MCL/PolyPage.cpp +++ b/avr/cores/megacommand/MCL/PolyPage.cpp @@ -109,7 +109,7 @@ bool PolyPage::handleEvent(gui_event_t *event) { GUI.ignoreNextEvent(event->source); exit: mcl_cfg.write_cfg(); - GUI.popPage(); + mcl.popPage(); GUI.currentPage()->init(); return true; } diff --git a/avr/cores/megacommand/MCL/QuestionDialogPage.cpp b/avr/cores/megacommand/MCL/QuestionDialogPage.cpp index d9a3bce8e..eb9350355 100644 --- a/avr/cores/megacommand/MCL/QuestionDialogPage.cpp +++ b/avr/cores/megacommand/MCL/QuestionDialogPage.cpp @@ -71,18 +71,18 @@ bool QuestionDialogPage::handleEvent(gui_event_t *event) { if (EVENT_RELEASED(event, Buttons.BUTTON4)) { YES_released: return_state = true; - GUI.popPage(); + mcl.popPage(); return true; } if (EVENT_RELEASED(event, Buttons.BUTTON1)) { NO_released: return_state = false; - GUI.popPage(); + mcl.popPage(); return true; } - //GUI.popPage(); + //mcl.popPage(); return false; } diff --git a/avr/cores/megacommand/MCL/TextInputPage.cpp b/avr/cores/megacommand/MCL/TextInputPage.cpp index ab313e1a1..44079e97d 100644 --- a/avr/cores/megacommand/MCL/TextInputPage.cpp +++ b/avr/cores/megacommand/MCL/TextInputPage.cpp @@ -274,7 +274,7 @@ bool TextInputPage::handleEvent(gui_event_t *event) { DEBUG_PRINTLN("pop a"); return_state = false; GUI.ignoreNextEvent(event->source); - GUI.popPage(); + mcl.popPage(); return true; } @@ -314,7 +314,7 @@ bool TextInputPage::handleEvent(gui_event_t *event) { strncpy(textp, text, cpy_len); textp[cpy_len] = '\0'; GUI.ignoreNextEvent(event->source); - GUI.popPage(); + mcl.popPage(); return true; } From 86b53f1a745363917347f46019499bfaa42d888b Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 23 Jun 2023 19:35:06 +1000 Subject: [PATCH 080/413] Receiving samples didnt check for existing :-/ --- avr/cores/megacommand/MCL/SampleBrowserPage.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/avr/cores/megacommand/MCL/SampleBrowserPage.cpp b/avr/cores/megacommand/MCL/SampleBrowserPage.cpp index 3607556ac..52dbacb6b 100644 --- a/avr/cores/megacommand/MCL/SampleBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/SampleBrowserPage.cpp @@ -172,6 +172,7 @@ void SampleBrowserPage::recv_wav(int slot, bool silent) { char temp_entry[FILE_ENTRY_SIZE]; strncpy(temp_entry, wav_name, sizeof(wav_name) - 1); strcat(temp_entry, ".wav"); + if (SD.exists(temp_entry)) { gfx.alert("File exists!", temp_entry); return; } DEBUG_PRINTLN("bulk recv"); DEBUG_PRINTLN(temp_entry); bool ret = midi_sds.recvWav(temp_entry, slot); From 6de2fbef82bb6ea60a3aad2f1c50d49442fb85eb Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 23 Jun 2023 21:24:04 +1000 Subject: [PATCH 081/413] Fix sample menu behaviour --- avr/cores/megacommand/MCL/FileBrowserPage.cpp | 29 +++++++++---------- .../megacommand/MCL/SampleBrowserPage.cpp | 13 ++++----- avr/cores/megacommand/WProgram.h | 2 +- 3 files changed, 20 insertions(+), 24 deletions(-) diff --git a/avr/cores/megacommand/MCL/FileBrowserPage.cpp b/avr/cores/megacommand/MCL/FileBrowserPage.cpp index b4ff1bde1..52257d9ad 100644 --- a/avr/cores/megacommand/MCL/FileBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/FileBrowserPage.cpp @@ -518,30 +518,27 @@ bool FileBrowserPage::handleEvent(gui_event_t *event) { char temp_entry[FILE_ENTRY_SIZE]; get_entry(encoders[1]->getValue(), temp_entry); - if (!dir_only) { - - if (encoders[1]->getValue() == i_save) { - on_new(); - return true; - } - // chdir to parent - if ((temp_entry[0] == '.') && (temp_entry[1] == '.')) { - _cd_up(); - return true; - } - } - DEBUG_DUMP(temp_entry); - // chdir to child if (!show_samplemgr) { - file.open(temp_entry, O_READ); + if (!dir_only) { + + if (encoders[1]->getValue() == i_save) { + on_new(); + return true; + } + + // chdir to parent + if ((temp_entry[0] == '.') && (temp_entry[1] == '.')) { + _cd_up(); + return true; + } + } // chdir to child if (!select_dirs && file.isDirectory()) { _cd(temp_entry); return true; } - file.close(); } if (!dir_only) { diff --git a/avr/cores/megacommand/MCL/SampleBrowserPage.cpp b/avr/cores/megacommand/MCL/SampleBrowserPage.cpp index 52dbacb6b..726725342 100644 --- a/avr/cores/megacommand/MCL/SampleBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/SampleBrowserPage.cpp @@ -45,7 +45,7 @@ void SampleBrowserPage::display() { goto end; } - oled_display.setCursor(0, 16); + oled_display.setCursor(0, 23); float sample_rate_f = (wav_file.header.fmt.sampleRate * 0.001f); uint16_t sample_rate = (uint16_t)sample_rate_f; @@ -55,22 +55,21 @@ void SampleBrowserPage::display() { uint8_t decimal = ((sample_rate_f - (float)sample_rate) * (float)10.0f) + 0.5f; oled_display.print(decimal); - oled_display.print("k "); + oled_display.print(F("k ")); oled_display.print(wav_file.header.fmt.bitRate); - oled_display.print("/"); + oled_display.print(F("/")); oled_display.print(wav_file.header.fmt.numChannels); - float seconds = wav_file.header.get_length() / (float)wav_file.header.fmt.sampleRate; int16_t minutes = seconds * 0.01666666667f; int16_t ms = ((float)seconds - int(seconds)) * 1000; - oled_display.setCursor(0, 23); + oled_display.setCursor(0, 30); oled_display.print(minutes); - oled_display.print(":"); + oled_display.print(F(":")); oled_display.print(int(seconds)); - oled_display.print(":"); + oled_display.print(F(":")); oled_display.print(ms); wav_file.close(); diff --git a/avr/cores/megacommand/WProgram.h b/avr/cores/megacommand/WProgram.h index 39fb718e1..813e42c8f 100644 --- a/avr/cores/megacommand/WProgram.h +++ b/avr/cores/megacommand/WProgram.h @@ -11,7 +11,7 @@ #include "wiring_private.h" -//#define DEBUGMODE +#define DEBUGMODE #ifdef MEGACOMMAND #define SD_CS 53 //PB0 From cd9ad3ed1c09b1030c2140a89d735a8eb2566ced Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 23 Jun 2023 21:31:43 +1000 Subject: [PATCH 082/413] F the strings --- avr/cores/megacommand/MCL/ArpPage.cpp | 2 +- avr/cores/megacommand/MCL/DiagnosticPage.cpp | 2 +- avr/cores/megacommand/MCL/FileBrowserPage.cpp | 2 +- avr/cores/megacommand/MCL/GridLoadPage.cpp | 8 ++++---- avr/cores/megacommand/MCL/GridPage.cpp | 8 ++++---- avr/cores/megacommand/MCL/GridSavePage.cpp | 6 +++--- avr/cores/megacommand/MCL/LFOPage.cpp | 2 +- avr/cores/megacommand/MCL/MCL.cpp | 2 +- avr/cores/megacommand/MCL/MCLGUI.cpp | 14 +++++++------ avr/cores/megacommand/MCL/MCLGfx.cpp | 2 +- avr/cores/megacommand/MCL/MenuPage.cpp | 2 +- avr/cores/megacommand/MCL/OscMixerPage.cpp | 2 +- avr/cores/megacommand/MCL/OscPage.cpp | 20 +++++++++---------- avr/cores/megacommand/MCL/PageSelectPage.cpp | 4 ++-- .../megacommand/MCL/QuestionDialogPage.cpp | 4 ++-- avr/cores/megacommand/MCL/RAMPage.cpp | 16 +++++++-------- .../megacommand/MCL/SampleBrowserPage.cpp | 2 +- avr/cores/megacommand/MCL/SeqPtcPage.cpp | 4 ++-- avr/cores/megacommand/WProgram.h | 2 +- 19 files changed, 53 insertions(+), 51 deletions(-) diff --git a/avr/cores/megacommand/MCL/ArpPage.cpp b/avr/cores/megacommand/MCL/ArpPage.cpp index 0ee6c4fe8..ee955a5a5 100644 --- a/avr/cores/megacommand/MCL/ArpPage.cpp +++ b/avr/cores/megacommand/MCL/ArpPage.cpp @@ -97,7 +97,7 @@ void ArpPage::display() { oled_display.setCursor(42, 10); oled_display.setTextColor(WHITE); - oled_display.print("ARPEGGIATOR: T"); + oled_display.print(F("ARPEGGIATOR: T")); if (seq_ptc_page.midi_device == &MD) { oled_display.print(last_md_track + 1); diff --git a/avr/cores/megacommand/MCL/DiagnosticPage.cpp b/avr/cores/megacommand/MCL/DiagnosticPage.cpp index 7681bfaaf..18d5862f0 100644 --- a/avr/cores/megacommand/MCL/DiagnosticPage.cpp +++ b/avr/cores/megacommand/MCL/DiagnosticPage.cpp @@ -15,7 +15,7 @@ void DiagnosticPage::draw_perfcounter() { auto clock = read_slowclock(); oled_display.setCursor(64, 7); - oled_display.print("GUI loop"); + oled_display.print(F("GUI loop")); oled_display.setCursor(97, 7); oled_display.print(clock_diff(last_clock, clock)); diff --git a/avr/cores/megacommand/MCL/FileBrowserPage.cpp b/avr/cores/megacommand/MCL/FileBrowserPage.cpp index 52257d9ad..2e8c94268 100644 --- a/avr/cores/megacommand/MCL/FileBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/FileBrowserPage.cpp @@ -194,7 +194,7 @@ void FileBrowserPage::draw_filebrowser() { oled_display.setTextColor(WHITE, BLACK); if (encoders[1]->cur - cur_row + n == cur_file) { oled_display.setCursor(x_offset - 4, y_offset + n * 8); - oled_display.print(">"); + oled_display.print(F(">")); } } char temp_entry[FILE_ENTRY_SIZE]; diff --git a/avr/cores/megacommand/MCL/GridLoadPage.cpp b/avr/cores/megacommand/MCL/GridLoadPage.cpp index 8a0307577..095937b94 100644 --- a/avr/cores/megacommand/MCL/GridLoadPage.cpp +++ b/avr/cores/megacommand/MCL/GridLoadPage.cpp @@ -162,17 +162,17 @@ void GridLoadPage::display() { // draw data flow in the center /* oled_display.setCursor(48, MCLGUI::s_menu_y + 12); - oled_display.print("SND"); + oled_display.print(F("SND")); oled_display.setCursor(46, MCLGUI::s_menu_y + 19); - oled_display.print("GRID"); + oled_display.print(F("GRID")); mcl_gui.draw_horizontal_arrow(63, MCLGUI::s_menu_y + 8, 5); mcl_gui.draw_horizontal_arrow(63, MCLGUI::s_menu_y + 15, 5); oled_display.setCursor(74, MCLGUI::s_menu_y + 12); - oled_display.print("MD"); + oled_display.print(F("MD")); oled_display.setCursor(74, MCLGUI::s_menu_y + 19); - oled_display.print("SEQ"); + oled_display.print(F("SEQ")); */ } oled_display.display(); diff --git a/avr/cores/megacommand/MCL/GridPage.cpp b/avr/cores/megacommand/MCL/GridPage.cpp index 2dc0b0161..05b868a8e 100644 --- a/avr/cores/megacommand/MCL/GridPage.cpp +++ b/avr/cores/megacommand/MCL/GridPage.cpp @@ -291,7 +291,7 @@ void GridPage::display_counters() { oled_display.setCursor(24, y_offset); oled_display.print(val); - oled_display.print(":"); + oled_display.print(F(":")); oled_display.print(MidiClock.beat_counter); if ((mcl_actions.next_transition != (uint16_t)-1) && @@ -308,7 +308,7 @@ void GridPage::display_counters() { } oled_display.setCursor(24, y_offset + 8); oled_display.print(val); - oled_display.print(":"); + oled_display.print(F(":")); oled_display.print(mcl_actions.nearest_beat); } } @@ -323,7 +323,7 @@ void GridPage::display_grid_info() { display_counters(); oled_display.setFont(&TomThumb); - // oled_display.print(":"); + // oled_display.print(F(":")); // oled_display.print(MidiClock.step_counter); oled_display.setCursor(22, y_offset + 1 * 8); @@ -360,7 +360,7 @@ void GridPage::display_grid_info() { mcl_gui.put_value_at2(encoders[0]->cur + 1, val); val[2] = '\0'; oled_display.print(val); - oled_display.print(" "); + oled_display.print(F(" ")); uint8_t b = encoders[1]->cur / 16; oled_display.print((char)('A' + b)); mcl_gui.put_value_at2(encoders[1]->cur - b * 16 + 1, val); diff --git a/avr/cores/megacommand/MCL/GridSavePage.cpp b/avr/cores/megacommand/MCL/GridSavePage.cpp index c073be6a8..98155dc74 100644 --- a/avr/cores/megacommand/MCL/GridSavePage.cpp +++ b/avr/cores/megacommand/MCL/GridSavePage.cpp @@ -62,9 +62,9 @@ void GridSavePage::display() { constexpr uint8_t data_x = 56; oled_display.setCursor(data_x + 9, MCLGUI::s_menu_y + 12); - oled_display.print("SND"); + oled_display.print(F("SND")); oled_display.setCursor(data_x + 9, MCLGUI::s_menu_y + 19); - oled_display.print("SEQ"); + oled_display.print(F("SEQ")); oled_display.drawFastHLine(data_x + 13 + 9, MCLGUI::s_menu_y + 8, 2, WHITE); oled_display.drawFastHLine(data_x + 13 + 9, MCLGUI::s_menu_y + 15, 2, @@ -73,7 +73,7 @@ void GridSavePage::display() { mcl_gui.draw_horizontal_arrow(data_x + 16 + 9, MCLGUI::s_menu_y + 12, 5); oled_display.setCursor(data_x + 24 + 9, MCLGUI::s_menu_y + 15); - oled_display.print("GRID"); + oled_display.print(F("GRID")); } oled_display.display(); oled_display.setFont(oldfont); diff --git a/avr/cores/megacommand/MCL/LFOPage.cpp b/avr/cores/megacommand/MCL/LFOPage.cpp index 45dd969d3..a1753d6fd 100644 --- a/avr/cores/megacommand/MCL/LFOPage.cpp +++ b/avr/cores/megacommand/MCL/LFOPage.cpp @@ -246,7 +246,7 @@ void LFOPage::display() { x = mcl_gui.knob_x0 + 2; oled_display.setCursor(x + 5, 6); - oled_display.print("WAV"); + oled_display.print(F("WAV")); draw_knob(1, encoders[1], "SPD"); draw_knob(2, encoders[2], "DEP1"); diff --git a/avr/cores/megacommand/MCL/MCL.cpp b/avr/cores/megacommand/MCL/MCL.cpp index 6e5e25966..3af530dab 100644 --- a/avr/cores/megacommand/MCL/MCL.cpp +++ b/avr/cores/megacommand/MCL/MCL.cpp @@ -115,7 +115,7 @@ void MCL::setup() { } if (!ret) { - oled_display.print("SD CARD ERROR :-("); + oled_display.print(F("SD CARD ERROR :-(")); oled_display.display(); delay(2000); return; diff --git a/avr/cores/megacommand/MCL/MCLGUI.cpp b/avr/cores/megacommand/MCL/MCLGUI.cpp index 1edb3be6f..2a5658d4f 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.cpp +++ b/avr/cores/megacommand/MCL/MCLGUI.cpp @@ -508,7 +508,7 @@ void MCLGUI::draw_microtiming(uint8_t speed, uint8_t timing) { oled_display.drawRect(8 + 1, 1 + 1, 128 - 16 - 2, 32 - 2 - 2, WHITE); oled_display.setCursor(x_pos + 34, 10); - oled_display.print("uTIMING: "); + oled_display.print(F("uTIMING: ")); oled_display.print(K); oled_display.drawLine(x, y_pos + heights[0], x + w, y_pos + heights[0], WHITE); @@ -718,24 +718,26 @@ void MCLGUI::draw_leds(uint8_t x, uint8_t y, uint8_t offset, void MCLGUI::draw_panel_toggle(const char *s1, const char *s2, bool s1_active) { oled_display.setFont(&TomThumb); + + oled_display.setCursor(pane_label_x + 1, pane_label_md_y + 6); if (s1_active) { oled_display.fillRect(pane_label_x, pane_label_md_y, pane_label_w, pane_label_h, WHITE); - oled_display.setCursor(pane_label_x + 1, pane_label_md_y + 6); oled_display.setTextColor(BLACK); oled_display.print(s1); oled_display.setTextColor(WHITE); } else { - oled_display.setCursor(pane_label_x + 1, pane_label_md_y + 6); oled_display.setTextColor(WHITE); oled_display.print(s1); oled_display.fillRect(pane_label_x, pane_label_ex_y, pane_label_w, pane_label_h, WHITE); oled_display.setTextColor(BLACK); } - oled_display.setCursor(pane_label_x + 1, pane_label_ex_y + 6); - oled_display.print(s2); - oled_display.setTextColor(WHITE); + if (mcl.currentPage() != SEQ_STEP_PAGE) { + oled_display.setCursor(pane_label_x + 1, pane_label_ex_y + 6); + oled_display.print(s2); + oled_display.setTextColor(WHITE); + } } void MCLGUI::draw_panel_labels(const char *info1, const char *info2) { diff --git a/avr/cores/megacommand/MCL/MCLGfx.cpp b/avr/cores/megacommand/MCL/MCLGfx.cpp index 383a751a8..ef84b58c7 100644 --- a/avr/cores/megacommand/MCL/MCLGfx.cpp +++ b/avr/cores/megacommand/MCL/MCLGfx.cpp @@ -49,7 +49,7 @@ void MCLGfx::splashscreen(unsigned char* bitmap) { */ oled_display.setCursor(90, 8); oled_display.setTextSize(1); - oled_display.print("V"); + oled_display.print(F("V")); oled_display.print(VERSION_STR); /* for (float length = 0; length < 32; length += 0.7) { diff --git a/avr/cores/megacommand/MCL/MenuPage.cpp b/avr/cores/megacommand/MCL/MenuPage.cpp index be6810e49..8ab88a81d 100644 --- a/avr/cores/megacommand/MCL/MenuPage.cpp +++ b/avr/cores/megacommand/MCL/MenuPage.cpp @@ -117,7 +117,7 @@ void MenuPageBase::draw_item(uint8_t item_n, uint8_t row) { uint8_t number_of_options = get_menu()->get_number_of_options(item_n); if (get_menu()->get_option_range(item_n) > 0) { - oled_display.print(" "); + oled_display.print(F(" ")); uint8_t *pdest = get_menu()->get_dest_variable(item_n); const char *option_name = get_menu()->get_option_name(item_n, *pdest); if (option_name == NULL) { diff --git a/avr/cores/megacommand/MCL/OscMixerPage.cpp b/avr/cores/megacommand/MCL/OscMixerPage.cpp index 407ea8392..b72306673 100644 --- a/avr/cores/megacommand/MCL/OscMixerPage.cpp +++ b/avr/cores/megacommand/MCL/OscMixerPage.cpp @@ -37,7 +37,7 @@ void OscMixerPage::display() { oled_display.setCursor(0, 0); oled_display.fillRect(0, 0, 64, 32, BLACK); - oled_display.print("OSC MIXER"); + oled_display.print(F("OSC MIXER")); draw_levels(); scanline_width = 4; draw_wav(); diff --git a/avr/cores/megacommand/MCL/OscPage.cpp b/avr/cores/megacommand/MCL/OscPage.cpp index d8256e706..6996f7858 100644 --- a/avr/cores/megacommand/MCL/OscPage.cpp +++ b/avr/cores/megacommand/MCL/OscPage.cpp @@ -130,10 +130,10 @@ void OscPage::display() { switch (osc_waveform) { case 0: draw_wav(0); - oled_display.print("--"); + oled_display.print(F("--")); break; case SIN_OSC: - oled_display.print("SIN"); + oled_display.print(F("SIN")); draw_levels(); for (i = 0; i < 16; i++) { if (sine_levels[i] > 0) { @@ -144,34 +144,34 @@ void OscPage::display() { draw_wav(SIN_OSC); break; case TRI_OSC: - oled_display.print("TRI"); + oled_display.print(F("TRI")); sample_number = 0; draw_wav(TRI_OSC); break; case PUL_OSC: - oled_display.print("PUL"); + oled_display.print(F("PUL")); sample_number = 0; draw_wav(PUL_OSC); break; case SAW_OSC: - oled_display.print("SAW"); + oled_display.print(F("SAW")); sample_number = 0; draw_wav(SAW_OSC); break; case USR_OSC: - oled_display.print("USR"); + oled_display.print(F("USR")); draw_wav(USR_OSC); sample_number = 0; draw_usr(); break; } - oled_display.print(" "); + oled_display.print(F(" ")); char *str = " "; if (show_freq) { float freq = get_freq(); oled_display.print((int)freq); - oled_display.print("Hz"); + oled_display.print(F("Hz")); // GUI.printf_at(6, "%f", freq); } else { uint8_t s = enc1.cur - 8; @@ -179,9 +179,9 @@ void OscPage::display() { oled_display.print(number_to_note.notes_upper[note]); oled_display.print((uint8_t)floor(s / 12)); if (enc3.cur < 0) { - oled_display.print("-"); + oled_display.print(F("-")); } else { - oled_display.print("+"); + oled_display.print(F("+")); } oled_display.print(enc2.cur); } diff --git a/avr/cores/megacommand/MCL/PageSelectPage.cpp b/avr/cores/megacommand/MCL/PageSelectPage.cpp index 4f9d9a8a4..4f54548e4 100644 --- a/avr/cores/megacommand/MCL/PageSelectPage.cpp +++ b/avr/cores/megacommand/MCL/PageSelectPage.cpp @@ -88,7 +88,7 @@ void PageSelectPage::init() { oled_display.setFont(&TomThumb); oled_display.setTextColor(BLACK); oled_display.setCursor(47, 6); - oled_display.print("PAGE SELECT"); + oled_display.print(F("PAGE SELECT")); oled_display.setTextColor(WHITE); loop_init = true; @@ -225,7 +225,7 @@ void PageSelectPage::display() { oled_display.setFont(&TomThumb); oled_display.setTextColor(BLACK); oled_display.setCursor(47, 6); - oled_display.print("PAGE SELECT"); + oled_display.print(F("PAGE SELECT")); oled_display.setTextColor(WHITE); uint8_t label_pos[4] = {30, 57, 81, 104}; for (uint8_t i = 0; i < 4; ++i) { diff --git a/avr/cores/megacommand/MCL/QuestionDialogPage.cpp b/avr/cores/megacommand/MCL/QuestionDialogPage.cpp index eb9350355..6b488a804 100644 --- a/avr/cores/megacommand/MCL/QuestionDialogPage.cpp +++ b/avr/cores/megacommand/MCL/QuestionDialogPage.cpp @@ -10,10 +10,10 @@ void QuestionDialogPage::init(const char* title_, const char* text_) { oled_display.setTextColor(WHITE); oled_display.setCursor(MCLGUI::dlg_info_x2 - 86, MCLGUI::dlg_info_y1 + 23); - oled_display.print(" NO"); + oled_display.print(F(" NO")); oled_display.setCursor(MCLGUI::dlg_info_x2 - 55, MCLGUI::dlg_info_y1 + 23); - oled_display.print(" YES"); + oled_display.print(F(" YES")); oled_display.drawRect(MCLGUI::dlg_info_x2 - 88, MCLGUI::dlg_info_y1 + 16, 18, 9, WHITE); oled_display.drawRect(MCLGUI::dlg_info_x2 - 57, MCLGUI::dlg_info_y1 + 16, 18, 9, WHITE); diff --git a/avr/cores/megacommand/MCL/RAMPage.cpp b/avr/cores/megacommand/MCL/RAMPage.cpp index 9e3fc3067..6d1f8ff41 100644 --- a/avr/cores/megacommand/MCL/RAMPage.cpp +++ b/avr/cores/megacommand/MCL/RAMPage.cpp @@ -455,26 +455,26 @@ void RAMPage::display() { oled_display.setCursor(28, 24); switch (RAMPage::rec_states[page_id]) { case STATE_QUEUE: - oled_display.print(" [Queue]"); + oled_display.print(F(" [Queue]")); break; case STATE_RECORD: - oled_display.print(" [Record]"); + oled_display.print(F(" [Record]")); break; case STATE_PLAY: - oled_display.print(" [Play]"); + oled_display.print(F(" [Play]")); break; } oled_display.setFont(&TomThumb); oled_display.setCursor(0, 32); - oled_display.print("RAM "); + oled_display.print(F("RAM ")); oled_display.print(page_id + 1); oled_display.setCursor(105, 32); if (mcl_cfg.ram_page_mode == 0) { - oled_display.print("MONO"); + oled_display.print(F("MONO")); } else { - oled_display.print("LINK"); + oled_display.print(F("LINK")); } oled_display.setFont(); oled_display.setCursor(0, 24); @@ -520,9 +520,9 @@ void RAMPage::display() { } /* oled_display.print(encoders[1]->cur); - oled_display.print(" S:"); + oled_display.print(F(" S:")); oled_display.print(1 << encoders[2]->cur); - oled_display.print(" L:"); + oled_display.print(F(" L:")); oled_display.print(encoders[3]->cur * 4); */ mcl_gui.draw_knob_frame(); diff --git a/avr/cores/megacommand/MCL/SampleBrowserPage.cpp b/avr/cores/megacommand/MCL/SampleBrowserPage.cpp index 726725342..18c9e521b 100644 --- a/avr/cores/megacommand/MCL/SampleBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/SampleBrowserPage.cpp @@ -50,7 +50,7 @@ void SampleBrowserPage::display() { float sample_rate_f = (wav_file.header.fmt.sampleRate * 0.001f); uint16_t sample_rate = (uint16_t)sample_rate_f; oled_display.print(sample_rate); - oled_display.print("."); + oled_display.print(F(".")); uint8_t decimal = ((sample_rate_f - (float)sample_rate) * (float)10.0f) + 0.5f; diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.cpp b/avr/cores/megacommand/MCL/SeqPtcPage.cpp index a151ce76d..2f5818e94 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPtcPage.cpp @@ -238,12 +238,12 @@ void SeqPtcPage::display() { arp_track = &mcl_seq.md_arp_tracks[last_md_track]; } if ((mcl_cfg.poly_mask > 0) && (is_poly)) { - oled_display.print("PLY"); + oled_display.print(F("PLY")); } uint64_t *mask = note_mask; if (arp_track->enabled) { - oled_display.print("ARP"); + oled_display.print(F("ARP")); mask = arp_track->note_mask; } diff --git a/avr/cores/megacommand/WProgram.h b/avr/cores/megacommand/WProgram.h index 813e42c8f..39fb718e1 100644 --- a/avr/cores/megacommand/WProgram.h +++ b/avr/cores/megacommand/WProgram.h @@ -11,7 +11,7 @@ #include "wiring_private.h" -#define DEBUGMODE +//#define DEBUGMODE #ifdef MEGACOMMAND #define SD_CS 53 //PB0 From 94a9171bc9235c809ad0bbae61fb3f0260702265 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 23 Jun 2023 22:01:58 +1000 Subject: [PATCH 083/413] Directory glyph :). Fix logic --- avr/cores/megacommand/MCL/FileBrowserPage.cpp | 16 +++++++++++++--- avr/cores/megacommand/MCL/FileBrowserPage.h | 3 ++- avr/cores/megacommand/MCL/SampleBrowserPage.cpp | 4 +++- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/avr/cores/megacommand/MCL/FileBrowserPage.cpp b/avr/cores/megacommand/MCL/FileBrowserPage.cpp index 2e8c94268..3e6324712 100644 --- a/avr/cores/megacommand/MCL/FileBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/FileBrowserPage.cpp @@ -11,6 +11,7 @@ uint8_t FileBrowserPage::cur_col = 0; uint8_t FileBrowserPage::cur_row = 0; uint8_t FileBrowserPage::cur_file = 0; +bool FileBrowserPage::draw_dirs = false; bool FileBrowserPage::show_dirs = false; bool FileBrowserPage::select_dirs = false; bool FileBrowserPage::show_save = true; @@ -151,6 +152,7 @@ void FileBrowserPage::query_filesystem() { void FileBrowserPage::init() { filemenu_active = false; show_samplemgr = false; + draw_dirs = false; strcpy(focus_match, ""); file_types.reset(); query_filesystem(); @@ -184,8 +186,8 @@ void FileBrowserPage::draw_filebrowser() { max_items = numEntries; } for (uint8_t n = 0; n < max_items; n++) { - - oled_display.setCursor(x_offset, y_offset + 8 * n); + uint8_t y_pos = y_offset + 8 * n; + oled_display.setCursor(x_offset, y_pos); if (n == cur_row) { oled_display.setTextColor(BLACK, WHITE); oled_display.fillRect(oled_display.getCursorX() - 3, @@ -193,7 +195,7 @@ void FileBrowserPage::draw_filebrowser() { } else { oled_display.setTextColor(WHITE, BLACK); if (encoders[1]->cur - cur_row + n == cur_file) { - oled_display.setCursor(x_offset - 4, y_offset + n * 8); + oled_display.setCursor(x_offset - 4, y_pos); oled_display.print(F(">")); } } @@ -201,7 +203,15 @@ void FileBrowserPage::draw_filebrowser() { uint16_t entry_num = encoders[1]->cur - cur_row + n; if (entry_num < numEntries) { get_entry(entry_num, temp_entry); + File d; + d.open(temp_entry, O_READ); + if (d.isDirectory() && draw_dirs) { + oled_display.drawRect(x_offset, y_pos - 4, 6, 4, WHITE); + oled_display.drawFastHLine(x_offset + 1, y_pos - 1 - 4, 3, WHITE); + oled_display.setCursor(x_offset + 8, y_pos); + } oled_display.println(temp_entry); + d.close(); } } if (numEntries > MAX_VISIBLE_ROWS) { diff --git a/avr/cores/megacommand/MCL/FileBrowserPage.h b/avr/cores/megacommand/MCL/FileBrowserPage.h index 429fdf90d..745a7cefc 100644 --- a/avr/cores/megacommand/MCL/FileBrowserPage.h +++ b/avr/cores/megacommand/MCL/FileBrowserPage.h @@ -99,6 +99,8 @@ class FileBrowserPage : public LightPage { static uint8_t cur_file; // configuration, should be set before calling base init() + static bool draw_dirs; + static bool show_dirs; static bool select_dirs; static bool show_save; @@ -106,7 +108,6 @@ class FileBrowserPage : public LightPage { static bool show_new_folder; static bool show_filemenu; static bool show_overwrite; - static bool show_samplemgr; static bool filemenu_active; diff --git a/avr/cores/megacommand/MCL/SampleBrowserPage.cpp b/avr/cores/megacommand/MCL/SampleBrowserPage.cpp index 18c9e521b..ae5149fc2 100644 --- a/avr/cores/megacommand/MCL/SampleBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/SampleBrowserPage.cpp @@ -40,7 +40,7 @@ void SampleBrowserPage::display() { bool is_wav = strcmp(c_wav_suffix, (&temp_entry[len - 4])) == 0; Wav wav_file; - if (!is_wav || !wav_file.open(temp_entry, false)) { + if (!is_wav || (is_wav && !wav_file.open(temp_entry, false))) { FileBrowserPage::selection_change = false; goto end; } @@ -94,6 +94,7 @@ void SampleBrowserPage::init() { if (show_samplemgr) { strcpy(title, "MD-ROM"); + draw_dirs = false; show_dirs = false; show_save = false; show_filemenu = false; @@ -102,6 +103,7 @@ void SampleBrowserPage::init() { query_sample_slots(); } else { strcpy(title, "SAMPLE"); + draw_dirs = true; show_dirs = true; show_save = true; show_filemenu = true; From 560ab6a941de8ef0b949060728d51ae5a37ae832 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 23 Jun 2023 22:24:45 +1000 Subject: [PATCH 084/413] Color --- avr/cores/megacommand/MCL/FileBrowserPage.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/avr/cores/megacommand/MCL/FileBrowserPage.cpp b/avr/cores/megacommand/MCL/FileBrowserPage.cpp index 3e6324712..bf6e00b90 100644 --- a/avr/cores/megacommand/MCL/FileBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/FileBrowserPage.cpp @@ -188,16 +188,17 @@ void FileBrowserPage::draw_filebrowser() { for (uint8_t n = 0; n < max_items; n++) { uint8_t y_pos = y_offset + 8 * n; oled_display.setCursor(x_offset, y_pos); - if (n == cur_row) { + bool color = n == cur_row; + if (color) { oled_display.setTextColor(BLACK, WHITE); oled_display.fillRect(oled_display.getCursorX() - 3, oled_display.getCursorY() - 6, width, 7, WHITE); } else { oled_display.setTextColor(WHITE, BLACK); - if (encoders[1]->cur - cur_row + n == cur_file) { - oled_display.setCursor(x_offset - 4, y_pos); - oled_display.print(F(">")); - } + } + if (encoders[1]->cur - cur_row + n == cur_file) { + oled_display.setCursor(x_offset - 4, y_pos); + oled_display.print(F(">")); } char temp_entry[FILE_ENTRY_SIZE]; uint16_t entry_num = encoders[1]->cur - cur_row + n; @@ -206,8 +207,8 @@ void FileBrowserPage::draw_filebrowser() { File d; d.open(temp_entry, O_READ); if (d.isDirectory() && draw_dirs) { - oled_display.drawRect(x_offset, y_pos - 4, 6, 4, WHITE); - oled_display.drawFastHLine(x_offset + 1, y_pos - 1 - 4, 3, WHITE); + oled_display.drawRect(x_offset, y_pos - 4, 6, 4, !color); + oled_display.drawFastHLine(x_offset + 1, y_pos - 1 - 4, 3, !color); oled_display.setCursor(x_offset + 8, y_pos); } oled_display.println(temp_entry); From f9ed310d3b5e7a81f3901110d6710b1b11804929 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 23 Jun 2023 22:25:04 +1000 Subject: [PATCH 085/413] Hide toggle on step and piano roll --- avr/cores/megacommand/MCL/MCLGUI.cpp | 3 ++- avr/cores/megacommand/MCL/SeqPage.cpp | 8 ++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCLGUI.cpp b/avr/cores/megacommand/MCL/MCLGUI.cpp index 2a5658d4f..cca2c49e7 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.cpp +++ b/avr/cores/megacommand/MCL/MCLGUI.cpp @@ -733,7 +733,8 @@ void MCLGUI::draw_panel_toggle(const char *s1, const char *s2, bool s1_active) { pane_label_h, WHITE); oled_display.setTextColor(BLACK); } - if (mcl.currentPage() != SEQ_STEP_PAGE) { + + if (mcl.currentPage() == SEQ_PTC_PAGE) { oled_display.setCursor(pane_label_x + 1, pane_label_ex_y + 6); oled_display.print(s2); oled_display.setTextColor(WHITE); diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index 395d11114..9ff0ae0cb 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -1276,8 +1276,12 @@ void SeqPage::display() { // draw current active track mcl_gui.draw_panel_number(track_id); - mcl_gui.draw_panel_toggle(int_name, ext_name, is_md); - + if (mcl.currentPage() == SEQ_EXTSTEP_PAGE) { + mcl_gui.draw_panel_toggle(ext_name, int_name, true); + } + else { + mcl_gui.draw_panel_toggle(int_name, ext_name, is_md); + } // draw stop/play/rec state mcl_gui.draw_panel_status(recording, MidiClock.state == 2); From 9946f410852695691e1dc1b61a05543faa0deddf Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 23 Jun 2023 22:59:35 +1000 Subject: [PATCH 086/413] device toggle was not workign via menu --- avr/cores/megacommand/MCL/SeqPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index 9ff0ae0cb..276689e9a 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -403,6 +403,7 @@ bool SeqPage::handleEvent(gui_event_t *event) { if (show_seq_menu) { row_func = seq_menu_page.menu.get_row_function(seq_menu_page.encoders[1]->cur); + midi_device = midi_active_peering.get_device(mcl_cfg.seq_dev); } else if (show_step_menu) { row_func = step_menu_page.menu.get_row_function(step_menu_page.encoders[1]->cur); @@ -425,7 +426,6 @@ bool SeqPage::handleEvent(gui_event_t *event) { show_seq_menu = false; show_step_menu = false; - midi_device = midi_active_peering.get_device(mcl_cfg.seq_dev); mcl_gui.init_encoders_used_clock(); init(); return true; From 1cff58627a1865cd7e0660569d8ee75855f6bec3 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 23 Jun 2023 22:29:03 +1000 Subject: [PATCH 087/413] move to progmem, for security --- avr/cores/megacommand/MCL/MCL.cpp | 2 +- avr/cores/megacommand/MCL/MCL.h | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCL.cpp b/avr/cores/megacommand/MCL/MCL.cpp index 3af530dab..8a31b633c 100644 --- a/avr/cores/megacommand/MCL/MCL.cpp +++ b/avr/cores/megacommand/MCL/MCL.cpp @@ -34,7 +34,7 @@ void sdcard_bench() { void mcl_setup() { mcl.setup(); } -static LightPage *const MCL::pages_table[NUM_PAGES] = { +static LightPage *const MCL::pages_table[NUM_PAGES] PROGMEM = { &grid_page, // Index: 0 &page_select_page, // Index: 1 &system_page, // Index: 2 diff --git a/avr/cores/megacommand/MCL/MCL.h b/avr/cores/megacommand/MCL/MCL.h index 0203fee2c..9a8f25648 100644 --- a/avr/cores/megacommand/MCL/MCL.h +++ b/avr/cores/megacommand/MCL/MCL.h @@ -16,8 +16,8 @@ #include "Fonts/Elektrothic.h" #include "Fonts/TomThumb.h" -#define VERSION 4043 -#define VERSION_STR "4.43" +#define VERSION 4050 +#define VERSION_STR "R4.50" #define CALLBACK_TIMEOUT 500 #define GUI_NAME_TIMEOUT 800 @@ -81,16 +81,19 @@ class MCL { public: static constexpr uint8_t NUM_PAGES = 39; - static LightPage *const pages_table[NUM_PAGES]; + static LightPage *const pages_table[NUM_PAGES] PROGMEM; PageIndex current_page = 0; + LightPage *getPage(PageIndex page) { + return (LightPage*) pgm_read_word(pages_table + page); + } void setPage(PageIndex page) { if (page >= NUM_PAGES) { page = 0; } current_page = page; - GUI.setPage(pages_table[page]); + GUI.setPage(getPage(page)); } void pushPage(PageIndex page) { @@ -98,13 +101,13 @@ class MCL { page = 0; } current_page = page; - GUI.pushPage(pages_table[page]); + GUI.pushPage(getPage(page)); } void popPage() { GUI.popPage(); for (uint8_t n = 0; n < NUM_PAGES; n++) { - if (GUI.currentPage() == pages_table[n]) { + if (GUI.currentPage() == getPage(n)) { current_page = n; return; } From b1f22b005a3e7028aba8952bbd96bb48ed01fd7e Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 24 Jun 2023 11:08:51 +1000 Subject: [PATCH 088/413] Fix on_cancel bug. disable left/right --- avr/cores/megacommand/MCL/FileBrowserPage.cpp | 10 ++-------- avr/cores/megacommand/MCL/SampleBrowserPage.cpp | 1 + 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/avr/cores/megacommand/MCL/FileBrowserPage.cpp b/avr/cores/megacommand/MCL/FileBrowserPage.cpp index bf6e00b90..8c52ce112 100644 --- a/avr/cores/megacommand/MCL/FileBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/FileBrowserPage.cpp @@ -486,12 +486,14 @@ bool FileBrowserPage::handleEvent(gui_event_t *event) { case MDX_KEY_UP: encoders[1]->cur -= inc; break; + /* case MDX_KEY_DOWN: encoders[1]->cur += inc; break; case MDX_KEY_LEFT: _cd_up(); break; + */ case MDX_KEY_RIGHT: dir_only = true; goto YES; @@ -562,14 +564,6 @@ bool FileBrowserPage::handleEvent(gui_event_t *event) { // cancel if (EVENT_PRESSED(event, Buttons.BUTTON1)) { NO: - if (show_samplemgr) { - // on cancel, break out of sample manager - // and intercept cancel event - show_samplemgr = false; - init(); - return true; - } - on_cancel(); return true; } diff --git a/avr/cores/megacommand/MCL/SampleBrowserPage.cpp b/avr/cores/megacommand/MCL/SampleBrowserPage.cpp index ae5149fc2..5a14aa72c 100644 --- a/avr/cores/megacommand/MCL/SampleBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/SampleBrowserPage.cpp @@ -204,6 +204,7 @@ void SampleBrowserPage::on_cancel() { pending_action = 0; if (show_samplemgr) { show_samplemgr = false; +// init(); } else { // TODO cd .. ? _cd_up(); From 37cf7fca79701deb4e76905519c5449b71ce044c Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 24 Jun 2023 12:13:29 +1000 Subject: [PATCH 089/413] Fix slowdown due to directory checking --- avr/cores/megacommand/MCL/FileBrowserPage.cpp | 52 +++++++++++-------- avr/cores/megacommand/MCL/FileBrowserPage.h | 6 ++- avr/cores/megacommand/MCL/MCLMemory.h | 4 +- 3 files changed, 36 insertions(+), 26 deletions(-) diff --git a/avr/cores/megacommand/MCL/FileBrowserPage.cpp b/avr/cores/megacommand/MCL/FileBrowserPage.cpp index 8c52ce112..ec721ad5b 100644 --- a/avr/cores/megacommand/MCL/FileBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/FileBrowserPage.cpp @@ -49,17 +49,26 @@ void FileBrowserPage::setup() { } void FileBrowserPage::get_entry(uint16_t n, const char *entry) { + uint8_t discard_type; + get_entry(n, entry, discard_type); +} + +void FileBrowserPage::get_entry(uint16_t n, const char *entry, uint8_t &type) { volatile uint8_t *ptr = (uint8_t *)BANK1_FILE_ENTRIES_START + n * FILE_ENTRY_SIZE; - get_bank3((volatile void *)entry, ptr, FILE_ENTRY_SIZE); + char buf[FILE_ENTRY_SIZE]; + get_bank3(buf, ptr, FILE_ENTRY_SIZE); + type = buf[0]; + strcpy(entry, buf + 1); } -bool FileBrowserPage::add_entry(const char *entry) { +bool FileBrowserPage::add_entry(const char *entry, uint8_t type) { if (numEntries >= NUM_FILE_ENTRIES) { return false; } char buf[FILE_ENTRY_SIZE]; - strncpy(buf, entry, FILE_ENTRY_SIZE); + buf[0] = type; + strncpy(buf + 1, entry, FILE_ENTRY_SIZE - 1); buf[FILE_ENTRY_SIZE - 1] = '\0'; volatile uint8_t *ptr = (uint8_t *)BANK1_FILE_ENTRIES_START + numEntries * FILE_ENTRY_SIZE; @@ -118,9 +127,11 @@ void FileBrowserPage::query_filesystem() { bool is_match_file = false; DEBUG_PRINTLN(numEntries); DEBUG_PRINTLN(temp_entry); + bool is_dir = false; if (temp_entry[0] == '.') { is_match_file = false; } else if (file.isDirectory() && show_dirs) { + is_dir = true; is_match_file = true; } else { // XXX only 3char suffix @@ -128,7 +139,7 @@ void FileBrowserPage::query_filesystem() { } if (is_match_file && (strlen(temp_entry) > 0)) { DEBUG_PRINTLN(F("file matched")); - if (add_entry(temp_entry)) { + if (add_entry(temp_entry,is_dir)) { if (strlen(focus_match) > 0 && strcmp(temp_entry, focus_match) == 0) { DEBUG_DUMP(temp_entry); DEBUG_DUMP(mcl_cfg.project); @@ -179,12 +190,10 @@ void FileBrowserPage::draw_filebrowser() { constexpr uint8_t x_offset = 43, y_offset = 8, width = MENU_WIDTH; oled_display.setCursor(x_offset, 8); - uint8_t max_items; - if (numEntries > MAX_VISIBLE_ROWS) { - max_items = MAX_VISIBLE_ROWS; - } else { - max_items = numEntries; - } + uint8_t max_items = min(MAX_VISIBLE_ROWS,numEntries); + + char temp_entry[FILE_ENTRY_SIZE]; + for (uint8_t n = 0; n < max_items; n++) { uint8_t y_pos = y_offset + 8 * n; oled_display.setCursor(x_offset, y_pos); @@ -200,19 +209,16 @@ void FileBrowserPage::draw_filebrowser() { oled_display.setCursor(x_offset - 4, y_pos); oled_display.print(F(">")); } - char temp_entry[FILE_ENTRY_SIZE]; uint16_t entry_num = encoders[1]->cur - cur_row + n; if (entry_num < numEntries) { - get_entry(entry_num, temp_entry); - File d; - d.open(temp_entry, O_READ); - if (d.isDirectory() && draw_dirs) { + uint8_t type; + get_entry(entry_num, temp_entry, type); + if (type == DIR_TYPE && draw_dirs) { oled_display.drawRect(x_offset, y_pos - 4, 6, 4, !color); oled_display.drawFastHLine(x_offset + 1, y_pos - 1 - 4, 3, !color); oled_display.setCursor(x_offset + 8, y_pos); } oled_display.println(temp_entry); - d.close(); } } if (numEntries > MAX_VISIBLE_ROWS) { @@ -467,7 +473,7 @@ bool FileBrowserPage::handleEvent(gui_event_t *event) { if (note_interface.is_event(event)) { return false; } - bool dir_only = false; + //bool dir_only = false; if (EVENT_CMD(event)) { uint8_t key = event->source - 64; @@ -486,17 +492,17 @@ bool FileBrowserPage::handleEvent(gui_event_t *event) { case MDX_KEY_UP: encoders[1]->cur -= inc; break; - /* case MDX_KEY_DOWN: encoders[1]->cur += inc; break; + /* case MDX_KEY_LEFT: _cd_up(); break; - */ case MDX_KEY_RIGHT: dir_only = true; goto YES; + */ } } } @@ -534,7 +540,7 @@ bool FileBrowserPage::handleEvent(gui_event_t *event) { if (!show_samplemgr) { file.open(temp_entry, O_READ); - if (!dir_only) { + // if (!dir_only) { if (encoders[1]->getValue() == i_save) { on_new(); @@ -546,7 +552,7 @@ bool FileBrowserPage::handleEvent(gui_event_t *event) { _cd_up(); return true; } - } + // } // chdir to child if (!select_dirs && file.isDirectory()) { _cd(temp_entry); @@ -554,10 +560,10 @@ bool FileBrowserPage::handleEvent(gui_event_t *event) { } } - if (!dir_only) { + // if (!dir_only) { GUI.ignoreNextEvent(event->source); on_select(temp_entry); - } + // } return true; } diff --git a/avr/cores/megacommand/MCL/FileBrowserPage.h b/avr/cores/megacommand/MCL/FileBrowserPage.h index 745a7cefc..7c29e5782 100644 --- a/avr/cores/megacommand/MCL/FileBrowserPage.h +++ b/avr/cores/megacommand/MCL/FileBrowserPage.h @@ -138,8 +138,12 @@ class FileBrowserPage : public LightPage { virtual void display(); - bool add_entry(const char *entry); + static constexpr uint8_t FILE_TYPE = 0; + static constexpr uint8_t DIR_TYPE = 1; + + bool add_entry(const char *entry, uint8_t type = FILE_TYPE); void get_entry(uint16_t n, const char *entry); + void get_entry(uint16_t n, const char *entry, uint8_t &type); void draw_scrollbar(uint8_t x_offset); bool create_folder(); diff --git a/avr/cores/megacommand/MCL/MCLMemory.h b/avr/cores/megacommand/MCL/MCLMemory.h index aff45b4d5..bd7b93d57 100644 --- a/avr/cores/megacommand/MCL/MCLMemory.h +++ b/avr/cores/megacommand/MCL/MCLMemory.h @@ -100,8 +100,8 @@ constexpr size_t BANK1_MDTEMPO_TRACK_START = BANK1_MDFX_TRACK_START + MDFX_TRACK constexpr size_t BANK1_A4_TRACKS_START = BANK1_MDTEMPO_TRACK_START + MDTEMPO_TRACK_LEN; // 512x file entries (16 bytes each), stored in Bank3 -constexpr size_t NUM_FILE_ENTRIES = 512; -constexpr size_t FILE_ENTRY_SIZE = 16; +constexpr size_t NUM_FILE_ENTRIES = 256; +constexpr size_t FILE_ENTRY_SIZE = 32; constexpr size_t BANK1_FILE_ENTRIES_START = 0x0000; constexpr size_t BANK1_FILE_ENTRIES_END = 0x6000; From 7c7cf0d2cdf788c3aa51b486c9c8f446c787814d Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 24 Jun 2023 18:23:15 +1000 Subject: [PATCH 090/413] grid device track refactor, uses more progmem, but saves 700bytes of RAM --- avr/cores/megacommand/A4/A4.cpp | 7 +- avr/cores/megacommand/A4/A4.h | 2 +- avr/cores/megacommand/Elektron/Elektron.cpp | 12 ++ avr/cores/megacommand/Elektron/Elektron.h | 63 +++------ avr/cores/megacommand/MCL/ExtTrack.h | 1 + avr/cores/megacommand/MCL/Grid.h | 21 +++ avr/cores/megacommand/MCL/GridIOPage.cpp | 9 +- avr/cores/megacommand/MCL/GridTask.cpp | 37 +++-- avr/cores/megacommand/MCL/GridTask.h | 2 +- avr/cores/megacommand/MCL/MCLActions.cpp | 133 +++++++----------- avr/cores/megacommand/MCL/MCLActions.h | 42 ++++-- avr/cores/megacommand/MCL/MCLClipBoard.cpp | 28 ++-- .../megacommand/MCL/MidiActivePeering.cpp | 15 +- avr/cores/megacommand/MCL/MidiActivePeering.h | 2 +- avr/cores/megacommand/MCL/Project.h | 2 +- avr/cores/megacommand/MCL/SeqTrack.cpp | 2 + avr/cores/megacommand/MCL/SeqTrack.h | 6 +- avr/cores/megacommand/MD/MD.cpp | 27 ++-- avr/cores/megacommand/MD/MD.h | 2 +- avr/cores/megacommand/MNM/MNM.cpp | 7 +- avr/cores/megacommand/MNM/MNM.h | 2 +- 21 files changed, 217 insertions(+), 205 deletions(-) diff --git a/avr/cores/megacommand/A4/A4.cpp b/avr/cores/megacommand/A4/A4.cpp index ee8ec3d7c..b0d35789c 100644 --- a/avr/cores/megacommand/A4/A4.cpp +++ b/avr/cores/megacommand/A4/A4.cpp @@ -40,17 +40,18 @@ const ElektronSysexProtocol a4_protocol = { A4Class::A4Class() : ElektronDevice(&Midi2, "A4", DEVICE_A4, a4_protocol) {} -void A4Class::init_grid_devices() { +void A4Class::init_grid_devices(uint8_t device_idx) { uint8_t grid_idx = 1; + GridDeviceTrack gdt; for (uint8_t i = 0; i < NUM_EXT_TRACKS; i++) { uint8_t track_type = EXT_TRACK_TYPE; if (i < NUM_A4_SOUND_TRACKS) { track_type = A4_TRACK_TYPE; } - - add_track_to_grid(grid_idx, i, &(mcl_seq.ext_tracks[i]), track_type); + gdt.init(track_type, GROUP_DEV, device_idx, &(mcl_seq.ext_tracks[i])); + add_track_to_grid(grid_idx, i, &gdt); } } diff --git a/avr/cores/megacommand/A4/A4.h b/avr/cores/megacommand/A4/A4.h index 1d5161631..727cacb8e 100644 --- a/avr/cores/megacommand/A4/A4.h +++ b/avr/cores/megacommand/A4/A4.h @@ -36,7 +36,7 @@ class A4Class : public ElektronDevice { A4Class(); virtual bool probe(); - virtual void init_grid_devices(); + virtual void init_grid_devices(uint8_t device_idx); virtual uint8_t* icon(); virtual uint16_t sendKitParams(uint8_t* masks); diff --git a/avr/cores/megacommand/Elektron/Elektron.cpp b/avr/cores/megacommand/Elektron/Elektron.cpp index 75e3abff7..db227c709 100644 --- a/avr/cores/megacommand/Elektron/Elektron.cpp +++ b/avr/cores/megacommand/Elektron/Elektron.cpp @@ -1,7 +1,19 @@ #include "Elektron.h" +#include "Project.h" #define SYSEX_RETRIES 1 +void MidiDevice::add_track_to_grid(uint8_t grid_idx, uint8_t track_idx, GridDeviceTrack *gdt) { + proj.grids[grid_idx].add_track(track_idx, gdt); +} + +void MidiDevice::cleanup(uint8_t device_idx) { + for (uint8_t n = 0; n < NUM_GRIDS; n++) { + proj.grids[n].cleanup(device_idx); + } +} + + uint16_t ElektronDevice::sendRequest(uint8_t *data, uint8_t len, bool send, MidiUartParent *uart_) { if (uart_ == nullptr) { uart_ = uart; } diff --git a/avr/cores/megacommand/Elektron/Elektron.h b/avr/cores/megacommand/Elektron/Elektron.h index e8dc255f2..e4930f940 100644 --- a/avr/cores/megacommand/Elektron/Elektron.h +++ b/avr/cores/megacommand/Elektron/Elektron.h @@ -136,45 +136,36 @@ class SeqTrack; /// Base class for MIDI-compatible devices /// Defines basic device description data and driver interfaces. +#define GROUP_DEV 0 +#define GROUP_AUX 1 +#define GROUP_TEMPO 2 +#define EMPTY_TRACK_TYPE 0 + class GridDeviceTrack { public: - uint8_t slot_number; + uint8_t device_idx; uint8_t track_type; uint8_t group_type; uint8_t mem_slot_idx; SeqTrack *seq_track; - uint8_t get_slot_number() { return slot_number; } - SeqTrack *get_seq_track() { return seq_track; } -}; - -#define GROUP_DEV 0 -#define GROUP_AUX 1 -#define GROUP_TEMPO 2 - -class GridDevice { -public: - uint8_t num_tracks; - uint8_t get_num_tracks() { return num_tracks; } - - GridDeviceTrack tracks[GRID_WIDTH]; - - GridDevice() { init(); } - void init() { num_tracks = 0; } + GridDeviceTrack() { + init(); + } - void add_track(uint8_t track_idx, uint8_t slot_number, SeqTrack *seq_track, uint8_t track_type, uint8_t group_type = GROUP_DEV, uint8_t mem_slot_idx = 255) { - tracks[track_idx].slot_number = slot_number; - tracks[track_idx].seq_track = seq_track; - tracks[track_idx].track_type = track_type; - tracks[track_idx].mem_slot_idx = mem_slot_idx; - if (mem_slot_idx == 255) { - tracks[track_idx].mem_slot_idx = track_idx; - } - tracks[track_idx].group_type = group_type; - num_tracks++; + void init(uint8_t _track_type = EMPTY_TRACK_TYPE, uint8_t _group_type = GROUP_DEV, uint8_t _device_idx = 255, SeqTrack *_seq_track = nullptr, uint8_t _mem_slot_idx = 255) { + track_type = _track_type; + group_type = _group_type; + mem_slot_idx = _mem_slot_idx; + seq_track = _seq_track; + device_idx = _device_idx; } + + SeqTrack *get_seq_track() { return seq_track; } + bool isActive() { return track_type != EMPTY_TRACK_TYPE; } }; + class MidiDevice { public: bool connected; @@ -184,7 +175,6 @@ class MidiDevice { const uint8_t id; // Device identifier const bool isElektronDevice; uint8_t track_type; - GridDevice grid_devices[NUM_GRIDS]; MidiDevice(MidiClass* _midi, const char* _name, const uint8_t _id, const bool _isElektronDevice) : name(_name), id(_id), isElektronDevice(_isElektronDevice) @@ -195,26 +185,19 @@ class MidiDevice { connected = false; } - void cleanup() { - memset(grid_devices,0, sizeof(GridDevice) * NUM_GRIDS); - } - - void add_track_to_grid(uint8_t grid_idx, uint8_t track_idx, SeqTrack *seq_track, uint8_t track_type_, uint8_t group_type = GROUP_DEV, uint8_t mem_slot_idx = 255) { - auto *devp = &grid_devices[grid_idx]; - if (track_type == 0) { track_type = track_type_; } - devp->add_track(track_idx, track_idx + grid_idx * GRID_WIDTH, seq_track, track_type_, group_type, mem_slot_idx); - } + void add_track_to_grid(uint8_t grid_idx, uint8_t track_idx, GridDeviceTrack *gdt); + void cleanup(uint8_t device_idx); ElektronDevice* asElektronDevice() { if (!isElektronDevice) return nullptr; return (ElektronDevice*) this; } - virtual void init_grid_devices() {}; + virtual void init_grid_devices(uint8_t device_idx) {}; virtual void setup() { }; - virtual void disconnect() { cleanup(); connected = false; } + virtual void disconnect(uint8_t device_idx) { cleanup(device_idx); connected = false; } virtual bool probe() = 0; virtual uint8_t get_mute_cc() { return 255; } virtual void muteTrack(uint8_t track, bool mute = true, MidiUartParent *uart_ = nullptr) {}; diff --git a/avr/cores/megacommand/MCL/ExtTrack.h b/avr/cores/megacommand/MCL/ExtTrack.h index 78f5c51e5..d631471ea 100644 --- a/avr/cores/megacommand/MCL/ExtTrack.h +++ b/avr/cores/megacommand/MCL/ExtTrack.h @@ -5,6 +5,7 @@ #include "ExtSeqTrack.h" #include "GridTrack.h" #include "MCLMemory.h" +#include "MidiActivePeering.h" #define EMPTY_TRACK_TYPE 0 diff --git a/avr/cores/megacommand/MCL/Grid.h b/avr/cores/megacommand/MCL/Grid.h index b6f45f1ad..4e0abb568 100644 --- a/avr/cores/megacommand/MCL/Grid.h +++ b/avr/cores/megacommand/MCL/Grid.h @@ -116,4 +116,25 @@ class Grid : public GridHeader { bool sync() { return file.sync(); } }; +class DeviceGrid : public Grid { + + public: + GridDeviceTrack tracks[GRID_WIDTH]; + void add_track(uint8_t track_idx, GridDeviceTrack *gdt) { + if (gdt->mem_slot_idx == 255) { gdt->mem_slot_idx = track_idx; } + memcpy(tracks + track_idx, gdt, sizeof(GridDeviceTrack)); + } + void cleanup(uint8_t device_idx) { + for (uint8_t n = 0; n < GRID_WIDTH; n++) { + if (tracks[n].device_idx == device_idx) { tracks[n].init(); } + } + } + + void init() { + for (uint8_t n = 0; n < GRID_WIDTH; n++) { + tracks[n].init(); + } + } +}; + #endif /* GRID_H__ */ diff --git a/avr/cores/megacommand/MCL/GridIOPage.cpp b/avr/cores/megacommand/MCL/GridIOPage.cpp index fb37c4531..dce6fca97 100644 --- a/avr/cores/megacommand/MCL/GridIOPage.cpp +++ b/avr/cores/megacommand/MCL/GridIOPage.cpp @@ -18,17 +18,16 @@ void GridIOPage::init() { void GridIOPage::track_select_array_from_type_select( uint8_t *track_select_array) { - uint8_t track_idx, dev_idx; - for (uint8_t n = 0; n < NUM_SLOTS; n++) { GridDeviceTrack *gdt = - mcl_actions.get_grid_dev_track(n, &track_idx, &dev_idx); + mcl_actions.get_grid_dev_track(n); - if (gdt == nullptr) + uint8_t device_idx = gdt->device_idx; + if (!gdt->isActive()) continue; if ((gdt->group_type == GROUP_DEV) && - IS_BIT_SET16(mcl_cfg.track_type_select, dev_idx)) { + IS_BIT_SET16(mcl_cfg.track_type_select, device_idx)) { track_select_array[n] = 1; } // AUX tracks diff --git a/avr/cores/megacommand/MCL/GridTask.cpp b/avr/cores/megacommand/MCL/GridTask.cpp index 1862a80ae..46d65747b 100644 --- a/avr/cores/megacommand/MCL/GridTask.cpp +++ b/avr/cores/megacommand/MCL/GridTask.cpp @@ -107,7 +107,6 @@ void GridTask::transition_handler() { DEBUG_PRINTLN(mcl_actions.next_transition); DEBUG_PRINTLN((int)SP); - uint8_t track_idx, dev_idx; uint8_t row = 255; @@ -121,15 +120,16 @@ void GridTask::transition_handler() { (grid_page.active_slots[n] == SLOT_DISABLED) || (mcl_actions.next_transition != mcl_actions.next_transitions[n])) continue; - GridDeviceTrack *gdt = - mcl_actions.get_grid_dev_track(n, &track_idx, &dev_idx); + GridDeviceTrack *gdt = mcl_actions.get_grid_dev_track(n); + uint8_t track_idx = mcl_actions.get_track_idx(n); + uint8_t device_idx = gdt->device_idx; - if (gdt == nullptr) { + if (!gdt->isActive()) { continue; } if (link_load(n, track_idx, slots_changed, track_select_array, gdt)) { - send_device[dev_idx] = true; + send_device[device_idx] = true; } if (row == 255) { @@ -154,10 +154,11 @@ void GridTask::transition_handler() { for (uint8_t n = 0; n < NUM_SLOTS; n++) { if (slots_changed[n] == 255) continue; + GridDeviceTrack *gdt = mcl_actions.get_grid_dev_track(n); + uint8_t track_idx = mcl_actions.get_track_idx(n); + uint8_t device_idx = gdt->device_idx; - GridDeviceTrack *gdt = - mcl_actions.get_grid_dev_track(n, &track_idx, &dev_idx); - if ((gdt == nullptr) || (dev_idx != c)) + if (!gdt->isActive() || (device_idx != c)) continue; // Wait on first track of each device; @@ -168,7 +169,7 @@ void GridTask::transition_handler() { mcl_actions.div192th_total_latency - 1; mcl_actions.div192th_total_latency -= - mcl_actions.dev_latency[dev_idx].latency; + mcl_actions.dev_latency[device_idx].latency; uint32_t diff; @@ -185,7 +186,7 @@ void GridTask::transition_handler() { } } wait = false; - if (transition_load(n, track_idx, dev_idx, gdt)) { + if (transition_load(n, track_idx, gdt)) { grid_page.active_slots[n] = slots_changed[n]; } } @@ -207,10 +208,9 @@ void GridTask::transition_handler() { // Once tracks are cached, we can calculate their next transition uint8_t last_slot = 255; for (uint8_t n = 0; n < NUM_SLOTS; n++) { - GridDeviceTrack *gdt = - mcl_actions.get_grid_dev_track(n, &track_idx, &dev_idx); + GridDeviceTrack *gdt = mcl_actions.get_grid_dev_track(n); - if (gdt == nullptr) { + if (!gdt->isActive()) { continue; } @@ -229,18 +229,13 @@ void GridTask::transition_handler() { } if (last_slot != 255 && slots_changed[last_slot] < GRID_LENGTH) { - // GridDeviceTrack *gdt = - // mcl_actions.get_grid_dev_track(last_slot, &track_idx, &dev_idx); last_active_row = slots_changed[last_slot]; next_active_row = mcl_actions.links[last_slot].row; chain_behaviour = mcl_actions.chains[last_slot].mode > 1; - GridDeviceTrack *gdt = - mcl_actions.get_grid_dev_track(last_slot, &track_idx, &dev_idx); - GridRowHeader row_header; proj.read_grid_row_header(&row_header, last_active_row); - dev_idx = 0; + uint8_t dev_idx = 0; if (elektron_devs[dev_idx]) { uint8_t len = elektron_devs[dev_idx]->sysex_protocol.kitname_length; @@ -277,8 +272,8 @@ bool GridTask::link_load(uint8_t n, uint8_t track_idx, uint8_t *slots_changed, } return false; } -bool GridTask::transition_load(uint8_t n, uint8_t track_idx, uint8_t dev_idx, - GridDeviceTrack *gdt) { + +bool GridTask::transition_load(uint8_t n, uint8_t track_idx, GridDeviceTrack *gdt) { MidiDevice *devs[2] = { midi_active_peering.get_device(UART1_PORT), midi_active_peering.get_device(UART2_PORT), diff --git a/avr/cores/megacommand/MCL/GridTask.h b/avr/cores/megacommand/MCL/GridTask.h index de6f5a157..8146923fd 100644 --- a/avr/cores/megacommand/MCL/GridTask.h +++ b/avr/cores/megacommand/MCL/GridTask.h @@ -100,7 +100,7 @@ class GridTask : public Task { void transition_handler(); bool link_load(uint8_t n, uint8_t track_idx, uint8_t *slots_changed, uint8_t *track_select_array, GridDeviceTrack *gdt); - bool transition_load(uint8_t n, uint8_t track_idx, uint8_t dev_idx, GridDeviceTrack *gdt); + bool transition_load(uint8_t n, uint8_t track_idx, GridDeviceTrack *gdt); bool transition_send(uint8_t n, uint8_t track_idx, uint8_t dev_idx, GridDeviceTrack *gdt); /* @} */ diff --git a/avr/cores/megacommand/MCL/MCLActions.cpp b/avr/cores/megacommand/MCL/MCLActions.cpp index 93fb37f60..c07f71a46 100644 --- a/avr/cores/megacommand/MCL/MCLActions.cpp +++ b/avr/cores/megacommand/MCL/MCLActions.cpp @@ -66,32 +66,15 @@ void MCLActions::kit_reload(uint8_t pattern) { */ } -uint8_t MCLActions::get_grid_idx(uint8_t slot_number) { - return slot_number / GRID_WIDTH; -} -GridDeviceTrack *MCLActions::get_grid_dev_track(uint8_t slot_number, - uint8_t *track_idx, - uint8_t *dev_idx) { - uint8_t grid_idx = get_grid_idx(slot_number); - MidiDevice *devs[2] = { - midi_active_peering.get_device(UART1_PORT), - midi_active_peering.get_device(UART2_PORT), - }; +GridDeviceTrack *MCLActions::get_grid_dev_track(uint8_t slot_number) { + + uint8_t grid_idx = 0; + if (slot_number > GRID_WIDTH) { slot_number -= GRID_WIDTH; grid_idx = 1; } // Find first device that is hosting this slot_number. - for (uint8_t n = 0; n < 2; n++) { - auto *p = &(devs[n]->grid_devices[grid_idx]); - for (uint8_t i = 0; i < GRID_WIDTH; i++) { - if (slot_number == p->tracks[i].get_slot_number()) { - *track_idx = i; - *dev_idx = n; - return &(p->tracks[i]); - } - } - } - *track_idx = 255; - *dev_idx = 255; - return nullptr; + + return &proj.grids[grid_idx].tracks[slot_number]; + } void md_import() { @@ -101,7 +84,6 @@ void md_import() { } uint8_t track_select_array[NUM_SLOTS] = {0}; - uint8_t track_idx, dev_idx; MidiDevice *devs[2] = { midi_active_peering.get_device(UART1_PORT), @@ -115,12 +97,12 @@ void md_import() { for (uint8_t n = 0; n < NUM_SLOTS; n++) { GridDeviceTrack *gdt = - mcl_actions.get_grid_dev_track(n, &track_idx, &dev_idx); + mcl_actions.get_grid_dev_track(n); - if (gdt == nullptr || track_idx == 255) + if (!gdt->isActive()) continue; - if (devs[dev_idx] == &MD) { + if (devs[gdt->device_idx] == &MD) { track_select_array[n] = 1; } } @@ -162,13 +144,12 @@ void MCLActions::save_tracks(int row, uint8_t *slot_select_array, uint8_t merge, uint8_t i = 0; - uint8_t track_idx, dev_idx; for (i = 0; i < NUM_SLOTS; i++) { if (slot_select_array[i] > 0) { - GridDeviceTrack *gdt = get_grid_dev_track(i, &track_idx, &dev_idx); - if (gdt != nullptr) { - save_dev_tracks[dev_idx] = true; + GridDeviceTrack *gdt = get_grid_dev_track(i); + if (gdt->isActive()) { + save_dev_tracks[gdt->device_idx] = true; } } } @@ -234,14 +215,15 @@ void MCLActions::save_tracks(int row, uint8_t *slot_select_array, uint8_t merge, for (i = 0; i < NUM_SLOTS; i++) { if (slot_select_array[i] > 0) { - GridDeviceTrack *gdt = get_grid_dev_track(i, &track_idx, &dev_idx); + GridDeviceTrack *gdt = get_grid_dev_track(i); uint8_t grid_idx = get_grid_idx(i); - - bool online = (devs[dev_idx] != nullptr); + uint8_t track_idx = get_track_idx(i); + uint8_t device_idx = gdt->device_idx; + bool online = (devs[device_idx] != nullptr); // If save_dev_tracks[dev_idx] turns false, it means getBlockingKit // has failed, so we just skip this device. - if (!save_dev_tracks[dev_idx]) { + if (!save_dev_tracks[device_idx]) { continue; } @@ -295,14 +277,13 @@ void MCLActions::load_tracks(int row, uint8_t *slot_select_array, } uint8_t row_array[NUM_SLOTS] = {}; uint8_t cache_track_array[NUM_SLOTS] = {}; - uint8_t track_idx, dev_idx; bool recache = false; DEBUG_PRINTLN("load tracks"); DEBUG_PRINTLN(load_mode); for (uint8_t n = 0; n < NUM_SLOTS; ++n) { - GridDeviceTrack *gdt = get_grid_dev_track(n, &track_idx, &dev_idx); + GridDeviceTrack *gdt = get_grid_dev_track(n); // DEBUG_PRINTLN(slot_select_array[n]); - if ((slot_select_array[n] == 0) || (gdt == nullptr)) { + if ((slot_select_array[n] == 0) || !gdt->isActive()) { continue; } if (_row_array == nullptr) { @@ -352,21 +333,22 @@ void MCLActions::collect_tracks(uint8_t *slot_select_array, uint8_t old_grid = proj.get_grid(); memset(dev_sync_slot, 255, NUM_DEVS); - uint8_t track_idx, dev_idx; for (uint8_t n = 0; n < NUM_SLOTS; ++n) { - GridDeviceTrack *gdt = get_grid_dev_track(n, &track_idx, &dev_idx); + GridDeviceTrack *gdt = get_grid_dev_track(n); uint8_t grid_idx = get_grid_idx(n); + uint8_t track_idx = get_track_idx(n); + proj.select_grid(grid_idx); - if ((slot_select_array[n] == 0) || (gdt == nullptr)) { + if ((slot_select_array[n] == 0) || !gdt->isActive()) { // Ignore slots that are not device supported. slot_select_array[n] = 0; continue; } uint8_t row = row_array[n]; EmptyTrack empty_track; - // DEBUG_PRINTLN(F("cl")); + auto *device_track = empty_track.load_from_grid(track_idx, row); if (device_track == nullptr || device_track->active != gdt->track_type && device_track->get_parent_model() != gdt->track_type) { @@ -381,7 +363,7 @@ void MCLActions::collect_tracks(uint8_t *slot_select_array, device_track->init_track_type(device_track->get_parent_model()); } send_machine[n] = device_track->transition_cache(track_idx, n); - dev_sync_slot[dev_idx] = n; + dev_sync_slot[gdt->device_idx] = n; } if (device_track) { device_track->store_in_mem(gdt->mem_slot_idx); @@ -404,8 +386,6 @@ void MCLActions::manual_transition(uint8_t *slot_select_array, bool increase_loops = 0; - uint8_t track_idx, dev_idx; - bool recalc_latency = true; uint8_t headroom = 3; //uint8_t headroom = ceil(MidiClock.get_tempo()* 0.133333333333f * 0.200f); @@ -419,8 +399,8 @@ void MCLActions::manual_transition(uint8_t *slot_select_array, if (slot_select_array[n] > 0) { row = row_array[n]; if (q == 255) { - GridDeviceTrack *gdt = get_grid_dev_track(n, &track_idx, &dev_idx); - if (gdt != nullptr) { + GridDeviceTrack *gdt = get_grid_dev_track(n); + if (!gdt->isActive()) { transition_level[n] = 0; if (increase_loops) { if (next_transitions[n] == next_transition) { @@ -561,20 +541,19 @@ void MCLActions::send_tracks_to_devices(uint8_t *slot_select_array, uint8_t row = 0; uint8_t old_grid = proj.get_grid(); - uint8_t track_idx, dev_idx; - // DEBUG_PRINTLN("send tracks 1"); // DEBUG_PRINTLN((int)SP); // DEBUG_CHECK_STACK(); uint8_t last_slot = 255; for (uint8_t i = 0; i < NUM_SLOTS; i++) { - - GridDeviceTrack *gdt = get_grid_dev_track(i, &track_idx, &dev_idx); + GridDeviceTrack *gdt = get_grid_dev_track(i); uint8_t grid_idx = get_grid_idx(i); + uint8_t track_idx = get_track_idx(i); + proj.select_grid(grid_idx); - if (gdt == nullptr) { + if (!gdt->isActive()) { goto cont; } @@ -644,8 +623,8 @@ void MCLActions::send_tracks_to_devices(uint8_t *slot_select_array, } GUI.addTask(&grid_task); for (uint8_t i = 0; i < NUM_SLOTS; ++i) { - GridDeviceTrack *gdt = get_grid_dev_track(i, &track_idx, &dev_idx); - if (gdt != nullptr) { + GridDeviceTrack *gdt = get_grid_dev_track(i); + if (gdt->isActive()) { gdt->seq_track->mute_state = mute_states[i]; } } @@ -666,8 +645,8 @@ void MCLActions::send_tracks_to_devices(uint8_t *slot_select_array, for (uint8_t n = 0; n < NUM_SLOTS; n++) { if ((select_array[n] > 0) && (grid_page.active_slots[n] != SLOT_DISABLED)) { - GridDeviceTrack *gdt = get_grid_dev_track(n, &track_idx, &dev_idx); - if (gdt != nullptr) { + GridDeviceTrack *gdt = get_grid_dev_track(n); + if (gdt->isActive()) { transition_level[n] = 0; next_transitions[n] = MidiClock.div16th_counter - (gdt->seq_track->step_count * @@ -691,25 +670,12 @@ void MCLActions::send_tracks_to_devices(uint8_t *slot_select_array, calc_latency(); } -void MCLActions::cache_track(uint8_t n, uint8_t track_idx, uint8_t dev_idx, - GridDeviceTrack *gdt) {} void MCLActions::cache_next_tracks(uint8_t *slot_select_array, bool gui_update) { - // //DEBUG_PRINT_FN(); - // //DEBUG_PRINTLN("cache next"); - // //DEBUG_PRINTLN((int)SP); - // DEBUG_CHECK_STACK(); - /* - while (SeqTrack::in_countdown && (MidiClock.state == 2)) { - gui_loop(); - } - */ uint8_t old_grid = proj.get_grid(); - uint8_t track_idx, dev_idx; - memset(dev_sync_slot, 255, sizeof(dev_sync_slot)); const uint8_t div32th_margin = 1; @@ -732,14 +698,16 @@ void MCLActions::cache_next_tracks(uint8_t *slot_select_array, if (slot_select_array[n] == 0) continue; - GridDeviceTrack *gdt = get_grid_dev_track(n, &track_idx, &dev_idx); + GridDeviceTrack *gdt = get_grid_dev_track(n); uint8_t grid_idx = get_grid_idx(n); + uint8_t track_idx = get_track_idx(n); - if (gdt == nullptr) + if (!gdt->isActive()) continue; uint32_t diff = MidiClock.clock_diff_div192( MidiClock.div192th_counter, (uint32_t)next_transition * 12 + 4 * 12); + while ((gdt->seq_track->count_down && (MidiClock.state == 2))) { proj.select_grid(old_grid); handleIncomingMidi(); @@ -791,7 +759,7 @@ void MCLActions::cache_next_tracks(uint8_t *slot_select_array, if (ptrack->memcmp_sound(gdt->mem_slot_idx) != 0) { ptrack->transition_cache(track_idx, n); send_machine[n] = 0; - dev_sync_slot[dev_idx] = n; + dev_sync_slot[gdt->device_idx] = n; } } } @@ -832,10 +800,9 @@ void MCLActions::calc_next_slot_transition(uint8_t n, return; } - uint8_t track_idx, dev_idx; - GridDeviceTrack *gdt = get_grid_dev_track(n, &track_idx, &dev_idx); - if (gdt == nullptr) { + GridDeviceTrack *gdt = get_grid_dev_track(n); + if (!gdt->isActive()) { return; } uint16_t next_transitions_old = next_transitions[n]; @@ -926,8 +893,6 @@ void MCLActions::calc_latency() { bool send_dev[NUM_DEVS] = {0}; - uint8_t track_idx, dev_idx; - uint8_t num_devices = 0; // DEBUG_PRINTLN("calc latency"); @@ -936,10 +901,12 @@ void MCLActions::calc_latency() { if ((grid_page.active_slots[n] == SLOT_DISABLED)) continue; if (next_transitions[n] == next_transition) { - GridDeviceTrack *gdt = get_grid_dev_track(n, &track_idx, &dev_idx); - if (gdt == nullptr) { + GridDeviceTrack *gdt = get_grid_dev_track(n); + uint8_t track_idx = get_track_idx(n); + if (!gdt->isActive()) { continue; } + uint8_t device_idx = gdt->device_idx; if (send_machine[n] == 0) { // Optimised, assume we dont need to read the entire object to calculate // latency. @@ -951,12 +918,12 @@ void MCLActions::calc_latency() { continue; } // dev_latency[dev_idx].load_latency += diff; - dev_latency[dev_idx].latency += ptrack->calc_latency(n); + dev_latency[device_idx].latency += ptrack->calc_latency(n); } - if (send_dev[dev_idx] != true) { + if (send_dev[device_idx] != true) { num_devices++; } - send_dev[dev_idx] = true; + send_dev[device_idx] = true; } } diff --git a/avr/cores/megacommand/MCL/MCLActions.h b/avr/cores/megacommand/MCL/MCLActions.h index d38f21e33..e2df415ed 100644 --- a/avr/cores/megacommand/MCL/MCLActions.h +++ b/avr/cores/megacommand/MCL/MCLActions.h @@ -69,27 +69,33 @@ class MCLActions : public LinkModeData { uint8_t get_quant() { uint8_t q; if ((mcl_cfg.chain_load_quant == 1)) { - q = QUANT_LEN; //use slot settings + q = QUANT_LEN; // use slot settings } else { - q = mcl_cfg.chain_load_quant; //override + q = mcl_cfg.chain_load_quant; // override } return q; } - //This is the track length quantisatioe + // This is the track length quantisatioe uint8_t get_chain_length() { uint8_t q; if (mcl_cfg.chain_queue_length == 1) { - q = QUANT_LEN; //use slot settings + q = QUANT_LEN; // use slot settings } else { - q = mcl_cfg.chain_queue_length; //override + q = mcl_cfg.chain_queue_length; // override } return q; } - uint8_t get_grid_idx(uint8_t slot_number); - GridDeviceTrack *get_grid_dev_track(uint8_t slot_number, uint8_t *id, - uint8_t *dev_idx); + uint8_t get_grid_idx(uint8_t slot_number) { + return slot_number < GRID_WIDTH ? 0 : 1; + } + + uint8_t get_track_idx(uint8_t slot_number) { + return slot_number < GRID_WIDTH ? slot_number : slot_number - GRID_WIDTH; + } + + GridDeviceTrack *get_grid_dev_track(uint8_t slot_number); void init_chains(); @@ -97,21 +103,27 @@ class MCLActions : public LinkModeData { void switch_global(uint8_t global_page); void kit_reload(uint8_t pattern); - void save_tracks(int row, uint8_t *slot_select_array, - uint8_t merge, uint8_t readpattern = 255); + void save_tracks(int row, uint8_t *slot_select_array, uint8_t merge, + uint8_t readpattern = 255); - void load_tracks(int row, uint8_t *slot_select_array, uint8_t *_row_array = nullptr, uint8_t load_mode = 255); - void send_tracks_to_devices(uint8_t *slot_select_array, uint8_t *row_array = nullptr); + void load_tracks(int row, uint8_t *slot_select_array, + uint8_t *_row_array = nullptr, uint8_t load_mode = 255); + void send_tracks_to_devices(uint8_t *slot_select_array, + uint8_t *row_array = nullptr); void manual_transition(uint8_t *slot_select_array, uint8_t *row_array); void cache_next_tracks(uint8_t *slot_select_array, bool gui_update = false); - void calc_next_slot_transition(uint8_t n, bool ignore_chain_settings = false, bool ignore_overflow = false); + void calc_next_slot_transition(uint8_t n, bool ignore_chain_settings = false, + bool ignore_overflow = false); void calc_next_transition(); void calc_latency(); + private: void collect_tracks(uint8_t *slot_select_array, uint8_t *row_array); - void cache_track(uint8_t n, uint8_t track_idx, uint8_t dev_idx, GridDeviceTrack *gdt); - bool load_track(uint8_t track_idx, uint8_t row, uint8_t pos, GridDeviceTrack *gdt, uint8_t *send_masks); + void cache_track(uint8_t n, uint8_t track_idx, uint8_t dev_idx, + GridDeviceTrack *gdt); + bool load_track(uint8_t track_idx, uint8_t row, uint8_t pos, + GridDeviceTrack *gdt, uint8_t *send_masks); }; extern void md_import(); diff --git a/avr/cores/megacommand/MCL/MCLClipBoard.cpp b/avr/cores/megacommand/MCL/MCLClipBoard.cpp index ad24795fe..a1978a40c 100644 --- a/avr/cores/megacommand/MCL/MCLClipBoard.cpp +++ b/avr/cores/megacommand/MCL/MCLClipBoard.cpp @@ -78,11 +78,12 @@ bool MCLClipBoard::copy_sequencer_track(uint8_t track) { DEBUG_PRINTLN(F("error could not open clipboard")); return false; } - uint8_t track_idx, dev_idx; - GridDeviceTrack *gdt = mcl_actions.get_grid_dev_track(track, &track_idx, &dev_idx); - if (gdt == nullptr) { return false; } + + GridDeviceTrack *gdt = mcl_actions.get_grid_dev_track(track); + if (!gdt->isActive()) { return false; } uint8_t grid_idx = mcl_actions.get_grid_idx(track); + uint8_t track_idx = mcl_actions.get_track_idx(track); auto device_track = ((DeviceTrack *)&empty_track)->init_track_type(gdt->track_type); @@ -127,13 +128,16 @@ bool MCLClipBoard::paste_sequencer_track(uint8_t source_track, uint8_t track) { MDTrack *md_track = (MDTrack *)(&temp_track); ExtTrack *ext_track = (ExtTrack *)(&temp_track); - uint8_t source_track_idx, track_idx, dev_idx; - GridDeviceTrack *gdt = mcl_actions.get_grid_dev_track(source_track, &source_track_idx, &dev_idx); - if (gdt == nullptr) { return false; } + GridDeviceTrack *gdt = mcl_actions.get_grid_dev_track(source_track); + uint8_t source_track_idx = mcl_actions.get_track_idx(source_track); + + if (!gdt->isActive()) { return false; } - gdt = mcl_actions.get_grid_dev_track(track, &track_idx, &dev_idx); - if (gdt == nullptr) { return false; } + gdt = mcl_actions.get_grid_dev_track(track); + uint8_t track_idx = mcl_actions.get_track_idx(track); + + if (!gdt->isActive()) { return false; } uint8_t grid_idx = mcl_actions.get_grid_idx(track); @@ -234,7 +238,6 @@ bool MCLClipBoard::paste(uint8_t col, uint16_t row) { GridRowHeader header_copy; - uint8_t track_idx, dev_idx; uint8_t grid = col / 16; for (int y = 0; y < t_h && y + row < GRID_LENGTH; y++) { @@ -274,10 +277,11 @@ bool MCLClipBoard::paste(uint8_t col, uint16_t row) { DEBUG_PRINTLN(slot_n); - GridDeviceTrack *gdt = - mcl_actions.get_grid_dev_track(slot_n, &track_idx, &dev_idx); - if ((gdt == nullptr || (gdt->track_type != ptrack->active && ptrack->get_parent_model() != gdt->track_type)) && + GridDeviceTrack *gdt = mcl_actions.get_grid_dev_track(slot_n); + uint8_t track_idx = mcl_actions.get_track_idx(slot_n); + + if ((!gdt->isActive() || (gdt->track_type != ptrack->active && ptrack->get_parent_model() != gdt->track_type)) && (ptrack->active != EMPTY_TRACK_TYPE)) { DEBUG_PRINTLN("track not supported"); // Don't allow paste in to unsupported slots diff --git a/avr/cores/megacommand/MCL/MidiActivePeering.cpp b/avr/cores/megacommand/MCL/MidiActivePeering.cpp index 2c646b999..a1aa005a7 100644 --- a/avr/cores/megacommand/MCL/MidiActivePeering.cpp +++ b/avr/cores/megacommand/MCL/MidiActivePeering.cpp @@ -1,10 +1,13 @@ #include "MCL_impl.h" #include "ResourceManager.h" -void GenericMidiDevice::init_grid_devices() { +void GenericMidiDevice::init_grid_devices(uint8_t device_idx) { uint8_t grid_idx = 1; + GridDeviceTrack gdt; + for (uint8_t i = 0; i < NUM_EXT_TRACKS; i++) { - add_track_to_grid(grid_idx, i, &(mcl_seq.ext_tracks[i]), EXT_TRACK_TYPE); + gdt.init(EXT_TRACK_TYPE, GROUP_DEV, device_idx, &(mcl_seq.ext_tracks[i])); + add_track_to_grid(grid_idx, i, &gdt); } } @@ -78,7 +81,7 @@ void MidiActivePeering::disconnect(uint8_t port) { if (midi_active_peering.get_device(port)->asElektronDevice()) { turbo_light.set_speed(0, pmidi); } - drivers[i]->disconnect(); + drivers[i]->disconnect(port - 1); } } } @@ -95,7 +98,7 @@ void MidiActivePeering::force_connect(uint8_t port, MidiDevice *driver) { pmidi->device.set_name(driver->name); pmidi->device.set_id(driver->id); } - driver->init_grid_devices(); + driver->init_grid_devices(port - 1); *connected_dev = driver; } @@ -121,7 +124,7 @@ static void probePort(uint8_t port, MidiDevice *drivers[], size_t nr_drivers, DEBUG_PRINTLN("disconnecting"); for (size_t i = 0; i < nr_drivers; ++i) { if (drivers[i]->connected) - drivers[i]->disconnect(); + drivers[i]->disconnect(port - 1); } // reset MidiID to none pmidi->device.init(); @@ -152,7 +155,7 @@ static void probePort(uint8_t port, MidiDevice *drivers[], size_t nr_drivers, if (probe_success) { pmidi->device.set_id(drivers[i]->id); pmidi->device.set_name(drivers[i]->name); - drivers[i]->init_grid_devices(); + drivers[i]->init_grid_devices(port - 1); *active_device = drivers[i]; //Re-enable MidiClock/Transport recv midi_setup.cfg_clock_recv(); diff --git a/avr/cores/megacommand/MCL/MidiActivePeering.h b/avr/cores/megacommand/MCL/MidiActivePeering.h index 474d17ee2..e512693ba 100644 --- a/avr/cores/megacommand/MCL/MidiActivePeering.h +++ b/avr/cores/megacommand/MCL/MidiActivePeering.h @@ -33,7 +33,7 @@ class GenericMidiDevice : public MidiDevice { public: GenericMidiDevice(); virtual bool probe() { return true; } - void init_grid_devices(); + void init_grid_devices(uint8_t device_idx); }; class NullMidiDevice : public MidiDevice { diff --git a/avr/cores/megacommand/MCL/Project.h b/avr/cores/megacommand/MCL/Project.h index 9e46e5684..18a795710 100644 --- a/avr/cores/megacommand/MCL/Project.h +++ b/avr/cores/megacommand/MCL/Project.h @@ -24,7 +24,7 @@ class Project : public ProjectHeader { File file; uint8_t grid_select; - Grid grids[NUM_GRIDS]; + DeviceGrid grids[NUM_GRIDS]; void chdir_projects(); bool project_loaded = false; diff --git a/avr/cores/megacommand/MCL/SeqTrack.cpp b/avr/cores/megacommand/MCL/SeqTrack.cpp index c0efab1d8..edb78b783 100644 --- a/avr/cores/megacommand/MCL/SeqTrack.cpp +++ b/avr/cores/megacommand/MCL/SeqTrack.cpp @@ -129,6 +129,8 @@ void SeqSlideTrack::send_slides(volatile uint8_t *locks_params, uint8_t channel) } uint8_t SeqTrackBase::get_quantized_step(uint8_t &utiming, uint8_t quant) { + if (quant == 255) { quant = mcl_cfg.rec_quant; } + uint8_t timing_mid = get_timing_mid(); int8_t mod12 = mod12_counter - 1; diff --git a/avr/cores/megacommand/MCL/SeqTrack.h b/avr/cores/megacommand/MCL/SeqTrack.h index a8c445689..c5da83319 100644 --- a/avr/cores/megacommand/MCL/SeqTrack.h +++ b/avr/cores/megacommand/MCL/SeqTrack.h @@ -4,7 +4,7 @@ #define SEQTRACK_H__ #include "MCLMemory.h" -#include "MidiActivePeering.h" +//#include "MidiActivePeering.h" #include "MidiUartParent.h" #include "WProgram.h" @@ -33,6 +33,8 @@ #define TRIG_TRUE 1 #define TRIG_ONESHOT 3 +#define UART1_PORT 1 + class SeqTrack_270 {}; class SlideData { @@ -185,7 +187,7 @@ class SeqTrackBase { uint8_t u = 0; get_quantized_step(u); } - uint8_t get_quantized_step(uint8_t &utiming, uint8_t quant = mcl_cfg.rec_quant); + uint8_t get_quantized_step(uint8_t &utiming, uint8_t quant = 255); }; class SeqTrack : public SeqTrackBase { diff --git a/avr/cores/megacommand/MD/MD.cpp b/avr/cores/megacommand/MD/MD.cpp index 1e7430a4e..5954a363c 100644 --- a/avr/cores/megacommand/MD/MD.cpp +++ b/avr/cores/megacommand/MD/MD.cpp @@ -143,21 +143,28 @@ void MDClass::setExternalSync() { sendRequest(data, sizeof(data)); } -void MDClass::init_grid_devices() { +void MDClass::init_grid_devices(uint8_t device_idx) { uint8_t grid_idx = 0; + GridDeviceTrack gdt; for (uint8_t i = 0; i < NUM_MD_TRACKS; i++) { - add_track_to_grid(grid_idx, i, &(mcl_seq.md_tracks[i]), MD_TRACK_TYPE); + gdt.init(MD_TRACK_TYPE, GROUP_DEV, device_idx, &(mcl_seq.md_tracks[i])); + add_track_to_grid(grid_idx, i, &gdt); } grid_idx = 1; - add_track_to_grid(grid_idx, MDFX_TRACK_NUM, &(mcl_seq.aux_tracks[0]), - MDFX_TRACK_TYPE, GROUP_AUX, 0); - add_track_to_grid(grid_idx, MDROUTE_TRACK_NUM, &(mcl_seq.aux_tracks[1]), - MDROUTE_TRACK_TYPE, GROUP_AUX, 0); - add_track_to_grid(grid_idx, MDLFO_TRACK_NUM, &(mcl_seq.aux_tracks[2]), - MDLFO_TRACK_TYPE, GROUP_AUX, 0); - add_track_to_grid(grid_idx, MDTEMPO_TRACK_NUM, &(mcl_seq.aux_tracks[3]), - MDTEMPO_TRACK_TYPE, GROUP_TEMPO, 0); + + gdt.init(MDFX_TRACK_TYPE, GROUP_AUX, device_idx, &(mcl_seq.aux_tracks[0])); + add_track_to_grid(grid_idx, MDFX_TRACK_NUM, &gdt); + + gdt.init(MDROUTE_TRACK_NUM, GROUP_AUX, device_idx, &(mcl_seq.aux_tracks[1])); + add_track_to_grid(grid_idx, MDFX_TRACK_NUM + 1, &gdt); + + gdt.init(MDLFO_TRACK_NUM, GROUP_AUX, device_idx, &(mcl_seq.aux_tracks[2])); + add_track_to_grid(grid_idx, MDFX_TRACK_NUM + 2, &gdt); + + gdt.init(MDTEMPO_TRACK_NUM, GROUP_AUX, device_idx, &(mcl_seq.aux_tracks[3])); + add_track_to_grid(grid_idx, MDFX_TRACK_NUM + 3, &gdt); + } void MDClass::get_mutes() { diff --git a/avr/cores/megacommand/MD/MD.h b/avr/cores/megacommand/MD/MD.h index 09bde6e58..882ad2d22 100644 --- a/avr/cores/megacommand/MD/MD.h +++ b/avr/cores/megacommand/MD/MD.h @@ -61,7 +61,7 @@ class MDClass : public ElektronDevice { virtual bool probe(); virtual void setup(); - virtual void init_grid_devices(); + virtual void init_grid_devices(uint8_t device_idx); virtual uint8_t* icon(); // TODO not necessary if we have FW_CAP_READ_LIVE_KIT diff --git a/avr/cores/megacommand/MNM/MNM.cpp b/avr/cores/megacommand/MNM/MNM.cpp index cfc954825..9b244938f 100644 --- a/avr/cores/megacommand/MNM/MNM.cpp +++ b/avr/cores/megacommand/MNM/MNM.cpp @@ -34,10 +34,13 @@ MNMClass::MNMClass() uart = &MidiUart2; } -void MNMClass::init_grid_devices() { +void MNMClass::init_grid_devices(uint8_t device_idx) { uint8_t grid_idx = 1; + GridDeviceTrack gdt; + for (uint8_t i = 0; i < NUM_EXT_TRACKS; i++) { - add_track_to_grid(grid_idx, i, &(mcl_seq.ext_tracks[i]), MNM_TRACK_TYPE); + gdt.init(MNM_TRACK_TYPE, GROUP_DEV, device_idx, &(mcl_seq.ext_tracks[i])); + add_track_to_grid(grid_idx, i, &gdt); } } diff --git a/avr/cores/megacommand/MNM/MNM.h b/avr/cores/megacommand/MNM/MNM.h index aea43b57c..ed4fbc2a6 100644 --- a/avr/cores/megacommand/MNM/MNM.h +++ b/avr/cores/megacommand/MNM/MNM.h @@ -18,7 +18,7 @@ class MNMClass : public ElektronDevice { // MNMPattern pattern; virtual bool probe(); - virtual void init_grid_devices(); + virtual void init_grid_devices(uint8_t device_idx); virtual uint8_t* icon(); virtual bool canReadWorkspaceKit() { return true; } From 2e0b17c5635a700d17b7980406ad3d5c40520161 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 24 Jun 2023 21:12:35 +1000 Subject: [PATCH 091/413] Fix progmem consumption --- avr/cores/megacommand/MCL/GridIOPage.cpp | 2 +- avr/cores/megacommand/MCL/GridTask.cpp | 6 ++--- avr/cores/megacommand/MCL/MCLActions.cpp | 27 +++++++++++----------- avr/cores/megacommand/MCL/MCLClipBoard.cpp | 8 +++---- 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/avr/cores/megacommand/MCL/GridIOPage.cpp b/avr/cores/megacommand/MCL/GridIOPage.cpp index dce6fca97..5fbd30853 100644 --- a/avr/cores/megacommand/MCL/GridIOPage.cpp +++ b/avr/cores/megacommand/MCL/GridIOPage.cpp @@ -23,7 +23,7 @@ void GridIOPage::track_select_array_from_type_select( mcl_actions.get_grid_dev_track(n); uint8_t device_idx = gdt->device_idx; - if (!gdt->isActive()) + if (gdt == nullptr) continue; if ((gdt->group_type == GROUP_DEV) && diff --git a/avr/cores/megacommand/MCL/GridTask.cpp b/avr/cores/megacommand/MCL/GridTask.cpp index 46d65747b..ee958faf9 100644 --- a/avr/cores/megacommand/MCL/GridTask.cpp +++ b/avr/cores/megacommand/MCL/GridTask.cpp @@ -124,7 +124,7 @@ void GridTask::transition_handler() { uint8_t track_idx = mcl_actions.get_track_idx(n); uint8_t device_idx = gdt->device_idx; - if (!gdt->isActive()) { + if (gdt == nullptr) { continue; } @@ -158,7 +158,7 @@ void GridTask::transition_handler() { uint8_t track_idx = mcl_actions.get_track_idx(n); uint8_t device_idx = gdt->device_idx; - if (!gdt->isActive() || (device_idx != c)) + if (gdt == nullptr || (device_idx != c)) continue; // Wait on first track of each device; @@ -210,7 +210,7 @@ void GridTask::transition_handler() { for (uint8_t n = 0; n < NUM_SLOTS; n++) { GridDeviceTrack *gdt = mcl_actions.get_grid_dev_track(n); - if (!gdt->isActive()) { + if (gdt == nullptr) { continue; } diff --git a/avr/cores/megacommand/MCL/MCLActions.cpp b/avr/cores/megacommand/MCL/MCLActions.cpp index c07f71a46..8d0b876c2 100644 --- a/avr/cores/megacommand/MCL/MCLActions.cpp +++ b/avr/cores/megacommand/MCL/MCLActions.cpp @@ -73,8 +73,9 @@ GridDeviceTrack *MCLActions::get_grid_dev_track(uint8_t slot_number) { if (slot_number > GRID_WIDTH) { slot_number -= GRID_WIDTH; grid_idx = 1; } // Find first device that is hosting this slot_number. - return &proj.grids[grid_idx].tracks[slot_number]; - + GridDeviceTrack *gdt = &proj.grids[grid_idx].tracks[slot_number]; + if (!gdt->isActive()) { return nullptr; } + return gdt; } void md_import() { @@ -99,7 +100,7 @@ void md_import() { GridDeviceTrack *gdt = mcl_actions.get_grid_dev_track(n); - if (!gdt->isActive()) + if (gdt == nullptr) continue; if (devs[gdt->device_idx] == &MD) { @@ -148,7 +149,7 @@ void MCLActions::save_tracks(int row, uint8_t *slot_select_array, uint8_t merge, for (i = 0; i < NUM_SLOTS; i++) { if (slot_select_array[i] > 0) { GridDeviceTrack *gdt = get_grid_dev_track(i); - if (gdt->isActive()) { + if (gdt != nullptr) { save_dev_tracks[gdt->device_idx] = true; } } @@ -283,7 +284,7 @@ void MCLActions::load_tracks(int row, uint8_t *slot_select_array, for (uint8_t n = 0; n < NUM_SLOTS; ++n) { GridDeviceTrack *gdt = get_grid_dev_track(n); // DEBUG_PRINTLN(slot_select_array[n]); - if ((slot_select_array[n] == 0) || !gdt->isActive()) { + if ((slot_select_array[n] == 0) || gdt == nullptr) { continue; } if (_row_array == nullptr) { @@ -341,7 +342,7 @@ void MCLActions::collect_tracks(uint8_t *slot_select_array, proj.select_grid(grid_idx); - if ((slot_select_array[n] == 0) || !gdt->isActive()) { + if ((slot_select_array[n] == 0) || gdt == nullptr) { // Ignore slots that are not device supported. slot_select_array[n] = 0; continue; @@ -400,7 +401,7 @@ void MCLActions::manual_transition(uint8_t *slot_select_array, row = row_array[n]; if (q == 255) { GridDeviceTrack *gdt = get_grid_dev_track(n); - if (!gdt->isActive()) { + if (gdt == nullptr) { transition_level[n] = 0; if (increase_loops) { if (next_transitions[n] == next_transition) { @@ -553,7 +554,7 @@ void MCLActions::send_tracks_to_devices(uint8_t *slot_select_array, proj.select_grid(grid_idx); - if (!gdt->isActive()) { + if (gdt == nullptr) { goto cont; } @@ -624,7 +625,7 @@ void MCLActions::send_tracks_to_devices(uint8_t *slot_select_array, GUI.addTask(&grid_task); for (uint8_t i = 0; i < NUM_SLOTS; ++i) { GridDeviceTrack *gdt = get_grid_dev_track(i); - if (gdt->isActive()) { + if (gdt != nullptr) { gdt->seq_track->mute_state = mute_states[i]; } } @@ -646,7 +647,7 @@ void MCLActions::send_tracks_to_devices(uint8_t *slot_select_array, for (uint8_t n = 0; n < NUM_SLOTS; n++) { if ((select_array[n] > 0) && (grid_page.active_slots[n] != SLOT_DISABLED)) { GridDeviceTrack *gdt = get_grid_dev_track(n); - if (gdt->isActive()) { + if (gdt != nullptr) { transition_level[n] = 0; next_transitions[n] = MidiClock.div16th_counter - (gdt->seq_track->step_count * @@ -702,7 +703,7 @@ void MCLActions::cache_next_tracks(uint8_t *slot_select_array, uint8_t grid_idx = get_grid_idx(n); uint8_t track_idx = get_track_idx(n); - if (!gdt->isActive()) + if (gdt == nullptr) continue; uint32_t diff = MidiClock.clock_diff_div192( @@ -802,7 +803,7 @@ void MCLActions::calc_next_slot_transition(uint8_t n, GridDeviceTrack *gdt = get_grid_dev_track(n); - if (!gdt->isActive()) { + if (gdt == nullptr) { return; } uint16_t next_transitions_old = next_transitions[n]; @@ -903,7 +904,7 @@ void MCLActions::calc_latency() { if (next_transitions[n] == next_transition) { GridDeviceTrack *gdt = get_grid_dev_track(n); uint8_t track_idx = get_track_idx(n); - if (!gdt->isActive()) { + if (gdt == nullptr) { continue; } uint8_t device_idx = gdt->device_idx; diff --git a/avr/cores/megacommand/MCL/MCLClipBoard.cpp b/avr/cores/megacommand/MCL/MCLClipBoard.cpp index a1978a40c..4cb105bfc 100644 --- a/avr/cores/megacommand/MCL/MCLClipBoard.cpp +++ b/avr/cores/megacommand/MCL/MCLClipBoard.cpp @@ -80,7 +80,7 @@ bool MCLClipBoard::copy_sequencer_track(uint8_t track) { } GridDeviceTrack *gdt = mcl_actions.get_grid_dev_track(track); - if (!gdt->isActive()) { return false; } + if (gdt == nullptr) { return false; } uint8_t grid_idx = mcl_actions.get_grid_idx(track); uint8_t track_idx = mcl_actions.get_track_idx(track); @@ -132,12 +132,12 @@ bool MCLClipBoard::paste_sequencer_track(uint8_t source_track, uint8_t track) { GridDeviceTrack *gdt = mcl_actions.get_grid_dev_track(source_track); uint8_t source_track_idx = mcl_actions.get_track_idx(source_track); - if (!gdt->isActive()) { return false; } + if (gdt == nullptr) { return false; } gdt = mcl_actions.get_grid_dev_track(track); uint8_t track_idx = mcl_actions.get_track_idx(track); - if (!gdt->isActive()) { return false; } + if (gdt == nullptr) { return false; } uint8_t grid_idx = mcl_actions.get_grid_idx(track); @@ -281,7 +281,7 @@ bool MCLClipBoard::paste(uint8_t col, uint16_t row) { GridDeviceTrack *gdt = mcl_actions.get_grid_dev_track(slot_n); uint8_t track_idx = mcl_actions.get_track_idx(slot_n); - if ((!gdt->isActive() || (gdt->track_type != ptrack->active && ptrack->get_parent_model() != gdt->track_type)) && + if ((gdt == nullptr || (gdt->track_type != ptrack->active && ptrack->get_parent_model() != gdt->track_type)) && (ptrack->active != EMPTY_TRACK_TYPE)) { DEBUG_PRINTLN("track not supported"); // Don't allow paste in to unsupported slots From 79dfefed46b16f61365212df5f7db4a5ce5bcb41 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 25 Jun 2023 12:19:47 +1000 Subject: [PATCH 092/413] Fix circular dependencies, and move MidiDeviceGrid in to own header --- avr/cores/megacommand/A4/A4.cpp | 2 +- avr/cores/megacommand/A4/A4.h | 1 + avr/cores/megacommand/Elektron/Elektron.h | 32 +---------------------- avr/cores/megacommand/MCL/A4Track.cpp | 1 - avr/cores/megacommand/MCL/Grid.h | 22 ---------------- avr/cores/megacommand/MCL/Project.h | 3 ++- 6 files changed, 5 insertions(+), 56 deletions(-) diff --git a/avr/cores/megacommand/A4/A4.cpp b/avr/cores/megacommand/A4/A4.cpp index b0d35789c..d6959800e 100644 --- a/avr/cores/megacommand/A4/A4.cpp +++ b/avr/cores/megacommand/A4/A4.cpp @@ -1,4 +1,4 @@ -#include "MCL_impl.h" +#include "A4.h" #include "ResourceManager.h" uint8_t a4_sysex_hdr[5] = {0x00, 0x20, 0x3c, 0x06, 0x00}; diff --git a/avr/cores/megacommand/A4/A4.h b/avr/cores/megacommand/A4/A4.h index 727cacb8e..76e6dd838 100644 --- a/avr/cores/megacommand/A4/A4.h +++ b/avr/cores/megacommand/A4/A4.h @@ -8,6 +8,7 @@ #include "A4Messages.h" #include "A4Params.h" #include "A4Sysex.h" +#include "A4Track.h" /** * \addtogroup a4_a4 diff --git a/avr/cores/megacommand/Elektron/Elektron.h b/avr/cores/megacommand/Elektron/Elektron.h index e4930f940..d27d63a96 100644 --- a/avr/cores/megacommand/Elektron/Elektron.h +++ b/avr/cores/megacommand/Elektron/Elektron.h @@ -8,6 +8,7 @@ #include "MidiID.h" #include "MidiSysex.h" #include "MCLMemory.h" +#include "MidiDeviceGrid.h" /** Store the name of a monomachine machine. **/ typedef struct mnm_machine_name_s { @@ -132,40 +133,9 @@ typedef void (SysexCallback::*sysex_status_callback_ptr_t)(uint8_t type, /// forward declaration class ElektronDevice; -class SeqTrack; /// Base class for MIDI-compatible devices /// Defines basic device description data and driver interfaces. -#define GROUP_DEV 0 -#define GROUP_AUX 1 -#define GROUP_TEMPO 2 -#define EMPTY_TRACK_TYPE 0 - -class GridDeviceTrack { -public: - uint8_t device_idx; - uint8_t track_type; - uint8_t group_type; - uint8_t mem_slot_idx; - SeqTrack *seq_track; - - GridDeviceTrack() { - init(); - } - - void init(uint8_t _track_type = EMPTY_TRACK_TYPE, uint8_t _group_type = GROUP_DEV, uint8_t _device_idx = 255, SeqTrack *_seq_track = nullptr, uint8_t _mem_slot_idx = 255) { - track_type = _track_type; - group_type = _group_type; - mem_slot_idx = _mem_slot_idx; - seq_track = _seq_track; - device_idx = _device_idx; - } - - SeqTrack *get_seq_track() { return seq_track; } - bool isActive() { return track_type != EMPTY_TRACK_TYPE; } -}; - - class MidiDevice { public: bool connected; diff --git a/avr/cores/megacommand/MCL/A4Track.cpp b/avr/cores/megacommand/MCL/A4Track.cpp index eaf26ec23..4a3d55b81 100644 --- a/avr/cores/megacommand/MCL/A4Track.cpp +++ b/avr/cores/megacommand/MCL/A4Track.cpp @@ -1,5 +1,4 @@ #include "MCL_impl.h" -//#include "MCLSd.h" #define A4_SOUND_LENGTH 0x19F diff --git a/avr/cores/megacommand/MCL/Grid.h b/avr/cores/megacommand/MCL/Grid.h index 4e0abb568..1d314ae69 100644 --- a/avr/cores/megacommand/MCL/Grid.h +++ b/avr/cores/megacommand/MCL/Grid.h @@ -3,7 +3,6 @@ #ifndef GRID_H__ #define GRID_H__ -#include "A4Track.h" #include "GridRowHeader.h" #include "MCLSd.h" #include "SdFat.h" @@ -116,25 +115,4 @@ class Grid : public GridHeader { bool sync() { return file.sync(); } }; -class DeviceGrid : public Grid { - - public: - GridDeviceTrack tracks[GRID_WIDTH]; - void add_track(uint8_t track_idx, GridDeviceTrack *gdt) { - if (gdt->mem_slot_idx == 255) { gdt->mem_slot_idx = track_idx; } - memcpy(tracks + track_idx, gdt, sizeof(GridDeviceTrack)); - } - void cleanup(uint8_t device_idx) { - for (uint8_t n = 0; n < GRID_WIDTH; n++) { - if (tracks[n].device_idx == device_idx) { tracks[n].init(); } - } - } - - void init() { - for (uint8_t n = 0; n < GRID_WIDTH; n++) { - tracks[n].init(); - } - } -}; - #endif /* GRID_H__ */ diff --git a/avr/cores/megacommand/MCL/Project.h b/avr/cores/megacommand/MCL/Project.h index 18a795710..efe1a2833 100644 --- a/avr/cores/megacommand/MCL/Project.h +++ b/avr/cores/megacommand/MCL/Project.h @@ -4,6 +4,7 @@ #define PROJECT_H__ #include "Grid.h" +#include "MidiDeviceGrid.h" #include "MCLMemory.h" #include "MCLSysConfig.h" #include "ProjectPages.h" @@ -24,7 +25,7 @@ class Project : public ProjectHeader { File file; uint8_t grid_select; - DeviceGrid grids[NUM_GRIDS]; + MidiDeviceGrid grids[NUM_GRIDS]; void chdir_projects(); bool project_loaded = false; From f11a4ad2ae5e07020875d300ab4eaa7130700f2f Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 25 Jun 2023 12:34:00 +1000 Subject: [PATCH 093/413] regression --- avr/cores/megacommand/MCL/MCLActions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/MCLActions.cpp b/avr/cores/megacommand/MCL/MCLActions.cpp index 8d0b876c2..4fa46e34f 100644 --- a/avr/cores/megacommand/MCL/MCLActions.cpp +++ b/avr/cores/megacommand/MCL/MCLActions.cpp @@ -401,7 +401,7 @@ void MCLActions::manual_transition(uint8_t *slot_select_array, row = row_array[n]; if (q == 255) { GridDeviceTrack *gdt = get_grid_dev_track(n); - if (gdt == nullptr) { + if (gdt != nullptr) { transition_level[n] = 0; if (increase_loops) { if (next_transitions[n] == next_transition) { From 81f3b1713e21e68df5f748572748cf6d27d6db3e Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 25 Jun 2023 15:29:42 +1000 Subject: [PATCH 094/413] regression for MD, and bug in original implementation? --- avr/cores/megacommand/MD/MD.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/avr/cores/megacommand/MD/MD.cpp b/avr/cores/megacommand/MD/MD.cpp index 5954a363c..b02797fd3 100644 --- a/avr/cores/megacommand/MD/MD.cpp +++ b/avr/cores/megacommand/MD/MD.cpp @@ -153,16 +153,16 @@ void MDClass::init_grid_devices(uint8_t device_idx) { } grid_idx = 1; - gdt.init(MDFX_TRACK_TYPE, GROUP_AUX, device_idx, &(mcl_seq.aux_tracks[0])); + gdt.init(MDFX_TRACK_TYPE, GROUP_AUX, device_idx, &(mcl_seq.aux_tracks[0]), 0); add_track_to_grid(grid_idx, MDFX_TRACK_NUM, &gdt); - gdt.init(MDROUTE_TRACK_NUM, GROUP_AUX, device_idx, &(mcl_seq.aux_tracks[1])); + gdt.init(MDROUTE_TRACK_TYPE, GROUP_AUX, device_idx, &(mcl_seq.aux_tracks[1]), 1); add_track_to_grid(grid_idx, MDFX_TRACK_NUM + 1, &gdt); - gdt.init(MDLFO_TRACK_NUM, GROUP_AUX, device_idx, &(mcl_seq.aux_tracks[2])); + gdt.init(MDLFO_TRACK_TYPE, GROUP_AUX, device_idx, &(mcl_seq.aux_tracks[2]), 2); add_track_to_grid(grid_idx, MDFX_TRACK_NUM + 2, &gdt); - gdt.init(MDTEMPO_TRACK_NUM, GROUP_AUX, device_idx, &(mcl_seq.aux_tracks[3])); + gdt.init(MDTEMPO_TRACK_TYPE, GROUP_TEMPO, device_idx, &(mcl_seq.aux_tracks[3]), 3); add_track_to_grid(grid_idx, MDFX_TRACK_NUM + 3, &gdt); } From 8d590557760b750a157c7bb743ff9836582f3d4c Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 25 Jun 2023 16:03:29 +1000 Subject: [PATCH 095/413] Bug? --- avr/cores/megacommand/MCL/MCLActions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/MCLActions.cpp b/avr/cores/megacommand/MCL/MCLActions.cpp index 4fa46e34f..eb3ca78a0 100644 --- a/avr/cores/megacommand/MCL/MCLActions.cpp +++ b/avr/cores/megacommand/MCL/MCLActions.cpp @@ -517,7 +517,7 @@ bool MCLActions::load_track(uint8_t track_idx, uint8_t row, uint8_t pos, } DEBUG_PRINTLN("load immediate track"); ptrack->load_immediate(track_idx, gdt->seq_track); - ptrack->store_in_mem(track_idx); + ptrack->store_in_mem(gdt->mem_slot_idx); send_masks[pos] = 1; } return true; From 1db9647368cf8d68b2712ff8d8366e667152df4a Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 25 Jun 2023 20:41:30 +1000 Subject: [PATCH 096/413] bug --- avr/cores/megacommand/MCL/MCLActions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/MCLActions.cpp b/avr/cores/megacommand/MCL/MCLActions.cpp index eb3ca78a0..0c2199fec 100644 --- a/avr/cores/megacommand/MCL/MCLActions.cpp +++ b/avr/cores/megacommand/MCL/MCLActions.cpp @@ -70,7 +70,7 @@ void MCLActions::kit_reload(uint8_t pattern) { GridDeviceTrack *MCLActions::get_grid_dev_track(uint8_t slot_number) { uint8_t grid_idx = 0; - if (slot_number > GRID_WIDTH) { slot_number -= GRID_WIDTH; grid_idx = 1; } + if (slot_number >= GRID_WIDTH) { slot_number -= GRID_WIDTH; grid_idx = 1; } // Find first device that is hosting this slot_number. GridDeviceTrack *gdt = &proj.grids[grid_idx].tracks[slot_number]; From 650db06a6b61134c30670f1ca498dd4966b316f4 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 25 Jun 2023 20:57:59 +1000 Subject: [PATCH 097/413] Region sizes were optimized per track --- avr/cores/megacommand/MD/MD.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/avr/cores/megacommand/MD/MD.cpp b/avr/cores/megacommand/MD/MD.cpp index b02797fd3..578c4cbb7 100644 --- a/avr/cores/megacommand/MD/MD.cpp +++ b/avr/cores/megacommand/MD/MD.cpp @@ -156,13 +156,13 @@ void MDClass::init_grid_devices(uint8_t device_idx) { gdt.init(MDFX_TRACK_TYPE, GROUP_AUX, device_idx, &(mcl_seq.aux_tracks[0]), 0); add_track_to_grid(grid_idx, MDFX_TRACK_NUM, &gdt); - gdt.init(MDROUTE_TRACK_TYPE, GROUP_AUX, device_idx, &(mcl_seq.aux_tracks[1]), 1); + gdt.init(MDROUTE_TRACK_TYPE, GROUP_AUX, device_idx, &(mcl_seq.aux_tracks[1]), 0); add_track_to_grid(grid_idx, MDFX_TRACK_NUM + 1, &gdt); - gdt.init(MDLFO_TRACK_TYPE, GROUP_AUX, device_idx, &(mcl_seq.aux_tracks[2]), 2); + gdt.init(MDLFO_TRACK_TYPE, GROUP_AUX, device_idx, &(mcl_seq.aux_tracks[2]), 0); add_track_to_grid(grid_idx, MDFX_TRACK_NUM + 2, &gdt); - gdt.init(MDTEMPO_TRACK_TYPE, GROUP_TEMPO, device_idx, &(mcl_seq.aux_tracks[3]), 3); + gdt.init(MDTEMPO_TRACK_TYPE, GROUP_TEMPO, device_idx, &(mcl_seq.aux_tracks[3]), 0); add_track_to_grid(grid_idx, MDFX_TRACK_NUM + 3, &gdt); } From 34351859a68e4e6c866350ef6f34b3185493a16b Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 25 Jun 2023 21:05:03 +1000 Subject: [PATCH 098/413] Memory is only 64KB, thus uint16_t is enough --- avr/cores/megacommand/MCL/DeviceTrack.cpp | 8 ++++---- avr/cores/megacommand/MCL/DeviceTrack.h | 4 ++-- avr/cores/megacommand/MCL/ExtTrack.h | 6 +++--- avr/cores/megacommand/MCL/GridChainTrack.h | 2 +- avr/cores/megacommand/MCL/GridTrack.h | 2 +- avr/cores/megacommand/MCL/MDFXTrack.h | 2 +- avr/cores/megacommand/MCL/MDLFOTrack.h | 2 +- avr/cores/megacommand/MCL/MDRouteTrack.h | 2 +- avr/cores/megacommand/MCL/MDTempoTrack.h | 2 +- avr/cores/megacommand/MCL/MDTrack.h | 4 ++-- 10 files changed, 17 insertions(+), 17 deletions(-) diff --git a/avr/cores/megacommand/MCL/DeviceTrack.cpp b/avr/cores/megacommand/MCL/DeviceTrack.cpp index 0b502c7d7..77c869b00 100644 --- a/avr/cores/megacommand/MCL/DeviceTrack.cpp +++ b/avr/cores/megacommand/MCL/DeviceTrack.cpp @@ -89,7 +89,7 @@ DeviceTrack *DeviceTrack::load_from_grid(uint8_t column, uint16_t row) { // virtual functions are ready if (active != EMPTY_TRACK_TYPE) { - uint32_t len = ptrack->get_track_size(); + uint16_t len = ptrack->get_track_size(); if (!proj.read_grid(ptrack, len, column, row)) { DEBUG_PRINTLN(F("read failed")); @@ -108,8 +108,8 @@ DeviceTrack *DeviceTrack::load_from_grid(uint8_t column, uint16_t row) { bool DeviceTrackChunk::load_from_mem_chunk(uint8_t column, uint8_t chunk) { size_t chunk_size = sizeof(seq_data_chunk); - uint32_t offset = (uint32_t)seq_data_chunk - (uint32_t)this; - uint32_t pos = get_region() + get_track_size() * (uint32_t)(column) + offset + + uint16_t offset = (uint16_t)seq_data_chunk - (uint16_t)this; + uint16_t pos = get_region() + get_track_size() * (uint16_t)(column) + offset + chunk_size * chunk; volatile uint8_t *ptr = reinterpret_cast(pos); memcpy_bank1(seq_data_chunk, ptr, chunk_size); @@ -125,7 +125,7 @@ bool DeviceTrackChunk::load_chunk(volatile void *ptr, uint8_t chunk) { } bool DeviceTrackChunk::load_link_from_mem(uint8_t column) { - uint32_t pos = get_region() + get_track_size() * (uint32_t)(column) + (uint32_t) &this->link - (uint32_t) this; + uint16_t pos = get_region() + get_track_size() * (uint16_t)(column) + (uint16_t) &this->link - (uint16_t) this; volatile uint8_t *ptr = reinterpret_cast(pos); memcpy_bank1(&this->link, ptr, sizeof(GridTrack)); return true; diff --git a/avr/cores/megacommand/MCL/DeviceTrack.h b/avr/cores/megacommand/MCL/DeviceTrack.h index dbece9dea..da599856b 100644 --- a/avr/cores/megacommand/MCL/DeviceTrack.h +++ b/avr/cores/megacommand/MCL/DeviceTrack.h @@ -103,7 +103,7 @@ class DeviceTrack : public GridTrack { } int memcmp_sound(uint8_t column) { - uint32_t pos = get_region() + get_track_size() * (uint32_t)(column) + ((uint32_t) get_sound_data_ptr() - (uint32_t) this); + uint16_t pos = get_region() + get_track_size() * (uint16_t)(column) + ((uint16_t) get_sound_data_ptr() - (uint16_t) this); volatile uint8_t *ptr = reinterpret_cast(pos); return memcmp_bank1(get_sound_data_ptr(), ptr, get_track_size()); } @@ -142,7 +142,7 @@ class DeviceTrackChunk : public DeviceTrack { virtual uint16_t get_seq_data_size() = 0; virtual uint8_t get_model() = 0; virtual uint16_t get_track_size() = 0; - virtual uint32_t get_region() = 0; + virtual uint16_t get_region() = 0; virtual uint8_t get_device_type() = 0; virtual void *get_sound_data_ptr() = 0; diff --git a/avr/cores/megacommand/MCL/ExtTrack.h b/avr/cores/megacommand/MCL/ExtTrack.h index d631471ea..840883470 100644 --- a/avr/cores/megacommand/MCL/ExtTrack.h +++ b/avr/cores/megacommand/MCL/ExtTrack.h @@ -71,7 +71,7 @@ class ExtTrack : public DeviceTrack { virtual uint8_t get_model() { return EXT_TRACK_TYPE; } virtual uint16_t get_track_size() { return sizeof(ExtTrack); } - virtual uint32_t get_region() { return BANK1_A4_TRACKS_START; } + virtual uint16_t get_region() { return BANK1_A4_TRACKS_START; } virtual uint16_t get_region_size() { return GRID2_TRACK_LEN; } virtual uint8_t get_device_type() { return EXT_TRACK_TYPE; } virtual uint8_t get_parent_model() { return midi_active_peering.get_device(UART2_PORT)->track_type; } @@ -117,7 +117,7 @@ class ExtTrackChunk : public DeviceTrack { virtual uint16_t get_seq_data_size() { return sizeof(ExtSeqTrackData); } virtual uint8_t get_model() { return EXT_TRACK_TYPE; } virtual uint16_t get_track_size() { return GRID2_TRACK_LEN; } - virtual uint32_t get_region() { return BANK1_A4_TRACKS_START; } + virtual uint16_t get_region() { return BANK1_A4_TRACKS_START; } virtual uint8_t get_device_type() { return EXT_TRACK_TYPE; } virtual void *get_sound_data_ptr() { return nullptr; } @@ -130,7 +130,7 @@ class ExtTrackChunk : public DeviceTrackChunk { virtual uint16_t get_seq_data_size() { return sizeof(ExtSeqTrackData); } virtual uint8_t get_model() { return EXT_TRACK_TYPE; } virtual uint16_t get_track_size() { return GRID2_TRACK_LEN; } - virtual uint32_t get_region() { return BANK1_A4_TRACKS_START; } + virtual uint16_t get_region() { return BANK1_A4_TRACKS_START; } virtual uint8_t get_device_type() { return EXT_TRACK_TYPE; } virtual void *get_sound_data_ptr() { return nullptr; } diff --git a/avr/cores/megacommand/MCL/GridChainTrack.h b/avr/cores/megacommand/MCL/GridChainTrack.h index e97f8ebc8..b409aa3dd 100644 --- a/avr/cores/megacommand/MCL/GridChainTrack.h +++ b/avr/cores/megacommand/MCL/GridChainTrack.h @@ -24,7 +24,7 @@ class GridChainTrack : public AUXTrack { void place_chains(); virtual uint16_t get_track_size() { return sizeof(GridChainTrack); } - virtual uint32_t get_region() { return BANK1_GRIDCHAIN_TRACK_START; } + virtual uint16_t get_region() { return BANK1_GRIDCHAIN_TRACK_START; } virtual uint8_t get_model() { return GRIDCHAIN_TRACK_TYPE; } virtual uint8_t get_device_type() { return GRIDCHAIN_TRACK_TYPE; } diff --git a/avr/cores/megacommand/MCL/GridTrack.h b/avr/cores/megacommand/MCL/GridTrack.h index a05f7d402..d6bf24bab 100644 --- a/avr/cores/megacommand/MCL/GridTrack.h +++ b/avr/cores/megacommand/MCL/GridTrack.h @@ -96,7 +96,7 @@ class GridTrack { virtual uint16_t get_track_size() { return sizeof(GridTrack); } virtual uint16_t get_region_size() { return get_track_size(); } - virtual uint32_t get_region() { return BANK1_MD_TRACKS_START; } + virtual uint16_t get_region() { return BANK1_MD_TRACKS_START; } bool is_external() { return get_region() != BANK1_MD_TRACKS_START; } /* Calibrate data members on slot copy */ virtual void on_copy(int16_t s_col, int16_t d_col, bool destination_same) { } diff --git a/avr/cores/megacommand/MCL/MDFXTrack.h b/avr/cores/megacommand/MCL/MDFXTrack.h index 4b044c912..3d5677531 100644 --- a/avr/cores/megacommand/MCL/MDFXTrack.h +++ b/avr/cores/megacommand/MCL/MDFXTrack.h @@ -48,7 +48,7 @@ class MDFXTrack : public AUXTrack, public MDFXData { void load_immediate(uint8_t tracknumber, SeqTrack *seq_track); virtual uint16_t get_track_size() { return sizeof(MDFXTrack); } - virtual uint32_t get_region() { return BANK1_MDFX_TRACK_START; } + virtual uint16_t get_region() { return BANK1_MDFX_TRACK_START; } virtual uint8_t get_model() { return MDFX_TRACK_TYPE; } virtual uint8_t get_device_type() { return MDFX_TRACK_TYPE; } diff --git a/avr/cores/megacommand/MCL/MDLFOTrack.h b/avr/cores/megacommand/MCL/MDLFOTrack.h index ccb3e8d9c..61c24ccf1 100644 --- a/avr/cores/megacommand/MCL/MDLFOTrack.h +++ b/avr/cores/megacommand/MCL/MDLFOTrack.h @@ -31,7 +31,7 @@ class MDLFOTrack : public AUXTrack { void load_immediate(uint8_t tracknumber, SeqTrack *seq_track); virtual uint16_t get_track_size() { return sizeof(MDLFOTrack); } - virtual uint32_t get_region() { return BANK1_MDLFO_TRACK_START; } + virtual uint16_t get_region() { return BANK1_MDLFO_TRACK_START; } virtual uint8_t get_model() { return MDLFO_TRACK_TYPE; } virtual uint8_t get_device_type() { return MDLFO_TRACK_TYPE; } diff --git a/avr/cores/megacommand/MCL/MDRouteTrack.h b/avr/cores/megacommand/MCL/MDRouteTrack.h index 6b0cfeb53..08f08fd60 100644 --- a/avr/cores/megacommand/MCL/MDRouteTrack.h +++ b/avr/cores/megacommand/MCL/MDRouteTrack.h @@ -36,7 +36,7 @@ class MDRouteTrack : public AUXTrack, public RouteData { void load_routes(); virtual uint16_t get_track_size() { return sizeof(MDRouteTrack); } - virtual uint32_t get_region() { return BANK1_MDROUTE_TRACK_START; } + virtual uint16_t get_region() { return BANK1_MDROUTE_TRACK_START; } virtual uint8_t get_model() { return MDROUTE_TRACK_TYPE; } virtual uint8_t get_device_type() { return MDROUTE_TRACK_TYPE; } diff --git a/avr/cores/megacommand/MCL/MDTempoTrack.h b/avr/cores/megacommand/MCL/MDTempoTrack.h index b97487909..e3ca27912 100644 --- a/avr/cores/megacommand/MCL/MDTempoTrack.h +++ b/avr/cores/megacommand/MCL/MDTempoTrack.h @@ -29,7 +29,7 @@ class MDTempoTrack : public AUXTrack, public TempoData { void load_immediate(uint8_t tracknumber, SeqTrack *seq_track); virtual uint16_t get_track_size() { return sizeof(MDTempoTrack); } - virtual uint32_t get_region() { return BANK1_MDTEMPO_TRACK_START; } + virtual uint16_t get_region() { return BANK1_MDTEMPO_TRACK_START; } virtual uint8_t get_model() { return MDTEMPO_TRACK_TYPE; } virtual uint8_t get_device_type() { return MDTEMPO_TRACK_TYPE; } diff --git a/avr/cores/megacommand/MCL/MDTrack.h b/avr/cores/megacommand/MCL/MDTrack.h index ca72ceb31..4bb1c880b 100644 --- a/avr/cores/megacommand/MCL/MDTrack.h +++ b/avr/cores/megacommand/MCL/MDTrack.h @@ -127,7 +127,7 @@ class MDTrack : public DeviceTrack { } virtual uint16_t get_track_size() { return sizeof(MDTrack); } - virtual uint32_t get_region() { return BANK1_MD_TRACKS_START; } + virtual uint16_t get_region() { return BANK1_MD_TRACKS_START; } virtual void on_copy(int16_t s_col, int16_t d_col, bool destination_same); virtual uint8_t get_model() { return machine.get_model(); } virtual uint8_t get_device_type() { return MD_TRACK_TYPE; } @@ -142,7 +142,7 @@ class MDTrackChunk : public DeviceTrackChunk { virtual uint16_t get_seq_data_size() { return sizeof(MDSeqTrackData); } virtual uint8_t get_model() { return MD_TRACK_TYPE; } virtual uint16_t get_track_size() { return GRID1_TRACK_LEN; } - virtual uint32_t get_region() { return BANK1_MD_TRACKS_START; } + virtual uint16_t get_region() { return BANK1_MD_TRACKS_START; } virtual uint8_t get_device_type() { return MD_TRACK_TYPE; } virtual void *get_sound_data_ptr() { return nullptr; } From ac0046afac49f0ba0e79a50228f417d7eb161c81 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 25 Jun 2023 21:16:14 +1000 Subject: [PATCH 099/413] optimize --- avr/cores/megacommand/MCL/GridIOPage.cpp | 38 ++++++++++++------------ 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/avr/cores/megacommand/MCL/GridIOPage.cpp b/avr/cores/megacommand/MCL/GridIOPage.cpp index 5fbd30853..b50406c45 100644 --- a/avr/cores/megacommand/MCL/GridIOPage.cpp +++ b/avr/cores/megacommand/MCL/GridIOPage.cpp @@ -19,25 +19,25 @@ void GridIOPage::init() { void GridIOPage::track_select_array_from_type_select( uint8_t *track_select_array) { for (uint8_t n = 0; n < NUM_SLOTS; n++) { - GridDeviceTrack *gdt = - mcl_actions.get_grid_dev_track(n); + GridDeviceTrack *gdt = mcl_actions.get_grid_dev_track(n); uint8_t device_idx = gdt->device_idx; if (gdt == nullptr) continue; - - if ((gdt->group_type == GROUP_DEV) && - IS_BIT_SET16(mcl_cfg.track_type_select, device_idx)) { - track_select_array[n] = 1; + uint8_t match = 255; + switch (gdt->group_type) { + case GROUP_DEV: + match = gdt->device_idx; + break; + case GROUP_AUX: + case GROUP_TEMPO: + match = gdt->group_type + 1; + break; } - // AUX tracks - if ((gdt->group_type == GROUP_AUX) && - IS_BIT_SET16(mcl_cfg.track_type_select, 2)) { - track_select_array[n] = 1; + if (match == 255) { + continue; } - - if ((gdt->group_type == GROUP_TEMPO) && - IS_BIT_SET16(mcl_cfg.track_type_select, 3)) { + if (IS_BIT_SET16(mcl_cfg.track_type_select, match)) { track_select_array[n] = 1; } } @@ -58,7 +58,7 @@ bool GridIOPage::handleEvent(gui_event_t *event) { case MDX_KEY_SCALE: { goto toggle_grid; } - } + } } } if (EVENT_PRESSED(event, Buttons.BUTTON2)) { @@ -82,16 +82,16 @@ bool GridIOPage::handleEvent(gui_event_t *event) { return true; } if (EVENT_PRESSED(event, Buttons.ENCODER4)) { -// encoders[3]->pressmode = !encoders[3]->pressmode; + // encoders[3]->pressmode = !encoders[3]->pressmode; } - // if (EVENT_PRESSED(event, Buttons.ENCODER1) || + // if (EVENT_PRESSED(event, Buttons.ENCODER1) || // EVENT_PRESSED(event, Buttons.ENCODER2) || // EVENT_PRESSED(event, Buttons.ENCODER3) || // EVENT_PRESSED(event, Buttons.ENCODER4)) { - // } - if (EVENT_RELEASED(event, Buttons.BUTTON1) || + // } + if (EVENT_RELEASED(event, Buttons.BUTTON1) || EVENT_RELEASED(event, Buttons.BUTTON4)) { - close: + close: mcl.setPage(GRID_PAGE); return true; } From d285bf28a8a03df2f2278acecc3267a142999dff Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 25 Jun 2023 21:17:21 +1000 Subject: [PATCH 100/413] Let the compiler decide what to inline. Saves significant progmem --- avr/cores/megacommand/MidiUart.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MidiUart.cpp b/avr/cores/megacommand/MidiUart.cpp index e71527bb7..e863c53cb 100644 --- a/avr/cores/megacommand/MidiUart.cpp +++ b/avr/cores/megacommand/MidiUart.cpp @@ -1,4 +1,4 @@ -#define IS_ISR_ROUTINE +//#define IS_ISR_ROUTINE #include "WProgram.h" From b9c32a51ada07b270605da15f8e9e946a0b8bf15 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 25 Jun 2023 22:46:22 +1000 Subject: [PATCH 101/413] Mixer page, bug in itterator. --- avr/cores/megacommand/MCL/MixerPage.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 9015f0b4a..05d8f28be 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -491,7 +491,8 @@ bool MixerPage::handleEvent(gui_event_t *event) { show_mixer_menu = true; } else { uint8_t is_md_device = (midi_device == &MD); - for (int i = 0; i < 16; i++) { + uint8_t len = is_md_device ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; + for (int i = 0; i < len; i++) { if (note_interface.is_note_on(i)) { SeqTrack *seq_track = is_md_device ? (SeqTrack *)&mcl_seq.md_tracks[i] From 0db7cb2d081cc677327f4400003b20a7e1902556 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 26 Jun 2023 00:10:12 +1000 Subject: [PATCH 102/413] opt_midi_device_capture serves duplicate purpose of SeqPage::midi_device ? --- avr/cores/megacommand/MCL/LFOPage.cpp | 6 +-- avr/cores/megacommand/MCL/LFOPage.h | 2 +- avr/cores/megacommand/MCL/MCL.h | 3 ++ avr/cores/megacommand/MCL/MDTrackSelect.cpp | 17 +++---- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 1 - avr/cores/megacommand/MCL/SeqExtStepPage.h | 2 +- avr/cores/megacommand/MCL/SeqPage.cpp | 49 ++++++++++---------- avr/cores/megacommand/MCL/SeqPage.h | 3 +- avr/cores/megacommand/MCL/SeqPtcPage.cpp | 1 - avr/cores/megacommand/MCL/SeqPtcPage.h | 2 +- avr/cores/megacommand/MCL/SeqStepPage.cpp | 1 - 11 files changed, 43 insertions(+), 44 deletions(-) diff --git a/avr/cores/megacommand/MCL/LFOPage.cpp b/avr/cores/megacommand/MCL/LFOPage.cpp index a1753d6fd..b0dbde85a 100644 --- a/avr/cores/megacommand/MCL/LFOPage.cpp +++ b/avr/cores/megacommand/MCL/LFOPage.cpp @@ -23,7 +23,7 @@ void LFOPage::init() { DEBUG_PRINT_FN(); oled_display.clearDisplay(); oled_display.setFont(); - update_encoders(); + config_encoders(); MD.sync_seqtrack(lfo_track->length, lfo_track->speed, lfo_track->step_count); if (lfo_track->mode != LFO_MODE_FREE) { @@ -40,7 +40,7 @@ void LFOPage::cleanup() { oled_display.clearDisplay(); } -void LFOPage::update_encoders() { +void LFOPage::config_encoders() { if (page_mode == LFO_DESTINATION) { encoders[0]->cur = lfo_track->params[0].dest; ((MCLEncoder *)encoders[0])->max = NUM_MD_TRACKS + 4; @@ -366,7 +366,7 @@ bool LFOPage::handleEvent(gui_event_t *event) { */ if (EVENT_PRESSED(event, Buttons.BUTTON4)) { page_mode = !(page_mode); - update_encoders(); + config_encoders(); } if (EVENT_PRESSED(event, Buttons.BUTTON3)) { diff --git a/avr/cores/megacommand/MCL/LFOPage.h b/avr/cores/megacommand/MCL/LFOPage.h index 0dfbbf91b..44d4e9d66 100644 --- a/avr/cores/megacommand/MCL/LFOPage.h +++ b/avr/cores/megacommand/MCL/LFOPage.h @@ -44,7 +44,7 @@ class LFOPage : public SeqPage, MidiCallback { void init(); void loop(); void cleanup(); - void update_encoders(); + virtual void config_encoders(); void setup_callbacks(); void remove_callbacks(); diff --git a/avr/cores/megacommand/MCL/MCL.h b/avr/cores/megacommand/MCL/MCL.h index 9a8f25648..d474100a4 100644 --- a/avr/cores/megacommand/MCL/MCL.h +++ b/avr/cores/megacommand/MCL/MCL.h @@ -115,6 +115,9 @@ class MCL { current_page = 255; } + bool isSeqPage() { + return current_page == SEQ_STEP_PAGE || current_page == SEQ_PTC_PAGE || current_page == SEQ_EXTSTEP_PAGE; + } PageIndex currentPage() { return current_page; } diff --git a/avr/cores/megacommand/MCL/MDTrackSelect.cpp b/avr/cores/megacommand/MCL/MDTrackSelect.cpp index ddc4e8dce..161b2bf60 100644 --- a/avr/cores/megacommand/MCL/MDTrackSelect.cpp +++ b/avr/cores/megacommand/MCL/MDTrackSelect.cpp @@ -47,11 +47,12 @@ void MDTrackSelect::end() { if (sysex->get_recordLen() == 8) { bool is_md_device = SeqPage::midi_device == &MD && (mcl.currentPage() != SEQ_EXTSTEP_PAGE); bool expand = true; + bool is_seq_page = mcl.isSeqPage(); reset_undo(); uint8_t length = sysex->getByte(6); uint8_t new_speed = sysex->getByte(7); - if (mcl.currentPage() == SEQ_STEP_PAGE || mcl.currentPage() == SEQ_EXTSTEP_PAGE || mcl.currentPage() == SEQ_PTC_PAGE) { - if (seq_step_page.recording) { + if (is_seq_page) { + if (SeqPage::recording) { goto update_pattern; } uint8_t b = sysex->getByte(3); @@ -69,12 +70,8 @@ void MDTrackSelect::end() { mcl_seq.ext_tracks[n].set_speed(new_speed); if (mcl.currentPage() == SEQ_EXTSTEP_PAGE) { seq_extparam4.cur = length; } } - if (mcl.currentPage() == SEQ_PTC_PAGE) { - seq_ptc_page.config_encoders(); - } - if (mcl.currentPage() == SEQ_STEP_PAGE) { - seq_step_page.config_encoders(); - } + SeqPage *seq_page = (SeqPage*) GUI.currentPage(); + seq_page->config_encoders(); } else { update_pattern: uint8_t old_speeds[16]; @@ -119,6 +116,10 @@ void MDTrackSelect::end() { } seq_track->mute_state = old_mutes[n]; } + if (is_seq_page) { + SeqPage *seq_page = (SeqPage*) GUI.currentPage(); + seq_page->config_encoders(); + } } } else { diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index e9cae48f2..d04aed76e 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -70,7 +70,6 @@ void SeqExtStepPage::init() { DEBUG_PRINTLN(F("seq extstep init")); midi_device = midi_active_peering.get_device(UART2_PORT); - opt_midi_device_capture = midi_device; SeqPage::init(); param_select = PARAM_OFF; diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.h b/avr/cores/megacommand/MCL/SeqExtStepPage.h index f0656795b..91118207b 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.h +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.h @@ -58,7 +58,7 @@ class SeqExtStepPage : public SeqPage { SeqExtStepPage(Encoder *e1 = NULL, Encoder *e2 = NULL, Encoder *e3 = NULL, Encoder *e4 = NULL) : SeqPage(e1, e2, e3, e4) {} - void config_encoders(); + virtual void config_encoders(); void draw_thick_line(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t color = WHITE); diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index 276689e9a..ec5825ebc 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -53,7 +53,6 @@ bool SeqPage::recording = false; uint8_t SeqPage::last_midi_state = 0; uint8_t SeqPage::last_step = 255; -static MidiDevice *opt_midi_device_capture = &MD; static SeqPage *opt_seqpage_capture = nullptr; static MCLEncoder *opt_param1_capture = nullptr; static MCLEncoder *opt_param2_capture = nullptr; @@ -138,7 +137,7 @@ void SeqPage::init() { void SeqPage::cleanup() { seqpage_midi_events.remove_callbacks(); note_interface.init_notes(); - opt_midi_device_capture = &MD; + midi_device = &MD; disable_record(); if (show_seq_menu) { encoders[0] = opt_param1_capture; @@ -204,7 +203,7 @@ void SeqPage::toggle_ext_mask(uint8_t track) { return true; } MidiDevice *dev = midi_active_peering.get_device(UART2_PORT); - opt_midi_device_capture = dev; + midi_device = dev; midi_device = dev; select_track(dev, track); opt_trackid = last_ext_track + 1; @@ -372,7 +371,7 @@ bool SeqPage::handleEvent(gui_event_t *event) { // capture current page. opt_seqpage_capture = this; - if (opt_midi_device_capture == &MD) { + if (midi_device == &MD) { auto &active_track = mcl_seq.md_tracks[last_md_track]; opt_trackid = last_md_track + 1; opt_speed = active_track.speed; @@ -630,7 +629,7 @@ void pattern_len_handler(EncoderParent *enc) { } void opt_length_handler() { - if (opt_midi_device_capture == &MD) { + if (SeqPage::midi_device == &MD) { auto &active_track = mcl_seq.md_tracks[last_md_track]; active_track.set_length(opt_length); MD.sync_seqtrack(active_track.length, active_track.speed, @@ -643,7 +642,7 @@ void opt_length_handler() { } void opt_channel_handler() { - if (opt_midi_device_capture == &MD) { + if (SeqPage::midi_device == &MD) { } else { mcl_seq.ext_tracks[last_ext_track].buffer_notesoff(); mcl_seq.ext_tracks[last_ext_track].channel = opt_channel - 1; @@ -653,12 +652,12 @@ void opt_channel_handler() { void opt_mask_handler() { seq_step_page.config_mask_info(false); } void opt_trackid_handler() { - opt_seqpage_capture->select_track(opt_midi_device_capture, opt_trackid - 1); + opt_seqpage_capture->select_track(SeqPage::midi_device, opt_trackid - 1); } void opt_speed_handler() { - if (opt_midi_device_capture == &MD) { + if (SeqPage::midi_device == &MD) { DEBUG_PRINTLN(F("okay using MD for length update")); if (BUTTON_DOWN(Buttons.BUTTON4)) { for (uint8_t n = 0; n < NUM_MD_TRACKS; n++) { @@ -703,7 +702,7 @@ void opt_clear_track_handler() { COPY: copy = true; } - if (opt_midi_device_capture == &MD) { + if (SeqPage::midi_device == &MD) { if (opt_clear == 2) { MD.popup_text(2); @@ -764,7 +763,7 @@ void opt_clear_track_handler() { void opt_clear_locks_handler() { - if (opt_midi_device_capture == &MD) { + if (SeqPage::midi_device == &MD) { if (opt_clear == 2) { for (uint8_t n = 0; n < 16; ++n) { oled_display.textbox("CLEAR MD ", "LOCKS"); @@ -795,7 +794,7 @@ void opt_clear_locks_handler() { } void opt_clear_all_tracks_handler() { - if (opt_midi_device_capture == &MD) { + if (SeqPage::midi_device == &MD) { } #ifdef EXT_TRACKS else { @@ -805,7 +804,7 @@ void opt_clear_all_tracks_handler() { } void opt_clear_all_locks_handler() { - if (opt_midi_device_capture == &MD) { + if (SeqPage::midi_device == &MD) { } #ifdef EXT_TRACKS else { @@ -830,7 +829,7 @@ void opt_copy_track_handler(uint8_t op) { DEBUG_PRINTLN("/end"); if (opt_copy == 2) { - if (opt_midi_device_capture == &MD) { + if (SeqPage::midi_device == &MD) { if (!silent) { oled_display.textbox("COPY MD ", "TRACKS"); MD.popup_text(1); @@ -847,7 +846,7 @@ void opt_copy_track_handler(uint8_t op) { #endif } if (opt_copy == 1) { - if (opt_midi_device_capture == &MD) { + if (SeqPage::midi_device == &MD) { if (!silent) { oled_display.textbox("COPY TRACK", ""); MD.popup_text(4); @@ -875,7 +874,7 @@ void opt_paste_track_handler() { } if (opt_paste == 2) { - if (opt_midi_device_capture == &MD) { + if (SeqPage::midi_device == &MD) { if (!undo) { oled_display.textbox("PASTE MD ", "TRACKS"); MD.popup_text(3); @@ -895,7 +894,7 @@ void opt_paste_track_handler() { } } if (opt_paste == 1) { - if (opt_midi_device_capture == &MD) { + if (SeqPage::midi_device == &MD) { if (!undo) { oled_display.textbox("PASTE TRACK", ""); MD.popup_text(6); @@ -1066,7 +1065,7 @@ void opt_clear_step_locks_handler() { for (uint8_t n = 0; n < NUM_MD_TRACKS; n++) { if (note_interface.is_note_on(n)) { - if (opt_midi_device_capture == &MD) { + if (SeqPage::midi_device == &MD) { mcl_seq.md_tracks[last_md_track].clear_step_locks( n + SeqPage::page_select * 16); } else { @@ -1081,7 +1080,7 @@ void opt_clear_step_locks_handler() { void opt_shift_track_handler() { switch (opt_shift) { case 1: - if (opt_midi_device_capture == &MD) { + if (SeqPage::midi_device == &MD) { mcl_seq.md_tracks[last_md_track].rotate_left(); } #ifdef EXT_TRACKS @@ -1091,7 +1090,7 @@ void opt_shift_track_handler() { #endif break; case 2: - if (opt_midi_device_capture == &MD) { + if (SeqPage::midi_device == &MD) { mcl_seq.md_tracks[last_md_track].rotate_right(); } #ifdef EXT_TRACKS @@ -1101,7 +1100,7 @@ void opt_shift_track_handler() { #endif break; case 3: - if (opt_midi_device_capture == &MD) { + if (SeqPage::midi_device == &MD) { for (uint8_t n = 0; n < NUM_MD_TRACKS; n++) { mcl_seq.md_tracks[n].rotate_left(); } @@ -1115,7 +1114,7 @@ void opt_shift_track_handler() { #endif break; case 4: - if (opt_midi_device_capture == &MD) { + if (SeqPage::midi_device == &MD) { for (uint8_t n = 0; n < NUM_MD_TRACKS; n++) { mcl_seq.md_tracks[n].rotate_right(); } @@ -1134,7 +1133,7 @@ void opt_shift_track_handler() { void opt_reverse_track_handler() { if (opt_reverse == 2) { - if (opt_midi_device_capture == &MD) { + if (SeqPage::midi_device == &MD) { // oled_display.textbox("REVERSE ", "MD TRACKS"); for (uint8_t n = 0; n < NUM_MD_TRACKS; n++) { mcl_seq.md_tracks[n].reverse(); @@ -1151,7 +1150,7 @@ void opt_reverse_track_handler() { } if (opt_reverse == 1) { - if (opt_midi_device_capture == &MD) { + if (SeqPage::midi_device == &MD) { // oled_display.textbox("REVERSE ", "TRACK"); mcl_seq.md_tracks[last_md_track].reverse(); } @@ -1202,7 +1201,7 @@ void SeqPage::loop() { if (show_seq_menu) { seq_menu_page.loop(); - if (opt_midi_device_capture != &MD && opt_trackid > NUM_EXT_TRACKS) { + if (midi_device != &MD && opt_trackid > NUM_EXT_TRACKS) { // lock trackid to [1..4] opt_trackid = min(opt_trackid, NUM_EXT_TRACKS); seq_menu_value_encoder.cur = opt_trackid; @@ -1263,7 +1262,7 @@ void SeqPage::draw_page_index(bool show_page_index, uint8_t _playing_idx) { // ref: design/Sequencer.png void SeqPage::display() { - bool is_md = (opt_midi_device_capture == &MD); + bool is_md = (midi_device == &MD); const char *int_name = midi_active_peering.get_device(UART1_PORT)->name; const char *ext_name = midi_active_peering.get_device(UART2_PORT)->name; diff --git a/avr/cores/megacommand/MCL/SeqPage.h b/avr/cores/megacommand/MCL/SeqPage.h index 8b9ba7528..fad5896e7 100644 --- a/avr/cores/megacommand/MCL/SeqPage.h +++ b/avr/cores/megacommand/MCL/SeqPage.h @@ -36,7 +36,6 @@ extern uint8_t opt_channel; extern uint8_t opt_undo; extern uint8_t opt_undo_track; -extern MidiDevice *opt_midi_device_capture; extern uint16_t trigled_mask; extern uint16_t locks_on_step_mask; @@ -158,7 +157,7 @@ class SeqPage : public LightPage { virtual void setup(); virtual void init(); virtual void cleanup(); - + virtual void config_encoders() = 0; static constexpr uint8_t pidx_x0 = 0; static constexpr uint8_t pidx_y = 15; static constexpr uint8_t pidx_w = 6; diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.cpp b/avr/cores/megacommand/MCL/SeqPtcPage.cpp index 2f5818e94..a08805738 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPtcPage.cpp @@ -127,7 +127,6 @@ void SeqPtcPage::config() { config_as_trackedit(); } void SeqPtcPage::loop() { - opt_midi_device_capture = midi_device; if (re_init) { init(); } diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.h b/avr/cores/megacommand/MCL/SeqPtcPage.h index 24b0d21f3..489e99eac 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.h +++ b/avr/cores/megacommand/MCL/SeqPtcPage.h @@ -83,7 +83,7 @@ class SeqPtcPage : public SeqPage, public ClockCallback { uint8_t get_note_from_machine_pitch(uint8_t pitch); uint8_t is_md_midi(uint8_t channel); - void config_encoders(); + virtual void config_encoders(); void init_poly(); void render_arp(bool recalc_notemask_, MidiDevice *midi_dev, uint8_t track); diff --git a/avr/cores/megacommand/MCL/SeqStepPage.cpp b/avr/cores/megacommand/MCL/SeqStepPage.cpp index 3895f86f4..fce9357ca 100644 --- a/avr/cores/megacommand/MCL/SeqStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqStepPage.cpp @@ -49,7 +49,6 @@ void SeqStepPage::init() { DEBUG_PRINT_FN(); DEBUG_PRINTLN(F("init seqstep")); SeqPage::init(); - opt_midi_device_capture = &MD; pitch_param = 255; seq_menu_page.menu.enable_entry(SEQ_MENU_MASK, true); From 6e71517fa6f81ca1ac30bc2fd1a4e8bc0e722bfc Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 26 Jun 2023 11:03:42 +1000 Subject: [PATCH 103/413] config encoders on init --- avr/cores/megacommand/MCL/SeqPage.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index ec5825ebc..9e32b3505 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -102,9 +102,13 @@ void SeqPage::init() { disable_record(); page_count = 4; ((MCLEncoder *)encoders[2])->handler = pattern_len_handler; + config_encoders(); seqpage_midi_events.setup_callbacks(); + oled_display.clearDisplay(); + toggle_device = true; + seq_menu_page.menu.enable_entry(SEQ_MENU_DEVICE, false); seq_menu_page.menu.enable_entry(SEQ_MENU_LENGTH, false); seq_menu_page.menu.enable_entry(SEQ_MENU_CHANNEL, false); From d1fde958470ce2291bd699efb44905e97612da02 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 26 Jun 2023 11:08:34 +1000 Subject: [PATCH 104/413] encoder config --- avr/cores/megacommand/MCL/SeqStepPage.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqStepPage.cpp b/avr/cores/megacommand/MCL/SeqStepPage.cpp index fce9357ca..a4efde85e 100644 --- a/avr/cores/megacommand/MCL/SeqStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqStepPage.cpp @@ -6,16 +6,15 @@ void SeqStepPage::setup() { SeqPage::setup(); } void SeqStepPage::config() { - seq_param3.cur = mcl_seq.md_tracks[last_md_track].length; - seq_param3.old = seq_param3.cur; + tuning_t const *tuning = MD.getKitModelTuning(last_md_track); - seq_param4.cur = 0; - seq_param4.old = 0; if (tuning) { seq_param4.max = tuning->len - 1 + tuning->base; } else { seq_param4.max = 1; } + seq_param4.cur = 0; + seq_param4.old = 0; // config info labels const char *str1 = getMDMachineNameShort(MD.kit.get_model(last_md_track), 1); const char *str2 = getMDMachineNameShort(MD.kit.get_model(last_md_track), 2); @@ -312,7 +311,7 @@ bool SeqStepPage::handleEvent(gui_event_t *event) { return true; } if (show_seq_menu) { - opt_trackid = track + 1; + opt_trackid = track + 1; note_interface.ignoreNextEvent(track); select_track(device, track); seq_menu_page.select_item(0); From e9190659ab6d9b5ff4bb19d77d70e9131adbfe62 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 26 Jun 2023 11:33:25 +1000 Subject: [PATCH 105/413] Optimize NoteInterface --- avr/cores/megacommand/MCL/NoteInterface.cpp | 32 --------------------- avr/cores/megacommand/MCL/NoteInterface.h | 13 ++++----- 2 files changed, 6 insertions(+), 39 deletions(-) diff --git a/avr/cores/megacommand/MCL/NoteInterface.cpp b/avr/cores/megacommand/MCL/NoteInterface.cpp index 1cd01c774..152b75703 100644 --- a/avr/cores/megacommand/MCL/NoteInterface.cpp +++ b/avr/cores/megacommand/MCL/NoteInterface.cpp @@ -15,14 +15,6 @@ bool NoteInterface::is_note(uint8_t note_num) { return IS_BIT_SET32(mask, note_num); } -bool NoteInterface::is_note_on(uint8_t note_num) { - return IS_BIT_SET32(notes_on, note_num); -} - -bool NoteInterface::is_note_off(uint8_t note_num) { - return IS_BIT_SET32(notes_off, note_num); -} - void NoteInterface::clear_note(uint8_t note_num) { if (note_num < NI_MAX_NOTES) { CLEAR_BIT32(notes_on, note_num); @@ -30,14 +22,6 @@ void NoteInterface::clear_note(uint8_t note_num) { } } -bool NoteInterface::is_event(gui_event_t *event) { - DEBUG_PRINTLN(event->source); - if (event->source >= 128) { - return true; - } - return false; -} - void NoteInterface::add_note_event(uint8_t note_num, uint8_t event_mask, uint8_t port) { gui_event_t event; event.source = note_num + 128; @@ -106,25 +90,9 @@ uint8_t NoteInterface::get_first_md_note() { return 255; } -bool NoteInterface::notes_all_off_md() { - - if (((uint16_t) notes_on == 0) && ((uint16_t)notes_off > 0)) { - return true; - } - return false; -} - -bool NoteInterface::notes_all_off() { - if ((notes_on == 0) && (notes_off > 0)) { - return true; - } - return false; -} - uint8_t NoteInterface::notes_count_on() { return popcount32(notes_on); } - uint8_t NoteInterface::notes_count_off() { return popcount32(notes_off); } diff --git a/avr/cores/megacommand/MCL/NoteInterface.h b/avr/cores/megacommand/MCL/NoteInterface.h index c30424310..64ee3597c 100644 --- a/avr/cores/megacommand/MCL/NoteInterface.h +++ b/avr/cores/megacommand/MCL/NoteInterface.h @@ -30,7 +30,6 @@ class NoteInterface { uint32_t notes_on; uint32_t notes_off; uint32_t notes_ignore; - uint8_t last_note; uint16_t note_hold[NUM_DEVS]; bool note_proceed = false; @@ -43,17 +42,17 @@ class NoteInterface { void add_note_event(uint8_t note_num, uint8_t event_mask, uint8_t port); void note_on_event(uint8_t note_num, uint8_t port); void note_off_event(uint8_t note_num, uint8_t port); - bool is_event(gui_event_t *event); - bool notes_all_off(); - bool notes_all_off_md(); + bool is_event(gui_event_t *event) { return event->source >= 128; } + bool notes_all_off() { return ((notes_on == 0) && (notes_off > 0)); } + bool notes_all_off_md() { return (((uint16_t) notes_on == 0) && ((uint16_t)notes_off > 0)); } + uint8_t notes_count_on(); uint8_t notes_count_off(); uint8_t notes_count(); - uint8_t notes_count_on(); uint8_t get_first_md_note(); bool is_note(uint8_t note_num); - bool is_note_on(uint8_t note_num); - bool is_note_off(uint8_t note_num); + bool is_note_on(uint8_t note_num) { return IS_BIT_SET32(notes_on, note_num); } + bool is_note_off(uint8_t note_num) { return IS_BIT_SET32(notes_off, note_num); } void clear_note(uint8_t note_num); void ignoreNextEvent(uint8_t i) { From aed7c4aac6f69bf8589bb210c335ba807f1ca31d Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 26 Jun 2023 11:37:38 +1000 Subject: [PATCH 106/413] multiply for divide --- avr/cores/megacommand/Midi/MidiClock.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/Midi/MidiClock.h b/avr/cores/megacommand/Midi/MidiClock.h index 22c85f744..f1f8c977d 100644 --- a/avr/cores/megacommand/Midi/MidiClock.h +++ b/avr/cores/megacommand/Midi/MidiClock.h @@ -299,7 +299,7 @@ class MidiClockClass { void calc_tempo() { // DEBUG_PRINTLN(diff_clock8); if (last_diff_clock8 != diff_clock8) { - tempo = 100000.0f / diff_clock8; + tempo = 0.00001f * diff_clock8; last_diff_clock8 = diff_clock8; } } From 9a76593e7eb6a29867d34c1403dff48054b40ada Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 26 Jun 2023 12:50:30 +1000 Subject: [PATCH 107/413] Show last_ext_track in seq_menu led mask. Zoom to 16 when switching configs on ext page --- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 3 ++- avr/cores/megacommand/MCL/SeqPage.cpp | 10 ++++++---- avr/cores/megacommand/make_and_upload.sh | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index d04aed76e..cd37c1a38 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -53,8 +53,9 @@ void SeqExtStepPage::config_encoders() { cur_y = fov_y + 1; cur_w = timing_mid; - seq_extparam4.cur = 16; } + + seq_extparam4.cur = 16; seq_extparam1.old = seq_extparam1.cur; seq_extparam2.old = seq_extparam2.cur; seq_extparam3.old = seq_extparam3.cur; diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index 9e32b3505..f9e9b9c13 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -208,7 +208,6 @@ void SeqPage::toggle_ext_mask(uint8_t track) { } MidiDevice *dev = midi_active_peering.get_device(UART2_PORT); midi_device = dev; - midi_device = dev; select_track(dev, track); opt_trackid = last_ext_track + 1; opt_speed = mcl_seq.ext_tracks[last_ext_track].speed; @@ -240,9 +239,7 @@ void SeqPage::select_track(MidiDevice *device, uint8_t track, bool send) { last_ext_track = min(track, NUM_EXT_TRACKS - 1); } #endif - if (GUI.currentPage()) { - GUI.currentPage()->config(); - } + config_encoders(); } bool SeqPage::display_mute_mask(MidiDevice* device, uint8_t offset) { @@ -253,6 +250,11 @@ bool SeqPage::display_mute_mask(MidiDevice* device, uint8_t offset) { uint8_t len = is_md_device ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; + //Hack to display last_ext_track + if (offset > 0 && !is_md_device) { + SET_BIT16(mute_mask, last_ext_track); + } + for (uint8_t n = 0; n < len; n++) { SeqTrack *seq_track = is_md_device ? (SeqTrack*) &mcl_seq.md_tracks[n] : (SeqTrack*) &mcl_seq.ext_tracks[n]; diff --git a/avr/cores/megacommand/make_and_upload.sh b/avr/cores/megacommand/make_and_upload.sh index faf2af36d..e4895ccf5 100755 --- a/avr/cores/megacommand/make_and_upload.sh +++ b/avr/cores/megacommand/make_and_upload.sh @@ -3,7 +3,6 @@ AVR_DIR=$(cd "../../../../tools/avr"; pwd) DEV=/dev/$(ls /dev | grep usb | grep cu | tail -n 1) make -j8 -if [ $? -eq 0 ]; then size=$(${AVR_DIR}/bin/avr-size main.elf | tail -n 1 | awk '{ print $1 + $2}') limit=$((256 * 1024 - 16 * 1024)) @@ -18,6 +17,7 @@ if [ $? -eq 0 ]; then echo RAM_USED: $ram_used echo RAM_FREE: $ram_free +if [ $? -eq 0 ]; then ${AVR_DIR}/bin/avr-nm main.elf -Crtd --size-sort | grep -i ' [dbv] ' | sort #avrdude -c atmelice_isp -p m2560 -D -Uflash:w:./main.hex -B 1 ${AVR_DIR}/bin/avrdude -C${AVR_DIR}/etc/avrdude.conf -V -patmega2560 -c arduino -P${DEV} -b115200 -D -Uflash:w:./main.hex From 92442981821b2c6046227e4f05e63484ca691514 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 26 Jun 2023 12:52:19 +1000 Subject: [PATCH 108/413] display length on all pages seq menu --- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 1 - avr/cores/megacommand/MCL/SeqPage.cpp | 1 - 2 files changed, 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index cd37c1a38..fa1ca72d8 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -83,7 +83,6 @@ void SeqExtStepPage::init() { // Common menu entries seq_menu_page.menu.enable_entry(SEQ_MENU_TRACK, true); - seq_menu_page.menu.enable_entry(SEQ_MENU_LENGTH, true); seq_menu_page.menu.enable_entry(SEQ_MENU_CHANNEL, true); seq_menu_page.menu.enable_entry(SEQ_MENU_PIANOROLL, true); seq_menu_page.menu.enable_entry(SEQ_MENU_SLIDE, true); diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index f9e9b9c13..10c261e05 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -110,7 +110,6 @@ void SeqPage::init() { toggle_device = true; seq_menu_page.menu.enable_entry(SEQ_MENU_DEVICE, false); - seq_menu_page.menu.enable_entry(SEQ_MENU_LENGTH, false); seq_menu_page.menu.enable_entry(SEQ_MENU_CHANNEL, false); seq_menu_page.menu.enable_entry(SEQ_MENU_MASK, false); seq_menu_page.menu.enable_entry(SEQ_MENU_ARP, false); From 2db42620f2cd3461ee0317226c9aa04887d6fea9 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 26 Jun 2023 14:27:27 +1000 Subject: [PATCH 109/413] Revert "multiply for divide" This reverts commit aed7c4aac6f69bf8589bb210c335ba807f1ca31d. --- avr/cores/megacommand/Midi/MidiClock.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/Midi/MidiClock.h b/avr/cores/megacommand/Midi/MidiClock.h index f1f8c977d..22c85f744 100644 --- a/avr/cores/megacommand/Midi/MidiClock.h +++ b/avr/cores/megacommand/Midi/MidiClock.h @@ -299,7 +299,7 @@ class MidiClockClass { void calc_tempo() { // DEBUG_PRINTLN(diff_clock8); if (last_diff_clock8 != diff_clock8) { - tempo = 0.00001f * diff_clock8; + tempo = 100000.0f / diff_clock8; last_diff_clock8 = diff_clock8; } } From 75872b4ad31897191a96a82c5aee69f6c5066f40 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 26 Jun 2023 14:27:45 +1000 Subject: [PATCH 110/413] add key throttle --- avr/cores/megacommand/MCL/GridTask.cpp | 1 + avr/cores/megacommand/MCL/TrigInterface.cpp | 37 +++++++++++++++++---- avr/cores/megacommand/MCL/TrigInterface.h | 4 ++- avr/cores/megacommand/make_and_upload.sh | 2 +- 4 files changed, 35 insertions(+), 9 deletions(-) diff --git a/avr/cores/megacommand/MCL/GridTask.cpp b/avr/cores/megacommand/MCL/GridTask.cpp index ee958faf9..6873a291a 100644 --- a/avr/cores/megacommand/MCL/GridTask.cpp +++ b/avr/cores/megacommand/MCL/GridTask.cpp @@ -35,6 +35,7 @@ void GridTask::run() { // ExtTrack *ext_track = (ExtTrack *)&temp_track; // MD GUI update. + trig_interface.check_key_throttle(); if (stop_hard_callback) { mcl_actions_callbacks.StopHardCallback(); diff --git a/avr/cores/megacommand/MCL/TrigInterface.cpp b/avr/cores/megacommand/MCL/TrigInterface.cpp index b31563315..1a7cf77a8 100644 --- a/avr/cores/megacommand/MCL/TrigInterface.cpp +++ b/avr/cores/megacommand/MCL/TrigInterface.cpp @@ -19,9 +19,9 @@ void TrigInterfaceTask::run() { key = MDX_KEY_DOWN; } - if (key == 255) { - GUI.removeTask(&trig_interface_task); - return; + if (key == 255) { + GUI.removeTask(&trig_interface_task); + return; } gui_event_t event; @@ -29,7 +29,7 @@ void TrigInterfaceTask::run() { event.mask = EVENT_BUTTON_PRESSED; event.port = UART1_PORT; EventRB.putp(&event); - + } */ @@ -54,7 +54,9 @@ void TrigInterface::disable_listener() { sysex->removeSysexListener(this); } bool TrigInterface::on(bool clear_states) { note_interface.init_notes(); - if (clear_states) { cmd_key_state = 0; } + if (clear_states) { + cmd_key_state = 0; + } note_interface.note_proceed = true; if (state) { return false; @@ -82,6 +84,15 @@ bool TrigInterface::off() { return true; } +bool TrigInterface::check_key_throttle() { + if (clock_diff(last_clock, slowclock) < 10) { + return true; + } else { + throttle = false; + } + return false; +} + void TrigInterface::end() { // if (!state) { @@ -101,6 +112,19 @@ void TrigInterface::end() { key_release = true; key -= 0x40; } + + if (key == MDX_KEY_YES) { + if (!key_release && throttle) { + if (check_key_throttle()) { + return; + } + } + if (!throttle) { + throttle = true; + last_clock = slowclock; + } + } + if (key_release) { CLEAR_BIT64(cmd_key_state, key); } else { @@ -124,8 +148,7 @@ void TrigInterface::end() { if (key == MDX_KEY_PATSONG) { event.source = Buttons.BUTTON3; - } - else { + } else { event.source = key + 64; // EVENT_CMD } event.mask = key_release ? EVENT_BUTTON_RELEASED : EVENT_BUTTON_PRESSED; diff --git a/avr/cores/megacommand/MCL/TrigInterface.h b/avr/cores/megacommand/MCL/TrigInterface.h index ff350b276..37d94c1f6 100644 --- a/avr/cores/megacommand/MCL/TrigInterface.h +++ b/avr/cores/megacommand/MCL/TrigInterface.h @@ -65,6 +65,8 @@ class TrigInterface : public MidiSysexListenerClass { bool state = false; uint64_t cmd_key_state; uint64_t ignore_next_mask; + uint16_t last_clock; + bool throttle; TrigInterface() : MidiSysexListenerClass() { ids[0] = 0x7F; @@ -79,9 +81,9 @@ class TrigInterface : public MidiSysexListenerClass { bool on(bool clear_states = true); bool off(); + bool check_key_throttle(); void enable_listener(); void disable_listener(); - virtual void start(); virtual void end(); bool is_key_down(uint8_t key) { return IS_BIT_SET64(cmd_key_state, key); } diff --git a/avr/cores/megacommand/make_and_upload.sh b/avr/cores/megacommand/make_and_upload.sh index e4895ccf5..faf2af36d 100755 --- a/avr/cores/megacommand/make_and_upload.sh +++ b/avr/cores/megacommand/make_and_upload.sh @@ -3,6 +3,7 @@ AVR_DIR=$(cd "../../../../tools/avr"; pwd) DEV=/dev/$(ls /dev | grep usb | grep cu | tail -n 1) make -j8 +if [ $? -eq 0 ]; then size=$(${AVR_DIR}/bin/avr-size main.elf | tail -n 1 | awk '{ print $1 + $2}') limit=$((256 * 1024 - 16 * 1024)) @@ -17,7 +18,6 @@ make -j8 echo RAM_USED: $ram_used echo RAM_FREE: $ram_free -if [ $? -eq 0 ]; then ${AVR_DIR}/bin/avr-nm main.elf -Crtd --size-sort | grep -i ' [dbv] ' | sort #avrdude -c atmelice_isp -p m2560 -D -Uflash:w:./main.hex -B 1 ${AVR_DIR}/bin/avrdude -C${AVR_DIR}/etc/avrdude.conf -V -patmega2560 -c arduino -P${DEV} -b115200 -D -Uflash:w:./main.hex From a2653ddc747438f514a6e523207259b17acd765c Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 26 Jun 2023 17:05:18 +1000 Subject: [PATCH 111/413] macro name --- avr/cores/megacommand/MCL/A4Track.cpp | 4 ++-- avr/cores/megacommand/MCL/FileBrowserPage.cpp | 4 ++-- avr/cores/megacommand/MCL/MCL.cpp | 2 +- avr/cores/megacommand/MCL/MCLMemory.h | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/avr/cores/megacommand/MCL/A4Track.cpp b/avr/cores/megacommand/MCL/A4Track.cpp index 4a3d55b81..bd5a51f4f 100644 --- a/avr/cores/megacommand/MCL/A4Track.cpp +++ b/avr/cores/megacommand/MCL/A4Track.cpp @@ -94,6 +94,6 @@ bool A4Track::store_in_grid(uint8_t column, uint16_t row, SeqTrack *seq_track, u //__SIZE_PROBE addr_md; //__SIZE_PROBE addr_aux; //__SIZE_PROBE addr_a4; -//__SIZE_PROBE addr_file_start; -//__SIZE_PROBE addr_end; +//__SIZE_PROBE addr_file_start; +//__SIZE_PROBE addr_end; //__SIZE_PROBE addr_end; diff --git a/avr/cores/megacommand/MCL/FileBrowserPage.cpp b/avr/cores/megacommand/MCL/FileBrowserPage.cpp index ec721ad5b..eda50020b 100644 --- a/avr/cores/megacommand/MCL/FileBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/FileBrowserPage.cpp @@ -55,7 +55,7 @@ void FileBrowserPage::get_entry(uint16_t n, const char *entry) { void FileBrowserPage::get_entry(uint16_t n, const char *entry, uint8_t &type) { volatile uint8_t *ptr = - (uint8_t *)BANK1_FILE_ENTRIES_START + n * FILE_ENTRY_SIZE; + (uint8_t *)BANK3_FILE_ENTRIES_START + n * FILE_ENTRY_SIZE; char buf[FILE_ENTRY_SIZE]; get_bank3(buf, ptr, FILE_ENTRY_SIZE); type = buf[0]; @@ -71,7 +71,7 @@ bool FileBrowserPage::add_entry(const char *entry, uint8_t type) { strncpy(buf + 1, entry, FILE_ENTRY_SIZE - 1); buf[FILE_ENTRY_SIZE - 1] = '\0'; volatile uint8_t *ptr = - (uint8_t *)BANK1_FILE_ENTRIES_START + numEntries * FILE_ENTRY_SIZE; + (uint8_t *)BANK3_FILE_ENTRIES_START + numEntries * FILE_ENTRY_SIZE; put_bank3(ptr, buf, sizeof(buf)); numEntries++; return true; diff --git a/avr/cores/megacommand/MCL/MCL.cpp b/avr/cores/megacommand/MCL/MCL.cpp index 8a31b633c..49fdbd9cd 100644 --- a/avr/cores/megacommand/MCL/MCL.cpp +++ b/avr/cores/megacommand/MCL/MCL.cpp @@ -95,7 +95,7 @@ void MCL::setup() { DEBUG_DUMP(sizeof(GridChainTrack)); DEBUG_PRINTLN("bank1 end: "); - DEBUG_PRINTLN(BANK1_FILE_ENTRIES_END); + DEBUG_PRINTLN(BANK3_FILE_ENTRIES_END); bool ret = false; delay(100); diff --git a/avr/cores/megacommand/MCL/MCLMemory.h b/avr/cores/megacommand/MCL/MCLMemory.h index bd7b93d57..45752194f 100644 --- a/avr/cores/megacommand/MCL/MCLMemory.h +++ b/avr/cores/megacommand/MCL/MCLMemory.h @@ -102,7 +102,7 @@ constexpr size_t BANK1_A4_TRACKS_START = BANK1_MDTEMPO_TRACK_START + MDTEMPO_TRA // 512x file entries (16 bytes each), stored in Bank3 constexpr size_t NUM_FILE_ENTRIES = 256; constexpr size_t FILE_ENTRY_SIZE = 32; -constexpr size_t BANK1_FILE_ENTRIES_START = 0x0000; -constexpr size_t BANK1_FILE_ENTRIES_END = 0x6000; +constexpr size_t BANK3_FILE_ENTRIES_START = 0x0000; +constexpr size_t BANK3_FILE_ENTRIES_END = 0x6000; // At 0xCAF4 From 791f819c67a073cbc508c7e5a658bc5e26efa1f8 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 26 Jun 2023 17:25:24 +1000 Subject: [PATCH 112/413] Each 'filebrowser' now has a static history. --- avr/cores/megacommand/MCL/FileBrowserPage.cpp | 16 +++++-------- avr/cores/megacommand/MCL/FileBrowserPage.h | 7 +++--- avr/cores/megacommand/MCL/LoadProjectPage.h | 2 +- .../megacommand/MCL/SampleBrowserPage.cpp | 24 +++++++------------ avr/cores/megacommand/MCL/SampleBrowserPage.h | 3 ++- 5 files changed, 21 insertions(+), 31 deletions(-) diff --git a/avr/cores/megacommand/MCL/FileBrowserPage.cpp b/avr/cores/megacommand/MCL/FileBrowserPage.cpp index eda50020b..69d9c513f 100644 --- a/avr/cores/megacommand/MCL/FileBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/FileBrowserPage.cpp @@ -4,11 +4,8 @@ File FileBrowserPage::file; int FileBrowserPage::numEntries; -char FileBrowserPage::lwd[128]; char FileBrowserPage::title[12]; char FileBrowserPage::focus_match[14]; -uint8_t FileBrowserPage::cur_col = 0; -uint8_t FileBrowserPage::cur_row = 0; uint8_t FileBrowserPage::cur_file = 0; bool FileBrowserPage::draw_dirs = false; @@ -26,8 +23,6 @@ bool FileBrowserPage::filemenu_active = false; bool FileBrowserPage::call_handle_filemenu = false; -FileSystemPosition FileBrowserPage::position; - FileBrowserFileTypes FileBrowserPage::file_types; bool FileBrowserPage::selection_change = false; @@ -36,7 +31,7 @@ uint16_t FileBrowserPage::selection_change_clock = 0; void FileBrowserPage::cleanup() { // always call setup() when entering this page. - this->isSetup = false; +// this->isSetup = false; } void FileBrowserPage::setup() { @@ -46,6 +41,9 @@ void FileBrowserPage::setup() { strcpy(title, "Files"); SD.chdir(); strcpy(lwd, "/"); + + encoders[1]->cur = 1; + encoders[2]->cur = 1; } void FileBrowserPage::get_entry(uint16_t n, const char *entry) { @@ -104,10 +102,6 @@ void FileBrowserPage::query_filesystem() { numEntries = 0; cur_file = 255; - // cur_row = 0; - encoders[1]->cur = 1; - encoders[2]->cur = 1; - if (show_save) { add_entry("[ RECV ]"); } @@ -357,6 +351,8 @@ bool FileBrowserPage::_cd(const char *child) { uint16_t pos = encoders[1]->getValue(); uint8_t row = cur_row; init(); + encoders[1]->cur = 1; + encoders[2]->cur = 1; position.push(pos, row); return true; } diff --git a/avr/cores/megacommand/MCL/FileBrowserPage.h b/avr/cores/megacommand/MCL/FileBrowserPage.h index 7c29e5782..92f1d03f3 100644 --- a/avr/cores/megacommand/MCL/FileBrowserPage.h +++ b/avr/cores/megacommand/MCL/FileBrowserPage.h @@ -91,11 +91,10 @@ class FileBrowserPage : public LightPage { static File file; static int numEntries; - static char lwd[128]; + char lwd[128]; static char title[12]; - static uint8_t cur_col; - static uint8_t cur_row; + uint8_t cur_row; static uint8_t cur_file; // configuration, should be set before calling base init() @@ -117,7 +116,7 @@ class FileBrowserPage : public LightPage { static char focus_match[PRJ_NAME_LEN]; static FileBrowserFileTypes file_types; - static FileSystemPosition position; + FileSystemPosition position; static bool selection_change; static uint16_t selection_change_clock; diff --git a/avr/cores/megacommand/MCL/LoadProjectPage.h b/avr/cores/megacommand/MCL/LoadProjectPage.h index 0816f08d5..109f414f6 100644 --- a/avr/cores/megacommand/MCL/LoadProjectPage.h +++ b/avr/cores/megacommand/MCL/LoadProjectPage.h @@ -19,7 +19,7 @@ class LoadProjectPage : public FileBrowserPage { virtual void on_delete(const char *entry); virtual void on_rename(const char *from, const char *to); virtual void setup(); - void init(); + virtual void init(); }; #endif /* LOADPROJECTPAGE_H__ */ diff --git a/avr/cores/megacommand/MCL/SampleBrowserPage.cpp b/avr/cores/megacommand/MCL/SampleBrowserPage.cpp index 5a14aa72c..aad9fd808 100644 --- a/avr/cores/megacommand/MCL/SampleBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/SampleBrowserPage.cpp @@ -15,7 +15,6 @@ void SampleBrowserPage::setup() { SD.mkdir(c_wav_root, true); SD.mkdir(c_syx_root, true); sysex = &(Midi.midiSysex); - show_samplemgr = false; FileBrowserPage::setup(); _cd(c_wav_root); position.reset(); @@ -81,7 +80,7 @@ void SampleBrowserPage::display() { oled_display.display(); } -void SampleBrowserPage::init() { +void SampleBrowserPage::init(uint8_t show_samplemgr_) { FileBrowserPage::selection_change = true; file_types.reset(); file_types.add(c_wav_suffix); @@ -91,6 +90,7 @@ void SampleBrowserPage::init() { filemenu_active = false; select_dirs = false; show_overwrite = false; + show_samplemgr = show_samplemgr_; if (show_samplemgr) { strcpy(title, "MD-ROM"); @@ -189,14 +189,12 @@ void SampleBrowserPage::recv_wav(int slot, bool silent) { void SampleBrowserPage::on_new() { if (!show_samplemgr) { pending_action = PA_NEW; - show_samplemgr = true; show_ram_slots = true; - init(); + init(true); } else { // shouldn't happen. // show_save = false for samplemgr. - show_samplemgr = false; - init(); + init(false); } } @@ -204,7 +202,7 @@ void SampleBrowserPage::on_cancel() { pending_action = 0; if (show_samplemgr) { show_samplemgr = false; -// init(); + //init(false); } else { // TODO cd .. ? _cd_up(); @@ -214,10 +212,9 @@ void SampleBrowserPage::on_cancel() { void SampleBrowserPage::on_select(const char *__) { if (!show_samplemgr) { pending_action = PA_SELECT; - show_samplemgr = true; show_ram_slots = false; DEBUG_PRINTLN("on select"); - init(); + init(true); } else { auto slot = encoders[1]->cur; switch (pending_action) { @@ -229,8 +226,7 @@ void SampleBrowserPage::on_select(const char *__) { break; } pending_action = 0; - show_samplemgr = false; - init(); + init(false); } } @@ -303,9 +299,8 @@ bool SampleBrowserPage::_handle_filemenu() { } switch (file_menu_page.menu.get_item_index(file_menu_encoder.cur)) { case FM_RECVALL: - show_samplemgr = true; show_ram_slots = true; - init(); + init(true); if (numEntries == 0) { gfx.alert("NON", "UW"); goto end; @@ -325,9 +320,8 @@ bool SampleBrowserPage::_handle_filemenu() { } } end: - show_samplemgr = false; show_ram_slots = false; - init(); + init(false); return true; case FM_SENDALL: if (!mcl_gui.wait_for_confirm("Send all", "Overwrite?")) { diff --git a/avr/cores/megacommand/MCL/SampleBrowserPage.h b/avr/cores/megacommand/MCL/SampleBrowserPage.h index 0da93aa1a..662c20557 100644 --- a/avr/cores/megacommand/MCL/SampleBrowserPage.h +++ b/avr/cores/megacommand/MCL/SampleBrowserPage.h @@ -32,7 +32,8 @@ class SampleBrowserPage : public FileBrowserPage, public MidiSysexListenerClass virtual bool handleEvent(gui_event_t *event); virtual void display(); void draw_scrollbar(uint8_t x_offset); - void init(); + void init(uint8_t show_samplemgr_); + virtual void init() { init(false); } void setup(); void send_sample(int slot, char *newname = nullptr, bool silent = false); void recv_wav(int slot, bool silent = false); From 6e290cb1fdb80106cdb02b9bbdef794393ebf4db Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 26 Jun 2023 18:20:47 +1000 Subject: [PATCH 113/413] Add back in a dedicated SoundBrowser page. WIP --- avr/cores/megacommand/MCL/FileBrowserPage.cpp | 3 +- avr/cores/megacommand/MCL/FileBrowserPage.h | 2 +- avr/cores/megacommand/MCL/MCL.cpp | 7 +- avr/cores/megacommand/MCL/MCL.h | 7 +- avr/cores/megacommand/MCL/MCLMemory.h | 6 +- avr/cores/megacommand/MCL/MCLMenus.cpp | 4 +- avr/cores/megacommand/MCL/MCLMenus.h | 2 +- avr/cores/megacommand/MCL/MCL_impl.h | 1 + .../megacommand/MCL/SampleBrowserPage.cpp | 4 +- avr/cores/megacommand/MCL/SampleBrowserPage.h | 8 +- avr/cores/megacommand/MCL/SeqPage.cpp | 2 +- avr/cores/megacommand/MCL/SeqPages.h | 1 + avr/cores/megacommand/MCL/SeqPtcPage.cpp | 3 + avr/cores/megacommand/MCL/SeqStepPage.cpp | 1 + .../megacommand/MCL/SoundBrowserPage.cpp | 126 ++++ avr/cores/megacommand/MCL/SoundBrowserPage.h | 34 + avr/cores/megacommand/WProgram.h | 2 +- avr/cores/megacommand/resources/R.h | 8 +- .../megacommand/resources/R_menu_layouts.cpp | 580 +++++++++--------- resource/menu_layouts.cpp | 1 + 20 files changed, 491 insertions(+), 311 deletions(-) create mode 100644 avr/cores/megacommand/MCL/SoundBrowserPage.cpp create mode 100644 avr/cores/megacommand/MCL/SoundBrowserPage.h diff --git a/avr/cores/megacommand/MCL/FileBrowserPage.cpp b/avr/cores/megacommand/MCL/FileBrowserPage.cpp index 69d9c513f..34278112a 100644 --- a/avr/cores/megacommand/MCL/FileBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/FileBrowserPage.cpp @@ -5,6 +5,7 @@ File FileBrowserPage::file; int FileBrowserPage::numEntries; char FileBrowserPage::title[12]; +char FileBrowserPage::str_save[12]; char FileBrowserPage::focus_match[14]; uint8_t FileBrowserPage::cur_file = 0; @@ -103,7 +104,7 @@ void FileBrowserPage::query_filesystem() { cur_file = 255; if (show_save) { - add_entry("[ RECV ]"); + add_entry(&str_save[0]); } // SD.vwd()->getName(temp_entry, FILE_ENTRY_SIZE); // SD.vwd()->getName(temp_entry, FILE_ENTRY_SIZE); diff --git a/avr/cores/megacommand/MCL/FileBrowserPage.h b/avr/cores/megacommand/MCL/FileBrowserPage.h index 92f1d03f3..a3c973b9a 100644 --- a/avr/cores/megacommand/MCL/FileBrowserPage.h +++ b/avr/cores/megacommand/MCL/FileBrowserPage.h @@ -93,7 +93,7 @@ class FileBrowserPage : public LightPage { char lwd[128]; static char title[12]; - + static char str_save[12]; uint8_t cur_row; static uint8_t cur_file; diff --git a/avr/cores/megacommand/MCL/MCL.cpp b/avr/cores/megacommand/MCL/MCL.cpp index 49fdbd9cd..795c2d7c4 100644 --- a/avr/cores/megacommand/MCL/MCL.cpp +++ b/avr/cores/megacommand/MCL/MCL.cpp @@ -75,7 +75,8 @@ static LightPage *const MCL::pages_table[NUM_PAGES] PROGMEM = { &midiprogram_menu_page, // Index: 35 &midiclock_menu_page, // Index: 36 &midiroute_menu_page, // Index: 37 - &midimachinedrum_menu_page // Index: 38 + &midimachinedrum_menu_page,// Index: 38 + &sound_browser // Index: 39 }; void MCL::setup() { @@ -249,7 +250,9 @@ bool mcl_handleEvent(gui_event_t *event) { mcl.currentPage() != SEQ_PTC_PAGE && mcl.currentPage() != SEQ_EXTSTEP_PAGE) { seq_step_page.prepare = true; - seq_step_page.last_page = mcl.currentPage(); + if (mcl.currentPage() != SOUND_BROWSER && mcl.currentPage() != ARP_PAGE && mcl.currentPage() != POLY_PAGE) { + seq_step_page.last_page = mcl.currentPage(); + } mcl.setPage(SEQ_STEP_PAGE); } else { if (seq_step_page.recording) { diff --git a/avr/cores/megacommand/MCL/MCL.h b/avr/cores/megacommand/MCL/MCL.h index d474100a4..81361727a 100644 --- a/avr/cores/megacommand/MCL/MCL.h +++ b/avr/cores/megacommand/MCL/MCL.h @@ -73,13 +73,14 @@ enum PageIndex { MIDIPROGRAM_MENU_PAGE, // Index: 35 MIDICLOCK_MENU_PAGE, // Index: 36 MIDIROUTE_MENU_PAGE, // Index: 37 - MIDIMACHINEDRUM_MENU_PAGE // Index: 38 - }; + MIDIMACHINEDRUM_MENU_PAGE,// Index: 38 + SOUND_BROWSER // Index: 39 +}; class MCL { public: - static constexpr uint8_t NUM_PAGES = 39; + static constexpr uint8_t NUM_PAGES = 40; static LightPage *const pages_table[NUM_PAGES] PROGMEM; diff --git a/avr/cores/megacommand/MCL/MCLMemory.h b/avr/cores/megacommand/MCL/MCLMemory.h index 45752194f..21ebf9648 100644 --- a/avr/cores/megacommand/MCL/MCLMemory.h +++ b/avr/cores/megacommand/MCL/MCLMemory.h @@ -100,9 +100,9 @@ constexpr size_t BANK1_MDTEMPO_TRACK_START = BANK1_MDFX_TRACK_START + MDFX_TRACK constexpr size_t BANK1_A4_TRACKS_START = BANK1_MDTEMPO_TRACK_START + MDTEMPO_TRACK_LEN; // 512x file entries (16 bytes each), stored in Bank3 -constexpr size_t NUM_FILE_ENTRIES = 256; -constexpr size_t FILE_ENTRY_SIZE = 32; +constexpr size_t NUM_FILE_ENTRIES = 408; +constexpr size_t FILE_ENTRY_SIZE = 20; constexpr size_t BANK3_FILE_ENTRIES_START = 0x0000; -constexpr size_t BANK3_FILE_ENTRIES_END = 0x6000; +constexpr size_t BANK3_FILE_ENTRIES_END = 0x2000; // At 0xCAF4 diff --git a/avr/cores/megacommand/MCL/MCLMenus.cpp b/avr/cores/megacommand/MCL/MCLMenus.cpp index 89775cd1d..39e257a2a 100644 --- a/avr/cores/megacommand/MCL/MCLMenus.cpp +++ b/avr/cores/megacommand/MCL/MCLMenus.cpp @@ -61,7 +61,9 @@ const PageIndex menu_target_pages[] PROGMEM = { // 15 MIDIROUTE_MENU_PAGE, // 16 - MIDIMACHINEDRUM_MENU_PAGE + MIDIMACHINEDRUM_MENU_PAGE, + // 17 + SOUND_BROWSER }; const uint8_t *const menu_target_param[] PROGMEM = { nullptr, diff --git a/avr/cores/megacommand/MCL/MCLMenus.h b/avr/cores/megacommand/MCL/MCLMenus.h index 5fefa759a..059ff25ca 100644 --- a/avr/cores/megacommand/MCL/MCLMenus.h +++ b/avr/cores/megacommand/MCL/MCLMenus.h @@ -91,7 +91,7 @@ extern MenuPage file_menu_page; extern MCLEncoder seq_menu_value_encoder; extern MCLEncoder seq_menu_entry_encoder; -constexpr size_t seq_menu_page_N = 21; +constexpr size_t seq_menu_page_N = 22; extern MenuPage seq_menu_page; extern MCLEncoder step_menu_value_encoder; diff --git a/avr/cores/megacommand/MCL/MCL_impl.h b/avr/cores/megacommand/MCL/MCL_impl.h index f24d2265b..d7ade395c 100644 --- a/avr/cores/megacommand/MCL/MCL_impl.h +++ b/avr/cores/megacommand/MCL/MCL_impl.h @@ -34,6 +34,7 @@ #include "PolyPage.h" #ifdef SOUND_PAGE +#include "SoundBrowserPage.h" #include "SampleBrowserPage.h" #endif diff --git a/avr/cores/megacommand/MCL/SampleBrowserPage.cpp b/avr/cores/megacommand/MCL/SampleBrowserPage.cpp index aad9fd808..68a0cadd4 100644 --- a/avr/cores/megacommand/MCL/SampleBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/SampleBrowserPage.cpp @@ -1,5 +1,4 @@ #include "MCL_impl.h" -#include "ResourceManager.h" const char *c_wav_root = "/Samples/WAV"; const char *c_syx_root = "/Samples/SYX"; @@ -85,6 +84,7 @@ void SampleBrowserPage::init(uint8_t show_samplemgr_) { file_types.reset(); file_types.add(c_wav_suffix); file_types.add(c_syx_suffix); + strcpy(str_save, "[ RECV ]"); trig_interface.off(); filemenu_active = false; @@ -112,8 +112,6 @@ void SampleBrowserPage::init(uint8_t show_samplemgr_) { query_filesystem(); } - R.Clear(); - R.use_machine_names_short(); } // send current selected sample file to slot diff --git a/avr/cores/megacommand/MCL/SampleBrowserPage.h b/avr/cores/megacommand/MCL/SampleBrowserPage.h index 662c20557..2e806fd2a 100644 --- a/avr/cores/megacommand/MCL/SampleBrowserPage.h +++ b/avr/cores/megacommand/MCL/SampleBrowserPage.h @@ -1,7 +1,7 @@ /* Justin Mammarella jmamma@gmail.com 2018 */ -#ifndef SOUNDBROWSERPAGE_H__ -#define SOUNDBROWSERPAGE_H__ +#ifndef SAMPLEBROWSERPAGE_H__ +#define SAMPLEBROWSERPAGE_H__ #include "FileBrowserPage.h" #include "MidiSysex.h" @@ -31,7 +31,7 @@ class SampleBrowserPage : public FileBrowserPage, public MidiSysexListenerClass virtual void on_cancel(); virtual bool handleEvent(gui_event_t *event); virtual void display(); - void draw_scrollbar(uint8_t x_offset); + void init(uint8_t show_samplemgr_); virtual void init() { init(false); } void setup(); @@ -47,4 +47,4 @@ class SampleBrowserPage : public FileBrowserPage, public MidiSysexListenerClass extern SampleBrowserPage sample_browser; -#endif /* SOUNDBROWSERPAGE_H__ */ +#endif /* SAMPLEBROWSERPAGE_H__ */ diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index 10c261e05..b960aa1f7 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -120,7 +120,7 @@ void SeqPage::init() { seq_menu_page.menu.enable_entry(SEQ_MENU_PARAMSELECT, false); seq_menu_page.menu.enable_entry(SEQ_MENU_SLIDE, false); seq_menu_page.menu.enable_entry(SEQ_MENU_POLY, false); - + seq_menu_page.menu.enable_entry(SEQ_MENU_SOUND, false); /* if (mcl_cfg.track_select == 1) { seq_menu_page.menu.enable_entry(SEQ_MENU_TRACK, false); diff --git a/avr/cores/megacommand/MCL/SeqPages.h b/avr/cores/megacommand/MCL/SeqPages.h index 97e50a9e4..8b284d9ca 100644 --- a/avr/cores/megacommand/MCL/SeqPages.h +++ b/avr/cores/megacommand/MCL/SeqPages.h @@ -33,6 +33,7 @@ #define SEQ_MENU_SHIFT 17 #define SEQ_MENU_REVERSE 18 #define SEQ_MENU_POLY 19 +#define SEQ_MENU_SOUND 21 extern MCLEncoder seq_param1; extern MCLEncoder seq_param2; diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.cpp b/avr/cores/megacommand/MCL/SeqPtcPage.cpp index a08805738..c39014f15 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPtcPage.cpp @@ -82,6 +82,9 @@ void SeqPtcPage::init() { seq_menu_page.menu.enable_entry(SEQ_MENU_ARP, true); seq_menu_page.menu.enable_entry(SEQ_MENU_TRANSPOSE, true); seq_menu_page.menu.enable_entry(SEQ_MENU_POLY, true); + if (midi_device == &MD) { + seq_menu_page.menu.enable_entry(SEQ_MENU_SOUND, true); + } cc_link_enable = true; scale_padding = false; ptc_param_len.handler = pattern_len_handler; diff --git a/avr/cores/megacommand/MCL/SeqStepPage.cpp b/avr/cores/megacommand/MCL/SeqStepPage.cpp index a4efde85e..426566f72 100644 --- a/avr/cores/megacommand/MCL/SeqStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqStepPage.cpp @@ -51,6 +51,7 @@ void SeqStepPage::init() { pitch_param = 255; seq_menu_page.menu.enable_entry(SEQ_MENU_MASK, true); + seq_menu_page.menu.enable_entry(SEQ_MENU_SOUND, true); SeqPage::midi_device = midi_active_peering.get_device(UART1_PORT); midi_events.setup_callbacks(); diff --git a/avr/cores/megacommand/MCL/SoundBrowserPage.cpp b/avr/cores/megacommand/MCL/SoundBrowserPage.cpp new file mode 100644 index 000000000..654e79671 --- /dev/null +++ b/avr/cores/megacommand/MCL/SoundBrowserPage.cpp @@ -0,0 +1,126 @@ +#include "MCL_impl.h" +#include "ResourceManager.h" + +const char *c_snd_root = "/Sounds"; +const char *c_snd_suffix = ".snd"; + +static bool s_query_returned = false; + +void SoundBrowserPage::setup() { + SD.mkdir(c_snd_root, true); + FileBrowserPage::setup(); + _cd(c_snd_root); + position.reset(); +} + +void SoundBrowserPage::init() { + FileBrowserPage::selection_change = true; + file_types.reset(); + file_types.add(c_snd_suffix); + + trig_interface.off(); + + strcpy(title, "SOUND"); + show_dirs = true; + show_save = true; + show_filemenu = true; + show_new_folder = true; + show_parent = true; + query_filesystem(); + + strcpy(str_save, "[ SAVE ]"); + + R.Clear(); + R.use_machine_names_short(); +} + +void SoundBrowserPage::save_sound() { + + MDSound sound; + char sound_name[9] = " "; + + grid_page.prepare(); + memcpy(sound_name, MD.kit.name, 4); + const char *tmp = getMDMachineNameShort(MD.kit.get_model(MD.currentTrack), 2); + copyMachineNameShort(tmp, sound_name + 4); + sound_name[6] = '\0'; + + if (mcl_gui.wait_for_input(sound_name, "Sound Name", 8)) { + char temp_entry[FILE_ENTRY_SIZE]; + strcpy(temp_entry, sound_name); + strcat(temp_entry, ".snd"); + sound.file.open(temp_entry, O_RDWR | O_CREAT); + sound.fetch_sound(MD.currentTrack); + sound.write_sound(); + sound.file.close(); + gfx.alert("File Saved", temp_entry); + } +} + +void SoundBrowserPage::load_sound() { + + grid_page.prepare(); + if (file.isOpen()) { + char temp_entry[FILE_ENTRY_SIZE]; + MDSound sound; + file.getName(temp_entry, FILE_ENTRY_SIZE); + file.close(); + DEBUG_PRINTLN(F("loading sound")); + DEBUG_PRINTLN(temp_entry); + if (!sound.file.open(temp_entry, O_READ)) { + gfx.alert("Error", "Opening"); + return; + } + sound.read_sound(); + if (sound.id != SOUND_ID) { + sound.file.close(); + gfx.alert("Error", "Not compatible"); + return; + } + sound.load_sound(MD.currentTrack); + gfx.alert("Loaded", "Sound"); + sound.file.close(); + } +} + + + +void SoundBrowserPage::on_new() { + save_sound(); + init(); +} + +void SoundBrowserPage::on_cancel() { + if (strcmp(lwd, "/") == 0) { mcl.setPage(SEQ_STEP_PAGE); return; } + _cd_up(); +} + +void SoundBrowserPage::on_select(const char *__) { + load_sound(); +} + +bool SoundBrowserPage::handleEvent(gui_event_t *event) { + if (EVENT_PRESSED(event, Buttons.BUTTON3) && show_filemenu) { + FileBrowserPage::handleEvent(event); + bool state = (param2->cur == 0); + file_menu_page.menu.enable_entry(FM_NEW_FOLDER, !state); + file_menu_page.menu.enable_entry(FM_DELETE, !state); // delete + file_menu_page.menu.enable_entry(FM_RENAME, !state); // rename + file_menu_page.menu.enable_entry(FM_OVERWRITE, !state); + file_menu_page.menu.enable_entry(FM_RECVALL, state); + file_menu_page.menu.enable_entry(FM_SENDALL, state); + return true; + } + + if (EVENT_PRESSED(event, Buttons.BUTTON2)) { + mcl.popPage(); + return true; + } + + return FileBrowserPage::handleEvent(event); +} + + +MCLEncoder soundbrowser_param1(0, 1, ENCODER_RES_SYS); +MCLEncoder soundbrowser_param2(0, 36, ENCODER_RES_SYS); +SoundBrowserPage sound_browser(&soundbrowser_param1, &soundbrowser_param2); diff --git a/avr/cores/megacommand/MCL/SoundBrowserPage.h b/avr/cores/megacommand/MCL/SoundBrowserPage.h new file mode 100644 index 000000000..b33ff7c51 --- /dev/null +++ b/avr/cores/megacommand/MCL/SoundBrowserPage.h @@ -0,0 +1,34 @@ +/* Justin Mammarella jmamma@gmail.com 2018 */ + +#ifndef SOUNDBROWSERPAGE_H__ +#define SOUNDBROWSERPAGE_H__ + +#include "FileBrowserPage.h" + +#define PA_NEW 0 +#define PA_SELECT 1 + +class SoundBrowserPage : public FileBrowserPage { + public: + + SoundBrowserPage(Encoder *e1 = NULL, Encoder *e2 = NULL, Encoder *e3 = NULL, + Encoder *e4 = NULL) : FileBrowserPage(e1, e2, e3, e4) { + } + + virtual void on_new(); + virtual void on_select(const char*); + virtual void on_cancel(); + + void save_sound(); + void load_sound(); + + virtual bool handleEvent(gui_event_t *event); + + virtual void init(); + void setup(); + +}; + +extern SoundBrowserPage sound_browser; + +#endif /* SOUNDBROWSERPAGE_H__ */ diff --git a/avr/cores/megacommand/WProgram.h b/avr/cores/megacommand/WProgram.h index 39fb718e1..813e42c8f 100644 --- a/avr/cores/megacommand/WProgram.h +++ b/avr/cores/megacommand/WProgram.h @@ -11,7 +11,7 @@ #include "wiring_private.h" -//#define DEBUGMODE +#define DEBUGMODE #ifdef MEGACOMMAND #define SD_CS 53 //PB0 diff --git a/avr/cores/megacommand/resources/R.h b/avr/cores/megacommand/resources/R.h index 54585c8c8..9aa06e84c 100644 --- a/avr/cores/megacommand/resources/R.h +++ b/avr/cores/megacommand/resources/R.h @@ -314,10 +314,10 @@ struct __T_menu_layouts { static constexpr size_t sizeofof_step_menu_layout = 96; union { menu_t seq_menu_layout[0]; - char zz__seq_menu_layout[453]; + char zz__seq_menu_layout[474]; }; - static constexpr size_t countof_seq_menu_layout = 453 / sizeof(menu_t); - static constexpr size_t sizeofof_seq_menu_layout = 453; + static constexpr size_t countof_seq_menu_layout = 474 / sizeof(menu_t); + static constexpr size_t sizeofof_seq_menu_layout = 474; union { menu_t file_menu_layout[0]; char zz__file_menu_layout[159]; @@ -408,7 +408,7 @@ struct __T_menu_layouts { }; static constexpr size_t countof_boot_menu_layout = 96 / sizeof(menu_t); static constexpr size_t sizeofof_boot_menu_layout = 96; - static constexpr size_t __total_size = 2139; + static constexpr size_t __total_size = 2160; }; extern const unsigned char __R_menu_options[] PROGMEM; diff --git a/avr/cores/megacommand/resources/R_menu_layouts.cpp b/avr/cores/megacommand/resources/R_menu_layouts.cpp index 189664bf2..cb07946ad 100644 --- a/avr/cores/megacommand/resources/R_menu_layouts.cpp +++ b/avr/cores/megacommand/resources/R_menu_layouts.cpp @@ -446,576 +446,584 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 58, 25, 42, - 130, - 167, + 187, + 83, + 79, + 85, + 252, + 70, + 56, + 6, + 24, 237, + 54, + 188, 70, 73, - 128, - 24, - 36, - 45, - 27, - 182, + 209, + 149, + 130, + 57, + 219, + 48, 67, - 199, + 220, + 108, 0, - 194, 0, - 219, - 217, + 45, + 184, + 238, 87, - 133, 32, - 157, - 216, + 93, + 178, 82, 46, + 129, 20, - 24, - 102, - 217, + 134, + 238, + 107, 51, - 181, - 159, - 144, + 180, + 89, 41, - 140, - 132, - 173, - 215, + 8, + 202, + 153, + 221, 0, 79, - 157, - 82, + 117, + 178, 87, - 90, - 176, + 43, + 111, 44, - 183, - 137, - 123, + 11, + 119, + 158, 86, 32, 65, + 176, 76, 106, - 11, - 104, - 195, - 86, - 133, + 182, + 216, + 181, + 157, + 148, 20, - 82, - 232, + 186, 22, 89, - 107, - 9, + 26, + 30, 77, + 198, 116, - 24, 73, - 92, - 147, + 23, + 168, 76, 65, - 40, - 85, - 73, - 250, - 183, + 10, + 106, + 50, + 15, + 109, 13, 4, + 198, 23, 1, - 27, - 155, + 176, + 217, 68, - 100, 42, - 233, + 58, 82, 67, - 88, - 146, - 89, - 3, + 100, + 109, + 128, + 110, + 220, 43, - 115, 4, + 214, 170, - 90, 63, - 144, - 110, - 153, + 164, + 131, + 38, 44, - 240, - 79, - 85, + 112, 193, - 6, - 241, - 36, - 109, - 6, + 10, + 94, + 46, + 1, + 54, + 27, 45, - 237, + 246, 149, 19, - 97, + 176, 123, - 97, - 30, - 154, + 176, + 205, + 51, 3, - 192, + 96, 95, - 105, + 52, 73, - 184, - 70, - 96, - 216, + 163, + 205, + 117, + 108, 84, 31, - 28, + 14, 11, - 51, + 25, 31, + 182, 18, - 109, 77, 181, - 225, + 240, 73, 90, 69, - 85, - 14, + 135, + 106, 8, - 152, - 69, - 60, - 127, + 76, + 90, + 30, + 148, 32, - 112, - 86, - 88, + 56, + 107, + 44, 91, 71, - 73, - 127, - 99, + 36, + 148, + 177, 74, + 237, 32, - 218, 77, 73, 198, - 31, + 15, 106, 72, + 227, 82, - 199, 79, 32, - 56, - 179, + 77, + 217, 53, - 238, + 247, 18, 2, 9, 4, - 123, + 61, 53, + 132, 20, - 9, - 13, + 134, 116, + 141, 88, - 26, - 198, - 214, + 219, + 107, 67, 20, - 19, + 9, + 186, 57, - 117, 4, 24, - 173, + 214, 172, 193, - 8, + 132, 83, - 47, + 23, 81, - 248, + 252, 32, 49, 32, 70, 87, - 212, - 173, - 156, - 80, + 106, + 194, + 78, + 101, 7, - 115, - 254, + 153, + 19, + 140, 20, - 25, 50, - 1, - 183, + 128, + 219, 51, 4, 92, + 236, 85, - 216, 83, 66, 17, - 41, - 122, - 6, + 20, + 131, + 143, 52, - 220, + 110, 4, 96, 67, - 106, - 20, - 240, - 166, - 150, + 53, + 41, + 120, + 187, + 75, 85, - 236, + 118, 211, 86, 24, - 48, + 24, 118, - 213, + 106, 11, - 135, - 58, + 195, 79, - 76, - 218, - 30, + 166, + 79, + 239, + 15, 178, 58, - 51, - 96, - 166, + 25, + 117, + 211, 5, - 13, - 72, - 92, - 176, + 34, + 36, + 113, + 88, 20, - 57, + 28, 53, - 153, + 204, 41, - 134, + 195, 199, - 97, + 48, 116, - 219, + 237, 6, 4, + 177, 100, - 98, 41, - 192, + 96, 20, - 230, + 115, + 54, 54, - 109, 95, 80, - 182, + 219, 192, 71, 25, - 134, + 67, 215, - 115, + 57, 9, + 160, 223, - 64, - 150, - 103, - 235, + 75, + 124, + 117, 128, 49, + 183, 4, - 111, 90, 20, - 177, + 216, 73, 242, - 96, + 176, 245, - 195, + 97, 47, 10, - 61, + 158, 20, - 204, + 230, 246, 21, - 62, + 31, 17, 2, 48, - 231, + 115, 20, 74, - 6, + 131, 148, - 172, + 86, 83, - 133, - 252, + 154, + 126, 85, 82, 66, 79, - 43, + 21, 11, + 151, 224, - 46, 2, - 230, + 115, 79, 20, - 114, + 57, 50, - 92, + 46, 3, - 146, - 26, + 73, + 13, 16, 58, - 193, + 96, 20, - 154, + 205, 55, 68, - 20, + 10, 106, - 115, + 57, 173, + 172, 42, - 89, 137, - 55, + 155, 4, 82, - 91, + 173, 67, 192, + 222, 76, - 189, 32, 98, - 102, - 217, - 219, + 179, + 238, + 109, 41, 56, + 136, 191, - 16, - 155, + 77, 199, + 204, 0, - 152, 126, - 132, + 66, 235, - 37, - 112, - 106, - 77, + 18, + 184, + 127, + 38, 62, - 132, + 192, 0, - 165, + 211, 104, - 8, + 4, 179, - 182, + 91, 212, 71, - 192, + 96, 20, - 86, - 251, - 132, + 32, + 80, + 16, + 134, 8, - 54, + 192, 20, - 3, + 99, 13, - 25, 40, - 96, - 64, - 152, - 199, + 44, + 8, + 173, + 24, + 231, 161, - 57, 39, - 184, + 55, 138, 65, 71, - 107, + 13, 247, 76, + 109, 71, - 107, 75, - 200, - 45, - 214, + 101, + 221, + 186, 170, 1, + 199, 7, - 61, 65, 85, + 177, 88, - 141, 32, + 179, 83, - 159, 42, + 236, 97, 103, 101, - 101, 35, - 195, + 184, 8, + 118, 204, - 178, 167, - 194, + 88, + 91, 171, - 218, 65, 100, - 237, + 93, 124, 74, + 181, 69, - 169, 225, + 32, 6, - 5, - 34, + 164, 236, - 194, + 88, 19, - 220, + 91, 90, - 203, + 153, 234, - 89, - 142, - 110, + 107, + 163, + 45, + 209, 161, - 141, 65, + 173, 147, - 104, 131, - 21, - 33, - 43, + 2, + 54, + 165, 52, + 97, 186, - 14, + 216, 4, - 192, 126, - 68, - 150, - 124, - 144, + 8, + 146, + 145, + 210, 192, - 16, - 37, - 75, - 135, - 54, + 2, + 4, 96, - 102, 176, + 236, + 54, + 102, + 22, 137, - 131, - 116, + 16, + 110, 3, + 141, 66, - 107, 170, + 96, 15, - 4, - 10, - 216, - 22, + 129, + 237, + 66, 190, + 195, 80, - 26, 57, + 86, 68, - 178, 89, - 235, + 93, 27, + 110, 34, - 113, 70, 85, - 139, + 49, 75, + 96, 108, - 1, - 2, - 77, - 143, + 32, + 81, + 98, + 235, 246, - 93, 59, + 172, 75, - 96, 20, - 49, + 6, 28, - 109, - 57, + 45, + 78, + 173, 88, - 106, 147, - 72, + 73, 236, - 110, + 13, 29, + 192, 3, 0, 0, 0, 0, 0, - 4, - 255, + 159, 255, }; diff --git a/resource/menu_layouts.cpp b/resource/menu_layouts.cpp index 9c93b00a0..214b96318 100644 --- a/resource/menu_layouts.cpp +++ b/resource/menu_layouts.cpp @@ -211,6 +211,7 @@ menu_t seq_menu_layout = { {"REVERSE:", 0, 3, 3, 29, 0, 13, 27}, {"POLYPHONY", 0, 0, 0, 0, 9, 0, 0}, {"REC QUANT:", 0, 2, 2, 42, 0, 0, 25}, + {"SOUND", 0, 0, 0, 0, 17, 0, 0}, }, 14, 0 }; From 77049f4649fef02006d01616810f93d40e577644 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 26 Jun 2023 18:55:38 +1000 Subject: [PATCH 114/413] remove intermediate page lookup table --- avr/cores/megacommand/MCL/MCLMenus.cpp | 37 ----- avr/cores/megacommand/MCL/Menu.cpp | 2 +- avr/cores/megacommand/MCL/Menu.h | 1 - resource/menu_layouts.cpp | 186 ++++++++++++------------- 4 files changed, 94 insertions(+), 132 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCLMenus.cpp b/avr/cores/megacommand/MCL/MCLMenus.cpp index 39e257a2a..99b3f3c49 100644 --- a/avr/cores/megacommand/MCL/MCLMenus.cpp +++ b/avr/cores/megacommand/MCL/MCLMenus.cpp @@ -28,43 +28,6 @@ uint8_t opt_import_count = 16; void new_proj_handler() { proj.new_project_prompt(); } -const PageIndex menu_target_pages[] PROGMEM = { - 255, - - // 1 - load_proj_page - LOAD_PROJ_PAGE, - 255, - // CONVERT_PROJ_PAGE, - MIDI_CONFIG_PAGE, - MD_CONFIG_PAGE, - CHAIN_CONFIG_PAGE, - AUX_CONFIG_PAGE, - - // 7 - MCL_CONFIG_PAGE, - - // 8 - ram_config_page - RAM_CONFIG_PAGE, - - // 9 - POLY_PAGE, - // 10 - ARP_PAGE, - // 11 - MD_IMPORT_PAGE, - // 12 - MIDIPORT_MENU_PAGE, - // 13 - MIDIPROGRAM_MENU_PAGE, - // 14 - MIDICLOCK_MENU_PAGE, - // 15 - MIDIROUTE_MENU_PAGE, - // 16 - MIDIMACHINEDRUM_MENU_PAGE, - // 17 - SOUND_BROWSER -}; const uint8_t *const menu_target_param[] PROGMEM = { nullptr, diff --git a/avr/cores/megacommand/MCL/Menu.cpp b/avr/cores/megacommand/MCL/Menu.cpp index 510c1554a..552097304 100644 --- a/avr/cores/megacommand/MCL/Menu.cpp +++ b/avr/cores/megacommand/MCL/Menu.cpp @@ -60,7 +60,7 @@ const char* MenuBase::get_item_name(uint8_t item_n) { PageIndex MenuBase::get_page_callback(uint8_t item_n) { auto *item = get_item(item_n); - return (PageIndex)pgm_read_word(menu_target_pages + item->page_callback_id); + return (PageIndex) item->page_callback_id; } uint8_t *MenuBase::get_dest_variable(uint8_t item_n) { diff --git a/avr/cores/megacommand/MCL/Menu.h b/avr/cores/megacommand/MCL/Menu.h index 703bd5057..2cec610e4 100644 --- a/avr/cores/megacommand/MCL/Menu.h +++ b/avr/cores/megacommand/MCL/Menu.h @@ -5,7 +5,6 @@ #define MAX_MENU_ITEMS 16 typedef void (*menu_function_t)(); -extern const PageIndex menu_target_pages[] PROGMEM; extern const menu_function_t menu_target_functions[] PROGMEM; extern const uint8_t* const menu_target_param[] PROGMEM; diff --git a/resource/menu_layouts.cpp b/resource/menu_layouts.cpp index 214b96318..451526802 100644 --- a/resource/menu_layouts.cpp +++ b/resource/menu_layouts.cpp @@ -15,10 +15,10 @@ menu_t boot_menu_layout = { "BOOT", { // m r n d p f o - {"OS UPGRADE", 0, 0, 0, 0, 0, 27, 0}, - {"DFU MODE", 0, 0, 0, 0, 0, 26, 0}, - {"USB DISK", 0, 0, 0, 0, 0, 28, 0}, - {"EXIT", 0, 0, 0, 0, 0, 29, 0}, + {"OS UPGRADE", 0, 0, 0, 0, 255, 27, 0}, + {"DFU MODE", 0, 0, 0, 0, 255, 26, 0}, + {"USB DISK", 0, 0, 0, 0, 255, 28, 0}, + {"EXIT", 0, 0, 0, 0, 255, 29, 0}, }, 0, 0 }; @@ -28,8 +28,8 @@ menu_t start_menu_layout = { "PROJECT", { // m r n d p f o - {"LOAD PROJECT", 0, 0, 0, 0, 1, 0, 0}, - {"NEW PROJECT", 0, 0, 0, 0, 0, 2, 0}, + {"LOAD PROJECT", 0, 0, 0, 0, LOAD_PROJ_PAGE, 0, 0}, + {"NEW PROJECT", 0, 0, 0, 0, 255, 2, 0}, }, 0, 0 }; @@ -38,13 +38,13 @@ menu_t system_menu_layout = { "CONFIG", { // m r n d p f o - {"LOAD PROJECT", 0, 0, 0, 0, 1, 0, 0}, + {"LOAD PROJECT", 0, 0, 0, 0, LOAD_PROJ_PAGE, 0, 0}, //{"CONV PROJECT", 0, 0, 0, 0, 2, 0, 0}, - {"NEW PROJECT", 0, 0, 0, 0, 0, 2, 0}, - {"MIDI", 0, 0, 0, 0, 3, 0, 0}, - {"MACHINEDRUM", 0, 0, 0, 0, 4, 0, 0}, - {"AUX PAGES", 0, 0, 0, 0, 6, 0, 0}, - {"SYSTEM", 0, 0, 0, 0, 7, 0, 0}, + {"NEW PROJECT", 0, 0, 0, 0, 255, 2, 0}, + {"MIDI", 0, 0, 0, 0, MIDI_CONFIG_PAGE, 0, 0}, + {"MACHINEDRUM", 0, 0, 0, 0, MD_CONFIG_PAGE, 0, 0}, + {"AUX PAGES", 0, 0, 0, 0, AUX_CONFIG_PAGE, 0, 0}, + {"SYSTEM", 0, 0, 0, 0, MCL_CONFIG_PAGE, 0, 0}, }, 0, 0 }; @@ -53,7 +53,7 @@ menu_t auxconfig_menu_layout = { "AUX PAGES", { // m r n d p f o - {"RAM Page" ,0, 0, 0, 0, 8, 0, 0}, + {"RAM Page" ,0, 0, 0, 0, RAM_CONFIG_PAGE, 0, 0}, }, 0, 0, }; @@ -62,7 +62,7 @@ menu_t rampage1_menu_layout = { "RAM PAGE", { // m r n d p f o - {"LINK:", 0, 2, 2, 1, 0, 0, 0}, + {"LINK:", 0, 2, 2, 1, 255, 0, 0}, }, 0, 0 }; @@ -70,11 +70,11 @@ menu_t rampage1_menu_layout = { menu_t midiconfig_menu_layout = { "MIDI", { - {"PORT CONFIG", 0, 0, 0, 0, 12, 0, 0}, - {"SYNC", 0, 0, 0, 0, 14, 0, 0}, - {"ROUTING", 0, 0, 0, 0, 15, 0, 0}, - {"PROGRAM", 0, 0, 0, 0, 13, 0, 0}, - {"MD MIDI", 0, 0, 0, 0, 16, 0 ,0}, + {"PORT CONFIG", 0, 0, 0, 0, MIDIPORT_MENU_PAGE, 0, 0}, + {"SYNC", 0, 0, 0, 0, MIDICLOCK_MENU_PAGE, 0, 0}, + {"ROUTING", 0, 0, 0, 0, MIDIROUTE_MENU_PAGE, 0, 0}, + {"PROGRAM", 0, 0, 0, 0, MIDIPROGRAM_MENU_PAGE, 0, 0}, + {"MD MIDI", 0, 0, 0, 0, MIDIMACHINEDRUM_MENU_PAGE, 0 ,0}, }, 0, 0 }; @@ -82,11 +82,11 @@ menu_t midiconfig_menu_layout = { menu_t midiport_menu_layout = { "PORTS", { - {"TURBO 1:", 0, 4, 4, 2, 0, 0, 2}, - {"TURBO 2:", 0, 4, 4, 3, 0, 0, 2}, - {"TURBO USB:", 0, 4, 4, 55, 0 , 0, 2}, - {"DRIVER 2:", 0, 2, 2, 4, 0, 0, 84}, - {"CTRL PORT:", 1, 4, 4, 56, 0, 0, 100}, + {"TURBO 1:", 0, 4, 4, 2, 255, 0, 2}, + {"TURBO 2:", 0, 4, 4, 3, 255, 0, 2}, + {"TURBO USB:", 0, 4, 4, 55, 255 , 0, 2}, + {"DRIVER 2:", 0, 2, 2, 4, 0, 255, 84}, + {"CTRL PORT:", 1, 4, 4, 56, 255, 0, 100}, }, 24, 0 }; @@ -94,9 +94,9 @@ menu_t midiport_menu_layout = { menu_t midiprogram_menu_layout = { "PROGRAM", { - {"PRG MODE:", 0, 2, 2, 49, 0, 0, 90}, - {"PRG IN:", 0, 18, 2, 47, 0, 0, 88}, - {"PRG OUT:", 0, 17, 2, 48, 0, 0, 88}, + {"PRG MODE:", 0, 2, 2, 49, 255, 0, 90}, + {"PRG IN:", 0, 18, 2, 47, 255, 0, 88}, + {"PRG OUT:", 0, 17, 2, 48, 255, 0, 88}, }, 24, 0 }; @@ -105,10 +105,10 @@ menu_t midiprogram_menu_layout = { menu_t midiclock_menu_layout = { "SYNC", { - {"CLOCK RECV:", 0, 3, 3, 5, 0, 0, 7}, - {"TRANS RECV:", 0, 3, 3, 53, 0, 0, 7}, - {"CLOCK SEND:", 0, 4, 4, 6, 0, 0, 100}, - {"TRANS SEND:", 0, 4, 4, 54, 0, 0, 100}, + {"CLOCK RECV:", 0, 3, 3, 5, 255, 0, 7}, + {"TRANS RECV:", 0, 3, 3, 53, 255, 0, 7}, + {"CLOCK SEND:", 0, 4, 4, 6, 0, 255, 100}, + {"TRANS SEND:", 0, 4, 4, 54, 255, 0, 100}, }, 24, 0 }; @@ -117,12 +117,12 @@ menu_t midiroute_menu_layout = { "ROUTE", { // m r n d p f o - {"MIDI 1 FWD:", 0, 4, 4, 7, 0, 0, 10}, - {"MIDI 2 FWD:", 0, 4, 4, 51, 0, 0, 92}, + {"MIDI 1 FWD:", 0, 4, 4, 7, 255, 0, 10}, + {"MIDI 2 FWD:", 0, 4, 4, 51, 255, 0, 92}, - {"USB FWD:", 0, 4, 4, 52, 0, 0, 96}, + {"USB FWD:", 0, 4, 4, 52, 255, 0, 96}, - {"CC LOOP:", 0, 2, 2, 11, 0, 0, 86}, + {"CC LOOP:", 0, 2, 2, 11, 255, 0, 86}, }, 24, 0 }; @@ -131,9 +131,9 @@ menu_t midimachinedrum_menu_layout = { "MD MIDI", { // m r n d p f o - {"CHRO CHAN:", 0, 18, 2, 9, 0, 0, 18}, - {"POLY CHAN:", 0, 18, 2, 46, 0, 0, 88}, - {"TRIG CHAN:", 0, 18, 2, 57, 0, 0, 18}, + {"CHRO CHAN:", 0, 18, 2, 9, 255, 0, 18}, + {"POLY CHAN:", 0, 18, 2, 46, 255, 0, 88}, + {"TRIG CHAN:", 0, 18, 2, 57, 255, 0, 18}, }, 24, 0 }; @@ -143,9 +143,9 @@ menu_t mdconfig_menu_layout = { "MD", { // m r n d p f o - {"IMPORT", 0, 0, 0, 0, 11, 0, 0}, - {"NORMALIZE:", 0, 2, 2, 8, 0, 0, 16}, - {"POLY CONFIG", 0, 0, 0, 0, 9, 0, 0}, + {"IMPORT", 0, 0, 0, 0, MD_IMPORT_PAGE, 0, 0}, + {"NORMALIZE:", 0, 2, 2, 8, 255, 0, 16}, + {"POLY CONFIG", 0, 0, 0, 0, POLY_PAGE, 0, 0}, }, 0, 0 }; @@ -154,10 +154,10 @@ menu_t mdimport_menu_layout = { "MD", { // m r n d p f o - {"SRC: ", 0, 128, 128, 43, 0, 0, 128}, - {"DEST: ", 0, 128, 128, 44, 0, 0, 128}, - {"COUNT:", 1, 128, 0, 45, 0, 0, 0}, - {"RUN", 0, 0, 0, 0, 0, 25, 0}, + {"SRC: ", 0, 128, 128, 43, 255, 0, 128}, + {"DEST: ", 0, 128, 128, 44, 255, 0, 128}, + {"COUNT:", 1, 128, 0, 45, 255, 0, 0}, + {"RUN", 0, 0, 0, 0, 255, 25, 0}, }, 0, 0 }; @@ -166,7 +166,7 @@ menu_t mclconfig_menu_layout = { "SYSTEM", { // m r n d p f o - {"DISPLAY:", 0, 2, 2, 13, 0, 0, 23}, + {"DISPLAY:", 0, 2, 2, 13, 255, 0, 23}, }, 1, 0 }; @@ -175,13 +175,13 @@ menu_t file_menu_layout = { "FILE", { // m r n d p f o - {"CANCEL", 0, 0, 0, 0, 0, 0, 0}, - {"NEW DIR.", 0, 0, 0, 0, 0, 0, 0}, - {"DELETE", 0, 0, 0, 0, 0, 0, 0}, - {"RENAME", 0, 0, 0, 0, 0, 0, 0}, - {"OVERWRITE", 0, 0, 0, 0, 0, 0, 0}, - {"RECV ALL", 0, 0, 0, 0, 0, 0, 0}, - {"SEND ALL", 0, 0, 0, 0, 0, 0, 0}, + {"CANCEL", 0, 0, 0, 0, 255, 0, 0}, + {"NEW DIR.", 0, 0, 0, 0, 255, 0, 0}, + {"DELETE", 0, 0, 0, 0, 255, 0, 0}, + {"RENAME", 0, 0, 0, 0, 255, 0, 0}, + {"OVERWRITE", 0, 0, 0, 0, 255, 0, 0}, + {"RECV ALL", 0, 0, 0, 0, 255, 0, 0}, + {"SEND ALL", 0, 0, 0, 0, 255, 0, 0}, }, 0, 0 }; @@ -190,28 +190,28 @@ menu_t seq_menu_layout = { "SEQ", { // m r n d p f o - {"TRACK SEL:", 1, 17, 0, 14, 0, 3, 0}, - {"DEVICE:", 1, 3, 2, 50, 0, 0, 128}, - {"EDIT:", 0, 4, 4, 15, 0, 4, 48}, - {"EDIT:", 0, 1 + NUM_LOCKS, 1, 16, 0, 0, 54}, - {"CC:", 0, 133, 5, 17, 0, 0, 55}, - {"SLIDE:", 0, 2, 2, 18, 0, 0, 25}, - {"ARPEGGIATOR", 0, 0, 0, 0, 10, 0, 0}, - {"TRANSPOSE:", 0, 12, 0, 19, 0, 0, 0}, - {"VEL:", 0, 128, 0, 20, 0, 0, 0}, - {"COND:", 1, NUM_TRIG_CONDITIONS + 1, NUM_TRIG_CONDITIONS + 1, 21, 0, 0, 60}, - {"SPEED:", 0, 7, 7, 22, 0, 5, 41}, - {"LENGTH:", 1, 129, 0, 23, 0, 6, 0}, - {"CHANNEL:", 1, 17, 0, 24, 0, 7, 0}, - {"COPY: ", 0, 3, 3, 25, 0, 8, 27}, - {"CLEAR:", 0, 3, 3, 26, 0, 9, 27}, - {"CLEAR:", 0, 3, 3, 26, 0, 10, 30}, - {"PASTE:", 0, 3, 3, 27, 0, 11, 27}, - {"SHIFT:", 0, 5, 5, 28, 0, 12, 35}, - {"REVERSE:", 0, 3, 3, 29, 0, 13, 27}, - {"POLYPHONY", 0, 0, 0, 0, 9, 0, 0}, - {"REC QUANT:", 0, 2, 2, 42, 0, 0, 25}, - {"SOUND", 0, 0, 0, 0, 17, 0, 0}, + {"TRACK SEL:", 1, 17, 0, 14, 255, 3, 0}, + {"DEVICE:", 1, 3, 2, 50, 255, 0, 128}, + {"EDIT:", 0, 4, 4, 15, 255, 4, 48}, + {"EDIT:", 0, 1 + NUM_LOCKS, 1, 16, 255, 0, 54}, + {"CC:", 0, 133, 5, 17, 255, 0, 55}, + {"SLIDE:", 0, 2, 2, 18, 255, 0, 25}, + {"ARPEGGIATOR", 0, 0, 0, 0, ARP_PAGE, 0, 0}, + {"TRANSPOSE:", 0, 12, 0, 19, 255, 0, 0}, + {"VEL:", 0, 128, 0, 20, 255, 0, 0}, + {"COND:", 1, NUM_TRIG_CONDITIONS + 1, NUM_TRIG_CONDITIONS + 1, 21, 255, 0, 60}, + {"SPEED:", 0, 7, 7, 22, 255, 5, 41}, + {"LENGTH:", 1, 129, 0, 23, 255, 6, 0}, + {"CHANNEL:", 1, 17, 0, 24, 255, 7, 0}, + {"COPY: ", 0, 3, 3, 25, 255, 8, 27}, + {"CLEAR:", 0, 3, 3, 26, 255, 9, 27}, + {"CLEAR:", 0, 3, 3, 26, 255, 10, 30}, + {"PASTE:", 0, 3, 3, 27, 255, 11, 27}, + {"SHIFT:", 0, 5, 5, 28, 255, 12, 35}, + {"REVERSE:", 0, 3, 3, 29, 255, 13, 27}, + {"POLYPHONY", 0, 0, 0, 0, POLY_PAGE, 0, 0}, + {"REC QUANT:", 0, 2, 2, 42, 255, 0, 25}, + {"SOUND", 0, 0, 0, 0, SOUND_BROWSER, 0, 0}, }, 14, 0 }; @@ -220,10 +220,10 @@ menu_t step_menu_layout = { "STP", { // m r n d p f o - {"CLEAR:", 0, 2, 2, 30, 0, 15, 30}, - {"COPY STEP", 0, 0, 0, 0, 0, 16, 0}, - {"PASTE STEP", 0, 0, 0, 0, 0, 17, 0}, - {"MUTE STEP", 0, 0, 0, 0, 0, 18, 0}, + {"CLEAR:", 0, 2, 2, 30, 255, 15, 30}, + {"COPY STEP", 0, 0, 0, 0, 255, 16, 0}, + {"PASTE STEP", 0, 0, 0, 0, 255, 17, 0}, + {"MUTE STEP", 0, 0, 0, 0, 255, 18, 0}, }, 19, 0 }; @@ -232,22 +232,22 @@ menu_t slot_menu_layout = { "Slot", { // m r n d p f o - {"GRID: ", 0, 2, 2, 31, 0, 0, 52}, - {"MODE:", 1, 4, 3, 32, 0, 0, 20}, + {"GRID: ", 0, 2, 2, 31, 255, 0, 52}, + {"MODE:", 1, 4, 3, 32, 255, 0, 20}, // for non-ext tracks - {"LEN: ", 1, 65, 0, 39, 0, 0, 0}, + {"LEN: ", 1, 65, 0, 39, 255, 0, 0}, // for ext tracks - {"LEN: ", 1, 129, 0, 39, 0, 0, 0}, - {"LOOP: ", 0, 64, 0, 33, 0, 0, 0}, + {"LEN: ", 1, 129, 0, 39, 255, 0, 0}, + {"LOOP: ", 0, 64, 0, 33, 255, 0, 0}, // o=128, generate the table on-demand - {"JUMP: ", 0, 128, 128, 34, 0, 0, 128}, + {"JUMP: ", 0, 128, 128, 34, 255, 0, 128}, #ifndef OLED_DISPLAY - {"APPLY:", 1, 21, 1, 35, 0, 0, 40}, + {"APPLY:", 1, 21, 1, 35, 255, 0, 40}, #endif - {"CLEAR:", 0, 2, 2, 36, 0, 0, 33}, - {"COPY: ", 0, 2, 2, 37, 0, 0, 33}, - {"PASTE:", 0, 2, 2, 38, 0, 0, 33}, - {"RENAME", 0, 0, 0, 0, 0, 20, 0}, + {"CLEAR:", 0, 2, 2, 36, 255, 0, 33}, + {"COPY: ", 0, 2, 2, 37, 255, 0, 33}, + {"PASTE:", 0, 2, 2, 38, 255, 0, 33}, + {"RENAME", 0, 0, 0, 0, 255, 20, 0}, }, 21, 0, }; @@ -256,9 +256,9 @@ menu_t<3> wavdesign_menu_layout = { "", { // m r n d p f o - {"EDIT:", 0, 4, 4, 40, 0, 0, 80}, - {"WAV:", 0, 6, 6, 41, 0, 0, 74}, - {"TRANSFER", 0, 0, 0, 0, 0, 22, 0}, + {"EDIT:", 0, 4, 4, 40, 255, 0, 80}, + {"WAV:", 0, 6, 6, 41, 255, 0, 74}, + {"TRANSFER", 0, 0, 0, 0, 255, 22, 0}, }, 23, 0 }; From 53b51cb3aab23c62e041351b8bb9c7b37d2ae0ad Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 26 Jun 2023 19:45:39 +1000 Subject: [PATCH 115/413] bug, need to cd to lwd on page enter now --- avr/cores/megacommand/MCL/MCL.h | 2 +- .../megacommand/MCL/SampleBrowserPage.cpp | 1 + avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 2 +- avr/cores/megacommand/MCL/SeqPage.cpp | 8 + avr/cores/megacommand/MCL/SeqPage.h | 2 +- avr/cores/megacommand/MCL/SeqPtcPage.cpp | 1 + avr/cores/megacommand/MCL/SeqStepPage.cpp | 1 + .../megacommand/MCL/SoundBrowserPage.cpp | 3 +- avr/cores/megacommand/WProgram.h | 2 +- avr/cores/megacommand/resources/R.h | 8 +- .../megacommand/resources/R_menu_layouts.cpp | 890 +++++++++--------- .../megacommand/resources/R_menu_options.cpp | 61 +- resource/menu_layouts.cpp | 2 +- resource/menu_options.cpp | 2 + 14 files changed, 538 insertions(+), 447 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCL.h b/avr/cores/megacommand/MCL/MCL.h index 81361727a..d497fe364 100644 --- a/avr/cores/megacommand/MCL/MCL.h +++ b/avr/cores/megacommand/MCL/MCL.h @@ -17,7 +17,7 @@ #include "Fonts/TomThumb.h" #define VERSION 4050 -#define VERSION_STR "R4.50" +#define VERSION_STR "S4.50" #define CALLBACK_TIMEOUT 500 #define GUI_NAME_TIMEOUT 800 diff --git a/avr/cores/megacommand/MCL/SampleBrowserPage.cpp b/avr/cores/megacommand/MCL/SampleBrowserPage.cpp index 68a0cadd4..495b6033c 100644 --- a/avr/cores/megacommand/MCL/SampleBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/SampleBrowserPage.cpp @@ -109,6 +109,7 @@ void SampleBrowserPage::init(uint8_t show_samplemgr_) { show_filemenu = true; show_new_folder = true; show_parent = true; + SD.chdir(lwd); query_filesystem(); } diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index fa1ca72d8..763c60722 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -30,7 +30,7 @@ void SeqExtStepPage::config() { } void SeqExtStepPage::config_encoders() { #ifdef EXT_TRACKS - + SeqPage::config_encoders(); seq_extparam1.max = 127; seq_extparam2.max = 127; seq_extparam3.max = 128; diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index b960aa1f7..427443a55 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -96,6 +96,11 @@ void SeqPage::disable_record() { clearLed2(); } +void SeqPage::config_encoders() { + seq_menu_entry_encoder.cur = 0; + seq_menu_page.cur_row = 0; +} + void SeqPage::init() { uint8_t _midi_lock_tmp = MidiUartParent::handle_midi_lock; MidiUartParent::handle_midi_lock = 0; @@ -236,6 +241,9 @@ void SeqPage::select_track(MidiDevice *device, uint8_t track, bool send) { else { DEBUG_PRINTLN("setting ext track"); last_ext_track = min(track, NUM_EXT_TRACKS - 1); + auto &active_track = mcl_seq.ext_tracks[last_ext_track]; + MD.sync_seqtrack(active_track.length, active_track.speed, + active_track.step_count); } #endif config_encoders(); diff --git a/avr/cores/megacommand/MCL/SeqPage.h b/avr/cores/megacommand/MCL/SeqPage.h index fad5896e7..db7e94b3e 100644 --- a/avr/cores/megacommand/MCL/SeqPage.h +++ b/avr/cores/megacommand/MCL/SeqPage.h @@ -157,7 +157,7 @@ class SeqPage : public LightPage { virtual void setup(); virtual void init(); virtual void cleanup(); - virtual void config_encoders() = 0; + virtual void config_encoders(); static constexpr uint8_t pidx_x0 = 0; static constexpr uint8_t pidx_y = 15; static constexpr uint8_t pidx_w = 6; diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.cpp b/avr/cores/megacommand/MCL/SeqPtcPage.cpp index c39014f15..38a64298b 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPtcPage.cpp @@ -50,6 +50,7 @@ void SeqPtcPage::cleanup() { params_reset(); } void SeqPtcPage::config_encoders() { + SeqPage::config_encoders(); ptc_param_len.min = 1; bool show_chan = true; if (midi_device == &MD) { diff --git a/avr/cores/megacommand/MCL/SeqStepPage.cpp b/avr/cores/megacommand/MCL/SeqStepPage.cpp index 426566f72..e65f7751d 100644 --- a/avr/cores/megacommand/MCL/SeqStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqStepPage.cpp @@ -36,6 +36,7 @@ void SeqStepPage::config() { } void SeqStepPage::config_encoders() { + SeqPage::config_encoders(); uint8_t timing_mid = mcl_seq.md_tracks[last_md_track].get_timing_mid(); seq_param3.cur = mcl_seq.md_tracks[last_md_track].length; seq_param3.old = seq_param3.cur; diff --git a/avr/cores/megacommand/MCL/SoundBrowserPage.cpp b/avr/cores/megacommand/MCL/SoundBrowserPage.cpp index 654e79671..54dd0f6f5 100644 --- a/avr/cores/megacommand/MCL/SoundBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/SoundBrowserPage.cpp @@ -26,6 +26,7 @@ void SoundBrowserPage::init() { show_filemenu = true; show_new_folder = true; show_parent = true; + SD.chdir(lwd); query_filesystem(); strcpy(str_save, "[ SAVE ]"); @@ -91,7 +92,7 @@ void SoundBrowserPage::on_new() { } void SoundBrowserPage::on_cancel() { - if (strcmp(lwd, "/") == 0) { mcl.setPage(SEQ_STEP_PAGE); return; } + if (strcmp(lwd, "/") == 0) { mcl.popPage(); return; } _cd_up(); } diff --git a/avr/cores/megacommand/WProgram.h b/avr/cores/megacommand/WProgram.h index 813e42c8f..39fb718e1 100644 --- a/avr/cores/megacommand/WProgram.h +++ b/avr/cores/megacommand/WProgram.h @@ -11,7 +11,7 @@ #include "wiring_private.h" -#define DEBUGMODE +//#define DEBUGMODE #ifdef MEGACOMMAND #define SD_CS 53 //PB0 diff --git a/avr/cores/megacommand/resources/R.h b/avr/cores/megacommand/resources/R.h index 9aa06e84c..1933a165f 100644 --- a/avr/cores/megacommand/resources/R.h +++ b/avr/cores/megacommand/resources/R.h @@ -415,11 +415,11 @@ extern const unsigned char __R_menu_options[] PROGMEM; struct __T_menu_options { union { menu_option_t MENU_OPTIONS[0]; - char zz__MENU_OPTIONS[936]; + char zz__MENU_OPTIONS[1044]; }; - static constexpr size_t countof_MENU_OPTIONS = 936 / sizeof(menu_option_t); - static constexpr size_t sizeofof_MENU_OPTIONS = 936; - static constexpr size_t __total_size = 936; + static constexpr size_t countof_MENU_OPTIONS = 1044 / sizeof(menu_option_t); + static constexpr size_t sizeofof_MENU_OPTIONS = 1044; + static constexpr size_t __total_size = 1044; }; extern const unsigned char __R_page_entries[] PROGMEM; diff --git a/avr/cores/megacommand/resources/R_menu_layouts.cpp b/avr/cores/megacommand/resources/R_menu_layouts.cpp index cb07946ad..44fe0e98f 100644 --- a/avr/cores/megacommand/resources/R_menu_layouts.cpp +++ b/avr/cores/megacommand/resources/R_menu_layouts.cpp @@ -16,154 +16,159 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 4, 4, 40, - 111, - 4, + 253, + 255, + 0, 80, 87, 65, - 176, 86, + 128, 19, - 31, + 251, 0, 6, 6, 41, - 111, - 4, + 20, + 127, 74, 84, 82, - 253, 65, 78, 83, + 236, 70, 69, 82, - 128, - 24, + 23, + 191, 255, 22, 0, 23, + 251, 0, 83, 108, 111, - 179, 116, - 13, - 253, + 14, + 63, 71, 82, 73, 68, + 217, 58, 32, - 147, - 28, + 29, + 61, 2, - 219, 2, 31, - 4, + 191, + 53, 52, - 246, 77, 79, 68, 69, + 101, 75, - 95, + 251, 1, 4, 3, - 119, 32, 20, + 125, + 20, 76, 69, - 181, 78, + 173, 40, - 172, 0, + 97, 20, - 62, + 251, 65, 0, 39, - 230, + 255, 6, + 89, 20, - 67, + 12, 129, - 39, + 159, 79, - 216, 79, 80, + 96, 83, - 15, + 61, 64, 0, 33, - 187, - 0, - 138, + 220, + 20, + 74, 85, 77, - 96, - 20, - 125, + 129, + 251, 128, 128, 34, - 214, + 255, 4, + 109, 67, 63, - 246, + 236, 65, 82, 58, 125, - 3, + 7, 36, - 182, - 0, + 255, + 109, 44, 67, - 219, + 183, 61, 89, 84, - 153, + 50, 20, - 115, + 230, 37, - 125, + 251, 80, 65, 83, 84, 69, - 129, 41, - 221, + 3, + 186, 38, 20, 82, - 111, + 222, 125, 65, 77, 69, - 96, - 219, - 46, - 166, + 214, + 244, + 221, + 3, + 20, 237, 0, 21, @@ -171,12 +176,12 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 41, 176, 80, - 13, + 14, 89, 95, 79, 30, - 0, + 255, 15, 158, 30, @@ -192,130 +197,132 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 95, 194, 21, - 253, + 126, + 255, 17, 0, 77, 85, - 145, + 214, 19, - 251, - 0, + 41, + 67, 18, + 219, 0, 19, 95, - 118, 69, + 176, 81, - 13, - 8, - 110, + 14, + 67, 94, + 118, 67, 75, 32, - 221, 15, + 236, 76, 58, - 139, 254, + 91, 49, - 124, 14, - 0, + 225, + 255, 3, 0, - 47, 59, + 123, 86, 73, 67, - 100, 171, - 251, + 39, 1, 3, + 220, 2, 50, 233, - 130, + 18, 178, - 83, + 159, 15, - 109, - 3, + 255, + 4, 48, - 144, + 100, 20, - 246, + 61, 9, 1, 16, - 4, - 251, + 190, + 41, 54, 67, 67, 58, - 208, - 3, - 237, + 192, + 209, + 251, 133, 5, 17, - 4, - 225, + 20, + 120, 55, 83, 76, + 86, 166, - 88, 254, - 77, + 19, 18, - 182, - 4, + 109, + 20, 25, + 191, 218, - 255, 80, 69, 71, 71, 73, + 225, 65, 84, - 132, 79, 223, - 59, - 10, - 146, - 66, - 241, - 61, - 80, - 79, - 83, - 131, - 45, 12, - 107, - 175, - 5, - 172, + 55, + 52, + 75, + 69, + 89, + 96, + 63, + 125, + 12, + 12, + 19, + 187, + 41, + 104, 86, 161, - 66, + 16, + 150, 124, - 88, - 96, - 38, - 220, - 28, - 79, + 20, + 205, + 48, + 145, + 92, + 7, 78, 68, 32, @@ -325,7 +332,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 15, 21, 187, - 5, + 20, 60, 83, 82, @@ -335,569 +342,588 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 7, 7, 7, - 27, - 46, + 240, + 22, + 255, 5, - 134, 41, + 222, 229, - 236, 71, 84, 72, - 209, - 152, - 129, - 235, - 65, + 58, + 75, + 237, + 23, + 255, 6, 62, - 109, + 141, 72, - 104, + 90, 178, 78, 87, 93, 251, 24, - 108, - 45, + 225, + 255, + 7, 0, - 36, 187, - 63, + 33, + 252, 3, 3, 25, - 0, + 255, 8, - 132, 27, + 33, 133, - 45, - 214, + 110, 20, + 228, 26, - 234, - 176, - 20, - 15, + 255, + 9, + 3, + 194, 10, 30, - 8, 229, - 91, + 22, + 239, 20, - 191, 27, - 0, + 255, 11, 27, + 240, 83, 72, - 194, 73, 70, + 128, 38, - 3, + 254, 5, - 219, 5, 28, - 213, + 255, + 12, 35, - 10, + 21, 250, - 219, + 187, 211, 82, - 228, - 153, + 83, + 43, + 89, 41, - 62, + 63, 29, - 0, + 255, 13, 27, - 223, - 246, + 80, + 251, + 79, 76, 89, 80, 72, - 108, 214, + 108, 89, - 37, - 82, - 181, + 44, + 155, + 11, 2, - 190, + 91, 41, 67, + 237, 32, 81, 85, - 214, 171, + 104, 66, - 132, + 65, 58, - 25, + 155, 42, - 187, 83, 79, + 180, 85, 252, - 70, - 56, - 6, - 24, + 32, + 102, + 99, + 184, + 91, + 2, + 14, 237, - 54, - 188, + 0, 70, 73, - 209, 149, - 130, + 24, 57, - 219, + 45, 48, + 180, 67, 220, - 108, - 0, - 0, + 97, + 90, 45, - 184, + 2, + 110, 238, 87, 32, - 93, + 23, 178, 82, 46, - 129, + 96, 20, - 134, + 97, 238, - 107, + 154, 51, + 214, 180, - 89, 41, - 8, - 202, + 66, + 50, 153, - 221, - 0, + 183, + 20, + 93, 79, - 117, 178, 87, - 43, + 74, 111, + 214, 44, - 11, - 119, - 158, + 41, + 23, + 67, + 249, 86, 32, 65, - 176, 76, - 106, - 182, + 76, + 9, + 107, 216, - 181, 157, - 148, + 89, 20, - 186, + 75, 22, + 161, 89, - 26, 30, + 175, 77, - 198, - 116, - 73, - 23, + 9, + 104, + 133, + 92, 168, 76, 65, - 10, - 106, - 50, - 15, - 109, + 33, + 233, + 186, + 212, 13, - 4, - 198, + 220, + 32, 23, 1, + 107, 176, - 217, - 68, - 42, - 58, + 211, + 39, + 83, 82, + 166, 67, - 100, 109, - 128, + 72, 110, - 220, + 12, 43, - 4, - 214, + 115, + 132, 170, + 90, 63, - 164, + 144, 131, - 38, + 153, 44, - 112, - 193, + 195, 10, + 4, 94, - 46, + 184, 1, - 54, + 219, 27, 45, - 246, 149, + 218, 19, - 176, - 123, - 176, - 205, - 51, - 3, - 96, + 25, + 29, + 132, + 191, + 218, + 25, + 4, + 192, 95, - 52, + 105, 73, - 163, 205, + 70, 117, - 108, + 216, 84, + 32, + 28, + 33, + 51, 31, - 14, - 11, - 25, - 31, - 182, 18, + 109, 77, 181, - 240, + 225, 73, 90, 69, - 135, 106, + 14, 8, - 76, - 90, - 30, + 216, + 74, + 16, + 120, 148, 32, - 56, + 224, 107, - 44, + 176, 91, 71, - 36, + 146, 148, - 177, + 199, 74, - 237, 32, 77, + 180, 73, 198, - 15, + 63, 106, 72, - 227, 82, 79, + 143, 32, 77, - 217, + 103, 53, - 247, 18, + 237, 2, 9, + 255, 4, - 61, + 123, 53, - 132, 20, - 134, - 116, - 141, + 9, + 150, + 46, 88, - 219, - 107, + 149, + 110, + 172, 67, 20, - 9, - 186, + 38, 57, - 4, + 235, + 41, 24, - 214, 172, + 90, 193, - 132, + 16, 83, - 23, + 95, 81, - 252, 32, + 241, 49, 32, 70, 87, - 106, + 169, 194, - 78, 101, + 59, 7, - 153, - 19, - 140, + 32, + 108, + 10, 20, + 100, 50, - 128, - 219, + 6, 51, - 4, + 95, 92, - 236, 85, 83, 66, + 96, 17, - 20, - 131, + 164, 143, + 27, 52, - 110, - 4, + 20, + 113, 96, 67, - 53, + 171, 41, - 120, 187, - 75, + 194, 85, - 118, - 211, + 93, + 11, + 184, + 20, 86, 24, - 24, + 97, 118, - 106, + 171, 11, - 195, 79, - 166, + 14, 79, + 152, 239, - 15, + 60, 178, 58, - 25, + 103, 117, - 211, 5, - 34, - 36, - 113, - 88, + 108, + 32, + 7, + 8, + 99, + 176, 20, - 28, + 57, 53, - 204, + 153, 41, - 195, + 134, 199, - 48, + 97, 116, - 237, + 194, 6, - 4, - 177, + 65, + 216, 100, 41, - 96, + 176, 20, - 115, - 54, + 59, 54, + 41, + 109, + 100, 95, + 182, 80, - 219, 192, 71, + 208, 25, - 67, + 206, 215, - 57, 9, - 160, + 104, 223, - 75, + 18, 124, - 117, + 221, 128, 49, - 183, - 4, + 109, + 32, 90, + 246, 20, - 216, 73, 242, - 176, + 44, 245, - 97, + 24, 47, + 103, 10, - 158, 20, - 230, + 185, 246, + 135, 21, - 31, 17, + 220, 2, 48, - 115, 20, + 224, 74, - 131, + 213, 148, - 86, 83, + 159, 154, - 126, 85, 82, 66, + 133, 79, - 21, 11, - 151, + 101, 224, + 237, 2, - 115, + 255, 79, + 103, 20, - 57, 50, - 46, + 37, + 201, 3, - 73, - 13, + 33, 16, + 172, 58, - 96, 20, - 205, + 25, 55, + 161, 68, - 10, 106, - 57, + 71, 173, - 172, + 53, 42, + 147, 137, - 155, 4, - 82, - 173, + 110, + 191, + 84, 67, + 221, 192, - 222, 76, 32, + 235, 98, - 179, 238, - 109, + 54, 41, + 216, 56, - 136, 191, - 77, + 132, 199, - 204, + 220, 0, + 196, 126, - 66, + 33, 235, - 18, - 184, - 127, - 38, + 120, + 34, + 0, + 77, 62, - 192, + 132, + 0, + 225, + 36, 0, - 211, - 104, - 4, 179, - 91, + 22, 212, + 216, 71, - 96, 20, - 32, - 80, + 14, + 37, + 0, 16, - 134, 8, - 192, + 216, 20, - 99, - 13, + 12, + 35, + 100, 40, - 44, - 8, - 173, - 24, - 231, - 161, + 176, + 20, + 27, + 38, + 4, + 220, 39, - 55, + 220, 138, 65, 71, - 13, + 53, 247, 76, - 109, + 181, 71, 75, - 101, + 150, 221, - 186, + 234, 170, 1, - 199, - 7, + 71, + 44, 65, 85, 177, @@ -912,7 +938,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 101, 35, 184, - 8, + 31, 118, 204, 167, @@ -924,106 +950,110 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 93, 124, 74, - 181, - 69, - 225, - 32, - 6, - 164, + 10, + 195, + 48, + 210, + 105, + 25, 236, - 88, + 22, 19, - 91, - 90, - 153, + 18, + 154, + 2, + 2, + 197, 234, - 107, - 163, - 45, - 209, + 133, + 203, + 221, + 26, 161, 65, - 173, + 26, 147, + 208, 131, - 2, + 42, 54, - 165, + 86, 52, - 97, 186, - 216, - 4, + 29, + 27, + 128, 126, - 8, - 146, - 145, - 210, + 178, + 41, + 105, + 29, 192, - 2, - 4, - 96, - 176, - 236, + 13, + 129, + 62, + 195, + 30, 54, + 176, 102, - 22, + 88, 137, - 16, - 110, - 3, - 141, + 65, + 186, + 4, 66, + 53, 170, - 96, + 131, 15, - 129, - 237, - 66, + 79, + 133, + 83, 190, - 195, + 134, 80, 57, - 86, + 26, + 56, + 146, + 173, + 91, + 129, 68, - 89, - 93, - 27, - 110, - 34, + 198, 70, 85, - 49, 75, - 96, - 108, - 32, - 81, - 98, - 235, + 41, + 194, + 1, + 104, + 171, + 245, 246, + 214, 59, - 172, 75, 20, - 6, + 3, 28, - 45, + 22, 78, - 173, + 214, 88, 147, - 73, + 164, 236, - 13, + 134, 29, - 192, - 3, + 224, + 4, 0, 0, 0, 0, 0, - 159, + 79, 255, }; diff --git a/avr/cores/megacommand/resources/R_menu_options.cpp b/avr/cores/megacommand/resources/R_menu_options.cpp index d0695cd40..3878776e8 100644 --- a/avr/cores/megacommand/resources/R_menu_options.cpp +++ b/avr/cores/megacommand/resources/R_menu_options.cpp @@ -331,10 +331,10 @@ const unsigned char __R_menu_options[] PROGMEM = { 134, 198, 77, - 198, - 82, - 117, - 14, + 132, + 123, + 30, + 79, 83, 67, 198, @@ -405,12 +405,59 @@ const unsigned char __R_menu_options[] PROGMEM = { 50, 41, 8, - 64, + 225, + 65, + 211, + 15, + 65, + 35, + 96, + 35, + 216, + 66, + 71, + 109, + 148, + 8, + 148, + 54, + 67, + 26, + 14, + 5, + 68, + 193, + 17, + 200, + 6, + 68, + 52, + 7, + 161, + 30, + 148, + 5, + 161, + 105, + 148, + 6, + 70, + 193, + 26, + 141, + 10, + 16, + 8, + 148, + 54, + 71, + 17, + 8, 0, 0, 0, 0, - 1, - 63, + 0, + 39, 255, }; diff --git a/resource/menu_layouts.cpp b/resource/menu_layouts.cpp index 451526802..c1b932c5d 100644 --- a/resource/menu_layouts.cpp +++ b/resource/menu_layouts.cpp @@ -197,7 +197,7 @@ menu_t seq_menu_layout = { {"CC:", 0, 133, 5, 17, 255, 0, 55}, {"SLIDE:", 0, 2, 2, 18, 255, 0, 25}, {"ARPEGGIATOR", 0, 0, 0, 0, ARP_PAGE, 0, 0}, - {"TRANSPOSE:", 0, 12, 0, 19, 255, 0, 0}, + {"KEY:", 0, 12, 12, 19, 255, 0, 104}, {"VEL:", 0, 128, 0, 20, 255, 0, 0}, {"COND:", 1, NUM_TRIG_CONDITIONS + 1, NUM_TRIG_CONDITIONS + 1, 21, 255, 0, 60}, {"SPEED:", 0, 7, 7, 22, 255, 5, 41}, diff --git a/resource/menu_options.cpp b/resource/menu_options.cpp index c729ba90d..2b04c282b 100644 --- a/resource/menu_options.cpp +++ b/resource/menu_options.cpp @@ -62,5 +62,7 @@ menu_option_t MENU_OPTIONS[] = { {0, "OFF"}, {1, "1"}, {2, "2"}, {3, "1 + 2"}, // 100: MIDI CLK SEND {0, "OFF"}, {1, "2"}, {2, "USB"}, {3, "2 + USB"}, + // 104: NOTES + {0, "A"}, {1, "A#"}, {2, "B"}, {3, "C"}, {4, "C#"}, {5, "D"}, {6, "D#"}, {7, "E"}, {8, "F"}, {9, "F#"}, {10, "G"}, {11, "G#"} }; From 533b6673ef649fd826a1bd6de90100b57d2f05dc Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 26 Jun 2023 22:01:16 +1000 Subject: [PATCH 116/413] lfo page regression --- avr/cores/megacommand/MCL/MCLGUI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/MCLGUI.cpp b/avr/cores/megacommand/MCL/MCLGUI.cpp index cca2c49e7..e07fddf8e 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.cpp +++ b/avr/cores/megacommand/MCL/MCLGUI.cpp @@ -734,7 +734,7 @@ void MCLGUI::draw_panel_toggle(const char *s1, const char *s2, bool s1_active) { oled_display.setTextColor(BLACK); } - if (mcl.currentPage() == SEQ_PTC_PAGE) { + if (mcl.currentPage() == SEQ_PTC_PAGE || mcl.currentPage() == LFO_PAGE) { oled_display.setCursor(pane_label_x + 1, pane_label_ex_y + 6); oled_display.print(s2); oled_display.setTextColor(WHITE); From 21d03cf1a6e088f4cea9b7916c2865c6f907b6ef Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 26 Jun 2023 22:33:40 +1000 Subject: [PATCH 117/413] fix regression PageSelectPage. we can probably optimise this one later --- avr/cores/megacommand/MCL/PageSelectPage.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/avr/cores/megacommand/MCL/PageSelectPage.cpp b/avr/cores/megacommand/MCL/PageSelectPage.cpp index 4f54548e4..1e22c2f17 100644 --- a/avr/cores/megacommand/MCL/PageSelectPage.cpp +++ b/avr/cores/megacommand/MCL/PageSelectPage.cpp @@ -15,10 +15,10 @@ static uint8_t get_pageidx(uint8_t page_number) { uint8_t i = 0; for (; i < R.page_entries->countof_Entries; ++i) { if (page_number == R.page_entries->Entries[i].PageNumber) { - break; + return i; } } - return i; + return 255; } static PageIndex get_page(uint8_t pageidx, char *str) { @@ -31,7 +31,7 @@ static PageIndex get_page(uint8_t pageidx, char *str) { if (str) { strncpy(str, "----", 5); } - return NULL; + return 255; } } @@ -126,7 +126,7 @@ void PageSelectPage::cleanup() { uint8_t PageSelectPage::get_nextpage_down() { for (int8_t i = page_select - 1; i >= 0; i--) { - if (get_page(get_pageidx(i), nullptr)) { + if (get_page(get_pageidx(i), nullptr) != 255) { return i; } } @@ -135,7 +135,7 @@ uint8_t PageSelectPage::get_nextpage_down() { uint8_t PageSelectPage::get_nextpage_up() { for (uint8_t i = page_select + 1; i < 16; i++) { - if (get_page(get_pageidx(i), nullptr)) { + if (get_page(get_pageidx(i), nullptr) != 255) { return i; } } @@ -356,7 +356,7 @@ bool PageSelectPage::handleEvent(gui_event_t *event) { release: PageIndex p; p = get_page(get_pageidx(page_select), nullptr); - if (BUTTON_DOWN(Buttons.BUTTON1) || (!p)) { + if (BUTTON_DOWN(Buttons.BUTTON1) || (p == 255)) { GUI.ignoreNextEvent(Buttons.BUTTON1); // md_exploit.off(); mcl.setPage(GRID_PAGE); From 3f28a15ffeb357bdff27aa43ab85609836469c4e Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 26 Jun 2023 22:41:10 +1000 Subject: [PATCH 118/413] woops, forgot to checkin --- avr/cores/megacommand/MCL/MidiDeviceGrid.h | 61 ++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 avr/cores/megacommand/MCL/MidiDeviceGrid.h diff --git a/avr/cores/megacommand/MCL/MidiDeviceGrid.h b/avr/cores/megacommand/MCL/MidiDeviceGrid.h new file mode 100644 index 000000000..37e678cab --- /dev/null +++ b/avr/cores/megacommand/MCL/MidiDeviceGrid.h @@ -0,0 +1,61 @@ +#pragma once; + +#include "Grid.h" + +#define GROUP_DEV 0 +#define GROUP_AUX 1 +#define GROUP_TEMPO 2 +#define EMPTY_TRACK_TYPE 0 + +class SeqTrack; + +class GridDeviceTrack { +public: + uint8_t device_idx; + uint8_t track_type; + uint8_t group_type; + uint8_t mem_slot_idx; + SeqTrack *seq_track; + + GridDeviceTrack() { + init(); + } + + void init(uint8_t _track_type = EMPTY_TRACK_TYPE, uint8_t _group_type = GROUP_DEV, uint8_t _device_idx = 255, SeqTrack *_seq_track = nullptr, uint8_t _mem_slot_idx = 255) { + track_type = _track_type; + group_type = _group_type; + mem_slot_idx = _mem_slot_idx; + seq_track = _seq_track; + device_idx = _device_idx; + } + + SeqTrack *get_seq_track() { return seq_track; } + bool isActive() { return track_type != EMPTY_TRACK_TYPE; } +}; + + +class MidiDeviceGrid : public Grid { + + public: + GridDeviceTrack tracks[GRID_WIDTH]; + + void add_track(uint8_t track_idx, GridDeviceTrack *gdt) { + if (gdt->mem_slot_idx == 255) { gdt->mem_slot_idx = track_idx; } + DEBUG_PRINTLN("adding device track"); + DEBUG_PRINTLN(track_idx); + DEBUG_PRINTLN(gdt->track_type); + DEBUG_PRINTLN(gdt->mem_slot_idx); + memcpy(tracks + track_idx, gdt, sizeof(GridDeviceTrack)); + } + void cleanup(uint8_t device_idx) { + for (uint8_t n = 0; n < GRID_WIDTH; n++) { + if (tracks[n].device_idx == device_idx) { tracks[n].init(); } + } + } + + void init() { + for (uint8_t n = 0; n < GRID_WIDTH; n++) { + tracks[n].init(); + } + } +}; From 582964fe157fcd740d47bfc1690b9dcc9d5192fa Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 27 Jun 2023 14:10:57 +1000 Subject: [PATCH 119/413] limit to 64 steps --- avr/cores/megacommand/MCL/SeqPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index 427443a55..9ecf5c601 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -242,7 +242,7 @@ void SeqPage::select_track(MidiDevice *device, uint8_t track, bool send) { DEBUG_PRINTLN("setting ext track"); last_ext_track = min(track, NUM_EXT_TRACKS - 1); auto &active_track = mcl_seq.ext_tracks[last_ext_track]; - MD.sync_seqtrack(active_track.length, active_track.speed, + MD.sync_seqtrack(min(active_track.length,64), active_track.speed, active_track.step_count); } #endif From 9f38976e31ed0187bb82a0a179431a83d5c18ba6 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 27 Jun 2023 23:16:56 +1000 Subject: [PATCH 120/413] PerfPage WIP --- avr/cores/megacommand/MCL/AuxPages.cpp | 23 +- avr/cores/megacommand/MCL/AuxPages.h | 7 + avr/cores/megacommand/MCL/MCL.cpp | 4 +- avr/cores/megacommand/MCL/MCL.h | 7 +- avr/cores/megacommand/MCL/PerfData.h | 35 +++ avr/cores/megacommand/MCL/PerfEncoder.cpp | 37 +++ avr/cores/megacommand/MCL/PerfEncoder.h | 30 ++ avr/cores/megacommand/MCL/PerfPage.cpp | 292 ++++++++++++++++++ avr/cores/megacommand/MCL/PerfPage.h | 52 ++++ avr/cores/megacommand/ResourceManager.cpp | 4 + avr/cores/megacommand/resources/R.h | 8 +- .../megacommand/resources/R_page_entries.cpp | 62 ++-- resource/page_entries.cpp | 1 + 13 files changed, 520 insertions(+), 42 deletions(-) create mode 100644 avr/cores/megacommand/MCL/PerfData.h create mode 100644 avr/cores/megacommand/MCL/PerfEncoder.cpp create mode 100644 avr/cores/megacommand/MCL/PerfEncoder.h create mode 100644 avr/cores/megacommand/MCL/PerfPage.cpp create mode 100644 avr/cores/megacommand/MCL/PerfPage.h diff --git a/avr/cores/megacommand/MCL/AuxPages.cpp b/avr/cores/megacommand/MCL/AuxPages.cpp index 6ce9b0132..c9ec6c485 100644 --- a/avr/cores/megacommand/MCL/AuxPages.cpp +++ b/avr/cores/megacommand/MCL/AuxPages.cpp @@ -1,17 +1,22 @@ #include "MCL_impl.h" -MCLEncoder mixer_param1(0, 127); -MCLEncoder mixer_param2(0, 127); -MCLEncoder mixer_param3(0, 127); -MCLEncoder mixer_param4(0, 127); +MCLEncoder mixer_param1; +MCLEncoder mixer_param2; +MCLEncoder mixer_param3; +MCLEncoder mixer_param4; MCLEncoder route_param1(2, 5); MCLExpEncoder route_param2(1, 64); -MCLEncoder fx_param1(0, 127); -MCLEncoder fx_param2(0, 127); -MCLEncoder fx_param3(0, 127); -MCLEncoder fx_param4(0, 127); +MCLEncoder fx_param1; +MCLEncoder fx_param2; +MCLEncoder fx_param3; +MCLEncoder fx_param4; + +PerfEncoder perf_param1; +PerfEncoder perf_param2; +PerfEncoder perf_param3; +PerfEncoder perf_param4; MixerPage mixer_page(&mixer_param1, &mixer_param2, &mixer_param3, &mixer_param4); @@ -46,3 +51,5 @@ FXPage fx_page_b(&fx_param1, &fx_param2, &fx_param3, &fx_param4, LFOPage lfo_page(&(mcl_seq.lfo_tracks[0]), &fx_param1, &fx_param2, &fx_param3, &fx_param4); +PerfPage perf_page(&perf_param1, &perf_param2, &perf_param3, &perf_param4); + diff --git a/avr/cores/megacommand/MCL/AuxPages.h b/avr/cores/megacommand/MCL/AuxPages.h index d6baba8bb..134768670 100644 --- a/avr/cores/megacommand/MCL/AuxPages.h +++ b/avr/cores/megacommand/MCL/AuxPages.h @@ -9,6 +9,7 @@ #include "RoutePage.h" #include "RAMPage.h" #include "FXPage.h" +#include "PerfPage.h" #include "MD.h" extern MCLEncoder mixer_param1; @@ -29,9 +30,15 @@ extern MCLEncoder fx_param2; extern MCLEncoder fx_param3; extern MCLEncoder fx_param4; +extern PerfEncoder perf_param1; +extern PerfEncoder perf_param2; +extern PerfEncoder perf_param3; +extern PerfEncoder perf_param4; + extern FXPage fx_page_a; extern FXPage fx_page_b; extern LFOPage lfo_page; +extern PerfPage perf_page; #endif /* AUXPAGES_H__ */ diff --git a/avr/cores/megacommand/MCL/MCL.cpp b/avr/cores/megacommand/MCL/MCL.cpp index 795c2d7c4..dd97dad36 100644 --- a/avr/cores/megacommand/MCL/MCL.cpp +++ b/avr/cores/megacommand/MCL/MCL.cpp @@ -76,7 +76,8 @@ static LightPage *const MCL::pages_table[NUM_PAGES] PROGMEM = { &midiclock_menu_page, // Index: 36 &midiroute_menu_page, // Index: 37 &midimachinedrum_menu_page,// Index: 38 - &sound_browser // Index: 39 + &sound_browser, // Index: 39 + &perf_page // Index: 40 }; void MCL::setup() { @@ -170,6 +171,7 @@ void MCL::setup() { #endif } param4.cur = 4; + mcl.pushPage(PERF_PAGE_0); } bool mcl_handleEvent(gui_event_t *event) { diff --git a/avr/cores/megacommand/MCL/MCL.h b/avr/cores/megacommand/MCL/MCL.h index d497fe364..6d6d9b9d7 100644 --- a/avr/cores/megacommand/MCL/MCL.h +++ b/avr/cores/megacommand/MCL/MCL.h @@ -17,7 +17,7 @@ #include "Fonts/TomThumb.h" #define VERSION 4050 -#define VERSION_STR "S4.50" +#define VERSION_STR "T4.50" #define CALLBACK_TIMEOUT 500 #define GUI_NAME_TIMEOUT 800 @@ -74,13 +74,14 @@ enum PageIndex { MIDICLOCK_MENU_PAGE, // Index: 36 MIDIROUTE_MENU_PAGE, // Index: 37 MIDIMACHINEDRUM_MENU_PAGE,// Index: 38 - SOUND_BROWSER // Index: 39 + SOUND_BROWSER, // Index: 39 + PERF_PAGE_0 // Index: 40 }; class MCL { public: - static constexpr uint8_t NUM_PAGES = 40; + static constexpr uint8_t NUM_PAGES = 41; static LightPage *const pages_table[NUM_PAGES] PROGMEM; diff --git a/avr/cores/megacommand/MCL/PerfData.h b/avr/cores/megacommand/MCL/PerfData.h new file mode 100644 index 000000000..29e6ccbf3 --- /dev/null +++ b/avr/cores/megacommand/MCL/PerfData.h @@ -0,0 +1,35 @@ +/* Copyright Justin Mammarella jmamma@gmail.com 2018 */ + +#ifndef PERFDATATRACK_H__ +#define PERFDATATRACK_H__ +#include "WProgram.h" +#include "PerfData.h" + +#define NUM_PERF_PARAMS 8 +#define PERF_SETTINGS NUM_NUM_PERF_PARAMS +class PerfParam { +public: + uint8_t dest; + uint8_t param; + uint8_t min; + uint8_t max; +}; + +class PerfData { +public: + PerfParam params[NUM_PERF_PARAMS]; + + PerfData() { init(); } + + void *data() const { return (void *)¶ms; } + void init() { + for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { + params[a].dest = 0; + params[a].param = 0; + params[a].min = 0; + params[a].max = 127; + } + } +}; + +#endif /* PERFDATATRACK_H__ */ diff --git a/avr/cores/megacommand/MCL/PerfEncoder.cpp b/avr/cores/megacommand/MCL/PerfEncoder.cpp new file mode 100644 index 000000000..0986ab802 --- /dev/null +++ b/avr/cores/megacommand/MCL/PerfEncoder.cpp @@ -0,0 +1,37 @@ +#include "PerfEncoder.h" +#include "MCLMemory.h" +#include "MD.h" + +#define DIV_1_127 (1.00f / 127.0f) + +int PerfEncoder::update(encoder_t *enc) { + MCLEncoder::update(enc); + //Update all params + if (hasChanged()) { + for (uint8_t n = 0; n < NUM_PERF_PARAMS; n++) { + if (perf_data.params[n].dest == 0) { continue; } + MidiUartClass *uart = &MidiUart; + if (perf_data.params[n].dest > 20) { uart = &MidiUart2; } + + uint8_t dest = perf_data.params[n].dest - 1; + uint8_t param = perf_data.params[n].param; + uint8_t min = perf_data.params[n].min; + uint8_t max = perf_data.params[n].max; + int8_t range = max - min; + uint16_t q = cur * range; + uint8_t val = ((float)q * DIV_1_127) + min; + + if (dest < NUM_MD_TRACKS) { + MD.setTrackParam_inline(dest, param, val, uart); + } + if (dest < NUM_MD_TRACKS + 4) { + + } + else if (dest < NUM_MD_TRACKS + 4 + 16) { + uint8_t channel = dest - NUM_MD_TRACKS; + uart->sendCC(channel, param, val); + } + } + } + return cur; +} diff --git a/avr/cores/megacommand/MCL/PerfEncoder.h b/avr/cores/megacommand/MCL/PerfEncoder.h new file mode 100644 index 000000000..95e55eb17 --- /dev/null +++ b/avr/cores/megacommand/MCL/PerfEncoder.h @@ -0,0 +1,30 @@ +/* Copyright 2018, Justin Mammarella jmamma@gmail.com */ + +#ifndef PERFENCODER_H__ +#define PERFENCODER_H__ + +#include "MCLEncoder.h" +#include "PerfData.h" + +class PerfEncoder : public MCLEncoder { + /** + \addtogroup gui_rangeencoder_class + @{ + **/ + + public: + PerfData perf_data; + + /** + Create a new range-limited encoder with max and min value, short + name, initial value, and handling function. The initRangeEncoder + will be called with the constructor arguments. + **/ + PerfEncoder(int _max = 127, int _min = 0, int res = 1) : MCLEncoder(_max , _min, res) { + } + + virtual int update(encoder_t *enc); + +}; + +#endif /* PerfENCODER_H__ */ diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp new file mode 100644 index 000000000..967ba10ac --- /dev/null +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -0,0 +1,292 @@ +#include "MCL_impl.h" +#include "ResourceManager.h" + +void PerfPage::setup() { + DEBUG_PRINT_FN(); + page_mode = PERF_DESTINATION; + perf_encoders[0] = &perf_param1; + perf_encoders[1] = &perf_param2; + perf_encoders[2] = &perf_param3; + perf_encoders[3] = &perf_param4; +} + + +void PerfPage::init() { + DEBUG_PRINT_FN(); + oled_display.clearDisplay(); + oled_display.setFont(); + config_encoders(); + R.Clear(); + R.use_machine_param_names(); + setup_callbacks(); +} + +void PerfPage::cleanup() { + remove_callbacks(); +} + +void PerfPage::config_encoders() { + if (page_mode < PERF_DESTINATION) { + encoders[0] = &fx_param1; + encoders[1] = &fx_param2; + encoders[2] = &fx_param3; + encoders[3] = &fx_param4; + + uint8_t c = page_mode; + PerfParam *p = &perf_encoders[perf_id]->perf_data.params[c]; + + encoders[0]->cur = p->dest; + ((PerfEncoder *)encoders[0])->max = NUM_MD_TRACKS + 4 + 16; + + encoders[1]->cur = p->param; + ((PerfEncoder *)encoders[1])->max = 23; + + encoders[2]->cur = p->min; + ((PerfEncoder *)encoders[2])->max = 127; + + encoders[3]->cur = p->max; + ((PerfEncoder *)encoders[3])->max = 127; + + if (encoders[0]->cur < NUM_MD_TRACKS) { + ((PerfEncoder *)encoders[1])->max = 7; + } + + if (encoders[0]->cur < NUM_MD_TRACKS + 4) { + ((PerfEncoder *)encoders[1])->max = 127; + } + } + + if (page_mode == PERF_DESTINATION) { + encoders[0] = perf_encoders[0]; + encoders[1] = perf_encoders[1]; + encoders[2] = perf_encoders[2]; + encoders[3] = perf_encoders[3]; + } + // loop(); + + for (uint8_t i = 0; i < GUI_NUM_ENCODERS; i++) { + encoders[i]->old = encoders[i]->cur; + ((LightPage *)this)->encoders_used_clock[i] = + slowclock - SHOW_VALUE_TIMEOUT - 1; + } +} + +void PerfPage::loop() { + + if (page_mode < PERF_DESTINATION) { + if (encoders[0]->hasChanged() && encoders[0]->cur == 0) { + encoders[1]->cur = 0; + } + uint8_t c = page_mode; + PerfParam *p = &perf_encoders[perf_id]->perf_data.params[c]; + p->dest = encoders[0]->cur; + p->param = encoders[1]->cur; + p->min = encoders[2]->cur; + p->max = encoders[3]->cur; + } +} + +void PerfPage::draw_param(uint8_t knob, uint8_t dest, uint8_t param) { + + char myName[4] = "-- "; + + const char* modelname = NULL; + if (dest == 0) { + if (param > 1) { + strcpy(myName,"LER"); + } + } + else { + if (dest < 17) { + modelname = model_param_name(MD.kit.get_model(dest - 1), param); + } else if (dest < 20) { + modelname = fx_param_name(MD_FX_ECHO + dest - 17, param); + } + else { + mcl_gui.put_value_at(param, myName); + } + if (modelname != NULL) { + strncpy(myName, modelname, 4); + } + } + mcl_gui.draw_knob(knob, "PAR", myName); +} + +void PerfPage::draw_dest(uint8_t knob, uint8_t value) { + char K[4]; + if (value > 20) { + strcpy(K, "MI "); + K[2] = '0' + value - 20 + 1; + } + else { + switch (value) { + case 0: + strcpy(K, "--"); + break; + case 17: + strcpy(K, "ECH"); + break; + case 18: + strcpy(K, "REV"); + break; + case 19: + strcpy(K, "EQ"); + break; + case 20: + strcpy(K, "DYN"); + break; + default: + // K[0] = 'T'; + mcl_gui.put_value_at(value, K); + break; + } + } + mcl_gui.draw_knob(knob, "DEST", K); +} + +void PerfPage::display() { + oled_display.clearDisplay(); + auto oldfont = oled_display.getFont(); + + mcl_gui.draw_panel_number(perf_id); + + uint8_t x = mcl_gui.knob_x0 + 5; + uint8_t y = 8; + uint8_t lfo_height = 7; + uint8_t width = 13; + + // mcl_gui.draw_vertical_dashline(x, 0, knob_y); + mcl_gui.draw_knob_frame(); + + const char *info1; + const char *info2; + + if (page_mode < PERF_DESTINATION) { + draw_dest(0, encoders[0]->cur); + draw_param(1, encoders[0]->cur, encoders[1]->cur); + mcl_gui.draw_knob(2, encoders[2], "MIN"); + mcl_gui.draw_knob(3, encoders[3], "MAX"); + info2 = "PER>DST"; + } + if (page_mode == PERF_DESTINATION) { + mcl_gui.draw_knob(0, encoders[0], "A"); + mcl_gui.draw_knob(1, encoders[1], "B"); + mcl_gui.draw_knob(2, encoders[2], "C"); + mcl_gui.draw_knob(3, encoders[3], "D"); + info2 = "PER>MOD"; + } + + mcl_gui.draw_panel_labels(info1, info2); + + oled_display.display(); + oled_display.setFont(oldfont); +} + +void PerfPage::onControlChangeCallback_Midi(uint8_t *msg) { + uint8_t channel = MIDI_VOICE_CHANNEL(msg[0]); + uint8_t param = msg[1]; + uint8_t value = msg[2]; + uint8_t track; + uint8_t track_param; + // If external keyboard controlling MD pitch, send parameter updates + // to all polyphonic tracks + uint8_t param_true = 0; + + MD.parseCC(channel, param, &track, &track_param); + if (track > 15) { return; } + if (learn) { + encoders[0]->cur = track + 1; + encoders[1]->cur = track_param; + if (value < encoders[2]->cur) { encoders[2]->cur = value; } + if (value > encoders[3]->cur) { encoders[3]->cur = value; } + } + if (page_mode < PERF_DESTINATION) { + if (encoders[0]->cur == 0 && encoders[1]->cur > 1) { + encoders[0]->cur = track + 1; + encoders[1]->cur = track_param; + } + } +} + +void PerfPage::onControlChangeCallback_Midi2(uint8_t *msg) { + uint8_t channel = MIDI_VOICE_CHANNEL(msg[0]); + uint8_t param = msg[1]; + uint8_t value = msg[2]; + if (learn) { + encoders[0]->cur = channel + 1 + 16 + 4; + encoders[1]->cur = param; + if (value < encoders[2]->cur) { encoders[2]->cur = value; } + if (value > encoders[3]->cur) { encoders[3]->cur = value; } + } +} + + +void PerfPage::setup_callbacks() { + if (midi_state) { + return; + } + Midi.addOnControlChangeCallback( + this, (midi_callback_ptr_t)&PerfPage::onControlChangeCallback_Midi); + Midi2.addOnControlChangeCallback( + this, (midi_callback_ptr_t)&PerfPage::onControlChangeCallback_Midi2); + + + midi_state = true; +} + +void PerfPage::remove_callbacks() { + if (!midi_state) { + return; + } + + Midi.removeOnControlChangeCallback( + this, (midi_callback_ptr_t)&PerfPage::onControlChangeCallback_Midi); + Midi2.removeOnControlChangeCallback( + this, (midi_callback_ptr_t)&PerfPage::onControlChangeCallback_Midi2); + + + midi_state = false; +} + +bool PerfPage::handleEvent(gui_event_t *event) { + if (note_interface.is_event(event)) { + uint8_t mask = event->mask; + uint8_t port = event->port; + auto device = midi_active_peering.get_device(port); + + uint8_t track = event->source - 128; + uint8_t page_select = 0; + uint8_t step = track + (page_select * 16); + if (event->mask == EVENT_BUTTON_PRESSED) { + } + } + if (event->mask == EVENT_BUTTON_RELEASED) { + return true; + } + /* if (EVENT_PRESSED(event, Buttons.ENCODER1) || + EVENT_PRESSED(event, Buttons.ENCODER2) || + EVENT_PRESSED(event, Buttons.ENCODER3) || + EVENT_PRESSED(event, Buttons.ENCODER4)) { + mcl.setPage(GRID_PAGE); + } + */ + if (EVENT_PRESSED(event, Buttons.BUTTON4)) { + page_mode++; + if (page_mode > PERF_DESTINATION) { page_mode = 0; } + config_encoders(); + } + + if (EVENT_PRESSED(event, Buttons.BUTTON1)) { + learn = true; + } + if (EVENT_RELEASED(event, Buttons.BUTTON1)) { + learn = false; + } + + if (EVENT_PRESSED(event, Buttons.BUTTON2)) { + mcl.setPage(PAGE_SELECT_PAGE); + return true; + } + + return false; +} diff --git a/avr/cores/megacommand/MCL/PerfPage.h b/avr/cores/megacommand/MCL/PerfPage.h new file mode 100644 index 000000000..5432d31bf --- /dev/null +++ b/avr/cores/megacommand/MCL/PerfPage.h @@ -0,0 +1,52 @@ +/* Justin Mammarella jmamma@gmail.com 2018 */ + +#ifndef PERFPAGE_H__ +#define PERFPAGE_H__ + +#include "GUI.h" +#include "MCLEncoder.h" + +#include "PerfEncoder.h" + +#define NUM_PERF_CONTROLS 4 +#define PERF_DESTINATION NUM_PERF_PARAMS + +class PerfPage : public LightPage, MidiCallback { +public: + PerfPage(Encoder *e1 = NULL, Encoder *e2 = NULL, + Encoder *e3 = NULL, Encoder *e4 = NULL) + : LightPage(e1, e2, e3, e4) { + } + + bool learn = false; + + bool midi_state = false; + uint8_t page_mode; + uint8_t perf_id; + + PerfEncoder *perf_encoders[4]; + + bool handleEvent(gui_event_t *event); + + void draw_dest(uint8_t knob, uint8_t value); + void draw_param(uint8_t knob, uint8_t dest, uint8_t param); + void display(); + void setup(); + + void init(); + void loop(); + void cleanup(); + virtual void config_encoders(); + void setup_callbacks(); + void remove_callbacks(); + + void onControlChangeCallback_Midi(uint8_t *msg); + void onControlChangeCallback_Midi2(uint8_t *msg); +}; + +extern MCLEncoder perf_page_param1; +extern MCLEncoder perf_page_param2; +extern MCLEncoder perf_page_param3; +extern MCLEncoder perf_page_param4; + +#endif /* PERFPAGE_H__ */ diff --git a/avr/cores/megacommand/ResourceManager.cpp b/avr/cores/megacommand/ResourceManager.cpp index a3132712f..2680c7951 100644 --- a/avr/cores/megacommand/ResourceManager.cpp +++ b/avr/cores/megacommand/ResourceManager.cpp @@ -72,6 +72,10 @@ void ResourceManager::restore_page_entry_deps() { R.page_entries->Entries[idx].Page = WD_PAGE_0; R.page_entries->Entries[idx].IconData = R.icons_page->icon_wavd; ++idx; + R.page_entries->Entries[idx].Page = PERF_PAGE_0; + R.page_entries->Entries[idx].IconData = R.icons_page->icon_wavd; + ++idx; + #endif #ifdef LOUDNESS_PAGE R.page_entries->Entries[idx].Page = LOUDNESS_PAGE; diff --git a/avr/cores/megacommand/resources/R.h b/avr/cores/megacommand/resources/R.h index 1933a165f..9395efea2 100644 --- a/avr/cores/megacommand/resources/R.h +++ b/avr/cores/megacommand/resources/R.h @@ -426,11 +426,11 @@ extern const unsigned char __R_page_entries[] PROGMEM; struct __T_page_entries { union { PageSelectEntry Entries[0]; - char zz__Entries[312]; + char zz__Entries[336]; }; - static constexpr size_t countof_Entries = 312 / sizeof(PageSelectEntry); - static constexpr size_t sizeofof_Entries = 312; - static constexpr size_t __total_size = 312; + static constexpr size_t countof_Entries = 336 / sizeof(PageSelectEntry); + static constexpr size_t sizeofof_Entries = 336; + static constexpr size_t __total_size = 336; }; extern const unsigned char __R_tuning[] PROGMEM; diff --git a/avr/cores/megacommand/resources/R_page_entries.cpp b/avr/cores/megacommand/resources/R_page_entries.cpp index ce602d031..0973bfc69 100644 --- a/avr/cores/megacommand/resources/R_page_entries.cpp +++ b/avr/cores/megacommand/resources/R_page_entries.cpp @@ -141,61 +141,71 @@ const unsigned char __R_page_entries[] PROGMEM = { 181, 18, 49, - 182, - 23, - 19, - 7, 183, + 23, 19, + 95, + 54, + 14, + 70, + 192, + 143, + 251, + 40, + 0, + 10, + 23, + 22, + 43, + 246, 76, 65, - 176, 89, - 143, - 27, + 23, + 3, 16, - 49, - 111, + 109, + 73, 3, - 47, - 237, + 253, + 71, 82, 69, 86, - 40, - 178, + 182, + 49, 66, 23, - 249, + 95, 17, 0, 13, - 54, - 95, - 236, + 38, + 221, + 119, 45, 49, + 128, 47, - 7, + 246, 23, 0, - 178, 14, 23, - 97, + 76, 50, - 27, - 3, - 216, + 32, + 51, + 123, 0, 15, 23, - 128, + 16, 0, 0, 0, 0, - 2, - 127, + 0, + 79, 255, }; diff --git a/resource/page_entries.cpp b/resource/page_entries.cpp index a64def4cf..5e6ff624f 100644 --- a/resource/page_entries.cpp +++ b/resource/page_entries.cpp @@ -14,6 +14,7 @@ PageSelectEntry Entries[] = { #endif #ifdef WAV_DESIGNER {"WAV DESIGNER", WD_PAGE_0, 9, 2, 24, 19, nullptr}, + {"PERF", PERF_PAGE_0, 10, 2, 24, 19, nullptr}, #endif {"DELAY", FX_PAGE_A, 12, 3, 24, 25, nullptr}, {"REVERB", FX_PAGE_B, 13, 3, 24, 25, nullptr}, From 74147046628aac8aca45edc44d0ebe9eaba546f4 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 28 Jun 2023 12:04:00 +1000 Subject: [PATCH 121/413] Checkin --- avr/cores/megacommand/MCL/PerfPage.cpp | 138 ++++++++++++++----------- 1 file changed, 77 insertions(+), 61 deletions(-) diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 967ba10ac..ded779d3b 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -10,7 +10,6 @@ void PerfPage::setup() { perf_encoders[3] = &perf_param4; } - void PerfPage::init() { DEBUG_PRINT_FN(); oled_display.clearDisplay(); @@ -21,9 +20,7 @@ void PerfPage::init() { setup_callbacks(); } -void PerfPage::cleanup() { - remove_callbacks(); -} +void PerfPage::cleanup() { remove_callbacks(); } void PerfPage::config_encoders() { if (page_mode < PERF_DESTINATION) { @@ -46,15 +43,17 @@ void PerfPage::config_encoders() { encoders[3]->cur = p->max; ((PerfEncoder *)encoders[3])->max = 127; - - if (encoders[0]->cur < NUM_MD_TRACKS) { + if (encoders[0]->cur < NUM_MD_TRACKS + 4) { ((PerfEncoder *)encoders[1])->max = 7; } - if (encoders[0]->cur < NUM_MD_TRACKS + 4) { + if (encoders[0]->cur < NUM_MD_TRACKS + 4 + 16) { ((PerfEncoder *)encoders[1])->max = 127; } - } + else { + ((PerfEncoder *)encoders[1])->max = 23; + } + } if (page_mode == PERF_DESTINATION) { encoders[0] = perf_encoders[0]; @@ -70,39 +69,47 @@ void PerfPage::config_encoders() { slowclock - SHOW_VALUE_TIMEOUT - 1; } } - void PerfPage::loop() { if (page_mode < PERF_DESTINATION) { - if (encoders[0]->hasChanged() && encoders[0]->cur == 0) { - encoders[1]->cur = 0; - } - uint8_t c = page_mode; - PerfParam *p = &perf_encoders[perf_id]->perf_data.params[c]; - p->dest = encoders[0]->cur; - p->param = encoders[1]->cur; - p->min = encoders[2]->cur; - p->max = encoders[3]->cur; + if (encoders[0]->hasChanged() && encoders[0]->cur == 0) { + encoders[1]->cur = 0; + } + uint8_t c = page_mode; + PerfParam *p = &perf_encoders[perf_id]->perf_data.params[c]; + p->dest = encoders[0]->cur; + p->param = encoders[1]->cur; + p->min = encoders[2]->cur; + p->max = encoders[3]->cur; } + + if (encoders[0]->cur < NUM_MD_TRACKS + 4) { + ((PerfEncoder *)encoders[1])->max = 7; + } + + if (encoders[0]->cur < NUM_MD_TRACKS + 4 + 16) { + ((PerfEncoder *)encoders[1])->max = 127; + } + else { + ((PerfEncoder *)encoders[1])->max = 23; + } } void PerfPage::draw_param(uint8_t knob, uint8_t dest, uint8_t param) { char myName[4] = "-- "; - const char* modelname = NULL; + const char *modelname = NULL; if (dest == 0) { if (param > 1) { - strcpy(myName,"LER"); + strcpy(myName, "LER"); } - } - else { + } else { if (dest < 17) { modelname = model_param_name(MD.kit.get_model(dest - 1), param); } else if (dest < 20) { modelname = fx_param_name(MD_FX_ECHO + dest - 17, param); - } - else { + } else { mcl_gui.put_value_at(param, myName); } if (modelname != NULL) { @@ -117,29 +124,28 @@ void PerfPage::draw_dest(uint8_t knob, uint8_t value) { if (value > 20) { strcpy(K, "MI "); K[2] = '0' + value - 20 + 1; - } - else { - switch (value) { - case 0: - strcpy(K, "--"); - break; - case 17: - strcpy(K, "ECH"); - break; - case 18: - strcpy(K, "REV"); - break; - case 19: - strcpy(K, "EQ"); - break; - case 20: - strcpy(K, "DYN"); - break; - default: - // K[0] = 'T'; - mcl_gui.put_value_at(value, K); - break; - } + } else { + switch (value) { + case 0: + strcpy(K, "--"); + break; + case 17: + strcpy(K, "ECH"); + break; + case 18: + strcpy(K, "REV"); + break; + case 19: + strcpy(K, "EQ"); + break; + case 20: + strcpy(K, "DYN"); + break; + default: + // K[0] = 'T'; + mcl_gui.put_value_at(value, K); + break; + } } mcl_gui.draw_knob(knob, "DEST", K); } @@ -156,7 +162,7 @@ void PerfPage::display() { uint8_t width = 13; // mcl_gui.draw_vertical_dashline(x, 0, knob_y); - mcl_gui.draw_knob_frame(); + mcl_gui.draw_knob_frame(); const char *info1; const char *info2; @@ -193,18 +199,24 @@ void PerfPage::onControlChangeCallback_Midi(uint8_t *msg) { uint8_t param_true = 0; MD.parseCC(channel, param, &track, &track_param); - if (track > 15) { return; } + if (track > 15) { + return; + } if (learn) { encoders[0]->cur = track + 1; encoders[1]->cur = track_param; - if (value < encoders[2]->cur) { encoders[2]->cur = value; } - if (value > encoders[3]->cur) { encoders[3]->cur = value; } + if (value < encoders[2]->cur) { + encoders[2]->cur = value; + } + if (value > encoders[3]->cur) { + encoders[3]->cur = value; + } } if (page_mode < PERF_DESTINATION) { - if (encoders[0]->cur == 0 && encoders[1]->cur > 1) { - encoders[0]->cur = track + 1; - encoders[1]->cur = track_param; - } + if (encoders[0]->cur == 0 && encoders[1]->cur > 1) { + encoders[0]->cur = track + 1; + encoders[1]->cur = track_param; + } } } @@ -215,12 +227,16 @@ void PerfPage::onControlChangeCallback_Midi2(uint8_t *msg) { if (learn) { encoders[0]->cur = channel + 1 + 16 + 4; encoders[1]->cur = param; - if (value < encoders[2]->cur) { encoders[2]->cur = value; } - if (value > encoders[3]->cur) { encoders[3]->cur = value; } + ((PerfEncoder *)encoders[1])->max = 127; + if (value < encoders[2]->cur) { + encoders[2]->cur = value; + } + if (value > encoders[3]->cur) { + encoders[3]->cur = value; + } } } - void PerfPage::setup_callbacks() { if (midi_state) { return; @@ -230,7 +246,6 @@ void PerfPage::setup_callbacks() { Midi2.addOnControlChangeCallback( this, (midi_callback_ptr_t)&PerfPage::onControlChangeCallback_Midi2); - midi_state = true; } @@ -244,7 +259,6 @@ void PerfPage::remove_callbacks() { Midi2.removeOnControlChangeCallback( this, (midi_callback_ptr_t)&PerfPage::onControlChangeCallback_Midi2); - midi_state = false; } @@ -272,7 +286,9 @@ bool PerfPage::handleEvent(gui_event_t *event) { */ if (EVENT_PRESSED(event, Buttons.BUTTON4)) { page_mode++; - if (page_mode > PERF_DESTINATION) { page_mode = 0; } + if (page_mode > PERF_DESTINATION) { + page_mode = 0; + } config_encoders(); } From facca42ec9b57193e6a3ae00bd1439e0477e59b9 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 28 Jun 2023 14:58:14 +1000 Subject: [PATCH 122/413] LFOPage and PerfPage refactor to use common PerfPageParent --- avr/cores/megacommand/MCL/LFOPage.cpp | 109 ++++++------------------ avr/cores/megacommand/MCL/LFOPage.h | 6 +- avr/cores/megacommand/MCL/PerfPage.cpp | 112 +++---------------------- avr/cores/megacommand/MCL/PerfPage.h | 5 +- 4 files changed, 43 insertions(+), 189 deletions(-) diff --git a/avr/cores/megacommand/MCL/LFOPage.cpp b/avr/cores/megacommand/MCL/LFOPage.cpp index b0dbde85a..9a3dfa54a 100644 --- a/avr/cores/megacommand/MCL/LFOPage.cpp +++ b/avr/cores/megacommand/MCL/LFOPage.cpp @@ -20,22 +20,19 @@ void LFOPage::setup() { } void LFOPage::init() { - DEBUG_PRINT_FN(); - oled_display.clearDisplay(); - oled_display.setFont(); - config_encoders(); + PerfPageParent::init(); + MD.sync_seqtrack(lfo_track->length, lfo_track->speed, lfo_track->step_count); if (lfo_track->mode != LFO_MODE_FREE) { trig_interface.on(); } - // LFOPage not using base SeqPage init? - R.Clear(); - R.use_machine_param_names(); + } void LFOPage::cleanup() { + PerfPageParent::cleanup(); trig_interface.off(); oled_display.clearDisplay(); } @@ -51,17 +48,8 @@ void LFOPage::config_encoders() { encoders[3]->cur = lfo_track->params[1].param; ((MCLEncoder *)encoders[3])->max = 23; - if (encoders[0]->cur > NUM_MD_TRACKS) { - ((MCLEncoder *)encoders[1])->max = 7; - } else { - ((MCLEncoder *)encoders[1])->max = 23; - } - - if (encoders[2]->cur > NUM_MD_TRACKS) { - ((MCLEncoder *)encoders[3])->max = 7; - } else { - ((MCLEncoder *)encoders[3])->max = 23; - } + config_encoder_range(0,encoders); + config_encoder_range(2,encoders); } if (page_mode == LFO_SETTINGS) { encoders[0]->cur = waveform; @@ -78,15 +66,13 @@ void LFOPage::config_encoders() { } // loop(); - for (uint8_t i = 0; i < GUI_NUM_ENCODERS; i++) { - encoders[i]->old = encoders[i]->cur; - ((LightPage *)this)->encoders_used_clock[i] = - slowclock - SHOW_VALUE_TIMEOUT - 1; - } + PerfPageParent::config_encoders_timeout(encoders); } void LFOPage::loop() { if (page_mode == LFO_DESTINATION) { + config_encoder_range(0,encoders); + config_encoder_range(2,encoders); if (encoders[0]->hasChanged()) { USE_LOCK(); @@ -95,11 +81,6 @@ void LFOPage::loop() { lfo_track->params[0].dest = encoders[0]->cur; lfo_track->params[0].update_offset(); CLEAR_LOCK(); - if (encoders[0]->cur > NUM_MD_TRACKS) { - ((MCLEncoder *)encoders[1])->max = 7; - } else { - ((MCLEncoder *)encoders[1])->max = 23; - } } if (encoders[1]->hasChanged()) { USE_LOCK(); @@ -119,11 +100,6 @@ void LFOPage::loop() { lfo_track->params[1].dest = encoders[2]->cur; lfo_track->params[1].update_offset(); CLEAR_LOCK(); - if (encoders[2]->cur > NUM_MD_TRACKS) { - ((MCLEncoder *)encoders[3])->max = 7; - } else { - ((MCLEncoder *)encoders[3])->max = 23; - } } if (encoders[3]->hasChanged()) { USE_LOCK(); @@ -165,50 +141,6 @@ void LFOPage::loop() { } } -void LFOPage::draw_param(uint8_t knob, uint8_t dest, uint8_t param) { - - char myName[4] = "-- "; - - const char* modelname = NULL; - if (dest != 0) { - if (dest < 17) { - modelname = model_param_name(MD.kit.get_model(dest - 1), param); - } else { - modelname = fx_param_name(MD_FX_ECHO + dest - 17, param); - } - if (modelname != NULL) { - strncpy(myName, modelname, 4); - } - } - draw_knob(knob, "PAR", myName); -} - -void LFOPage::draw_dest(uint8_t knob, uint8_t value) { - char K[4]; - switch (value) { - case 0: - strcpy(K, "--"); - break; - case 17: - strcpy(K, "ECH"); - break; - case 18: - strcpy(K, "REV"); - break; - case 19: - strcpy(K, "EQ"); - break; - case 20: - strcpy(K, "DYN"); - break; - default: - // K[0] = 'T'; - mcl_gui.put_value_at(value, K); - break; - } - draw_knob(knob, "DEST", K); -} - void LFOPage::display() { oled_display.clearDisplay(); auto oldfont = oled_display.getFont(); @@ -305,6 +237,18 @@ void LFOPage::onControlChangeCallback_Midi(uint8_t *msg) { MD.parseCC(channel, param, &track, &track_param); if (track > 15) { return; } + + if (page_mode == LFO_DESTINATION) { + if (encoders[0]->cur == 0 && encoders[1]->cur > 1) { + encoders[0]->cur = track + 1; + encoders[1]->cur = track_param; + } + if (encoders[2]->cur == 0 && encoders[3]->cur > 1) { + encoders[2]->cur = track + 1; + encoders[3]->cur = track_param; + } + } + } void LFOPage::setup_callbacks() { @@ -328,7 +272,10 @@ void LFOPage::remove_callbacks() { midi_state = false; } + bool LFOPage::handleEvent(gui_event_t *event) { + if (PerfPageParent::handleEvent(event)) { return true; } + if (note_interface.is_event(event)) { uint8_t mask = event->mask; uint8_t port = event->port; @@ -354,9 +301,6 @@ bool LFOPage::handleEvent(gui_event_t *event) { } } } - if (event->mask == EVENT_BUTTON_RELEASED) { - return true; - } /* if (EVENT_PRESSED(event, Buttons.ENCODER1) || EVENT_PRESSED(event, Buttons.ENCODER2) || EVENT_PRESSED(event, Buttons.ENCODER3) || @@ -388,10 +332,5 @@ bool LFOPage::handleEvent(gui_event_t *event) { } lfo_track->enable = !(lfo_track->enable); } - if (EVENT_PRESSED(event, Buttons.BUTTON2)) { - mcl.setPage(PAGE_SELECT_PAGE); - return true; - } - return false; } diff --git a/avr/cores/megacommand/MCL/LFOPage.h b/avr/cores/megacommand/MCL/LFOPage.h index 44d4e9d66..d9bd0891b 100644 --- a/avr/cores/megacommand/MCL/LFOPage.h +++ b/avr/cores/megacommand/MCL/LFOPage.h @@ -7,6 +7,7 @@ #include "MCLEncoder.h" #include "LFOSeqTrack.h" #include "SeqPage.h" +#include "PerfPageParent.h" #define NUM_LFO_PAGES 2 @@ -16,8 +17,9 @@ #define IEXP_WAV 3 #define IRAMP_WAV 4 #define EXP_WAV 5 -// -class LFOPage : public SeqPage, MidiCallback { + + +class LFOPage : public SeqPage, PerfPageParent { public: LFOPage(LFOSeqTrack *lfo_track_, Encoder *e1 = NULL, Encoder *e2 = NULL, Encoder *e3 = NULL, Encoder *e4 = NULL) diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index ded779d3b..6660c75d7 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -12,15 +12,10 @@ void PerfPage::setup() { void PerfPage::init() { DEBUG_PRINT_FN(); - oled_display.clearDisplay(); - oled_display.setFont(); - config_encoders(); - R.Clear(); - R.use_machine_param_names(); - setup_callbacks(); + PerfPageParent::init(); } -void PerfPage::cleanup() { remove_callbacks(); } +void PerfPage::cleanup() { PerfPageParent::cleanup(); } void PerfPage::config_encoders() { if (page_mode < PERF_DESTINATION) { @@ -43,16 +38,8 @@ void PerfPage::config_encoders() { encoders[3]->cur = p->max; ((PerfEncoder *)encoders[3])->max = 127; - if (encoders[0]->cur < NUM_MD_TRACKS + 4) { - ((PerfEncoder *)encoders[1])->max = 7; - } - if (encoders[0]->cur < NUM_MD_TRACKS + 4 + 16) { - ((PerfEncoder *)encoders[1])->max = 127; - } - else { - ((PerfEncoder *)encoders[1])->max = 23; - } + config_encoder_range(0,encoders); } if (page_mode == PERF_DESTINATION) { @@ -62,13 +49,9 @@ void PerfPage::config_encoders() { encoders[3] = perf_encoders[3]; } // loop(); - - for (uint8_t i = 0; i < GUI_NUM_ENCODERS; i++) { - encoders[i]->old = encoders[i]->cur; - ((LightPage *)this)->encoders_used_clock[i] = - slowclock - SHOW_VALUE_TIMEOUT - 1; - } + PerfPageParent::config_encoders_timeout(encoders); } + void PerfPage::loop() { if (page_mode < PERF_DESTINATION) { @@ -83,71 +66,7 @@ void PerfPage::loop() { p->max = encoders[3]->cur; } - if (encoders[0]->cur < NUM_MD_TRACKS + 4) { - ((PerfEncoder *)encoders[1])->max = 7; - } - - if (encoders[0]->cur < NUM_MD_TRACKS + 4 + 16) { - ((PerfEncoder *)encoders[1])->max = 127; - } - else { - ((PerfEncoder *)encoders[1])->max = 23; - } -} - -void PerfPage::draw_param(uint8_t knob, uint8_t dest, uint8_t param) { - - char myName[4] = "-- "; - - const char *modelname = NULL; - if (dest == 0) { - if (param > 1) { - strcpy(myName, "LER"); - } - } else { - if (dest < 17) { - modelname = model_param_name(MD.kit.get_model(dest - 1), param); - } else if (dest < 20) { - modelname = fx_param_name(MD_FX_ECHO + dest - 17, param); - } else { - mcl_gui.put_value_at(param, myName); - } - if (modelname != NULL) { - strncpy(myName, modelname, 4); - } - } - mcl_gui.draw_knob(knob, "PAR", myName); -} - -void PerfPage::draw_dest(uint8_t knob, uint8_t value) { - char K[4]; - if (value > 20) { - strcpy(K, "MI "); - K[2] = '0' + value - 20 + 1; - } else { - switch (value) { - case 0: - strcpy(K, "--"); - break; - case 17: - strcpy(K, "ECH"); - break; - case 18: - strcpy(K, "REV"); - break; - case 19: - strcpy(K, "EQ"); - break; - case 20: - strcpy(K, "DYN"); - break; - default: - // K[0] = 'T'; - mcl_gui.put_value_at(value, K); - break; - } - } - mcl_gui.draw_knob(knob, "DEST", K); + config_encoder_range(0,encoders); } void PerfPage::display() { @@ -237,6 +156,7 @@ void PerfPage::onControlChangeCallback_Midi2(uint8_t *msg) { } } + void PerfPage::setup_callbacks() { if (midi_state) { return; @@ -262,7 +182,10 @@ void PerfPage::remove_callbacks() { midi_state = false; } + bool PerfPage::handleEvent(gui_event_t *event) { + if (PerfPageParent::handleEvent(event)) { return true; } + if (note_interface.is_event(event)) { uint8_t mask = event->mask; uint8_t port = event->port; @@ -274,16 +197,7 @@ bool PerfPage::handleEvent(gui_event_t *event) { if (event->mask == EVENT_BUTTON_PRESSED) { } } - if (event->mask == EVENT_BUTTON_RELEASED) { - return true; - } - /* if (EVENT_PRESSED(event, Buttons.ENCODER1) || - EVENT_PRESSED(event, Buttons.ENCODER2) || - EVENT_PRESSED(event, Buttons.ENCODER3) || - EVENT_PRESSED(event, Buttons.ENCODER4)) { - mcl.setPage(GRID_PAGE); - } - */ + if (EVENT_PRESSED(event, Buttons.BUTTON4)) { page_mode++; if (page_mode > PERF_DESTINATION) { @@ -299,10 +213,6 @@ bool PerfPage::handleEvent(gui_event_t *event) { learn = false; } - if (EVENT_PRESSED(event, Buttons.BUTTON2)) { - mcl.setPage(PAGE_SELECT_PAGE); - return true; - } return false; } diff --git a/avr/cores/megacommand/MCL/PerfPage.h b/avr/cores/megacommand/MCL/PerfPage.h index 5432d31bf..f7a9e212b 100644 --- a/avr/cores/megacommand/MCL/PerfPage.h +++ b/avr/cores/megacommand/MCL/PerfPage.h @@ -6,12 +6,13 @@ #include "GUI.h" #include "MCLEncoder.h" +#include "PerfPageParent.h" #include "PerfEncoder.h" #define NUM_PERF_CONTROLS 4 #define PERF_DESTINATION NUM_PERF_PARAMS -class PerfPage : public LightPage, MidiCallback { +class PerfPage : public LightPage, PerfPageParent { public: PerfPage(Encoder *e1 = NULL, Encoder *e2 = NULL, Encoder *e3 = NULL, Encoder *e4 = NULL) @@ -36,7 +37,9 @@ class PerfPage : public LightPage, MidiCallback { void init(); void loop(); void cleanup(); + virtual void config_encoders(); + void setup_callbacks(); void remove_callbacks(); From 24e55339a8bb7f2eb86b8121e67fa1cf21d087d8 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 28 Jun 2023 17:39:46 +1000 Subject: [PATCH 123/413] PerfPage/LFOPage: MIDI Learn for dest, learn for MIN/MAX, LEDs --- avr/cores/megacommand/MCL/LFOPage.cpp | 2 +- avr/cores/megacommand/MCL/LFOPage.h | 2 - avr/cores/megacommand/MCL/MixerPage.cpp | 2 +- avr/cores/megacommand/MCL/PerfData.h | 32 ++++++ avr/cores/megacommand/MCL/PerfPage.cpp | 130 ++++++++++++++++-------- avr/cores/megacommand/MCL/PerfPage.h | 6 +- 6 files changed, 126 insertions(+), 48 deletions(-) diff --git a/avr/cores/megacommand/MCL/LFOPage.cpp b/avr/cores/megacommand/MCL/LFOPage.cpp index 9a3dfa54a..1c3f8da3c 100644 --- a/avr/cores/megacommand/MCL/LFOPage.cpp +++ b/avr/cores/megacommand/MCL/LFOPage.cpp @@ -233,11 +233,11 @@ void LFOPage::onControlChangeCallback_Midi(uint8_t *msg) { uint8_t track_param; // If external keyboard controlling MD pitch, send parameter updates // to all polyphonic tracks - uint8_t param_true = 0; MD.parseCC(channel, param, &track, &track_param); if (track > 15) { return; } + //Midi LEARN if (page_mode == LFO_DESTINATION) { if (encoders[0]->cur == 0 && encoders[1]->cur > 1) { encoders[0]->cur = track + 1; diff --git a/avr/cores/megacommand/MCL/LFOPage.h b/avr/cores/megacommand/MCL/LFOPage.h index d9bd0891b..3cc6052cd 100644 --- a/avr/cores/megacommand/MCL/LFOPage.h +++ b/avr/cores/megacommand/MCL/LFOPage.h @@ -38,8 +38,6 @@ class LFOPage : public SeqPage, PerfPageParent { uint8_t depth; uint8_t depth2; - void draw_dest(uint8_t knob, uint8_t value); - void draw_param(uint8_t knob, uint8_t dest, uint8_t param); void display(); void setup(); // void draw_pattern_mask(); diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 05d8f28be..19959e337 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -56,11 +56,11 @@ void MixerPage::init() { } MD.set_key_repeat(0); trig_interface.on(); + MD.set_trigleds(0, TRIGLED_OVERLAY); preview_mute_set = 255; bool switch_tracks = false; midi_events.setup_callbacks(); oled_display.clearDisplay(); - MD.set_trigleds(0, TRIGLED_OVERLAY); oled_draw_mutes(); set_display_mode(MODEL_LEVEL); first_track = 255; diff --git a/avr/cores/megacommand/MCL/PerfData.h b/avr/cores/megacommand/MCL/PerfData.h index 29e6ccbf3..f84994cb9 100644 --- a/avr/cores/megacommand/MCL/PerfData.h +++ b/avr/cores/megacommand/MCL/PerfData.h @@ -15,12 +15,44 @@ class PerfParam { uint8_t max; }; +#define LEARN_MIN 1 + class PerfData { public: PerfParam params[NUM_PERF_PARAMS]; + PerfParam src_param; PerfData() { init(); } + uint8_t add_param(uint8_t dest, uint8_t param, uint8_t learn, uint8_t value) { + uint8_t match = 255; + uint8_t empty = 255; + + for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { + //Find first empty + if (params[a].dest == 0) { empty = min(a,empty); } + if (params[a].dest == dest + 1 && params[a].param == param) { + //Update existing, if matches + match = a; + } + } + + uint8_t b = match; + if (b == 255) { b = empty; } + if (b == 255) { return 255; } + + params[b].dest = dest + 1; + params[b].param = param; + + if (learn == LEARN_MIN) { + params[b].min = value; + } + else { + params[b].max = value; + } + return b; + } + void *data() const { return (void *)¶ms; } void init() { for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 6660c75d7..ce32b0ed0 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -1,6 +1,10 @@ #include "MCL_impl.h" #include "ResourceManager.h" +#define LEARN_MIN 1 +#define LEARN_MAX 2 +#define LEARN_OFF 0 + void PerfPage::setup() { DEBUG_PRINT_FN(); page_mode = PERF_DESTINATION; @@ -13,25 +17,24 @@ void PerfPage::setup() { void PerfPage::init() { DEBUG_PRINT_FN(); PerfPageParent::init(); + trig_interface.on(); + MD.set_trigleds(0b0011001100110011, TRIGLED_OVERLAY); } void PerfPage::cleanup() { PerfPageParent::cleanup(); } void PerfPage::config_encoders() { - if (page_mode < PERF_DESTINATION) { - encoders[0] = &fx_param1; encoders[1] = &fx_param2; encoders[2] = &fx_param3; encoders[3] = &fx_param4; + if (page_mode < PERF_DESTINATION) { + encoders[0] = &fx_param1; uint8_t c = page_mode; PerfParam *p = &perf_encoders[perf_id]->perf_data.params[c]; encoders[0]->cur = p->dest; - ((PerfEncoder *)encoders[0])->max = NUM_MD_TRACKS + 4 + 16; - encoders[1]->cur = p->param; - ((PerfEncoder *)encoders[1])->max = 23; encoders[2]->cur = p->min; ((PerfEncoder *)encoders[2])->max = 127; @@ -44,10 +47,18 @@ void PerfPage::config_encoders() { if (page_mode == PERF_DESTINATION) { encoders[0] = perf_encoders[0]; - encoders[1] = perf_encoders[1]; - encoders[2] = perf_encoders[2]; - encoders[3] = perf_encoders[3]; + ((PerfEncoder *)encoders[0])->max = 127; + config_encoder_range(1,encoders); + + PerfParam *p = &perf_encoders[perf_id]->perf_data.src_param; + encoders[1]->cur = p->dest; + encoders[2]->cur = p->param; + + encoders[3]->cur = p->max; + ((PerfEncoder *)encoders[3])->max = 127; + } + // loop(); PerfPageParent::config_encoders_timeout(encoders); } @@ -94,10 +105,12 @@ void PerfPage::display() { info2 = "PER>DST"; } if (page_mode == PERF_DESTINATION) { - mcl_gui.draw_knob(0, encoders[0], "A"); - mcl_gui.draw_knob(1, encoders[1], "B"); - mcl_gui.draw_knob(2, encoders[2], "C"); - mcl_gui.draw_knob(3, encoders[3], "D"); + char *str = "A "; + str[1] = '1' + perf_id; + mcl_gui.draw_knob(0, encoders[0], str); + draw_dest(1, encoders[1]->cur); + draw_param(2, encoders[1]->cur, encoders[2]->cur); + mcl_gui.draw_knob(3, encoders[3], "MIN"); info2 = "PER>MOD"; } @@ -107,6 +120,22 @@ void PerfPage::display() { oled_display.setFont(oldfont); } +void PerfPage::learn_param(uint8_t track, uint8_t param, uint8_t value) { + if (learn) { + PerfData *d = &perf_encoders[perf_id]->perf_data; + uint8_t n = d->add_param(track, param, learn, value); + if (n == page_mode) { config_encoders(); } + } + + //MIDI LEARN current mode; + uint8_t a = page_mode == PERF_DESTINATION ? 1 : 0; + if (encoders[a]->cur == 0 && encoders[a + 1]->cur > 1) { + encoders[a]->cur = track + 1; + encoders[a + 1]->cur = param; + } + +} + void PerfPage::onControlChangeCallback_Midi(uint8_t *msg) { uint8_t channel = MIDI_VOICE_CHANNEL(msg[0]); uint8_t param = msg[1]; @@ -115,45 +144,21 @@ void PerfPage::onControlChangeCallback_Midi(uint8_t *msg) { uint8_t track_param; // If external keyboard controlling MD pitch, send parameter updates // to all polyphonic tracks - uint8_t param_true = 0; MD.parseCC(channel, param, &track, &track_param); if (track > 15) { return; } - if (learn) { - encoders[0]->cur = track + 1; - encoders[1]->cur = track_param; - if (value < encoders[2]->cur) { - encoders[2]->cur = value; - } - if (value > encoders[3]->cur) { - encoders[3]->cur = value; - } - } - if (page_mode < PERF_DESTINATION) { - if (encoders[0]->cur == 0 && encoders[1]->cur > 1) { - encoders[0]->cur = track + 1; - encoders[1]->cur = track_param; - } - } + + learn_param(track, track_param, value); + } void PerfPage::onControlChangeCallback_Midi2(uint8_t *msg) { uint8_t channel = MIDI_VOICE_CHANNEL(msg[0]); uint8_t param = msg[1]; uint8_t value = msg[2]; - if (learn) { - encoders[0]->cur = channel + 1 + 16 + 4; - encoders[1]->cur = param; - ((PerfEncoder *)encoders[1])->max = 127; - if (value < encoders[2]->cur) { - encoders[2]->cur = value; - } - if (value > encoders[3]->cur) { - encoders[3]->cur = value; - } - } + learn_param(channel + 16 + 4, param, value); } @@ -182,6 +187,29 @@ void PerfPage::remove_callbacks() { midi_state = false; } +void PerfPage::send_locks(uint8_t mode) { + MDSeqTrack &active_track = mcl_seq.md_tracks[last_md_track]; + uint8_t params[24]; + memset(params, 255, sizeof(params)); + + for (uint8_t n = 0; n < NUM_PERF_PARAMS; n++) { + PerfParam *p = &perf_encoders[perf_id]->perf_data.params[n]; + uint8_t dest = p->dest; + uint8_t param = p->param; + + if (param >= 24) { continue; } + + if (dest == last_md_track + 1) { + if (mode == LEARN_MIN) { + params[param] = p->min; + } + if (mode == LEARN_MAX) { + params[param] = p->max; + } + } + } + MD.activate_encoder_interface(params); +} bool PerfPage::handleEvent(gui_event_t *event) { if (PerfPageParent::handleEvent(event)) { return true; } @@ -192,10 +220,28 @@ bool PerfPage::handleEvent(gui_event_t *event) { auto device = midi_active_peering.get_device(port); uint8_t track = event->source - 128; - uint8_t page_select = 0; - uint8_t step = track + (page_select * 16); + + if (!learn) { return true; } + + if (event->mask == EVENT_BUTTON_PRESSED) { + perf_id = track / 4; + uint8_t b = track - (perf_id) * 4; + if (b == 2) { + learn = LEARN_MIN; + } + if (b == 3) { + learn = LEARN_MAX; + } + send_locks(learn); + } + if (event->mask == EVENT_BUTTON_RELEASED) { + if (note_interface.notes_all_off()){ + learn = LEARN_OFF; + } } + + } if (EVENT_PRESSED(event, Buttons.BUTTON4)) { diff --git a/avr/cores/megacommand/MCL/PerfPage.h b/avr/cores/megacommand/MCL/PerfPage.h index f7a9e212b..06c0bc7b3 100644 --- a/avr/cores/megacommand/MCL/PerfPage.h +++ b/avr/cores/megacommand/MCL/PerfPage.h @@ -29,8 +29,8 @@ class PerfPage : public LightPage, PerfPageParent { bool handleEvent(gui_event_t *event); - void draw_dest(uint8_t knob, uint8_t value); - void draw_param(uint8_t knob, uint8_t dest, uint8_t param); + void learn_param(uint8_t track, uint8_t param, uint8_t value); + void display(); void setup(); @@ -40,6 +40,8 @@ class PerfPage : public LightPage, PerfPageParent { virtual void config_encoders(); + void send_locks(uint8_t mode); + void setup_callbacks(); void remove_callbacks(); From 5a12d6e3f1f2b15ee67dea740d197b6f943cfc46 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 29 Jun 2023 15:14:02 +1000 Subject: [PATCH 124/413] Check in, encoder ranges fixed --- avr/cores/megacommand/GUI/GUI.h | 2 + avr/cores/megacommand/GUI/Pages.cpp | 4 +- avr/cores/megacommand/GUI/Pages.h | 9 +- avr/cores/megacommand/MCL/LFOPage.cpp | 34 +++++-- avr/cores/megacommand/MCL/LFOPage.h | 2 + avr/cores/megacommand/MCL/LFOSeqTrack.cpp | 19 ++-- avr/cores/megacommand/MCL/MCL.h | 2 +- avr/cores/megacommand/MCL/MCLEncoder.cpp | 1 - avr/cores/megacommand/MCL/MCLGUI.cpp | 2 +- avr/cores/megacommand/MCL/MCLGUI.h | 9 -- avr/cores/megacommand/MCL/PerfEncoder.cpp | 3 +- avr/cores/megacommand/MCL/PerfPage.cpp | 103 ++++++++++++++++------ avr/cores/megacommand/MCL/PerfPage.h | 8 +- avr/cores/megacommand/MCL/SeqPage.cpp | 2 +- avr/cores/megacommand/MCL/SeqStepPage.cpp | 2 +- 15 files changed, 139 insertions(+), 63 deletions(-) diff --git a/avr/cores/megacommand/GUI/GUI.h b/avr/cores/megacommand/GUI/GUI.h index 2337f2279..39aac5466 100644 --- a/avr/cores/megacommand/GUI/GUI.h +++ b/avr/cores/megacommand/GUI/GUI.h @@ -3,6 +3,8 @@ #ifndef GUI_H__ #define GUI_H__ +#define SHOW_VALUE_TIMEOUT 2000 + #include #include "Task.h" diff --git a/avr/cores/megacommand/GUI/Pages.cpp b/avr/cores/megacommand/GUI/Pages.cpp index 3b8528ff9..7567752fe 100644 --- a/avr/cores/megacommand/GUI/Pages.cpp +++ b/avr/cores/megacommand/GUI/Pages.cpp @@ -4,7 +4,7 @@ #include "Pages.h" #include "WProgram.h" #include "DiagnosticPage.h" - +#include "Encoders.h" /** * \addtogroup GUI * @@ -48,8 +48,6 @@ void PageParent::redisplayPage() { redisplay = true; } -uint16_t LightPage::encoders_used_clock[GUI_NUM_ENCODERS]; - void LightPage::update() { encoder_t _encoders[GUI_NUM_ENCODERS]; diff --git a/avr/cores/megacommand/GUI/Pages.h b/avr/cores/megacommand/GUI/Pages.h index 46366e022..b043a4e05 100644 --- a/avr/cores/megacommand/GUI/Pages.h +++ b/avr/cores/megacommand/GUI/Pages.h @@ -156,7 +156,8 @@ class LightPage : public PageParent { uint8_t curpage; PageContainer *parent; Encoder *encoders[GUI_NUM_ENCODERS]; - static uint16_t encoders_used_clock[GUI_NUM_ENCODERS]; + + uint16_t encoders_used_clock[4]; LightPage(Encoder *e1 = NULL, Encoder *e2 = NULL, Encoder *e3 = NULL, Encoder *e4 = NULL) { @@ -182,6 +183,12 @@ class LightPage : public PageParent { changed while locked, they will send out their new value. **/ void unlockEncoders() {} // TODO + + void init_encoders_used_clock() { + for (uint8_t n = 0; n < 4; n++) { + encoders_used_clock[n] = slowclock; + } + } }; class Page : public PageParent { diff --git a/avr/cores/megacommand/MCL/LFOPage.cpp b/avr/cores/megacommand/MCL/LFOPage.cpp index 1c3f8da3c..6177a3de4 100644 --- a/avr/cores/megacommand/MCL/LFOPage.cpp +++ b/avr/cores/megacommand/MCL/LFOPage.cpp @@ -37,6 +37,21 @@ void LFOPage::cleanup() { oled_display.clearDisplay(); } +void LFOPage::config_encoder_range(uint8_t i) { + + ((MCLEncoder *)encoders[i])->max = NUM_MD_TRACKS + 4 + 16; + + if (encoders[i]->cur >= NUM_MD_TRACKS + 4) { + ((MCLEncoder *)encoders[i + 1])->max = 127; + } + else if (encoders[i]->cur >= NUM_MD_TRACKS) { + ((MCLEncoder *)encoders[i + 1])->max = 7; + } + else { + ((MCLEncoder *)encoders[i + 1])->max = 23; + } +} + void LFOPage::config_encoders() { if (page_mode == LFO_DESTINATION) { encoders[0]->cur = lfo_track->params[0].dest; @@ -48,8 +63,8 @@ void LFOPage::config_encoders() { encoders[3]->cur = lfo_track->params[1].param; ((MCLEncoder *)encoders[3])->max = 23; - config_encoder_range(0,encoders); - config_encoder_range(2,encoders); + config_encoder_range(0); + config_encoder_range(2); } if (page_mode == LFO_SETTINGS) { encoders[0]->cur = waveform; @@ -66,13 +81,18 @@ void LFOPage::config_encoders() { } // loop(); - PerfPageParent::config_encoders_timeout(encoders); + for (uint8_t i = 0; i < GUI_NUM_ENCODERS; i++) { + encoders[i]->old = encoders[i]->cur; + encoders_used_clock[i] = + slowclock; + } + } void LFOPage::loop() { if (page_mode == LFO_DESTINATION) { - config_encoder_range(0,encoders); - config_encoder_range(2,encoders); + config_encoder_range(0); + config_encoder_range(2); if (encoders[0]->hasChanged()) { USE_LOCK(); @@ -239,11 +259,11 @@ void LFOPage::onControlChangeCallback_Midi(uint8_t *msg) { //Midi LEARN if (page_mode == LFO_DESTINATION) { - if (encoders[0]->cur == 0 && encoders[1]->cur > 1) { + if (encoders[0]->cur == 0 && encoders[1]->cur > 0) { encoders[0]->cur = track + 1; encoders[1]->cur = track_param; } - if (encoders[2]->cur == 0 && encoders[3]->cur > 1) { + if (encoders[2]->cur == 0 && encoders[3]->cur > 0) { encoders[2]->cur = track + 1; encoders[3]->cur = track_param; } diff --git a/avr/cores/megacommand/MCL/LFOPage.h b/avr/cores/megacommand/MCL/LFOPage.h index 3cc6052cd..153c95a42 100644 --- a/avr/cores/megacommand/MCL/LFOPage.h +++ b/avr/cores/megacommand/MCL/LFOPage.h @@ -49,6 +49,8 @@ class LFOPage : public SeqPage, PerfPageParent { void setup_callbacks(); void remove_callbacks(); + void config_encoder_range(uint8_t i); + void onControlChangeCallback_Midi(uint8_t *msg); }; diff --git a/avr/cores/megacommand/MCL/LFOSeqTrack.cpp b/avr/cores/megacommand/MCL/LFOSeqTrack.cpp index 25cc85046..aafddcac7 100644 --- a/avr/cores/megacommand/MCL/LFOSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/LFOSeqTrack.cpp @@ -88,17 +88,22 @@ void LFOSeqTrack::seq(MidiUartParent *uart_) { for (uint8_t i = 0; i < NUM_LFO_PARAMS; i++) { uint8_t wav_value = get_wav_value(sample_count, i); if (last_wav_value[i] != wav_value) { - - if (params[i].dest > 0) { + uint8_t dest = params[i].dest; + uint8_t param = params[i].param; + if (dest > 0) { // MD CC LFO - if (params[i].dest <= NUM_MD_TRACKS) { - MD.setTrackParam_inline(params[i].dest - 1, params[i].param, + if (dest <= NUM_MD_TRACKS) { + MD.setTrackParam_inline(dest - 1, param, wav_value, uart); } // MD FX LFO - else { - MD.sendFXParam(params[i].param, wav_value, - MD_FX_ECHO + params[i].dest - NUM_MD_TRACKS - 1, uart); + else if (dest <= NUM_MD_TRACKS + 4) { + MD.sendFXParam(param, wav_value, + MD_FX_ECHO + dest - NUM_MD_TRACKS - 1, uart); + } + else if (dest <= NUM_MD_TRACKS + 4 + 16) { + MidiUartClass *uart = &MidiUart2; + uart->sendCC(dest - 1, param, wav_value); } last_wav_value[i] = wav_value; } diff --git a/avr/cores/megacommand/MCL/MCL.h b/avr/cores/megacommand/MCL/MCL.h index 6d6d9b9d7..49aafe556 100644 --- a/avr/cores/megacommand/MCL/MCL.h +++ b/avr/cores/megacommand/MCL/MCL.h @@ -17,7 +17,7 @@ #include "Fonts/TomThumb.h" #define VERSION 4050 -#define VERSION_STR "T4.50" +#define VERSION_STR "S4.50" #define CALLBACK_TIMEOUT 500 #define GUI_NAME_TIMEOUT 800 diff --git a/avr/cores/megacommand/MCL/MCLEncoder.cpp b/avr/cores/megacommand/MCL/MCLEncoder.cpp index ffaa6e703..440336829 100644 --- a/avr/cores/megacommand/MCL/MCLEncoder.cpp +++ b/avr/cores/megacommand/MCL/MCLEncoder.cpp @@ -5,7 +5,6 @@ int MCLEncoder::update(encoder_t *enc) { int inc = update_rotations(enc); inc = inc + (fastmode ? 4 * enc->button : enc->button); cur = limit_value(cur, inc, min, max); - return cur; } diff --git a/avr/cores/megacommand/MCL/MCLGUI.cpp b/avr/cores/megacommand/MCL/MCLGUI.cpp index e07fddf8e..b63123bb8 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.cpp +++ b/avr/cores/megacommand/MCL/MCLGUI.cpp @@ -345,7 +345,7 @@ bool MCLGUI::show_encoder_value(Encoder *encoder) { return true; } else { ((LightPage *)GUI.currentPage())->encoders_used_clock[match] = - slowclock - SHOW_VALUE_TIMEOUT - 1; + slowclock + SHOW_VALUE_TIMEOUT + 1; } } diff --git a/avr/cores/megacommand/MCL/MCLGUI.h b/avr/cores/megacommand/MCL/MCLGUI.h index e417af4a4..1ca93941b 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.h +++ b/avr/cores/megacommand/MCL/MCLGUI.h @@ -6,8 +6,6 @@ #include "QuestionDialogPage.h" #include "TextInputPage.h" -#define SHOW_VALUE_TIMEOUT 2000 - class MCLGUI { public: uint8_t s_progress_cookie = 0b00110011; @@ -84,13 +82,6 @@ class MCLGUI { void draw_knob(uint8_t i, const char *title, const char *text); void draw_knob(uint8_t i, Encoder *enc, const char *name); - void init_encoders_used_clock() { - - for (uint8_t n = 0; n < GUI_NUM_ENCODERS; n++) { - ((LightPage *)GUI.currentPage())->encoders_used_clock[n] = - slowclock - SHOW_VALUE_TIMEOUT - 1; - } - } static constexpr uint8_t seq_w = 5; static constexpr uint8_t led_h = 3; static constexpr uint8_t trig_h = 5; diff --git a/avr/cores/megacommand/MCL/PerfEncoder.cpp b/avr/cores/megacommand/MCL/PerfEncoder.cpp index 0986ab802..47f49aed5 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.cpp +++ b/avr/cores/megacommand/MCL/PerfEncoder.cpp @@ -10,8 +10,7 @@ int PerfEncoder::update(encoder_t *enc) { if (hasChanged()) { for (uint8_t n = 0; n < NUM_PERF_PARAMS; n++) { if (perf_data.params[n].dest == 0) { continue; } - MidiUartClass *uart = &MidiUart; - if (perf_data.params[n].dest > 20) { uart = &MidiUart2; } + MidiUartClass *uart = &MidiUart2; uint8_t dest = perf_data.params[n].dest - 1; uint8_t param = perf_data.params[n].param; diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index ce32b0ed0..1faafd9ea 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -1,5 +1,6 @@ #include "MCL_impl.h" #include "ResourceManager.h" +#include "MCLMemory.h" #define LEARN_MIN 1 #define LEARN_MAX 2 @@ -23,6 +24,24 @@ void PerfPage::init() { void PerfPage::cleanup() { PerfPageParent::cleanup(); } +void PerfPage::config_encoder_range(uint8_t i) { + ((PerfEncoder *)encoders[i])->max = NUM_MD_TRACKS + 4 + 16; + ((PerfEncoder *)encoders[i + 1])->min = 0; + + + DEBUG_PRINTLN(encoders[i]->cur); + DEBUG_PRINTLN(encoders[i + 1]->cur); + if (encoders[i]->cur >= 16 + 4) { + ((PerfEncoder *)encoders[i + 1])->max = 127; + } + else if (encoders[i]->cur >= 16) { + ((PerfEncoder *)encoders[i + 1])->max = 7; + } + else { + ((PerfEncoder *)encoders[i + 1])->max = 23; + } +} + void PerfPage::config_encoders() { encoders[1] = &fx_param2; encoders[2] = &fx_param3; @@ -42,30 +61,34 @@ void PerfPage::config_encoders() { encoders[3]->cur = p->max; ((PerfEncoder *)encoders[3])->max = 127; - config_encoder_range(0,encoders); + config_encoder_range(0); } if (page_mode == PERF_DESTINATION) { - encoders[0] = perf_encoders[0]; + encoders[0] = perf_encoders[perf_id]; ((PerfEncoder *)encoders[0])->max = 127; - config_encoder_range(1,encoders); + config_encoder_range(1); PerfParam *p = &perf_encoders[perf_id]->perf_data.src_param; encoders[1]->cur = p->dest; encoders[2]->cur = p->param; - encoders[3]->cur = p->max; + encoders[3]->cur = p->min; ((PerfEncoder *)encoders[3])->max = 127; } - - // loop(); - PerfPageParent::config_encoders_timeout(encoders); +/* + for (uint8_t i = 0; i < GUI_NUM_ENCODERS; i++) { + encoders[i]->old = encoders[i]->cur; + ((LightPage *)this)->encoders_used_clock[i] = + slowclock - SHOW_VALUE_TIMEOUT - 1; + } +*/ } - -void PerfPage::loop() { - +void PerfPage::update_params() { if (page_mode < PERF_DESTINATION) { + config_encoder_range(0); + if (encoders[0]->hasChanged() && encoders[0]->cur == 0) { encoders[1]->cur = 0; } @@ -76,8 +99,23 @@ void PerfPage::loop() { p->min = encoders[2]->cur; p->max = encoders[3]->cur; } + else { + config_encoder_range(1); + + if (encoders[1]->hasChanged() && encoders[1]->cur == 0) { + encoders[2]->cur = 0; + } + uint8_t c = page_mode; + PerfParam *p = &perf_encoders[perf_id]->perf_data.src_param; + p->dest = encoders[1]->cur; + p->param = encoders[2]->cur; + p->min = encoders[3]->cur; + } + +} - config_encoder_range(0,encoders); +void PerfPage::loop() { + update_params(); } void PerfPage::display() { @@ -120,19 +158,30 @@ void PerfPage::display() { oled_display.setFont(oldfont); } -void PerfPage::learn_param(uint8_t track, uint8_t param, uint8_t value) { +void PerfPage::learn_param(uint8_t dest, uint8_t param, uint8_t value) { + //Intercept controller param. + PerfParam *p = &perf_encoders[perf_id]->perf_data.src_param; + if (dest + 1== p->dest && param == p->param) { + perf_encoders[perf_id]->cur = value; + } + if (learn) { PerfData *d = &perf_encoders[perf_id]->perf_data; - uint8_t n = d->add_param(track, param, learn, value); - if (n == page_mode) { config_encoders(); } + uint8_t n = d->add_param(dest, param, learn, value); + page_mode = n; + config_encoders(); } //MIDI LEARN current mode; uint8_t a = page_mode == PERF_DESTINATION ? 1 : 0; - if (encoders[a]->cur == 0 && encoders[a + 1]->cur > 1) { - encoders[a]->cur = track + 1; + + if (encoders[a]->cur == 0 && encoders[a + 1]->cur > 0) { + encoders[a]->cur = dest + 1; encoders[a + 1]->cur = param; - } + encoders[a + 2]->cur = 0; + update_params(); + config_encoders(); + } } @@ -221,27 +270,29 @@ bool PerfPage::handleEvent(gui_event_t *event) { uint8_t track = event->source - 128; - if (!learn) { return true; } - - if (event->mask == EVENT_BUTTON_PRESSED) { - perf_id = track / 4; + uint8_t id = track / 4; + if (perf_id != id) { + perf_id = track / 4; + config_encoders(); + } uint8_t b = track - (perf_id) * 4; - if (b == 2) { + if (b == 0) { learn = LEARN_MIN; } - if (b == 3) { + if (b == 1) { learn = LEARN_MAX; } - send_locks(learn); + if (page_mode < PERF_DESTINATION) { + send_locks(learn); + } } if (event->mask == EVENT_BUTTON_RELEASED) { if (note_interface.notes_all_off()){ learn = LEARN_OFF; + MD.deactivate_encoder_interface(); } } - - } if (EVENT_PRESSED(event, Buttons.BUTTON4)) { diff --git a/avr/cores/megacommand/MCL/PerfPage.h b/avr/cores/megacommand/MCL/PerfPage.h index 06c0bc7b3..041ad0d76 100644 --- a/avr/cores/megacommand/MCL/PerfPage.h +++ b/avr/cores/megacommand/MCL/PerfPage.h @@ -19,7 +19,7 @@ class PerfPage : public LightPage, PerfPageParent { : LightPage(e1, e2, e3, e4) { } - bool learn = false; + uint8_t learn = 0; bool midi_state = false; uint8_t page_mode; @@ -28,8 +28,8 @@ class PerfPage : public LightPage, PerfPageParent { PerfEncoder *perf_encoders[4]; bool handleEvent(gui_event_t *event); - - void learn_param(uint8_t track, uint8_t param, uint8_t value); + void update_params(); + void learn_param(uint8_t dest, uint8_t param, uint8_t value); void display(); void setup(); @@ -45,6 +45,8 @@ class PerfPage : public LightPage, PerfPageParent { void setup_callbacks(); void remove_callbacks(); + void config_encoder_range(uint8_t i); + void onControlChangeCallback_Midi(uint8_t *msg); void onControlChangeCallback_Midi2(uint8_t *msg); }; diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index 9ecf5c601..657dea657 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -438,7 +438,7 @@ bool SeqPage::handleEvent(gui_event_t *event) { show_seq_menu = false; show_step_menu = false; - mcl_gui.init_encoders_used_clock(); + init_encoders_used_clock(); init(); return true; } diff --git a/avr/cores/megacommand/MCL/SeqStepPage.cpp b/avr/cores/megacommand/MCL/SeqStepPage.cpp index e65f7751d..59375a983 100644 --- a/avr/cores/megacommand/MCL/SeqStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqStepPage.cpp @@ -263,7 +263,7 @@ void SeqStepPage::loop() { } if (note_interface.notes_all_off_md() && !grid_page.bank_popup) { - mcl_gui.init_encoders_used_clock(); + init_encoders_used_clock(); // active_track.reset_params(); MD.deactivate_encoder_interface(); From b61b19ae9c19f73a8bcb9981e649a862d5a3c700 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 29 Jun 2023 20:02:27 +1000 Subject: [PATCH 125/413] Fix encoders_used_clock --- avr/cores/megacommand/GUI/GUI.cpp | 10 +--------- avr/cores/megacommand/GUI/Pages.cpp | 1 - avr/cores/megacommand/GUI/Pages.h | 2 +- avr/cores/megacommand/MCL/FXPage.cpp | 5 ++--- avr/cores/megacommand/MCL/PerfPage.cpp | 8 +++----- 5 files changed, 7 insertions(+), 19 deletions(-) diff --git a/avr/cores/megacommand/GUI/GUI.cpp b/avr/cores/megacommand/GUI/GUI.cpp index 01743f7e6..d7a15e2e8 100644 --- a/avr/cores/megacommand/GUI/GUI.cpp +++ b/avr/cores/megacommand/GUI/GUI.cpp @@ -101,12 +101,10 @@ void GuiClass::loop() { if (page != NULL) { page->update(); page->loop(); + page->finalize(); } } - if (sketch != NULL) { - sketch->loop(); - } #ifndef HOST_MIDIDUINO ::loop(); #endif @@ -119,12 +117,6 @@ void GuiClass::loop() { display(); - if (sketch != NULL) { - PageParent *page = sketch->currentPage(); - if (page != NULL) { - page->finalize(); - } - } MidiUartParent::handle_midi_lock = _midi_lock_tmp; } diff --git a/avr/cores/megacommand/GUI/Pages.cpp b/avr/cores/megacommand/GUI/Pages.cpp index 7567752fe..0f1aec445 100644 --- a/avr/cores/megacommand/GUI/Pages.cpp +++ b/avr/cores/megacommand/GUI/Pages.cpp @@ -34,7 +34,6 @@ void PageContainer::pushPage(LightPage* page) { } pageStack.push(page); - page->init(); page->redisplayPage(); page->show(); diff --git a/avr/cores/megacommand/GUI/Pages.h b/avr/cores/megacommand/GUI/Pages.h index b043a4e05..7966f577f 100644 --- a/avr/cores/megacommand/GUI/Pages.h +++ b/avr/cores/megacommand/GUI/Pages.h @@ -186,7 +186,7 @@ class LightPage : public PageParent { void init_encoders_used_clock() { for (uint8_t n = 0; n < 4; n++) { - encoders_used_clock[n] = slowclock; + encoders_used_clock[n] = slowclock + SHOW_VALUE_TIMEOUT + 1; } } }; diff --git a/avr/cores/megacommand/MCL/FXPage.cpp b/avr/cores/megacommand/MCL/FXPage.cpp index 1bfb653c5..9d9f42914 100644 --- a/avr/cores/megacommand/MCL/FXPage.cpp +++ b/avr/cores/megacommand/MCL/FXPage.cpp @@ -42,11 +42,10 @@ void FXPage::update_encoders() { encoders[n]->cur = MD.kit.dynamics[fx_param]; break; } - encoders[n]->old = encoders[n]->cur; - ((LightPage *)this)->encoders_used_clock[n] = - slowclock - SHOW_VALUE_TIMEOUT - 1; } + + init_encoders_used_clock(); } void FXPage::cleanup() { diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 1faafd9ea..a30831260 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -77,13 +77,11 @@ void PerfPage::config_encoders() { ((PerfEncoder *)encoders[3])->max = 127; } -/* - for (uint8_t i = 0; i < GUI_NUM_ENCODERS; i++) { + + for (uint8_t i = 0; i < GUI_NUM_ENCODERS; i++) { encoders[i]->old = encoders[i]->cur; - ((LightPage *)this)->encoders_used_clock[i] = - slowclock - SHOW_VALUE_TIMEOUT - 1; + ((LightPage *)this)->encoders_used_clock[i] = slowclock; } -*/ } void PerfPage::update_params() { if (page_mode < PERF_DESTINATION) { From 35733cc45c2f709da1b1ce0d6d96d9ca6367347b Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 29 Jun 2023 22:49:26 +1000 Subject: [PATCH 126/413] learning and mapping. --- avr/cores/megacommand/MCL/LFOPage.cpp | 40 ++--------- avr/cores/megacommand/MCL/LFOPage.h | 6 +- avr/cores/megacommand/MCL/LFOSeqTrack.cpp | 32 +++++---- avr/cores/megacommand/MCL/MCLSeq.cpp | 13 ++-- avr/cores/megacommand/MCL/PerfEncoder.cpp | 31 +++++---- avr/cores/megacommand/MCL/PerfEncoder.h | 2 +- avr/cores/megacommand/MCL/PerfPage.cpp | 81 ++++++----------------- avr/cores/megacommand/MCL/PerfPage.h | 4 +- 8 files changed, 68 insertions(+), 141 deletions(-) diff --git a/avr/cores/megacommand/MCL/LFOPage.cpp b/avr/cores/megacommand/MCL/LFOPage.cpp index 6177a3de4..066cce8af 100644 --- a/avr/cores/megacommand/MCL/LFOPage.cpp +++ b/avr/cores/megacommand/MCL/LFOPage.cpp @@ -245,51 +245,19 @@ void LFOPage::display() { oled_display.setFont(oldfont); } -void LFOPage::onControlChangeCallback_Midi(uint8_t *msg) { - uint8_t channel = MIDI_VOICE_CHANNEL(msg[0]); - uint8_t param = msg[1]; - uint8_t value = msg[2]; - uint8_t track; - uint8_t track_param; - // If external keyboard controlling MD pitch, send parameter updates - // to all polyphonic tracks - - MD.parseCC(channel, param, &track, &track_param); - if (track > 15) { return; } - - //Midi LEARN +void LFOPage::learn_param(uint8_t track, uint8_t param, uint8_t value) { + if (mcl.currentPage() == LFO_PAGE) { if (page_mode == LFO_DESTINATION) { if (encoders[0]->cur == 0 && encoders[1]->cur > 0) { encoders[0]->cur = track + 1; - encoders[1]->cur = track_param; + encoders[1]->cur = param; } if (encoders[2]->cur == 0 && encoders[3]->cur > 0) { encoders[2]->cur = track + 1; - encoders[3]->cur = track_param; + encoders[3]->cur = param; } } - -} - -void LFOPage::setup_callbacks() { - if (midi_state) { - return; } - Midi.addOnControlChangeCallback( - this, (midi_callback_ptr_t)&LFOPage::onControlChangeCallback_Midi); - - midi_state = true; -} - -void LFOPage::remove_callbacks() { - if (!midi_state) { - return; - } - - Midi.removeOnControlChangeCallback( - this, (midi_callback_ptr_t)&LFOPage::onControlChangeCallback_Midi); - - midi_state = false; } diff --git a/avr/cores/megacommand/MCL/LFOPage.h b/avr/cores/megacommand/MCL/LFOPage.h index 153c95a42..e176b9ec4 100644 --- a/avr/cores/megacommand/MCL/LFOPage.h +++ b/avr/cores/megacommand/MCL/LFOPage.h @@ -46,12 +46,8 @@ class LFOPage : public SeqPage, PerfPageParent { void cleanup(); virtual void config_encoders(); - void setup_callbacks(); - void remove_callbacks(); - void config_encoder_range(uint8_t i); - - void onControlChangeCallback_Midi(uint8_t *msg); + void learn_param(uint8_t track, uint8_t param, uint8_t value); }; extern MCLEncoder lfo_page_param1; diff --git a/avr/cores/megacommand/MCL/LFOSeqTrack.cpp b/avr/cores/megacommand/MCL/LFOSeqTrack.cpp index aafddcac7..dee58f63f 100644 --- a/avr/cores/megacommand/MCL/LFOSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/LFOSeqTrack.cpp @@ -88,25 +88,23 @@ void LFOSeqTrack::seq(MidiUartParent *uart_) { for (uint8_t i = 0; i < NUM_LFO_PARAMS; i++) { uint8_t wav_value = get_wav_value(sample_count, i); if (last_wav_value[i] != wav_value) { - uint8_t dest = params[i].dest; + uint8_t dest = params[i].dest - 1; uint8_t param = params[i].param; - if (dest > 0) { - // MD CC LFO - if (dest <= NUM_MD_TRACKS) { - MD.setTrackParam_inline(dest - 1, param, - wav_value, uart); - } - // MD FX LFO - else if (dest <= NUM_MD_TRACKS + 4) { - MD.sendFXParam(param, wav_value, - MD_FX_ECHO + dest - NUM_MD_TRACKS - 1, uart); - } - else if (dest <= NUM_MD_TRACKS + 4 + 16) { - MidiUartClass *uart = &MidiUart2; - uart->sendCC(dest - 1, param, wav_value); - } - last_wav_value[i] = wav_value; + if (dest == 0) { + continue; } + + if (dest > NUM_MD_TRACKS + 4) { + uint8_t channel = dest - NUM_MD_TRACKS; + MidiUart2.sendCC(channel, param, wav_value); + } else if (dest > NUM_MD_TRACKS) { + MD.sendFXParam(param, wav_value, MD_FX_ECHO + dest - NUM_MD_TRACKS, + uart); + } else { + MD.setTrackParam_inline(dest, param, wav_value, uart); + } + + last_wav_value[i] = wav_value; } } } diff --git a/avr/cores/megacommand/MCL/MCLSeq.cpp b/avr/cores/megacommand/MCL/MCLSeq.cpp index 3fe39299f..dd7fa0368 100644 --- a/avr/cores/megacommand/MCL/MCLSeq.cpp +++ b/avr/cores/megacommand/MCL/MCLSeq.cpp @@ -325,26 +325,28 @@ void MCLSeqMidiEvents::onControlChangeCallback_Midi(uint8_t *msg) { if (track_param > 23) { return; } // ignore level/mute + perf_page.learn_param(track, track_param, value); + lfo_page.learn_param(track, track_param, value); + if (!update_params) { return; } mcl_seq.md_tracks[track].update_param(track_param, value); -#ifdef LFO_TRACKS for (uint8_t n = 0; n < mcl_seq.num_lfo_tracks; n++) { mcl_seq.lfo_tracks[n].check_and_update_params_offset(track + 1, track_param, value); } -#endif + } void MCLSeqMidiEvents::onControlChangeCallback_Midi2(uint8_t *msg) { uint8_t channel = MIDI_VOICE_CHANNEL(msg[0]); uint8_t param = msg[1]; uint8_t value = msg[2]; -#ifdef EXT_TRACKS + + if (param == midi_active_peering.get_device(UART2_PORT)->get_mute_cc()) { for (uint8_t n = 0; n < NUM_EXT_TRACKS; n++) { if (mcl_seq.ext_tracks[n].channel == channel) { - if (param == midi_active_peering.get_device(UART2_PORT)->get_mute_cc()) { if (value > 0) { CLEAR_BIT16(mixer_page.mute_sets[1][mixer_page.current_mute_set], n); mcl_seq.ext_tracks[n].mute_state = SEQ_MUTE_ON; @@ -357,8 +359,9 @@ void MCLSeqMidiEvents::onControlChangeCallback_Midi2(uint8_t *msg) { mcl_seq.ext_tracks[n].update_param(param, value); } } + return; } -#endif + perf_page.learn_param(channel + 16 + 4, param, value); } void MCLSeqMidiEvents::setup_callbacks() { diff --git a/avr/cores/megacommand/MCL/PerfEncoder.cpp b/avr/cores/megacommand/MCL/PerfEncoder.cpp index 47f49aed5..e45f0562d 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.cpp +++ b/avr/cores/megacommand/MCL/PerfEncoder.cpp @@ -4,10 +4,7 @@ #define DIV_1_127 (1.00f / 127.0f) -int PerfEncoder::update(encoder_t *enc) { - MCLEncoder::update(enc); - //Update all params - if (hasChanged()) { +void PerfEncoder::send_params() { for (uint8_t n = 0; n < NUM_PERF_PARAMS; n++) { if (perf_data.params[n].dest == 0) { continue; } MidiUartClass *uart = &MidiUart2; @@ -17,20 +14,26 @@ int PerfEncoder::update(encoder_t *enc) { uint8_t min = perf_data.params[n].min; uint8_t max = perf_data.params[n].max; int8_t range = max - min; - uint16_t q = cur * range; - uint8_t val = ((float)q * DIV_1_127) + min; - - if (dest < NUM_MD_TRACKS) { - MD.setTrackParam_inline(dest, param, val, uart); - } - if (dest < NUM_MD_TRACKS + 4) { - - } - else if (dest < NUM_MD_TRACKS + 4 + 16) { + int16_t q = cur * range; + uint8_t val = ((int16_t) q / (int16_t) 128) + min; + if (dest > NUM_MD_TRACKS + 4) { uint8_t channel = dest - NUM_MD_TRACKS; uart->sendCC(channel, param, val); } + else if (dest > NUM_MD_TRACKS ) { + MD.sendFXParam(param, val, MD_FX_ECHO + dest - NUM_MD_TRACKS); } + else { + MD.setTrackParam_inline(dest, param, val); + } + } +} + +int PerfEncoder::update(encoder_t *enc) { + MCLEncoder::update(enc); + //Update all params + if (hasChanged()) { + send_params(); } return cur; } diff --git a/avr/cores/megacommand/MCL/PerfEncoder.h b/avr/cores/megacommand/MCL/PerfEncoder.h index 95e55eb17..37c88d860 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.h +++ b/avr/cores/megacommand/MCL/PerfEncoder.h @@ -14,7 +14,7 @@ class PerfEncoder : public MCLEncoder { public: PerfData perf_data; - + void send_params(); /** Create a new range-limited encoder with max and min value, short name, initial value, and handling function. The initRangeEncoder diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index a30831260..700af039a 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -67,12 +67,11 @@ void PerfPage::config_encoders() { if (page_mode == PERF_DESTINATION) { encoders[0] = perf_encoders[perf_id]; ((PerfEncoder *)encoders[0])->max = 127; - config_encoder_range(1); PerfParam *p = &perf_encoders[perf_id]->perf_data.src_param; encoders[1]->cur = p->dest; encoders[2]->cur = p->param; - + config_encoder_range(1); encoders[3]->cur = p->min; ((PerfEncoder *)encoders[3])->max = 127; @@ -130,15 +129,16 @@ void PerfPage::display() { // mcl_gui.draw_vertical_dashline(x, 0, knob_y); mcl_gui.draw_knob_frame(); + const char *info2 = "PERFORM"; const char *info1; - const char *info2; if (page_mode < PERF_DESTINATION) { draw_dest(0, encoders[0]->cur); draw_param(1, encoders[0]->cur, encoders[1]->cur); mcl_gui.draw_knob(2, encoders[2], "MIN"); mcl_gui.draw_knob(3, encoders[3], "MAX"); - info2 = "PER>DST"; + info1 = "PARAM 1"; + mcl_gui.put_value_at(page_mode + 1, info1 + 6); } if (page_mode == PERF_DESTINATION) { char *str = "A "; @@ -147,7 +147,7 @@ void PerfPage::display() { draw_dest(1, encoders[1]->cur); draw_param(2, encoders[1]->cur, encoders[2]->cur); mcl_gui.draw_knob(3, encoders[3], "MIN"); - info2 = "PER>MOD"; + info1 = "CONTROL"; } mcl_gui.draw_panel_labels(info1, info2); @@ -160,8 +160,19 @@ void PerfPage::learn_param(uint8_t dest, uint8_t param, uint8_t value) { //Intercept controller param. PerfParam *p = &perf_encoders[perf_id]->perf_data.src_param; if (dest + 1== p->dest && param == p->param) { - perf_encoders[perf_id]->cur = value; + //Controller param, start value; + uint8_t min = p->min; + uint8_t max = 127; + if (value >= min) { + uint8_t cur = value - min; + int8_t range = max - min; + uint8_t val = ((float) cur / (float) range) * 127.0f; + perf_encoders[perf_id]->cur = val; + perf_encoders[perf_id]->send_params(); + if (mcl.currentPage() == PERF_PAGE_0) { update_params(); } + } } + if (mcl.currentPage() == PERF_PAGE_0) { if (learn) { PerfData *d = &perf_encoders[perf_id]->perf_data; @@ -180,58 +191,7 @@ void PerfPage::learn_param(uint8_t dest, uint8_t param, uint8_t value) { update_params(); config_encoders(); } - -} - -void PerfPage::onControlChangeCallback_Midi(uint8_t *msg) { - uint8_t channel = MIDI_VOICE_CHANNEL(msg[0]); - uint8_t param = msg[1]; - uint8_t value = msg[2]; - uint8_t track; - uint8_t track_param; - // If external keyboard controlling MD pitch, send parameter updates - // to all polyphonic tracks - - MD.parseCC(channel, param, &track, &track_param); - if (track > 15) { - return; - } - - learn_param(track, track_param, value); - -} - -void PerfPage::onControlChangeCallback_Midi2(uint8_t *msg) { - uint8_t channel = MIDI_VOICE_CHANNEL(msg[0]); - uint8_t param = msg[1]; - uint8_t value = msg[2]; - learn_param(channel + 16 + 4, param, value); -} - - -void PerfPage::setup_callbacks() { - if (midi_state) { - return; - } - Midi.addOnControlChangeCallback( - this, (midi_callback_ptr_t)&PerfPage::onControlChangeCallback_Midi); - Midi2.addOnControlChangeCallback( - this, (midi_callback_ptr_t)&PerfPage::onControlChangeCallback_Midi2); - - midi_state = true; -} - -void PerfPage::remove_callbacks() { - if (!midi_state) { - return; } - - Midi.removeOnControlChangeCallback( - this, (midi_callback_ptr_t)&PerfPage::onControlChangeCallback_Midi); - Midi2.removeOnControlChangeCallback( - this, (midi_callback_ptr_t)&PerfPage::onControlChangeCallback_Midi2); - - midi_state = false; } void PerfPage::send_locks(uint8_t mode) { @@ -281,14 +241,15 @@ bool PerfPage::handleEvent(gui_event_t *event) { if (b == 1) { learn = LEARN_MAX; } - if (page_mode < PERF_DESTINATION) { - send_locks(learn); - } + send_locks(learn); + old_mode = page_mode; } if (event->mask == EVENT_BUTTON_RELEASED) { if (note_interface.notes_all_off()){ learn = LEARN_OFF; MD.deactivate_encoder_interface(); + page_mode = old_mode; + config_encoders(); } } } diff --git a/avr/cores/megacommand/MCL/PerfPage.h b/avr/cores/megacommand/MCL/PerfPage.h index 041ad0d76..6c4bb2991 100644 --- a/avr/cores/megacommand/MCL/PerfPage.h +++ b/avr/cores/megacommand/MCL/PerfPage.h @@ -20,6 +20,7 @@ class PerfPage : public LightPage, PerfPageParent { } uint8_t learn = 0; + uint8_t old_mode = 0; bool midi_state = false; uint8_t page_mode; @@ -42,9 +43,6 @@ class PerfPage : public LightPage, PerfPageParent { void send_locks(uint8_t mode); - void setup_callbacks(); - void remove_callbacks(); - void config_encoder_range(uint8_t i); void onControlChangeCallback_Midi(uint8_t *msg); From db442cfbce61a6f7bd0b26be4d68077edbddfac2 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 29 Jun 2023 23:26:40 +1000 Subject: [PATCH 127/413] consistency --- avr/cores/megacommand/GUI/GUI.cpp | 6 ++++-- avr/cores/megacommand/MCL/LFOPage.cpp | 5 +++-- avr/cores/megacommand/MCL/LFOSeqTrack.cpp | 4 ++-- avr/cores/megacommand/MCL/PerfEncoder.cpp | 8 ++++---- avr/cores/megacommand/MCL/PerfPage.cpp | 14 ++++++-------- 5 files changed, 19 insertions(+), 18 deletions(-) diff --git a/avr/cores/megacommand/GUI/GUI.cpp b/avr/cores/megacommand/GUI/GUI.cpp index d7a15e2e8..50ce299eb 100644 --- a/avr/cores/megacommand/GUI/GUI.cpp +++ b/avr/cores/megacommand/GUI/GUI.cpp @@ -66,8 +66,8 @@ void GuiClass::loop() { uint8_t _midi_lock_tmp = MidiUartParent::handle_midi_lock; + MidiUartParent::handle_midi_lock = 1; while (!EventRB.isEmpty()) { - MidiUartParent::handle_midi_lock = 1; clock_minutes = 0; oled_display.screen_saver = false; gui_event_t event; @@ -88,7 +88,6 @@ void GuiClass::loop() { } } - MidiUartParent::handle_midi_lock = 1; for (int i = 0; i < tasks.size; i++) { if (tasks.arr[i] != NULL) { tasks.arr[i]->checkTask(); @@ -99,7 +98,10 @@ void GuiClass::loop() { if (sketch != NULL) { PageParent *page = sketch->currentPage(); if (page != NULL) { + + MidiUartParent::handle_midi_lock = 1; page->update(); + MidiUartParent::handle_midi_lock = 0; page->loop(); page->finalize(); } diff --git a/avr/cores/megacommand/MCL/LFOPage.cpp b/avr/cores/megacommand/MCL/LFOPage.cpp index 066cce8af..93c02eb04 100644 --- a/avr/cores/megacommand/MCL/LFOPage.cpp +++ b/avr/cores/megacommand/MCL/LFOPage.cpp @@ -41,10 +41,11 @@ void LFOPage::config_encoder_range(uint8_t i) { ((MCLEncoder *)encoders[i])->max = NUM_MD_TRACKS + 4 + 16; - if (encoders[i]->cur >= NUM_MD_TRACKS + 4) { + uint8_t dest = encoders[i]->cur - 1; + if (dest >= NUM_MD_TRACKS + 4) { ((MCLEncoder *)encoders[i + 1])->max = 127; } - else if (encoders[i]->cur >= NUM_MD_TRACKS) { + else if (dest >= NUM_MD_TRACKS) { ((MCLEncoder *)encoders[i + 1])->max = 7; } else { diff --git a/avr/cores/megacommand/MCL/LFOSeqTrack.cpp b/avr/cores/megacommand/MCL/LFOSeqTrack.cpp index dee58f63f..dbd649bec 100644 --- a/avr/cores/megacommand/MCL/LFOSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/LFOSeqTrack.cpp @@ -94,10 +94,10 @@ void LFOSeqTrack::seq(MidiUartParent *uart_) { continue; } - if (dest > NUM_MD_TRACKS + 4) { + if (dest >= NUM_MD_TRACKS + 4) { uint8_t channel = dest - NUM_MD_TRACKS; MidiUart2.sendCC(channel, param, wav_value); - } else if (dest > NUM_MD_TRACKS) { + } else if (dest >= NUM_MD_TRACKS) { MD.sendFXParam(param, wav_value, MD_FX_ECHO + dest - NUM_MD_TRACKS, uart); } else { diff --git a/avr/cores/megacommand/MCL/PerfEncoder.cpp b/avr/cores/megacommand/MCL/PerfEncoder.cpp index e45f0562d..8ae97dcad 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.cpp +++ b/avr/cores/megacommand/MCL/PerfEncoder.cpp @@ -7,7 +7,6 @@ void PerfEncoder::send_params() { for (uint8_t n = 0; n < NUM_PERF_PARAMS; n++) { if (perf_data.params[n].dest == 0) { continue; } - MidiUartClass *uart = &MidiUart2; uint8_t dest = perf_data.params[n].dest - 1; uint8_t param = perf_data.params[n].param; @@ -16,12 +15,13 @@ void PerfEncoder::send_params() { int8_t range = max - min; int16_t q = cur * range; uint8_t val = ((int16_t) q / (int16_t) 128) + min; - if (dest > NUM_MD_TRACKS + 4) { + if (dest >= NUM_MD_TRACKS + 4) { uint8_t channel = dest - NUM_MD_TRACKS; - uart->sendCC(channel, param, val); + MidiUart2.sendCC(channel, param, val); } - else if (dest > NUM_MD_TRACKS ) { + else if (dest >= NUM_MD_TRACKS ) { MD.sendFXParam(param, val, MD_FX_ECHO + dest - NUM_MD_TRACKS); + setLed2(); } else { MD.setTrackParam_inline(dest, param, val); diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 700af039a..4779200a1 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -28,17 +28,15 @@ void PerfPage::config_encoder_range(uint8_t i) { ((PerfEncoder *)encoders[i])->max = NUM_MD_TRACKS + 4 + 16; ((PerfEncoder *)encoders[i + 1])->min = 0; - - DEBUG_PRINTLN(encoders[i]->cur); - DEBUG_PRINTLN(encoders[i + 1]->cur); - if (encoders[i]->cur >= 16 + 4) { - ((PerfEncoder *)encoders[i + 1])->max = 127; + uint8_t dest = encoders[i]->cur - 1; + if (dest >= NUM_MD_TRACKS + 4) { + ((MCLEncoder *)encoders[i + 1])->max = 127; } - else if (encoders[i]->cur >= 16) { - ((PerfEncoder *)encoders[i + 1])->max = 7; + else if (dest >= NUM_MD_TRACKS) { + ((MCLEncoder *)encoders[i + 1])->max = 7; } else { - ((PerfEncoder *)encoders[i + 1])->max = 23; + ((MCLEncoder *)encoders[i + 1])->max = 23; } } From bbb0f5a3e54cad1731acb20eb23c865c06164415 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 29 Jun 2023 23:29:45 +1000 Subject: [PATCH 128/413] forgot to checkin --- avr/cores/megacommand/MCL/PerfPageParent.cpp | 99 ++++++++++++++++++++ avr/cores/megacommand/MCL/PerfPageParent.h | 34 +++++++ 2 files changed, 133 insertions(+) create mode 100644 avr/cores/megacommand/MCL/PerfPageParent.cpp create mode 100644 avr/cores/megacommand/MCL/PerfPageParent.h diff --git a/avr/cores/megacommand/MCL/PerfPageParent.cpp b/avr/cores/megacommand/MCL/PerfPageParent.cpp new file mode 100644 index 000000000..baccce36e --- /dev/null +++ b/avr/cores/megacommand/MCL/PerfPageParent.cpp @@ -0,0 +1,99 @@ +#include "MCLEncoder.h" +#include "MCL_impl.h" +#include "PerfPageParent.h" +#include "ResourceManager.h" + +void PerfPageParent::setup() { DEBUG_PRINT_FN(); } + +void PerfPageParent::init() { + DEBUG_PRINT_FN(); + oled_display.clearDisplay(); + oled_display.setFont(); + config_encoders(); + R.Clear(); + R.use_machine_param_names(); + setup_callbacks(); +} + +void PerfPageParent::cleanup() { remove_callbacks(); } + +void PerfPageParent::loop() {} + +void PerfPageParent::draw_param(uint8_t knob, uint8_t dest, uint8_t param) { + + char myName[4] = "-- "; + + const char *modelname = NULL; + if (dest == 0) { + if (param > 1) { + strcpy(myName, "LER"); + } + } else { + dest = dest - 1; + if (dest >= NUM_MD_TRACKS + 4) { + mcl_gui.put_value_at(param, myName); + } else if (dest >= NUM_MD_TRACKS) { + modelname = fx_param_name(MD_FX_ECHO + dest - 16, param); + } else { + modelname = model_param_name(MD.kit.get_model(dest), param); + } + + if (modelname != NULL) { + strncpy(myName, modelname, 4); + } + } + mcl_gui.draw_knob(knob, "PAR", myName); +} + +void PerfPageParent::draw_dest(uint8_t knob, uint8_t value) { + char K[4]; + K[0] = value > 20 ? 'M' : 'T'; + switch (value) { + case 0: + strcpy(K, "--"); + break; + case 17: + strcpy(K, "ECH"); + break; + case 18: + strcpy(K, "REV"); + break; + case 19: + strcpy(K, "EQ"); + break; + case 20: + strcpy(K, "DYN"); + break; + default: + if (value > 20) { + value -= 20; + } + mcl_gui.put_value_at(value, K + 1); + break; + } + mcl_gui.draw_knob(knob, "DEST", K); +} + +void PerfPageParent::display() {} + +bool PerfPageParent::handleEvent(gui_event_t *event) { + /* + if (note_interface.is_event(event)) { + uint8_t mask = event->mask; + uint8_t port = event->port; + auto device = midi_active_peering.get_device(port); + + uint8_t track = event->source - 128; + uint8_t page_select = 0; + uint8_t step = track + (page_select * 16); + if (event->mask == EVENT_BUTTON_PRESSED) { + } + } + */ + if (EVENT_PRESSED(event, Buttons.BUTTON2)) { + mcl.setPage(PAGE_SELECT_PAGE); + return true; + } + + return false; +} diff --git a/avr/cores/megacommand/MCL/PerfPageParent.h b/avr/cores/megacommand/MCL/PerfPageParent.h new file mode 100644 index 000000000..5159317de --- /dev/null +++ b/avr/cores/megacommand/MCL/PerfPageParent.h @@ -0,0 +1,34 @@ +/* Justin Mammarella jmamma@gmail.com 2018 */ + +#ifndef PERFPAGEPARENT_H__ +#define PERFPAGEPARENT_H__ + +#include "GUI.h" +#include "MCLEncoder.h" + +class PerfPageParent : public MidiCallback { +public: + + PerfPageParent() { }; + + bool learn = false; + bool midi_state = false; + + + void draw_dest(uint8_t knob, uint8_t value); + void draw_param(uint8_t knob, uint8_t dest, uint8_t param); + + virtual void display(); + virtual void setup(); + + virtual void init(); + virtual void loop(); + virtual void cleanup(); + virtual void config_encoders(); + virtual void setup_callbacks() {}; + virtual void remove_callbacks() {}; + + virtual bool handleEvent(gui_event_t *event); +}; + +#endif /* PERFPAGEPARENT_H__ */ From 8db27684ee95601853b3e4df92c3cee863988442 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 30 Jun 2023 00:04:17 +1000 Subject: [PATCH 129/413] knob highlight --- avr/cores/megacommand/MCL/MCLGUI.cpp | 12 ++++++------ avr/cores/megacommand/MCL/MCLGUI.h | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCLGUI.cpp b/avr/cores/megacommand/MCL/MCLGUI.cpp index b63123bb8..5327d9a10 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.cpp +++ b/avr/cores/megacommand/MCL/MCLGUI.cpp @@ -125,9 +125,9 @@ void MCLGUI::draw_knob(uint8_t i, const char *title, const char *text) { draw_text_encoder(x, knob_y0, title, text); } -void MCLGUI::draw_knob(uint8_t i, Encoder *enc, const char *title) { +void MCLGUI::draw_knob(uint8_t i, Encoder *enc, const char *title, bool highlight) { uint8_t x = knob_x0 + i * knob_w; - draw_light_encoder(x + 7, 6, enc, title); + draw_light_encoder(x + 7, 6, enc, title,highlight); } static char title_buf[16]; @@ -412,14 +412,13 @@ void MCLGUI::draw_md_encoder(uint8_t x, uint8_t y, uint8_t value, oled_display.setFont(oldfont); } -void MCLGUI::draw_light_encoder(uint8_t x, uint8_t y, Encoder *encoder, - const char *name) { +void MCLGUI::draw_light_encoder(uint8_t x, uint8_t y, Encoder *encoder, const char *name, bool highlight) { bool show_value = show_encoder_value(encoder); - draw_light_encoder(x, y, encoder->cur, name, show_value); + draw_light_encoder(x, y, encoder->cur, name, highlight, show_value); } void MCLGUI::draw_light_encoder(uint8_t x, uint8_t y, uint8_t value, - const char *name, bool show_value) { + const char *name, bool highlight, bool show_value) { auto oldfont = oled_display.getFont(); oled_display.setFont(&TomThumb); @@ -450,6 +449,7 @@ void MCLGUI::draw_light_encoder(uint8_t x, uint8_t y, uint8_t value, draw_encoder(x, y, value); + if (highlight) { oled_display.fillRect(x - 2,0,15,20,INVERT); } oled_display.setFont(oldfont); } diff --git a/avr/cores/megacommand/MCL/MCLGUI.h b/avr/cores/megacommand/MCL/MCLGUI.h index 1ca93941b..7be1d5b1a 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.h +++ b/avr/cores/megacommand/MCL/MCLGUI.h @@ -60,9 +60,9 @@ class MCLGUI { void draw_md_encoder(uint8_t x, uint8_t y, uint8_t value, const char *name, bool show_value); void draw_light_encoder(uint8_t x, uint8_t y, Encoder *encoder, - const char *name); - void draw_light_encoder(uint8_t x, uint8_t y, uint8_t value, const char *name, - bool show_value); + const char *name, bool highlight = false); + void draw_light_encoder(uint8_t x, uint8_t y, uint8_t value, const char *name, bool highlight = false, + bool show_value = false); void draw_keyboard(uint8_t x, uint8_t y, uint8_t note_width, uint8_t note_height, uint8_t num_of_notes, uint64_t *note_mask); @@ -80,7 +80,7 @@ class MCLGUI { void draw_knob_frame(); void draw_knob(uint8_t i, const char *title, const char *text); - void draw_knob(uint8_t i, Encoder *enc, const char *name); + void draw_knob(uint8_t i, Encoder *enc, const char *name, bool highlight = false); static constexpr uint8_t seq_w = 5; static constexpr uint8_t led_h = 3; From f7b91804b12101c302faadc4cd8efc702620ebfb Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 30 Jun 2023 00:09:35 +1000 Subject: [PATCH 130/413] clear params --- avr/cores/megacommand/MCL/PerfData.h | 39 +++++-- avr/cores/megacommand/MCL/PerfPage.cpp | 154 ++++++++++++++----------- 2 files changed, 117 insertions(+), 76 deletions(-) diff --git a/avr/cores/megacommand/MCL/PerfData.h b/avr/cores/megacommand/MCL/PerfData.h index f84994cb9..dfb4b859a 100644 --- a/avr/cores/megacommand/MCL/PerfData.h +++ b/avr/cores/megacommand/MCL/PerfData.h @@ -2,8 +2,8 @@ #ifndef PERFDATATRACK_H__ #define PERFDATATRACK_H__ -#include "WProgram.h" #include "PerfData.h" +#include "WProgram.h" #define NUM_PERF_PARAMS 8 #define PERF_SETTINGS NUM_NUM_PERF_PARAMS @@ -22,39 +22,58 @@ class PerfData { PerfParam params[NUM_PERF_PARAMS]; PerfParam src_param; - PerfData() { init(); } + PerfData() { init_params(); } + + uint8_t find_empty() { + uint8_t match = 255; + uint8_t empty = 255; + + for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { + // Find first empty + if (params[a].dest == 0) { + return a; + } + // Update existing, if matches + } + return 255; + } uint8_t add_param(uint8_t dest, uint8_t param, uint8_t learn, uint8_t value) { uint8_t match = 255; uint8_t empty = 255; for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { - //Find first empty - if (params[a].dest == 0) { empty = min(a,empty); } + // Find first empty + if (params[a].dest == 0) { + empty = min(a, empty); + } if (params[a].dest == dest + 1 && params[a].param == param) { - //Update existing, if matches + // Update existing, if matches match = a; } } uint8_t b = match; - if (b == 255) { b = empty; } - if (b == 255) { return 255; } + if (b == 255) { + b = empty; + } + if (b == 255) { + return 255; + } params[b].dest = dest + 1; params[b].param = param; if (learn == LEARN_MIN) { params[b].min = value; - } - else { + } else { params[b].max = value; } return b; } void *data() const { return (void *)¶ms; } - void init() { + void init_params() { for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { params[a].dest = 0; params[a].param = 0; diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 4779200a1..14d63c008 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -25,25 +25,23 @@ void PerfPage::init() { void PerfPage::cleanup() { PerfPageParent::cleanup(); } void PerfPage::config_encoder_range(uint8_t i) { - ((PerfEncoder *)encoders[i])->max = NUM_MD_TRACKS + 4 + 16; - ((PerfEncoder *)encoders[i + 1])->min = 0; + ((PerfEncoder *)encoders[i])->max = NUM_MD_TRACKS + 4 + 16; + ((PerfEncoder *)encoders[i + 1])->min = 0; uint8_t dest = encoders[i]->cur - 1; if (dest >= NUM_MD_TRACKS + 4) { ((MCLEncoder *)encoders[i + 1])->max = 127; - } - else if (dest >= NUM_MD_TRACKS) { + } else if (dest >= NUM_MD_TRACKS) { ((MCLEncoder *)encoders[i + 1])->max = 7; - } - else { - ((MCLEncoder *)encoders[i + 1])->max = 23; + } else { + ((MCLEncoder *)encoders[i + 1])->max = 23; } } void PerfPage::config_encoders() { - encoders[1] = &fx_param2; - encoders[2] = &fx_param3; - encoders[3] = &fx_param4; + encoders[1] = &fx_param2; + encoders[2] = &fx_param3; + encoders[3] = &fx_param4; if (page_mode < PERF_DESTINATION) { encoders[0] = &fx_param1; @@ -72,7 +70,6 @@ void PerfPage::config_encoders() { config_encoder_range(1); encoders[3]->cur = p->min; ((PerfEncoder *)encoders[3])->max = 127; - } for (uint8_t i = 0; i < GUI_NUM_ENCODERS; i++) { @@ -93,25 +90,21 @@ void PerfPage::update_params() { p->param = encoders[1]->cur; p->min = encoders[2]->cur; p->max = encoders[3]->cur; - } - else { + } else { config_encoder_range(1); if (encoders[1]->hasChanged() && encoders[1]->cur == 0) { encoders[2]->cur = 0; } - uint8_t c = page_mode; - PerfParam *p = &perf_encoders[perf_id]->perf_data.src_param; - p->dest = encoders[1]->cur; - p->param = encoders[2]->cur; - p->min = encoders[3]->cur; + uint8_t c = page_mode; + PerfParam *p = &perf_encoders[perf_id]->perf_data.src_param; + p->dest = encoders[1]->cur; + p->param = encoders[2]->cur; + p->min = encoders[3]->cur; } - } -void PerfPage::loop() { - update_params(); -} +void PerfPage::loop() { update_params(); } void PerfPage::display() { oled_display.clearDisplay(); @@ -133,8 +126,8 @@ void PerfPage::display() { if (page_mode < PERF_DESTINATION) { draw_dest(0, encoders[0]->cur); draw_param(1, encoders[0]->cur, encoders[1]->cur); - mcl_gui.draw_knob(2, encoders[2], "MIN"); - mcl_gui.draw_knob(3, encoders[3], "MAX"); + mcl_gui.draw_knob(2, encoders[2], "MIN", learn == LEARN_MIN); + mcl_gui.draw_knob(3, encoders[3], "MAX", learn == LEARN_MAX); info1 = "PARAM 1"; mcl_gui.put_value_at(page_mode + 1, info1 + 6); } @@ -155,40 +148,42 @@ void PerfPage::display() { } void PerfPage::learn_param(uint8_t dest, uint8_t param, uint8_t value) { - //Intercept controller param. + // Intercept controller param. PerfParam *p = &perf_encoders[perf_id]->perf_data.src_param; - if (dest + 1== p->dest && param == p->param) { - //Controller param, start value; + if (dest + 1 == p->dest && param == p->param) { + // Controller param, start value; uint8_t min = p->min; uint8_t max = 127; if (value >= min) { - uint8_t cur = value - min; - int8_t range = max - min; - uint8_t val = ((float) cur / (float) range) * 127.0f; - perf_encoders[perf_id]->cur = val; - perf_encoders[perf_id]->send_params(); - if (mcl.currentPage() == PERF_PAGE_0) { update_params(); } + uint8_t cur = value - min; + int8_t range = max - min; + uint8_t val = ((float)cur / (float)range) * 127.0f; + perf_encoders[perf_id]->cur = val; + perf_encoders[perf_id]->send_params(); + if (mcl.currentPage() == PERF_PAGE_0) { + update_params(); + } } } if (mcl.currentPage() == PERF_PAGE_0) { - if (learn) { - PerfData *d = &perf_encoders[perf_id]->perf_data; - uint8_t n = d->add_param(dest, param, learn, value); - page_mode = n; - config_encoders(); - } + if (learn) { + PerfData *d = &perf_encoders[perf_id]->perf_data; + uint8_t n = d->add_param(dest, param, learn, value); + page_mode = n; + config_encoders(); + } - //MIDI LEARN current mode; - uint8_t a = page_mode == PERF_DESTINATION ? 1 : 0; + // MIDI LEARN current mode; + uint8_t a = page_mode == PERF_DESTINATION ? 1 : 0; - if (encoders[a]->cur == 0 && encoders[a + 1]->cur > 0) { + if (encoders[a]->cur == 0 && encoders[a + 1]->cur > 0) { encoders[a]->cur = dest + 1; encoders[a + 1]->cur = param; encoders[a + 2]->cur = 0; update_params(); config_encoders(); - } + } } } @@ -202,7 +197,9 @@ void PerfPage::send_locks(uint8_t mode) { uint8_t dest = p->dest; uint8_t param = p->param; - if (param >= 24) { continue; } + if (param >= 24) { + continue; + } if (dest == last_md_track + 1) { if (mode == LEARN_MIN) { @@ -217,7 +214,9 @@ void PerfPage::send_locks(uint8_t mode) { } bool PerfPage::handleEvent(gui_event_t *event) { - if (PerfPageParent::handleEvent(event)) { return true; } + if (PerfPageParent::handleEvent(event)) { + return true; + } if (note_interface.is_event(event)) { uint8_t mask = event->mask; @@ -227,31 +226,55 @@ bool PerfPage::handleEvent(gui_event_t *event) { uint8_t track = event->source - 128; if (event->mask == EVENT_BUTTON_PRESSED) { - uint8_t id = track / 4; - if (perf_id != id) { - perf_id = track / 4; - config_encoders(); - } - uint8_t b = track - (perf_id) * 4; - if (b == 0) { - learn = LEARN_MIN; - } - if (b == 1) { - learn = LEARN_MAX; - } - send_locks(learn); - old_mode = page_mode; + uint8_t id = track / 4; + if (perf_id != id) { + perf_id = track / 4; + config_encoders(); + } + uint8_t b = track - (perf_id)*4; + if (b == 0) { + learn = LEARN_MIN; + } + if (b == 1) { + learn = LEARN_MAX; + } + send_locks(learn); + old_mode = page_mode; + if (page_mode == PERF_DESTINATION) { + uint8_t id = perf_encoders[perf_id]->perf_data.find_empty(); + if (id != 255) { + page_mode = perf_id; + config_encoders(); + } + } } if (event->mask == EVENT_BUTTON_RELEASED) { - if (note_interface.notes_all_off()){ - learn = LEARN_OFF; - MD.deactivate_encoder_interface(); - page_mode = old_mode; - config_encoders(); - } + if (note_interface.notes_all_off()) { + learn = LEARN_OFF; + MD.deactivate_encoder_interface(); + page_mode = old_mode; + config_encoders(); + } } } + if (EVENT_CMD(event)) { + if (trig_interface.is_key_down(MDX_KEY_PATSONG)) { + return seq_menu_page.handleEvent(event); + } + uint8_t key = event->source - 64; + switch (key) { + case MDX_KEY_CLEAR: + if (learn) { + char *str = "CLEAR PARAMS"; + oled_display.textbox(str, ""); + MD.popup_text(str); + perf_encoders[perf_id]->perf_data.init_params(); + } + break; + } + return true; + } if (EVENT_PRESSED(event, Buttons.BUTTON4)) { page_mode++; if (page_mode > PERF_DESTINATION) { @@ -267,6 +290,5 @@ bool PerfPage::handleEvent(gui_event_t *event) { learn = false; } - return false; } From f0e4d1514ad456d9498737c23d472bd9195664b9 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 30 Jun 2023 00:14:00 +1000 Subject: [PATCH 131/413] note + clear does not work seq mode is not engaged --- avr/cores/megacommand/MCL/MCL.cpp | 2 ++ avr/cores/megacommand/MCL/PerfPage.cpp | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCL.cpp b/avr/cores/megacommand/MCL/MCL.cpp index dd97dad36..ba40c8b57 100644 --- a/avr/cores/megacommand/MCL/MCL.cpp +++ b/avr/cores/megacommand/MCL/MCL.cpp @@ -311,6 +311,8 @@ bool mcl_handleEvent(gui_event_t *event) { break; } case MDX_KEY_CLEAR: { + if (mcl.currentPage() == PERF_PAGE_0) + break; if (mcl.currentPage() == SEQ_STEP_PAGE) break; if ((note_interface.notes_count_on() > 0) || diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 14d63c008..c9642f215 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -265,12 +265,11 @@ bool PerfPage::handleEvent(gui_event_t *event) { uint8_t key = event->source - 64; switch (key) { case MDX_KEY_CLEAR: - if (learn) { char *str = "CLEAR PARAMS"; oled_display.textbox(str, ""); MD.popup_text(str); perf_encoders[perf_id]->perf_data.init_params(); - } + config_encoders(); break; } return true; From 8f55ebd4f28c5462362ef23cfb41c2da474ed52b Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 30 Jun 2023 11:42:17 +1000 Subject: [PATCH 132/413] min,max -> scenes --- avr/cores/megacommand/MCL/PerfData.h | 30 ++++--- avr/cores/megacommand/MCL/PerfEncoder.cpp | 4 +- avr/cores/megacommand/MCL/PerfEncoder.h | 2 + avr/cores/megacommand/MCL/PerfPage.cpp | 104 ++++++++++++++-------- avr/cores/megacommand/MCL/PerfPage.h | 1 + 5 files changed, 94 insertions(+), 47 deletions(-) diff --git a/avr/cores/megacommand/MCL/PerfData.h b/avr/cores/megacommand/MCL/PerfData.h index dfb4b859a..a734c01dc 100644 --- a/avr/cores/megacommand/MCL/PerfData.h +++ b/avr/cores/megacommand/MCL/PerfData.h @@ -5,14 +5,14 @@ #include "PerfData.h" #include "WProgram.h" -#define NUM_PERF_PARAMS 8 +#define NUM_PERF_PARAMS 16 +#define NUM_SCENES 4 #define PERF_SETTINGS NUM_NUM_PERF_PARAMS class PerfParam { public: uint8_t dest; uint8_t param; - uint8_t min; - uint8_t max; + uint8_t scenes[NUM_SCENES]; }; #define LEARN_MIN 1 @@ -20,7 +20,12 @@ class PerfParam { class PerfData { public: PerfParam params[NUM_PERF_PARAMS]; - PerfParam src_param; + + uint8_t dest; + uint8_t param; + uint8_t min; + + uint8_t active_scenes; PerfData() { init_params(); } @@ -64,11 +69,12 @@ class PerfData { params[b].dest = dest + 1; params[b].param = param; - if (learn == LEARN_MIN) { - params[b].min = value; - } else { - params[b].max = value; + if (learn > 0) { + uint8_t s = learn - 1; + active_scenes |= (1 << s); + params[b].scenes[s] = value; } + return b; } @@ -77,8 +83,12 @@ class PerfData { for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { params[a].dest = 0; params[a].param = 0; - params[a].min = 0; - params[a].max = 127; + } + } + void clear_scene(uint8_t s) { + active_scenes &= ~(1 << s); + for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { + params[a].scenes[s] = 0; } } }; diff --git a/avr/cores/megacommand/MCL/PerfEncoder.cpp b/avr/cores/megacommand/MCL/PerfEncoder.cpp index 8ae97dcad..c53c69cc3 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.cpp +++ b/avr/cores/megacommand/MCL/PerfEncoder.cpp @@ -10,8 +10,8 @@ void PerfEncoder::send_params() { uint8_t dest = perf_data.params[n].dest - 1; uint8_t param = perf_data.params[n].param; - uint8_t min = perf_data.params[n].min; - uint8_t max = perf_data.params[n].max; + uint8_t min = perf_data.params[n].scenes[active_scene_a]; + uint8_t max = perf_data.params[n].scenes[active_scene_b]; int8_t range = max - min; int16_t q = cur * range; uint8_t val = ((int16_t) q / (int16_t) 128) + min; diff --git a/avr/cores/megacommand/MCL/PerfEncoder.h b/avr/cores/megacommand/MCL/PerfEncoder.h index 37c88d860..3d44def1d 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.h +++ b/avr/cores/megacommand/MCL/PerfEncoder.h @@ -14,6 +14,8 @@ class PerfEncoder : public MCLEncoder { public: PerfData perf_data; + uint8_t active_scene_a = 0; + uint8_t active_scene_b = 1; void send_params(); /** Create a new range-limited encoder with max and min value, short diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index c9642f215..1e133f60a 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -19,7 +19,20 @@ void PerfPage::init() { DEBUG_PRINT_FN(); PerfPageParent::init(); trig_interface.on(); - MD.set_trigleds(0b0011001100110011, TRIGLED_OVERLAY); + set_led_mask(); +} + +void PerfPage::set_led_mask() { + uint16_t mask = 0; + + PerfEncoder *e = perf_encoders[perf_id]; + SET_BIT16(mask, e->active_scene_a); + SET_BIT16(mask, e->active_scene_b); + MD.set_trigleds(mask, TRIGLED_EXCLUSIVE); + bool blink = true; + uint16_t blink_mask = 0; + blink_mask |= e->perf_data.active_scenes; + MD.set_trigleds(mask, TRIGLED_EXCLUSIVE, blink); } void PerfPage::cleanup() { PerfPageParent::cleanup(); } @@ -46,15 +59,16 @@ void PerfPage::config_encoders() { if (page_mode < PERF_DESTINATION) { encoders[0] = &fx_param1; uint8_t c = page_mode; + PerfEncoder *e = perf_encoders[perf_id]; PerfParam *p = &perf_encoders[perf_id]->perf_data.params[c]; encoders[0]->cur = p->dest; encoders[1]->cur = p->param; - encoders[2]->cur = p->min; + encoders[2]->cur = p->scenes[e->active_scene_a]; ((PerfEncoder *)encoders[2])->max = 127; - encoders[3]->cur = p->max; + encoders[3]->cur = p->scenes[e->active_scene_b]; ((PerfEncoder *)encoders[3])->max = 127; config_encoder_range(0); @@ -64,11 +78,11 @@ void PerfPage::config_encoders() { encoders[0] = perf_encoders[perf_id]; ((PerfEncoder *)encoders[0])->max = 127; - PerfParam *p = &perf_encoders[perf_id]->perf_data.src_param; - encoders[1]->cur = p->dest; - encoders[2]->cur = p->param; + PerfData *d = &perf_encoders[perf_id]->perf_data; + encoders[1]->cur = d->dest; + encoders[2]->cur = d->param; config_encoder_range(1); - encoders[3]->cur = p->min; + encoders[3]->cur = d->min; ((PerfEncoder *)encoders[3])->max = 127; } @@ -85,11 +99,12 @@ void PerfPage::update_params() { encoders[1]->cur = 0; } uint8_t c = page_mode; + PerfEncoder *e = perf_encoders[perf_id]; PerfParam *p = &perf_encoders[perf_id]->perf_data.params[c]; p->dest = encoders[0]->cur; p->param = encoders[1]->cur; - p->min = encoders[2]->cur; - p->max = encoders[3]->cur; + p->scenes[e->active_scene_a] = encoders[2]->cur; + p->scenes[e->active_scene_b] = encoders[3]->cur; } else { config_encoder_range(1); @@ -97,10 +112,10 @@ void PerfPage::update_params() { encoders[2]->cur = 0; } uint8_t c = page_mode; - PerfParam *p = &perf_encoders[perf_id]->perf_data.src_param; - p->dest = encoders[1]->cur; - p->param = encoders[2]->cur; - p->min = encoders[3]->cur; + PerfData *d = &perf_encoders[perf_id]->perf_data; + d->dest = encoders[1]->cur; + d->param = encoders[2]->cur; + d->min = encoders[3]->cur; } } @@ -126,8 +141,17 @@ void PerfPage::display() { if (page_mode < PERF_DESTINATION) { draw_dest(0, encoders[0]->cur); draw_param(1, encoders[0]->cur, encoders[1]->cur); - mcl_gui.draw_knob(2, encoders[2], "MIN", learn == LEARN_MIN); - mcl_gui.draw_knob(3, encoders[3], "MAX", learn == LEARN_MAX); + + PerfEncoder *e = perf_encoders[perf_id]; + + char *str1 = "A"; + char *str2 = "A"; + + str1[0] = 'A' + e->active_scene_a; + str2[1] = 'A' + e->active_scene_b; + + mcl_gui.draw_knob(2, encoders[2], str1, learn == LEARN_MIN); + mcl_gui.draw_knob(3, encoders[3], str2, learn == LEARN_MAX); info1 = "PARAM 1"; mcl_gui.put_value_at(page_mode + 1, info1 + 6); } @@ -149,10 +173,10 @@ void PerfPage::display() { void PerfPage::learn_param(uint8_t dest, uint8_t param, uint8_t value) { // Intercept controller param. - PerfParam *p = &perf_encoders[perf_id]->perf_data.src_param; - if (dest + 1 == p->dest && param == p->param) { + PerfData *d = &perf_encoders[perf_id]->perf_data; + if (dest + 1 == d->dest && param == d->param) { // Controller param, start value; - uint8_t min = p->min; + uint8_t min = d->min; uint8_t max = 127; if (value >= min) { uint8_t cur = value - min; @@ -168,7 +192,6 @@ void PerfPage::learn_param(uint8_t dest, uint8_t param, uint8_t value) { if (mcl.currentPage() == PERF_PAGE_0) { if (learn) { - PerfData *d = &perf_encoders[perf_id]->perf_data; uint8_t n = d->add_param(dest, param, learn, value); page_mode = n; config_encoders(); @@ -202,11 +225,8 @@ void PerfPage::send_locks(uint8_t mode) { } if (dest == last_md_track + 1) { - if (mode == LEARN_MIN) { - params[param] = p->min; - } - if (mode == LEARN_MAX) { - params[param] = p->max; + if (learn > 0) { + params[param] = p->scenes[learn - 1]; } } } @@ -223,22 +243,33 @@ bool PerfPage::handleEvent(gui_event_t *event) { uint8_t port = event->port; auto device = midi_active_peering.get_device(port); - uint8_t track = event->source - 128; + uint8_t track = event->source - 128; + uint8_t id = track / 4; if (event->mask == EVENT_BUTTON_PRESSED) { - uint8_t id = track / 4; if (perf_id != id) { - perf_id = track / 4; + perf_id = id; config_encoders(); } uint8_t b = track - (perf_id)*4; - if (b == 0) { - learn = LEARN_MIN; - } - if (b == 1) { - learn = LEARN_MAX; - } + + learn = b + 1; send_locks(learn); + + PerfEncoder *e = perf_encoders[perf_id]; + + //Change scene. + if (trig_interface.is_key_down(MDX_KEY_YES)) { + + if (track > 1) { + e->active_scene_b = track; + } + else { + e->active_scene_a = track; + } + set_led_mask(); + } + old_mode = page_mode; if (page_mode == PERF_DESTINATION) { uint8_t id = perf_encoders[perf_id]->perf_data.find_empty(); @@ -249,6 +280,7 @@ bool PerfPage::handleEvent(gui_event_t *event) { } } if (event->mask == EVENT_BUTTON_RELEASED) { + if (note_interface.notes_all_off()) { learn = LEARN_OFF; MD.deactivate_encoder_interface(); @@ -265,10 +297,12 @@ bool PerfPage::handleEvent(gui_event_t *event) { uint8_t key = event->source - 64; switch (key) { case MDX_KEY_CLEAR: - char *str = "CLEAR PARAMS"; + char *str = "CLEAR SCENE"; oled_display.textbox(str, ""); MD.popup_text(str); - perf_encoders[perf_id]->perf_data.init_params(); + for (uint8_t n = 0; n < 4; n++) { + if (note_interface.is_note_on(n)) { perf_encoders[perf_id]->perf_data.clear_scene(n); } + } config_encoders(); break; } diff --git a/avr/cores/megacommand/MCL/PerfPage.h b/avr/cores/megacommand/MCL/PerfPage.h index 6c4bb2991..896fabbcd 100644 --- a/avr/cores/megacommand/MCL/PerfPage.h +++ b/avr/cores/megacommand/MCL/PerfPage.h @@ -39,6 +39,7 @@ class PerfPage : public LightPage, PerfPageParent { void loop(); void cleanup(); + void set_led_mask(); virtual void config_encoders(); void send_locks(uint8_t mode); From f9f077604f82122dcb60f07358aca585ae67b67f Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 30 Jun 2023 13:49:40 +1000 Subject: [PATCH 133/413] remove outdated font from resources --- resource/font_default.cpp | 263 --------------------- resource/font_elektrothic.cpp | 248 -------------------- resource/font_tomthumb.cpp | 421 ---------------------------------- 3 files changed, 932 deletions(-) delete mode 100644 resource/font_default.cpp delete mode 100644 resource/font_elektrothic.cpp delete mode 100644 resource/font_tomthumb.cpp diff --git a/resource/font_default.cpp b/resource/font_default.cpp deleted file mode 100644 index 03212840f..000000000 --- a/resource/font_default.cpp +++ /dev/null @@ -1,263 +0,0 @@ -#include -#include "../gfxfont.h" - -// Standard ASCII 5x7 font -unsigned char font[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xFF, 0x00, 0xFF, 0x00, - 0xFF, 0x81, 0x81, 0x81, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x41, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x41, 0x7F, 0x41, 0x41, - 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, - 0x00, 0x18, 0x3C, 0x18, 0x00, - 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, - 0x00, 0x18, 0x24, 0x18, 0x00, - 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, - 0x30, 0x48, 0x3A, 0x06, 0x0E, - 0x26, 0x29, 0x79, 0x29, 0x26, - 0x40, 0x7F, 0x05, 0x05, 0x07, - 0x40, 0x7F, 0x05, 0x25, 0x3F, - 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, - 0x7F, 0x3E, 0x1C, 0x1C, 0x08, - 0x08, 0x1C, 0x1C, 0x3E, 0x7F, - 0x14, 0x22, 0x7F, 0x22, 0x14, - 0x5F, 0x5F, 0x00, 0x5F, 0x5F, - 0x06, 0x09, 0x7F, 0x01, 0x7F, - 0x00, 0x66, 0x89, 0x95, 0x6A, - 0x60, 0x60, 0x60, 0x60, 0x60, - 0x94, 0xA2, 0xFF, 0xA2, 0x94, - 0x08, 0x04, 0x7E, 0x04, 0x08, - 0x10, 0x20, 0x7E, 0x20, 0x10, - 0x08, 0x08, 0x2A, 0x1C, 0x08, - 0x08, 0x1C, 0x2A, 0x08, 0x08, - 0x1E, 0x10, 0x10, 0x10, 0x10, - 0x0C, 0x1E, 0x0C, 0x1E, 0x0C, - 0x30, 0x38, 0x3E, 0x38, 0x30, - 0x06, 0x0E, 0x3E, 0x0E, 0x06, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x5F, 0x00, 0x00, - 0x00, 0x07, 0x00, 0x07, 0x00, - 0x14, 0x7F, 0x14, 0x7F, 0x14, - 0x24, 0x2A, 0x7F, 0x2A, 0x12, - 0x23, 0x13, 0x08, 0x64, 0x62, - 0x36, 0x49, 0x56, 0x20, 0x50, - 0x00, 0x08, 0x07, 0x03, 0x00, - 0x00, 0x1C, 0x22, 0x41, 0x00, - 0x00, 0x41, 0x22, 0x1C, 0x00, - 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, - 0x08, 0x08, 0x3E, 0x08, 0x08, - 0x00, 0x80, 0x70, 0x30, 0x00, - 0x08, 0x08, 0x08, 0x08, 0x08, - 0x00, 0x00, 0x60, 0x60, 0x00, - 0x20, 0x10, 0x08, 0x04, 0x02, - 0x3E, 0x51, 0x49, 0x45, 0x3E, - 0x00, 0x42, 0x7F, 0x40, 0x00, - 0x72, 0x49, 0x49, 0x49, 0x46, - 0x21, 0x41, 0x49, 0x4D, 0x33, - 0x18, 0x14, 0x12, 0x7F, 0x10, - 0x27, 0x45, 0x45, 0x45, 0x39, - 0x3C, 0x4A, 0x49, 0x49, 0x31, - 0x41, 0x21, 0x11, 0x09, 0x07, - 0x36, 0x49, 0x49, 0x49, 0x36, - 0x46, 0x49, 0x49, 0x29, 0x1E, - 0x00, 0x00, 0x14, 0x00, 0x00, - 0x00, 0x40, 0x34, 0x00, 0x00, - 0x00, 0x08, 0x14, 0x22, 0x41, - 0x14, 0x14, 0x14, 0x14, 0x14, - 0x00, 0x41, 0x22, 0x14, 0x08, - 0x02, 0x01, 0x59, 0x09, 0x06, - 0x3E, 0x41, 0x5D, 0x59, 0x4E, - 0x7C, 0x12, 0x11, 0x12, 0x7C, - 0x7F, 0x49, 0x49, 0x49, 0x36, - 0x3E, 0x41, 0x41, 0x41, 0x22, - 0x7F, 0x41, 0x41, 0x41, 0x3E, - 0x7F, 0x49, 0x49, 0x49, 0x41, - 0x7F, 0x09, 0x09, 0x09, 0x01, - 0x3E, 0x41, 0x41, 0x51, 0x73, - 0x7F, 0x08, 0x08, 0x08, 0x7F, - 0x00, 0x41, 0x7F, 0x41, 0x00, - 0x20, 0x40, 0x41, 0x3F, 0x01, - 0x7F, 0x08, 0x14, 0x22, 0x41, - 0x7F, 0x40, 0x40, 0x40, 0x40, - 0x7F, 0x02, 0x1C, 0x02, 0x7F, - 0x7F, 0x04, 0x08, 0x10, 0x7F, - 0x3E, 0x41, 0x41, 0x41, 0x3E, - 0x7F, 0x09, 0x09, 0x09, 0x06, - 0x3E, 0x41, 0x51, 0x21, 0x5E, - 0x7F, 0x09, 0x19, 0x29, 0x46, - 0x26, 0x49, 0x49, 0x49, 0x32, - 0x03, 0x01, 0x7F, 0x01, 0x03, - 0x3F, 0x40, 0x40, 0x40, 0x3F, - 0x1F, 0x20, 0x40, 0x20, 0x1F, - 0x3F, 0x40, 0x38, 0x40, 0x3F, - 0x63, 0x14, 0x08, 0x14, 0x63, - 0x03, 0x04, 0x78, 0x04, 0x03, - 0x61, 0x59, 0x49, 0x4D, 0x43, - 0x00, 0x7F, 0x41, 0x41, 0x41, - 0x02, 0x04, 0x08, 0x10, 0x20, - 0x00, 0x41, 0x41, 0x41, 0x7F, - 0x04, 0x02, 0x01, 0x02, 0x04, - 0x40, 0x40, 0x40, 0x40, 0x40, - 0x00, 0x03, 0x07, 0x08, 0x00, - 0x20, 0x54, 0x54, 0x78, 0x40, - 0x7F, 0x28, 0x44, 0x44, 0x38, - 0x38, 0x44, 0x44, 0x44, 0x28, - 0x38, 0x44, 0x44, 0x28, 0x7F, - 0x38, 0x54, 0x54, 0x54, 0x18, - 0x00, 0x08, 0x7E, 0x09, 0x02, - 0x18, 0xA4, 0xA4, 0x9C, 0x78, - 0x7F, 0x08, 0x04, 0x04, 0x78, - 0x00, 0x44, 0x7D, 0x40, 0x00, - 0x20, 0x40, 0x40, 0x3D, 0x00, - 0x7F, 0x10, 0x28, 0x44, 0x00, - 0x00, 0x41, 0x7F, 0x40, 0x00, - 0x7C, 0x04, 0x78, 0x04, 0x78, - 0x7C, 0x08, 0x04, 0x04, 0x78, - 0x38, 0x44, 0x44, 0x44, 0x38, - 0xFC, 0x18, 0x24, 0x24, 0x18, - 0x18, 0x24, 0x24, 0x18, 0xFC, - 0x7C, 0x08, 0x04, 0x04, 0x08, - 0x48, 0x54, 0x54, 0x54, 0x24, - 0x04, 0x04, 0x3F, 0x44, 0x24, - 0x3C, 0x40, 0x40, 0x20, 0x7C, - 0x1C, 0x20, 0x40, 0x20, 0x1C, - 0x3C, 0x40, 0x30, 0x40, 0x3C, - 0x44, 0x28, 0x10, 0x28, 0x44, - 0x4C, 0x90, 0x90, 0x90, 0x7C, - 0x44, 0x64, 0x54, 0x4C, 0x44, - 0x00, 0x08, 0x36, 0x41, 0x00, - 0x00, 0x00, 0x77, 0x00, 0x00, - 0x00, 0x41, 0x36, 0x08, 0x00, - 0x02, 0x01, 0x02, 0x04, 0x02, - 0x3C, 0x26, 0x23, 0x26, 0x3C, - 0x1E, 0xA1, 0xA1, 0x61, 0x12, - 0x3A, 0x40, 0x40, 0x20, 0x7A, - 0x38, 0x54, 0x54, 0x55, 0x59, - 0x21, 0x55, 0x55, 0x79, 0x41, - 0x22, 0x54, 0x54, 0x78, 0x42, // a-umlaut - 0x21, 0x55, 0x54, 0x78, 0x40, - 0x20, 0x54, 0x55, 0x79, 0x40, - 0x0C, 0x1E, 0x52, 0x72, 0x12, - 0x39, 0x55, 0x55, 0x55, 0x59, - 0x39, 0x54, 0x54, 0x54, 0x59, - 0x39, 0x55, 0x54, 0x54, 0x58, - 0x00, 0x00, 0x45, 0x7C, 0x41, - 0x00, 0x02, 0x45, 0x7D, 0x42, - 0x00, 0x01, 0x45, 0x7C, 0x40, - 0x7D, 0x12, 0x11, 0x12, 0x7D, // A-umlaut - 0xF0, 0x28, 0x25, 0x28, 0xF0, - 0x7C, 0x54, 0x55, 0x45, 0x00, - 0x20, 0x54, 0x54, 0x7C, 0x54, - 0x7C, 0x0A, 0x09, 0x7F, 0x49, - 0x32, 0x49, 0x49, 0x49, 0x32, - 0x3A, 0x44, 0x44, 0x44, 0x3A, // o-umlaut - 0x32, 0x4A, 0x48, 0x48, 0x30, - 0x3A, 0x41, 0x41, 0x21, 0x7A, - 0x3A, 0x42, 0x40, 0x20, 0x78, - 0x00, 0x9D, 0xA0, 0xA0, 0x7D, - 0x3D, 0x42, 0x42, 0x42, 0x3D, // O-umlaut - 0x3D, 0x40, 0x40, 0x40, 0x3D, - 0x3C, 0x24, 0xFF, 0x24, 0x24, - 0x48, 0x7E, 0x49, 0x43, 0x66, - 0x2B, 0x2F, 0xFC, 0x2F, 0x2B, - 0xFF, 0x09, 0x29, 0xF6, 0x20, - 0xC0, 0x88, 0x7E, 0x09, 0x03, - 0x20, 0x54, 0x54, 0x79, 0x41, - 0x00, 0x00, 0x44, 0x7D, 0x41, - 0x30, 0x48, 0x48, 0x4A, 0x32, - 0x38, 0x40, 0x40, 0x22, 0x7A, - 0x00, 0x7A, 0x0A, 0x0A, 0x72, - 0x7D, 0x0D, 0x19, 0x31, 0x7D, - 0x26, 0x29, 0x29, 0x2F, 0x28, - 0x26, 0x29, 0x29, 0x29, 0x26, - 0x30, 0x48, 0x4D, 0x40, 0x20, - 0x38, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x38, - 0x2F, 0x10, 0xC8, 0xAC, 0xBA, - 0x2F, 0x10, 0x28, 0x34, 0xFA, - 0x00, 0x00, 0x7B, 0x00, 0x00, - 0x08, 0x14, 0x2A, 0x14, 0x22, - 0x22, 0x14, 0x2A, 0x14, 0x08, - 0x55, 0x00, 0x55, 0x00, 0x55, // #176 (25% block) missing in old code - 0xAA, 0x55, 0xAA, 0x55, 0xAA, // 50% block - 0xFF, 0x55, 0xFF, 0x55, 0xFF, // 75% block - 0x00, 0x00, 0x00, 0xFF, 0x00, - 0x10, 0x10, 0x10, 0xFF, 0x00, - 0x14, 0x14, 0x14, 0xFF, 0x00, - 0x10, 0x10, 0xFF, 0x00, 0xFF, - 0x10, 0x10, 0xF0, 0x10, 0xF0, - 0x14, 0x14, 0x14, 0xFC, 0x00, - 0x14, 0x14, 0xF7, 0x00, 0xFF, - 0x00, 0x00, 0xFF, 0x00, 0xFF, - 0x14, 0x14, 0xF4, 0x04, 0xFC, - 0x14, 0x14, 0x17, 0x10, 0x1F, - 0x10, 0x10, 0x1F, 0x10, 0x1F, - 0x14, 0x14, 0x14, 0x1F, 0x00, - 0x10, 0x10, 0x10, 0xF0, 0x00, - 0x00, 0x00, 0x00, 0x1F, 0x10, - 0x10, 0x10, 0x10, 0x1F, 0x10, - 0x10, 0x10, 0x10, 0xF0, 0x10, - 0x00, 0x00, 0x00, 0xFF, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0xFF, 0x10, - 0x00, 0x00, 0x00, 0xFF, 0x14, - 0x00, 0x00, 0xFF, 0x00, 0xFF, - 0x00, 0x00, 0x1F, 0x10, 0x17, - 0x00, 0x00, 0xFC, 0x04, 0xF4, - 0x14, 0x14, 0x17, 0x10, 0x17, - 0x14, 0x14, 0xF4, 0x04, 0xF4, - 0x00, 0x00, 0xFF, 0x00, 0xF7, - 0x14, 0x14, 0x14, 0x14, 0x14, - 0x14, 0x14, 0xF7, 0x00, 0xF7, - 0x14, 0x14, 0x14, 0x17, 0x14, - 0x10, 0x10, 0x1F, 0x10, 0x1F, - 0x14, 0x14, 0x14, 0xF4, 0x14, - 0x10, 0x10, 0xF0, 0x10, 0xF0, - 0x00, 0x00, 0x1F, 0x10, 0x1F, - 0x00, 0x00, 0x00, 0x1F, 0x14, - 0x00, 0x00, 0x00, 0xFC, 0x14, - 0x00, 0x00, 0xF0, 0x10, 0xF0, - 0x10, 0x10, 0xFF, 0x10, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x14, - 0x10, 0x10, 0x10, 0x1F, 0x00, - 0x00, 0x00, 0x00, 0xF0, 0x10, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, - 0xFF, 0xFF, 0xFF, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xFF, 0xFF, - 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, - 0x38, 0x44, 0x44, 0x38, 0x44, - 0xFC, 0x4A, 0x4A, 0x4A, 0x34, // sharp-s or beta - 0x7E, 0x02, 0x02, 0x06, 0x06, - 0x02, 0x7E, 0x02, 0x7E, 0x02, - 0x63, 0x55, 0x49, 0x41, 0x63, - 0x38, 0x44, 0x44, 0x3C, 0x04, - 0x40, 0x7E, 0x20, 0x1E, 0x20, - 0x06, 0x02, 0x7E, 0x02, 0x02, - 0x99, 0xA5, 0xE7, 0xA5, 0x99, - 0x1C, 0x2A, 0x49, 0x2A, 0x1C, - 0x4C, 0x72, 0x01, 0x72, 0x4C, - 0x30, 0x4A, 0x4D, 0x4D, 0x30, - 0x30, 0x48, 0x78, 0x48, 0x30, - 0xBC, 0x62, 0x5A, 0x46, 0x3D, - 0x3E, 0x49, 0x49, 0x49, 0x00, - 0x7E, 0x01, 0x01, 0x01, 0x7E, - 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, - 0x44, 0x44, 0x5F, 0x44, 0x44, - 0x40, 0x51, 0x4A, 0x44, 0x40, - 0x40, 0x44, 0x4A, 0x51, 0x40, - 0x00, 0x00, 0xFF, 0x01, 0x03, - 0xE0, 0x80, 0xFF, 0x00, 0x00, - 0x08, 0x08, 0x6B, 0x6B, 0x08, - 0x36, 0x12, 0x36, 0x24, 0x36, - 0x06, 0x0F, 0x09, 0x0F, 0x06, - 0x00, 0x00, 0x18, 0x18, 0x00, - 0x00, 0x00, 0x10, 0x10, 0x00, - 0x30, 0x40, 0xFF, 0x01, 0x01, - 0x00, 0x1F, 0x01, 0x01, 0x1E, - 0x00, 0x19, 0x1D, 0x17, 0x12, - 0x00, 0x3C, 0x3C, 0x3C, 0x3C, - 0x00, 0x00, 0x00, 0x00, 0x00 // #255 NBSP -}; - diff --git a/resource/font_elektrothic.cpp b/resource/font_elektrothic.cpp deleted file mode 100644 index 1af7c9407..000000000 --- a/resource/font_elektrothic.cpp +++ /dev/null @@ -1,248 +0,0 @@ -#include -#include "../gfxfont.h" - -unsigned char ElektrothicBitmaps[] = { - 0xFF, 0xF3, 0xC0, 0xDE, 0xF7, 0xB0, 0x34, 0x59, 0xFB, 0xF2, 0x8F, 0xFF, - 0xB4, 0x68, 0x11, 0x9F, 0xBE, 0x79, 0xE3, 0xDF, 0x8C, 0x73, 0x3E, 0x8D, - 0xE3, 0xF0, 0x7C, 0x02, 0xE1, 0xFC, 0x5F, 0x33, 0x80, 0x30, 0x78, 0x78, - 0x70, 0x77, 0xDE, 0xCC, 0xFE, 0x72, 0xFF, 0x13, 0x7E, 0xCC, 0xCC, 0xE7, - 0x31, 0x8C, 0xE7, 0x33, 0x33, 0x7E, 0xC8, 0x35, 0xFE, 0xE5, 0x00, 0x30, - 0xCF, 0xFF, 0x30, 0xC0, 0xFF, 0xFC, 0xF0, 0x18, 0xCC, 0x63, 0x31, 0x8C, - 0xE6, 0x00, 0x7B, 0xFC, 0xF3, 0xCF, 0x3F, 0xDE, 0xFD, 0xB6, 0xDB, 0xFB, - 0xF0, 0xCF, 0x73, 0x0F, 0xFF, 0xFB, 0xF0, 0xCE, 0x38, 0x3F, 0xFE, 0xCF, - 0x3C, 0xFF, 0x7C, 0x30, 0xC3, 0xFF, 0xFC, 0x3E, 0xFC, 0x3F, 0xFF, 0x7F, - 0xFC, 0x3E, 0xFF, 0x3F, 0xDF, 0xFF, 0xF0, 0xC7, 0x39, 0xCE, 0x30, 0x7B, - 0xFC, 0xDE, 0xFF, 0x3F, 0xDE, 0x7B, 0xFC, 0xFF, 0x7C, 0x3F, 0xFE, 0xF0, - 0x3C, 0xF0, 0x3F, 0xC0, 0x04, 0x7F, 0xB0, 0xF8, 0x70, 0x40, 0xFF, 0xF0, - 0x00, 0xFF, 0xF0, 0x83, 0x87, 0xC3, 0x7F, 0x88, 0x00, 0x77, 0xF6, 0x33, - 0x30, 0x0C, 0x60, 0x1E, 0x3F, 0xBE, 0xFF, 0xFF, 0x7F, 0xBD, 0xFE, 0x7E, - 0x1F, 0x00, 0x1C, 0x0E, 0x07, 0x06, 0xC3, 0x63, 0xB9, 0xFC, 0xFE, 0xE3, - 0x80, 0xFB, 0xFC, 0xFE, 0xFF, 0x3C, 0xFF, 0xF8, 0x3E, 0x3F, 0xB8, 0xF8, - 0x7C, 0x06, 0x0F, 0x8E, 0xFE, 0x3E, 0x00, 0xF9, 0xFB, 0x3E, 0x3C, 0x78, - 0xF3, 0xFE, 0xF8, 0xFF, 0xF1, 0xFF, 0xE3, 0x1F, 0xF8, 0xFF, 0xF1, 0x8F, - 0xFF, 0x18, 0xC0, 0x3E, 0x3F, 0xB8, 0xF8, 0x0C, 0xFE, 0x7F, 0x8E, 0xFE, - 0x3E, 0x00, 0xC7, 0x8F, 0x1F, 0xFF, 0xF8, 0xF1, 0xE3, 0xC6, 0xFF, 0xFF, - 0xC0, 0x0C, 0x30, 0xC3, 0x0C, 0x3C, 0xFF, 0x78, 0xCF, 0x9B, 0x67, 0xCF, - 0x1F, 0x36, 0x66, 0xCE, 0xC6, 0x31, 0x8C, 0x63, 0x1F, 0xF8, 0xE3, 0xF1, - 0xFD, 0xFE, 0xFD, 0x5E, 0xAF, 0x77, 0xBB, 0xC9, 0x80, 0xC7, 0xCF, 0x9F, - 0xBD, 0x7B, 0xF3, 0xE7, 0xC6, 0x3E, 0x3F, 0xB8, 0xF8, 0x3C, 0x1E, 0x0F, - 0x8E, 0xFE, 0x3E, 0x00, 0xFB, 0xFC, 0xF3, 0xFF, 0xEC, 0x30, 0xC0, 0x3E, - 0x3F, 0xB8, 0xFF, 0x3F, 0xDE, 0x7F, 0x9C, 0xFF, 0x3D, 0x80, 0xFB, 0xFC, - 0xF3, 0xFF, 0xEF, 0x36, 0xCC, 0x77, 0xF7, 0xC7, 0x0F, 0x7F, 0x70, 0xFF, - 0xF3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xFF, - 0x78, 0xE3, 0x63, 0x67, 0x76, 0x36, 0x36, 0x3C, 0x1C, 0x1C, 0xE6, 0x76, - 0x66, 0x6E, 0x66, 0xF6, 0x6F, 0xC3, 0xBC, 0x39, 0xC3, 0x9C, 0x39, 0x80, - 0xE3, 0xBB, 0x8F, 0x83, 0x81, 0xC1, 0xF0, 0xD8, 0xE6, 0xE3, 0x80, 0xE7, - 0x66, 0x3C, 0x3C, 0x3C, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xF1, 0x8E, 0x31, - 0xC6, 0x3F, 0xFC, 0x7F, 0x6D, 0xB6, 0xDB, 0xB0, 0xC6, 0x18, 0xC6, 0x18, - 0xC6, 0x38, 0xC0, 0xDD, 0xB6, 0xDB, 0x6F, 0xE0, 0x71, 0xCD, 0xB7, 0xFC, - 0xC3, 0x7E, 0xFF, 0x1E, 0x3C, 0x6F, 0xDF, 0x80, 0xC3, 0x0F, 0xBF, 0xCF, - 0x3C, 0xFF, 0xF8, 0x38, 0xFB, 0x1E, 0x0C, 0x6F, 0x8E, 0x00, 0x06, 0x0D, - 0xFB, 0xFC, 0x78, 0xF1, 0xBF, 0x7E, 0x38, 0xFB, 0x1F, 0xFF, 0xEF, 0x8E, - 0x00, 0x37, 0xFF, 0x66, 0x66, 0x60, 0x3E, 0xFF, 0x1E, 0x3C, 0x6F, 0xDF, - 0xE3, 0xFE, 0xF0, 0xC3, 0x0F, 0xBF, 0xCF, 0x3C, 0xF3, 0xCC, 0xFF, 0xFF, - 0xC0, 0x6D, 0xB6, 0xDB, 0x7F, 0x00, 0xC3, 0x0C, 0xF6, 0xF3, 0xCF, 0xB6, - 0xCC, 0xFF, 0xFF, 0xC0, 0xFB, 0xBF, 0xFC, 0xCF, 0x33, 0xCC, 0xF3, 0x3C, - 0xCC, 0xFB, 0xFC, 0xF3, 0xCF, 0x3C, 0xC0, 0x38, 0xFB, 0x1E, 0x3C, 0x6F, - 0x8E, 0x00, 0xFB, 0xFC, 0xF3, 0xCF, 0xFF, 0xB0, 0xC0, 0x7E, 0xFF, 0x1E, - 0x3C, 0x7F, 0xDF, 0x83, 0x06, 0xFF, 0x6D, 0xB0, 0x77, 0xF0, 0xE1, 0xFD, - 0xC0, 0x66, 0xFF, 0x66, 0x66, 0x60, 0xCF, 0x3C, 0xF3, 0xCF, 0xF7, 0xC0, - 0xC6, 0xD9, 0xB3, 0x63, 0x87, 0x0E, 0x00, 0xCC, 0xD3, 0x36, 0xF9, 0xFE, - 0x7B, 0x8C, 0xE3, 0x30, 0xE6, 0x7C, 0x38, 0x38, 0x3C, 0x6E, 0xE7, 0xC6, - 0xD9, 0xB3, 0x63, 0x87, 0x0C, 0x18, 0x70, 0xFF, 0xC4, 0x66, 0x7F, 0xE0, - 0x77, 0x66, 0x6E, 0xE6, 0x66, 0x77, 0xFF, 0xFF, 0xF0, 0xEE, 0x66, 0x67, - 0x76, 0x66, 0xEE, 0xE7, 0xF0}; - -/* {offset, width, height, advance cursor, x offset, y offset} */ -GFXglyph ElektrothicGlyphs[] = { - {0, 0, 0, 4, 0, 1} // ' ' - , - {0, 2, 9, 4, 1, -8} // '!' - , - {3, 5, 5, 6, 0, -5} // '"' - , - {6, 7, 9, 7, 0, -8} // '#' - , - {14, 5, 11, 7, 1, -9} // '$' - , - {21, 10, 9, 11, 0, -8} // '%' - , - {33, 8, 9, 9, 1, -8} // '&' - , - {42, 2, 4, 3, 0, -8} // ''' - , - {43, 4, 12, 6, 1, -8} // '(' - , - {49, 4, 12, 6, 1, -8} // ')' - , - {55, 5, 5, 8, 2, -8} // '*' - , - {59, 6, 6, 7, 1, -5} // '+' - , - {64, 2, 4, 4, 1, -1} // ',' - , - {65, 3, 2, 3, 0, -3} // '-' - , - {66, 2, 2, 4, 1, -1} // '.' - , - {67, 5, 10, 7, 1, -8} // '/' - , - {74, 6, 8, 7, 0, -8} // '0' - , - {80, 3, 8, 4, 0, -8} // '1' - , - {83, 6, 8, 7, 0, -8} // '2' - , - {89, 6, 8, 7, 0, -8} // '3' - , - {95, 6, 8, 7, 0, -8} // '4' - , - {101, 6, 8, 7, 0, -8} // '5' - , - {107, 6, 8, 7, 0, -8} // '6' - , - {113, 6, 8, 7, 0, -8} // '7' - , - {119, 6, 8, 7, 0, -8} // '8' - , - {125, 6, 8, 7, 0, -8} // '9' - , - {131, 2, 7, 4, 1, -6} // ':' - , - {133, 2, 9, 4, 1, -6} // ';' - , - {136, 6, 7, 7, 1, -6} // '<' - , - {142, 6, 6, 7, 1, -5} // '=' - , - {156, 4, 5, 8, 0, -5} // '>' - , - {153, 5, 9, 7, 1, -8} // '?' - , - {159, 9, 9, 10, 0, -8} // '@' - , - {170, 9, 9, 9, 0, -8} // 'A' - , - {181, 6, 9, 8, 1, -8} // 'B' - , - {188, 9, 9, 10, 1, -8} // 'C' - , - {199, 7, 9, 9, 1, -8} // 'D' - , - {207, 5, 9, 6, 1, -8} // 'E' - , - {213, 5, 9, 6, 1, -8} // 'F' - , - {219, 9, 9, 10, 1, -8} // 'G' - , - {230, 7, 9, 9, 1, -8} // 'H' - , - {238, 2, 9, 4, 1, -8} // 'I' - , - {241, 6, 9, 7, 0, -8} // 'J' - , - {248, 7, 9, 8, 1, -8} // 'K' - , - {256, 5, 9, 6, 1, -8} // 'L' - , - {262, 9, 9, 11, 1, -8} // 'M' - , - {273, 7, 9, 9, 1, -8} // 'N' - , - {281, 9, 9, 10, 0, -8} // 'O' - , - {292, 6, 9, 8, 1, -8} // 'P' - , - {299, 9, 9, 11, 1, -8} // 'Q' - , - {310, 6, 9, 8, 1, -8} // 'R' - , - {317, 5, 9, 7, 1, -8} // 'S' - , - {323, 6, 9, 6, 0, -8} // 'T' - , - {330, 6, 9, 8, 1, -8} // 'U' - , - {337, 8, 9, 9, 0, -8} // 'V' - , - {346, 12, 9, 12, 0, -8} // 'W' - , - {360, 9, 9, 9, 0, -8} // 'X' - , - {371, 8, 9, 8, 0, -8} // 'Y' - , - {380, 6, 9, 6, 0, -8} // 'Z' - , - {387, 3, 12, 6, 1, -8} // '[' - , - {392, 5, 10, 7, 1, -8} // '\' - , - {399, 3, 12, 5, 1, -8} // ']' - , - {404, 6, 4, 7, 1, -8} // '^' - , - {407, 6, 1, 6, 0, 2} // '_' - , - {408, 4, 2, 7, 1, -9} // '`' - , - {409, 7, 7, 8, 0, -6} // 'a' - , - {416, 6, 9, 8, 1, -8} // 'b' - , - {423, 7, 7, 8, 0, -6} // 'c' - , - {430, 7, 9, 8, 0, -8} // 'd' - , - {438, 7, 7, 8, 0, -6} // 'e' - , - {445, 4, 9, 4, 0, -8} // 'f' - , - {450, 7, 10, 8, 0, -6} // 'g' - , - {459, 6, 9, 8, 1, -8} // 'h' - , - {466, 2, 9, 3, 1, -8} // 'i' - , - {469, 3, 11, 4, 0, -8} // 'j' - , - {474, 6, 9, 7, 1, -8} // 'k' - , - {481, 2, 9, 4, 1, -8} // 'l' - , - {484, 10, 7, 12, 1, -6} // 'm' - , - {493, 6, 7, 8, 1, -6} // 'n' - , - {499, 7, 7, 8, 0, -6} // 'o' - , - {506, 6, 9, 8, 1, -6} // 'p' - , - {513, 7, 9, 8, 0, -6} // 'q' - , - {521, 4, 7, 4, 1, -6} // 'r' - , - {524, 5, 7, 6, 0, -6} // 's' - , - {529, 4, 9, 4, 0, -8} // 't' - , - {534, 6, 7, 8, 1, -6} // 'u' - , - {540, 7, 7, 7, 0, -6} // 'v' - , - {547, 10, 7, 10, 0, -6} // 'w' - , - {556, 8, 7, 8, 0, -6} // 'x' - , - {563, 7, 9, 7, 0, -6} // 'y' - , - {571, 5, 7, 5, 0, -6} // 'z' - , - {576, 4, 12, 7, 1, -8} // '{' - , - {582, 2, 10, 7, 2, -8} // '|' - , - {585, 4, 12, 6, 1, -8} // '}' - , - {591, 6, 2, 7, 1, -3} // '~' -}; - diff --git a/resource/font_tomthumb.cpp b/resource/font_tomthumb.cpp deleted file mode 100644 index b2398cf77..000000000 --- a/resource/font_tomthumb.cpp +++ /dev/null @@ -1,421 +0,0 @@ -#include -#include "../gfxfont.h" - -unsigned char TomThumbBitmaps[] = { - 0x00, /* 0x20 space */ - 0x80, 0x80, 0x80, 0x00, 0x80, /* 0x21 exclam */ - 0xA0, 0xA0, /* 0x22 quotedbl */ - 0xA0, 0xE0, 0xA0, 0xE0, 0xA0, /* 0x23 numbersign */ - 0x60, 0xC0, 0x60, 0xC0, 0x40, /* 0x24 dollar */ - 0x80, 0x20, 0x40, 0x80, 0x20, /* 0x25 percent */ - 0xC0, 0xC0, 0xE0, 0xA0, 0x60, /* 0x26 ampersand */ - 0x80, 0x80, /* 0x27 quotesingle */ - 0x40, 0x80, 0x80, 0x80, 0x40, /* 0x28 parenleft */ - 0x80, 0x40, 0x40, 0x40, 0x80, /* 0x29 parenright */ - 0xA0, 0x40, 0xA0, /* 0x2A asterisk */ - 0x40, 0xE0, 0x40, /* 0x2B plus */ - 0x40, 0x80, /* 0x2C comma */ - 0xE0, /* 0x2D hyphen */ - 0x80, /* 0x2E period */ - 0x20, 0x20, 0x40, 0x80, 0x80, /* 0x2F slash */ - 0xE0, 0xA0, 0xA0, 0xA0, 0xE0, /* 0x30 zero */ //Edited for aesthetics - 0xC0, 0x40, 0x40, 0x40, 0xE0, /* 0x31 one */ //Edited for aesthetics - 0xE0, 0x20, 0xE0, 0x80, 0xE0, /* 0x32 two */ //Edited for aesthetics - 0xE0, 0x20, 0xE0, 0x20, 0xE0, /* 0x33 three */ //Edited for aesthetics - 0xA0, 0xA0, 0xE0, 0x20, 0x20, /* 0x34 four */ - 0xE0, 0x80, 0xE0, 0x20, 0xE0, /* 0x35 five */ //Edited for aesthetics - 0xE0, 0x80, 0xE0, 0xA0, 0xE0, /* 0x36 six */ //Edited for aesthetics - 0xE0, 0x20, 0x20, 0x20, 0x20, /* 0x37 seven */ //Edited for aesthetics - 0xE0, 0xA0, 0xE0, 0xA0, 0xE0, /* 0x38 eight */ - 0xE0, 0xA0, 0xE0, 0x20, 0xE0, /* 0x39 nine */ //Edited for aesthetics - 0x80, 0x00, 0x80, /* 0x3A colon */ - 0x40, 0x00, 0x40, 0x80, /* 0x3B semicolon */ //edited - 0x00, 0x40, 0x80, 0x40, 0x00, /* 0x3C less */ - 0xE0, 0x00, 0xE0, /* 0x3D equal */ - 0x00, 0x40, 0x20, 0x40, 0x00, /* 0x3E greater */ //edited - 0xE0, 0x20, 0x40, 0x00, 0x40, /* 0x3F question */ - 0x40, 0xA0, 0xE0, 0x80, 0x60, /* 0x40 at */ - 0x40, 0xA0, 0xE0, 0xA0, 0xA0, /* 0x41 A */ - 0xC0, 0xA0, 0xC0, 0xA0, 0xC0, /* 0x42 B */ - 0x60, 0x80, 0x80, 0x80, 0x60, /* 0x43 C */ - 0xC0, 0xA0, 0xA0, 0xA0, 0xC0, /* 0x44 D */ - 0xE0, 0x80, 0xE0, 0x80, 0xE0, /* 0x45 E */ - 0xE0, 0x80, 0xE0, 0x80, 0x80, /* 0x46 F */ - 0x60, 0x80, 0xA0, 0xA0, 0x60, /* 0x47 G */ //Edited for aesthetics - 0xA0, 0xA0, 0xE0, 0xA0, 0xA0, /* 0x48 H */ - 0xE0, 0x40, 0x40, 0x40, 0xE0, /* 0x49 I */ - 0x20, 0x20, 0x20, 0xA0, 0x40, /* 0x4A J */ - 0xA0, 0xA0, 0xC0, 0xA0, 0xA0, /* 0x4B K */ - 0x80, 0x80, 0x80, 0x80, 0xE0, /* 0x4C L */ - 0xA0, 0xE0, 0xE0, 0xA0, 0xA0, /* 0x4D M */ - 0xC0, 0xA0, 0xA0, 0xA0, 0xA0, /* 0x4E N */ //Edited for improved legibility - 0x40, 0xA0, 0xA0, 0xA0, 0x40, /* 0x4F O */ - 0xC0, 0xA0, 0xC0, 0x80, 0x80, /* 0x50 P */ - 0x40, 0xA0, 0xA0, 0xE0, 0x60, /* 0x51 Q */ - 0xE0, 0xA0, 0xE0, 0xC0, 0xA0, /* 0x52 R */ - 0xE0, 0x80, 0xE0, 0x20, 0xE0, /* 0x53 S */ //Edited - 0xE0, 0x40, 0x40, 0x40, 0x40, /* 0x54 T */ - 0xA0, 0xA0, 0xA0, 0xA0, 0x60, /* 0x55 U */ - 0xA0, 0xA0, 0xA0, 0x40, 0x40, /* 0x56 V */ - 0xA0, 0xA0, 0xE0, 0xE0, 0xA0, /* 0x57 W */ - 0xA0, 0xA0, 0x40, 0xA0, 0xA0, /* 0x58 X */ - 0xA0, 0xA0, 0xE0, 0x20, 0xE0, /* 0x59 Y */ - 0xE0, 0x20, 0x40, 0x80, 0xE0, /* 0x5A Z */ - 0xE0, 0x80, 0x80, 0x80, 0xE0, /* 0x5B bracketleft */ - 0x80, 0x40, 0x20, /* 0x5C backslash */ - 0xE0, 0x20, 0x20, 0x20, 0xE0, /* 0x5D bracketright */ - 0x40, 0xA0, /* 0x5E asciicircum */ - 0xE0, /* 0x5F underscore */ - 0x00, 0x00, /* 0x60 space white */ - 0xC0, 0x60, 0xA0, 0xE0, /* 0x61 a */ - 0x80, 0xC0, 0xA0, 0xA0, 0xC0, /* 0x62 b */ - 0x60, 0x80, 0x80, 0x60, /* 0x63 c */ - 0x20, 0x60, 0xA0, 0xA0, 0x60, /* 0x64 d */ - 0x60, 0xA0, 0xC0, 0x60, /* 0x65 e */ - 0x20, 0x40, 0xE0, 0x40, 0x40, /* 0x66 f */ - 0x60, 0xA0, 0xE0, 0x20, 0x40, /* 0x67 g */ - 0x80, 0xC0, 0xA0, 0xA0, 0xA0, /* 0x68 h */ - 0x80, 0x00, 0x80, 0x80, 0x80, /* 0x69 i */ - 0x20, 0x00, 0x20, 0x20, 0xA0, 0x40, /* 0x6A j */ - 0x80, 0xA0, 0xC0, 0xC0, 0xA0, /* 0x6B k */ - 0xC0, 0x40, 0x40, 0x40, 0xE0, /* 0x6C l */ - 0xE0, 0xE0, 0xE0, 0xA0, /* 0x6D m */ - 0xC0, 0xA0, 0xA0, 0xA0, /* 0x6E n */ - 0x40, 0xA0, 0xA0, 0x40, /* 0x6F o */ - 0xC0, 0xA0, 0xA0, 0xC0, 0x80, /* 0x70 p */ - 0x60, 0xA0, 0xA0, 0x60, 0x20, /* 0x71 q */ - 0x60, 0x80, 0x80, 0x80, /* 0x72 r */ - 0x60, 0xC0, 0x60, 0xC0, /* 0x73 s */ - 0x40, 0xE0, 0x40, 0x40, 0x60, /* 0x74 t */ - 0xA0, 0xA0, 0xA0, 0x60, /* 0x75 u */ - 0xA0, 0xA0, 0xE0, 0x40, /* 0x76 v */ - 0xA0, 0xE0, 0xE0, 0xE0, /* 0x77 w */ - 0xA0, 0x40, 0x40, 0xA0, /* 0x78 x */ - 0xA0, 0xA0, 0x60, 0x20, 0x40, /* 0x79 y */ - 0xE0, 0x60, 0xC0, 0xE0, /* 0x7A z */ - 0x60, 0x40, 0x80, 0x40, 0x60, /* 0x7B braceleft */ - 0x80, 0x80, 0x00, 0x80, 0x80, /* 0x7C bar */ - 0xC0, 0x40, 0x20, 0x40, 0xC0, /* 0x7D braceright */ - 0x60, 0xC0, /* 0x7E asciitilde */ -#if (TOMTHUMB_USE_EXTENDED) - 0x80, 0x00, 0x80, 0x80, 0x80, /* 0xA1 exclamdown */ - 0x40, 0xE0, 0x80, 0xE0, 0x40, /* 0xA2 cent */ - 0x60, 0x40, 0xE0, 0x40, 0xE0, /* 0xA3 sterling */ - 0xA0, 0x40, 0xE0, 0x40, 0xA0, /* 0xA4 currency */ - 0xA0, 0xA0, 0x40, 0xE0, 0x40, /* 0xA5 yen */ - 0x80, 0x80, 0x00, 0x80, 0x80, /* 0xA6 brokenbar */ - 0x60, 0x40, 0xA0, 0x40, 0xC0, /* 0xA7 section */ - 0xA0, /* 0xA8 dieresis */ - 0x60, 0x80, 0x60, /* 0xA9 copyright */ - 0x60, 0xA0, 0xE0, 0x00, 0xE0, /* 0xAA ordfeminine */ - 0x40, 0x80, 0x40, /* 0xAB guillemotleft */ - 0xE0, 0x20, /* 0xAC logicalnot */ - 0xC0, /* 0xAD softhyphen */ - 0xC0, 0xC0, 0xA0, /* 0xAE registered */ - 0xE0, /* 0xAF macron */ - 0x40, 0xA0, 0x40, /* 0xB0 degree */ - 0x40, 0xE0, 0x40, 0x00, 0xE0, /* 0xB1 plusminus */ - 0xC0, 0x40, 0x60, /* 0xB2 twosuperior */ - 0xE0, 0x60, 0xE0, /* 0xB3 threesuperior */ - 0x40, 0x80, /* 0xB4 acute */ - 0xA0, 0xA0, 0xA0, 0xC0, 0x80, /* 0xB5 mu */ - 0x60, 0xA0, 0x60, 0x60, 0x60, /* 0xB6 paragraph */ - 0xE0, 0xE0, 0xE0, /* 0xB7 periodcentered */ - 0x40, 0x20, 0xC0, /* 0xB8 cedilla */ - 0x80, 0x80, 0x80, /* 0xB9 onesuperior */ - 0x40, 0xA0, 0x40, 0x00, 0xE0, /* 0xBA ordmasculine */ - 0x80, 0x40, 0x80, /* 0xBB guillemotright */ - 0x80, 0x80, 0x00, 0x60, 0x20, /* 0xBC onequarter */ - 0x80, 0x80, 0x00, 0xC0, 0x60, /* 0xBD onehalf */ - 0xC0, 0xC0, 0x00, 0x60, 0x20, /* 0xBE threequarters */ - 0x40, 0x00, 0x40, 0x80, 0xE0, /* 0xBF questiondown */ - 0x40, 0x20, 0x40, 0xE0, 0xA0, /* 0xC0 Agrave */ - 0x40, 0x80, 0x40, 0xE0, 0xA0, /* 0xC1 Aacute */ - 0xE0, 0x00, 0x40, 0xE0, 0xA0, /* 0xC2 Acircumflex */ - 0x60, 0xC0, 0x40, 0xE0, 0xA0, /* 0xC3 Atilde */ - 0xA0, 0x40, 0xA0, 0xE0, 0xA0, /* 0xC4 Adieresis */ - 0xC0, 0xC0, 0xA0, 0xE0, 0xA0, /* 0xC5 Aring */ - 0x60, 0xC0, 0xE0, 0xC0, 0xE0, /* 0xC6 AE */ - 0x60, 0x80, 0x80, 0x60, 0x20, 0x40, /* 0xC7 Ccedilla */ - 0x40, 0x20, 0xE0, 0xC0, 0xE0, /* 0xC8 Egrave */ - 0x40, 0x80, 0xE0, 0xC0, 0xE0, /* 0xC9 Eacute */ - 0xE0, 0x00, 0xE0, 0xC0, 0xE0, /* 0xCA Ecircumflex */ - 0xA0, 0x00, 0xE0, 0xC0, 0xE0, /* 0xCB Edieresis */ - 0x40, 0x20, 0xE0, 0x40, 0xE0, /* 0xCC Igrave */ - 0x40, 0x80, 0xE0, 0x40, 0xE0, /* 0xCD Iacute */ - 0xE0, 0x00, 0xE0, 0x40, 0xE0, /* 0xCE Icircumflex */ - 0xA0, 0x00, 0xE0, 0x40, 0xE0, /* 0xCF Idieresis */ - 0xC0, 0xA0, 0xE0, 0xA0, 0xC0, /* 0xD0 Eth */ - 0xC0, 0x60, 0xA0, 0xE0, 0xA0, /* 0xD1 Ntilde */ - 0x40, 0x20, 0xE0, 0xA0, 0xE0, /* 0xD2 Ograve */ - 0x40, 0x80, 0xE0, 0xA0, 0xE0, /* 0xD3 Oacute */ - 0xE0, 0x00, 0xE0, 0xA0, 0xE0, /* 0xD4 Ocircumflex */ - 0xC0, 0x60, 0xE0, 0xA0, 0xE0, /* 0xD5 Otilde */ - 0xA0, 0x00, 0xE0, 0xA0, 0xE0, /* 0xD6 Odieresis */ - 0xA0, 0x40, 0xA0, /* 0xD7 multiply */ - 0x60, 0xA0, 0xE0, 0xA0, 0xC0, /* 0xD8 Oslash */ - 0x80, 0x40, 0xA0, 0xA0, 0xE0, /* 0xD9 Ugrave */ - 0x20, 0x40, 0xA0, 0xA0, 0xE0, /* 0xDA Uacute */ - 0xE0, 0x00, 0xA0, 0xA0, 0xE0, /* 0xDB Ucircumflex */ - 0xA0, 0x00, 0xA0, 0xA0, 0xE0, /* 0xDC Udieresis */ - 0x20, 0x40, 0xA0, 0xE0, 0x40, /* 0xDD Yacute */ - 0x80, 0xE0, 0xA0, 0xE0, 0x80, /* 0xDE Thorn */ - 0x60, 0xA0, 0xC0, 0xA0, 0xC0, 0x80, /* 0xDF germandbls */ - 0x40, 0x20, 0x60, 0xA0, 0xE0, /* 0xE0 agrave */ - 0x40, 0x80, 0x60, 0xA0, 0xE0, /* 0xE1 aacute */ - 0xE0, 0x00, 0x60, 0xA0, 0xE0, /* 0xE2 acircumflex */ - 0x60, 0xC0, 0x60, 0xA0, 0xE0, /* 0xE3 atilde */ - 0xA0, 0x00, 0x60, 0xA0, 0xE0, /* 0xE4 adieresis */ - 0x60, 0x60, 0x60, 0xA0, 0xE0, /* 0xE5 aring */ - 0x60, 0xE0, 0xE0, 0xC0, /* 0xE6 ae */ - 0x60, 0x80, 0x60, 0x20, 0x40, /* 0xE7 ccedilla */ - 0x40, 0x20, 0x60, 0xE0, 0x60, /* 0xE8 egrave */ - 0x40, 0x80, 0x60, 0xE0, 0x60, /* 0xE9 eacute */ - 0xE0, 0x00, 0x60, 0xE0, 0x60, /* 0xEA ecircumflex */ - 0xA0, 0x00, 0x60, 0xE0, 0x60, /* 0xEB edieresis */ - 0x80, 0x40, 0x80, 0x80, 0x80, /* 0xEC igrave */ - 0x40, 0x80, 0x40, 0x40, 0x40, /* 0xED iacute */ - 0xE0, 0x00, 0x40, 0x40, 0x40, /* 0xEE icircumflex */ - 0xA0, 0x00, 0x40, 0x40, 0x40, /* 0xEF idieresis */ - 0x60, 0xC0, 0x60, 0xA0, 0x60, /* 0xF0 eth */ - 0xC0, 0x60, 0xC0, 0xA0, 0xA0, /* 0xF1 ntilde */ - 0x40, 0x20, 0x40, 0xA0, 0x40, /* 0xF2 ograve */ - 0x40, 0x80, 0x40, 0xA0, 0x40, /* 0xF3 oacute */ - 0xE0, 0x00, 0x40, 0xA0, 0x40, /* 0xF4 ocircumflex */ - 0xC0, 0x60, 0x40, 0xA0, 0x40, /* 0xF5 otilde */ - 0xA0, 0x00, 0x40, 0xA0, 0x40, /* 0xF6 odieresis */ - 0x40, 0x00, 0xE0, 0x00, 0x40, /* 0xF7 divide */ - 0x60, 0xE0, 0xA0, 0xC0, /* 0xF8 oslash */ - 0x80, 0x40, 0xA0, 0xA0, 0x60, /* 0xF9 ugrave */ - 0x20, 0x40, 0xA0, 0xA0, 0x60, /* 0xFA uacute */ - 0xE0, 0x00, 0xA0, 0xA0, 0x60, /* 0xFB ucircumflex */ - 0xA0, 0x00, 0xA0, 0xA0, 0x60, /* 0xFC udieresis */ - 0x20, 0x40, 0xA0, 0x60, 0x20, 0x40, /* 0xFD yacute */ - 0x80, 0xC0, 0xA0, 0xC0, 0x80, /* 0xFE thorn */ - 0xA0, 0x00, 0xA0, 0x60, 0x20, 0x40, /* 0xFF ydieresis */ - 0x00, /* 0x11D gcircumflex */ - 0x60, 0xC0, 0xE0, 0xC0, 0x60, /* 0x152 OE */ - 0x60, 0xE0, 0xC0, 0xE0, /* 0x153 oe */ - 0xA0, 0x60, 0xC0, 0x60, 0xC0, /* 0x160 Scaron */ - 0xA0, 0x60, 0xC0, 0x60, 0xC0, /* 0x161 scaron */ - 0xA0, 0x00, 0xA0, 0x40, 0x40, /* 0x178 Ydieresis */ - 0xA0, 0xE0, 0x60, 0xC0, 0xE0, /* 0x17D Zcaron */ - 0xA0, 0xE0, 0x60, 0xC0, 0xE0, /* 0x17E zcaron */ - 0x00, /* 0xEA4 uni0EA4 */ - 0x00, /* 0x13A0 uni13A0 */ - 0x80, /* 0x2022 bullet */ - 0xA0, /* 0x2026 ellipsis */ - 0x60, 0xE0, 0xE0, 0xC0, 0x60, /* 0x20AC Euro */ - 0xE0, 0xA0, 0xA0, 0xA0, 0xE0, /* 0xFFFD uniFFFD */ -#endif /* (TOMTHUMB_USE_EXTENDED) */ - }; - -/* {offset, width, height, advance cursor, x offset, y offset} */ -GFXglyph TomThumbGlyphs[] = { - { 0, 8, 1, 2, 0, -5 }, /* 0x20 space */ - { 1, 8, 5, 2, 0, -5 }, /* 0x21 exclam */ - { 6, 8, 2, 4, 0, -5 }, /* 0x22 quotedbl */ - { 8, 8, 5, 4, 0, -5 }, /* 0x23 numbersign */ - { 13, 8, 5, 4, 0, -5 }, /* 0x24 dollar */ - { 18, 8, 5, 4, 0, -5 }, /* 0x25 percent */ - { 23, 8, 5, 4, 0, -5 }, /* 0x26 ampersand */ - { 28, 8, 2, 2, 0, -5 }, /* 0x27 quotesingle */ - { 30, 8, 5, 3, 0, -5 }, /* 0x28 parenleft */ - { 35, 8, 5, 3, 0, -5 }, /* 0x29 parenright */ - { 40, 8, 3, 4, 0, -5 }, /* 0x2A asterisk */ - { 43, 8, 3, 4, 0, -4 }, /* 0x2B plus */ - { 46, 8, 2, 3, 0, -2 }, /* 0x2C comma */ - { 48, 8, 1, 4, 0, -3 }, /* 0x2D hyphen */ - { 49, 8, 1, 2, 0, -1 }, /* 0x2E period */ - { 50, 8, 5, 4, 0, -5 }, /* 0x2F slash */ - { 55, 8, 5, 4, 0, -5 }, /* 0x30 zero */ - { 60, 8, 5, 4, 0, -5 }, /* 0x31 one */ //Spacing improved - { 65, 8, 5, 4, 0, -5 }, /* 0x32 two */ - { 70, 8, 5, 4, 0, -5 }, /* 0x33 three */ - { 75, 8, 5, 4, 0, -5 }, /* 0x34 four */ - { 80, 8, 5, 4, 0, -5 }, /* 0x35 five */ - { 85, 8, 5, 4, 0, -5 }, /* 0x36 six */ - { 90, 8, 5, 4, 0, -5 }, /* 0x37 seven */ - { 95, 8, 5, 4, 0, -5 }, /* 0x38 eight */ - { 100, 8, 5, 4, 0, -5 }, /* 0x39 nine */ - { 105, 8, 3, 2, 0, -4 }, /* 0x3A colon */ - { 108, 8, 4, 3, 0, -4 }, /* 0x3B semicolon */ - { 112, 8, 5, 4, 0, -5 }, /* 0x3C less */ - { 117, 8, 3, 4, 0, -4 }, /* 0x3D equal */ - { 120, 8, 5, 4, 0, -5 }, /* 0x3E greater */ - { 125, 8, 5, 4, 0, -5 }, /* 0x3F question */ - { 130, 8, 5, 4, 0, -5 }, /* 0x40 at */ - { 135, 8, 5, 4, 0, -5 }, /* 0x41 A */ - { 140, 8, 5, 4, 0, -5 }, /* 0x42 B */ - { 145, 8, 5, 4, 0, -5 }, /* 0x43 C */ - { 150, 8, 5, 4, 0, -5 }, /* 0x44 D */ - { 155, 8, 5, 4, 0, -5 }, /* 0x45 E */ - { 160, 8, 5, 4, 0, -5 }, /* 0x46 F */ - { 165, 8, 5, 4, 0, -5 }, /* 0x47 G */ - { 170, 8, 5, 4, 0, -5 }, /* 0x48 H */ - { 175, 8, 5, 4, 0, -5 }, /* 0x49 I */ - { 180, 8, 5, 4, 0, -5 }, /* 0x4A J */ - { 185, 8, 5, 4, 0, -5 }, /* 0x4B K */ - { 190, 8, 5, 4, 0, -5 }, /* 0x4C L */ - { 195, 8, 5, 4, 0, -5 }, /* 0x4D M */ - { 200, 8, 5, 4, 0, -5 }, /* 0x4E N */ - { 205, 8, 5, 4, 0, -5 }, /* 0x4F O */ - { 210, 8, 5, 4, 0, -5 }, /* 0x50 P */ - { 215, 8, 5, 4, 0, -5 }, /* 0x51 Q */ - { 220, 8, 5, 4, 0, -5 }, /* 0x52 R */ - { 225, 8, 5, 4, 0, -5 }, /* 0x53 S */ - { 230, 8, 5, 4, 0, -5 }, /* 0x54 T */ - { 235, 8, 5, 4, 0, -5 }, /* 0x55 U */ - { 240, 8, 5, 4, 0, -5 }, /* 0x56 V */ - { 245, 8, 5, 4, 0, -5 }, /* 0x57 W */ - { 250, 8, 5, 4, 0, -5 }, /* 0x58 X */ - { 255, 8, 5, 4, 0, -5 }, /* 0x59 Y */ - { 260, 8, 5, 4, 0, -5 }, /* 0x5A Z */ - { 265, 8, 5, 4, 0, -5 }, /* 0x5B bracketleft */ - { 270, 8, 3, 4, 0, -4 }, /* 0x5C backslash */ - { 273, 8, 5, 4, 0, -5 }, /* 0x5D bracketright */ - { 278, 8, 2, 4, 0, -5 }, /* 0x5E asciicircum */ - { 280, 8, 1, 4, 0, -1 }, /* 0x5F underscore */ - { 281, 8, 1, 4, 0, -5 }, /* 0x60 space wide */ - { 283, 8, 4, 4, 0, -4 }, /* 0x61 a */ - { 287, 8, 5, 4, 0, -5 }, /* 0x62 b */ - { 292, 8, 4, 4, 0, -4 }, /* 0x63 c */ - { 296, 8, 5, 4, 0, -5 }, /* 0x64 d */ - { 301, 8, 4, 4, 0, -4 }, /* 0x65 e */ - { 305, 8, 5, 4, 0, -5 }, /* 0x66 f */ - { 310, 8, 5, 4, 0, -4 }, /* 0x67 g */ - { 315, 8, 5, 4, 0, -5 }, /* 0x68 h */ - { 320, 8, 5, 2, 0, -5 }, /* 0x69 i */ - { 325, 8, 6, 4, 0, -5 }, /* 0x6A j */ - { 331, 8, 5, 4, 0, -5 }, /* 0x6B k */ - { 336, 8, 5, 4, 0, -5 }, /* 0x6C l */ - { 341, 8, 4, 4, 0, -4 }, /* 0x6D m */ - { 345, 8, 4, 4, 0, -4 }, /* 0x6E n */ - { 349, 8, 4, 4, 0, -4 }, /* 0x6F o */ - { 353, 8, 5, 4, 0, -4 }, /* 0x70 p */ - { 358, 8, 5, 4, 0, -4 }, /* 0x71 q */ - { 363, 8, 4, 4, 0, -4 }, /* 0x72 r */ - { 367, 8, 4, 4, 0, -4 }, /* 0x73 s */ - { 371, 8, 5, 4, 0, -5 }, /* 0x74 t */ - { 376, 8, 4, 4, 0, -4 }, /* 0x75 u */ - { 380, 8, 4, 4, 0, -4 }, /* 0x76 v */ - { 384, 8, 4, 4, 0, -4 }, /* 0x77 w */ - { 388, 8, 4, 4, 0, -4 }, /* 0x78 x */ - { 392, 8, 5, 4, 0, -4 }, /* 0x79 y */ - { 397, 8, 4, 4, 0, -4 }, /* 0x7A z */ - { 401, 8, 5, 4, 0, -5 }, /* 0x7B braceleft */ - { 406, 8, 5, 2, 0, -5 }, /* 0x7C bar */ - { 411, 8, 5, 4, 0, -5 }, /* 0x7D braceright */ - { 416, 8, 2, 4, 0, -5 }, /* 0x7E asciitilde */ -#if (TOMTHUMB_USE_EXTENDED) - { 418, 8, 5, 2, 0, -5 }, /* 0xA1 exclamdown */ - { 423, 8, 5, 4, 0, -5 }, /* 0xA2 cent */ - { 428, 8, 5, 4, 0, -5 }, /* 0xA3 sterling */ - { 433, 8, 5, 4, 0, -5 }, /* 0xA4 currency */ - { 438, 8, 5, 4, 0, -5 }, /* 0xA5 yen */ - { 443, 8, 5, 2, 0, -5 }, /* 0xA6 brokenbar */ - { 448, 8, 5, 4, 0, -5 }, /* 0xA7 section */ - { 453, 8, 1, 4, 0, -5 }, /* 0xA8 dieresis */ - { 454, 8, 3, 4, 0, -5 }, /* 0xA9 copyright */ - { 457, 8, 5, 4, 0, -5 }, /* 0xAA ordfeminine */ - { 462, 8, 3, 3, 0, -5 }, /* 0xAB guillemotleft */ - { 465, 8, 2, 4, 0, -4 }, /* 0xAC logicalnot */ - { 467, 8, 1, 3, 0, -3 }, /* 0xAD softhyphen */ - { 468, 8, 3, 4, 0, -5 }, /* 0xAE registered */ - { 471, 8, 1, 4, 0, -5 }, /* 0xAF macron */ - { 472, 8, 3, 4, 0, -5 }, /* 0xB0 degree */ - { 475, 8, 5, 4, 0, -5 }, /* 0xB1 plusminus */ - { 480, 8, 3, 4, 0, -5 }, /* 0xB2 twosuperior */ - { 483, 8, 3, 4, 0, -5 }, /* 0xB3 threesuperior */ - { 486, 8, 2, 3, 0, -5 }, /* 0xB4 acute */ - { 488, 8, 5, 4, 0, -5 }, /* 0xB5 mu */ - { 493, 8, 5, 4, 0, -5 }, /* 0xB6 paragraph */ - { 498, 8, 3, 4, 0, -4 }, /* 0xB7 periodcentered */ - { 501, 8, 3, 4, 0, -3 }, /* 0xB8 cedilla */ - { 504, 8, 3, 2, 0, -5 }, /* 0xB9 onesuperior */ - { 507, 8, 5, 4, 0, -5 }, /* 0xBA ordmasculine */ - { 512, 8, 3, 3, 0, -5 }, /* 0xBB guillemotright */ - { 515, 8, 5, 4, 0, -5 }, /* 0xBC onequarter */ - { 520, 8, 5, 4, 0, -5 }, /* 0xBD onehalf */ - { 525, 8, 5, 4, 0, -5 }, /* 0xBE threequarters */ - { 530, 8, 5, 4, 0, -5 }, /* 0xBF questiondown */ - { 535, 8, 5, 4, 0, -5 }, /* 0xC0 Agrave */ - { 540, 8, 5, 4, 0, -5 }, /* 0xC1 Aacute */ - { 545, 8, 5, 4, 0, -5 }, /* 0xC2 Acircumflex */ - { 550, 8, 5, 4, 0, -5 }, /* 0xC3 Atilde */ - { 555, 8, 5, 4, 0, -5 }, /* 0xC4 Adieresis */ - { 560, 8, 5, 4, 0, -5 }, /* 0xC5 Aring */ - { 565, 8, 5, 4, 0, -5 }, /* 0xC6 AE */ - { 570, 8, 6, 4, 0, -5 }, /* 0xC7 Ccedilla */ - { 576, 8, 5, 4, 0, -5 }, /* 0xC8 Egrave */ - { 581, 8, 5, 4, 0, -5 }, /* 0xC9 Eacute */ - { 586, 8, 5, 4, 0, -5 }, /* 0xCA Ecircumflex */ - { 591, 8, 5, 4, 0, -5 }, /* 0xCB Edieresis */ - { 596, 8, 5, 4, 0, -5 }, /* 0xCC Igrave */ - { 601, 8, 5, 4, 0, -5 }, /* 0xCD Iacute */ - { 606, 8, 5, 4, 0, -5 }, /* 0xCE Icircumflex */ - { 611, 8, 5, 4, 0, -5 }, /* 0xCF Idieresis */ - { 616, 8, 5, 4, 0, -5 }, /* 0xD0 Eth */ - { 621, 8, 5, 4, 0, -5 }, /* 0xD1 Ntilde */ - { 626, 8, 5, 4, 0, -5 }, /* 0xD2 Ograve */ - { 631, 8, 5, 4, 0, -5 }, /* 0xD3 Oacute */ - { 636, 8, 5, 4, 0, -5 }, /* 0xD4 Ocircumflex */ - { 641, 8, 5, 4, 0, -5 }, /* 0xD5 Otilde */ - { 646, 8, 5, 4, 0, -5 }, /* 0xD6 Odieresis */ - { 651, 8, 3, 4, 0, -4 }, /* 0xD7 multiply */ - { 654, 8, 5, 4, 0, -5 }, /* 0xD8 Oslash */ - { 659, 8, 5, 4, 0, -5 }, /* 0xD9 Ugrave */ - { 664, 8, 5, 4, 0, -5 }, /* 0xDA Uacute */ - { 669, 8, 5, 4, 0, -5 }, /* 0xDB Ucircumflex */ - { 674, 8, 5, 4, 0, -5 }, /* 0xDC Udieresis */ - { 679, 8, 5, 4, 0, -5 }, /* 0xDD Yacute */ - { 684, 8, 5, 4, 0, -5 }, /* 0xDE Thorn */ - { 689, 8, 6, 4, 0, -5 }, /* 0xDF germandbls */ - { 695, 8, 5, 4, 0, -5 }, /* 0xE0 agrave */ - { 700, 8, 5, 4, 0, -5 }, /* 0xE1 aacute */ - { 705, 8, 5, 4, 0, -5 }, /* 0xE2 acircumflex */ - { 710, 8, 5, 4, 0, -5 }, /* 0xE3 atilde */ - { 715, 8, 5, 4, 0, -5 }, /* 0xE4 adieresis */ - { 720, 8, 5, 4, 0, -5 }, /* 0xE5 aring */ - { 725, 8, 4, 4, 0, -4 }, /* 0xE6 ae */ - { 729, 8, 5, 4, 0, -4 }, /* 0xE7 ccedilla */ - { 734, 8, 5, 4, 0, -5 }, /* 0xE8 egrave */ - { 739, 8, 5, 4, 0, -5 }, /* 0xE9 eacute */ - { 744, 8, 5, 4, 0, -5 }, /* 0xEA ecircumflex */ - { 749, 8, 5, 4, 0, -5 }, /* 0xEB edieresis */ - { 754, 8, 5, 3, 0, -5 }, /* 0xEC igrave */ - { 759, 8, 5, 3, 0, -5 }, /* 0xED iacute */ - { 764, 8, 5, 4, 0, -5 }, /* 0xEE icircumflex */ - { 769, 8, 5, 4, 0, -5 }, /* 0xEF idieresis */ - { 774, 8, 5, 4, 0, -5 }, /* 0xF0 eth */ - { 779, 8, 5, 4, 0, -5 }, /* 0xF1 ntilde */ - { 784, 8, 5, 4, 0, -5 }, /* 0xF2 ograve */ - { 789, 8, 5, 4, 0, -5 }, /* 0xF3 oacute */ - { 794, 8, 5, 4, 0, -5 }, /* 0xF4 ocircumflex */ - { 799, 8, 5, 4, 0, -5 }, /* 0xF5 otilde */ - { 804, 8, 5, 4, 0, -5 }, /* 0xF6 odieresis */ - { 809, 8, 5, 4, 0, -5 }, /* 0xF7 divide */ - { 814, 8, 4, 4, 0, -4 }, /* 0xF8 oslash */ - { 818, 8, 5, 4, 0, -5 }, /* 0xF9 ugrave */ - { 823, 8, 5, 4, 0, -5 }, /* 0xFA uacute */ - { 828, 8, 5, 4, 0, -5 }, /* 0xFB ucircumflex */ - { 833, 8, 5, 4, 0, -5 }, /* 0xFC udieresis */ - { 838, 8, 6, 4, 0, -5 }, /* 0xFD yacute */ - { 844, 8, 5, 4, 0, -4 }, /* 0xFE thorn */ - { 849, 8, 6, 4, 0, -5 }, /* 0xFF ydieresis */ - { 855, 8, 1, 2, 0, -1 }, /* 0x11D gcircumflex */ - { 856, 8, 5, 4, 0, -5 }, /* 0x152 OE */ - { 861, 8, 4, 4, 0, -4 }, /* 0x153 oe */ - { 865, 8, 5, 4, 0, -5 }, /* 0x160 Scaron */ - { 870, 8, 5, 4, 0, -5 }, /* 0x161 scaron */ - { 875, 8, 5, 4, 0, -5 }, /* 0x178 Ydieresis */ - { 880, 8, 5, 4, 0, -5 }, /* 0x17D Zcaron */ - { 885, 8, 5, 4, 0, -5 }, /* 0x17E zcaron */ - { 890, 8, 1, 2, 0, -1 }, /* 0xEA4 uni0EA4 */ - { 891, 8, 1, 2, 0, -1 }, /* 0x13A0 uni13A0 */ - { 892, 8, 1, 2, 0, -3 }, /* 0x2022 bullet */ - { 893, 8, 1, 4, 0, -1 }, /* 0x2026 ellipsis */ - { 894, 8, 5, 4, 0, -5 }, /* 0x20AC Euro */ - { 899, 8, 5, 4, 0, -5 }, /* 0xFFFD uniFFFD */ -#endif /* (TOMTHUMB_USE_EXTENDED) */ -}; From 001e804e3e5a9a17a6d5f04515755efb43e28258 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 30 Jun 2023 15:15:44 +1000 Subject: [PATCH 134/413] Update Elektrogothic with new glyphs, A,B,C,D --- .../Adafruit-GFX-Library/Fonts/Elektrothic.c | 46 +++++++++++-------- avr/cores/megacommand/resources/R.h | 45 ------------------ 2 files changed, 27 insertions(+), 64 deletions(-) diff --git a/avr/cores/megacommand/Adafruit-GFX-Library/Fonts/Elektrothic.c b/avr/cores/megacommand/Adafruit-GFX-Library/Fonts/Elektrothic.c index 565579f11..38fd3690a 100644 --- a/avr/cores/megacommand/Adafruit-GFX-Library/Fonts/Elektrothic.c +++ b/avr/cores/megacommand/Adafruit-GFX-Library/Fonts/Elektrothic.c @@ -2,27 +2,35 @@ #include "../gfxfont.h" const uint8_t ElektrothicBitmaps[] PROGMEM = { - 0x7B, 0xFC, 0xF3, 0xCF, 0x3F, 0xDE, 0xFD, 0xB6, 0xDB, 0xFB, 0xF0, 0xCF, - 0x73, 0x0F, 0xFF, 0xFB, 0xF0, 0xCE, 0x38, 0x3F, 0xFE, 0xCF, 0x3C, 0xFF, - 0x7C, 0x30, 0xC3, 0xFF, 0xFC, 0x3E, 0xFC, 0x3F, 0xFF, 0x7F, 0xFC, 0x3E, - 0xFF, 0x3F, 0xDF, 0xFF, 0xF0, 0xC7, 0x39, 0xCE, 0x30, 0x7B, 0xFC, 0xDE, - 0xFF, 0x3F, 0xDE, 0x7B, 0xFC, 0xFF, 0x7C, 0x3F, 0xFE, 0xCF, 0x37, 0x8C, - 0x31, 0xEC, 0xF3, 0xCF, 0x3C, 0xFF, 0x7C, 0x3F, 0xFE}; + 0x7B, 0xFC, 0xF3, 0xCF, 0x3F, 0xDE, 0xFD, 0xB6, 0xDB, 0xFB, 0xF0, 0xCF, + 0x73, 0x0F, 0xFF, 0xFB, 0xF0, 0xCE, 0x38, 0x3F, 0xFE, 0xCF, 0x3C, 0xFF, + 0x7C, 0x30, 0xC3, 0xFF, 0xFC, 0x3E, 0xFC, 0x3F, 0xFF, 0x7F, 0xFC, 0x3E, + 0xFF, 0x3F, 0xDF, 0xFF, 0xF0, 0xC7, 0x39, 0xCE, 0x30, 0x7B, 0xFC, 0xDE, + 0xFF, 0x3F, 0xDE, 0x7B, 0xFC, 0xFF, 0x7C, 0x3F, 0xFE, 0xCF, 0x37, 0x8C, + 0x31, 0xEC, 0xF3, 0xCF, 0x3C, 0xFF, 0x7C, 0x3F, 0xFE, 0x31, 0xEF, 0xF3, + 0xFF, 0xFC, 0xF3, 0xFB, 0xFC, 0xFF, 0xFF, 0x3F, 0xFE, 0x7F, 0xF1, 0x8C, + 0x63, 0xEF, 0xF3, 0xEC, 0xF3, 0xCF, 0x3F, 0xBC +}; const GFXglyph ElektrothicGlyphs[] PROGMEM = { - {0, 6, 8, 7, 0, -8}, // 0x0 'non-printable' - {6, 3, 8, 4, 0, -8}, // 0x1 'non-printable' - {9, 6, 8, 7, 0, -8}, // 0x2 'non-printable' - {15, 6, 8, 7, 0, -8}, // 0x3 'non-printable' - {21, 6, 8, 7, 0, -8}, // 0x4 'non-printable' - {27, 6, 8, 7, 0, -8}, // 0x5 'non-printable' - {33, 6, 8, 7, 0, -8}, // 0x6 'non-printable' - {39, 6, 8, 7, 0, -8}, // 0x7 'non-printable' - {45, 6, 8, 7, 0, -8}, // 0x8 'non-printable' - {51, 6, 8, 7, 0, -8}, // 0x9 'non-printable' - {57, 6, 8, 7, 0, -8}, // 0xA 'non-printable' - {63, 6, 8, 7, 0, -8} // 0xB 'non-printable' + { 0, 6, 8, 7, 0, -8 }, // 0x30 '0' + { 6, 3, 8, 4, 0, -8 }, // 0x31 '1' + { 9, 6, 8, 7, 0, -8 }, // 0x32 '2' + { 15, 6, 8, 7, 0, -8 }, // 0x33 '3' + { 21, 6, 8, 7, 0, -8 }, // 0x34 '4' + { 27, 6, 8, 7, 0, -8 }, // 0x35 '5' + { 33, 6, 8, 7, 0, -8 }, // 0x36 '6' + { 39, 6, 8, 7, 0, -8 }, // 0x37 '7' + { 45, 6, 8, 7, 0, -8 }, // 0x38 '8' + { 51, 6, 8, 7, 0, -8 }, // 0x39 '9' + { 57, 6, 8, 7, 0, -8 }, // 0x3A ':' + { 63, 6, 8, 7, 0, -8 }, // 0x3B ';' + { 69, 6, 8, 7, 0, -8 }, // 0x3C '<' + { 75, 6, 8, 7, 0, -8 }, // 0x3D '=' + { 81, 5, 8, 6, 0, -8 }, // 0x3E '>' + { 86, 6, 8, 7, 0, -8 } // 0x3F '?' }; const GFXfont Elektrothic PROGMEM = { - (uint8_t *)ElektrothicBitmaps, (GFXglyph *)ElektrothicGlyphs, '0', ';', 15}; + (uint8_t *)ElektrothicBitmaps, (GFXglyph *)ElektrothicGlyphs, 0x30, 0x3F, 15}; + diff --git a/avr/cores/megacommand/resources/R.h b/avr/cores/megacommand/resources/R.h index 9395efea2..4a5802661 100644 --- a/avr/cores/megacommand/resources/R.h +++ b/avr/cores/megacommand/resources/R.h @@ -2,51 +2,6 @@ #include #include "MCL.h" #include "MCL_impl.h" -extern const unsigned char __R_font_default[] PROGMEM; -struct __T_font_default { - union { - unsigned char font[0]; - char zz__font[1280]; - }; - static constexpr size_t countof_font = 1280 / sizeof(unsigned char); - static constexpr size_t sizeofof_font = 1280; - static constexpr size_t __total_size = 1280; -}; - -extern const unsigned char __R_font_elektrothic[] PROGMEM; -struct __T_font_elektrothic { - union { - GFXglyph ElektrothicGlyphs[0]; - char zz__ElektrothicGlyphs[665]; - }; - static constexpr size_t countof_ElektrothicGlyphs = 665 / sizeof(GFXglyph); - static constexpr size_t sizeofof_ElektrothicGlyphs = 665; - union { - unsigned char ElektrothicBitmaps[0]; - char zz__ElektrothicBitmaps[593]; - }; - static constexpr size_t countof_ElektrothicBitmaps = 593 / sizeof(unsigned char); - static constexpr size_t sizeofof_ElektrothicBitmaps = 593; - static constexpr size_t __total_size = 1258; -}; - -extern const unsigned char __R_font_tomthumb[] PROGMEM; -struct __T_font_tomthumb { - union { - GFXglyph TomThumbGlyphs[0]; - char zz__TomThumbGlyphs[665]; - }; - static constexpr size_t countof_TomThumbGlyphs = 665 / sizeof(GFXglyph); - static constexpr size_t sizeofof_TomThumbGlyphs = 665; - union { - unsigned char TomThumbBitmaps[0]; - char zz__TomThumbBitmaps[418]; - }; - static constexpr size_t countof_TomThumbBitmaps = 418 / sizeof(unsigned char); - static constexpr size_t sizeofof_TomThumbBitmaps = 418; - static constexpr size_t __total_size = 1083; -}; - extern const unsigned char __R_icons_boot[] PROGMEM; struct __T_icons_boot { union { From 92b173e6a18183db02cf8bc7561ddde96bd74577 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 30 Jun 2023 15:15:55 +1000 Subject: [PATCH 135/413] Checkpoint --- avr/cores/megacommand/MCL/PerfData.h | 9 ++- avr/cores/megacommand/MCL/PerfPage.cpp | 88 +++++++++++++----------- avr/cores/megacommand/MCL/PerfPage.h | 3 + avr/cores/megacommand/resources/ResMan.h | 6 -- 4 files changed, 58 insertions(+), 48 deletions(-) diff --git a/avr/cores/megacommand/MCL/PerfData.h b/avr/cores/megacommand/MCL/PerfData.h index a734c01dc..d3654d117 100644 --- a/avr/cores/megacommand/MCL/PerfData.h +++ b/avr/cores/megacommand/MCL/PerfData.h @@ -43,7 +43,7 @@ class PerfData { return 255; } - uint8_t add_param(uint8_t dest, uint8_t param, uint8_t learn, uint8_t value) { + uint8_t add_param(uint8_t dest, uint8_t param, uint8_t scene, uint8_t value) { uint8_t match = 255; uint8_t empty = 255; @@ -69,8 +69,8 @@ class PerfData { params[b].dest = dest + 1; params[b].param = param; - if (learn > 0) { - uint8_t s = learn - 1; + if (scene > 0) { + uint8_t s = scene - 1; active_scenes |= (1 << s); params[b].scenes[s] = value; } @@ -80,10 +80,13 @@ class PerfData { void *data() const { return (void *)¶ms; } void init_params() { + memset(params,0,sizeof(params)); + /* for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { params[a].dest = 0; params[a].param = 0; } + */ } void clear_scene(uint8_t s) { active_scenes &= ~(1 << s); diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 1e133f60a..4683177be 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -19,7 +19,6 @@ void PerfPage::init() { DEBUG_PRINT_FN(); PerfPageParent::init(); trig_interface.on(); - set_led_mask(); } void PerfPage::set_led_mask() { @@ -28,11 +27,21 @@ void PerfPage::set_led_mask() { PerfEncoder *e = perf_encoders[perf_id]; SET_BIT16(mask, e->active_scene_a); SET_BIT16(mask, e->active_scene_b); - MD.set_trigleds(mask, TRIGLED_EXCLUSIVE); + + if (last_mask != mask) { + MD.set_trigleds(mask, TRIGLED_EXCLUSIVENDYNAMIC); + } bool blink = true; + uint16_t blink_mask = 0; blink_mask |= e->perf_data.active_scenes; - MD.set_trigleds(mask, TRIGLED_EXCLUSIVE, blink); + blink_mask ^= mask; + if (last_blink_mask != blink_mask) { + MD.set_trigleds(blink_mask, TRIGLED_EXCLUSIVENDYNAMIC, blink); + } + + last_blink_mask = blink_mask; + last_mask = mask; } void PerfPage::cleanup() { PerfPageParent::cleanup(); } @@ -64,13 +73,12 @@ void PerfPage::config_encoders() { encoders[0]->cur = p->dest; encoders[1]->cur = p->param; - - encoders[2]->cur = p->scenes[e->active_scene_a]; + if (learn) { + uint8_t scene = learn - 1; + encoders[2]->cur = p->scenes[scene]; + } ((PerfEncoder *)encoders[2])->max = 127; - encoders[3]->cur = p->scenes[e->active_scene_b]; - ((PerfEncoder *)encoders[3])->max = 127; - config_encoder_range(0); } @@ -103,8 +111,10 @@ void PerfPage::update_params() { PerfParam *p = &perf_encoders[perf_id]->perf_data.params[c]; p->dest = encoders[0]->cur; p->param = encoders[1]->cur; - p->scenes[e->active_scene_a] = encoders[2]->cur; - p->scenes[e->active_scene_b] = encoders[3]->cur; + if (learn) { + uint8_t scene = learn - 1; + p->scenes[scene] = encoders[2]->cur; + } } else { config_encoder_range(1); @@ -119,7 +129,7 @@ void PerfPage::update_params() { } } -void PerfPage::loop() { update_params(); } +void PerfPage::loop() { update_params(); set_led_mask(); } void PerfPage::display() { oled_display.clearDisplay(); @@ -144,16 +154,21 @@ void PerfPage::display() { PerfEncoder *e = perf_encoders[perf_id]; - char *str1 = "A"; - char *str2 = "A"; + char *str1 = " A"; + + uint8_t scene = learn - 1; + str1[1] = 'A' + scene; - str1[0] = 'A' + e->active_scene_a; - str2[1] = 'A' + e->active_scene_b; + mcl_gui.draw_knob(2, encoders[2], str1); - mcl_gui.draw_knob(2, encoders[2], str1, learn == LEARN_MIN); - mcl_gui.draw_knob(3, encoders[3], str2, learn == LEARN_MAX); info1 = "PARAM 1"; mcl_gui.put_value_at(page_mode + 1, info1 + 6); + + oled_display.fillRect(0,0,10,12, WHITE); + oled_display.setFont(&Elektrothic); + oled_display.setCursor(2, 10); + oled_display.setTextColor(BLACK, WHITE); + oled_display.print((char) (0x3C + scene)); } if (page_mode == PERF_DESTINATION) { char *str = "A "; @@ -165,10 +180,11 @@ void PerfPage::display() { info1 = "CONTROL"; } + oled_display.setTextColor(WHITE, BLACK); + oled_display.setFont(oldfont); mcl_gui.draw_panel_labels(info1, info2); oled_display.display(); - oled_display.setFont(oldfont); } void PerfPage::learn_param(uint8_t dest, uint8_t param, uint8_t value) { @@ -249,28 +265,13 @@ bool PerfPage::handleEvent(gui_event_t *event) { if (event->mask == EVENT_BUTTON_PRESSED) { if (perf_id != id) { perf_id = id; - config_encoders(); } uint8_t b = track - (perf_id)*4; learn = b + 1; send_locks(learn); + config_encoders(); - PerfEncoder *e = perf_encoders[perf_id]; - - //Change scene. - if (trig_interface.is_key_down(MDX_KEY_YES)) { - - if (track > 1) { - e->active_scene_b = track; - } - else { - e->active_scene_a = track; - } - set_led_mask(); - } - - old_mode = page_mode; if (page_mode == PERF_DESTINATION) { uint8_t id = perf_encoders[perf_id]->perf_data.find_empty(); if (id != 255) { @@ -284,19 +285,16 @@ bool PerfPage::handleEvent(gui_event_t *event) { if (note_interface.notes_all_off()) { learn = LEARN_OFF; MD.deactivate_encoder_interface(); - page_mode = old_mode; + page_mode = PERF_DESTINATION; config_encoders(); } } } if (EVENT_CMD(event)) { - if (trig_interface.is_key_down(MDX_KEY_PATSONG)) { - return seq_menu_page.handleEvent(event); - } uint8_t key = event->source - 64; switch (key) { - case MDX_KEY_CLEAR: + case MDX_KEY_CLEAR: { char *str = "CLEAR SCENE"; oled_display.textbox(str, ""); MD.popup_text(str); @@ -304,8 +302,20 @@ bool PerfPage::handleEvent(gui_event_t *event) { if (note_interface.is_note_on(n)) { perf_encoders[perf_id]->perf_data.clear_scene(n); } } config_encoders(); + break; + } + case MDX_KEY_YES: { + PerfEncoder *e = perf_encoders[perf_id]; + setLed2(); + for (uint8_t n = 0; n < 4; n++) { + if (note_interface.is_note_on(n)) { + if (n > 1) { e->active_scene_b = n; } + else { e->active_scene_a = n; } + } + } break; } + } return true; } if (EVENT_PRESSED(event, Buttons.BUTTON4)) { diff --git a/avr/cores/megacommand/MCL/PerfPage.h b/avr/cores/megacommand/MCL/PerfPage.h index 896fabbcd..fb92232fa 100644 --- a/avr/cores/megacommand/MCL/PerfPage.h +++ b/avr/cores/megacommand/MCL/PerfPage.h @@ -26,6 +26,9 @@ class PerfPage : public LightPage, PerfPageParent { uint8_t page_mode; uint8_t perf_id; + uint16_t last_mask = 0; + uint16_t last_blink_mask = 0; + PerfEncoder *perf_encoders[4]; bool handleEvent(gui_event_t *event); diff --git a/avr/cores/megacommand/resources/ResMan.h b/avr/cores/megacommand/resources/ResMan.h index 8642a5d2d..17e9511de 100644 --- a/avr/cores/megacommand/resources/ResMan.h +++ b/avr/cores/megacommand/resources/ResMan.h @@ -1,10 +1,4 @@ -__T_font_default *font_default; -void use_font_default() { font_default = (__T_font_default*) __use_resource(__R_font_default); } -__T_font_elektrothic *font_elektrothic; -void use_font_elektrothic() { font_elektrothic = (__T_font_elektrothic*) __use_resource(__R_font_elektrothic); } -__T_font_tomthumb *font_tomthumb; -void use_font_tomthumb() { font_tomthumb = (__T_font_tomthumb*) __use_resource(__R_font_tomthumb); } __T_icons_boot *icons_boot; void use_icons_boot() { icons_boot = (__T_icons_boot*) __use_resource(__R_icons_boot); } __T_icons_device *icons_device; From ed39d1960a5ad77ecd026913c3d7b23975c62b1d Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 30 Jun 2023 15:35:43 +1000 Subject: [PATCH 136/413] trig + YES to select scene. upon scene load send params --- avr/cores/megacommand/MCL/PerfEncoder.cpp | 16 +++++++++++----- avr/cores/megacommand/MCL/PerfEncoder.h | 2 +- avr/cores/megacommand/MCL/PerfPage.cpp | 16 +++++++++------- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/avr/cores/megacommand/MCL/PerfEncoder.cpp b/avr/cores/megacommand/MCL/PerfEncoder.cpp index c53c69cc3..ea704ab85 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.cpp +++ b/avr/cores/megacommand/MCL/PerfEncoder.cpp @@ -4,17 +4,23 @@ #define DIV_1_127 (1.00f / 127.0f) -void PerfEncoder::send_params() { +void PerfEncoder::send_params(uint8_t cur_, uint8_t scene) { for (uint8_t n = 0; n < NUM_PERF_PARAMS; n++) { if (perf_data.params[n].dest == 0) { continue; } - + uint8_t val = 0; uint8_t dest = perf_data.params[n].dest - 1; uint8_t param = perf_data.params[n].param; uint8_t min = perf_data.params[n].scenes[active_scene_a]; uint8_t max = perf_data.params[n].scenes[active_scene_b]; int8_t range = max - min; - int16_t q = cur * range; - uint8_t val = ((int16_t) q / (int16_t) 128) + min; + int16_t q = cur_ * range; + if (scene == 255) { + val = ((int16_t) q / (int16_t) 128) + min; + } + else { + val = perf_data.params[n].scenes[scene]; + } + if (dest >= NUM_MD_TRACKS + 4) { uint8_t channel = dest - NUM_MD_TRACKS; MidiUart2.sendCC(channel, param, val); @@ -33,7 +39,7 @@ int PerfEncoder::update(encoder_t *enc) { MCLEncoder::update(enc); //Update all params if (hasChanged()) { - send_params(); + send_params(cur); } return cur; } diff --git a/avr/cores/megacommand/MCL/PerfEncoder.h b/avr/cores/megacommand/MCL/PerfEncoder.h index 3d44def1d..1dc81fcca 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.h +++ b/avr/cores/megacommand/MCL/PerfEncoder.h @@ -16,7 +16,7 @@ class PerfEncoder : public MCLEncoder { PerfData perf_data; uint8_t active_scene_a = 0; uint8_t active_scene_b = 1; - void send_params(); + void send_params(uint8_t cur_, uint8_t scene = 255); /** Create a new range-limited encoder with max and min value, short name, initial value, and handling function. The initRangeEncoder diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 4683177be..613c42f52 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -19,6 +19,7 @@ void PerfPage::init() { DEBUG_PRINT_FN(); PerfPageParent::init(); trig_interface.on(); + last_mask = last_blink_mask = 0; } void PerfPage::set_led_mask() { @@ -35,7 +36,7 @@ void PerfPage::set_led_mask() { uint16_t blink_mask = 0; blink_mask |= e->perf_data.active_scenes; - blink_mask ^= mask; + blink_mask &= ~mask; if (last_blink_mask != blink_mask) { MD.set_trigleds(blink_mask, TRIGLED_EXCLUSIVENDYNAMIC, blink); } @@ -44,7 +45,7 @@ void PerfPage::set_led_mask() { last_mask = mask; } -void PerfPage::cleanup() { PerfPageParent::cleanup(); } +void PerfPage::cleanup() { PerfPageParent::cleanup(); trig_interface.off(); } void PerfPage::config_encoder_range(uint8_t i) { ((PerfEncoder *)encoders[i])->max = NUM_MD_TRACKS + 4 + 16; @@ -199,7 +200,7 @@ void PerfPage::learn_param(uint8_t dest, uint8_t param, uint8_t value) { int8_t range = max - min; uint8_t val = ((float)cur / (float)range) * 127.0f; perf_encoders[perf_id]->cur = val; - perf_encoders[perf_id]->send_params(); + perf_encoders[perf_id]->send_params(val); if (mcl.currentPage() == PERF_PAGE_0) { update_params(); } @@ -306,13 +307,14 @@ bool PerfPage::handleEvent(gui_event_t *event) { } case MDX_KEY_YES: { PerfEncoder *e = perf_encoders[perf_id]; - setLed2(); - for (uint8_t n = 0; n < 4; n++) { + uint8_t n; + for (n = 0; n < 4; n++) { if (note_interface.is_note_on(n)) { - if (n > 1) { e->active_scene_b = n; } - else { e->active_scene_a = n; } + if (n > 1) { e->active_scene_b = n; break; } + else { e->active_scene_a = n; break; } } } + e->send_params(0, n); break; } } From 147fbed773abe3ff9d8d315e26a31883496ef1c4 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 30 Jun 2023 17:11:36 +1000 Subject: [PATCH 137/413] performance menu --- avr/cores/megacommand/MCL/MCLMenus.cpp | 7 + avr/cores/megacommand/MCL/MCLMenus.h | 3 + avr/cores/megacommand/MCL/PerfPage.cpp | 60 +- avr/cores/megacommand/MCL/PerfPage.h | 2 + avr/cores/megacommand/ResourceManager.cpp | 1 + avr/cores/megacommand/resources/R.h | 20 +- .../megacommand/resources/R_menu_layouts.cpp | 763 +++++++++--------- .../megacommand/resources/R_menu_options.cpp | 22 +- resource/menu_layouts.cpp | 13 +- resource/menu_options.cpp | 4 +- 10 files changed, 487 insertions(+), 408 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCLMenus.cpp b/avr/cores/megacommand/MCL/MCLMenus.cpp index 99b3f3c49..dc714a3d5 100644 --- a/avr/cores/megacommand/MCL/MCLMenus.cpp +++ b/avr/cores/megacommand/MCL/MCLMenus.cpp @@ -95,6 +95,10 @@ const uint8_t *const menu_target_param[] PROGMEM = { &mcl_cfg.midi_ctrl_port, // 57 &mcl_cfg.md_trig_channel, + // 58 + &perf_page.page_mode, + // 59 + &perf_page.perf_id }; const menu_function_t menu_target_functions[] PROGMEM = { @@ -182,6 +186,7 @@ MenuPage file_menu_page(&config_param1, &file_menu_encoder); MCLEncoder seq_menu_value_encoder(0, 16, ENCODER_RES_PAT); MCLEncoder seq_menu_entry_encoder(0, 9, ENCODER_RES_PAT); MenuPage seq_menu_page(&seq_menu_value_encoder, &seq_menu_entry_encoder); +MenuPage perf_menu_page(&seq_menu_value_encoder, &seq_menu_entry_encoder); MCLEncoder step_menu_value_encoder(0, 16, ENCODER_RES_PAT); MCLEncoder step_menu_entry_encoder(0, 9, ENCODER_RES_PAT); @@ -194,3 +199,5 @@ MenuPage grid_slot_page(&grid_slot_param1, &grid_slot_param2); MCLEncoder wavdesign_menu_value_encoder(0, 16, ENCODER_RES_PAT); MCLEncoder wavdesign_menu_entry_encoder(0, 4, ENCODER_RES_PAT); MenuPage wavdesign_menu_page(&wavdesign_menu_value_encoder, &wavdesign_menu_entry_encoder); + + diff --git a/avr/cores/megacommand/MCL/MCLMenus.h b/avr/cores/megacommand/MCL/MCLMenus.h index 059ff25ca..285e2f752 100644 --- a/avr/cores/megacommand/MCL/MCLMenus.h +++ b/avr/cores/megacommand/MCL/MCLMenus.h @@ -112,6 +112,9 @@ extern MCLEncoder wavdesign_menu_entry_encoder; constexpr size_t wavdesign_menu_page_N = 3; extern MenuPage wavdesign_menu_page; +constexpr size_t perf_menu_page_N = 2; +extern MenuPage perf_menu_page; + extern uint8_t opt_import_src; extern uint8_t opt_import_dest; extern uint8_t opt_import_count; diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 613c42f52..5323eecda 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -20,6 +20,7 @@ void PerfPage::init() { PerfPageParent::init(); trig_interface.on(); last_mask = last_blink_mask = 0; + show_menu = false; } void PerfPage::set_led_mask() { @@ -130,10 +131,25 @@ void PerfPage::update_params() { } } -void PerfPage::loop() { update_params(); set_led_mask(); } +void PerfPage::loop() { + if (show_menu) { + perf_menu_page.loop(); + return; + } + update_params(); + set_led_mask(); +} void PerfPage::display() { + if (show_menu) { + constexpr uint8_t width = 52; + oled_display.fillRect(128 - width - 2, 0, width + 2, 32, BLACK); + perf_menu_page.draw_menu(128 - width, 8, width); + return; + } + oled_display.clearDisplay(); + auto oldfont = oled_display.getFont(); mcl_gui.draw_panel_number(perf_id); @@ -146,8 +162,10 @@ void PerfPage::display() { // mcl_gui.draw_vertical_dashline(x, 0, knob_y); mcl_gui.draw_knob_frame(); - const char *info2 = "PERFORM"; - const char *info1; + const char *info1 = "PAR> "; + const char *info2; + + uint8_t scene = learn - 1; if (page_mode < PERF_DESTINATION) { draw_dest(0, encoders[0]->cur); @@ -157,13 +175,11 @@ void PerfPage::display() { char *str1 = " A"; - uint8_t scene = learn - 1; str1[1] = 'A' + scene; mcl_gui.draw_knob(2, encoders[2], str1); - info1 = "PARAM 1"; - mcl_gui.put_value_at(page_mode + 1, info1 + 6); + mcl_gui.put_value_at(page_mode + 1, info1 + 4); oled_display.fillRect(0,0,10,12, WHITE); oled_display.setFont(&Elektrothic); @@ -172,19 +188,24 @@ void PerfPage::display() { oled_display.print((char) (0x3C + scene)); } if (page_mode == PERF_DESTINATION) { - char *str = "A "; - str[1] = '1' + perf_id; - mcl_gui.draw_knob(0, encoders[0], str); + mcl_gui.draw_knob(0, encoders[0], "VAL"); draw_dest(1, encoders[1]->cur); draw_param(2, encoders[1]->cur, encoders[2]->cur); mcl_gui.draw_knob(3, encoders[3], "MIN"); - info1 = "CONTROL"; + info2 = "CONTROL"; } oled_display.setTextColor(WHITE, BLACK); oled_display.setFont(oldfont); mcl_gui.draw_panel_labels(info1, info2); + PerfEncoder *e = perf_encoders[perf_id]; + oled_display.setCursor(80, MCLGUI::pane_info2_y + 4); + char *str3 = "SCENE: A -> B"; + str3[7] = 'A' + e->active_scene_a; + str3[12] = 'A' + e->active_scene_b; + oled_display.print(str3); + oled_display.display(); } @@ -264,10 +285,7 @@ bool PerfPage::handleEvent(gui_event_t *event) { uint8_t id = track / 4; if (event->mask == EVENT_BUTTON_PRESSED) { - if (perf_id != id) { - perf_id = id; - } - uint8_t b = track - (perf_id)*4; + uint8_t b = track - (track / 4)*4; learn = b + 1; send_locks(learn); @@ -276,7 +294,7 @@ bool PerfPage::handleEvent(gui_event_t *event) { if (page_mode == PERF_DESTINATION) { uint8_t id = perf_encoders[perf_id]->perf_data.find_empty(); if (id != 255) { - page_mode = perf_id; + page_mode = id; config_encoders(); } } @@ -328,11 +346,15 @@ bool PerfPage::handleEvent(gui_event_t *event) { config_encoders(); } - if (EVENT_PRESSED(event, Buttons.BUTTON1)) { - learn = true; + if (EVENT_PRESSED(event, Buttons.BUTTON3)) { + show_menu = true; + encoders[0] = &seq_menu_value_encoder; + encoders[1] = &seq_menu_entry_encoder; + perf_menu_page.init(); } - if (EVENT_RELEASED(event, Buttons.BUTTON1)) { - learn = false; + if (EVENT_RELEASED(event, Buttons.BUTTON3)) { + show_menu = false; + config_encoders(); } return false; diff --git a/avr/cores/megacommand/MCL/PerfPage.h b/avr/cores/megacommand/MCL/PerfPage.h index fb92232fa..ae86e123a 100644 --- a/avr/cores/megacommand/MCL/PerfPage.h +++ b/avr/cores/megacommand/MCL/PerfPage.h @@ -29,6 +29,8 @@ class PerfPage : public LightPage, PerfPageParent { uint16_t last_mask = 0; uint16_t last_blink_mask = 0; + bool show_menu = false; + PerfEncoder *perf_encoders[4]; bool handleEvent(gui_event_t *event); diff --git a/avr/cores/megacommand/ResourceManager.cpp b/avr/cores/megacommand/ResourceManager.cpp index 2680c7951..e6e2085f5 100644 --- a/avr/cores/megacommand/ResourceManager.cpp +++ b/avr/cores/megacommand/ResourceManager.cpp @@ -121,6 +121,7 @@ void ResourceManager::restore_menu_layout_deps() { midiclock_menu_page.set_layout(R.menu_layouts->midiclock_menu_layout); midiroute_menu_page.set_layout(R.menu_layouts->midiroute_menu_layout); midimachinedrum_menu_page.set_layout(R.menu_layouts->midimachinedrum_menu_layout); + perf_menu_page.set_layout(R.menu_layouts->perf_menu_layout); } ResourceManager R; diff --git a/avr/cores/megacommand/resources/R.h b/avr/cores/megacommand/resources/R.h index 4a5802661..2185532c0 100644 --- a/avr/cores/megacommand/resources/R.h +++ b/avr/cores/megacommand/resources/R.h @@ -250,10 +250,16 @@ struct __T_machine_param_names { extern const unsigned char __R_menu_layouts[] PROGMEM; struct __T_menu_layouts { union { - menu_t<3> wavdesign_menu_layout[0]; + menu_t perf_menu_layout[0]; + char zz__perf_menu_layout[54]; + }; + static constexpr size_t countof_perf_menu_layout = 54 / sizeof(menu_t); + static constexpr size_t sizeofof_perf_menu_layout = 54; + union { + menu_t wavdesign_menu_layout[0]; char zz__wavdesign_menu_layout[75]; }; - static constexpr size_t countof_wavdesign_menu_layout = 75 / sizeof(menu_t<3>); + static constexpr size_t countof_wavdesign_menu_layout = 75 / sizeof(menu_t); static constexpr size_t sizeofof_wavdesign_menu_layout = 75; union { menu_t slot_menu_layout[0]; @@ -363,18 +369,18 @@ struct __T_menu_layouts { }; static constexpr size_t countof_boot_menu_layout = 96 / sizeof(menu_t); static constexpr size_t sizeofof_boot_menu_layout = 96; - static constexpr size_t __total_size = 2160; + static constexpr size_t __total_size = 2214; }; extern const unsigned char __R_menu_options[] PROGMEM; struct __T_menu_options { union { menu_option_t MENU_OPTIONS[0]; - char zz__MENU_OPTIONS[1044]; + char zz__MENU_OPTIONS[1053]; }; - static constexpr size_t countof_MENU_OPTIONS = 1044 / sizeof(menu_option_t); - static constexpr size_t sizeofof_MENU_OPTIONS = 1044; - static constexpr size_t __total_size = 1044; + static constexpr size_t countof_MENU_OPTIONS = 1053 / sizeof(menu_option_t); + static constexpr size_t sizeofof_MENU_OPTIONS = 1053; + static constexpr size_t __total_size = 1053; }; extern const unsigned char __R_page_entries[] PROGMEM; diff --git a/avr/cores/megacommand/resources/R_menu_layouts.cpp b/avr/cores/megacommand/resources/R_menu_layouts.cpp index 44fe0e98f..7d6fb84e1 100644 --- a/avr/cores/megacommand/resources/R_menu_layouts.cpp +++ b/avr/cores/megacommand/resources/R_menu_layouts.cpp @@ -5,1055 +5,1074 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 0, 0, 35, + 67, + 255, + 84, + 82, + 76, + 32, + 83, + 69, + 76, + 58, + 103, + 14, + 4, + 237, + 0, + 59, + 255, + 5, + 251, 69, - 246, 68, 73, 84, 58, - 14, - 95, + 35, + 47, + 17, + 1, + 182, + 58, + 20, + 116, + 203, + 15, + 101, + 32, + 60, 4, 4, 40, - 253, - 255, - 0, + 191, 80, 87, 65, 86, - 128, - 19, - 251, - 0, + 58, + 96, + 35, + 61, 6, 6, 41, + 182, 20, - 127, 74, - 84, - 82, + 94, + 254, 65, 78, 83, - 236, 70, 69, 82, + 203, 23, - 191, + 255, 255, 22, 0, 23, - 251, 0, 83, 108, 111, - 116, - 14, - 63, + 96, + 80, + 254, 71, 82, 73, 68, - 217, 58, 32, + 201, 29, - 61, + 237, 2, 2, 31, - 191, 53, + 251, 52, 77, 79, 68, 69, - 101, 75, - 251, + 47, 1, 4, + 219, 3, 32, 20, - 125, 20, + 237, 76, 69, 78, - 173, 40, + 107, 0, - 97, 20, - 251, + 15, 65, 0, + 185, 39, - 255, - 6, - 89, + 170, + 144, 20, - 12, + 201, 129, - 159, + 246, 79, 79, 80, - 96, 83, - 61, + 3, 64, + 221, 0, 33, - 220, 20, 74, + 200, 85, 77, - 129, - 251, + 31, 128, 128, 34, + 182, 255, 4, - 109, 67, + 222, 63, - 236, 65, 82, 58, + 192, 125, - 7, + 118, 36, 255, - 109, 44, + 219, 67, - 183, 61, 89, + 115, 84, - 50, 20, - 230, + 46, 37, - 251, + 111, 80, 65, 83, 84, + 176, 69, 41, - 3, - 186, + 59, 38, 20, + 173, 82, - 222, 125, + 225, 65, 77, 69, - 214, - 244, - 221, + 25, 3, + 251, + 255, 20, - 237, 0, 21, 0, 41, - 176, + 97, 80, - 14, - 89, + 94, + 5, + 148, 95, - 79, + 249, 30, 255, 15, - 158, 30, + 238, 32, - 235, 77, + 178, 80, 53, - 47, + 246, 16, 0, - 98, 95, - 194, + 44, 21, - 126, + 39, 255, 17, + 237, 0, 77, 85, - 214, 19, + 100, 41, - 67, + 61, 18, - 219, 0, 19, + 187, 95, 69, - 176, 81, 14, - 67, + 4, + 54, 94, - 118, 67, 75, - 32, - 15, - 236, - 76, - 58, - 254, - 91, + 18, + 191, + 109, + 1, 49, + 240, 14, - 225, 255, 3, 0, + 189, 59, - 123, 86, 73, 67, + 147, 171, - 39, 1, + 238, 3, - 220, 2, 50, 233, - 18, + 9, 178, - 159, + 79, 15, 255, 4, + 178, 48, - 100, 20, - 61, + 30, 9, 1, 16, - 190, + 223, 41, 54, 67, 67, 58, - 192, + 96, 209, - 251, + 125, 133, 5, 17, + 188, 20, - 120, 55, 83, 76, - 86, + 43, 166, 254, - 19, + 9, + 182, 18, - 109, 20, 25, - 191, + 223, 218, 80, 69, 71, 71, + 240, 73, - 225, 65, 84, 79, + 134, 223, - 12, - 55, + 27, 52, 75, 69, + 176, 89, - 96, 63, - 125, + 62, 12, 12, 19, - 187, + 220, 41, 104, 86, - 161, - 16, - 150, + 98, + 97, + 18, 124, - 20, + 194, 205, - 48, + 134, 145, - 92, + 11, 7, 78, + 132, 68, - 32, 229, - 61, + 7, 15, 15, + 183, 21, - 187, 20, 60, 83, + 109, 82, - 108, 69, + 128, 21, + 254, 7, 7, - 7, - 240, 22, 255, 5, 41, - 222, + 27, 229, 71, 84, + 201, 72, 58, - 75, - 237, + 125, 23, 255, 6, + 177, 62, - 141, 72, + 182, 90, - 178, 78, 87, - 93, + 75, 251, + 188, 24, - 225, 255, 7, 0, + 36, 187, - 33, - 252, + 63, 3, 3, 25, 255, 8, + 132, 27, - 33, 133, - 110, + 45, + 220, 20, - 228, 26, 255, 9, - 3, - 194, + 128, + 120, 10, 30, + 66, 229, - 22, - 239, + 221, 20, 27, + 254, 255, 11, 27, - 240, 83, 72, 73, 70, - 128, + 16, 38, - 254, + 31, 5, 5, 28, 255, + 194, 12, 35, - 21, 250, - 187, + 183, 211, 82, 83, + 107, 43, - 89, 41, - 63, + 39, 29, 255, + 255, 13, 27, 80, - 251, 79, 76, 89, 80, 72, + 109, 214, - 108, 89, + 147, 44, - 155, 11, + 107, 2, - 91, 41, + 125, 67, - 237, 32, 81, 85, + 173, 171, - 104, 66, - 65, + 8, 58, - 155, + 51, 42, + 118, 83, 79, - 180, 85, 252, - 32, + 132, 102, - 99, + 12, + 107, 184, - 91, 2, + 125, 14, - 237, 0, 70, 73, + 163, 149, - 24, 57, - 45, + 5, + 182, 48, - 180, 67, 220, - 97, + 140, 90, - 45, + 37, + 173, 2, - 110, 238, + 194, 87, 32, - 23, 178, + 236, 82, 46, - 96, 20, - 97, + 12, + 51, 238, - 154, 51, - 214, + 90, 180, + 200, 41, - 66, - 50, + 70, 153, - 183, + 86, + 235, 20, - 93, 79, 178, + 169, 87, - 74, 111, - 214, + 90, 44, + 194, 41, - 23, + 255, 67, - 249, 86, 32, 65, 76, 76, - 9, - 107, + 33, + 45, 216, + 107, 157, - 89, 20, - 75, + 41, + 116, 22, - 161, 89, + 53, 30, - 175, 77, + 237, 9, - 104, 133, - 92, + 11, 168, 76, + 132, 65, - 33, 233, - 186, + 55, 212, + 91, 13, - 220, 32, 23, + 141, 1, - 107, 176, + 100, 211, - 39, + 244, 83, 82, - 166, 67, + 201, 109, - 72, 110, - 12, + 1, + 142, 43, - 115, 132, + 107, 170, - 90, 63, - 144, + 82, 131, - 153, + 19, 44, - 195, + 56, + 96, 10, - 4, + 151, 94, - 184, 1, - 219, + 27, 27, 45, + 123, 149, - 218, 19, - 25, + 67, 29, - 132, + 48, 191, - 218, + 155, 25, 4, - 192, + 88, 95, - 105, + 13, 73, + 40, 205, - 70, + 219, 117, - 216, 84, 32, - 28, + 3, + 134, 33, - 51, 31, - 18, 109, + 18, 77, + 188, 181, - 225, 73, 90, 69, + 33, 106, - 14, + 219, 8, - 216, 74, 16, - 120, + 15, 148, 32, - 224, + 28, 107, - 176, + 22, 91, 71, - 146, + 18, 148, - 199, + 88, 74, + 246, 32, 77, - 180, 73, 198, - 63, + 135, 106, + 241, 72, 82, 79, - 143, 32, + 236, 77, - 103, 53, + 253, 18, - 237, 2, 9, 255, + 175, 4, - 123, 53, + 97, 20, - 9, - 150, + 50, 46, + 210, 88, - 149, 110, - 172, + 181, 67, + 132, 20, - 38, + 221, 57, - 235, 41, 24, + 107, 172, - 90, 193, - 16, + 66, 83, - 95, + 11, 81, + 254, 32, - 241, 49, 32, 70, 87, - 169, + 53, 194, + 39, 101, - 59, 7, + 109, 32, - 108, 10, + 140, 20, - 100, 50, - 6, + 128, + 203, 51, - 95, 92, + 236, 85, 83, 66, - 96, 17, - 164, + 20, + 131, 143, - 27, 52, + 110, 20, - 113, 96, 67, - 171, + 53, 41, + 120, 187, - 194, + 75, 85, - 93, + 183, 11, - 184, 20, 86, 24, - 97, + 12, 118, - 171, + 53, 11, + 97, 79, - 14, + 211, 79, - 152, 239, - 60, + 7, 178, + 140, 58, - 103, 117, + 237, 5, - 108, 32, + 129, 7, - 8, 99, - 176, + 22, 20, - 57, + 7, 53, - 153, + 51, 41, - 134, + 48, + 204, 199, - 97, 116, - 194, + 56, 6, + 91, 65, - 216, 100, 41, - 176, + 22, 20, - 59, + 7, 54, - 41, 109, + 41, 100, - 95, 182, + 95, 80, 192, + 218, 71, - 208, 25, - 206, + 25, 215, + 205, 9, - 104, 223, - 18, + 2, 124, - 221, + 91, 128, + 173, 49, - 109, 32, + 190, 90, - 246, 20, 73, + 197, 242, - 44, + 131, 245, - 24, 47, - 103, + 12, 10, + 247, 20, - 185, 246, - 135, + 48, 21, + 251, 17, - 220, 2, 48, 20, - 224, + 156, 74, - 213, + 26, 148, 83, - 159, + 179, 154, + 240, 85, 82, 66, - 133, 79, + 172, 11, - 101, 224, - 237, + 189, 2, 255, + 172, 79, - 103, 20, + 228, 50, - 37, - 201, + 185, 3, - 33, + 36, + 53, 16, - 172, 58, + 131, 20, - 25, 55, - 161, + 52, 68, + 40, 106, - 71, + 230, 173, - 53, 42, - 147, + 178, 137, + 109, 4, - 110, 191, + 131, 84, - 67, - 221, - 192, - 76, - 32, - 235, + 173, + 23, 98, + 172, 238, - 54, + 219, 41, - 216, 56, + 98, 191, - 132, + 19, 199, - 220, + 115, 0, - 196, 126, - 33, + 16, + 133, 235, - 120, + 225, 34, 0, - 77, 62, - 132, + 54, 0, - 225, + 19, 36, + 132, 0, 179, - 22, + 91, 212, - 216, 71, + 96, 20, - 14, + 56, 37, 0, - 16, + 67, 8, - 216, + 96, 20, - 12, + 49, 35, - 100, + 146, 40, - 176, + 192, 20, - 27, + 111, 38, 4, - 220, + 115, 39, - 220, 138, + 112, 65, 71, - 53, + 214, 247, 76, - 181, 71, + 214, 75, - 150, 221, - 234, + 91, 170, + 169, 1, - 71, 44, + 30, 65, 85, - 177, 88, + 198, 32, - 179, 83, + 207, 42, - 236, 97, 103, + 178, 101, 35, - 184, + 225, 31, - 118, 204, + 217, 167, - 88, - 91, + 97, 171, + 109, 65, 100, - 93, + 116, 124, 74, - 10, + 40, 195, - 48, + 193, 210, - 105, + 164, 25, 236, - 22, + 88, 19, - 18, - 154, + 74, + 107, 2, 2, - 197, 234, - 133, + 22, 203, - 221, + 23, 26, + 116, 161, 65, - 26, + 107, 147, - 208, 131, - 42, + 64, + 169, 54, - 86, 52, + 88, 186, - 29, + 118, 27, - 128, 126, - 178, + 2, + 201, 41, - 105, + 164, 29, 192, - 13, - 129, + 54, 62, - 195, + 7, 30, + 14, 54, - 176, + 193, 102, - 88, + 97, 137, - 65, - 186, + 6, + 232, 4, 66, - 53, + 214, 170, - 131, 15, + 14, 79, - 133, 83, + 22, 190, - 134, 80, + 24, 57, - 26, + 106, 56, - 146, + 73, 173, - 91, + 111, 129, 68, - 198, 70, 85, + 24, 75, - 41, + 164, 194, - 1, - 104, + 5, + 163, 171, - 245, 246, - 214, + 215, 59, + 88, 75, 20, - 3, + 12, 28, - 22, + 91, 78, - 214, 88, + 90, 147, - 164, + 146, 236, - 134, + 27, 29, - 224, 4, + 128, 0, 0, 0, 0, - 0, - 79, + 1, + 63, 255, }; diff --git a/avr/cores/megacommand/resources/R_menu_options.cpp b/avr/cores/megacommand/resources/R_menu_options.cpp index 3878776e8..26a7bb6a7 100644 --- a/avr/cores/megacommand/resources/R_menu_options.cpp +++ b/avr/cores/megacommand/resources/R_menu_options.cpp @@ -331,10 +331,10 @@ const unsigned char __R_menu_options[] PROGMEM = { 134, 198, 77, - 132, - 123, - 30, - 79, + 198, + 82, + 117, + 14, 83, 67, 198, @@ -449,15 +449,21 @@ const unsigned char __R_menu_options[] PROGMEM = { 16, 8, 148, - 54, + 59, 71, - 17, - 8, + 35, + 9, + 6, + 67, + 20, + 104, + 34, + 95, 0, 0, 0, 0, 0, - 39, + 9, 255, }; diff --git a/resource/menu_layouts.cpp b/resource/menu_layouts.cpp index c1b932c5d..2618f6422 100644 --- a/resource/menu_layouts.cpp +++ b/resource/menu_layouts.cpp @@ -252,7 +252,7 @@ menu_t slot_menu_layout = { 21, 0, }; -menu_t<3> wavdesign_menu_layout = { +menu_t wavdesign_menu_layout = { "", { // m r n d p f o @@ -263,3 +263,14 @@ menu_t<3> wavdesign_menu_layout = { 23, 0 }; +menu_t perf_menu_layout = { + "", + { + // m r n d p f o + + {"CTRL SEL:",0, 4, 0, 59, 255, 0, 0 }, + {"EDIT:", 0, 17, 1, 58, 255, 0, 116}, + }, + 0, 0 +}; + diff --git a/resource/menu_options.cpp b/resource/menu_options.cpp index 2b04c282b..aaee2d91c 100644 --- a/resource/menu_options.cpp +++ b/resource/menu_options.cpp @@ -63,6 +63,8 @@ menu_option_t MENU_OPTIONS[] = { // 100: MIDI CLK SEND {0, "OFF"}, {1, "2"}, {2, "USB"}, {3, "2 + USB"}, // 104: NOTES - {0, "A"}, {1, "A#"}, {2, "B"}, {3, "C"}, {4, "C#"}, {5, "D"}, {6, "D#"}, {7, "E"}, {8, "F"}, {9, "F#"}, {10, "G"}, {11, "G#"} + {0, "A"}, {1, "A#"}, {2, "B"}, {3, "C"}, {4, "C#"}, {5, "D"}, {6, "D#"}, {7, "E"}, {8, "F"}, {9, "F#"}, {10, "G"}, {11, "G#"}, + // 116 + {0, "CTRL"} }; From 0b1c8385d0ac24fbcbaa25394b6cdf0d19886db4 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 30 Jun 2023 17:48:08 +1000 Subject: [PATCH 138/413] check point --- avr/cores/megacommand/MCL/PerfPage.cpp | 51 ++++++++++++---------- avr/cores/megacommand/MCL/PerfPage.h | 5 ++- avr/cores/megacommand/MCL/PerfPageParent.h | 2 +- 3 files changed, 32 insertions(+), 26 deletions(-) diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 5323eecda..0caf33747 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -21,6 +21,7 @@ void PerfPage::init() { trig_interface.on(); last_mask = last_blink_mask = 0; show_menu = false; + last_page_mode = 255; } void PerfPage::set_led_mask() { @@ -62,14 +63,15 @@ void PerfPage::config_encoder_range(uint8_t i) { } } -void PerfPage::config_encoders() { +void PerfPage::config_encoders(uint8_t show_val) { encoders[1] = &fx_param2; encoders[2] = &fx_param3; encoders[3] = &fx_param4; - if (page_mode < PERF_DESTINATION) { + if (page_mode > PERF_DESTINATION) { + last_page_mode = page_mode; encoders[0] = &fx_param1; - uint8_t c = page_mode; + uint8_t c = page_mode - 1; PerfEncoder *e = perf_encoders[perf_id]; PerfParam *p = &perf_encoders[perf_id]->perf_data.params[c]; @@ -96,19 +98,22 @@ void PerfPage::config_encoders() { ((PerfEncoder *)encoders[3])->max = 127; } + if (!show_val) { for (uint8_t i = 0; i < GUI_NUM_ENCODERS; i++) { encoders[i]->old = encoders[i]->cur; - ((LightPage *)this)->encoders_used_clock[i] = slowclock; + ((LightPage *)this)->encoders_used_clock[i] = slowclock + SHOW_VALUE_TIMEOUT + 1; + } } } void PerfPage::update_params() { - if (page_mode < PERF_DESTINATION) { + + uint8_t c = page_mode - 1; + if (page_mode > PERF_DESTINATION) { config_encoder_range(0); if (encoders[0]->hasChanged() && encoders[0]->cur == 0) { encoders[1]->cur = 0; } - uint8_t c = page_mode; PerfEncoder *e = perf_encoders[perf_id]; PerfParam *p = &perf_encoders[perf_id]->perf_data.params[c]; p->dest = encoders[0]->cur; @@ -123,7 +128,6 @@ void PerfPage::update_params() { if (encoders[1]->hasChanged() && encoders[1]->cur == 0) { encoders[2]->cur = 0; } - uint8_t c = page_mode; PerfData *d = &perf_encoders[perf_id]->perf_data; d->dest = encoders[1]->cur; d->param = encoders[2]->cur; @@ -152,7 +156,7 @@ void PerfPage::display() { auto oldfont = oled_display.getFont(); - mcl_gui.draw_panel_number(perf_id); + mcl_gui.draw_panel_number(perf_id + 1); uint8_t x = mcl_gui.knob_x0 + 5; uint8_t y = 8; @@ -162,25 +166,23 @@ void PerfPage::display() { // mcl_gui.draw_vertical_dashline(x, 0, knob_y); mcl_gui.draw_knob_frame(); - const char *info1 = "PAR> "; + const char *info1 = ""; const char *info2; uint8_t scene = learn - 1; - if (page_mode < PERF_DESTINATION) { + if (page_mode > PERF_DESTINATION) { draw_dest(0, encoders[0]->cur); draw_param(1, encoders[0]->cur, encoders[1]->cur); PerfEncoder *e = perf_encoders[perf_id]; - char *str1 = " A"; - - str1[1] = 'A' + scene; + info1 = "PAR> "; + mcl_gui.put_value_at(page_mode, info1 + 4); + char *str1 = "VAL"; mcl_gui.draw_knob(2, encoders[2], str1); - mcl_gui.put_value_at(page_mode + 1, info1 + 4); - oled_display.fillRect(0,0,10,12, WHITE); oled_display.setFont(&Elektrothic); oled_display.setCursor(2, 10); @@ -231,8 +233,8 @@ void PerfPage::learn_param(uint8_t dest, uint8_t param, uint8_t value) { if (learn) { uint8_t n = d->add_param(dest, param, learn, value); - page_mode = n; - config_encoders(); + page_mode = n + 1; + config_encoders(true); } // MIDI LEARN current mode; @@ -272,6 +274,7 @@ void PerfPage::send_locks(uint8_t mode) { } bool PerfPage::handleEvent(gui_event_t *event) { + if (PerfPageParent::handleEvent(event)) { return true; } @@ -290,13 +293,11 @@ bool PerfPage::handleEvent(gui_event_t *event) { learn = b + 1; send_locks(learn); config_encoders(); - if (page_mode == PERF_DESTINATION) { - uint8_t id = perf_encoders[perf_id]->perf_data.find_empty(); - if (id != 255) { - page_mode = id; + uint8_t id = perf_encoders[perf_id]->perf_data.find_empty() + 1; + if (id == 255) { id = 16; } + page_mode = last_page_mode == 255 ? id : last_page_mode; config_encoders(); - } } } if (event->mask == EVENT_BUTTON_RELEASED) { @@ -312,6 +313,10 @@ bool PerfPage::handleEvent(gui_event_t *event) { if (EVENT_CMD(event)) { uint8_t key = event->source - 64; + if (trig_interface.is_key_down(MDX_KEY_PATSONG)) { + return perf_menu_page.handleEvent(event); + } + switch (key) { case MDX_KEY_CLEAR: { char *str = "CLEAR SCENE"; @@ -340,7 +345,7 @@ bool PerfPage::handleEvent(gui_event_t *event) { } if (EVENT_PRESSED(event, Buttons.BUTTON4)) { page_mode++; - if (page_mode > PERF_DESTINATION) { + if (page_mode > 16) { page_mode = 0; } config_encoders(); diff --git a/avr/cores/megacommand/MCL/PerfPage.h b/avr/cores/megacommand/MCL/PerfPage.h index ae86e123a..05d2fd9f4 100644 --- a/avr/cores/megacommand/MCL/PerfPage.h +++ b/avr/cores/megacommand/MCL/PerfPage.h @@ -10,7 +10,7 @@ #include "PerfEncoder.h" #define NUM_PERF_CONTROLS 4 -#define PERF_DESTINATION NUM_PERF_PARAMS +#define PERF_DESTINATION 0 class PerfPage : public LightPage, PerfPageParent { public: @@ -21,6 +21,7 @@ class PerfPage : public LightPage, PerfPageParent { uint8_t learn = 0; uint8_t old_mode = 0; + uint8_t last_page_mode; bool midi_state = false; uint8_t page_mode; @@ -45,7 +46,7 @@ class PerfPage : public LightPage, PerfPageParent { void cleanup(); void set_led_mask(); - virtual void config_encoders(); + void config_encoders(uint8_t show_val = false); void send_locks(uint8_t mode); diff --git a/avr/cores/megacommand/MCL/PerfPageParent.h b/avr/cores/megacommand/MCL/PerfPageParent.h index 5159317de..3b9338c8a 100644 --- a/avr/cores/megacommand/MCL/PerfPageParent.h +++ b/avr/cores/megacommand/MCL/PerfPageParent.h @@ -24,7 +24,7 @@ class PerfPageParent : public MidiCallback { virtual void init(); virtual void loop(); virtual void cleanup(); - virtual void config_encoders(); + virtual void config_encoders() {}; virtual void setup_callbacks() {}; virtual void remove_callbacks() {}; From caf89d324b0ba85fd8d2fcaaf9e57ba31cd760e2 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 30 Jun 2023 17:50:27 +1000 Subject: [PATCH 139/413] Corrected --- avr-gcc-version.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr-gcc-version.md b/avr-gcc-version.md index 7211806aa..42634f034 100644 --- a/avr-gcc-version.md +++ b/avr-gcc-version.md @@ -42,6 +42,6 @@ FEATURE_FLAGS = -ffunction-sections -fdata-sections -flto -fno-split-wide-types 218312 6030 42415 266757 41205 main.elf ``` -avr-gcc 8.5 appears to produce a slightly smaller binary than 7.3. There is also discussion that 8.2+ produces more optimized code for interrupts by +There is some discussion that 8.2+ produces more optimized code for interrupts by introducing pseduo-instructions. https://sourceware.org/bugzilla/show_bug.cgi?id=21683#c4 From 8a9b0a3486e1e8095c6bc25c82b957070ee3744e Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 30 Jun 2023 19:24:17 +1000 Subject: [PATCH 140/413] checkin, encoder buttons working --- avr/cores/megacommand/MCL/PerfData.h | 72 +++++++++++++++++++++-- avr/cores/megacommand/MCL/PerfEncoder.cpp | 8 ++- avr/cores/megacommand/MCL/PerfPage.cpp | 38 ++++++++++-- 3 files changed, 107 insertions(+), 11 deletions(-) diff --git a/avr/cores/megacommand/MCL/PerfData.h b/avr/cores/megacommand/MCL/PerfData.h index d3654d117..820d968d0 100644 --- a/avr/cores/megacommand/MCL/PerfData.h +++ b/avr/cores/megacommand/MCL/PerfData.h @@ -4,15 +4,59 @@ #define PERFDATATRACK_H__ #include "PerfData.h" #include "WProgram.h" +#include "MCLMemory.h" +#include "MD.h" #define NUM_PERF_PARAMS 16 #define NUM_SCENES 4 #define PERF_SETTINGS NUM_NUM_PERF_PARAMS + +static uint8_t get_param_offset(uint8_t dest, uint8_t param) { + if (dest <= NUM_MD_TRACKS) { + return MD.kit.params[dest - 1][param]; + } else { + switch (dest - NUM_MD_TRACKS - 1) { + case MD_FX_ECHO - MD_FX_ECHO: + return MD.kit.delay[param]; + break; + case MD_FX_DYN - MD_FX_ECHO: + return MD.kit.dynamics[param]; + break; + + case MD_FX_REV - MD_FX_ECHO: + return MD.kit.reverb[param]; + break; + case MD_FX_EQ - MD_FX_ECHO: + return MD.kit.eq[param]; + break; + } + } + return 255; +} + class PerfParam { public: uint8_t dest; uint8_t param; uint8_t scenes[NUM_SCENES]; + + uint8_t get_scene_value(uint8_t scene) { + uint8_t v = scenes[scene]; + if (v == 255) { + if (dest >= NUM_MD_TRACKS + 4) { + //Todo MIDI default ? + v = 0; + } + else { + v = get_param_offset(dest, param); + } + } + if (v == 255) { + return 0; + } + return v; + } + }; #define LEARN_MIN 1 @@ -29,6 +73,18 @@ class PerfData { PerfData() { init_params(); } + uint8_t find_match(uint8_t dest, uint8_t param, uint8_t scene) { + uint8_t match = 255; + uint8_t empty = 255; + uint8_t s = scene - 1; + for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { + if (params[a].dest == dest + 1 && params[a].param == param && params[a].scenes[s] != 255) { + return a; + } + } + return 255; + } + uint8_t find_empty() { uint8_t match = 255; uint8_t empty = 255; @@ -43,6 +99,16 @@ class PerfData { return 255; } + void clear_param_scene(uint8_t dest, uint8_t param, uint8_t scene) { + uint8_t s = scene - 1; + for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { + // Find match + if (params[a].dest == dest + 1 && params[a].param == param) { + params[a].scenes[s] = 255; + } + } + } + uint8_t add_param(uint8_t dest, uint8_t param, uint8_t scene, uint8_t value) { uint8_t match = 255; uint8_t empty = 255; @@ -80,18 +146,16 @@ class PerfData { void *data() const { return (void *)¶ms; } void init_params() { - memset(params,0,sizeof(params)); - /* for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { params[a].dest = 0; params[a].param = 0; + memset(params[a].scenes,255,sizeof(params[a].scenes)); } - */ } void clear_scene(uint8_t s) { active_scenes &= ~(1 << s); for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { - params[a].scenes[s] = 0; + params[a].scenes[s] = 255; } } }; diff --git a/avr/cores/megacommand/MCL/PerfEncoder.cpp b/avr/cores/megacommand/MCL/PerfEncoder.cpp index ea704ab85..ec88c6255 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.cpp +++ b/avr/cores/megacommand/MCL/PerfEncoder.cpp @@ -4,14 +4,15 @@ #define DIV_1_127 (1.00f / 127.0f) + void PerfEncoder::send_params(uint8_t cur_, uint8_t scene) { for (uint8_t n = 0; n < NUM_PERF_PARAMS; n++) { if (perf_data.params[n].dest == 0) { continue; } uint8_t val = 0; uint8_t dest = perf_data.params[n].dest - 1; uint8_t param = perf_data.params[n].param; - uint8_t min = perf_data.params[n].scenes[active_scene_a]; - uint8_t max = perf_data.params[n].scenes[active_scene_b]; + uint8_t min = perf_data.params[n].get_scene_value(active_scene_a); + uint8_t max = perf_data.params[n].get_scene_value(active_scene_b); int8_t range = max - min; int16_t q = cur_ * range; if (scene == 255) { @@ -20,7 +21,7 @@ void PerfEncoder::send_params(uint8_t cur_, uint8_t scene) { else { val = perf_data.params[n].scenes[scene]; } - + if (val < 128) { if (dest >= NUM_MD_TRACKS + 4) { uint8_t channel = dest - NUM_MD_TRACKS; MidiUart2.sendCC(channel, param, val); @@ -32,6 +33,7 @@ void PerfEncoder::send_params(uint8_t cur_, uint8_t scene) { else { MD.setTrackParam_inline(dest, param, val); } + } } } diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 0caf33747..e451aaf19 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -79,7 +79,7 @@ void PerfPage::config_encoders(uint8_t show_val) { encoders[1]->cur = p->param; if (learn) { uint8_t scene = learn - 1; - encoders[2]->cur = p->scenes[scene]; + encoders[2]->cur = p->get_scene_value(scene); } ((PerfEncoder *)encoders[2])->max = 127; @@ -233,8 +233,13 @@ void PerfPage::learn_param(uint8_t dest, uint8_t param, uint8_t value) { if (learn) { uint8_t n = d->add_param(dest, param, learn, value); - page_mode = n + 1; - config_encoders(true); + if (n < 255) { + if (dest + 1 <= NUM_MD_TRACKS) { + trig_interface.ignoreNextEvent(param - MD.currentSynthPage * 8 + 16); + } + page_mode = n + 1; + config_encoders(true); + } } // MIDI LEARN current mode; @@ -316,8 +321,33 @@ bool PerfPage::handleEvent(gui_event_t *event) { if (trig_interface.is_key_down(MDX_KEY_PATSONG)) { return perf_menu_page.handleEvent(event); } - switch (key) { + // ENCODER BUTTONS + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: { + if (learn == 0) { return true; } + uint8_t param = MD.currentSynthPage * 8 + key - 0x10; + + PerfData *d = &perf_encoders[perf_id]->perf_data; + if (event->mask == EVENT_BUTTON_RELEASED) { + d->clear_param_scene(last_md_track, param, learn); + } + if (event->mask == EVENT_BUTTON_PRESSED) { + if (d->find_match(last_md_track, param, learn) == 255) { + trig_interface.ignoreNextEvent(key); + d->add_param(last_md_track, param, learn, MD.kit.params[last_md_track][param]); + } + } + send_locks(learn); + config_encoders(); + return true; + } case MDX_KEY_CLEAR: { char *str = "CLEAR SCENE"; oled_display.textbox(str, ""); From f47757fe3afb198cca425fca94fa19cf79037c0b Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 30 Jun 2023 20:00:40 +1000 Subject: [PATCH 141/413] Offset VAL encoder by 1, so that there is an off state at 0 --- avr/cores/megacommand/MCL/PerfPage.cpp | 32 ++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index e451aaf19..610518d81 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -79,9 +79,12 @@ void PerfPage::config_encoders(uint8_t show_val) { encoders[1]->cur = p->param; if (learn) { uint8_t scene = learn - 1; - encoders[2]->cur = p->get_scene_value(scene); + uint8_t v = p->scenes[scene]; + if (v == 255) { v = 0; } + else { v++; } + encoders[2]->cur = v; } - ((PerfEncoder *)encoders[2])->max = 127; + ((PerfEncoder *)encoders[2])->max = 128; config_encoder_range(0); } @@ -120,7 +123,9 @@ void PerfPage::update_params() { p->param = encoders[1]->cur; if (learn) { uint8_t scene = learn - 1; - p->scenes[scene] = encoders[2]->cur; + if (encoders[2]->cur > 0) { + p->scenes[scene] = encoders[2]->cur - 1; + } } } else { config_encoder_range(1); @@ -180,8 +185,25 @@ void PerfPage::display() { info1 = "PAR> "; mcl_gui.put_value_at(page_mode, info1 + 4); - char *str1 = "VAL"; - mcl_gui.draw_knob(2, encoders[2], str1); + char *str1; + str1 = "VAL"; + uint8_t v = encoders[2]->cur; + if (encoders[2]->cur == 0) { + str1 = "OFF"; + //Show the "non-lock" value + if (learn > 0) { + uint8_t scene = learn - 1; + uint8_t c = page_mode - 1; + v = perf_encoders[perf_id]->perf_data.params[c].get_scene_value(scene); + } + else { v = 0; } + } + else { + v -= 1; + } + + bool show_value = mcl_gui.show_encoder_value(encoders[2]); + mcl_gui.draw_light_encoder(MCLGUI::knob_x0 + 2 * MCLGUI::knob_w + 7, 6, v, str1, false, show_value); oled_display.fillRect(0,0,10,12, WHITE); oled_display.setFont(&Elektrothic); From bdee299ae507ed517e8efdf535cd2845d03c8396 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 30 Jun 2023 20:28:59 +1000 Subject: [PATCH 142/413] parameter/scene cleanup routines --- avr/cores/megacommand/MCL/PerfData.h | 32 + avr/cores/megacommand/MCL/PerfPage.cpp | 4 +- avr/cores/megacommand/resources/R.h | 8 +- .../megacommand/resources/R_menu_layouts.cpp | 756 +++++++++--------- .../megacommand/resources/R_menu_options.cpp | 19 +- resource/menu_layouts.cpp | 4 +- resource/menu_options.cpp | 4 +- 7 files changed, 439 insertions(+), 388 deletions(-) diff --git a/avr/cores/megacommand/MCL/PerfData.h b/avr/cores/megacommand/MCL/PerfData.h index 820d968d0..67d5e4f25 100644 --- a/avr/cores/megacommand/MCL/PerfData.h +++ b/avr/cores/megacommand/MCL/PerfData.h @@ -99,14 +99,46 @@ class PerfData { return 255; } + bool check_scene_isempty(uint8_t scene, uint8_t dest = 255) { + uint8_t match = 255; + uint8_t empty = 255; + uint8_t s = scene - 1; + for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { + if (dest == 255) { + if (params[a].dest > 0 && params[a].scenes[s] != 255) { + return false; + } + } + else { + if (params[a].dest == dest + 1 && params[a].scenes[s] != 255) { + return false; + } + } + } + return true; + } + void clear_param_scene(uint8_t dest, uint8_t param, uint8_t scene) { uint8_t s = scene - 1; + uint8_t match = 255; for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { // Find match if (params[a].dest == dest + 1 && params[a].param == param) { + if (match == 255) { match = a; } params[a].scenes[s] = 255; } } + if (check_scene_isempty(scene)) { + active_scenes &= ~(1 << s); + } + for (uint8_t n = 0; n < NUM_SCENES; n++) { + if (!check_scene_isempty(n + 1,dest)) { + return; + } + } + if (match == 255) { return; } + params[match].dest = 0; + params[match].param = 0; } uint8_t add_param(uint8_t dest, uint8_t param, uint8_t scene, uint8_t value) { diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 610518d81..5e3322aa8 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -172,7 +172,7 @@ void PerfPage::display() { mcl_gui.draw_knob_frame(); const char *info1 = ""; - const char *info2; + const char *info2 = "PARAMETER"; uint8_t scene = learn - 1; @@ -182,7 +182,7 @@ void PerfPage::display() { PerfEncoder *e = perf_encoders[perf_id]; - info1 = "PAR> "; + info1 = "LCK> "; mcl_gui.put_value_at(page_mode, info1 + 4); char *str1; diff --git a/avr/cores/megacommand/resources/R.h b/avr/cores/megacommand/resources/R.h index 2185532c0..d7806045d 100644 --- a/avr/cores/megacommand/resources/R.h +++ b/avr/cores/megacommand/resources/R.h @@ -376,11 +376,11 @@ extern const unsigned char __R_menu_options[] PROGMEM; struct __T_menu_options { union { menu_option_t MENU_OPTIONS[0]; - char zz__MENU_OPTIONS[1053]; + char zz__MENU_OPTIONS[1089]; }; - static constexpr size_t countof_MENU_OPTIONS = 1053 / sizeof(menu_option_t); - static constexpr size_t sizeofof_MENU_OPTIONS = 1053; - static constexpr size_t __total_size = 1053; + static constexpr size_t countof_MENU_OPTIONS = 1089 / sizeof(menu_option_t); + static constexpr size_t sizeofof_MENU_OPTIONS = 1089; + static constexpr size_t __total_size = 1089; }; extern const unsigned char __R_page_entries[] PROGMEM; diff --git a/avr/cores/megacommand/resources/R_menu_layouts.cpp b/avr/cores/megacommand/resources/R_menu_layouts.cpp index 7d6fb84e1..9ffa20f6f 100644 --- a/avr/cores/megacommand/resources/R_menu_layouts.cpp +++ b/avr/cores/megacommand/resources/R_menu_layouts.cpp @@ -18,1061 +18,1069 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 103, 14, 4, - 237, - 0, + 255, + 4, 59, 255, - 5, - 251, - 69, - 68, - 73, - 84, + 0, + 117, + 80, + 65, + 82, + 236, + 65, + 77, 58, 35, - 47, + 158, 17, 1, - 182, 58, + 221, 20, 116, - 203, - 15, - 101, - 32, - 60, - 4, - 4, + 0, + 128, + 0, + 251, + 69, + 68, + 73, + 84, + 31, + 45, + 214, + 53, 40, - 191, + 32, + 253, 80, 87, 65, 86, 58, - 96, + 128, 35, - 61, + 246, 6, 6, 41, - 182, 20, + 237, 74, - 94, - 254, - 65, + 84, + 73, + 251, 78, 83, 70, 69, 82, - 203, 23, - 255, + 47, 255, 22, + 253, 0, 23, 0, 83, 108, 111, - 96, + 131, 80, - 254, 71, + 251, 82, 73, 68, 58, 32, - 201, 29, - 237, + 39, 2, 2, + 183, 31, 53, - 251, 52, 77, + 236, 79, 68, 69, 75, - 47, + 191, 1, 4, - 219, 3, 32, + 111, 20, 20, - 237, 76, 69, + 181, 78, 40, - 107, + 172, 0, 20, - 15, + 63, 65, 0, - 185, 39, - 170, - 144, + 255, + 107, + 6, 20, - 201, + 33, + 147, 129, - 246, + 236, 79, 79, 80, 83, - 3, + 7, 64, - 221, 0, + 187, 33, 20, 74, - 200, 85, + 144, 77, - 31, + 63, 128, 128, 34, - 182, 255, + 109, 4, 67, - 222, + 173, 63, - 65, - 82, + 235, + 176, 58, - 192, 125, - 118, + 29, 36, 255, + 182, 44, - 219, 67, 61, + 220, 89, - 115, 84, + 203, 20, - 46, + 152, 37, - 111, - 80, - 65, + 47, + 19, 83, 84, - 176, 69, + 96, 41, - 59, + 119, 38, 20, - 173, + 90, 82, 125, - 225, - 65, - 77, + 22, + 40, 69, + 16, 25, - 3, - 251, + 63, 255, 20, 0, 21, + 182, 0, 41, - 97, 80, + 16, 94, - 5, - 148, + 89, 95, - 249, + 79, 30, 255, 15, + 158, 30, - 238, 32, + 235, 77, - 178, 80, 53, - 246, + 47, 16, 0, + 98, 95, - 44, + 194, 21, - 39, + 126, 255, 17, - 237, 0, 77, 85, + 214, 19, - 100, 41, - 61, + 67, 18, + 219, 0, 19, - 187, 95, 69, + 176, 81, 14, - 4, - 54, + 67, 94, + 97, 67, 75, - 18, 191, - 109, + 38, 1, + 223, 49, - 240, 14, 255, 3, 0, - 189, + 11, 59, 86, + 217, 73, 67, - 147, 171, + 62, 1, - 238, 3, 2, 50, + 224, 233, - 9, + 148, 178, - 79, + 251, 15, 255, 4, - 178, 48, 20, - 30, + 33, + 237, 9, 1, 16, - 223, 41, + 246, 54, 67, 67, 58, - 96, 209, - 125, + 7, 133, + 219, 5, 17, - 188, 20, 55, + 194, 83, 76, - 43, 166, + 176, 254, - 9, - 182, + 155, 18, 20, + 109, 25, - 223, 218, + 255, 80, 69, 71, 71, - 240, 73, 65, 84, 79, - 134, + 8, 223, - 27, + 97, 52, + 187, 75, 69, - 176, 89, 63, - 62, + 3, + 237, 12, 12, 19, - 220, 41, + 198, 104, 86, - 98, 97, - 18, + 33, 124, - 194, + 44, + 40, 205, - 134, + 96, 145, - 11, + 184, 7, 78, - 132, 68, + 64, 229, - 7, + 123, 15, 15, - 183, 21, 20, + 118, 60, 83, - 109, 82, + 216, 69, - 128, 21, - 254, + 15, 7, 7, 22, + 225, 255, 5, 41, - 27, 229, + 188, 71, 84, - 201, 72, 58, - 125, + 151, 23, + 219, 255, 6, - 177, 62, 72, - 182, + 27, 90, 78, + 100, 87, - 75, + 187, 251, - 188, 24, 255, + 194, 7, 0, - 36, 187, - 63, + 67, 3, + 248, 3, 25, 255, 8, - 132, 27, + 66, 133, - 45, - 220, + 221, 20, 26, + 200, 255, 9, - 128, - 120, + 7, 10, + 132, 30, - 66, 229, - 221, + 45, + 223, 20, 27, - 254, 255, 11, 27, 83, + 225, 72, 73, 70, - 16, 38, - 31, + 1, + 252, 5, 5, 28, 255, - 194, 12, 35, + 43, 250, - 183, 211, + 118, 82, 83, - 107, 43, + 178, 41, - 39, + 127, 29, 255, - 255, 13, 27, 80, 79, + 246, 76, 89, 80, 72, - 109, 214, + 217, 89, - 147, 44, + 54, 11, - 107, 2, + 183, 41, - 125, 67, 32, + 218, 81, 85, - 173, 171, + 208, 66, - 8, + 131, 58, - 51, 42, - 118, + 55, 83, 79, 85, + 104, 252, - 132, + 64, 102, - 12, - 107, + 198, 184, + 183, 2, - 125, 14, 0, + 218, 70, 73, - 163, 149, + 48, 57, - 5, - 182, + 91, 48, 67, + 104, 220, - 140, + 194, + 90, 90, - 37, - 173, 2, + 220, 238, - 194, 87, 32, + 46, 178, - 236, 82, 46, + 192, 20, - 12, - 51, + 195, 238, + 53, 51, - 90, + 172, 180, - 200, 41, - 70, + 132, + 101, 153, - 86, - 235, + 110, 20, + 186, 79, 178, - 169, 87, + 149, 111, - 90, + 172, 44, - 194, 41, - 255, + 47, 67, 86, + 242, 32, 65, 76, 76, - 33, - 45, + 18, + 214, 216, - 107, 157, + 178, 20, - 41, - 116, + 151, 22, + 67, 89, - 53, 30, + 94, 77, - 237, 9, + 208, 133, - 11, + 184, 168, 76, - 132, 65, + 67, 233, - 55, + 117, 212, - 91, 13, + 184, 32, 23, - 141, 1, + 214, 176, - 100, 211, - 244, + 79, 83, 82, 67, - 201, + 76, 109, + 144, 110, - 1, - 142, + 24, 43, + 230, 132, - 107, 170, + 181, 63, - 82, + 33, 131, - 19, + 51, 44, - 56, - 96, + 134, 10, - 151, + 9, 94, + 113, 1, - 27, + 183, 27, 45, - 123, 149, + 180, 19, - 67, + 51, 29, - 48, 191, - 155, + 9, + 181, 25, 4, - 88, + 128, 95, - 13, + 210, 73, - 40, 205, - 219, + 141, 117, + 176, 84, 32, - 3, - 134, + 56, 33, + 102, 31, - 109, 18, + 219, 77, - 188, 181, 73, + 194, 90, 69, - 33, 106, - 219, + 29, 8, + 176, 74, 16, - 15, + 241, 148, 32, - 28, + 193, 107, - 22, 91, + 97, 71, - 18, 148, - 88, + 37, + 143, 74, - 246, 32, 77, 73, + 104, 198, - 135, + 127, 106, - 241, 72, 82, 79, 32, - 236, + 30, 77, + 207, 53, - 253, 18, 2, + 218, 9, 255, - 175, 4, + 246, 53, - 97, 20, - 50, + 19, 46, - 210, + 45, 88, + 43, 110, - 181, 67, - 132, + 88, 20, - 221, + 77, 57, + 214, 41, 24, - 107, 172, + 180, 193, - 66, + 32, 83, - 11, + 191, 81, - 254, 32, 49, + 227, 32, 70, 87, - 53, 194, - 39, + 82, 101, + 118, 7, - 109, 32, + 216, 10, - 140, 20, + 200, 50, - 128, - 203, + 12, 51, + 190, 92, - 236, 85, 83, 66, + 193, 17, - 20, - 131, + 72, 143, + 54, 52, - 110, 20, + 227, 96, 67, - 53, 41, - 120, + 87, 187, - 75, + 132, 85, - 183, + 187, 11, 20, + 112, 86, 24, - 12, + 195, 118, - 53, 11, - 97, + 86, 79, - 211, + 29, 79, + 48, 239, - 7, + 120, 178, - 140, 58, + 206, 117, - 237, 5, + 216, 32, - 129, 7, + 17, 99, - 22, + 96, 20, - 7, + 115, 53, 51, 41, - 48, - 204, + 12, 199, + 195, 116, - 56, + 133, 6, - 91, 65, + 177, 100, 41, - 22, + 96, 20, - 7, + 118, 54, - 109, 41, + 219, 100, - 182, 95, 80, + 108, 192, - 218, 71, - 25, - 25, + 12, + 241, 215, - 205, + 17, 9, + 52, 223, - 2, + 9, 124, - 91, + 110, 128, - 173, + 182, 49, 32, - 190, 90, + 251, 20, 73, - 197, 242, - 131, + 22, 245, - 47, 12, + 47, + 51, 10, - 247, 20, + 220, 246, - 48, + 195, 21, - 251, + 238, 17, 2, 48, 20, - 156, + 112, 74, - 26, + 106, 148, 83, - 179, + 207, 154, - 240, 85, 82, + 194, 66, 79, - 172, 11, + 178, 224, - 189, + 246, 2, 255, - 172, 79, + 179, 20, - 228, + 146, 50, - 185, + 228, 3, - 36, - 53, + 144, + 214, 16, 58, - 131, 20, + 12, 55, - 52, + 208, 68, - 40, + 163, 106, - 230, 173, + 154, 42, - 178, + 201, 137, - 109, + 182, 4, 191, - 131, 84, + 12, 173, - 23, + 94, 98, - 172, + 179, 238, - 219, + 109, 41, 56, - 98, + 136, 191, - 19, + 77, 199, - 115, + 204, 0, 126, - 16, - 133, + 66, 235, - 225, + 23, 34, + 132, 0, 62, - 54, + 216, 0, - 19, + 78, 36, - 132, 0, + 17, 179, - 91, + 109, 212, 71, - 96, + 128, 20, - 56, + 225, 37, 0, - 67, 8, - 96, + 13, + 128, 20, - 49, + 198, 35, - 146, 40, - 192, + 75, 20, - 111, + 1, + 189, 38, 4, - 115, + 205, 39, 138, - 112, + 195, 65, 71, - 214, 247, + 91, 76, 71, - 214, 75, + 89, 221, - 91, + 110, 170, - 169, + 164, 1, 44, - 30, + 123, 65, 85, 88, - 198, 32, + 27, 83, - 207, 42, + 62, 97, 103, - 178, 101, + 203, 35, - 225, + 135, 31, 204, - 217, + 101, 167, - 97, + 133, 171, - 109, + 181, 65, 100, - 116, + 208, 124, 74, - 40, + 163, 195, - 193, 210, - 164, + 6, 25, + 145, 236, - 88, + 97, 19, - 74, - 107, + 41, 2, + 172, 2, 234, - 22, + 88, 203, - 23, + 93, 26, - 116, + 209, 161, 65, - 107, + 173, 147, 131, - 64, - 169, + 2, 54, + 165, 52, - 88, + 97, 186, - 118, + 216, 27, 126, - 2, - 201, + 11, 41, - 164, + 38, 29, + 144, 192, - 54, + 216, 62, - 7, + 28, 30, - 14, + 59, 54, - 193, 102, - 97, + 5, + 132, 137, - 6, - 232, + 27, 4, + 163, 66, - 214, 170, + 88, 15, - 14, + 56, 79, 83, - 22, + 88, 190, 80, - 24, + 97, 57, - 106, + 169, 56, - 73, 173, - 111, + 37, + 188, 129, 68, 70, 85, - 24, + 98, 75, - 164, + 144, 194, - 5, - 163, + 22, 171, + 143, 246, - 215, + 93, 59, - 88, 75, + 96, 20, - 12, + 49, 28, - 91, + 109, 78, 88, - 90, + 106, 147, - 146, + 72, 236, - 27, + 110, 29, 4, - 128, 0, 0, 0, 0, - 1, - 63, + 0, + 4, + 255, 255, }; diff --git a/avr/cores/megacommand/resources/R_menu_options.cpp b/avr/cores/megacommand/resources/R_menu_options.cpp index 26a7bb6a7..a16e4eae1 100644 --- a/avr/cores/megacommand/resources/R_menu_options.cpp +++ b/avr/cores/megacommand/resources/R_menu_options.cpp @@ -455,15 +455,24 @@ const unsigned char __R_menu_options[] PROGMEM = { 9, 6, 67, - 20, + 22, 104, - 34, - 95, - 0, + 76, + 144, + 221, + 134, + 51, + 195, + 116, + 176, + 52, + 8, + 64, 0, 0, 0, 0, - 9, + 1, + 63, 255, }; diff --git a/resource/menu_layouts.cpp b/resource/menu_layouts.cpp index 2618f6422..c5c5eeec4 100644 --- a/resource/menu_layouts.cpp +++ b/resource/menu_layouts.cpp @@ -268,8 +268,8 @@ menu_t perf_menu_layout = { { // m r n d p f o - {"CTRL SEL:",0, 4, 0, 59, 255, 0, 0 }, - {"EDIT:", 0, 17, 1, 58, 255, 0, 116}, + {"CTRL SEL:",0, 4, 4, 59, 255, 0, 117}, + {"PARAM:", 0, 17, 1, 58, 255, 0, 116}, }, 0, 0 }; diff --git a/resource/menu_options.cpp b/resource/menu_options.cpp index aaee2d91c..ad2b2ee13 100644 --- a/resource/menu_options.cpp +++ b/resource/menu_options.cpp @@ -65,6 +65,8 @@ menu_option_t MENU_OPTIONS[] = { // 104: NOTES {0, "A"}, {1, "A#"}, {2, "B"}, {3, "C"}, {4, "C#"}, {5, "D"}, {6, "D#"}, {7, "E"}, {8, "F"}, {9, "F#"}, {10, "G"}, {11, "G#"}, // 116 - {0, "CTRL"} + {0, "CTRL"}, + // 117 + {0, "1"}, {1, "2"}, {2, "3"}, {3, "4"} }; From 3c5560dcecb48c3e7ec8373c545fafba83339885 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 30 Jun 2023 21:14:26 +1000 Subject: [PATCH 143/413] Highlight locks on MCL. DEST = SRC on controller page --- avr/cores/megacommand/MCL/AuxPages.cpp | 4 ++-- avr/cores/megacommand/MCL/MCL.h | 2 +- avr/cores/megacommand/MCL/MixerPage.cpp | 4 ++++ avr/cores/megacommand/MCL/PerfPage.cpp | 17 +++++++++++------ avr/cores/megacommand/MCL/PerfPageParent.cpp | 6 ++++-- avr/cores/megacommand/MCL/PerfPageParent.h | 2 +- 6 files changed, 23 insertions(+), 12 deletions(-) diff --git a/avr/cores/megacommand/MCL/AuxPages.cpp b/avr/cores/megacommand/MCL/AuxPages.cpp index c9ec6c485..346f5a2e5 100644 --- a/avr/cores/megacommand/MCL/AuxPages.cpp +++ b/avr/cores/megacommand/MCL/AuxPages.cpp @@ -18,8 +18,8 @@ PerfEncoder perf_param2; PerfEncoder perf_param3; PerfEncoder perf_param4; -MixerPage mixer_page(&mixer_param1, &mixer_param2, &mixer_param3, - &mixer_param4); +MixerPage mixer_page(&perf_param1, &perf_param2, &perf_param3, + &perf_param4); RoutePage route_page(&route_param1, &route_param2); fx_param_t fx_echo_params[8] = { diff --git a/avr/cores/megacommand/MCL/MCL.h b/avr/cores/megacommand/MCL/MCL.h index 49aafe556..644a00d51 100644 --- a/avr/cores/megacommand/MCL/MCL.h +++ b/avr/cores/megacommand/MCL/MCL.h @@ -17,7 +17,7 @@ #include "Fonts/TomThumb.h" #define VERSION 4050 -#define VERSION_STR "S4.50" +#define VERSION_STR "V4.50" #define CALLBACK_TIMEOUT 500 #define GUI_NAME_TIMEOUT 800 diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 19959e337..fc80d62f9 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -42,18 +42,22 @@ void MixerPage::oled_draw_mutes() { } void MixerPage::setup() { + /* encoders[0]->handler = encoder_level_handle; encoders[1]->handler = encoder_filtf_handle; encoders[2]->handler = encoder_filtw_handle; encoders[3]->handler = encoder_filtq_handle; + */ } void MixerPage::init() { level_pressmode = 0; + /* for (uint8_t i = 0; i < 4; i++) { encoders[i]->cur = 64; encoders[i]->old = 64; } + */ MD.set_key_repeat(0); trig_interface.on(); MD.set_trigleds(0, TRIGLED_OVERLAY); diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 5e3322aa8..2bcd8d193 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -188,7 +188,8 @@ void PerfPage::display() { char *str1; str1 = "VAL"; uint8_t v = encoders[2]->cur; - if (encoders[2]->cur == 0) { + bool is_lock = encoders[2]->cur != 0; + if (!is_lock) { str1 = "OFF"; //Show the "non-lock" value if (learn > 0) { @@ -203,8 +204,10 @@ void PerfPage::display() { } bool show_value = mcl_gui.show_encoder_value(encoders[2]); - mcl_gui.draw_light_encoder(MCLGUI::knob_x0 + 2 * MCLGUI::knob_w + 7, 6, v, str1, false, show_value); + mcl_gui.draw_light_encoder(MCLGUI::knob_x0 + 2 * MCLGUI::knob_w + 7, 6, v, str1, is_lock, show_value); + } + if (learn) { oled_display.fillRect(0,0,10,12, WHITE); oled_display.setFont(&Elektrothic); oled_display.setCursor(2, 10); @@ -213,7 +216,7 @@ void PerfPage::display() { } if (page_mode == PERF_DESTINATION) { mcl_gui.draw_knob(0, encoders[0], "VAL"); - draw_dest(1, encoders[1]->cur); + draw_dest(1, encoders[1]->cur, false); draw_param(2, encoders[1]->cur, encoders[2]->cur); mcl_gui.draw_knob(3, encoders[3], "MIN"); info2 = "CONTROL"; @@ -312,17 +315,19 @@ bool PerfPage::handleEvent(gui_event_t *event) { auto device = midi_active_peering.get_device(port); uint8_t track = event->source - 128; - uint8_t id = track / 4; + uint8_t id = track / 4; if (event->mask == EVENT_BUTTON_PRESSED) { + if (track > 4) { return true; } uint8_t b = track - (track / 4)*4; learn = b + 1; send_locks(learn); config_encoders(); if (page_mode == PERF_DESTINATION) { - uint8_t id = perf_encoders[perf_id]->perf_data.find_empty() + 1; - if (id == 255) { id = 16; } + //uint8_t id = perf_encoders[perf_id]->perf_data.find_empty() + 1; + //if (id == 255) { id = 16; } + id = 0; page_mode = last_page_mode == 255 ? id : last_page_mode; config_encoders(); } diff --git a/avr/cores/megacommand/MCL/PerfPageParent.cpp b/avr/cores/megacommand/MCL/PerfPageParent.cpp index baccce36e..357d0af4b 100644 --- a/avr/cores/megacommand/MCL/PerfPageParent.cpp +++ b/avr/cores/megacommand/MCL/PerfPageParent.cpp @@ -45,7 +45,7 @@ void PerfPageParent::draw_param(uint8_t knob, uint8_t dest, uint8_t param) { mcl_gui.draw_knob(knob, "PAR", myName); } -void PerfPageParent::draw_dest(uint8_t knob, uint8_t value) { +void PerfPageParent::draw_dest(uint8_t knob, uint8_t value, bool dest) { char K[4]; K[0] = value > 20 ? 'M' : 'T'; switch (value) { @@ -71,7 +71,9 @@ void PerfPageParent::draw_dest(uint8_t knob, uint8_t value) { mcl_gui.put_value_at(value, K + 1); break; } - mcl_gui.draw_knob(knob, "DEST", K); + char *str1 = "DEST"; + if (!dest) { str1 = "SRC"; } + mcl_gui.draw_knob(knob, str1, K); } void PerfPageParent::display() {} diff --git a/avr/cores/megacommand/MCL/PerfPageParent.h b/avr/cores/megacommand/MCL/PerfPageParent.h index 3b9338c8a..ac66187a0 100644 --- a/avr/cores/megacommand/MCL/PerfPageParent.h +++ b/avr/cores/megacommand/MCL/PerfPageParent.h @@ -15,7 +15,7 @@ class PerfPageParent : public MidiCallback { bool midi_state = false; - void draw_dest(uint8_t knob, uint8_t value); + void draw_dest(uint8_t knob, uint8_t value, bool dest = true); void draw_param(uint8_t knob, uint8_t dest, uint8_t param); virtual void display(); From 00fd95859d9d254a07f40e012dbbe8672c1063b8 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 1 Jul 2023 21:39:28 +1000 Subject: [PATCH 144/413] Refactor: decouple PerfData and Scenes. Each lock now has it's own param and dest --- avr/cores/megacommand/MCL/PerfData.h | 254 ++++++++++++++-------- avr/cores/megacommand/MCL/PerfEncoder.cpp | 67 +++--- avr/cores/megacommand/MCL/PerfEncoder.h | 6 +- avr/cores/megacommand/MCL/PerfPage.cpp | 111 +++++----- 4 files changed, 258 insertions(+), 180 deletions(-) diff --git a/avr/cores/megacommand/MCL/PerfData.h b/avr/cores/megacommand/MCL/PerfData.h index 67d5e4f25..5b3f2e0e1 100644 --- a/avr/cores/megacommand/MCL/PerfData.h +++ b/avr/cores/megacommand/MCL/PerfData.h @@ -11,7 +11,7 @@ #define NUM_SCENES 4 #define PERF_SETTINGS NUM_NUM_PERF_PARAMS -static uint8_t get_param_offset(uint8_t dest, uint8_t param) { +static uint8_t get_param_device(uint8_t dest, uint8_t param) { if (dest <= NUM_MD_TRACKS) { return MD.kit.params[dest - 1][param]; } else { @@ -34,162 +34,224 @@ static uint8_t get_param_offset(uint8_t dest, uint8_t param) { return 255; } + + class PerfParam { public: uint8_t dest; uint8_t param; - uint8_t scenes[NUM_SCENES]; - - uint8_t get_scene_value(uint8_t scene) { - uint8_t v = scenes[scene]; - if (v == 255) { - if (dest >= NUM_MD_TRACKS + 4) { - //Todo MIDI default ? - v = 0; - } - else { - v = get_param_offset(dest, param); - } - } - if (v == 255) { - return 0; - } - return v; - } + uint8_t val; }; #define LEARN_MIN 1 -class PerfData { +class PerfScene { public: PerfParam params[NUM_PERF_PARAMS]; + uint8_t count; + PerfScene() { init(); } - uint8_t dest; - uint8_t param; - uint8_t min; - - uint8_t active_scenes; + bool is_active() { return count > 0; } - PerfData() { init_params(); } - - uint8_t find_match(uint8_t dest, uint8_t param, uint8_t scene) { - uint8_t match = 255; - uint8_t empty = 255; - uint8_t s = scene - 1; + void init() { + count = 0; for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { - if (params[a].dest == dest + 1 && params[a].param == param && params[a].scenes[s] != 255) { - return a; - } + params[a].dest = 0; + params[a].param = 0; + params[a].val = 255; } - return 255; } - uint8_t find_empty() { + uint8_t add_param(uint8_t dest, uint8_t param, uint8_t value) { + uint8_t match = 255; uint8_t empty = 255; for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { // Find first empty if (params[a].dest == 0) { - return a; + empty = min(a, empty); + } + if (params[a].dest == dest + 1 && params[a].param == param) { + // Update existing, if matches + match = a; } - // Update existing, if matches } - return 255; - } - bool check_scene_isempty(uint8_t scene, uint8_t dest = 255) { - uint8_t match = 255; - uint8_t empty = 255; - uint8_t s = scene - 1; - for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { - if (dest == 255) { - if (params[a].dest > 0 && params[a].scenes[s] != 255) { - return false; - } - } - else { - if (params[a].dest == dest + 1 && params[a].scenes[s] != 255) { - return false; - } - } + uint8_t b = match; + if (b == 255) { + b = empty; } - return true; + if (b == 255) { + return 255; + } + + params[b].dest = dest + 1; + params[b].param = param; + count++; + return b; } - void clear_param_scene(uint8_t dest, uint8_t param, uint8_t scene) { - uint8_t s = scene - 1; - uint8_t match = 255; + void clear_param(uint8_t dest, uint8_t param) { + uint8_t match = 255; for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { // Find match if (params[a].dest == dest + 1 && params[a].param == param) { if (match == 255) { match = a; } - params[a].scenes[s] = 255; - } - } - if (check_scene_isempty(scene)) { - active_scenes &= ~(1 << s); - } - for (uint8_t n = 0; n < NUM_SCENES; n++) { - if (!check_scene_isempty(n + 1,dest)) { - return; + params[a].val = 255; } } if (match == 255) { return; } params[match].dest = 0; params[match].param = 0; + count--; } - uint8_t add_param(uint8_t dest, uint8_t param, uint8_t scene, uint8_t value) { + uint8_t find_empty() { uint8_t match = 255; uint8_t empty = 255; for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { // Find first empty if (params[a].dest == 0) { - empty = min(a, empty); - } - if (params[a].dest == dest + 1 && params[a].param == param) { - // Update existing, if matches - match = a; + return a; } + // Update existing, if matches } + return 255; + } - uint8_t b = match; - if (b == 255) { - b = empty; - } - if (b == 255) { - return 255; + uint8_t find_match(uint8_t dest_, uint8_t param_) { + + for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { + if (params[a].dest == dest_ + 1 && params[a].param == param_ && params[a].val != 255) { + return a; + } } + return 255; + } - params[b].dest = dest + 1; - params[b].param = param; - if (scene > 0) { - uint8_t s = scene - 1; - active_scenes |= (1 << s); - params[b].scenes[s] = value; +}; + +class PerfData { +public: + PerfScene scenes[NUM_SCENES]; + + uint8_t src; + uint8_t param; + uint8_t min; + + PerfData() { init_params(); } + + void *data() const { return (void *)&scenes; } + + uint16_t get_active_scene_mask() { + uint16_t mask = 0; + for (uint8_t n = 0; n < NUM_SCENES; n++) { + if (scenes[n].is_active()) { + mask |= (1 << n); + } } + return mask; + } - return b; + uint8_t find_match(uint8_t dest_, uint8_t param_, uint8_t scene) { + PerfScene *s = &scenes[scene]; + return s->find_match(dest_, param_); } - void *data() const { return (void *)¶ms; } + void clear_param_scene(uint8_t dest_, uint8_t param_, uint8_t scene) { + + PerfScene *s = &scenes[scene]; + s->clear_param(dest_, param_); + } + + uint8_t add_param(uint8_t dest_, uint8_t param_, uint8_t scene, uint8_t value) { + + PerfScene *s = &scenes[scene]; + + return s->add_param(dest_,param_,value); + + } + void init_params() { - for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { - params[a].dest = 0; - params[a].param = 0; - memset(params[a].scenes,255,sizeof(params[a].scenes)); + for (uint8_t n = 0; n < NUM_SCENES; n++) { + PerfScene *s = &scenes[n]; + s->init(); } } - void clear_scene(uint8_t s) { - active_scenes &= ~(1 << s); - for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { - params[a].scenes[s] = 255; + void clear_scene(uint8_t scene) { + PerfScene *s = &scenes[scene]; + s->init(); + } +}; + +class PerfFade { +public: + PerfFade() { + dest = 0; + param = 0; + min = 255; + max = 255; + } + uint8_t dest; + uint8_t param; + uint8_t min; + uint8_t max; +}; + + +class PerfMorph { +public: + PerfFade fades[NUM_PERF_PARAMS * 2]; + uint8_t count; + PerfMorph() { + } + + uint8_t find_existing(uint8_t dest, uint8_t param) { + for (uint8_t n = 0; n < count; n++) { + PerfFade *f = &fades[n]; + if (f->dest == 0) { return 255; } + if (f->dest == dest && f->param == param) { return n; } + } + return 255; + } + + void populate(PerfScene *s1, PerfScene *s2) { + count = 0; + for (uint8_t n = 0; n < NUM_PERF_PARAMS; n++) { + PerfFade *f = &fades[count]; + PerfParam *p = &s1->params[n]; + if (p->dest != 0) { + f->dest = p->dest; + f->param = p->param; + f->min = p->val; + f->max = get_param_device(p->dest, p->param); + count++; + } + } + + for (uint8_t n = 0; n < NUM_PERF_PARAMS; n++) { + PerfFade *f = &fades[count]; + PerfParam *p = &s2->params[n]; + if (p->dest != 0) { + uint8_t m = find_existing(p->dest, p->param); + if (m != 255) { + f = &fades[m]; + } + else { + f->dest = p->dest; + f->param = p->param; + f->min = get_param_device(p->dest, p->param); + count++; + } + f->max = p->val; + } } } }; + #endif /* PERFDATATRACK_H__ */ diff --git a/avr/cores/megacommand/MCL/PerfEncoder.cpp b/avr/cores/megacommand/MCL/PerfEncoder.cpp index ec88c6255..48f89c049 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.cpp +++ b/avr/cores/megacommand/MCL/PerfEncoder.cpp @@ -2,44 +2,51 @@ #include "MCLMemory.h" #include "MD.h" + #define DIV_1_127 (1.00f / 127.0f) +void PerfEncoder::send_param(uint8_t dest, uint8_t param, uint8_t val) { + if (dest >= NUM_MD_TRACKS + 4) { + uint8_t channel = dest - NUM_MD_TRACKS; + MidiUart2.sendCC(channel, param, val); + } else if (dest >= NUM_MD_TRACKS) { + MD.sendFXParam(param, val, MD_FX_ECHO + dest - NUM_MD_TRACKS); + setLed2(); + } else { + MD.setTrackParam_inline(dest, param, val); + } +} + +void PerfEncoder::send_params(uint8_t cur_) { + PerfScene *s1 = &perf_data.scenes[active_scene_a]; + PerfScene *s2 = &perf_data.scenes[active_scene_b]; + + PerfMorph morph; + + morph.populate(s1, s2); -void PerfEncoder::send_params(uint8_t cur_, uint8_t scene) { - for (uint8_t n = 0; n < NUM_PERF_PARAMS; n++) { - if (perf_data.params[n].dest == 0) { continue; } - uint8_t val = 0; - uint8_t dest = perf_data.params[n].dest - 1; - uint8_t param = perf_data.params[n].param; - uint8_t min = perf_data.params[n].get_scene_value(active_scene_a); - uint8_t max = perf_data.params[n].get_scene_value(active_scene_b); - int8_t range = max - min; - int16_t q = cur_ * range; - if (scene == 255) { - val = ((int16_t) q / (int16_t) 128) + min; - } - else { - val = perf_data.params[n].scenes[scene]; - } - if (val < 128) { - if (dest >= NUM_MD_TRACKS + 4) { - uint8_t channel = dest - NUM_MD_TRACKS; - MidiUart2.sendCC(channel, param, val); - } - else if (dest >= NUM_MD_TRACKS ) { - MD.sendFXParam(param, val, MD_FX_ECHO + dest - NUM_MD_TRACKS); - setLed2(); - } - else { - MD.setTrackParam_inline(dest, param, val); - } - } + for (uint8_t n = 0; n < NUM_PERF_PARAMS * 2; n++) { + + PerfFade *f = &morph.fades[n]; + + uint8_t val = 0; + if (f->max == 255 || f->min == 255) { + continue; } + int8_t range = f->max - f->min; + int16_t q = cur_ * range; + val = ((int16_t)q / (int16_t)127) + min; + + if (val > 127) { + continue; + } + send_param(f->dest - 1, f->param, val); + } } int PerfEncoder::update(encoder_t *enc) { MCLEncoder::update(enc); - //Update all params + // Update all params if (hasChanged()) { send_params(cur); } diff --git a/avr/cores/megacommand/MCL/PerfEncoder.h b/avr/cores/megacommand/MCL/PerfEncoder.h index 1dc81fcca..ba49d9556 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.h +++ b/avr/cores/megacommand/MCL/PerfEncoder.h @@ -16,8 +16,10 @@ class PerfEncoder : public MCLEncoder { PerfData perf_data; uint8_t active_scene_a = 0; uint8_t active_scene_b = 1; - void send_params(uint8_t cur_, uint8_t scene = 255); - /** + void send_param(uint8_t dest, uint8_t param, uint8_t val); + void send_params(uint8_t cur_); + + /** Create a new range-limited encoder with max and min value, short name, initial value, and handling function. The initRangeEncoder will be called with the constructor arguments. diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 2bcd8d193..1374b3c87 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -37,8 +37,10 @@ void PerfPage::set_led_mask() { bool blink = true; uint16_t blink_mask = 0; - blink_mask |= e->perf_data.active_scenes; + + blink_mask |= e->perf_data.get_active_scene_mask(); blink_mask &= ~mask; + if (last_blink_mask != blink_mask) { MD.set_trigleds(blink_mask, TRIGLED_EXCLUSIVENDYNAMIC, blink); } @@ -69,24 +71,29 @@ void PerfPage::config_encoders(uint8_t show_val) { encoders[3] = &fx_param4; if (page_mode > PERF_DESTINATION) { - last_page_mode = page_mode; - encoders[0] = &fx_param1; - uint8_t c = page_mode - 1; - PerfEncoder *e = perf_encoders[perf_id]; - PerfParam *p = &perf_encoders[perf_id]->perf_data.params[c]; - - encoders[0]->cur = p->dest; - encoders[1]->cur = p->param; if (learn) { uint8_t scene = learn - 1; - uint8_t v = p->scenes[scene]; + + last_page_mode = page_mode; + encoders[0] = &fx_param1; + uint8_t c = page_mode - 1; + + PerfEncoder *e = perf_encoders[perf_id]; + PerfParam *p = &e->perf_data.scenes[scene].params[c]; + + encoders[0]->cur = p->dest; + encoders[1]->cur = p->param; + + uint8_t v = p->val; + if (v == 255) { v = 0; } else { v++; } + encoders[2]->cur = v; - } - ((PerfEncoder *)encoders[2])->max = 128; + ((PerfEncoder *)encoders[2])->max = 128; - config_encoder_range(0); + config_encoder_range(0); + } } if (page_mode == PERF_DESTINATION) { @@ -94,7 +101,7 @@ void PerfPage::config_encoders(uint8_t show_val) { ((PerfEncoder *)encoders[0])->max = 127; PerfData *d = &perf_encoders[perf_id]->perf_data; - encoders[1]->cur = d->dest; + encoders[1]->cur = d->src; encoders[2]->cur = d->param; config_encoder_range(1); encoders[3]->cur = d->min; @@ -117,14 +124,16 @@ void PerfPage::update_params() { if (encoders[0]->hasChanged() && encoders[0]->cur == 0) { encoders[1]->cur = 0; } - PerfEncoder *e = perf_encoders[perf_id]; - PerfParam *p = &perf_encoders[perf_id]->perf_data.params[c]; - p->dest = encoders[0]->cur; - p->param = encoders[1]->cur; + if (learn) { uint8_t scene = learn - 1; + + PerfEncoder *e = perf_encoders[perf_id]; + PerfParam *p = &perf_encoders[perf_id]->perf_data.scenes[scene].params[c]; + p->dest = encoders[0]->cur; + p->param = encoders[1]->cur; if (encoders[2]->cur > 0) { - p->scenes[scene] = encoders[2]->cur - 1; + p->val = encoders[2]->cur - 1; } } } else { @@ -134,7 +143,7 @@ void PerfPage::update_params() { encoders[2]->cur = 0; } PerfData *d = &perf_encoders[perf_id]->perf_data; - d->dest = encoders[1]->cur; + d->src = encoders[1]->cur; d->param = encoders[2]->cur; d->min = encoders[3]->cur; } @@ -192,12 +201,8 @@ void PerfPage::display() { if (!is_lock) { str1 = "OFF"; //Show the "non-lock" value - if (learn > 0) { - uint8_t scene = learn - 1; - uint8_t c = page_mode - 1; - v = perf_encoders[perf_id]->perf_data.params[c].get_scene_value(scene); - } - else { v = 0; } + uint8_t c = page_mode - 1; + v = perf_encoders[perf_id]->perf_data.scenes[scene].params[c].val; } else { v -= 1; @@ -239,7 +244,7 @@ void PerfPage::display() { void PerfPage::learn_param(uint8_t dest, uint8_t param, uint8_t value) { // Intercept controller param. PerfData *d = &perf_encoders[perf_id]->perf_data; - if (dest + 1 == d->dest && param == d->param) { + if (dest + 1 == d->src && param == d->param) { // Controller param, start value; uint8_t min = d->min; uint8_t max = 127; @@ -257,7 +262,8 @@ void PerfPage::learn_param(uint8_t dest, uint8_t param, uint8_t value) { if (mcl.currentPage() == PERF_PAGE_0) { if (learn) { - uint8_t n = d->add_param(dest, param, learn, value); + uint8_t scene = learn - 1; + uint8_t n = d->add_param(dest, param, scene, value); if (n < 255) { if (dest + 1 <= NUM_MD_TRACKS) { trig_interface.ignoreNextEvent(param - MD.currentSynthPage * 8 + 16); @@ -280,25 +286,23 @@ void PerfPage::learn_param(uint8_t dest, uint8_t param, uint8_t value) { } } -void PerfPage::send_locks(uint8_t mode) { +void PerfPage::send_locks(uint8_t scene) { MDSeqTrack &active_track = mcl_seq.md_tracks[last_md_track]; uint8_t params[24]; memset(params, 255, sizeof(params)); for (uint8_t n = 0; n < NUM_PERF_PARAMS; n++) { - PerfParam *p = &perf_encoders[perf_id]->perf_data.params[n]; - uint8_t dest = p->dest; - uint8_t param = p->param; + PerfParam *p = &perf_encoders[perf_id]->perf_data.scenes[scene].params[n]; + uint8_t dest = p->dest; + uint8_t param = p->param; - if (param >= 24) { - continue; - } + if (param >= 24) { + continue; + } - if (dest == last_md_track + 1) { - if (learn > 0) { - params[param] = p->scenes[learn - 1]; + if (dest == last_md_track + 1) { + params[param] = p->val; } - } } MD.activate_encoder_interface(params); } @@ -314,15 +318,16 @@ bool PerfPage::handleEvent(gui_event_t *event) { uint8_t port = event->port; auto device = midi_active_peering.get_device(port); - uint8_t track = event->source - 128; - uint8_t id = track / 4; + uint8_t track = event->source - 128; + uint8_t id = track / NUM_SCENES; if (event->mask == EVENT_BUTTON_PRESSED) { - if (track > 4) { return true; } - uint8_t b = track - (track / 4)*4; + if (track > NUM_SCENES) { return true; } + uint8_t b = track - (track / NUM_SCENES)*NUM_SCENES; learn = b + 1; - send_locks(learn); + uint8_t scene = b; + send_locks(scene); config_encoders(); if (page_mode == PERF_DESTINATION) { //uint8_t id = perf_encoders[perf_id]->perf_data.find_empty() + 1; @@ -359,19 +364,21 @@ bool PerfPage::handleEvent(gui_event_t *event) { case 0x16: case 0x17: { if (learn == 0) { return true; } + uint8_t scene = learn - 1; + uint8_t param = MD.currentSynthPage * 8 + key - 0x10; PerfData *d = &perf_encoders[perf_id]->perf_data; if (event->mask == EVENT_BUTTON_RELEASED) { - d->clear_param_scene(last_md_track, param, learn); + d->clear_param_scene(last_md_track, param, scene); } if (event->mask == EVENT_BUTTON_PRESSED) { - if (d->find_match(last_md_track, param, learn) == 255) { - trig_interface.ignoreNextEvent(key); - d->add_param(last_md_track, param, learn, MD.kit.params[last_md_track][param]); + if (d->find_match(last_md_track, param, scene) == 255) { + trig_interface.ignoreNextEvent(key); + d->add_param(last_md_track, param, scene, MD.kit.params[last_md_track][param]); } } - send_locks(learn); + send_locks(scene); config_encoders(); return true; } @@ -390,11 +397,11 @@ bool PerfPage::handleEvent(gui_event_t *event) { uint8_t n; for (n = 0; n < 4; n++) { if (note_interface.is_note_on(n)) { - if (n > 1) { e->active_scene_b = n; break; } - else { e->active_scene_a = n; break; } + if (n > 1) { e->active_scene_b = n; e->cur = 127; break; } + else { e->active_scene_a = n; e->cur = 0; break; } } } - e->send_params(0, n); + e->send_params(e->cur); break; } } From 58ab947e06cccde452c6904e5d817188766ddc38 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 1 Jul 2023 22:49:05 +1000 Subject: [PATCH 145/413] disable live kit update when in encoder_lock mode --- avr/cores/megacommand/MCL/MCL.cpp | 2 ++ avr/cores/megacommand/MCL/MCL.h | 2 ++ avr/cores/megacommand/MCL/PerfData.h | 30 +++++++++++++++-------- avr/cores/megacommand/MCL/PerfEncoder.cpp | 4 +-- avr/cores/megacommand/MCL/PerfPage.cpp | 4 ++- 5 files changed, 29 insertions(+), 13 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCL.cpp b/avr/cores/megacommand/MCL/MCL.cpp index ba40c8b57..3247749e7 100644 --- a/avr/cores/megacommand/MCL/MCL.cpp +++ b/avr/cores/megacommand/MCL/MCL.cpp @@ -41,7 +41,9 @@ static LightPage *const MCL::pages_table[NUM_PAGES] PROGMEM = { &mixer_page, // Index: 3 &grid_save_page, // Index: 4 &grid_load_page, // Index: 5 +#ifdef WAV_DESIGNER &wd.mixer, // Index: 6 +#endif &seq_step_page, // Index: 7 &seq_extstep_page, // Index: 8 &seq_ptc_page, // Index: 9 diff --git a/avr/cores/megacommand/MCL/MCL.h b/avr/cores/megacommand/MCL/MCL.h index 644a00d51..a5bd56e46 100644 --- a/avr/cores/megacommand/MCL/MCL.h +++ b/avr/cores/megacommand/MCL/MCL.h @@ -38,7 +38,9 @@ enum PageIndex { MIXER_PAGE, // Index: 3 GRID_SAVE_PAGE, // Index: 4 GRID_LOAD_PAGE, // Index: 5 +#ifdef WAV_DESIGNER WD_MIXER_PAGE, // Index: 6 +#endif SEQ_STEP_PAGE, // Index: 7 SEQ_EXTSTEP_PAGE, // Index: 8 SEQ_PTC_PAGE, // Index: 9 diff --git a/avr/cores/megacommand/MCL/PerfData.h b/avr/cores/megacommand/MCL/PerfData.h index 5b3f2e0e1..2a20089fd 100644 --- a/avr/cores/megacommand/MCL/PerfData.h +++ b/avr/cores/megacommand/MCL/PerfData.h @@ -89,23 +89,21 @@ class PerfScene { params[b].dest = dest + 1; params[b].param = param; + params[b].val = value; count++; return b; } void clear_param(uint8_t dest, uint8_t param) { - uint8_t match = 255; for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { // Find match if (params[a].dest == dest + 1 && params[a].param == param) { - if (match == 255) { match = a; } params[a].val = 255; + params[a].dest = 0; + params[a].param = 0; + count--; } } - if (match == 255) { return; } - params[match].dest = 0; - params[match].param = 0; - count--; } uint8_t find_empty() { @@ -227,8 +225,13 @@ class PerfMorph { if (p->dest != 0) { f->dest = p->dest; f->param = p->param; - f->min = p->val; - f->max = get_param_device(p->dest, p->param); + uint8_t v = get_param_device(p->dest, p->param); + f->min = p->val == 255 ? v : p->val; + f->max = v; + DEBUG_PRINT("ADDING "); + DEBUG_PRINT(f->min); + DEBUG_PRINT(" "); + DEBUG_PRINT(f->max); count++; } } @@ -238,16 +241,23 @@ class PerfMorph { PerfParam *p = &s2->params[n]; if (p->dest != 0) { uint8_t m = find_existing(p->dest, p->param); + uint8_t v = get_param_device(p->dest, p->param); if (m != 255) { f = &fades[m]; + DEBUG_PRINTLN("exists"); } else { f->dest = p->dest; f->param = p->param; - f->min = get_param_device(p->dest, p->param); + f->min = v; count++; + DEBUG_PRINTLN("does not exist"); } - f->max = p->val; + f->max = p->val == 255 ? v : p->val; + DEBUG_PRINT("HERE "); + DEBUG_PRINT(f->min); + DEBUG_PRINT(" "); + DEBUG_PRINT(f->max); } } } diff --git a/avr/cores/megacommand/MCL/PerfEncoder.cpp b/avr/cores/megacommand/MCL/PerfEncoder.cpp index 48f89c049..c141caa8b 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.cpp +++ b/avr/cores/megacommand/MCL/PerfEncoder.cpp @@ -13,7 +13,7 @@ void PerfEncoder::send_param(uint8_t dest, uint8_t param, uint8_t val) { MD.sendFXParam(param, val, MD_FX_ECHO + dest - NUM_MD_TRACKS); setLed2(); } else { - MD.setTrackParam_inline(dest, param, val); + MD.setTrackParam(dest, param, val); } } @@ -25,7 +25,7 @@ void PerfEncoder::send_params(uint8_t cur_) { morph.populate(s1, s2); - for (uint8_t n = 0; n < NUM_PERF_PARAMS * 2; n++) { + for (uint8_t n = 0; n < morph.count; n++) { PerfFade *f = &morph.fades[n]; diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 1374b3c87..6abb39773 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -304,6 +304,7 @@ void PerfPage::send_locks(uint8_t scene) { params[param] = p->val; } } + seq_step_page.disable_paramupdate_events(); MD.activate_encoder_interface(params); } @@ -341,6 +342,7 @@ bool PerfPage::handleEvent(gui_event_t *event) { if (note_interface.notes_all_off()) { learn = LEARN_OFF; + seq_step_page.enable_paramupdate_events(); MD.deactivate_encoder_interface(); page_mode = PERF_DESTINATION; config_encoders(); @@ -382,7 +384,7 @@ bool PerfPage::handleEvent(gui_event_t *event) { config_encoders(); return true; } - case MDX_KEY_CLEAR: { + case MDX_KEY_NO: { char *str = "CLEAR SCENE"; oled_display.textbox(str, ""); MD.popup_text(str); From 8ff8cb4f3927af4c5865863b1e48b9821456549e Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 1 Jul 2023 23:40:16 +1000 Subject: [PATCH 146/413] GUI adjustments, encoder etc --- avr/cores/megacommand/MCL/PerfPage.cpp | 108 ++++++++++-------- avr/cores/megacommand/MCL/PerfPageParent.cpp | 3 +- .../megacommand/resources/R_menu_options.cpp | 26 +++-- resource/menu_options.cpp | 2 +- 4 files changed, 80 insertions(+), 59 deletions(-) diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 6abb39773..6becbf179 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -66,39 +66,41 @@ void PerfPage::config_encoder_range(uint8_t i) { } void PerfPage::config_encoders(uint8_t show_val) { + + encoders[0] = perf_encoders[perf_id]; encoders[1] = &fx_param2; encoders[2] = &fx_param3; encoders[3] = &fx_param4; - if (page_mode > PERF_DESTINATION) { + ((PerfEncoder *)encoders[0])->max = 127; + + if (page_mode > PERF_DESTINATION) { if (learn) { uint8_t scene = learn - 1; last_page_mode = page_mode; - encoders[0] = &fx_param1; + uint8_t c = page_mode - 1; PerfEncoder *e = perf_encoders[perf_id]; PerfParam *p = &e->perf_data.scenes[scene].params[c]; - encoders[0]->cur = p->dest; - encoders[1]->cur = p->param; + encoders[1]->cur = p->dest; + encoders[2]->cur = p->param; uint8_t v = p->val; if (v == 255) { v = 0; } else { v++; } - encoders[2]->cur = v; - ((PerfEncoder *)encoders[2])->max = 128; + encoders[3]->cur = v; + ((PerfEncoder *)encoders[3])->max = 128; - config_encoder_range(0); + config_encoder_range(1); } } if (page_mode == PERF_DESTINATION) { - encoders[0] = perf_encoders[perf_id]; - ((PerfEncoder *)encoders[0])->max = 127; PerfData *d = &perf_encoders[perf_id]->perf_data; encoders[1]->cur = d->src; @@ -119,10 +121,10 @@ void PerfPage::update_params() { uint8_t c = page_mode - 1; if (page_mode > PERF_DESTINATION) { - config_encoder_range(0); + config_encoder_range(1); - if (encoders[0]->hasChanged() && encoders[0]->cur == 0) { - encoders[1]->cur = 0; + if (encoders[1]->hasChanged() && encoders[1]->cur == 0) { + encoders[2]->cur = 0; } if (learn) { @@ -130,10 +132,10 @@ void PerfPage::update_params() { PerfEncoder *e = perf_encoders[perf_id]; PerfParam *p = &perf_encoders[perf_id]->perf_data.scenes[scene].params[c]; - p->dest = encoders[0]->cur; - p->param = encoders[1]->cur; - if (encoders[2]->cur > 0) { - p->val = encoders[2]->cur - 1; + p->dest = encoders[1]->cur; + p->param = encoders[2]->cur; + if (encoders[3]->cur > 0) { + p->val = encoders[3]->cur - 1; } } } else { @@ -170,7 +172,6 @@ void PerfPage::display() { auto oldfont = oled_display.getFont(); - mcl_gui.draw_panel_number(perf_id + 1); uint8_t x = mcl_gui.knob_x0 + 5; uint8_t y = 8; @@ -185,19 +186,23 @@ void PerfPage::display() { uint8_t scene = learn - 1; - if (page_mode > PERF_DESTINATION) { - draw_dest(0, encoders[0]->cur); - draw_param(1, encoders[0]->cur, encoders[1]->cur); + PerfEncoder *e = perf_encoders[perf_id]; + + char *str1 = " A"; + str1[1] = 'A' + perf_id; + mcl_gui.draw_knob(0, encoders[0], str1); - PerfEncoder *e = perf_encoders[perf_id]; + + if (page_mode > PERF_DESTINATION || learn) { + draw_dest(1, encoders[1]->cur); + draw_param(2, encoders[1]->cur, encoders[2]->cur); info1 = "LCK> "; mcl_gui.put_value_at(page_mode, info1 + 4); - char *str1; - str1 = "VAL"; - uint8_t v = encoders[2]->cur; - bool is_lock = encoders[2]->cur != 0; + char *str1 = "VAL"; + uint8_t v = encoders[3]->cur; + bool is_lock = encoders[3]->cur != 0; if (!is_lock) { str1 = "OFF"; //Show the "non-lock" value @@ -208,36 +213,39 @@ void PerfPage::display() { v -= 1; } - bool show_value = mcl_gui.show_encoder_value(encoders[2]); - mcl_gui.draw_light_encoder(MCLGUI::knob_x0 + 2 * MCLGUI::knob_w + 7, 6, v, str1, is_lock, show_value); + bool show_value = mcl_gui.show_encoder_value(encoders[3]); + mcl_gui.draw_light_encoder(MCLGUI::knob_x0 + 3 * MCLGUI::knob_w + 7, 6, v, str1, is_lock, show_value); - } - if (learn) { - oled_display.fillRect(0,0,10,12, WHITE); - oled_display.setFont(&Elektrothic); - oled_display.setCursor(2, 10); - oled_display.setTextColor(BLACK, WHITE); - oled_display.print((char) (0x3C + scene)); } - if (page_mode == PERF_DESTINATION) { - mcl_gui.draw_knob(0, encoders[0], "VAL"); - draw_dest(1, encoders[1]->cur, false); + else if (page_mode == PERF_DESTINATION) { + draw_dest(1, encoders[1]->cur, false); draw_param(2, encoders[1]->cur, encoders[2]->cur); mcl_gui.draw_knob(3, encoders[3], "MIN"); info2 = "CONTROL"; } - oled_display.setTextColor(WHITE, BLACK); + //oled_display.fillCircle(6, 6, 6, WHITE); + oled_display.fillRect(0,0,10,12, WHITE); + oled_display.setFont(&Elektrothic); + oled_display.setCursor(2, 10); + //oled_display.setCursor(4, 10); + oled_display.setTextColor(BLACK, WHITE); + oled_display.print((char) (0x3C + perf_id)); + + if (learn) { + mcl_gui.draw_panel_number(scene + 1); + } + oled_display.setTextColor(WHITE, BLACK); oled_display.setFont(oldfont); mcl_gui.draw_panel_labels(info1, info2); - PerfEncoder *e = perf_encoders[perf_id]; oled_display.setCursor(80, MCLGUI::pane_info2_y + 4); - char *str3 = "SCENE: A -> B"; - str3[7] = 'A' + e->active_scene_a; - str3[12] = 'A' + e->active_scene_b; + char *str3 = "SCENE: A B"; + str3[7] = '0' + e->active_scene_a; + str3[12] = '0' + e->active_scene_b; oled_display.print(str3); - + oled_display.writeFastHLine(109, MCLGUI::pane_info2_y + 1, 5, WHITE); + oled_display.writeFastVLine(109 + ((e->cur * 5) / 128), MCLGUI::pane_info2_y ,3, WHITE); oled_display.display(); } @@ -274,7 +282,7 @@ void PerfPage::learn_param(uint8_t dest, uint8_t param, uint8_t value) { } // MIDI LEARN current mode; - uint8_t a = page_mode == PERF_DESTINATION ? 1 : 0; + uint8_t a = 1; if (encoders[a]->cur == 0 && encoders[a + 1]->cur > 0) { encoders[a]->cur = dest + 1; @@ -406,15 +414,25 @@ bool PerfPage::handleEvent(gui_event_t *event) { e->send_params(e->cur); break; } + case MDX_KEY_UP: { + goto page_mode_up; + } + case MDX_KEY_DOWN: { + if (page_mode == 0) { page_mode = NUM_PERF_PARAMS; } + else { page_mode--; } + return true; + } } return true; } if (EVENT_PRESSED(event, Buttons.BUTTON4)) { + page_mode_up: page_mode++; - if (page_mode > 16) { + if (page_mode > NUM_PERF_PARAMS) { page_mode = 0; } config_encoders(); + return true; } if (EVENT_PRESSED(event, Buttons.BUTTON3)) { diff --git a/avr/cores/megacommand/MCL/PerfPageParent.cpp b/avr/cores/megacommand/MCL/PerfPageParent.cpp index 357d0af4b..7a9eb7211 100644 --- a/avr/cores/megacommand/MCL/PerfPageParent.cpp +++ b/avr/cores/megacommand/MCL/PerfPageParent.cpp @@ -7,6 +7,7 @@ void PerfPageParent::setup() { DEBUG_PRINT_FN(); } void PerfPageParent::init() { DEBUG_PRINT_FN(); + MD.set_key_repeat(0); oled_display.clearDisplay(); oled_display.setFont(); config_encoders(); @@ -15,7 +16,7 @@ void PerfPageParent::init() { setup_callbacks(); } -void PerfPageParent::cleanup() { remove_callbacks(); } +void PerfPageParent::cleanup() { MD.set_key_repeat(1); remove_callbacks(); } void PerfPageParent::loop() {} diff --git a/avr/cores/megacommand/resources/R_menu_options.cpp b/avr/cores/megacommand/resources/R_menu_options.cpp index a16e4eae1..c49020e7e 100644 --- a/avr/cores/megacommand/resources/R_menu_options.cpp +++ b/avr/cores/megacommand/resources/R_menu_options.cpp @@ -455,24 +455,26 @@ const unsigned char __R_menu_options[] PROGMEM = { 9, 6, 67, - 22, + 20, 104, - 76, - 144, - 221, - 134, - 51, - 195, + 59, + 95, 116, + 1, 176, - 52, - 8, - 64, + 66, + 152, + 236, + 67, + 116, + 54, + 98, + 24, 0, 0, 0, 0, - 1, - 63, + 0, + 39, 255, }; diff --git a/resource/menu_options.cpp b/resource/menu_options.cpp index ad2b2ee13..e8021c94b 100644 --- a/resource/menu_options.cpp +++ b/resource/menu_options.cpp @@ -67,6 +67,6 @@ menu_option_t MENU_OPTIONS[] = { // 116 {0, "CTRL"}, // 117 - {0, "1"}, {1, "2"}, {2, "3"}, {3, "4"} + {0, "A"}, {1, "B"}, {2, "C"}, {3, "D"} }; From c295957d90d34a2a4901c528d4978b092cc72c60 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 2 Jul 2023 00:08:01 +1000 Subject: [PATCH 147/413] bad logic from me :/ --- avr/cores/megacommand/MCL/PerfEncoder.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/PerfEncoder.cpp b/avr/cores/megacommand/MCL/PerfEncoder.cpp index c141caa8b..05128b5bd 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.cpp +++ b/avr/cores/megacommand/MCL/PerfEncoder.cpp @@ -28,18 +28,24 @@ void PerfEncoder::send_params(uint8_t cur_) { for (uint8_t n = 0; n < morph.count; n++) { PerfFade *f = &morph.fades[n]; - + DEBUG_PRINTLN("send para"); + DEBUG_PRINTLN(f->max); + DEBUG_PRINTLN(f->min); + uint8_t val = 0; if (f->max == 255 || f->min == 255) { continue; } int8_t range = f->max - f->min; int16_t q = cur_ * range; + DEBUG_PRINTLN("range"); + DEBUG_PRINTLN(range); val = ((int16_t)q / (int16_t)127) + min; - + if (f->min > f->max) { val += f->min; } if (val > 127) { continue; } + DEBUG_PRINTLN(val); send_param(f->dest - 1, f->param, val); } } From 2b108451f4b22506ea47889fc6c9cee888eab076 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 2 Jul 2023 11:44:34 +1000 Subject: [PATCH 148/413] Broken fade math --- avr/cores/megacommand/MCL/PerfEncoder.cpp | 4 ++-- avr/cores/megacommand/MCL/PerfPage.cpp | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/avr/cores/megacommand/MCL/PerfEncoder.cpp b/avr/cores/megacommand/MCL/PerfEncoder.cpp index 05128b5bd..146126816 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.cpp +++ b/avr/cores/megacommand/MCL/PerfEncoder.cpp @@ -40,8 +40,8 @@ void PerfEncoder::send_params(uint8_t cur_) { int16_t q = cur_ * range; DEBUG_PRINTLN("range"); DEBUG_PRINTLN(range); - val = ((int16_t)q / (int16_t)127) + min; - if (f->min > f->max) { val += f->min; } + DEBUG_PRINTLN(cur); + val = ((int16_t)q / (int16_t)127) + f->min; if (val > 127) { continue; } diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 6becbf179..d65afbca6 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -200,7 +200,7 @@ void PerfPage::display() { info1 = "LCK> "; mcl_gui.put_value_at(page_mode, info1 + 4); - char *str1 = "VAL"; + char *str1 = "LCK"; uint8_t v = encoders[3]->cur; bool is_lock = encoders[3]->cur != 0; if (!is_lock) { @@ -220,7 +220,7 @@ void PerfPage::display() { else if (page_mode == PERF_DESTINATION) { draw_dest(1, encoders[1]->cur, false); draw_param(2, encoders[1]->cur, encoders[2]->cur); - mcl_gui.draw_knob(3, encoders[3], "MIN"); + mcl_gui.draw_knob(3, encoders[3], "THR"); info2 = "CONTROL"; } @@ -241,8 +241,8 @@ void PerfPage::display() { oled_display.setCursor(80, MCLGUI::pane_info2_y + 4); char *str3 = "SCENE: A B"; - str3[7] = '0' + e->active_scene_a; - str3[12] = '0' + e->active_scene_b; + str3[7] = '1' + e->active_scene_a; + str3[12] = '1' + e->active_scene_b; oled_display.print(str3); oled_display.writeFastHLine(109, MCLGUI::pane_info2_y + 1, 5, WHITE); oled_display.writeFastVLine(109 + ((e->cur * 5) / 128), MCLGUI::pane_info2_y ,3, WHITE); From 41984fa8790deb68b524f46097fa3e63cddc8d0c Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 2 Jul 2023 19:41:22 +1000 Subject: [PATCH 149/413] Scenes shared by encoders. Fix MIDI transmission channel --- avr/cores/megacommand/MCL/MCL.h | 2 +- avr/cores/megacommand/MCL/MCLMemory.h | 3 + avr/cores/megacommand/MCL/PerfData.h | 13 +- avr/cores/megacommand/MCL/PerfEncoder.cpp | 22 +- avr/cores/megacommand/MCL/PerfEncoder.h | 4 +- avr/cores/megacommand/MCL/PerfPage.cpp | 210 +++++++++++-------- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 4 +- 7 files changed, 150 insertions(+), 108 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCL.h b/avr/cores/megacommand/MCL/MCL.h index a5bd56e46..fdc9b941a 100644 --- a/avr/cores/megacommand/MCL/MCL.h +++ b/avr/cores/megacommand/MCL/MCL.h @@ -17,7 +17,7 @@ #include "Fonts/TomThumb.h" #define VERSION 4050 -#define VERSION_STR "V4.50" +#define VERSION_STR "Z4.50" #define CALLBACK_TIMEOUT 500 #define GUI_NAME_TIMEOUT 800 diff --git a/avr/cores/megacommand/MCL/MCLMemory.h b/avr/cores/megacommand/MCL/MCLMemory.h index 21ebf9648..d4b9ef1bd 100644 --- a/avr/cores/megacommand/MCL/MCLMemory.h +++ b/avr/cores/megacommand/MCL/MCLMemory.h @@ -45,6 +45,9 @@ constexpr size_t MDTEMPO_TRACK_NUM = 15; //position of MDTEMPO track in grid constexpr size_t NUM_LFO_TRACKS = 1; +constexpr size_t NUM_PERF_PARAMS = 16; +constexpr size_t NUM_SCENES = 8; + // as of commit 33e243afc758081dc6eb244e42ae61e1e0de09c0 // the track sizes are: // GridTrack 7 diff --git a/avr/cores/megacommand/MCL/PerfData.h b/avr/cores/megacommand/MCL/PerfData.h index 2a20089fd..c38e3e64f 100644 --- a/avr/cores/megacommand/MCL/PerfData.h +++ b/avr/cores/megacommand/MCL/PerfData.h @@ -2,13 +2,10 @@ #ifndef PERFDATATRACK_H__ #define PERFDATATRACK_H__ -#include "PerfData.h" #include "WProgram.h" #include "MCLMemory.h" #include "MD.h" -#define NUM_PERF_PARAMS 16 -#define NUM_SCENES 4 #define PERF_SETTINGS NUM_NUM_PERF_PARAMS static uint8_t get_param_device(uint8_t dest, uint8_t param) { @@ -135,7 +132,7 @@ class PerfScene { class PerfData { public: - PerfScene scenes[NUM_SCENES]; + static PerfScene scenes[NUM_SCENES]; uint8_t src; uint8_t param; @@ -184,6 +181,7 @@ class PerfData { PerfScene *s = &scenes[scene]; s->init(); } + }; class PerfFade { @@ -219,6 +217,11 @@ class PerfMorph { void populate(PerfScene *s1, PerfScene *s2) { count = 0; + if (s1 == nullptr && s2 == nullptr) { return; } + if (s1 == nullptr) { + s1 = s2; + s2 = nullptr; + } for (uint8_t n = 0; n < NUM_PERF_PARAMS; n++) { PerfFade *f = &fades[count]; PerfParam *p = &s1->params[n]; @@ -235,7 +238,7 @@ class PerfMorph { count++; } } - + if (s2 == nullptr) { return; } for (uint8_t n = 0; n < NUM_PERF_PARAMS; n++) { PerfFade *f = &fades[count]; PerfParam *p = &s2->params[n]; diff --git a/avr/cores/megacommand/MCL/PerfEncoder.cpp b/avr/cores/megacommand/MCL/PerfEncoder.cpp index 146126816..cafc2ef4e 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.cpp +++ b/avr/cores/megacommand/MCL/PerfEncoder.cpp @@ -1,13 +1,17 @@ #include "PerfEncoder.h" #include "MCLMemory.h" #include "MD.h" - +#include "PerfData.h" #define DIV_1_127 (1.00f / 127.0f) +static PerfScene PerfData::scenes[NUM_SCENES]; + void PerfEncoder::send_param(uint8_t dest, uint8_t param, uint8_t val) { if (dest >= NUM_MD_TRACKS + 4) { - uint8_t channel = dest - NUM_MD_TRACKS; + uint8_t channel = dest - NUM_MD_TRACKS - 4; + DEBUG_PRINTLN("send cc"); + DEBUG_PRINT(channel); DEBUG_PRINT(" "); DEBUG_PRINT(param); DEBUG_PRINT(" "); DEBUG_PRINTLN(val); MidiUart2.sendCC(channel, param, val); } else if (dest >= NUM_MD_TRACKS) { MD.sendFXParam(param, val, MD_FX_ECHO + dest - NUM_MD_TRACKS); @@ -17,10 +21,7 @@ void PerfEncoder::send_param(uint8_t dest, uint8_t param, uint8_t val) { } } -void PerfEncoder::send_params(uint8_t cur_) { - PerfScene *s1 = &perf_data.scenes[active_scene_a]; - PerfScene *s2 = &perf_data.scenes[active_scene_b]; - +void PerfEncoder::send_params(uint8_t cur_, PerfScene *s1, PerfScene *s2) { PerfMorph morph; morph.populate(s1, s2); @@ -31,7 +32,7 @@ void PerfEncoder::send_params(uint8_t cur_) { DEBUG_PRINTLN("send para"); DEBUG_PRINTLN(f->max); DEBUG_PRINTLN(f->min); - + uint8_t val = 0; if (f->max == 255 || f->min == 255) { continue; @@ -49,12 +50,17 @@ void PerfEncoder::send_params(uint8_t cur_) { send_param(f->dest - 1, f->param, val); } } +void PerfEncoder::send() { + PerfScene *s1 = active_scene_a == 255 ? nullptr : &perf_data.scenes[active_scene_a]; + PerfScene *s2 = active_scene_b == 255 ? nullptr : &perf_data.scenes[active_scene_b]; + send_params(cur, s1, s2); +} int PerfEncoder::update(encoder_t *enc) { MCLEncoder::update(enc); // Update all params if (hasChanged()) { - send_params(cur); + send(); } return cur; } diff --git a/avr/cores/megacommand/MCL/PerfEncoder.h b/avr/cores/megacommand/MCL/PerfEncoder.h index ba49d9556..e76f2c7fe 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.h +++ b/avr/cores/megacommand/MCL/PerfEncoder.h @@ -16,9 +16,9 @@ class PerfEncoder : public MCLEncoder { PerfData perf_data; uint8_t active_scene_a = 0; uint8_t active_scene_b = 1; + void send(); void send_param(uint8_t dest, uint8_t param, uint8_t val); - void send_params(uint8_t cur_); - + void send_params(uint8_t cur_, PerfScene *s1, PerfScene *s2); /** Create a new range-limited encoder with max and min value, short name, initial value, and handling function. The initRangeEncoder diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index d65afbca6..c2cb25d75 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -1,5 +1,4 @@ #include "MCL_impl.h" -#include "ResourceManager.h" #include "MCLMemory.h" #define LEARN_MIN 1 @@ -28,8 +27,8 @@ void PerfPage::set_led_mask() { uint16_t mask = 0; PerfEncoder *e = perf_encoders[perf_id]; - SET_BIT16(mask, e->active_scene_a); - SET_BIT16(mask, e->active_scene_b); + if (e->active_scene_a < NUM_SCENES) { SET_BIT16(mask, e->active_scene_a); } + if (e->active_scene_b < NUM_SCENES) { SET_BIT16(mask, e->active_scene_b); } if (last_mask != mask) { MD.set_trigleds(mask, TRIGLED_EXCLUSIVENDYNAMIC); @@ -49,7 +48,10 @@ void PerfPage::set_led_mask() { last_mask = mask; } -void PerfPage::cleanup() { PerfPageParent::cleanup(); trig_interface.off(); } +void PerfPage::cleanup() { + PerfPageParent::cleanup(); + trig_interface.off(); +} void PerfPage::config_encoder_range(uint8_t i) { ((PerfEncoder *)encoders[i])->max = NUM_MD_TRACKS + 4 + 16; @@ -72,9 +74,9 @@ void PerfPage::config_encoders(uint8_t show_val) { encoders[2] = &fx_param3; encoders[3] = &fx_param4; - ((PerfEncoder *)encoders[0])->max = 127; + ((PerfEncoder *)encoders[0])->max = 127; - if (page_mode > PERF_DESTINATION) { + if (page_mode > PERF_DESTINATION) { if (learn) { uint8_t scene = learn - 1; @@ -90,8 +92,11 @@ void PerfPage::config_encoders(uint8_t show_val) { uint8_t v = p->val; - if (v == 255) { v = 0; } - else { v++; } + if (v == 255) { + v = 0; + } else { + v++; + } encoders[3]->cur = v; ((PerfEncoder *)encoders[3])->max = 128; @@ -111,10 +116,11 @@ void PerfPage::config_encoders(uint8_t show_val) { } if (!show_val) { - for (uint8_t i = 0; i < GUI_NUM_ENCODERS; i++) { - encoders[i]->old = encoders[i]->cur; - ((LightPage *)this)->encoders_used_clock[i] = slowclock + SHOW_VALUE_TIMEOUT + 1; - } + for (uint8_t i = 0; i < GUI_NUM_ENCODERS; i++) { + encoders[i]->old = encoders[i]->cur; + ((LightPage *)this)->encoders_used_clock[i] = + slowclock + SHOW_VALUE_TIMEOUT + 1; + } } } void PerfPage::update_params() { @@ -172,7 +178,6 @@ void PerfPage::display() { auto oldfont = oled_display.getFont(); - uint8_t x = mcl_gui.knob_x0 + 5; uint8_t y = 8; uint8_t lfo_height = 7; @@ -192,7 +197,6 @@ void PerfPage::display() { str1[1] = 'A' + perf_id; mcl_gui.draw_knob(0, encoders[0], str1); - if (page_mode > PERF_DESTINATION || learn) { draw_dest(1, encoders[1]->cur); draw_param(2, encoders[1]->cur, encoders[2]->cur); @@ -205,47 +209,52 @@ void PerfPage::display() { bool is_lock = encoders[3]->cur != 0; if (!is_lock) { str1 = "OFF"; - //Show the "non-lock" value + // Show the "non-lock" value uint8_t c = page_mode - 1; v = perf_encoders[perf_id]->perf_data.scenes[scene].params[c].val; - } - else { + } else { v -= 1; } bool show_value = mcl_gui.show_encoder_value(encoders[3]); - mcl_gui.draw_light_encoder(MCLGUI::knob_x0 + 3 * MCLGUI::knob_w + 7, 6, v, str1, is_lock, show_value); + mcl_gui.draw_light_encoder(MCLGUI::knob_x0 + 3 * MCLGUI::knob_w + 7, 6, v, + str1, is_lock, show_value); - } - else if (page_mode == PERF_DESTINATION) { - draw_dest(1, encoders[1]->cur, false); + } else if (page_mode == PERF_DESTINATION) { + draw_dest(1, encoders[1]->cur, false); draw_param(2, encoders[1]->cur, encoders[2]->cur); mcl_gui.draw_knob(3, encoders[3], "THR"); info2 = "CONTROL"; } - //oled_display.fillCircle(6, 6, 6, WHITE); - oled_display.fillRect(0,0,10,12, WHITE); - oled_display.setFont(&Elektrothic); - oled_display.setCursor(2, 10); - //oled_display.setCursor(4, 10); - oled_display.setTextColor(BLACK, WHITE); - oled_display.print((char) (0x3C + perf_id)); + // oled_display.fillCircle(6, 6, 6, WHITE); + oled_display.fillRect(0, 0, 10, 12, WHITE); + oled_display.setFont(&Elektrothic); + oled_display.setCursor(2, 10); + // oled_display.setCursor(4, 10); + oled_display.setTextColor(BLACK, WHITE); + oled_display.print((char)(0x3C + perf_id)); if (learn) { mcl_gui.draw_panel_number(scene + 1); } - oled_display.setTextColor(WHITE, BLACK); + oled_display.setTextColor(WHITE, BLACK); oled_display.setFont(oldfont); mcl_gui.draw_panel_labels(info1, info2); + if (trig_interface.is_key_down(MDX_KEY_LEFT) || trig_interface.is_key_down(MDX_KEY_RIGHT)) { + oled_display.setCursor(54, MCLGUI::pane_info2_y + 4); + oled_display.print(F("SELECT")); + } + oled_display.setCursor(80, MCLGUI::pane_info2_y + 4); char *str3 = "SCENE: A B"; - str3[7] = '1' + e->active_scene_a; - str3[12] = '1' + e->active_scene_b; + str3[7] = e->active_scene_a == 255 ? '-' : '1' + e->active_scene_a; + str3[12] = e->active_scene_b == 255 ? '-' : '1' + e->active_scene_b; oled_display.print(str3); oled_display.writeFastHLine(109, MCLGUI::pane_info2_y + 1, 5, WHITE); - oled_display.writeFastVLine(109 + ((e->cur * 5) / 128), MCLGUI::pane_info2_y ,3, WHITE); + oled_display.writeFastVLine(109 + ((e->cur * 5) / 128), MCLGUI::pane_info2_y, + 3, WHITE); oled_display.display(); } @@ -261,7 +270,7 @@ void PerfPage::learn_param(uint8_t dest, uint8_t param, uint8_t value) { int8_t range = max - min; uint8_t val = ((float)cur / (float)range) * 127.0f; perf_encoders[perf_id]->cur = val; - perf_encoders[perf_id]->send_params(val); + perf_encoders[perf_id]->send(); if (mcl.currentPage() == PERF_PAGE_0) { update_params(); } @@ -273,9 +282,9 @@ void PerfPage::learn_param(uint8_t dest, uint8_t param, uint8_t value) { uint8_t scene = learn - 1; uint8_t n = d->add_param(dest, param, scene, value); if (n < 255) { - if (dest + 1 <= NUM_MD_TRACKS) { - trig_interface.ignoreNextEvent(param - MD.currentSynthPage * 8 + 16); - } + if (dest + 1 <= NUM_MD_TRACKS) { + trig_interface.ignoreNextEvent(param - MD.currentSynthPage * 8 + 16); + } page_mode = n + 1; config_encoders(true); } @@ -300,17 +309,17 @@ void PerfPage::send_locks(uint8_t scene) { memset(params, 255, sizeof(params)); for (uint8_t n = 0; n < NUM_PERF_PARAMS; n++) { - PerfParam *p = &perf_encoders[perf_id]->perf_data.scenes[scene].params[n]; - uint8_t dest = p->dest; - uint8_t param = p->param; + PerfParam *p = &perf_encoders[perf_id]->perf_data.scenes[scene].params[n]; + uint8_t dest = p->dest; + uint8_t param = p->param; - if (param >= 24) { - continue; - } + if (param >= 24) { + continue; + } - if (dest == last_md_track + 1) { - params[param] = p->val; - } + if (dest == last_md_track + 1) { + params[param] = p->val; + } } seq_step_page.disable_paramupdate_events(); MD.activate_encoder_interface(params); @@ -328,22 +337,30 @@ bool PerfPage::handleEvent(gui_event_t *event) { auto device = midi_active_peering.get_device(port); uint8_t track = event->source - 128; - uint8_t id = track / NUM_SCENES; if (event->mask == EVENT_BUTTON_PRESSED) { - if (track > NUM_SCENES) { return true; } - uint8_t b = track - (track / NUM_SCENES)*NUM_SCENES; + if (track > NUM_SCENES) { + return true; + } + + PerfEncoder *e = perf_encoders[perf_id]; + + if (trig_interface.is_key_down(MDX_KEY_LEFT)) { + e->active_scene_a = e->active_scene_a == track ? 255 : track; + return true; + } + if (trig_interface.is_key_down(MDX_KEY_RIGHT)) { + e->active_scene_b = e->active_scene_b == track ? 255 : track; + return true; + } - learn = b + 1; - uint8_t scene = b; + learn = track + 1; + uint8_t scene = track; send_locks(scene); config_encoders(); if (page_mode == PERF_DESTINATION) { - //uint8_t id = perf_encoders[perf_id]->perf_data.find_empty() + 1; - //if (id == 255) { id = 16; } - id = 0; - page_mode = last_page_mode == 255 ? id : last_page_mode; - config_encoders(); + page_mode = last_page_mode == 255 ? 0 : last_page_mode; + config_encoders(); } } if (event->mask == EVENT_BUTTON_RELEASED) { @@ -361,7 +378,7 @@ bool PerfPage::handleEvent(gui_event_t *event) { if (EVENT_CMD(event)) { uint8_t key = event->source - 64; if (trig_interface.is_key_down(MDX_KEY_PATSONG)) { - return perf_menu_page.handleEvent(event); + return perf_menu_page.handleEvent(event); } switch (key) { // ENCODER BUTTONS @@ -373,60 +390,73 @@ bool PerfPage::handleEvent(gui_event_t *event) { case 0x15: case 0x16: case 0x17: { - if (learn == 0) { return true; } + if (learn == 0) { + return true; + } uint8_t scene = learn - 1; uint8_t param = MD.currentSynthPage * 8 + key - 0x10; PerfData *d = &perf_encoders[perf_id]->perf_data; if (event->mask == EVENT_BUTTON_RELEASED) { - d->clear_param_scene(last_md_track, param, scene); + d->clear_param_scene(last_md_track, param, scene); } if (event->mask == EVENT_BUTTON_PRESSED) { - if (d->find_match(last_md_track, param, scene) == 255) { - trig_interface.ignoreNextEvent(key); - d->add_param(last_md_track, param, scene, MD.kit.params[last_md_track][param]); - } + if (d->find_match(last_md_track, param, scene) == 255) { + trig_interface.ignoreNextEvent(key); + d->add_param(last_md_track, param, scene, + MD.kit.params[last_md_track][param]); + } } send_locks(scene); config_encoders(); return true; } - case MDX_KEY_NO: { + } + if (event->mask == EVENT_BUTTON_PRESSED) { + switch (key) { + case MDX_KEY_NO: { char *str = "CLEAR SCENE"; oled_display.textbox(str, ""); MD.popup_text(str); for (uint8_t n = 0; n < 4; n++) { - if (note_interface.is_note_on(n)) { perf_encoders[perf_id]->perf_data.clear_scene(n); } + if (note_interface.is_note_on(n)) { + perf_encoders[perf_id]->perf_data.clear_scene(n); + } } config_encoders(); break; - } - case MDX_KEY_YES: { + } + case MDX_KEY_YES: { + uint8_t a = note_interface.get_first_md_note(); PerfEncoder *e = perf_encoders[perf_id]; - uint8_t n; - for (n = 0; n < 4; n++) { - if (note_interface.is_note_on(n)) { - if (n > 1) { e->active_scene_b = n; e->cur = 127; break; } - else { e->active_scene_a = n; e->cur = 0; break; } - } + if (a >= NUM_SCENES) { + return true; } - e->send_params(e->cur); - break; - } - case MDX_KEY_UP: { - goto page_mode_up; - } - case MDX_KEY_DOWN: { - if (page_mode == 0) { page_mode = NUM_PERF_PARAMS; } - else { page_mode--; } - return true; - } + PerfScene *s1 = &e->perf_data.scenes[a], *s2 = nullptr; + e->send_params(0,s1,s2); + return true; + } + case MDX_KEY_UP: { + if (page_mode < NUM_PERF_PARAMS){ + page_mode++; + } + config_encoders(); + return true; + } + case MDX_KEY_DOWN: { + if (page_mode > 0) { + page_mode--; + } + config_encoders(); + return true; + } + } } return true; } if (EVENT_PRESSED(event, Buttons.BUTTON4)) { - page_mode_up: + page_mode_up: page_mode++; if (page_mode > NUM_PERF_PARAMS) { page_mode = 0; @@ -436,14 +466,14 @@ bool PerfPage::handleEvent(gui_event_t *event) { } if (EVENT_PRESSED(event, Buttons.BUTTON3)) { - show_menu = true; - encoders[0] = &seq_menu_value_encoder; - encoders[1] = &seq_menu_entry_encoder; - perf_menu_page.init(); + show_menu = true; + encoders[0] = &seq_menu_value_encoder; + encoders[1] = &seq_menu_entry_encoder; + perf_menu_page.init(); } if (EVENT_RELEASED(event, Buttons.BUTTON3)) { - show_menu = false; - config_encoders(); + show_menu = false; + config_encoders(); } return false; diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index 763c60722..f9164c31a 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -79,7 +79,7 @@ void SeqExtStepPage::init() { last_cur_x = -1; config_encoders(); - midi_events.setup_callbacks(); +// midi_events.setup_callbacks(); // Common menu entries seq_menu_page.menu.enable_entry(SEQ_MENU_TRACK, true); @@ -90,7 +90,7 @@ void SeqExtStepPage::init() { void SeqExtStepPage::cleanup() { SeqPage::cleanup(); - midi_events.remove_callbacks(); +// midi_events.remove_callbacks(); } #define MAX_FOV_W 96 From 2764ce87577b7ebd7ca73ac7f1d0fa600fac0ce6 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 2 Jul 2023 23:43:04 +1000 Subject: [PATCH 150/413] Perf GUI + scene copy/paste routines --- avr/cores/megacommand/MCL/MCLClipBoard.cpp | 12 ++++++++++++ avr/cores/megacommand/MCL/MCLClipBoard.h | 6 ++++++ avr/cores/megacommand/MCL/PerfPage.cpp | 16 ++++++++-------- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCLClipBoard.cpp b/avr/cores/megacommand/MCL/MCLClipBoard.cpp index 4cb105bfc..dd49bdeb2 100644 --- a/avr/cores/megacommand/MCL/MCLClipBoard.cpp +++ b/avr/cores/megacommand/MCL/MCLClipBoard.cpp @@ -69,6 +69,18 @@ bool MCLClipBoard::copy_sequencer(uint8_t offset) { return true; } +void MCLClipBoard::copy_scene(PerfScene *s1) { + memcpy(&scene, s1, sizeof(scene)); + copy_scene_active = 1; +} + +bool MCLClipBoard::paste_scene(PerfScene *s1) { + if (copy_scene_active) { + memcpy(s1, &scene, sizeof(scene)); + } + return copy_scene_active; +} + bool MCLClipBoard::copy_sequencer_track(uint8_t track) { DEBUG_PRINT_FN(); bool ret = false; diff --git a/avr/cores/megacommand/MCL/MCLClipBoard.h b/avr/cores/megacommand/MCL/MCLClipBoard.h index 4169073d6..2075a9b88 100644 --- a/avr/cores/megacommand/MCL/MCLClipBoard.h +++ b/avr/cores/megacommand/MCL/MCLClipBoard.h @@ -6,6 +6,7 @@ #include "SdFat.h" #include "Shared.h" #include "MDSeqTrackData.h" +#include "PerfData.h" #define FILENAME_CLIPBOARD "clipboard.tmp" class MCLClipBoard { @@ -16,15 +17,20 @@ class MCLClipBoard { int t_h; uint8_t copy_track; + bool copy_scene_active; Grid grids[NUM_GRIDS]; MDSeqStep steps[16]; + PerfScene scene; bool init(); bool open(); bool close(); + void copy_scene(PerfScene *s1); + bool paste_scene(PerfScene *s1); + bool copy_sequencer(uint8_t offset = 0); bool copy_sequencer_track(uint8_t track); bool paste_sequencer(uint8_t offset = 0); diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index c2cb25d75..3121cba23 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -197,7 +197,7 @@ void PerfPage::display() { str1[1] = 'A' + perf_id; mcl_gui.draw_knob(0, encoders[0], str1); - if (page_mode > PERF_DESTINATION || learn) { + if (learn) { draw_dest(1, encoders[1]->cur); draw_param(2, encoders[1]->cur, encoders[2]->cur); @@ -220,7 +220,7 @@ void PerfPage::display() { mcl_gui.draw_light_encoder(MCLGUI::knob_x0 + 3 * MCLGUI::knob_w + 7, 6, v, str1, is_lock, show_value); - } else if (page_mode == PERF_DESTINATION) { + } else { draw_dest(1, encoders[1]->cur, false); draw_param(2, encoders[1]->cur, encoders[2]->cur); mcl_gui.draw_knob(3, encoders[3], "THR"); @@ -339,7 +339,7 @@ bool PerfPage::handleEvent(gui_event_t *event) { uint8_t track = event->source - 128; if (event->mask == EVENT_BUTTON_PRESSED) { - if (track > NUM_SCENES) { + if (track >= NUM_SCENES) { return true; } @@ -438,17 +438,17 @@ bool PerfPage::handleEvent(gui_event_t *event) { return true; } case MDX_KEY_UP: { - if (page_mode < NUM_PERF_PARAMS){ + if (learn && page_mode < NUM_PERF_PARAMS){ page_mode++; - } - config_encoders(); + config_encoders(); + } return true; } case MDX_KEY_DOWN: { - if (page_mode > 0) { + if (learn && page_mode > 0) { page_mode--; + config_encoders(); } - config_encoders(); return true; } } From b74ebdbed2c0c5c6a4bc0e2aad98a10a0624403c Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 2 Jul 2023 23:43:30 +1000 Subject: [PATCH 151/413] Refactor for MDFXSeqTrack, with cache loading for MD FX --- avr/cores/megacommand/Elektron/Elektron.cpp | 9 +++++---- avr/cores/megacommand/MCL/MCLMemory.h | 2 +- avr/cores/megacommand/MCL/MCLSeq.cpp | 9 +++++++-- avr/cores/megacommand/MCL/MCLSeq.h | 5 ++++- avr/cores/megacommand/MCL/MDFXTrack.cpp | 15 ++++++++++++-- avr/cores/megacommand/MCL/MDFXTrack.h | 4 +++- avr/cores/megacommand/MCL/MDSeqTrack.cpp | 4 ++-- avr/cores/megacommand/MCL/MDSeqTrack.h | 2 +- avr/cores/megacommand/MCL/SeqTrack.h | 22 +++++++++++++++++++-- avr/cores/megacommand/MD/MD.cpp | 14 +++++++++---- avr/cores/megacommand/MD/MD.h | 1 + 11 files changed, 67 insertions(+), 20 deletions(-) diff --git a/avr/cores/megacommand/Elektron/Elektron.cpp b/avr/cores/megacommand/Elektron/Elektron.cpp index db227c709..2cd3079f8 100644 --- a/avr/cores/megacommand/Elektron/Elektron.cpp +++ b/avr/cores/megacommand/Elektron/Elektron.cpp @@ -245,13 +245,14 @@ void ElektronDevice::deactivate_track_select() { waitBlocking(); } -void ElektronDevice::undokit_sync() { - uint8_t data[2] = {0x70, 0x42}; +void ElektronDevice::undokit_sync(uint32_t track_mask) { + uint8_t a = track_mask & 0x7F; + uint8_t b = (track_mask >> 7) & 0x7F; + uint8_t c = (track_mask >> 14) & 0x7F; + uint8_t data[5] = { 0x70, 0x42, a, b, c }; sendRequest(data, sizeof(data)); } - - void ElektronDevice::set_trigleds(uint16_t bitmask, TrigLEDMode mode, uint8_t blink) { uint8_t data[5] = {0x70, 0x35, 0x00, 0x00, 0x00}; diff --git a/avr/cores/megacommand/MCL/MCLMemory.h b/avr/cores/megacommand/MCL/MCLMemory.h index d4b9ef1bd..220c22a98 100644 --- a/avr/cores/megacommand/MCL/MCLMemory.h +++ b/avr/cores/megacommand/MCL/MCLMemory.h @@ -35,7 +35,7 @@ constexpr size_t NUM_EXT_TRACKS = 0; constexpr size_t NUM_INSTRUMENT_TRACKS = (NUM_MD_TRACKS + NUM_EXT_TRACKS); -constexpr size_t NUM_AUX_TRACKS = 4; +constexpr size_t NUM_AUX_TRACKS = 3; constexpr size_t GRIDCHAIN_TRACK_NUM = 11; constexpr size_t MDFX_TRACK_NUM = 12; //position of MDFX track in grid diff --git a/avr/cores/megacommand/MCL/MCLSeq.cpp b/avr/cores/megacommand/MCL/MCLSeq.cpp index dd7fa0368..fb7dc610d 100644 --- a/avr/cores/megacommand/MCL/MCLSeq.cpp +++ b/avr/cores/megacommand/MCL/MCLSeq.cpp @@ -39,6 +39,9 @@ void MCLSeq::setup() { aux_tracks[i].speed = SEQ_SPEED_1X; } + mdfx_track.length = 16; + mdfx_track.speed = SEQ_SPEED_1X; + enable(); MidiClock.addOnMidiStopCallback( @@ -132,6 +135,7 @@ void MCLSeq::onMidiStartImmediateCallback() { for (uint8_t i = 0; i < NUM_AUX_TRACKS; i++) { aux_tracks[i].reset(); } + mdfx_track.reset(); #ifdef LFO_TRACKS for (uint8_t i = 0; i < num_lfo_tracks; i++) { @@ -264,15 +268,16 @@ void MCLSeq::seq() { MD.parallelTrig(MDSeqTrack::md_trig_mask, uart); } + mdfx_track.seq(); + if (MDSeqTrack::load_machine_cache) { MD.loadMachinesCache(MDSeqTrack::load_machine_cache); - MD.undokit_sync(); } - // Arp for (uint8_t i = 0; i < NUM_AUX_TRACKS; i++) { aux_tracks[i].seq(); } + // Arp #ifdef LFO_TRACKS for (uint8_t i = 0; i < num_lfo_tracks; i++) { diff --git a/avr/cores/megacommand/MCL/MCLSeq.h b/avr/cores/megacommand/MCL/MCLSeq.h index 9b26ef3fe..8f770e9a1 100644 --- a/avr/cores/megacommand/MCL/MCLSeq.h +++ b/avr/cores/megacommand/MCL/MCLSeq.h @@ -6,6 +6,7 @@ #include "MDSeqTrack.h" #include "ExtSeqTrack.h" #include "ArpSeqTrack.h" +#include "MDFXSeqTrack.h" //#include "MDTrack.h" #define SEQ_MUTE_ON 1 #define SEQ_MUTE_OFF 0 @@ -55,7 +56,9 @@ class MCLSeq : public ClockCallback { static constexpr uint8_t num_lfo_tracks = NUM_LFO_TRACKS; #endif - SeqTrack aux_tracks[NUM_AUX_TRACKS]; + SeqTrackBase aux_tracks[NUM_AUX_TRACKS]; + + MDFXSeqTrack mdfx_track; MCLSeqMidiEvents midi_events; bool state = false; diff --git a/avr/cores/megacommand/MCL/MDFXTrack.cpp b/avr/cores/megacommand/MCL/MDFXTrack.cpp index ad234cf96..74d1b3af2 100644 --- a/avr/cores/megacommand/MCL/MDFXTrack.cpp +++ b/avr/cores/megacommand/MCL/MDFXTrack.cpp @@ -7,12 +7,23 @@ void MDFXTrack::paste_track(uint8_t src_track, uint8_t dest_track, } void MDFXTrack::transition_send(uint8_t tracknumber, uint8_t slotnumber) { - send_fx(); +} + +void MDFXTrack::transition_load(uint8_t tracknumber, SeqTrack *seq_track, + uint8_t slotnumber) { + GridTrack::transition_load(tracknumber, seq_track, slotnumber); + // load_seq_data(seq_track); +} + +bool MDFXTrack::transition_cache(uint8_t tracknumber, uint8_t slotnumber) { + bool send = true; + MD.assignFXParamsBulk(reverb, send); + return true; } uint16_t MDFXTrack::calc_latency(uint8_t tracknumber) { bool send = false; - return send_fx(send); + return MD.assignFXParamsBulk(reverb, send); } uint16_t MDFXTrack::send_fx(bool send) { diff --git a/avr/cores/megacommand/MCL/MDFXTrack.h b/avr/cores/megacommand/MCL/MDFXTrack.h index 3d5677531..bfb6b47eb 100644 --- a/avr/cores/megacommand/MCL/MDFXTrack.h +++ b/avr/cores/megacommand/MCL/MDFXTrack.h @@ -44,7 +44,9 @@ class MDFXTrack : public AUXTrack, public MDFXData { void paste_track(uint8_t src_track, uint8_t dest_track, SeqTrack *seq_track); bool store_in_grid(uint8_t column, uint16_t row, SeqTrack *seq_track = nullptr, uint8_t merge = 0, bool online = false, Grid *grid = nullptr); - + void transition_load(uint8_t tracknumber, SeqTrack *seq_track, + uint8_t slotnumber); + bool transition_cache(uint8_t tracknumber, uint8_t slotnumber); void load_immediate(uint8_t tracknumber, SeqTrack *seq_track); virtual uint16_t get_track_size() { return sizeof(MDFXTrack); } diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.cpp b/avr/cores/megacommand/MCL/MDSeqTrack.cpp index 596c40ead..166f044d6 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/MDSeqTrack.cpp @@ -2,7 +2,7 @@ uint16_t MDSeqTrack::sync_cursor = 0; uint16_t MDSeqTrack::md_trig_mask = 0; -uint16_t MDSeqTrack::load_machine_cache = 0; +uint32_t MDSeqTrack::load_machine_cache = 0; void MDSeqTrack::set_length(uint8_t len, bool expand) { uint8_t old_length = length; @@ -84,7 +84,7 @@ void MDSeqTrack::load_cache() { MD.insertMachineInKit(track_number, &(t.machine),false); t.load_seq_data((SeqTrack *)this); - SET_BIT16(load_machine_cache, track_number); + SET_BIT32(load_machine_cache, track_number); } void MDSeqTrack::seq(MidiUartParent *uart_) { diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.h b/avr/cores/megacommand/MCL/MDSeqTrack.h index ee93539b7..40459a702 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.h +++ b/avr/cores/megacommand/MCL/MDSeqTrack.h @@ -25,7 +25,7 @@ class MDSeqTrack : public MDSeqTrackData, public SeqSlideTrack { static uint16_t sync_cursor; static uint16_t md_trig_mask; - static uint16_t load_machine_cache; + static uint32_t load_machine_cache; MDSeqTrack() : SeqSlideTrack() { active = MD_TRACK_TYPE; } ALWAYS_INLINE() void reset() { diff --git a/avr/cores/megacommand/MCL/SeqTrack.h b/avr/cores/megacommand/MCL/SeqTrack.h index c5da83319..8f7c0f8cd 100644 --- a/avr/cores/megacommand/MCL/SeqTrack.h +++ b/avr/cores/megacommand/MCL/SeqTrack.h @@ -74,6 +74,8 @@ class SeqTrackBase { uint8_t step_count; uint8_t mod12_counter; + uint8_t count_down; + SeqTrackBase() { active = EMPTY_TRACK_TYPE; record_mutes = false; } ALWAYS_INLINE() void step_count_inc() { @@ -85,6 +87,24 @@ class SeqTrackBase { } } + ALWAYS_INLINE() void seq() { + uint8_t timing_mid = get_timing_mid(); + mod12_counter++; + if (count_down) { + count_down--; + if (count_down == 0) { + reset(); + mod12_counter = 0; + } + } + if (mod12_counter == timing_mid) { + count_down = 0; + mod12_counter = 0; + step_count_inc(); + } + } + + ALWAYS_INLINE() void reset() { mod12_counter = -1; step_count = 0; @@ -199,8 +219,6 @@ class SeqTrack : public SeqTrackBase { uint8_t iterations_7; uint8_t iterations_8; - uint8_t count_down; - uint16_t cur_event_idx; uint8_t ignore_step; diff --git a/avr/cores/megacommand/MD/MD.cpp b/avr/cores/megacommand/MD/MD.cpp index 578c4cbb7..e3a5be65d 100644 --- a/avr/cores/megacommand/MD/MD.cpp +++ b/avr/cores/megacommand/MD/MD.cpp @@ -153,16 +153,16 @@ void MDClass::init_grid_devices(uint8_t device_idx) { } grid_idx = 1; - gdt.init(MDFX_TRACK_TYPE, GROUP_AUX, device_idx, &(mcl_seq.aux_tracks[0]), 0); + gdt.init(MDFX_TRACK_TYPE, GROUP_AUX, device_idx, (SeqTrack*) &(mcl_seq.mdfx_track), 0); add_track_to_grid(grid_idx, MDFX_TRACK_NUM, &gdt); - gdt.init(MDROUTE_TRACK_TYPE, GROUP_AUX, device_idx, &(mcl_seq.aux_tracks[1]), 0); + gdt.init(MDROUTE_TRACK_TYPE, GROUP_AUX, device_idx, (SeqTrack*) &(mcl_seq.aux_tracks[0]), 0); add_track_to_grid(grid_idx, MDFX_TRACK_NUM + 1, &gdt); - gdt.init(MDLFO_TRACK_TYPE, GROUP_AUX, device_idx, &(mcl_seq.aux_tracks[2]), 0); + gdt.init(MDLFO_TRACK_TYPE, GROUP_AUX, device_idx, (SeqTrack*) &(mcl_seq.aux_tracks[1]), 0); add_track_to_grid(grid_idx, MDFX_TRACK_NUM + 2, &gdt); - gdt.init(MDTEMPO_TRACK_TYPE, GROUP_TEMPO, device_idx, &(mcl_seq.aux_tracks[3]), 0); + gdt.init(MDTEMPO_TRACK_TYPE, GROUP_TEMPO, device_idx, (SeqTrack*) &(mcl_seq.aux_tracks[2]), 0); add_track_to_grid(grid_idx, MDFX_TRACK_NUM + 3, &gdt); } @@ -417,6 +417,12 @@ void MDClass::setSampleName(uint8_t slot, char *name) { sendRequest(data, 6); } +uint8_t MDClass::assignFXParamsBulk(uint8_t *values, bool send) { + uint8_t data[2 + 8 * 4] = {0x70, 0x5a}; + memcpy(&data[2], values, 8 * 4); + return sendRequest(data, sizeof(data), send); +} + uint8_t MDClass::sendFXParamsBulk(uint8_t *values, bool send) { uint8_t data[2 + 8 * 4] = {0x70, 0x61}; memcpy(&data[2], values, 8 * 4); diff --git a/avr/cores/megacommand/MD/MD.h b/avr/cores/megacommand/MD/MD.h index 882ad2d22..b2bbba170 100644 --- a/avr/cores/megacommand/MD/MD.h +++ b/avr/cores/megacommand/MD/MD.h @@ -139,6 +139,7 @@ class MDClass : public ElektronDevice { **/ // Send multiple values simultaneously (single sysex message); + uint8_t assignFXParamsBulk(uint8_t *values, bool send = true); uint8_t sendFXParamsBulk(uint8_t *values, bool send = true); uint8_t sendFXParams(uint8_t *values, uint8_t type, bool send = true); From be40adc4ef1521d947a9df720dad3e2830a5ce2e Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 3 Jul 2023 00:16:13 +1000 Subject: [PATCH 152/413] checkin --- avr/cores/megacommand/MCL/MDFXSeqTrack.h | 34 ++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 avr/cores/megacommand/MCL/MDFXSeqTrack.h diff --git a/avr/cores/megacommand/MCL/MDFXSeqTrack.h b/avr/cores/megacommand/MCL/MDFXSeqTrack.h new file mode 100644 index 000000000..1f8aed777 --- /dev/null +++ b/avr/cores/megacommand/MCL/MDFXSeqTrack.h @@ -0,0 +1,34 @@ +/* Justin Mammarella jmamma@gmail.com 2018 */ + +#ifndef MDFXSEQTRACK_H__ +#define MDFXSEQTRACK_H__ + +#include "MCLMemory.h" +// #include "MidiActivePeering.h" +#include "MidiUartParent.h" +#include "WProgram.h" + +class MDFXSeqTrack : public SeqTrackBase { + +public: + MDFXSeqTrack() { SeqTrackBase::reset(); } + + ALWAYS_INLINE() void seq() { + uint8_t timing_mid = get_timing_mid(); + mod12_counter++; + if (mod12_counter == timing_mid) { + count_down = 0; + mod12_counter = 0; + step_count_inc(); + } + if (count_down) { + count_down--; + if (count_down == 0) { + MDSeqTrack::load_machine_cache |= (0b1111 << 16); + reset(); + mod12_counter = 0; + } + } + } +}; +#endif /* MDFXSEQTRACK_H__ */ From 303635334920b28971c02b7a0194b291fcfd58ca Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 3 Jul 2023 12:10:38 +1000 Subject: [PATCH 153/413] fix count_down --- avr/cores/megacommand/MCL/MDFXSeqTrack.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/MDFXSeqTrack.h b/avr/cores/megacommand/MCL/MDFXSeqTrack.h index 1f8aed777..62a7d9633 100644 --- a/avr/cores/megacommand/MCL/MDFXSeqTrack.h +++ b/avr/cores/megacommand/MCL/MDFXSeqTrack.h @@ -17,7 +17,6 @@ class MDFXSeqTrack : public SeqTrackBase { uint8_t timing_mid = get_timing_mid(); mod12_counter++; if (mod12_counter == timing_mid) { - count_down = 0; mod12_counter = 0; step_count_inc(); } @@ -29,6 +28,7 @@ class MDFXSeqTrack : public SeqTrackBase { mod12_counter = 0; } } + } }; #endif /* MDFXSEQTRACK_H__ */ From f32c001e15add5ccfb286fd3095377285bdb5dd6 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 3 Jul 2023 12:39:16 +1000 Subject: [PATCH 154/413] uint32_t --- avr/cores/megacommand/Elektron/Elektron.cpp | 7 ++----- avr/cores/megacommand/MCL/MDFXSeqTrack.h | 2 +- avr/cores/megacommand/MD/MD.cpp | 2 +- avr/cores/megacommand/MD/MD.h | 2 +- 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/avr/cores/megacommand/Elektron/Elektron.cpp b/avr/cores/megacommand/Elektron/Elektron.cpp index 2cd3079f8..f9c3c1698 100644 --- a/avr/cores/megacommand/Elektron/Elektron.cpp +++ b/avr/cores/megacommand/Elektron/Elektron.cpp @@ -245,11 +245,8 @@ void ElektronDevice::deactivate_track_select() { waitBlocking(); } -void ElektronDevice::undokit_sync(uint32_t track_mask) { - uint8_t a = track_mask & 0x7F; - uint8_t b = (track_mask >> 7) & 0x7F; - uint8_t c = (track_mask >> 14) & 0x7F; - uint8_t data[5] = { 0x70, 0x42, a, b, c }; +void ElektronDevice::undokit_sync() { + uint8_t data[2] = { 0x70, 0x42 }; sendRequest(data, sizeof(data)); } diff --git a/avr/cores/megacommand/MCL/MDFXSeqTrack.h b/avr/cores/megacommand/MCL/MDFXSeqTrack.h index 62a7d9633..363c07eb6 100644 --- a/avr/cores/megacommand/MCL/MDFXSeqTrack.h +++ b/avr/cores/megacommand/MCL/MDFXSeqTrack.h @@ -23,7 +23,7 @@ class MDFXSeqTrack : public SeqTrackBase { if (count_down) { count_down--; if (count_down == 0) { - MDSeqTrack::load_machine_cache |= (0b1111 << 16); + MDSeqTrack::load_machine_cache |= ((uint32_t) 0b1111 << 16); reset(); mod12_counter = 0; } diff --git a/avr/cores/megacommand/MD/MD.cpp b/avr/cores/megacommand/MD/MD.cpp index e3a5be65d..3dd70ce9b 100644 --- a/avr/cores/megacommand/MD/MD.cpp +++ b/avr/cores/megacommand/MD/MD.cpp @@ -713,7 +713,7 @@ uint8_t MDClass::assignMachineBulk(uint8_t track, MDMachine *machine, return sendRequest(data, i, send); } -void MDClass::loadMachinesCache(uint16_t track_mask) { +void MDClass::loadMachinesCache(uint32_t track_mask) { DEBUG_PRINTLN("load machine cache"); uint8_t a = track_mask & 0x7F; uint8_t b = (track_mask >> 7) & 0x7F; diff --git a/avr/cores/megacommand/MD/MD.h b/avr/cores/megacommand/MD/MD.h index b2bbba170..cae410063 100644 --- a/avr/cores/megacommand/MD/MD.h +++ b/avr/cores/megacommand/MD/MD.h @@ -265,7 +265,7 @@ class MDClass : public ElektronDevice { return sendMachine(track + 16, machine, send_level, send); } - void loadMachinesCache(uint16_t track_mask); + void loadMachinesCache(uint32_t track_mask); /** * Inserts a machine in to the MDKit object From fb5dd84488ac373d62ee4b89d18668acf2d0f2a1 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 3 Jul 2023 15:07:20 +1000 Subject: [PATCH 155/413] loadmachine cache changes --- avr/cores/megacommand/MCL/GridTask.cpp | 141 +++++++++++------------ avr/cores/megacommand/MCL/GridTask.h | 2 +- avr/cores/megacommand/MCL/MCLSeq.cpp | 3 +- avr/cores/megacommand/MCL/MDSeqTrack.cpp | 7 +- avr/cores/megacommand/MCL/MDSeqTrack.h | 2 +- avr/cores/megacommand/MD/MD.cpp | 4 +- avr/cores/megacommand/MD/MD.h | 2 +- 7 files changed, 80 insertions(+), 81 deletions(-) diff --git a/avr/cores/megacommand/MCL/GridTask.cpp b/avr/cores/megacommand/MCL/GridTask.cpp index 6873a291a..a74178c6d 100644 --- a/avr/cores/megacommand/MCL/GridTask.cpp +++ b/avr/cores/megacommand/MCL/GridTask.cpp @@ -7,25 +7,14 @@ void GridTask::setup(uint16_t _interval) { interval = _interval; } void GridTask::destroy() {} void GridTask::gui_update() { - auto &active_track = mcl_seq.md_tracks[last_md_track]; - if (mcl.currentPage() == SEQ_STEP_PAGE && - IS_BIT_SET(MDSeqTrack::sync_cursor, last_md_track)) { - MD.sync_seqtrack(active_track.length, active_track.speed, - active_track.length - 1); - } - grid_page.set_active_row(last_active_row); // send led update - MD.draw_pattern_idx(last_active_row, next_active_row, chain_behaviour); -} - -void GridTask::sync_cursor() { - if (MDSeqTrack::sync_cursor) { + if (MDSeqTrack::gui_update) { if (MidiClock.state == 2) { if (last_active_row < GRID_LENGTH) { - gui_update(); - MD.setKitName(kit_names[0]); + grid_page.set_active_row(last_active_row); // send led update + MD.draw_pattern_idx(last_active_row, next_active_row, chain_behaviour); } } - MDSeqTrack::sync_cursor = 0; + MDSeqTrack::gui_update = 0; } } @@ -38,13 +27,13 @@ void GridTask::run() { trig_interface.check_key_throttle(); if (stop_hard_callback) { - mcl_actions_callbacks.StopHardCallback(); - stop_hard_callback = false; - load_queue.init(); - return; - } + mcl_actions_callbacks.StopHardCallback(); + stop_hard_callback = false; + load_queue.init(); + return; + } - sync_cursor(); + gui_update(); if (!load_queue.is_empty()) { uint8_t mode; @@ -57,7 +46,11 @@ void GridTask::run() { if (row_select_array[n] < 128) { track_select[n] = 1; } - DEBUG_PRINT(n); DEBUG_PRINT(" "); DEBUG_PRINT(track_select[n]); DEBUG_PRINT(" "); DEBUG_PRINTLN(row_select_array[n]); + DEBUG_PRINT(n); + DEBUG_PRINT(" "); + DEBUG_PRINT(track_select[n]); + DEBUG_PRINT(" "); + DEBUG_PRINTLN(row_select_array[n]); } mcl_actions.write_original = 1; mcl_actions.load_tracks(255, track_select, row_select_array, mode); @@ -65,8 +58,7 @@ void GridTask::run() { GridTask::transition_handler(); } -void GridTask::transition_handler() { - +void GridTask::update_transition_details(uint8_t last_slot, uint8_t last_row) { MidiDevice *devs[2] = { midi_active_peering.get_device(UART1_PORT), midi_active_peering.get_device(UART2_PORT), @@ -76,6 +68,28 @@ void GridTask::transition_handler() { devs[1]->asElektronDevice(), }; + last_active_row = last_row; + GridRowHeader row_header; + proj.read_grid_row_header(&row_header, last_active_row); + uint8_t dev_idx = 0; + + uint8_t len = elektron_devs[0]->sysex_protocol.kitname_length; + + if (row_header.active) { + memcpy(kit_names[dev_idx], row_header.name, len); + kit_names[dev_idx][len - 1] = '\0'; + } else { + strcpy(kit_names[dev_idx], "NEW_KIT"); + } +} + +void GridTask::transition_handler() { + + MidiDevice *devs[2] = { + midi_active_peering.get_device(UART1_PORT), + midi_active_peering.get_device(UART2_PORT), + }; + bool send_device[2] = {0}; uint8_t slots_changed[NUM_SLOTS]; @@ -86,19 +100,17 @@ void GridTask::transition_handler() { uint8_t div32th_margin = 6; - GUI.removeTask(&grid_task); - //240ms headroom = 0.240 * (MidiClock.get_tempo()* 0.133333333333 - // = 0.032 * MidiClock.get_tempo() + // 240ms headroom = 0.240 * (MidiClock.get_tempo()* 0.133333333333 + // = 0.032 * MidiClock.get_tempo() // while (MidiClock.clock_less_than( MidiClock.div32th_counter + 0.032 * MidiClock.get_tempo(), (uint32_t)mcl_actions.next_transition * 2) <= 0) { - float div32th_per_second = MidiClock.get_tempo() * 0.133333333333f; - float div32th_time = 1.0 / div32th_per_second; - + float div32th_per_second = MidiClock.get_tempo() * 0.133333333333f; + float div32th_time = 1.0 / div32th_per_second; if (MidiClock.state != 2 || mcl_actions.next_transition == (uint16_t)-1) { break; @@ -110,15 +122,18 @@ void GridTask::transition_handler() { DEBUG_PRINTLN((int)SP); uint8_t row = 255; - + uint8_t last_slot = 255; for (uint8_t n = 0; n < NUM_SLOTS; n++) { slots_changed[n] = 255; DEBUG_PRINTLN(n); - DEBUG_PRINT(mcl_actions.next_transition); DEBUG_PRINT(" "); DEBUG_PRINTLN(mcl_actions.next_transitions[n]); + DEBUG_PRINT(mcl_actions.next_transition); + DEBUG_PRINT(" "); + DEBUG_PRINTLN(mcl_actions.next_transitions[n]); if ((mcl_actions.links[n].loops == 0) || - (grid_page.active_slots[n] == SLOT_DISABLED) || (mcl_actions.next_transition != mcl_actions.next_transitions[n])) + (grid_page.active_slots[n] == SLOT_DISABLED) || + (mcl_actions.next_transition != mcl_actions.next_transitions[n])) continue; GridDeviceTrack *gdt = mcl_actions.get_grid_dev_track(n); @@ -131,6 +146,7 @@ void GridTask::transition_handler() { if (link_load(n, track_idx, slots_changed, track_select_array, gdt)) { send_device[device_idx] = true; + last_slot = n; } if (row == 255) { @@ -138,6 +154,10 @@ void GridTask::transition_handler() { } } + if (last_slot != 255 && send_device[0]) { + update_transition_details(last_slot, slots_changed[last_slot]); + } + DEBUG_PRINTLN(F("sending tracks")); bool wait; @@ -178,11 +198,11 @@ void GridTask::transition_handler() { MidiClock.div192th_counter, go_step)) != 0) && (MidiClock.div192th_counter < go_step) && (MidiClock.state == 2)) { - MidiUartParent::handle_midi_lock = 1; - handleIncomingMidi(); - MidiUartParent::handle_midi_lock = 0; + MidiUartParent::handle_midi_lock = 1; + handleIncomingMidi(); + MidiUartParent::handle_midi_lock = 0; if ((float)diff > (tempo * 0.8f) * 0.08) { - GUI.loop(); + GUI.loop(); } } } @@ -206,8 +226,8 @@ void GridTask::transition_handler() { DEBUG_PRINTLN("time"); DEBUG_PRINTLN(t); + // Once tracks are cached, we can calculate their next transition - uint8_t last_slot = 255; for (uint8_t n = 0; n < NUM_SLOTS; n++) { GridDeviceTrack *gdt = mcl_actions.get_grid_dev_track(n); @@ -218,39 +238,22 @@ void GridTask::transition_handler() { bool ignore_chain_settings = true; bool auto_check = true; if (track_select_array[n] > 0) { - last_slot = n; ignore_chain_settings = false; auto_check = false; - } - else if (mcl_actions.chains[n].mode == LOAD_AUTO && mcl_actions.links[n].loops == 0) { + } else if (mcl_actions.chains[n].mode == LOAD_AUTO && + mcl_actions.links[n].loops == 0) { mcl_actions.next_transitions[n] = -1; continue; } mcl_actions.calc_next_slot_transition(n, ignore_chain_settings); } + next_active_row = mcl_actions.links[last_slot].row; + chain_behaviour = mcl_actions.chains[last_slot].mode > 1; + DEBUG_PRINTLN("ROWS"); + DEBUG_PRINTLN(next_active_row); + DEBUG_PRINTLN(last_active_row); - if (last_slot != 255 && slots_changed[last_slot] < GRID_LENGTH) { - last_active_row = slots_changed[last_slot]; - next_active_row = mcl_actions.links[last_slot].row; - chain_behaviour = mcl_actions.chains[last_slot].mode > 1; - - GridRowHeader row_header; - proj.read_grid_row_header(&row_header, last_active_row); - uint8_t dev_idx = 0; - - if (elektron_devs[dev_idx]) { - uint8_t len = elektron_devs[dev_idx]->sysex_protocol.kitname_length; - - if (row_header.active) { - memcpy(kit_names[dev_idx], row_header.name, len); - kit_names[dev_idx][len - 1] = '\0'; - } else { - strcpy(kit_names[dev_idx], "NEW_KIT"); - } - } - } - - sync_cursor(); + gui_update(); mcl_actions.calc_next_transition(); mcl_actions.calc_latency(); } @@ -274,16 +277,8 @@ bool GridTask::link_load(uint8_t n, uint8_t track_idx, uint8_t *slots_changed, return false; } -bool GridTask::transition_load(uint8_t n, uint8_t track_idx, GridDeviceTrack *gdt) { - MidiDevice *devs[2] = { - midi_active_peering.get_device(UART1_PORT), - midi_active_peering.get_device(UART2_PORT), - }; - ElektronDevice *elektron_devs[2] = { - devs[0]->asElektronDevice(), - devs[1]->asElektronDevice(), - }; - +bool GridTask::transition_load(uint8_t n, uint8_t track_idx, + GridDeviceTrack *gdt) { EmptyTrack empty_track; auto *pmem_track = diff --git a/avr/cores/megacommand/MCL/GridTask.h b/avr/cores/megacommand/MCL/GridTask.h index 8146923fd..e7962abb3 100644 --- a/avr/cores/megacommand/MCL/GridTask.h +++ b/avr/cores/megacommand/MCL/GridTask.h @@ -82,7 +82,6 @@ class GridTask : public Task { virtual void run(); virtual void destroy(); - void sync_cursor(); void init() { reset_midi_states(); load_queue.init(); @@ -97,6 +96,7 @@ class GridTask : public Task { } void gui_update(); + void update_transition_details(uint8_t last_slot, uint8_t last_row); void transition_handler(); bool link_load(uint8_t n, uint8_t track_idx, uint8_t *slots_changed, uint8_t *track_select_array, GridDeviceTrack *gdt); diff --git a/avr/cores/megacommand/MCL/MCLSeq.cpp b/avr/cores/megacommand/MCL/MCLSeq.cpp index fb7dc610d..2c2de9ae2 100644 --- a/avr/cores/megacommand/MCL/MCLSeq.cpp +++ b/avr/cores/megacommand/MCL/MCLSeq.cpp @@ -271,7 +271,8 @@ void MCLSeq::seq() { mdfx_track.seq(); if (MDSeqTrack::load_machine_cache) { - MD.loadMachinesCache(MDSeqTrack::load_machine_cache); + MD.setKitName(grid_task.kit_names[0], uart); + MD.loadMachinesCache(MDSeqTrack::load_machine_cache, uart); } for (uint8_t i = 0; i < NUM_AUX_TRACKS; i++) { diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.cpp b/avr/cores/megacommand/MCL/MDSeqTrack.cpp index 166f044d6..f5691de44 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/MDSeqTrack.cpp @@ -1,6 +1,6 @@ #include "MCL_impl.h" -uint16_t MDSeqTrack::sync_cursor = 0; +bool MDSeqTrack::gui_update = 0; uint16_t MDSeqTrack::md_trig_mask = 0; uint32_t MDSeqTrack::load_machine_cache = 0; @@ -112,7 +112,10 @@ void MDSeqTrack::seq(MidiUartParent *uart_) { if (count_down == 0) { reset(); mod12_counter = 0; - SET_BIT16(sync_cursor, track_number); + if (mcl.currentPage() == SEQ_STEP_PAGE && last_md_track == track_number) { + MD.sync_seqtrack(length, speed, length - 1, uart); + } + gui_update = 1; } else if (count_down < track_number / 4 + 1) { goto end; diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.h b/avr/cores/megacommand/MCL/MDSeqTrack.h index 40459a702..d287b2df8 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.h +++ b/avr/cores/megacommand/MCL/MDSeqTrack.h @@ -23,7 +23,7 @@ class MDSeqTrack : public MDSeqTrackData, public SeqSlideTrack { uint8_t locks_params_orig[NUM_LOCKS]; - static uint16_t sync_cursor; + static bool gui_update; static uint16_t md_trig_mask; static uint32_t load_machine_cache; diff --git a/avr/cores/megacommand/MD/MD.cpp b/avr/cores/megacommand/MD/MD.cpp index 3dd70ce9b..64627fe47 100644 --- a/avr/cores/megacommand/MD/MD.cpp +++ b/avr/cores/megacommand/MD/MD.cpp @@ -713,13 +713,13 @@ uint8_t MDClass::assignMachineBulk(uint8_t track, MDMachine *machine, return sendRequest(data, i, send); } -void MDClass::loadMachinesCache(uint32_t track_mask) { +void MDClass::loadMachinesCache(uint32_t track_mask, MidiUartParent *uart_) { DEBUG_PRINTLN("load machine cache"); uint8_t a = track_mask & 0x7F; uint8_t b = (track_mask >> 7) & 0x7F; uint8_t c = (track_mask >> 14) & 0x7F; uint8_t data[5] = { 0x70, 0x62, a, b, c }; - sendRequest(data, countof(data)); + sendRequest(data, countof(data), uart_); } void MDClass::setOrigParams(uint8_t track, MDMachine *machine) { diff --git a/avr/cores/megacommand/MD/MD.h b/avr/cores/megacommand/MD/MD.h index cae410063..a944c8abe 100644 --- a/avr/cores/megacommand/MD/MD.h +++ b/avr/cores/megacommand/MD/MD.h @@ -265,7 +265,7 @@ class MDClass : public ElektronDevice { return sendMachine(track + 16, machine, send_level, send); } - void loadMachinesCache(uint32_t track_mask); + void loadMachinesCache(uint32_t track_mask, MidiUartParent *uart_ = nullptr); /** * Inserts a machine in to the MDKit object From b97681d3d5aec6803d1be5318601f08ab836402f Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 3 Jul 2023 15:36:21 +1000 Subject: [PATCH 156/413] checkin --- avr/cores/megacommand/MCL/GridTask.cpp | 7 ++++--- avr/cores/megacommand/MCL/GridTask.h | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/avr/cores/megacommand/MCL/GridTask.cpp b/avr/cores/megacommand/MCL/GridTask.cpp index a74178c6d..3bfe4a7bc 100644 --- a/avr/cores/megacommand/MCL/GridTask.cpp +++ b/avr/cores/megacommand/MCL/GridTask.cpp @@ -12,6 +12,7 @@ void GridTask::gui_update() { if (last_active_row < GRID_LENGTH) { grid_page.set_active_row(last_active_row); // send led update MD.draw_pattern_idx(last_active_row, next_active_row, chain_behaviour); + DEBUG_PRINTLN("draw pattern idx"); } } MDSeqTrack::gui_update = 0; @@ -58,7 +59,7 @@ void GridTask::run() { GridTask::transition_handler(); } -void GridTask::update_transition_details(uint8_t last_slot, uint8_t last_row) { +void GridTask::update_transition_details(uint8_t last_slot) { MidiDevice *devs[2] = { midi_active_peering.get_device(UART1_PORT), midi_active_peering.get_device(UART2_PORT), @@ -68,7 +69,6 @@ void GridTask::update_transition_details(uint8_t last_slot, uint8_t last_row) { devs[1]->asElektronDevice(), }; - last_active_row = last_row; GridRowHeader row_header; proj.read_grid_row_header(&row_header, last_active_row); uint8_t dev_idx = 0; @@ -155,7 +155,7 @@ void GridTask::transition_handler() { } if (last_slot != 255 && send_device[0]) { - update_transition_details(last_slot, slots_changed[last_slot]); + update_transition_details(last_slot); } DEBUG_PRINTLN(F("sending tracks")); @@ -247,6 +247,7 @@ void GridTask::transition_handler() { } mcl_actions.calc_next_slot_transition(n, ignore_chain_settings); } + last_active_row = slots_changed[last_slot]; next_active_row = mcl_actions.links[last_slot].row; chain_behaviour = mcl_actions.chains[last_slot].mode > 1; DEBUG_PRINTLN("ROWS"); diff --git a/avr/cores/megacommand/MCL/GridTask.h b/avr/cores/megacommand/MCL/GridTask.h index e7962abb3..1a03a15c7 100644 --- a/avr/cores/megacommand/MCL/GridTask.h +++ b/avr/cores/megacommand/MCL/GridTask.h @@ -96,7 +96,7 @@ class GridTask : public Task { } void gui_update(); - void update_transition_details(uint8_t last_slot, uint8_t last_row); + void update_transition_details(uint8_t last_slot); void transition_handler(); bool link_load(uint8_t n, uint8_t track_idx, uint8_t *slots_changed, uint8_t *track_select_array, GridDeviceTrack *gdt); From 2ba973f26aa68e8b729c37b06435c4e127587799 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 3 Jul 2023 16:31:03 +1000 Subject: [PATCH 157/413] row_update --- avr/cores/megacommand/MCL/GridTask.cpp | 32 +++++++++++++----------- avr/cores/megacommand/MCL/GridTask.h | 4 +-- avr/cores/megacommand/MCL/MCLActions.cpp | 4 +-- 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/avr/cores/megacommand/MCL/GridTask.cpp b/avr/cores/megacommand/MCL/GridTask.cpp index 3bfe4a7bc..40874a78c 100644 --- a/avr/cores/megacommand/MCL/GridTask.cpp +++ b/avr/cores/megacommand/MCL/GridTask.cpp @@ -6,13 +6,16 @@ void GridTask::setup(uint16_t _interval) { interval = _interval; } void GridTask::destroy() {} +void GridTask::row_update() { + grid_page.set_active_row(last_active_row); // send led update + MD.draw_pattern_idx(last_active_row, next_active_row, chain_behaviour); +} + void GridTask::gui_update() { if (MDSeqTrack::gui_update) { if (MidiClock.state == 2) { if (last_active_row < GRID_LENGTH) { - grid_page.set_active_row(last_active_row); // send led update - MD.draw_pattern_idx(last_active_row, next_active_row, chain_behaviour); - DEBUG_PRINTLN("draw pattern idx"); + row_update(); } } MDSeqTrack::gui_update = 0; @@ -59,7 +62,7 @@ void GridTask::run() { GridTask::transition_handler(); } -void GridTask::update_transition_details(uint8_t last_slot) { +void GridTask::update_transition_details() { MidiDevice *devs[2] = { midi_active_peering.get_device(UART1_PORT), midi_active_peering.get_device(UART2_PORT), @@ -70,7 +73,7 @@ void GridTask::update_transition_details(uint8_t last_slot) { }; GridRowHeader row_header; - proj.read_grid_row_header(&row_header, last_active_row); + proj.read_grid_row_header(&row_header, next_active_row); uint8_t dev_idx = 0; uint8_t len = elektron_devs[0]->sysex_protocol.kitname_length; @@ -146,7 +149,6 @@ void GridTask::transition_handler() { if (link_load(n, track_idx, slots_changed, track_select_array, gdt)) { send_device[device_idx] = true; - last_slot = n; } if (row == 255) { @@ -154,8 +156,10 @@ void GridTask::transition_handler() { } } - if (last_slot != 255 && send_device[0]) { - update_transition_details(last_slot); + if (send_device[0]) { + //Send kitName before tracks are cache-loaded in MD. + //This allows the kitName to be stored in the undokit. + update_transition_details(); } DEBUG_PRINTLN(F("sending tracks")); @@ -238,6 +242,7 @@ void GridTask::transition_handler() { bool ignore_chain_settings = true; bool auto_check = true; if (track_select_array[n] > 0) { + last_slot = n; ignore_chain_settings = false; auto_check = false; } else if (mcl_actions.chains[n].mode == LOAD_AUTO && @@ -247,12 +252,11 @@ void GridTask::transition_handler() { } mcl_actions.calc_next_slot_transition(n, ignore_chain_settings); } - last_active_row = slots_changed[last_slot]; - next_active_row = mcl_actions.links[last_slot].row; - chain_behaviour = mcl_actions.chains[last_slot].mode > 1; - DEBUG_PRINTLN("ROWS"); - DEBUG_PRINTLN(next_active_row); - DEBUG_PRINTLN(last_active_row); + if (last_slot != 255 && slots_changed[last_slot] < GRID_LENGTH) { + last_active_row = slots_changed[last_slot]; + next_active_row = mcl_actions.links[last_slot].row; + chain_behaviour = mcl_actions.chains[last_slot].mode > 1; + } gui_update(); mcl_actions.calc_next_transition(); diff --git a/avr/cores/megacommand/MCL/GridTask.h b/avr/cores/megacommand/MCL/GridTask.h index 1a03a15c7..74c21ea97 100644 --- a/avr/cores/megacommand/MCL/GridTask.h +++ b/avr/cores/megacommand/MCL/GridTask.h @@ -94,9 +94,9 @@ class GridTask : public Task { //midi_row_select = 255; midi_load = false; } - + void row_update(); void gui_update(); - void update_transition_details(uint8_t last_slot); + void update_transition_details(); void transition_handler(); bool link_load(uint8_t n, uint8_t track_idx, uint8_t *slots_changed, uint8_t *track_select_array, GridDeviceTrack *gdt); diff --git a/avr/cores/megacommand/MCL/MCLActions.cpp b/avr/cores/megacommand/MCL/MCLActions.cpp index 0c2199fec..7c6bd85ae 100644 --- a/avr/cores/megacommand/MCL/MCLActions.cpp +++ b/avr/cores/megacommand/MCL/MCLActions.cpp @@ -452,7 +452,7 @@ void MCLActions::manual_transition(uint8_t *slot_select_array, grid_task.next_active_row = row; grid_task.chain_behaviour = false; - grid_task.gui_update(); + grid_task.row_update(); if (recalc_latency) { calc_latency(); @@ -665,7 +665,7 @@ void MCLActions::send_tracks_to_devices(uint8_t *slot_select_array, grid_task.next_active_row = links[last_slot].row; grid_task.chain_behaviour = chains[last_slot].mode > 1; } - grid_task.gui_update(); + grid_task.row_update(); calc_next_transition(); calc_latency(); From 9a90750497283be54bd0b8421ba7092a56163fde Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 3 Jul 2023 16:58:04 +1000 Subject: [PATCH 158/413] Revert: MD.sync_seqtrack to occur in GUI loop as before --- avr/cores/megacommand/MCL/GridTask.cpp | 4 ++++ avr/cores/megacommand/MCL/MDSeqTrack.cpp | 7 ++----- avr/cores/megacommand/MCL/MDSeqTrack.h | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/avr/cores/megacommand/MCL/GridTask.cpp b/avr/cores/megacommand/MCL/GridTask.cpp index 40874a78c..40b44d91d 100644 --- a/avr/cores/megacommand/MCL/GridTask.cpp +++ b/avr/cores/megacommand/MCL/GridTask.cpp @@ -15,6 +15,10 @@ void GridTask::gui_update() { if (MDSeqTrack::gui_update) { if (MidiClock.state == 2) { if (last_active_row < GRID_LENGTH) { + if (mcl.currentPage() == SEQ_STEP_PAGE && IS_BIT_SET16(MDSeqTrack::gui_update,last_md_track)) { + auto active_track = mcl_seq.md_tracks[last_md_track]; + MD.sync_seqtrack(active_track.length, active_track.speed, active_track.length - 1); + } row_update(); } } diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.cpp b/avr/cores/megacommand/MCL/MDSeqTrack.cpp index f5691de44..005577fc9 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/MDSeqTrack.cpp @@ -1,6 +1,6 @@ #include "MCL_impl.h" -bool MDSeqTrack::gui_update = 0; +uint16_t MDSeqTrack::gui_update = 0; uint16_t MDSeqTrack::md_trig_mask = 0; uint32_t MDSeqTrack::load_machine_cache = 0; @@ -112,10 +112,7 @@ void MDSeqTrack::seq(MidiUartParent *uart_) { if (count_down == 0) { reset(); mod12_counter = 0; - if (mcl.currentPage() == SEQ_STEP_PAGE && last_md_track == track_number) { - MD.sync_seqtrack(length, speed, length - 1, uart); - } - gui_update = 1; + SET_BIT16(gui_update,track_number); } else if (count_down < track_number / 4 + 1) { goto end; diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.h b/avr/cores/megacommand/MCL/MDSeqTrack.h index d287b2df8..e239b2d14 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.h +++ b/avr/cores/megacommand/MCL/MDSeqTrack.h @@ -23,7 +23,7 @@ class MDSeqTrack : public MDSeqTrackData, public SeqSlideTrack { uint8_t locks_params_orig[NUM_LOCKS]; - static bool gui_update; + static uint16_t gui_update; static uint16_t md_trig_mask; static uint32_t load_machine_cache; From 98c0cc17c5807fd41b271b5fbe815336f5b8118e Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 3 Jul 2023 17:23:09 +1000 Subject: [PATCH 159/413] copy paste WIP --- avr/cores/megacommand/MCL/PerfPage.cpp | 31 ++++++++++++++++++-------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 3121cba23..2056b271e 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -21,6 +21,7 @@ void PerfPage::init() { last_mask = last_blink_mask = 0; show_menu = false; last_page_mode = 255; + MD.set_rec_mode(3); } void PerfPage::set_led_mask() { @@ -51,6 +52,7 @@ void PerfPage::set_led_mask() { void PerfPage::cleanup() { PerfPageParent::cleanup(); trig_interface.off(); + MD.set_rec_mode(0); } void PerfPage::config_encoder_range(uint8_t i) { @@ -413,27 +415,38 @@ bool PerfPage::handleEvent(gui_event_t *event) { return true; } } + uint8_t t = note_interface.get_first_md_note(); if (event->mask == EVENT_BUTTON_PRESSED) { switch (key) { - case MDX_KEY_NO: { - char *str = "CLEAR SCENE"; + case MDX_KEY_COPY: { + char *str = "COPY SCENE"; oled_display.textbox(str, ""); MD.popup_text(str); - for (uint8_t n = 0; n < 4; n++) { - if (note_interface.is_note_on(n)) { - perf_encoders[perf_id]->perf_data.clear_scene(n); - } + mcl_clipboard.copy_scene(&perf_encoders[perf_id]->perf_data.scenes[t]); + break; + } + case MDX_KEY_PASTE: { + if (mcl_clipboard.paste_scene(&perf_encoders[perf_id]->perf_data.scenes[t])) { + char *str = "PASTE SCENE"; + oled_display.textbox(str, ""); + MD.popup_text(str); } + break; + } + case MDX_KEY_CLEAR: { + char *str = "CLEAR SCENE"; + oled_display.textbox(str, ""); + MD.popup_text(str); + perf_encoders[perf_id]->perf_data.clear_scene(t); config_encoders(); break; } case MDX_KEY_YES: { - uint8_t a = note_interface.get_first_md_note(); PerfEncoder *e = perf_encoders[perf_id]; - if (a >= NUM_SCENES) { + if (t >= NUM_SCENES) { return true; } - PerfScene *s1 = &e->perf_data.scenes[a], *s2 = nullptr; + PerfScene *s1 = &e->perf_data.scenes[t], *s2 = nullptr; e->send_params(0,s1,s2); return true; } From 06db27b31bb0d21b0faceeb3d9337c59eca63181 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 3 Jul 2023 23:46:52 +1000 Subject: [PATCH 160/413] COPY/CLEAR/PASTE/UNDO Scene logic working --- avr/cores/megacommand/MCL/MCL.cpp | 8 +- avr/cores/megacommand/MCL/PerfPage.cpp | 111 ++++++++++++++++--------- avr/cores/megacommand/MCL/PerfPage.h | 2 + 3 files changed, 78 insertions(+), 43 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCL.cpp b/avr/cores/megacommand/MCL/MCL.cpp index 3247749e7..2f138684b 100644 --- a/avr/cores/megacommand/MCL/MCL.cpp +++ b/avr/cores/megacommand/MCL/MCL.cpp @@ -278,7 +278,7 @@ bool mcl_handleEvent(gui_event_t *event) { return true; } case MDX_KEY_COPY: { - if (mcl.currentPage() == SEQ_STEP_PAGE) + if (mcl.currentPage() == SEQ_STEP_PAGE || mcl.currentPage() == PERF_PAGE_0) break; if (mcl.currentPage() != SEQ_PTC_PAGE && (trig_interface.is_key_down(MDX_KEY_SCALE) || @@ -295,7 +295,7 @@ bool mcl_handleEvent(gui_event_t *event) { break; } case MDX_KEY_PASTE: { - if (mcl.currentPage() == SEQ_STEP_PAGE) + if (mcl.currentPage() == SEQ_STEP_PAGE || mcl.currentPage() == PERF_PAGE_0) break; if (mcl.currentPage() != SEQ_PTC_PAGE && (trig_interface.is_key_down(MDX_KEY_SCALE) || @@ -313,9 +313,7 @@ bool mcl_handleEvent(gui_event_t *event) { break; } case MDX_KEY_CLEAR: { - if (mcl.currentPage() == PERF_PAGE_0) - break; - if (mcl.currentPage() == SEQ_STEP_PAGE) + if (mcl.currentPage() == SEQ_STEP_PAGE || mcl.currentPage() == PERF_PAGE_0) break; if ((note_interface.notes_count_on() > 0) || (trig_interface.is_key_down(MDX_KEY_SCALE) || diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 2056b271e..c13e21a69 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -28,8 +28,12 @@ void PerfPage::set_led_mask() { uint16_t mask = 0; PerfEncoder *e = perf_encoders[perf_id]; - if (e->active_scene_a < NUM_SCENES) { SET_BIT16(mask, e->active_scene_a); } - if (e->active_scene_b < NUM_SCENES) { SET_BIT16(mask, e->active_scene_b); } + if (e->active_scene_a < NUM_SCENES) { + SET_BIT16(mask, e->active_scene_a); + } + if (e->active_scene_b < NUM_SCENES) { + SET_BIT16(mask, e->active_scene_b); + } if (last_mask != mask) { MD.set_trigleds(mask, TRIGLED_EXCLUSIVENDYNAMIC); @@ -244,7 +248,8 @@ void PerfPage::display() { oled_display.setFont(oldfont); mcl_gui.draw_panel_labels(info1, info2); - if (trig_interface.is_key_down(MDX_KEY_LEFT) || trig_interface.is_key_down(MDX_KEY_RIGHT)) { + if (trig_interface.is_key_down(MDX_KEY_LEFT) || + trig_interface.is_key_down(MDX_KEY_RIGHT)) { oled_display.setCursor(54, MCLGUI::pane_info2_y + 4); oled_display.print(F("SELECT")); } @@ -288,6 +293,7 @@ void PerfPage::learn_param(uint8_t dest, uint8_t param, uint8_t value) { trig_interface.ignoreNextEvent(param - MD.currentSynthPage * 8 + 16); } page_mode = n + 1; + undo = 255; config_encoders(true); } } @@ -348,12 +354,12 @@ bool PerfPage::handleEvent(gui_event_t *event) { PerfEncoder *e = perf_encoders[perf_id]; if (trig_interface.is_key_down(MDX_KEY_LEFT)) { - e->active_scene_a = e->active_scene_a == track ? 255 : track; - return true; + e->active_scene_a = e->active_scene_a == track ? 255 : track; + return true; } if (trig_interface.is_key_down(MDX_KEY_RIGHT)) { - e->active_scene_b = e->active_scene_b == track ? 255 : track; - return true; + e->active_scene_b = e->active_scene_b == track ? 255 : track; + return true; } learn = track + 1; @@ -361,7 +367,7 @@ bool PerfPage::handleEvent(gui_event_t *event) { send_locks(scene); config_encoders(); if (page_mode == PERF_DESTINATION) { - page_mode = last_page_mode == 255 ? 0 : last_page_mode; + page_mode = last_page_mode == 255 ? 1 : last_page_mode; config_encoders(); } } @@ -415,46 +421,75 @@ bool PerfPage::handleEvent(gui_event_t *event) { return true; } } - uint8_t t = note_interface.get_first_md_note(); if (event->mask == EVENT_BUTTON_PRESSED) { - switch (key) { - case MDX_KEY_COPY: { - char *str = "COPY SCENE"; - oled_display.textbox(str, ""); - MD.popup_text(str); - mcl_clipboard.copy_scene(&perf_encoders[perf_id]->perf_data.scenes[t]); - break; - } - case MDX_KEY_PASTE: { - if (mcl_clipboard.paste_scene(&perf_encoders[perf_id]->perf_data.scenes[t])) { - char *str = "PASTE SCENE"; + + uint8_t t = note_interface.get_first_md_note(); + if (t < NUM_SCENES) { + switch (key) { + case MDX_KEY_COPY: { + char *str = "COPY SCENE"; oled_display.textbox(str, ""); MD.popup_text(str); + mcl_clipboard.copy_scene( + &perf_encoders[perf_id]->perf_data.scenes[t]); + undo = 255; + return true; } - break; - } - case MDX_KEY_CLEAR: { - char *str = "CLEAR SCENE"; - oled_display.textbox(str, ""); - MD.popup_text(str); - perf_encoders[perf_id]->perf_data.clear_scene(t); - config_encoders(); - break; - } - case MDX_KEY_YES: { - PerfEncoder *e = perf_encoders[perf_id]; - if (t >= NUM_SCENES) { + case MDX_KEY_PASTE: { + if (undo < NUM_SCENES) { return; } + if (mcl_clipboard.paste_scene( + &perf_encoders[perf_id]->perf_data.scenes[t])) { + char *str = "PASTE SCENE"; + oled_display.textbox(str, ""); + MD.popup_text(str); + config_encoders(); + send_locks(t); + } return true; } - PerfScene *s1 = &e->perf_data.scenes[t], *s2 = nullptr; - e->send_params(0,s1,s2); - return true; + case MDX_KEY_CLEAR: { + if (t == undo) { + if (mcl_clipboard.paste_scene( + &perf_encoders[perf_id]->perf_data.scenes[undo])) { + char *str = "UNDO CLEAR"; + oled_display.textbox(str, ""); + MD.popup_text(str); + undo = 255; + goto end_clear; + } + undo = 255; + return true; + } + else { + undo = t; + mcl_clipboard.copy_scene(&perf_encoders[perf_id]->perf_data.scenes[t]); + } + char *str = "CLEAR SCENE"; + oled_display.textbox(str, ""); + MD.popup_text(str); + perf_encoders[perf_id]->perf_data.clear_scene(t); + end_clear: + config_encoders(); + send_locks(t); + return true; + } + case MDX_KEY_YES: { + PerfEncoder *e = perf_encoders[perf_id]; + if (t >= NUM_SCENES) { + return true; + } + PerfScene *s1 = &e->perf_data.scenes[t], *s2 = nullptr; + e->send_params(0, s1, s2); + return true; + } + } } + switch (key) { case MDX_KEY_UP: { - if (learn && page_mode < NUM_PERF_PARAMS){ + if (learn && page_mode < NUM_PERF_PARAMS) { page_mode++; config_encoders(); - } + } return true; } case MDX_KEY_DOWN: { diff --git a/avr/cores/megacommand/MCL/PerfPage.h b/avr/cores/megacommand/MCL/PerfPage.h index 05d2fd9f4..28cbde9dc 100644 --- a/avr/cores/megacommand/MCL/PerfPage.h +++ b/avr/cores/megacommand/MCL/PerfPage.h @@ -19,6 +19,8 @@ class PerfPage : public LightPage, PerfPageParent { : LightPage(e1, e2, e3, e4) { } + uint8_t undo = 255; + uint8_t learn = 0; uint8_t old_mode = 0; uint8_t last_page_mode; From 472986e9c4035d2d76545ddce5a14404aa9e7d83 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 4 Jul 2023 00:08:35 +1000 Subject: [PATCH 161/413] Disable MIDI learn if sequencer is running --- avr/cores/megacommand/MCL/MCLSeq.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/MCLSeq.cpp b/avr/cores/megacommand/MCL/MCLSeq.cpp index 2c2de9ae2..955c1c54f 100644 --- a/avr/cores/megacommand/MCL/MCLSeq.cpp +++ b/avr/cores/megacommand/MCL/MCLSeq.cpp @@ -367,7 +367,8 @@ void MCLSeqMidiEvents::onControlChangeCallback_Midi2(uint8_t *msg) { } return; } - perf_page.learn_param(channel + 16 + 4, param, value); + + if (MidiClock.state != 2) { perf_page.learn_param(channel + 16 + 4, param, value); } } void MCLSeqMidiEvents::setup_callbacks() { From 697df06aa20eaa8556af98a6263da262ea3d3de5 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 4 Jul 2023 00:08:57 +1000 Subject: [PATCH 162/413] Perf Learn FX parameters --- avr/cores/megacommand/MD/MDSysex.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/avr/cores/megacommand/MD/MDSysex.cpp b/avr/cores/megacommand/MD/MDSysex.cpp index a03e3f6db..4421ef5b1 100644 --- a/avr/cores/megacommand/MD/MDSysex.cpp +++ b/avr/cores/megacommand/MD/MDSysex.cpp @@ -78,6 +78,8 @@ void MDSysexListenerClass::end() { break; } + perf_page.learn_param(fx_type + 16, param, value); + for (uint8_t n = 0; n < mcl_seq.num_lfo_tracks; n++) { mcl_seq.lfo_tracks[n].check_and_update_params_offset(17 + fx_type, param, value); } From a51990760176207a51f4141594b57a94b4f7a462 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 4 Jul 2023 14:25:00 +1000 Subject: [PATCH 163/413] Checkpoint: experimenting with lock loopback to performance encoders --- avr/cores/megacommand/CommonTools/helpers.h | 7 ++++ avr/cores/megacommand/MCL/MDSeqTrack.cpp | 6 ++-- avr/cores/megacommand/MCL/PerfData.h | 40 ++++++++++++++++----- avr/cores/megacommand/MCL/PerfEncoder.cpp | 1 + avr/cores/megacommand/MD/MD.cpp | 11 ++++-- avr/cores/megacommand/MD/MD.h | 4 +-- avr/cores/megacommand/Midi/MidiUartParent.h | 1 + avr/cores/megacommand/MidiUart.h | 4 +++ avr/cores/megacommand/global.cpp | 16 ++++----- 9 files changed, 66 insertions(+), 24 deletions(-) diff --git a/avr/cores/megacommand/CommonTools/helpers.h b/avr/cores/megacommand/CommonTools/helpers.h index d3cea4021..9c203aeae 100644 --- a/avr/cores/megacommand/CommonTools/helpers.h +++ b/avr/cores/megacommand/CommonTools/helpers.h @@ -84,6 +84,13 @@ extern const uint32_t _bvmasks32[]; #define IS_BIT_SET16(target, bit) IS_BIT_SET_RADDR(target, bit) #define IS_BIT_CLEAR16(target, bit) IS_BIT_CLEAR_RADDR(target, bit) +/** 24-bit macros. **/ +#define SET_BIT24(target, bit) SET_BIT_RADDR(target, bit) +#define CLEAR_BIT24(target, bit) CLEAR_BIT_RADDR(target, bit) +#define TOGGLE_BIT24(target, bit) TOGGLE_BIT_RADDR(target, bit) +#define IS_BIT_SET24(target, bit) IS_BIT_SET_RADDR(target, bit) +#define IS_BIT_CLEAR24(target, bit) IS_BIT_CLEAR_RADDR(target, bit) + /** 32-bit macros. **/ #define SET_BIT32(target, bit) SET_BIT_RADDR(target, bit) #define CLEAR_BIT32(target, bit) CLEAR_BIT_RADDR(target, bit) diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.cpp b/avr/cores/megacommand/MCL/MDSeqTrack.cpp index 005577fc9..cf2af4927 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/MDSeqTrack.cpp @@ -433,8 +433,10 @@ void MDSeqTrack::send_parameter_locks_inline(uint8_t step, bool trig, } lock_idx += lock_bit; if (send) { - MD.setTrackParam_inline(track_number, locks_params[c] - 1, send_param, - uart); + uint8_t p = locks_params[c] - 1; + bool loopback = IS_BIT_SET32(PerfData::track_params[track_number], p); + bool update_kit = false; + MD.setTrackParam_inline(track_number, p, send_param, uart, update_kit, loopback); } } } diff --git a/avr/cores/megacommand/MCL/PerfData.h b/avr/cores/megacommand/MCL/PerfData.h index c38e3e64f..8f37bb1a9 100644 --- a/avr/cores/megacommand/MCL/PerfData.h +++ b/avr/cores/megacommand/MCL/PerfData.h @@ -91,16 +91,19 @@ class PerfScene { return b; } - void clear_param(uint8_t dest, uint8_t param) { + bool clear_param(uint8_t dest, uint8_t param) { + bool ret = false; for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { // Find match if (params[a].dest == dest + 1 && params[a].param == param) { params[a].val = 255; params[a].dest = 0; params[a].param = 0; + ret = true; count--; } } + return ret; } uint8_t find_empty() { @@ -133,11 +136,13 @@ class PerfScene { class PerfData { public: static PerfScene scenes[NUM_SCENES]; + static uint32_t track_params[NUM_MD_TRACKS]; uint8_t src; uint8_t param; uint8_t min; + PerfData() { init_params(); } void *data() const { return (void *)&scenes; } @@ -160,28 +165,45 @@ class PerfData { void clear_param_scene(uint8_t dest_, uint8_t param_, uint8_t scene) { PerfScene *s = &scenes[scene]; - s->clear_param(dest_, param_); + bool ret = s->clear_param(dest_, param_); + if (ret && dest_ < NUM_MD_TRACKS) { + CLEAR_BIT32(track_params[dest_], param_); + } + } uint8_t add_param(uint8_t dest_, uint8_t param_, uint8_t scene, uint8_t value) { PerfScene *s = &scenes[scene]; - return s->add_param(dest_,param_,value); + uint8_t ret = s->add_param(dest_,param_,value); + if (ret != 255 && dest_ < NUM_MD_TRACKS) { + SET_BIT32(track_params[dest_], param_); + } + + return ret; } - void init_params() { - for (uint8_t n = 0; n < NUM_SCENES; n++) { - PerfScene *s = &scenes[n]; - s->init(); - } - } void clear_scene(uint8_t scene) { PerfScene *s = &scenes[scene]; + for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { + uint8_t t = s->params[a].dest - 1; + if (t < NUM_MD_TRACKS) { + CLEAR_BIT32(track_params[t], s->params[a].param); + } + } s->init(); } + void init_params() { + for (uint8_t n = 0; n < NUM_SCENES; n++) { + clear_scene(n); + } + memset(track_params,0,sizeof(track_params)); + } + + }; class PerfFade { diff --git a/avr/cores/megacommand/MCL/PerfEncoder.cpp b/avr/cores/megacommand/MCL/PerfEncoder.cpp index cafc2ef4e..1c3708776 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.cpp +++ b/avr/cores/megacommand/MCL/PerfEncoder.cpp @@ -6,6 +6,7 @@ #define DIV_1_127 (1.00f / 127.0f) static PerfScene PerfData::scenes[NUM_SCENES]; +static uint32_t PerfData::track_params[NUM_MD_TRACKS]; void PerfEncoder::send_param(uint8_t dest, uint8_t param, uint8_t val) { if (dest >= NUM_MD_TRACKS + 4) { diff --git a/avr/cores/megacommand/MD/MD.cpp b/avr/cores/megacommand/MD/MD.cpp index 64627fe47..d77b5ccf1 100644 --- a/avr/cores/megacommand/MD/MD.cpp +++ b/avr/cores/megacommand/MD/MD.cpp @@ -374,12 +374,12 @@ void MDClass::restore_kit_param(uint8_t track, uint8_t param) { } void MDClass::setTrackParam(uint8_t track, uint8_t param, uint8_t value, - MidiUartParent *uart_, bool update_kit) { - setTrackParam_inline(track, param, value, uart_, update_kit); + MidiUartParent *uart_, bool update_kit, bool loopback) { + setTrackParam_inline(track, param, value, uart_, update_kit, loopback); } void MDClass::setTrackParam_inline(uint8_t track, uint8_t param, uint8_t value, - MidiUartParent *uart_, bool update_kit) { + MidiUartParent *uart_, bool update_kit, bool loopback) { if (uart_ == nullptr) { uart_ = uart; @@ -403,6 +403,11 @@ void MDClass::setTrackParam_inline(uint8_t track, uint8_t param, uint8_t value, } else { return; } + if (loopback) { + uint8_t msg[3] = {(uint8_t)(MIDI_CONTROL_CHANGE | (channel + global.baseChannel)), cc, value}; + uart_->m_recv(msg, 3); + //MidiUart.m_recv(msg, 3); + } uart_->sendCC(channel + global.baseChannel, cc, value); } diff --git a/avr/cores/megacommand/MD/MD.h b/avr/cores/megacommand/MD/MD.h index a944c8abe..6332dd648 100644 --- a/avr/cores/megacommand/MD/MD.h +++ b/avr/cores/megacommand/MD/MD.h @@ -124,8 +124,8 @@ class MDClass : public ElektronDevice { * Uses the channel settings out of the global settings. **/ - ALWAYS_INLINE() void setTrackParam_inline(uint8_t track, uint8_t param, uint8_t value, MidiUartParent *uart_ = nullptr, bool update_kit = false); - void setTrackParam(uint8_t track, uint8_t param, uint8_t value, MidiUartParent *uart_ = nullptr, bool update_kit = false); + ALWAYS_INLINE() void setTrackParam_inline(uint8_t track, uint8_t param, uint8_t value, MidiUartParent *uart_ = nullptr, bool update_kit = false, bool loopback = false); + void setTrackParam(uint8_t track, uint8_t param, uint8_t value, MidiUartParent *uart_ = nullptr, bool update_kit = false, bool loopback = false); void setSampleName(uint8_t slot, char *name); diff --git a/avr/cores/megacommand/Midi/MidiUartParent.h b/avr/cores/megacommand/Midi/MidiUartParent.h index bec871e63..40932902d 100644 --- a/avr/cores/megacommand/Midi/MidiUartParent.h +++ b/avr/cores/megacommand/Midi/MidiUartParent.h @@ -83,6 +83,7 @@ class MidiUartParent { virtual void m_putc(uint8_t *src, uint16_t size) = 0; virtual void m_putc(uint8_t c) = 0; virtual void m_putc_immediate(uint8_t c) { m_putc(c); } + virtual void m_recv(uint8_t *src, uint16_t size) = 0; virtual bool avail() { return false; } virtual uint8_t getc() { return 0; } diff --git a/avr/cores/megacommand/MidiUart.h b/avr/cores/megacommand/MidiUart.h index 5de445d5b..4dffcb801 100644 --- a/avr/cores/megacommand/MidiUart.h +++ b/avr/cores/megacommand/MidiUart.h @@ -307,6 +307,10 @@ class MidiUartClass : public MidiUartParent { } } + ALWAYS_INLINE() void m_recv(uint8_t *src, uint16_t size) { + rxRb.put_h_isr(src, size); + } + ALWAYS_INLINE() void m_putc(uint8_t *src, uint16_t size) { txRb.put_h_isr(src, size); set_tx(); diff --git a/avr/cores/megacommand/global.cpp b/avr/cores/megacommand/global.cpp index a4f914f7d..6ea4f2daa 100644 --- a/avr/cores/megacommand/global.cpp +++ b/avr/cores/megacommand/global.cpp @@ -4,20 +4,20 @@ // -- Midi UART devices -MidiUartClass seq_tx1(&UDR1,(volatile uint8_t *)nullptr, - (size_t) 0, +MidiUartClass seq_tx1(&UDR1,(volatile uint8_t *)BANK1_UART1_RX_BUFFER_START, + UART1_RX_BUFFER_LEN, (volatile uint8_t *)BANK1_UARTSEQ_TX1_BUFFER_START, TX_SEQBUF_SIZE); -MidiUartClass seq_tx2(&UDR1,(volatile uint8_t *)nullptr, - (size_t) 0, +MidiUartClass seq_tx2(&UDR1,(volatile uint8_t *)BANK1_UART1_RX_BUFFER_START, + UART1_RX_BUFFER_LEN, (volatile uint8_t *)BANK1_UARTSEQ_TX2_BUFFER_START, TX_SEQBUF_SIZE); -MidiUartClass seq_tx3(&UDR2,(volatile uint8_t *)nullptr, - (size_t) 0, +MidiUartClass seq_tx3(&UDR2,(volatile uint8_t *)BANK1_UART2_RX_BUFFER_START, + UART2_RX_BUFFER_LEN, (volatile uint8_t *)BANK1_UARTSEQ_TX3_BUFFER_START, TX_SEQBUF_SIZE); -MidiUartClass seq_tx4(&UDR2,(volatile uint8_t *)nullptr, - (size_t) 0, +MidiUartClass seq_tx4(&UDR2,(volatile uint8_t *)BANK1_UART2_RX_BUFFER_START, + UART2_RX_BUFFER_LEN, (volatile uint8_t *)BANK1_UARTSEQ_TX4_BUFFER_START, TX_SEQBUF_SIZE); From a99429b4496b3798f6ea49bc20f3ff7d3f9b5af3 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 4 Jul 2023 14:46:36 +1000 Subject: [PATCH 164/413] bug --- avr/cores/megacommand/MCL/PerfPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index c13e21a69..cbfbf0e17 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -493,7 +493,7 @@ bool PerfPage::handleEvent(gui_event_t *event) { return true; } case MDX_KEY_DOWN: { - if (learn && page_mode > 0) { + if (learn && page_mode > 1) { page_mode--; config_encoders(); } From 93214f5d853ade3ef17e2f7de5a162276671375c Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 4 Jul 2023 16:39:50 +1000 Subject: [PATCH 165/413] loopback experiment --- avr/cores/megacommand/Elektron/Elektron.cpp | 2 + avr/cores/megacommand/Elektron/Elektron.h | 4 +- avr/cores/megacommand/MCL/MDSeqTrack.cpp | 5 +- avr/cores/megacommand/MCL/PerfData.h | 32 +++++-------- avr/cores/megacommand/MCL/PerfEncoder.cpp | 2 +- avr/cores/megacommand/MCL/PerfEncoder.h | 1 + avr/cores/megacommand/MCL/PerfPage.cpp | 53 +++++++++++++-------- avr/cores/megacommand/MCL/PerfPage.h | 1 + avr/cores/megacommand/MCL/SeqStepPage.cpp | 15 +++--- avr/cores/megacommand/MCL/SeqStepPage.h | 1 + avr/cores/megacommand/MD/MD.cpp | 4 +- avr/cores/megacommand/WProgram.h | 2 +- 12 files changed, 69 insertions(+), 53 deletions(-) diff --git a/avr/cores/megacommand/Elektron/Elektron.cpp b/avr/cores/megacommand/Elektron/Elektron.cpp index f9c3c1698..2c3b42cba 100644 --- a/avr/cores/megacommand/Elektron/Elektron.cpp +++ b/avr/cores/megacommand/Elektron/Elektron.cpp @@ -108,6 +108,7 @@ bool ElektronDevice::get_fw_caps() { } void ElektronDevice::activate_encoder_interface(uint8_t *params) { + encoder_interface = true; uint8_t data[3 + 4 + 24] = {0x70, 0x36, 0x01}; uint8_t mod7 = 0; @@ -131,6 +132,7 @@ void ElektronDevice::activate_encoder_interface(uint8_t *params) { void ElektronDevice::deactivate_encoder_interface() { uint8_t data[3] = {0x70, 0x36, 0x00}; sendRequest(data, sizeof(data)); + encoder_interface = false; //waitBlocking(); } diff --git a/avr/cores/megacommand/Elektron/Elektron.h b/avr/cores/megacommand/Elektron/Elektron.h index d27d63a96..e09dd3d84 100644 --- a/avr/cores/megacommand/Elektron/Elektron.h +++ b/avr/cores/megacommand/Elektron/Elektron.h @@ -334,7 +334,7 @@ class ElektronDevice : public MidiDevice { bool loadedKit; /** Set to true if the global was loaded (usually set by MDTask). **/ bool loadedGlobal; - + bool encoder_interface; ElektronDevice( MidiClass* _midi, const char* _name, const uint8_t _id, const ElektronSysexProtocol& protocol) @@ -346,6 +346,8 @@ class ElektronDevice : public MidiDevice { loadedKit = false; loadedGlobal = false; + + encoder_interface = false; } virtual bool getWorkSpaceKit() { diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.cpp b/avr/cores/megacommand/MCL/MDSeqTrack.cpp index cf2af4927..52af1a4ac 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/MDSeqTrack.cpp @@ -434,7 +434,10 @@ void MDSeqTrack::send_parameter_locks_inline(uint8_t step, bool trig, lock_idx += lock_bit; if (send) { uint8_t p = locks_params[c] - 1; - bool loopback = IS_BIT_SET32(PerfData::track_params[track_number], p); + bool loopback = IS_BIT_SET32(PerfData::src_params, p) && !MD.encoder_interface; + DEBUG_PRINTLN("checking bit"); + DEBUG_PRINTLN(p); + DEBUG_PRINTLN(loopback); bool update_kit = false; MD.setTrackParam_inline(track_number, p, send_param, uart, update_kit, loopback); } diff --git a/avr/cores/megacommand/MCL/PerfData.h b/avr/cores/megacommand/MCL/PerfData.h index 8f37bb1a9..2d2e88066 100644 --- a/avr/cores/megacommand/MCL/PerfData.h +++ b/avr/cores/megacommand/MCL/PerfData.h @@ -91,7 +91,7 @@ class PerfScene { return b; } - bool clear_param(uint8_t dest, uint8_t param) { + void clear_param(uint8_t dest, uint8_t param) { bool ret = false; for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { // Find match @@ -99,11 +99,9 @@ class PerfScene { params[a].val = 255; params[a].dest = 0; params[a].param = 0; - ret = true; count--; } } - return ret; } uint8_t find_empty() { @@ -136,7 +134,7 @@ class PerfScene { class PerfData { public: static PerfScene scenes[NUM_SCENES]; - static uint32_t track_params[NUM_MD_TRACKS]; + static uint32_t src_params; uint8_t src; uint8_t param; @@ -147,6 +145,12 @@ class PerfData { void *data() const { return (void *)&scenes; } + void update_src(uint8_t src_, uint8_t param_, uint8_t min_) { + src = src_; + param = param_; + min = min_; + } + uint16_t get_active_scene_mask() { uint16_t mask = 0; for (uint8_t n = 0; n < NUM_SCENES; n++) { @@ -165,33 +169,20 @@ class PerfData { void clear_param_scene(uint8_t dest_, uint8_t param_, uint8_t scene) { PerfScene *s = &scenes[scene]; - bool ret = s->clear_param(dest_, param_); - if (ret && dest_ < NUM_MD_TRACKS) { - CLEAR_BIT32(track_params[dest_], param_); - } + s->clear_param(dest_, param_); } uint8_t add_param(uint8_t dest_, uint8_t param_, uint8_t scene, uint8_t value) { PerfScene *s = &scenes[scene]; - - uint8_t ret = s->add_param(dest_,param_,value); - if (ret != 255 && dest_ < NUM_MD_TRACKS) { - SET_BIT32(track_params[dest_], param_); - } - - return ret; - - } + return s->add_param(dest_,param_,value); + } void clear_scene(uint8_t scene) { PerfScene *s = &scenes[scene]; for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { uint8_t t = s->params[a].dest - 1; - if (t < NUM_MD_TRACKS) { - CLEAR_BIT32(track_params[t], s->params[a].param); - } } s->init(); } @@ -200,7 +191,6 @@ class PerfData { for (uint8_t n = 0; n < NUM_SCENES; n++) { clear_scene(n); } - memset(track_params,0,sizeof(track_params)); } diff --git a/avr/cores/megacommand/MCL/PerfEncoder.cpp b/avr/cores/megacommand/MCL/PerfEncoder.cpp index 1c3708776..8bc3bce85 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.cpp +++ b/avr/cores/megacommand/MCL/PerfEncoder.cpp @@ -6,7 +6,7 @@ #define DIV_1_127 (1.00f / 127.0f) static PerfScene PerfData::scenes[NUM_SCENES]; -static uint32_t PerfData::track_params[NUM_MD_TRACKS]; +static uint32_t PerfData::src_params = 0; void PerfEncoder::send_param(uint8_t dest, uint8_t param, uint8_t val) { if (dest >= NUM_MD_TRACKS + 4) { diff --git a/avr/cores/megacommand/MCL/PerfEncoder.h b/avr/cores/megacommand/MCL/PerfEncoder.h index e76f2c7fe..4ba16c5b1 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.h +++ b/avr/cores/megacommand/MCL/PerfEncoder.h @@ -14,6 +14,7 @@ class PerfEncoder : public MCLEncoder { public: PerfData perf_data; + uint8_t active_scene_a = 0; uint8_t active_scene_b = 1; void send(); diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index cbfbf0e17..4ceb0183e 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -72,7 +72,17 @@ void PerfPage::config_encoder_range(uint8_t i) { ((MCLEncoder *)encoders[i + 1])->max = 23; } } - +void PerfPage::recalc_src_params() { + PerfData::src_params = 0; + for (uint8_t n = 0; n < 4; n++) { + PerfData *d = &perf_encoders[n]->perf_data; + if (d->src > 0 && d->src <= NUM_MD_TRACKS && d->param < 24) { + DEBUG_PRINTLN("Setting bit"); + DEBUG_PRINTLN(d->param); + SET_BIT32(PerfData::src_params, d->param); + } + } +} void PerfPage::config_encoders(uint8_t show_val) { encoders[0] = perf_encoders[perf_id]; @@ -156,10 +166,11 @@ void PerfPage::update_params() { if (encoders[1]->hasChanged() && encoders[1]->cur == 0) { encoders[2]->cur = 0; } - PerfData *d = &perf_encoders[perf_id]->perf_data; - d->src = encoders[1]->cur; - d->param = encoders[2]->cur; - d->min = encoders[3]->cur; + if (encoders[1]->hasChanged() || encoders[2]->hasChanged()) { + PerfData *d = &perf_encoders[perf_id]->perf_data; + d->update_src(encoders[1]->cur, encoders[2]->cur, encoders[3]->cur); + recalc_src_params(); + } } } @@ -436,7 +447,9 @@ bool PerfPage::handleEvent(gui_event_t *event) { return true; } case MDX_KEY_PASTE: { - if (undo < NUM_SCENES) { return; } + if (undo < NUM_SCENES) { + return; + } if (mcl_clipboard.paste_scene( &perf_encoders[perf_id]->perf_data.scenes[t])) { char *str = "PASTE SCENE"; @@ -449,26 +462,26 @@ bool PerfPage::handleEvent(gui_event_t *event) { } case MDX_KEY_CLEAR: { if (t == undo) { - if (mcl_clipboard.paste_scene( - &perf_encoders[perf_id]->perf_data.scenes[undo])) { - char *str = "UNDO CLEAR"; - oled_display.textbox(str, ""); - MD.popup_text(str); - undo = 255; - goto end_clear; - } - undo = 255; - return true; - } - else { + if (mcl_clipboard.paste_scene( + &perf_encoders[perf_id]->perf_data.scenes[undo])) { + char *str = "UNDO CLEAR"; + oled_display.textbox(str, ""); + MD.popup_text(str); + undo = 255; + goto end_clear; + } + undo = 255; + return true; + } else { undo = t; - mcl_clipboard.copy_scene(&perf_encoders[perf_id]->perf_data.scenes[t]); + mcl_clipboard.copy_scene( + &perf_encoders[perf_id]->perf_data.scenes[t]); } char *str = "CLEAR SCENE"; oled_display.textbox(str, ""); MD.popup_text(str); perf_encoders[perf_id]->perf_data.clear_scene(t); - end_clear: + end_clear: config_encoders(); send_locks(t); return true; diff --git a/avr/cores/megacommand/MCL/PerfPage.h b/avr/cores/megacommand/MCL/PerfPage.h index 28cbde9dc..259522a46 100644 --- a/avr/cores/megacommand/MCL/PerfPage.h +++ b/avr/cores/megacommand/MCL/PerfPage.h @@ -37,6 +37,7 @@ class PerfPage : public LightPage, PerfPageParent { PerfEncoder *perf_encoders[4]; bool handleEvent(gui_event_t *event); + void recalc_src_params(); void update_params(); void learn_param(uint8_t dest, uint8_t param, uint8_t value); diff --git a/avr/cores/megacommand/MCL/SeqStepPage.cpp b/avr/cores/megacommand/MCL/SeqStepPage.cpp index 59375a983..5fc753f8b 100644 --- a/avr/cores/megacommand/MCL/SeqStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqStepPage.cpp @@ -101,6 +101,9 @@ void SeqStepPage::cleanup() { params_reset(); MD.set_rec_mode(0); MD.popup_text(127, 2); // clear persistent trig mode popup + if (MD.encoder_interface) { + MD.deactivate_encoder_interface(); + } } void SeqStepPage::display() { @@ -313,11 +316,11 @@ bool SeqStepPage::handleEvent(gui_event_t *event) { return true; } if (show_seq_menu) { - opt_trackid = track + 1; - note_interface.ignoreNextEvent(track); - select_track(device, track); - seq_menu_page.select_item(0); - return true; + opt_trackid = track + 1; + note_interface.ignoreNextEvent(track); + select_track(device, track); + seq_menu_page.select_item(0); + return true; } uint8_t step = track + (page_select * 16); @@ -367,7 +370,7 @@ bool SeqStepPage::handleEvent(gui_event_t *event) { tuning_t const *tuning = MD.getKitModelTuning(last_md_track); uint8_t pitch = active_track.get_track_lock_implicit(step, 0); if (pitch > 127) { - pitch = MD.kit.params[last_md_track][0]; + pitch = MD.kit.params[last_md_track][0]; } /* if (pitch == 255) { diff --git a/avr/cores/megacommand/MCL/SeqStepPage.h b/avr/cores/megacommand/MCL/SeqStepPage.h index 5c02c9efd..7894caa64 100644 --- a/avr/cores/megacommand/MCL/SeqStepPage.h +++ b/avr/cores/megacommand/MCL/SeqStepPage.h @@ -20,6 +20,7 @@ class SeqStepPage : public SeqPage { bool reset_on_release = false; bool update_params_queue; bool prepare = false; + uint8_t pitch_param; uint16_t ignore_release; uint16_t update_params_clock; diff --git a/avr/cores/megacommand/MD/MD.cpp b/avr/cores/megacommand/MD/MD.cpp index d77b5ccf1..9740e61be 100644 --- a/avr/cores/megacommand/MD/MD.cpp +++ b/avr/cores/megacommand/MD/MD.cpp @@ -405,8 +405,8 @@ void MDClass::setTrackParam_inline(uint8_t track, uint8_t param, uint8_t value, } if (loopback) { uint8_t msg[3] = {(uint8_t)(MIDI_CONTROL_CHANGE | (channel + global.baseChannel)), cc, value}; - uart_->m_recv(msg, 3); - //MidiUart.m_recv(msg, 3); + //uart_->m_recv(msg, 3); + MidiUart.m_recv(msg, 3); } uart_->sendCC(channel + global.baseChannel, cc, value); } diff --git a/avr/cores/megacommand/WProgram.h b/avr/cores/megacommand/WProgram.h index 39fb718e1..813e42c8f 100644 --- a/avr/cores/megacommand/WProgram.h +++ b/avr/cores/megacommand/WProgram.h @@ -11,7 +11,7 @@ #include "wiring_private.h" -//#define DEBUGMODE +#define DEBUGMODE #ifdef MEGACOMMAND #define SD_CS 53 //PB0 From 09221448fd0a65e0fcd90920cc3d5c944bddfec0 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 4 Jul 2023 17:05:23 +1000 Subject: [PATCH 166/413] Revert the loopback method, try direct --- avr/cores/megacommand/MCL/MDSeqTrack.cpp | 14 +++++++++----- avr/cores/megacommand/MCL/PerfData.h | 1 - avr/cores/megacommand/MCL/PerfEncoder.cpp | 15 +++++++-------- avr/cores/megacommand/MCL/PerfEncoder.h | 6 +++--- avr/cores/megacommand/MCL/PerfPage.cpp | 13 +------------ avr/cores/megacommand/MCL/PerfPage.h | 1 - avr/cores/megacommand/MD/MD.cpp | 11 +++-------- avr/cores/megacommand/MD/MD.h | 4 ++-- avr/cores/megacommand/WProgram.h | 2 +- 9 files changed, 26 insertions(+), 41 deletions(-) diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.cpp b/avr/cores/megacommand/MCL/MDSeqTrack.cpp index 52af1a4ac..8f3ebd343 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/MDSeqTrack.cpp @@ -1,4 +1,5 @@ #include "MCL_impl.h" +#include "PerfData.h" uint16_t MDSeqTrack::gui_update = 0; uint16_t MDSeqTrack::md_trig_mask = 0; @@ -434,12 +435,15 @@ void MDSeqTrack::send_parameter_locks_inline(uint8_t step, bool trig, lock_idx += lock_bit; if (send) { uint8_t p = locks_params[c] - 1; - bool loopback = IS_BIT_SET32(PerfData::src_params, p) && !MD.encoder_interface; - DEBUG_PRINTLN("checking bit"); - DEBUG_PRINTLN(p); - DEBUG_PRINTLN(loopback); bool update_kit = false; - MD.setTrackParam_inline(track_number, p, send_param, uart, update_kit, loopback); + MD.setTrackParam_inline(track_number, p, send_param, uart, update_kit); + for (uint8_t n = 0; n < 4; n++) { + PerfData *d = &perf_page.perf_encoders[n]->perf_data; + if (d->src == track_number + 1 && d->param == p) { + perf_page.perf_encoders[n]->cur = send_param; + perf_page.perf_encoders[n]->send(uart); + } + } } } } diff --git a/avr/cores/megacommand/MCL/PerfData.h b/avr/cores/megacommand/MCL/PerfData.h index 2d2e88066..dbfbbafa4 100644 --- a/avr/cores/megacommand/MCL/PerfData.h +++ b/avr/cores/megacommand/MCL/PerfData.h @@ -134,7 +134,6 @@ class PerfScene { class PerfData { public: static PerfScene scenes[NUM_SCENES]; - static uint32_t src_params; uint8_t src; uint8_t param; diff --git a/avr/cores/megacommand/MCL/PerfEncoder.cpp b/avr/cores/megacommand/MCL/PerfEncoder.cpp index 8bc3bce85..c2afc0623 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.cpp +++ b/avr/cores/megacommand/MCL/PerfEncoder.cpp @@ -6,23 +6,22 @@ #define DIV_1_127 (1.00f / 127.0f) static PerfScene PerfData::scenes[NUM_SCENES]; -static uint32_t PerfData::src_params = 0; -void PerfEncoder::send_param(uint8_t dest, uint8_t param, uint8_t val) { +void PerfEncoder::send_param(uint8_t dest, uint8_t param, uint8_t val, MidiUartParent *uart) { if (dest >= NUM_MD_TRACKS + 4) { uint8_t channel = dest - NUM_MD_TRACKS - 4; DEBUG_PRINTLN("send cc"); DEBUG_PRINT(channel); DEBUG_PRINT(" "); DEBUG_PRINT(param); DEBUG_PRINT(" "); DEBUG_PRINTLN(val); MidiUart2.sendCC(channel, param, val); } else if (dest >= NUM_MD_TRACKS) { - MD.sendFXParam(param, val, MD_FX_ECHO + dest - NUM_MD_TRACKS); + MD.sendFXParam(param, val, MD_FX_ECHO + dest - NUM_MD_TRACKS, uart); setLed2(); } else { - MD.setTrackParam(dest, param, val); + MD.setTrackParam(dest, param, val, uart); } } -void PerfEncoder::send_params(uint8_t cur_, PerfScene *s1, PerfScene *s2) { +void PerfEncoder::send_params(uint8_t cur_, PerfScene *s1, PerfScene *s2, MidiUartParent *uart) { PerfMorph morph; morph.populate(s1, s2); @@ -48,13 +47,13 @@ void PerfEncoder::send_params(uint8_t cur_, PerfScene *s1, PerfScene *s2) { continue; } DEBUG_PRINTLN(val); - send_param(f->dest - 1, f->param, val); + send_param(f->dest - 1, f->param, val, uart); } } -void PerfEncoder::send() { +void PerfEncoder::send(MidiUartParent *uart) { PerfScene *s1 = active_scene_a == 255 ? nullptr : &perf_data.scenes[active_scene_a]; PerfScene *s2 = active_scene_b == 255 ? nullptr : &perf_data.scenes[active_scene_b]; - send_params(cur, s1, s2); + send_params(cur, s1, s2, uart); } int PerfEncoder::update(encoder_t *enc) { diff --git a/avr/cores/megacommand/MCL/PerfEncoder.h b/avr/cores/megacommand/MCL/PerfEncoder.h index 4ba16c5b1..9c75671ae 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.h +++ b/avr/cores/megacommand/MCL/PerfEncoder.h @@ -17,9 +17,9 @@ class PerfEncoder : public MCLEncoder { uint8_t active_scene_a = 0; uint8_t active_scene_b = 1; - void send(); - void send_param(uint8_t dest, uint8_t param, uint8_t val); - void send_params(uint8_t cur_, PerfScene *s1, PerfScene *s2); + void send(MidiUartParent *uart = nullptr); + void send_param(uint8_t dest, uint8_t param, uint8_t val, MidiUartParent *uart = nullptr); + void send_params(uint8_t cur_, PerfScene *s1, PerfScene *s2, MidiUartParent *uart = nullptr); /** Create a new range-limited encoder with max and min value, short name, initial value, and handling function. The initRangeEncoder diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 4ceb0183e..02d9b87e4 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -72,17 +72,7 @@ void PerfPage::config_encoder_range(uint8_t i) { ((MCLEncoder *)encoders[i + 1])->max = 23; } } -void PerfPage::recalc_src_params() { - PerfData::src_params = 0; - for (uint8_t n = 0; n < 4; n++) { - PerfData *d = &perf_encoders[n]->perf_data; - if (d->src > 0 && d->src <= NUM_MD_TRACKS && d->param < 24) { - DEBUG_PRINTLN("Setting bit"); - DEBUG_PRINTLN(d->param); - SET_BIT32(PerfData::src_params, d->param); - } - } -} + void PerfPage::config_encoders(uint8_t show_val) { encoders[0] = perf_encoders[perf_id]; @@ -169,7 +159,6 @@ void PerfPage::update_params() { if (encoders[1]->hasChanged() || encoders[2]->hasChanged()) { PerfData *d = &perf_encoders[perf_id]->perf_data; d->update_src(encoders[1]->cur, encoders[2]->cur, encoders[3]->cur); - recalc_src_params(); } } } diff --git a/avr/cores/megacommand/MCL/PerfPage.h b/avr/cores/megacommand/MCL/PerfPage.h index 259522a46..28cbde9dc 100644 --- a/avr/cores/megacommand/MCL/PerfPage.h +++ b/avr/cores/megacommand/MCL/PerfPage.h @@ -37,7 +37,6 @@ class PerfPage : public LightPage, PerfPageParent { PerfEncoder *perf_encoders[4]; bool handleEvent(gui_event_t *event); - void recalc_src_params(); void update_params(); void learn_param(uint8_t dest, uint8_t param, uint8_t value); diff --git a/avr/cores/megacommand/MD/MD.cpp b/avr/cores/megacommand/MD/MD.cpp index 9740e61be..64627fe47 100644 --- a/avr/cores/megacommand/MD/MD.cpp +++ b/avr/cores/megacommand/MD/MD.cpp @@ -374,12 +374,12 @@ void MDClass::restore_kit_param(uint8_t track, uint8_t param) { } void MDClass::setTrackParam(uint8_t track, uint8_t param, uint8_t value, - MidiUartParent *uart_, bool update_kit, bool loopback) { - setTrackParam_inline(track, param, value, uart_, update_kit, loopback); + MidiUartParent *uart_, bool update_kit) { + setTrackParam_inline(track, param, value, uart_, update_kit); } void MDClass::setTrackParam_inline(uint8_t track, uint8_t param, uint8_t value, - MidiUartParent *uart_, bool update_kit, bool loopback) { + MidiUartParent *uart_, bool update_kit) { if (uart_ == nullptr) { uart_ = uart; @@ -403,11 +403,6 @@ void MDClass::setTrackParam_inline(uint8_t track, uint8_t param, uint8_t value, } else { return; } - if (loopback) { - uint8_t msg[3] = {(uint8_t)(MIDI_CONTROL_CHANGE | (channel + global.baseChannel)), cc, value}; - //uart_->m_recv(msg, 3); - MidiUart.m_recv(msg, 3); - } uart_->sendCC(channel + global.baseChannel, cc, value); } diff --git a/avr/cores/megacommand/MD/MD.h b/avr/cores/megacommand/MD/MD.h index 6332dd648..a944c8abe 100644 --- a/avr/cores/megacommand/MD/MD.h +++ b/avr/cores/megacommand/MD/MD.h @@ -124,8 +124,8 @@ class MDClass : public ElektronDevice { * Uses the channel settings out of the global settings. **/ - ALWAYS_INLINE() void setTrackParam_inline(uint8_t track, uint8_t param, uint8_t value, MidiUartParent *uart_ = nullptr, bool update_kit = false, bool loopback = false); - void setTrackParam(uint8_t track, uint8_t param, uint8_t value, MidiUartParent *uart_ = nullptr, bool update_kit = false, bool loopback = false); + ALWAYS_INLINE() void setTrackParam_inline(uint8_t track, uint8_t param, uint8_t value, MidiUartParent *uart_ = nullptr, bool update_kit = false); + void setTrackParam(uint8_t track, uint8_t param, uint8_t value, MidiUartParent *uart_ = nullptr, bool update_kit = false); void setSampleName(uint8_t slot, char *name); diff --git a/avr/cores/megacommand/WProgram.h b/avr/cores/megacommand/WProgram.h index 813e42c8f..39fb718e1 100644 --- a/avr/cores/megacommand/WProgram.h +++ b/avr/cores/megacommand/WProgram.h @@ -11,7 +11,7 @@ #include "wiring_private.h" -#define DEBUGMODE +//#define DEBUGMODE #ifdef MEGACOMMAND #define SD_CS 53 //PB0 From fd6673913f199395f8ba7492d834543c1be9f5ec Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 4 Jul 2023 17:27:37 +1000 Subject: [PATCH 167/413] correct way to disable MIDI learn when seq running --- avr/cores/megacommand/MCL/MCLSeq.cpp | 2 +- avr/cores/megacommand/MCL/PerfPage.cpp | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCLSeq.cpp b/avr/cores/megacommand/MCL/MCLSeq.cpp index 955c1c54f..ea378d28e 100644 --- a/avr/cores/megacommand/MCL/MCLSeq.cpp +++ b/avr/cores/megacommand/MCL/MCLSeq.cpp @@ -368,7 +368,7 @@ void MCLSeqMidiEvents::onControlChangeCallback_Midi2(uint8_t *msg) { return; } - if (MidiClock.state != 2) { perf_page.learn_param(channel + 16 + 4, param, value); } + perf_page.learn_param(channel + 16 + 4, param, value); } void MCLSeqMidiEvents::setup_callbacks() { diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 02d9b87e4..f922481c0 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -284,7 +284,9 @@ void PerfPage::learn_param(uint8_t dest, uint8_t param, uint8_t value) { } } if (mcl.currentPage() == PERF_PAGE_0) { - + if (dest > NUM_MD_TRACKS + 4 && MidiClock.state == 2) { + return; + } if (learn) { uint8_t scene = learn - 1; uint8_t n = d->add_param(dest, param, scene, value); From aea6cf452fc5428fb1f9dc14265cda0185efd176 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 4 Jul 2023 17:29:35 +1000 Subject: [PATCH 168/413] Revert the sequencer -> perf stuff --- avr/cores/megacommand/MCL/MDSeqTrack.cpp | 8 -------- avr/cores/megacommand/MCL/PerfEncoder.cpp | 14 +++++++------- avr/cores/megacommand/MCL/PerfEncoder.h | 6 +++--- 3 files changed, 10 insertions(+), 18 deletions(-) diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.cpp b/avr/cores/megacommand/MCL/MDSeqTrack.cpp index 8f3ebd343..0743ca1e0 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/MDSeqTrack.cpp @@ -1,5 +1,4 @@ #include "MCL_impl.h" -#include "PerfData.h" uint16_t MDSeqTrack::gui_update = 0; uint16_t MDSeqTrack::md_trig_mask = 0; @@ -437,14 +436,7 @@ void MDSeqTrack::send_parameter_locks_inline(uint8_t step, bool trig, uint8_t p = locks_params[c] - 1; bool update_kit = false; MD.setTrackParam_inline(track_number, p, send_param, uart, update_kit); - for (uint8_t n = 0; n < 4; n++) { - PerfData *d = &perf_page.perf_encoders[n]->perf_data; - if (d->src == track_number + 1 && d->param == p) { - perf_page.perf_encoders[n]->cur = send_param; - perf_page.perf_encoders[n]->send(uart); - } } - } } } diff --git a/avr/cores/megacommand/MCL/PerfEncoder.cpp b/avr/cores/megacommand/MCL/PerfEncoder.cpp index c2afc0623..cafc2ef4e 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.cpp +++ b/avr/cores/megacommand/MCL/PerfEncoder.cpp @@ -7,21 +7,21 @@ static PerfScene PerfData::scenes[NUM_SCENES]; -void PerfEncoder::send_param(uint8_t dest, uint8_t param, uint8_t val, MidiUartParent *uart) { +void PerfEncoder::send_param(uint8_t dest, uint8_t param, uint8_t val) { if (dest >= NUM_MD_TRACKS + 4) { uint8_t channel = dest - NUM_MD_TRACKS - 4; DEBUG_PRINTLN("send cc"); DEBUG_PRINT(channel); DEBUG_PRINT(" "); DEBUG_PRINT(param); DEBUG_PRINT(" "); DEBUG_PRINTLN(val); MidiUart2.sendCC(channel, param, val); } else if (dest >= NUM_MD_TRACKS) { - MD.sendFXParam(param, val, MD_FX_ECHO + dest - NUM_MD_TRACKS, uart); + MD.sendFXParam(param, val, MD_FX_ECHO + dest - NUM_MD_TRACKS); setLed2(); } else { - MD.setTrackParam(dest, param, val, uart); + MD.setTrackParam(dest, param, val); } } -void PerfEncoder::send_params(uint8_t cur_, PerfScene *s1, PerfScene *s2, MidiUartParent *uart) { +void PerfEncoder::send_params(uint8_t cur_, PerfScene *s1, PerfScene *s2) { PerfMorph morph; morph.populate(s1, s2); @@ -47,13 +47,13 @@ void PerfEncoder::send_params(uint8_t cur_, PerfScene *s1, PerfScene *s2, MidiUa continue; } DEBUG_PRINTLN(val); - send_param(f->dest - 1, f->param, val, uart); + send_param(f->dest - 1, f->param, val); } } -void PerfEncoder::send(MidiUartParent *uart) { +void PerfEncoder::send() { PerfScene *s1 = active_scene_a == 255 ? nullptr : &perf_data.scenes[active_scene_a]; PerfScene *s2 = active_scene_b == 255 ? nullptr : &perf_data.scenes[active_scene_b]; - send_params(cur, s1, s2, uart); + send_params(cur, s1, s2); } int PerfEncoder::update(encoder_t *enc) { diff --git a/avr/cores/megacommand/MCL/PerfEncoder.h b/avr/cores/megacommand/MCL/PerfEncoder.h index 9c75671ae..4ba16c5b1 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.h +++ b/avr/cores/megacommand/MCL/PerfEncoder.h @@ -17,9 +17,9 @@ class PerfEncoder : public MCLEncoder { uint8_t active_scene_a = 0; uint8_t active_scene_b = 1; - void send(MidiUartParent *uart = nullptr); - void send_param(uint8_t dest, uint8_t param, uint8_t val, MidiUartParent *uart = nullptr); - void send_params(uint8_t cur_, PerfScene *s1, PerfScene *s2, MidiUartParent *uart = nullptr); + void send(); + void send_param(uint8_t dest, uint8_t param, uint8_t val); + void send_params(uint8_t cur_, PerfScene *s1, PerfScene *s2); /** Create a new range-limited encoder with max and min value, short name, initial value, and handling function. The initRangeEncoder From d7da0ce6dcd9c41e412293c167725b9e2ac6a126 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 4 Jul 2023 17:37:20 +1000 Subject: [PATCH 169/413] led --- avr/cores/megacommand/MCL/PerfEncoder.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/PerfEncoder.cpp b/avr/cores/megacommand/MCL/PerfEncoder.cpp index cafc2ef4e..de0952d63 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.cpp +++ b/avr/cores/megacommand/MCL/PerfEncoder.cpp @@ -15,7 +15,6 @@ void PerfEncoder::send_param(uint8_t dest, uint8_t param, uint8_t val) { MidiUart2.sendCC(channel, param, val); } else if (dest >= NUM_MD_TRACKS) { MD.sendFXParam(param, val, MD_FX_ECHO + dest - NUM_MD_TRACKS); - setLed2(); } else { MD.setTrackParam(dest, param, val); } From 294aa48b29e90c51c6f256a69c3df1ec768e3648 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 4 Jul 2023 22:07:12 +1000 Subject: [PATCH 170/413] Show current PerfEncoder in shift menu --- avr/cores/megacommand/MCL/PerfPage.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index f922481c0..1e8e42b45 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -28,16 +28,22 @@ void PerfPage::set_led_mask() { uint16_t mask = 0; PerfEncoder *e = perf_encoders[perf_id]; - if (e->active_scene_a < NUM_SCENES) { - SET_BIT16(mask, e->active_scene_a); + + if (show_menu) { + SET_BIT16(mask, perf_id); } - if (e->active_scene_b < NUM_SCENES) { - SET_BIT16(mask, e->active_scene_b); + else { + if (e->active_scene_a < NUM_SCENES) { + SET_BIT16(mask, e->active_scene_a); + } + if (e->active_scene_b < NUM_SCENES) { + SET_BIT16(mask, e->active_scene_b); + } } - if (last_mask != mask) { MD.set_trigleds(mask, TRIGLED_EXCLUSIVENDYNAMIC); } + if (show_menu) { last_mask = mask; return; } bool blink = true; uint16_t blink_mask = 0; @@ -164,12 +170,12 @@ void PerfPage::update_params() { } void PerfPage::loop() { + set_led_mask(); if (show_menu) { perf_menu_page.loop(); return; } update_params(); - set_led_mask(); } void PerfPage::display() { @@ -353,6 +359,8 @@ bool PerfPage::handleEvent(gui_event_t *event) { return true; } + if (show_menu) { perf_id = track; config_encoders(); return true; } + PerfEncoder *e = perf_encoders[perf_id]; if (trig_interface.is_key_down(MDX_KEY_LEFT)) { From c419c9f06cf36a323cae7723e80048b5f4fa51de Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 4 Jul 2023 23:26:31 +1000 Subject: [PATCH 171/413] Load/Save PerfTrack to grid WIP --- avr/cores/megacommand/MCL/A4Track.cpp | 2 + avr/cores/megacommand/MCL/DeviceTrack.cpp | 5 +- avr/cores/megacommand/MCL/DeviceTrack.h | 4 ++ avr/cores/megacommand/MCL/GridPage.cpp | 4 ++ avr/cores/megacommand/MCL/GridTrack.h | 2 + avr/cores/megacommand/MCL/MCLMemory.h | 9 ++- avr/cores/megacommand/MCL/MCLMenus.h | 2 +- avr/cores/megacommand/MCL/MCL_impl.h | 1 + avr/cores/megacommand/MCL/PerfTrack.cpp | 78 +++++++++++++++++++++++ avr/cores/megacommand/MCL/PerfTrack.h | 54 ++++++++++++++++ resource/menu_layouts.cpp | 2 +- 11 files changed, 157 insertions(+), 6 deletions(-) create mode 100644 avr/cores/megacommand/MCL/PerfTrack.cpp create mode 100644 avr/cores/megacommand/MCL/PerfTrack.h diff --git a/avr/cores/megacommand/MCL/A4Track.cpp b/avr/cores/megacommand/MCL/A4Track.cpp index bd5a51f4f..edd03c6c5 100644 --- a/avr/cores/megacommand/MCL/A4Track.cpp +++ b/avr/cores/megacommand/MCL/A4Track.cpp @@ -69,6 +69,8 @@ bool A4Track::store_in_grid(uint8_t column, uint16_t row, SeqTrack *seq_track, u // !! Note do not rely on editor code lint errors -- these are for 32bit/64bit x86 sizes! // Do compile with avr-gcc and observe the error messages +//__SIZE_PROBE size; +//__SIZE_PROBE perftrackdata; //__SIZE_PROBE mdseqtrackdata; //__SIZE_PROBE mdseqtrackdata; //__SIZE_PROBE sza4t; diff --git a/avr/cores/megacommand/MCL/DeviceTrack.cpp b/avr/cores/megacommand/MCL/DeviceTrack.cpp index 77c869b00..2702ef777 100644 --- a/avr/cores/megacommand/MCL/DeviceTrack.cpp +++ b/avr/cores/megacommand/MCL/DeviceTrack.cpp @@ -31,9 +31,12 @@ DeviceTrack *DeviceTrack::init_track_type(uint8_t track_type) { case MNM_TRACK_TYPE: ::new (this) MNMTrack; break; - case GRIDCHAIN_TRACK_TYPE: + case GRIDCHAIN_TRACK_TYPE: ::new (this) GridChainTrack; break; + case PERF_TRACK_TYPE: + ::new (this) PerfTrack; + break; } return this; } diff --git a/avr/cores/megacommand/MCL/DeviceTrack.h b/avr/cores/megacommand/MCL/DeviceTrack.h index da599856b..88f81b280 100644 --- a/avr/cores/megacommand/MCL/DeviceTrack.h +++ b/avr/cores/megacommand/MCL/DeviceTrack.h @@ -18,6 +18,8 @@ class MDRouteTrack; class MDTempoTrack; class MDLFOTrack; class MNMTrack; +class PerfTrack; +class GridChainTrack; #define __IMPL_DYNAMIK_KAST(klass, pred, aktive) \ void _dynamik_kast_impl(DeviceTrack *p, klass **pp) { \ @@ -50,6 +52,8 @@ class DeviceTrack : public GridTrack { __IMPL_DYNAMIK_KAST(MDTempoTrack, MDTEMPO_TRACK_TYPE, MDTEMPO_TRACK_TYPE) __IMPL_DYNAMIK_KAST(MNMTrack, MNM_TRACK_TYPE, MNM_TRACK_TYPE) __IMPL_DYNAMIK_KAST(MDLFOTrack, MDLFO_TRACK_TYPE, MDLFO_TRACK_TYPE) + __IMPL_DYNAMIK_KAST(PerfTrack, PERF_TRACK_TYPE, PERF_TRACK_TYPE) + __IMPL_DYNAMIK_KAST(GridChainTrack, GRIDCHAIN_TRACK_TYPE, GRIDCHAIN_TRACK_TYPE) public: // bool get_track_from_sysex(int tracknumber, uint8_t column); diff --git a/avr/cores/megacommand/MCL/GridPage.cpp b/avr/cores/megacommand/MCL/GridPage.cpp index 05b868a8e..154dc3521 100644 --- a/avr/cores/megacommand/MCL/GridPage.cpp +++ b/avr/cores/megacommand/MCL/GridPage.cpp @@ -470,6 +470,10 @@ void GridPage::display_grid() { str[0] = 'C'; str[1] = 'N'; break; + case PERF_TRACK_TYPE: + str[0] = 'P'; + str[1] = 'F'; + break; case MNM_TRACK_TYPE: tmp = getMNMMachineNameShort(model, 2); if (tmp) { diff --git a/avr/cores/megacommand/MCL/GridTrack.h b/avr/cores/megacommand/MCL/GridTrack.h index d6bf24bab..cec77929c 100644 --- a/avr/cores/megacommand/MCL/GridTrack.h +++ b/avr/cores/megacommand/MCL/GridTrack.h @@ -22,6 +22,8 @@ #define EXT_ARP_TRACK_TYPE 14 #define GRIDCHAIN_TRACK_TYPE 15 +#define PERF_TRACK_TYPE 16 + #define NULL_TRACK_TYPE 128 #define EMPTY_TRACK_TYPE 0 diff --git a/avr/cores/megacommand/MCL/MCLMemory.h b/avr/cores/megacommand/MCL/MCLMemory.h index 220c22a98..dc4addcdd 100644 --- a/avr/cores/megacommand/MCL/MCLMemory.h +++ b/avr/cores/megacommand/MCL/MCLMemory.h @@ -35,9 +35,10 @@ constexpr size_t NUM_EXT_TRACKS = 0; constexpr size_t NUM_INSTRUMENT_TRACKS = (NUM_MD_TRACKS + NUM_EXT_TRACKS); -constexpr size_t NUM_AUX_TRACKS = 3; +constexpr size_t NUM_AUX_TRACKS = 4; -constexpr size_t GRIDCHAIN_TRACK_NUM = 11; +constexpr size_t GRIDCHAIN_TRACK_NUM = 10; +constexpr size_t PERF_TRACK_NUM = 11; constexpr size_t MDFX_TRACK_NUM = 12; //position of MDFX track in grid constexpr size_t MDLFO_TRACK_NUM = 13; //position of MDLFO track in grid constexpr size_t MDROUTE_TRACK_NUM = 14; //position of MDROUTE track in grid @@ -73,6 +74,7 @@ constexpr size_t MDLFO_TRACK_LEN = 226; constexpr size_t MDROUTE_TRACK_LEN = 25; constexpr size_t MDFX_TRACK_LEN = 43; constexpr size_t MDTEMPO_TRACK_LEN = 11; +constexpr size_t PERF_TRACK_LEN = 423; constexpr size_t GRIDCHAIN_TRACK_LEN = 551; //Use these to produce compiler errors that probes the sizes! @@ -99,8 +101,9 @@ constexpr size_t BANK1_MDLFO_TRACK_START = BANK1_GRIDCHAIN_TRACK_START + GRIDCHA constexpr size_t BANK1_MDROUTE_TRACK_START = BANK1_MDLFO_TRACK_START + MDLFO_TRACK_LEN; constexpr size_t BANK1_MDFX_TRACK_START = BANK1_MDROUTE_TRACK_START + MDROUTE_TRACK_LEN; constexpr size_t BANK1_MDTEMPO_TRACK_START = BANK1_MDFX_TRACK_START + MDFX_TRACK_LEN; +constexpr size_t BANK1_PERF_TRACK_START = BANK1_MDTEMPO_TRACK_START + MDTEMPO_TRACK_LEN; // 6x A4 tracks -constexpr size_t BANK1_A4_TRACKS_START = BANK1_MDTEMPO_TRACK_START + MDTEMPO_TRACK_LEN; +constexpr size_t BANK1_A4_TRACKS_START = BANK1_MDTEMPO_TRACK_START + PERF_TRACK_LEN; // 512x file entries (16 bytes each), stored in Bank3 constexpr size_t NUM_FILE_ENTRIES = 408; diff --git a/avr/cores/megacommand/MCL/MCLMenus.h b/avr/cores/megacommand/MCL/MCLMenus.h index 285e2f752..f59ad90e2 100644 --- a/avr/cores/megacommand/MCL/MCLMenus.h +++ b/avr/cores/megacommand/MCL/MCLMenus.h @@ -112,7 +112,7 @@ extern MCLEncoder wavdesign_menu_entry_encoder; constexpr size_t wavdesign_menu_page_N = 3; extern MenuPage wavdesign_menu_page; -constexpr size_t perf_menu_page_N = 2; +constexpr size_t perf_menu_page_N = 1; extern MenuPage perf_menu_page; extern uint8_t opt_import_src; diff --git a/avr/cores/megacommand/MCL/MCL_impl.h b/avr/cores/megacommand/MCL/MCL_impl.h index d7ade395c..c8182f87e 100644 --- a/avr/cores/megacommand/MCL/MCL_impl.h +++ b/avr/cores/megacommand/MCL/MCL_impl.h @@ -77,6 +77,7 @@ #include "MDRouteTrack.h" #include "MDTempoTrack.h" #include "GridChainTrack.h" +#include "PerfTrack.h" #include "ArpSeqTrack.h" #include "EmptyTrack.h" diff --git a/avr/cores/megacommand/MCL/PerfTrack.cpp b/avr/cores/megacommand/MCL/PerfTrack.cpp new file mode 100644 index 000000000..6beeccb1d --- /dev/null +++ b/avr/cores/megacommand/MCL/PerfTrack.cpp @@ -0,0 +1,78 @@ +#include "MCL_impl.h" + +void PerfTrack::transition_send(uint8_t tracknumber, uint8_t slotnumber) { + load_perf(); +} + +uint16_t PerfTrack::calc_latency(uint8_t tracknumber) { + return 0; +} +void PerfTrack::get_perf() { + + for (uint8_t n = 0; n < 4; n++) { + PerfEncoder *e = perf_page.perf_encoders[n]; + PerfData *d = &e->perf_data; + encs[n].src = d->src; + encs[n].param = d->param; + encs[n].min = d->min; + encs[n].active_scene_a = e->active_scene_a; + encs[n].active_scene_b = e->active_scene_b; + encs[n].cur = e->cur; + } + DEBUG_PRINTLN("get perf"); + DEBUG_PRINTLN(sizeof(scenes)); + memcpy(&scenes[0], &PerfData::scenes[0], sizeof(scenes)); +} + + +void PerfTrack::load_perf() { + + for (uint8_t n = 0; n < 4; n++) { + PerfEncoder *e = perf_page.perf_encoders[n]; + PerfData *d = &e->perf_data; + d->src = encs[n].src; + d->param = encs[n].param; + d->min = encs[n].min; + e->active_scene_a = encs[n].active_scene_a; + e->active_scene_b = encs[n].active_scene_b; + e->cur = encs[n].cur; + } + + DEBUG_PRINTLN("load perf"); + DEBUG_PRINTLN( sizeof(scenes)); + memcpy(&PerfData::scenes[0], &scenes[0], sizeof(scenes)); +} + +void PerfTrack::load_immediate(uint8_t tracknumber, SeqTrack *seq_track) { + load_link_data(seq_track); + load_perf(); +} + +bool PerfTrack::store_in_grid(uint8_t column, uint16_t row, + SeqTrack *seq_track, uint8_t merge, + bool online, Grid *grid) { + active = PERF_TRACK_TYPE; + bool ret; + int b = 0; + DEBUG_PRINT_FN(); + uint32_t len; + + if (column != 255 && online == true) { + get_perf(); + if (merge == SAVE_MD) { + link.length = MD.pattern.patternLength; + link.speed = SEQ_SPEED_1X + MD.pattern.doubleTempo; + } + } + + len = sizeof(PerfTrack); + DEBUG_PRINTLN(len); + + ret = write_grid((uint8_t *)(this), len, column, row, grid); + + if (!ret) { + DEBUG_PRINTLN(F("write failed")); + return false; + } + return true; +} diff --git a/avr/cores/megacommand/MCL/PerfTrack.h b/avr/cores/megacommand/MCL/PerfTrack.h new file mode 100644 index 000000000..228974592 --- /dev/null +++ b/avr/cores/megacommand/MCL/PerfTrack.h @@ -0,0 +1,54 @@ +/* Justin Mammarella jmamma@gmail.com 2018 */ + +#pragma once + +#include "AUXTrack.h" + +class PerfTrackEncoderData { +public: + uint8_t src; + uint8_t param; + uint8_t min; + + uint8_t active_scene_a; + uint8_t active_scene_b; + + uint8_t cur; +}; + +class PerfTrackData { +public: + PerfTrackEncoderData encs[4]; + PerfScene scenes[NUM_SCENES]; +}; + +class PerfTrack : public AUXTrack, public PerfTrackData { +public: + PerfTrack() { + active = PERF_TRACK_TYPE; + static_assert(sizeof(PerfTrack) <= PERF_TRACK_LEN); + } + + void init() {} + + void load_perf(); + void get_perf(); + + uint16_t calc_latency(uint8_t tracknumber); + + void transition_send(uint8_t tracknumber, uint8_t slotnumber); + bool store_in_grid(uint8_t column, uint16_t row, + SeqTrack *seq_track = nullptr, uint8_t merge = 0, + bool online = false, Grid *grid = nullptr); + + void load_immediate(uint8_t tracknumber, SeqTrack *seq_track); + + virtual uint16_t get_track_size() { return sizeof(PerfTrack); } + virtual uint16_t get_region() { return BANK1_PERF_TRACK_START; } + + virtual uint8_t get_model() { return PERF_TRACK_TYPE; } + virtual uint8_t get_device_type() { return PERF_TRACK_TYPE; } + + virtual void *get_sound_data_ptr() { return &encs; } + virtual size_t get_sound_data_size() { return sizeof(PerfTrackData); } +}; diff --git a/resource/menu_layouts.cpp b/resource/menu_layouts.cpp index c5c5eeec4..49c516e61 100644 --- a/resource/menu_layouts.cpp +++ b/resource/menu_layouts.cpp @@ -269,7 +269,7 @@ menu_t perf_menu_layout = { // m r n d p f o {"CTRL SEL:",0, 4, 4, 59, 255, 0, 117}, - {"PARAM:", 0, 17, 1, 58, 255, 0, 116}, + // {"PARAM:", 0, 17, 1, 58, 255, 0, 116}, }, 0, 0 }; From 7bef29208e1bb7717a7c80bf3f9d551fd8fc6881 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 5 Jul 2023 10:40:12 +1000 Subject: [PATCH 172/413] Checkin --- avr/cores/megacommand/MCL/AuxPages.cpp | 8 +- avr/cores/megacommand/MCL/PerfPage.cpp | 6 - avr/cores/megacommand/MCL/PerfTrack.h | 15 +- avr/cores/megacommand/MD/MD.cpp | 3 + avr/cores/megacommand/resources/R.h | 8 +- .../megacommand/resources/R_menu_layouts.cpp | 746 +++++++++--------- resource/page_entries.cpp | 2 +- 7 files changed, 392 insertions(+), 396 deletions(-) diff --git a/avr/cores/megacommand/MCL/AuxPages.cpp b/avr/cores/megacommand/MCL/AuxPages.cpp index 346f5a2e5..1e56c883b 100644 --- a/avr/cores/megacommand/MCL/AuxPages.cpp +++ b/avr/cores/megacommand/MCL/AuxPages.cpp @@ -13,10 +13,10 @@ MCLEncoder fx_param2; MCLEncoder fx_param3; MCLEncoder fx_param4; -PerfEncoder perf_param1; -PerfEncoder perf_param2; -PerfEncoder perf_param3; -PerfEncoder perf_param4; +PerfEncoder perf_param1(0,127); +PerfEncoder perf_param2(0,127); +PerfEncoder perf_param3(0,127); +PerfEncoder perf_param4(0,127); MixerPage mixer_page(&perf_param1, &perf_param2, &perf_param3, &perf_param4); diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 1e8e42b45..5c6a0da8b 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -8,10 +8,6 @@ void PerfPage::setup() { DEBUG_PRINT_FN(); page_mode = PERF_DESTINATION; - perf_encoders[0] = &perf_param1; - perf_encoders[1] = &perf_param2; - perf_encoders[2] = &perf_param3; - perf_encoders[3] = &perf_param4; } void PerfPage::init() { @@ -86,8 +82,6 @@ void PerfPage::config_encoders(uint8_t show_val) { encoders[2] = &fx_param3; encoders[3] = &fx_param4; - ((PerfEncoder *)encoders[0])->max = 127; - if (page_mode > PERF_DESTINATION) { if (learn) { uint8_t scene = learn - 1; diff --git a/avr/cores/megacommand/MCL/PerfTrack.h b/avr/cores/megacommand/MCL/PerfTrack.h index 228974592..9534907bd 100644 --- a/avr/cores/megacommand/MCL/PerfTrack.h +++ b/avr/cores/megacommand/MCL/PerfTrack.h @@ -14,6 +14,12 @@ class PerfTrackEncoderData { uint8_t active_scene_b; uint8_t cur; + void init() { + src = param = min = 0; + active_scene_a = 0; + active_scene_b = 1; + } + }; class PerfTrackData { @@ -29,7 +35,14 @@ class PerfTrack : public AUXTrack, public PerfTrackData { static_assert(sizeof(PerfTrack) <= PERF_TRACK_LEN); } - void init() {} + void init() { + for (uint8_t n = 0; n < NUM_SCENES; n++) { + if (n < 4) { + encs[n].init(); + } + scenes[n].init(); + } + } void load_perf(); void get_perf(); diff --git a/avr/cores/megacommand/MD/MD.cpp b/avr/cores/megacommand/MD/MD.cpp index 64627fe47..29f4bdda6 100644 --- a/avr/cores/megacommand/MD/MD.cpp +++ b/avr/cores/megacommand/MD/MD.cpp @@ -165,6 +165,9 @@ void MDClass::init_grid_devices(uint8_t device_idx) { gdt.init(MDTEMPO_TRACK_TYPE, GROUP_TEMPO, device_idx, (SeqTrack*) &(mcl_seq.aux_tracks[2]), 0); add_track_to_grid(grid_idx, MDFX_TRACK_NUM + 3, &gdt); + gdt.init(PERF_TRACK_TYPE, GROUP_AUX, device_idx, (SeqTrack*) &(mcl_seq.aux_tracks[3]), 0); + add_track_to_grid(grid_idx, PERF_TRACK_NUM, &gdt); + } void MDClass::get_mutes() { diff --git a/avr/cores/megacommand/resources/R.h b/avr/cores/megacommand/resources/R.h index d7806045d..39dde1169 100644 --- a/avr/cores/megacommand/resources/R.h +++ b/avr/cores/megacommand/resources/R.h @@ -251,10 +251,10 @@ extern const unsigned char __R_menu_layouts[] PROGMEM; struct __T_menu_layouts { union { menu_t perf_menu_layout[0]; - char zz__perf_menu_layout[54]; + char zz__perf_menu_layout[33]; }; - static constexpr size_t countof_perf_menu_layout = 54 / sizeof(menu_t); - static constexpr size_t sizeofof_perf_menu_layout = 54; + static constexpr size_t countof_perf_menu_layout = 33 / sizeof(menu_t); + static constexpr size_t sizeofof_perf_menu_layout = 33; union { menu_t wavdesign_menu_layout[0]; char zz__wavdesign_menu_layout[75]; @@ -369,7 +369,7 @@ struct __T_menu_layouts { }; static constexpr size_t countof_boot_menu_layout = 96 / sizeof(menu_t); static constexpr size_t sizeofof_boot_menu_layout = 96; - static constexpr size_t __total_size = 2214; + static constexpr size_t __total_size = 2193; }; extern const unsigned char __R_menu_options[] PROGMEM; diff --git a/avr/cores/megacommand/resources/R_menu_layouts.cpp b/avr/cores/megacommand/resources/R_menu_layouts.cpp index 9ffa20f6f..cdda04b27 100644 --- a/avr/cores/megacommand/resources/R_menu_layouts.cpp +++ b/avr/cores/megacommand/resources/R_menu_layouts.cpp @@ -18,27 +18,12 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 103, 14, 4, - 255, + 253, 4, 59, 255, 0, 117, - 80, - 65, - 82, - 236, - 65, - 77, - 58, - 35, - 158, - 17, - 1, - 58, - 221, - 20, - 116, 0, 128, 0, @@ -47,1040 +32,1041 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 68, 73, 84, - 31, - 45, - 214, - 53, - 40, + 28, + 54, 32, - 253, + 12, + 40, + 191, 80, 87, 65, 86, 58, - 128, + 96, 35, - 246, + 61, 6, 6, 41, + 182, 20, - 237, 74, - 84, 73, - 251, + 254, + 65, 78, 83, 70, 69, 82, + 203, 23, - 47, + 255, 255, 22, - 253, 0, 23, 0, 83, 108, 111, - 131, - 80, + 179, + 116, + 14, + 253, 71, - 251, 82, 73, 68, 58, 32, + 147, 29, - 39, 2, + 219, 2, - 183, 31, 53, 52, + 246, 77, - 236, 79, 68, 69, 75, - 191, + 95, 1, 4, 3, + 183, 32, - 111, 20, 20, 76, + 218, 69, - 181, 78, 40, - 172, + 214, 0, 20, - 63, + 31, 65, 0, 39, + 181, 255, - 107, 6, + 144, 20, - 33, - 147, + 201, 129, - 236, + 246, 79, 79, 80, 83, - 7, + 3, 64, + 221, 0, - 187, 33, 20, 74, + 200, 85, - 144, 77, - 63, + 31, 128, 128, 34, + 182, 255, - 109, 4, 67, - 173, + 222, 63, - 235, - 176, + 65, + 82, 58, + 192, 125, - 29, + 118, 36, 255, - 182, 44, + 219, 67, 61, - 220, 89, + 115, 84, - 203, 20, - 152, + 46, 37, - 47, - 19, + 111, + 80, + 65, 83, 84, + 176, 69, - 96, 41, - 119, + 59, 38, 20, - 90, + 173, 82, 125, - 22, - 40, + 225, + 65, + 77, 69, - 16, 25, - 63, + 3, + 251, 255, 20, 0, 21, - 182, 0, 41, + 97, 80, - 16, - 94, - 89, + 73, + 5, + 148, 95, - 79, + 249, 30, 255, 15, - 158, 30, + 238, 32, - 235, 77, + 178, 80, 53, - 47, + 246, 16, 0, - 98, 95, - 194, + 44, 21, - 126, + 39, 255, 17, + 237, 0, 77, 85, - 214, 19, + 100, 41, - 67, + 61, 18, - 219, 0, 19, + 187, 95, 69, - 176, 81, 14, - 67, + 4, + 54, 94, - 97, 67, 75, - 191, - 38, + 18, + 170, + 109, 1, - 223, 49, + 240, 14, 255, 3, 0, - 11, + 189, 59, 86, - 217, 73, 67, + 147, 171, - 62, 1, + 238, 3, 2, 50, - 224, 233, - 148, + 9, 178, - 251, + 79, 15, 255, 4, + 178, 48, 20, - 33, - 237, + 30, 9, 1, 16, + 223, 41, - 246, 54, 67, 67, 58, + 96, 209, - 7, + 125, 133, - 219, 5, 17, + 188, 20, 55, - 194, 83, 76, + 43, 166, - 176, 254, - 155, + 9, + 182, 18, 20, - 109, 25, + 223, 218, - 255, 80, 69, 71, 71, + 240, 73, 65, 84, 79, - 8, + 134, 223, - 97, + 27, 52, - 187, 75, 69, + 176, 89, 63, - 3, - 237, + 62, 12, 12, 19, + 220, 41, - 198, 104, 86, - 97, - 33, + 98, + 76, + 18, 124, - 44, - 40, + 194, 205, - 96, + 134, 145, - 184, + 11, 7, 78, + 132, 68, - 64, 229, - 123, + 7, 15, 15, + 183, 21, 20, - 118, 60, 83, + 109, 82, - 216, 69, + 128, 21, - 15, + 254, 7, 7, 22, - 225, 255, 5, 41, + 27, 229, - 188, 71, 84, + 201, 72, 58, - 151, + 125, 23, - 219, 255, 6, + 177, 62, 72, - 27, + 182, 90, 78, - 100, 87, - 187, + 75, 251, + 188, 24, 255, - 194, 7, 0, + 36, 187, - 67, + 63, 3, - 248, 3, 25, 255, 8, + 132, 27, - 66, 133, - 221, + 45, + 220, 20, 26, - 200, 255, 9, - 7, + 128, + 120, 10, - 132, 30, + 66, 229, - 45, - 223, + 221, 20, 27, + 254, 255, 11, 27, 83, - 225, 72, 73, 70, + 16, 38, - 1, - 252, + 31, 5, 5, 28, 255, + 194, 12, 35, - 43, 250, + 183, 211, - 118, 82, 83, + 107, 43, - 178, 41, - 127, + 39, 29, 255, + 255, 13, 27, 80, 79, - 246, 76, 89, 80, 72, + 109, 214, - 217, 89, + 147, 44, - 54, 11, + 107, 2, - 183, 41, + 125, 67, 32, - 218, 81, 85, + 173, 171, - 208, 66, - 131, + 8, 58, + 51, 42, - 55, + 118, 83, 79, 85, - 104, 252, - 64, + 132, 102, - 198, + 12, + 107, 184, - 183, 2, + 125, 14, 0, - 218, 70, 73, + 163, 149, - 48, 57, - 91, + 5, + 182, 48, 67, - 104, 220, - 194, - 90, + 140, 90, + 37, + 173, 2, - 220, 238, + 194, 87, 32, - 46, 178, + 236, 82, 46, - 192, 20, - 195, + 12, + 51, 238, - 53, 51, - 172, + 90, 180, + 200, 41, - 132, - 101, + 70, 153, - 110, + 86, + 235, 20, - 186, 79, 178, + 169, 87, - 149, 111, - 172, + 90, 44, + 194, 41, - 47, + 255, 67, 86, - 242, 32, 65, 76, 76, - 18, - 214, + 33, + 45, 216, + 107, 157, - 178, 20, - 151, + 41, + 116, 22, - 67, 89, + 53, 30, - 94, 77, + 237, 9, - 208, 133, - 184, + 11, 168, 76, + 132, 65, - 67, 233, - 117, + 55, 212, + 91, 13, - 184, 32, 23, + 141, 1, - 214, 176, + 100, 211, - 79, + 244, 83, 82, 67, - 76, + 201, 109, - 144, 110, - 24, + 1, + 142, 43, - 230, 132, + 107, 170, - 181, 63, - 33, + 82, 131, - 51, + 19, 44, - 134, + 56, + 96, 10, - 9, + 151, 94, - 113, 1, - 183, + 27, 27, 45, + 123, 149, - 180, 19, - 51, + 67, 29, + 48, 191, - 9, - 181, + 155, 25, 4, - 128, + 88, 95, - 210, + 13, 73, + 40, 205, - 141, + 219, 117, - 176, 84, 32, - 56, + 3, + 134, 33, - 102, 31, + 109, 18, - 219, 77, + 188, 181, 73, - 194, 90, 69, + 33, 106, - 29, + 219, 8, - 176, 74, 16, - 241, + 15, 148, 32, - 193, + 28, 107, + 22, 91, - 97, 71, + 18, 148, - 37, - 143, + 88, 74, + 246, 32, 77, 73, - 104, 198, - 127, + 135, 106, + 241, 72, 82, 79, 32, - 30, + 236, 77, - 207, 53, + 253, 18, 2, - 218, 9, 255, + 175, 4, - 246, 53, + 97, 20, - 19, + 50, 46, - 45, + 210, 88, - 43, 110, + 181, 67, - 88, + 132, 20, - 77, + 221, 57, - 214, 41, 24, + 107, 172, - 180, 193, - 32, + 66, 83, - 191, + 11, 81, + 254, 32, 49, - 227, 32, 70, 87, + 53, 194, - 82, + 39, 101, - 118, 7, + 109, 32, - 216, 10, + 140, 20, - 200, 50, - 12, + 128, + 203, 51, - 190, 92, + 236, 85, 83, 66, - 193, 17, - 72, + 20, + 131, 143, - 54, 52, + 110, 20, - 227, 96, 67, + 53, 41, - 87, + 120, 187, - 132, + 75, 85, - 187, + 183, 11, 20, - 112, 86, 24, - 195, + 12, 118, + 53, 11, - 86, + 97, 79, - 29, + 211, 79, - 48, 239, - 120, + 7, 178, + 140, 58, - 206, 117, + 237, 5, - 216, 32, + 129, 7, - 17, 99, - 96, + 22, 20, - 115, + 7, 53, 51, 41, - 12, + 48, + 204, 199, - 195, 116, - 133, + 56, 6, + 91, 65, - 177, 100, 41, - 96, + 22, 20, - 118, + 7, 54, + 109, 41, - 219, 100, + 182, 95, 80, - 108, 192, + 218, 71, - 12, - 241, + 25, + 25, 215, - 17, + 205, 9, - 52, 223, - 9, + 2, 124, - 110, + 91, 128, - 182, + 173, 49, 32, + 190, 90, - 251, 20, 73, + 197, 242, - 22, + 131, 245, - 12, 47, - 51, + 12, 10, + 247, 20, - 220, 246, - 195, + 48, 21, - 238, + 251, 17, 2, 48, 20, - 112, + 156, 74, - 106, + 26, 148, 83, - 207, + 179, 154, + 240, 85, 82, - 194, 66, 79, + 172, 11, - 178, 224, - 246, + 189, 2, 255, + 172, 79, - 179, 20, - 146, - 50, 228, + 50, + 185, 3, - 144, - 214, + 36, + 53, 16, 58, + 131, 20, - 12, 55, - 208, + 52, 68, - 163, + 40, 106, + 230, 173, - 154, 42, - 201, + 178, 137, - 182, + 109, 4, 191, + 131, 84, - 12, - 173, - 94, + 152, + 23, 98, - 179, + 172, 238, - 109, + 219, 41, 56, - 136, + 98, 191, - 77, + 19, 199, - 204, + 115, 0, 126, - 66, + 16, + 133, 235, - 23, + 225, 34, - 132, 0, 62, - 216, + 54, 0, - 78, + 19, 36, + 132, 0, - 17, 179, - 109, + 91, 212, 71, - 128, + 96, 20, - 225, + 56, 37, 0, + 67, 8, - 13, - 128, + 96, 20, - 198, + 49, 35, + 146, 40, - 75, + 192, 20, - 1, - 189, + 111, 38, 4, - 205, + 115, 39, 138, - 195, + 112, 65, 71, + 214, 247, - 91, 76, 71, + 214, 75, - 89, 221, - 110, + 91, 170, - 164, + 169, 1, 44, - 123, + 30, 65, 85, 88, + 198, 32, - 27, 83, + 207, 42, - 62, 97, 103, + 178, 101, - 203, 35, - 135, + 225, 31, 204, - 101, + 217, 167, - 133, + 97, 171, - 181, + 109, 65, 100, - 208, + 116, 124, 74, - 163, + 40, 195, + 193, 210, - 6, + 164, 25, - 145, 236, - 97, + 88, 19, - 41, + 74, + 107, 2, - 172, 2, 234, - 88, + 22, 203, - 93, + 23, 26, - 209, + 116, 161, 65, - 173, + 107, 147, 131, - 2, + 64, + 169, 54, - 165, 52, - 97, + 88, 186, - 216, + 118, 27, 126, - 11, + 2, + 201, 41, - 38, + 164, 29, - 144, 192, - 216, + 54, 62, - 28, + 7, 30, - 59, + 14, 54, + 193, 102, - 5, - 132, + 97, 137, - 27, + 6, + 232, 4, - 163, 66, + 214, 170, - 88, 15, - 56, + 14, 79, 83, - 88, + 22, 190, 80, - 97, + 24, 57, - 169, + 106, 56, + 73, 173, - 37, - 188, + 111, 129, 68, 70, 85, - 98, + 24, 75, - 144, + 164, 194, - 22, + 5, + 163, 171, - 143, 246, - 93, + 215, 59, + 88, 75, - 96, 20, - 49, + 12, 28, - 109, + 91, 78, 88, - 106, + 90, 147, - 72, + 146, 236, - 110, + 27, 29, 4, + 128, 0, 0, 0, 0, - 0, - 4, - 255, + 1, + 63, 255, }; diff --git a/resource/page_entries.cpp b/resource/page_entries.cpp index 5e6ff624f..79e89a837 100644 --- a/resource/page_entries.cpp +++ b/resource/page_entries.cpp @@ -14,8 +14,8 @@ PageSelectEntry Entries[] = { #endif #ifdef WAV_DESIGNER {"WAV DESIGNER", WD_PAGE_0, 9, 2, 24, 19, nullptr}, - {"PERF", PERF_PAGE_0, 10, 2, 24, 19, nullptr}, #endif + {"PERF", PERF_PAGE_0, 10, 2, 24, 19, nullptr}, {"DELAY", FX_PAGE_A, 12, 3, 24, 25, nullptr}, {"REVERB", FX_PAGE_B, 13, 3, 24, 25, nullptr}, {"RAM-1", RAM_PAGE_A, 14, 3, 24, 25, nullptr}, From d1486d3a0075b1ad828d97eeb01b96f7e56a1e76 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 5 Jul 2023 10:45:53 +1000 Subject: [PATCH 173/413] mclmemory reorder --- avr/cores/megacommand/MCL/MCLMemory.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCLMemory.h b/avr/cores/megacommand/MCL/MCLMemory.h index dc4addcdd..1712f5018 100644 --- a/avr/cores/megacommand/MCL/MCLMemory.h +++ b/avr/cores/megacommand/MCL/MCLMemory.h @@ -97,13 +97,13 @@ constexpr size_t BANK1_AUX_TRACKS_START = BANK1_MD_TRACKS_START + GRID1_TRACK_LE // AUX Tracks constexpr size_t BANK1_GRIDCHAIN_TRACK_START = BANK1_AUX_TRACKS_START; -constexpr size_t BANK1_MDLFO_TRACK_START = BANK1_GRIDCHAIN_TRACK_START + GRIDCHAIN_TRACK_LEN; +constexpr size_t BANK1_PERF_TRACK_START = BANK1_GRIDCHAIN_TRACK_START + GRIDCHAIN_TRACK_LEN; +constexpr size_t BANK1_MDLFO_TRACK_START = BANK1_PERF_TRACK_START + PERF_TRACK_LEN; constexpr size_t BANK1_MDROUTE_TRACK_START = BANK1_MDLFO_TRACK_START + MDLFO_TRACK_LEN; constexpr size_t BANK1_MDFX_TRACK_START = BANK1_MDROUTE_TRACK_START + MDROUTE_TRACK_LEN; constexpr size_t BANK1_MDTEMPO_TRACK_START = BANK1_MDFX_TRACK_START + MDFX_TRACK_LEN; -constexpr size_t BANK1_PERF_TRACK_START = BANK1_MDTEMPO_TRACK_START + MDTEMPO_TRACK_LEN; // 6x A4 tracks -constexpr size_t BANK1_A4_TRACKS_START = BANK1_MDTEMPO_TRACK_START + PERF_TRACK_LEN; +constexpr size_t BANK1_A4_TRACKS_START = BANK1_MDTEMPO_TRACK_START + MDTEMPO_TRACK_LEN;; // 512x file entries (16 bytes each), stored in Bank3 constexpr size_t NUM_FILE_ENTRIES = 408; From 31866d966d55d2aa238440f844ead393c8365041 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 5 Jul 2023 11:01:19 +1000 Subject: [PATCH 174/413] initialisation --- avr/cores/megacommand/MCL/MCL.cpp | 1 + avr/cores/megacommand/MCL/PerfPage.cpp | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/avr/cores/megacommand/MCL/MCL.cpp b/avr/cores/megacommand/MCL/MCL.cpp index 2f138684b..9538a6ce9 100644 --- a/avr/cores/megacommand/MCL/MCL.cpp +++ b/avr/cores/megacommand/MCL/MCL.cpp @@ -156,6 +156,7 @@ void MCL::setup() { A4SysexListener.setup(&Midi2); MNMSysexListener.setup(&Midi2); #endif + perf_page.setup(); grid_task.init(); diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 5c6a0da8b..979f79834 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -8,6 +8,10 @@ void PerfPage::setup() { DEBUG_PRINT_FN(); page_mode = PERF_DESTINATION; + perf_encoders[0] = &perf_param1; + perf_encoders[1] = &perf_param2; + perf_encoders[2] = &perf_param3; + perf_encoders[3] = &perf_param4; } void PerfPage::init() { From f77fc91ebcc9b1b389aeb9c2b8ea261aa9cd7ad6 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 5 Jul 2023 12:39:59 +1000 Subject: [PATCH 175/413] Constructors were blowing away Perf data on load :'-( --- avr/cores/megacommand/MCL/DeviceTrack.cpp | 3 +++ avr/cores/megacommand/MCL/PerfData.h | 20 ++++++++++++++++++-- avr/cores/megacommand/MCL/PerfEncoder.h | 2 ++ avr/cores/megacommand/MCL/PerfPage.cpp | 13 ++++++++++--- avr/cores/megacommand/MCL/PerfTrack.cpp | 13 ++++++++----- 5 files changed, 41 insertions(+), 10 deletions(-) diff --git a/avr/cores/megacommand/MCL/DeviceTrack.cpp b/avr/cores/megacommand/MCL/DeviceTrack.cpp index 2702ef777..eca00204f 100644 --- a/avr/cores/megacommand/MCL/DeviceTrack.cpp +++ b/avr/cores/megacommand/MCL/DeviceTrack.cpp @@ -56,6 +56,9 @@ DeviceTrack *DeviceTrack::load_from_grid_512(uint8_t column, uint16_t row, Grid // virtual functions are ready + DEBUG_PRINTLN("device load from 512"); + DEBUG_PRINTLN(active != EMPTY_TRACK_TYPE); + DEBUG_PRINTLN(ptrack->get_track_size()); if (active != EMPTY_TRACK_TYPE) { if ( ptrack->get_track_size() < 512) { return ptrack; } size_t len = ptrack->get_track_size() - 512; diff --git a/avr/cores/megacommand/MCL/PerfData.h b/avr/cores/megacommand/MCL/PerfData.h index dbfbbafa4..145730ea3 100644 --- a/avr/cores/megacommand/MCL/PerfData.h +++ b/avr/cores/megacommand/MCL/PerfData.h @@ -47,7 +47,7 @@ class PerfScene { public: PerfParam params[NUM_PERF_PARAMS]; uint8_t count; - PerfScene() { init(); } + PerfScene() { } bool is_active() { return count > 0; } @@ -60,6 +60,17 @@ class PerfScene { } } + void debug() { + DEBUG_PRINT("count: "); DEBUG_PRINTLN(count); + for (uint8_t n = 0; n < NUM_PERF_PARAMS; n++) { + DEBUG_PRINT("PARAM "); DEBUG_PRINT(n); + DEBUG_PRINT(" DEST:"); DEBUG_PRINT(params[n].dest); + DEBUG_PRINT(" PARAM:"); DEBUG_PRINT(params[n].param); + DEBUG_PRINT(" DEST:"); DEBUG_PRINT(params[n].dest); + DEBUG_PRINTLN(""); + } + } + uint8_t add_param(uint8_t dest, uint8_t param, uint8_t value) { uint8_t match = 255; @@ -140,7 +151,12 @@ class PerfData { uint8_t min; - PerfData() { init_params(); } + PerfData() { } + + void init() { + src = param = min = 0; + init_params(); + } void *data() const { return (void *)&scenes; } diff --git a/avr/cores/megacommand/MCL/PerfEncoder.h b/avr/cores/megacommand/MCL/PerfEncoder.h index 4ba16c5b1..0fcfb4069 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.h +++ b/avr/cores/megacommand/MCL/PerfEncoder.h @@ -17,6 +17,8 @@ class PerfEncoder : public MCLEncoder { uint8_t active_scene_a = 0; uint8_t active_scene_b = 1; + + void init() { perf_data.init(); } void send(); void send_param(uint8_t dest, uint8_t param, uint8_t val); void send_params(uint8_t cur_, PerfScene *s1, PerfScene *s2); diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 979f79834..555bdc745 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -8,6 +8,11 @@ void PerfPage::setup() { DEBUG_PRINT_FN(); page_mode = PERF_DESTINATION; + perf_param1.init(); + perf_param2.init(); + perf_param3.init(); + perf_param4.init(); + perf_encoders[0] = &perf_param1; perf_encoders[1] = &perf_param2; perf_encoders[2] = &perf_param3; @@ -134,7 +139,7 @@ void PerfPage::config_encoders(uint8_t show_val) { } } void PerfPage::update_params() { - + if (show_menu) { return; } uint8_t c = page_mode - 1; if (page_mode > PERF_DESTINATION) { config_encoder_range(1); @@ -357,7 +362,7 @@ bool PerfPage::handleEvent(gui_event_t *event) { return true; } - if (show_menu) { perf_id = track; config_encoders(); return true; } + if (show_menu) { perf_id = track; return true; } PerfEncoder *e = perf_encoders[perf_id]; @@ -380,7 +385,7 @@ bool PerfPage::handleEvent(gui_event_t *event) { } } if (event->mask == EVENT_BUTTON_RELEASED) { - + if (show_menu) { return true; } if (note_interface.notes_all_off()) { learn = LEARN_OFF; seq_step_page.enable_paramupdate_events(); @@ -528,10 +533,12 @@ bool PerfPage::handleEvent(gui_event_t *event) { encoders[0] = &seq_menu_value_encoder; encoders[1] = &seq_menu_entry_encoder; perf_menu_page.init(); + return true; } if (EVENT_RELEASED(event, Buttons.BUTTON3)) { show_menu = false; config_encoders(); + return true; } return false; diff --git a/avr/cores/megacommand/MCL/PerfTrack.cpp b/avr/cores/megacommand/MCL/PerfTrack.cpp index 6beeccb1d..40af059c8 100644 --- a/avr/cores/megacommand/MCL/PerfTrack.cpp +++ b/avr/cores/megacommand/MCL/PerfTrack.cpp @@ -1,6 +1,7 @@ #include "MCL_impl.h" void PerfTrack::transition_send(uint8_t tracknumber, uint8_t slotnumber) { + DEBUG_PRINTLN("transition send"); load_perf(); } @@ -21,12 +22,15 @@ void PerfTrack::get_perf() { } DEBUG_PRINTLN("get perf"); DEBUG_PRINTLN(sizeof(scenes)); - memcpy(&scenes[0], &PerfData::scenes[0], sizeof(scenes)); + memcpy(scenes, PerfData::scenes, sizeof(PerfScene) * NUM_SCENES); + scenes[0].debug(); } void PerfTrack::load_perf() { - + DEBUG_PRINTLN("load perf"); + DEBUG_PRINTLN( sizeof(scenes)); + scenes[0].debug(); for (uint8_t n = 0; n < 4; n++) { PerfEncoder *e = perf_page.perf_encoders[n]; PerfData *d = &e->perf_data; @@ -38,12 +42,11 @@ void PerfTrack::load_perf() { e->cur = encs[n].cur; } - DEBUG_PRINTLN("load perf"); - DEBUG_PRINTLN( sizeof(scenes)); - memcpy(&PerfData::scenes[0], &scenes[0], sizeof(scenes)); + memcpy(PerfData::scenes, scenes, sizeof(PerfScene) * NUM_SCENES); } void PerfTrack::load_immediate(uint8_t tracknumber, SeqTrack *seq_track) { + DEBUG_PRINTLN("load immediate"); load_link_data(seq_track); load_perf(); } From 2ec6f2e4fc121e33ec5e46eb5e22df735eacda91 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 5 Jul 2023 12:46:15 +1000 Subject: [PATCH 176/413] Perf NAME --- avr/cores/megacommand/MCL/MCLMemory.h | 2 +- avr/cores/megacommand/MCL/PerfEncoder.h | 4 ++++ avr/cores/megacommand/MCL/PerfTrack.cpp | 4 ++-- avr/cores/megacommand/MCL/PerfTrack.h | 1 + 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCLMemory.h b/avr/cores/megacommand/MCL/MCLMemory.h index 1712f5018..dbf9420a5 100644 --- a/avr/cores/megacommand/MCL/MCLMemory.h +++ b/avr/cores/megacommand/MCL/MCLMemory.h @@ -74,7 +74,7 @@ constexpr size_t MDLFO_TRACK_LEN = 226; constexpr size_t MDROUTE_TRACK_LEN = 25; constexpr size_t MDFX_TRACK_LEN = 43; constexpr size_t MDTEMPO_TRACK_LEN = 11; -constexpr size_t PERF_TRACK_LEN = 423; +constexpr size_t PERF_TRACK_LEN = 459; constexpr size_t GRIDCHAIN_TRACK_LEN = 551; //Use these to produce compiler errors that probes the sizes! diff --git a/avr/cores/megacommand/MCL/PerfEncoder.h b/avr/cores/megacommand/MCL/PerfEncoder.h index 0fcfb4069..8c0487cdc 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.h +++ b/avr/cores/megacommand/MCL/PerfEncoder.h @@ -6,6 +6,8 @@ #include "MCLEncoder.h" #include "PerfData.h" +#define PERF_NAME_LENGTH 9 + class PerfEncoder : public MCLEncoder { /** \addtogroup gui_rangeencoder_class @@ -13,6 +15,8 @@ class PerfEncoder : public MCLEncoder { **/ public: + char name[PERF_NAME_LENGTH] = ""; + PerfData perf_data; uint8_t active_scene_a = 0; diff --git a/avr/cores/megacommand/MCL/PerfTrack.cpp b/avr/cores/megacommand/MCL/PerfTrack.cpp index 40af059c8..d156812b4 100644 --- a/avr/cores/megacommand/MCL/PerfTrack.cpp +++ b/avr/cores/megacommand/MCL/PerfTrack.cpp @@ -19,18 +19,17 @@ void PerfTrack::get_perf() { encs[n].active_scene_a = e->active_scene_a; encs[n].active_scene_b = e->active_scene_b; encs[n].cur = e->cur; + memcpy(encs[n].name,e->name, PERF_NAME_LENGTH); } DEBUG_PRINTLN("get perf"); DEBUG_PRINTLN(sizeof(scenes)); memcpy(scenes, PerfData::scenes, sizeof(PerfScene) * NUM_SCENES); - scenes[0].debug(); } void PerfTrack::load_perf() { DEBUG_PRINTLN("load perf"); DEBUG_PRINTLN( sizeof(scenes)); - scenes[0].debug(); for (uint8_t n = 0; n < 4; n++) { PerfEncoder *e = perf_page.perf_encoders[n]; PerfData *d = &e->perf_data; @@ -40,6 +39,7 @@ void PerfTrack::load_perf() { e->active_scene_a = encs[n].active_scene_a; e->active_scene_b = encs[n].active_scene_b; e->cur = encs[n].cur; + memcpy(e->name,encs[n].name, PERF_NAME_LENGTH); } memcpy(PerfData::scenes, scenes, sizeof(PerfScene) * NUM_SCENES); diff --git a/avr/cores/megacommand/MCL/PerfTrack.h b/avr/cores/megacommand/MCL/PerfTrack.h index 9534907bd..f4620fd44 100644 --- a/avr/cores/megacommand/MCL/PerfTrack.h +++ b/avr/cores/megacommand/MCL/PerfTrack.h @@ -6,6 +6,7 @@ class PerfTrackEncoderData { public: + char name[PERF_NAME_LENGTH]; uint8_t src; uint8_t param; uint8_t min; From c65aa55ff0aaf181d7f7196e5dbf574ba6f01599 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 5 Jul 2023 14:40:51 +1000 Subject: [PATCH 177/413] rename encoder, fix textinput & restore keyrepeat state --- avr/cores/megacommand/Elektron/Elektron.cpp | 1 + avr/cores/megacommand/Elektron/Elektron.h | 3 + avr/cores/megacommand/GUI/GUI.cpp | 5 - avr/cores/megacommand/MCL/MCLMenus.cpp | 2 + avr/cores/megacommand/MCL/MCLMenus.h | 2 +- avr/cores/megacommand/MCL/PerfEncoder.cpp | 1 + avr/cores/megacommand/MCL/PerfEncoder.h | 2 +- avr/cores/megacommand/MCL/PerfPage.cpp | 18 +- avr/cores/megacommand/MCL/PerfPage.h | 1 + avr/cores/megacommand/MCL/TextInputPage.cpp | 89 ++- avr/cores/megacommand/MCL/TextInputPage.h | 3 + avr/cores/megacommand/resources/R.h | 8 +- .../megacommand/resources/R_menu_layouts.cpp | 543 +++++++++--------- resource/menu_layouts.cpp | 1 + 14 files changed, 348 insertions(+), 331 deletions(-) diff --git a/avr/cores/megacommand/Elektron/Elektron.cpp b/avr/cores/megacommand/Elektron/Elektron.cpp index 2c3b42cba..746e1f438 100644 --- a/avr/cores/megacommand/Elektron/Elektron.cpp +++ b/avr/cores/megacommand/Elektron/Elektron.cpp @@ -172,6 +172,7 @@ void ElektronDevice::set_rec_mode(uint8_t mode) { } void ElektronDevice::set_key_repeat(uint8_t mode) { + key_repeat = mode; uint8_t data[3] = {0x70, 0x4E, mode}; sendRequest(data, sizeof(data)); // waitBlocking(); diff --git a/avr/cores/megacommand/Elektron/Elektron.h b/avr/cores/megacommand/Elektron/Elektron.h index e09dd3d84..92b5f9f66 100644 --- a/avr/cores/megacommand/Elektron/Elektron.h +++ b/avr/cores/megacommand/Elektron/Elektron.h @@ -334,7 +334,10 @@ class ElektronDevice : public MidiDevice { bool loadedKit; /** Set to true if the global was loaded (usually set by MDTask). **/ bool loadedGlobal; + bool encoder_interface; + uint8_t key_repeat; + ElektronDevice( MidiClass* _midi, const char* _name, const uint8_t _id, const ElektronSysexProtocol& protocol) diff --git a/avr/cores/megacommand/GUI/GUI.cpp b/avr/cores/megacommand/GUI/GUI.cpp index 50ce299eb..404a21e6b 100644 --- a/avr/cores/megacommand/GUI/GUI.cpp +++ b/avr/cores/megacommand/GUI/GUI.cpp @@ -107,13 +107,8 @@ void GuiClass::loop() { } } -#ifndef HOST_MIDIDUINO - ::loop(); -#endif if (use_screen_saver && clock_minutes >= SCREEN_SAVER_TIME) { -#ifdef OLED_DISPLAY oled_display.screen_saver = true; -#endif } MidiUartParent::handle_midi_lock = 0; diff --git a/avr/cores/megacommand/MCL/MCLMenus.cpp b/avr/cores/megacommand/MCL/MCLMenus.cpp index dc714a3d5..5a69d9e2f 100644 --- a/avr/cores/megacommand/MCL/MCLMenus.cpp +++ b/avr/cores/megacommand/MCL/MCLMenus.cpp @@ -155,6 +155,8 @@ const menu_function_t menu_target_functions[] PROGMEM = { usb_disk_mode, // 29 mcl_setup, + // 30 + rename_perf, }; MenuPage aux_config_page(&config_param1, &config_param6); diff --git a/avr/cores/megacommand/MCL/MCLMenus.h b/avr/cores/megacommand/MCL/MCLMenus.h index f59ad90e2..285e2f752 100644 --- a/avr/cores/megacommand/MCL/MCLMenus.h +++ b/avr/cores/megacommand/MCL/MCLMenus.h @@ -112,7 +112,7 @@ extern MCLEncoder wavdesign_menu_entry_encoder; constexpr size_t wavdesign_menu_page_N = 3; extern MenuPage wavdesign_menu_page; -constexpr size_t perf_menu_page_N = 1; +constexpr size_t perf_menu_page_N = 2; extern MenuPage perf_menu_page; extern uint8_t opt_import_src; diff --git a/avr/cores/megacommand/MCL/PerfEncoder.cpp b/avr/cores/megacommand/MCL/PerfEncoder.cpp index de0952d63..626b9689b 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.cpp +++ b/avr/cores/megacommand/MCL/PerfEncoder.cpp @@ -63,3 +63,4 @@ int PerfEncoder::update(encoder_t *enc) { } return cur; } + diff --git a/avr/cores/megacommand/MCL/PerfEncoder.h b/avr/cores/megacommand/MCL/PerfEncoder.h index 8c0487cdc..8e7051fb0 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.h +++ b/avr/cores/megacommand/MCL/PerfEncoder.h @@ -15,7 +15,7 @@ class PerfEncoder : public MCLEncoder { **/ public: - char name[PERF_NAME_LENGTH] = ""; + char name[PERF_NAME_LENGTH] = "CONTROL"; PerfData perf_data; diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 555bdc745..a830642d3 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -239,7 +239,7 @@ void PerfPage::display() { draw_dest(1, encoders[1]->cur, false); draw_param(2, encoders[1]->cur, encoders[2]->cur); mcl_gui.draw_knob(3, encoders[3], "THR"); - info2 = "CONTROL"; + strcpy(info2, e->name); } // oled_display.fillCircle(6, 6, 6, WHITE); @@ -322,6 +322,14 @@ void PerfPage::learn_param(uint8_t dest, uint8_t param, uint8_t value) { } } +void rename_perf() { + const char *my_title = "PerfCtrl Name:"; + + mcl_gui.wait_for_input(perf_page.perf_encoders[perf_page.perf_id]->name, my_title, 8); + +} + + void PerfPage::send_locks(uint8_t scene) { MDSeqTrack &active_track = mcl_seq.md_tracks[last_md_track]; uint8_t params[24]; @@ -536,8 +544,16 @@ bool PerfPage::handleEvent(gui_event_t *event) { return true; } if (EVENT_RELEASED(event, Buttons.BUTTON3)) { + void (*row_func)() = + perf_menu_page.menu.get_row_function(perf_menu_page.encoders[1]->cur); + if (row_func != NULL) { + DEBUG_PRINTLN("calling menu func"); + (*row_func)(); + } + show_menu = false; config_encoders(); + return true; } diff --git a/avr/cores/megacommand/MCL/PerfPage.h b/avr/cores/megacommand/MCL/PerfPage.h index 28cbde9dc..103daf97a 100644 --- a/avr/cores/megacommand/MCL/PerfPage.h +++ b/avr/cores/megacommand/MCL/PerfPage.h @@ -57,6 +57,7 @@ class PerfPage : public LightPage, PerfPageParent { void onControlChangeCallback_Midi(uint8_t *msg); void onControlChangeCallback_Midi2(uint8_t *msg); }; +extern void rename_perf(); extern MCLEncoder perf_page_param1; extern MCLEncoder perf_page_param2; diff --git a/avr/cores/megacommand/MCL/TextInputPage.cpp b/avr/cores/megacommand/MCL/TextInputPage.cpp index 44079e97d..acc07c7f0 100644 --- a/avr/cores/megacommand/MCL/TextInputPage.cpp +++ b/avr/cores/megacommand/MCL/TextInputPage.cpp @@ -26,7 +26,15 @@ uint8_t _findchar(char chr) { void TextInputPage::setup() {} -void TextInputPage::init() { oled_display.setTextColor(WHITE, BLACK); } +void TextInputPage::init() { + oled_display.setTextColor(WHITE, BLACK); + key_repeat_old = MD.key_repeat; + MD.set_key_repeat(1); +} + +void TextInputPage::cleanup() { + MD.set_key_repeat(key_repeat_old); +} void TextInputPage::init_text(char *text_, const char *title_, uint8_t len) { textp = text_; @@ -83,7 +91,20 @@ static void calc_charpane_coord(uint8_t &x, uint8_t &y) { } void TextInputPage::loop() { - if (normal_mode == false) { + if (normal_mode) { + if (encoders[0]->hasChanged()) { + update_char(); + last_clock = slowclock; + } + + if (encoders[1]->hasChanged()) { + last_clock = slowclock; + encoders[1]->old = encoders[1]->cur; + text[cursor_position] = _getchar(encoders[1]->getValue()); + } + + } + else { if (encoders[1]->cur == ((MCLEncoder *)encoders[1])->max) { ((MCLEncoder *)encoders[0])->max = charpane_w - 4; } @@ -97,7 +118,6 @@ void TextInputPage::loop() { // E0 -> x axis [0..17] // E1 -> y axis [0..3] void TextInputPage::config_charpane() { -#ifdef OLED_DISPLAY // char pane not supported on 1602 displays ((MCLEncoder *)encoders[0])->max = charpane_w - 1; @@ -111,26 +131,6 @@ void TextInputPage::config_charpane() { encoders[1]->cur = chridx / charpane_w; encoders[1]->old = encoders[1]->cur; - oled_display.setFont(&TomThumb); - oled_display.clearDisplay(); - oled_display.drawRect(0, 0, 128, 32, WHITE); - uint8_t chidx = 0; - for (uint8_t y = 0; y < charpane_h; ++y) { - for (uint8_t x = 0; x < charpane_w; ++x) { - auto sx = x, sy = y; - calc_charpane_coord(sx, sy); - oled_display.setCursor(sx + charpane_padx, sy + charpane_pady); - oled_display.print(_getchar(chidx)); - ++chidx; - } - } - - // initial highlight of selected char - uint8_t sx = encoders[0]->cur, sy = encoders[1]->cur; - calc_charpane_coord(sx, sy); - oled_display.fillRect(sx, sy, 5, 7, INVERT); - oled_display.display(); -#endif } void TextInputPage::display_normal() { @@ -142,16 +142,6 @@ void TextInputPage::display_normal() { // Check to see that the character chosen is in the list of allowed // characters - if (encoders[0]->hasChanged()) { - update_char(); - last_clock = slowclock; - } - - if (encoders[1]->hasChanged()) { - last_clock = slowclock; - encoders[1]->old = encoders[1]->cur; - text[cursor_position] = _getchar(encoders[1]->getValue()); - } auto time = clock_diff(last_clock, slowclock); // mcl_gui.clear_popup(); <-- E_TOOSLOW @@ -173,32 +163,33 @@ void TextInputPage::display_normal() { last_clock = slowclock; } oled_display.setFont(oldfont); - oled_display.display(); } void TextInputPage::display_charpane() { -#ifdef OLED_DISPLAY - if (encoders[0]->hasChanged() || encoders[1]->hasChanged()) { - // clear old highlight - uint8_t sx = encoders[0]->old, sy = encoders[1]->old; - calc_charpane_coord(sx, sy); - oled_display.fillRect(sx, sy, 5, 7, INVERT); + oled_display.setFont(&TomThumb); + oled_display.clearDisplay(); + oled_display.drawRect(0, 0, 128, 32, WHITE); + uint8_t chidx = 0; + for (uint8_t y = 0; y < charpane_h; ++y) { + for (uint8_t x = 0; x < charpane_w; ++x) { + auto sx = x, sy = y; + calc_charpane_coord(sx, sy); + oled_display.setCursor(sx + charpane_padx, sy + charpane_pady); + oled_display.print(_getchar(chidx)); + ++chidx; + } + } + // draw new highlight - sx = encoders[0]->cur; - sy = encoders[1]->cur; + uint8_t sx = encoders[0]->cur; + uint8_t sy = encoders[1]->cur; calc_charpane_coord(sx, sy); oled_display.fillRect(sx, sy, 5, 7, INVERT); // update text. in charpane mode, cursor_position remains constant uint8_t chridx = encoders[0]->cur + encoders[1]->cur * charpane_w; text[cursor_position] = _getchar(chridx); - // mark encoders as unchanged - encoders[0]->old = encoders[0]->cur; - encoders[1]->old = encoders[1]->cur; - } last_clock = slowclock; - oled_display.display(); -#endif } void TextInputPage::display() { @@ -206,6 +197,8 @@ void TextInputPage::display() { display_normal(); else display_charpane(); + + oled_display.display(); } bool TextInputPage::handleEvent(gui_event_t *event) { diff --git a/avr/cores/megacommand/MCL/TextInputPage.h b/avr/cores/megacommand/MCL/TextInputPage.h index d8f787b09..07cb9dda1 100644 --- a/avr/cores/megacommand/MCL/TextInputPage.h +++ b/avr/cores/megacommand/MCL/TextInputPage.h @@ -17,11 +17,14 @@ class TextInputPage : public LightPage { bool return_state; uint16_t last_clock; bool normal_mode; + uint8_t key_repeat_old; uint8_t cursor_position; TextInputPage(Encoder *e1 = NULL, Encoder *e2 = NULL, Encoder *e3 = NULL, Encoder *e4 = NULL) : LightPage(e1, e2, e3, e4) {} virtual bool handleEvent(gui_event_t *event); + void cleanup(); + void config_normal(); void config_charpane(); void display(); diff --git a/avr/cores/megacommand/resources/R.h b/avr/cores/megacommand/resources/R.h index 39dde1169..d7806045d 100644 --- a/avr/cores/megacommand/resources/R.h +++ b/avr/cores/megacommand/resources/R.h @@ -251,10 +251,10 @@ extern const unsigned char __R_menu_layouts[] PROGMEM; struct __T_menu_layouts { union { menu_t perf_menu_layout[0]; - char zz__perf_menu_layout[33]; + char zz__perf_menu_layout[54]; }; - static constexpr size_t countof_perf_menu_layout = 33 / sizeof(menu_t); - static constexpr size_t sizeofof_perf_menu_layout = 33; + static constexpr size_t countof_perf_menu_layout = 54 / sizeof(menu_t); + static constexpr size_t sizeofof_perf_menu_layout = 54; union { menu_t wavdesign_menu_layout[0]; char zz__wavdesign_menu_layout[75]; @@ -369,7 +369,7 @@ struct __T_menu_layouts { }; static constexpr size_t countof_boot_menu_layout = 96 / sizeof(menu_t); static constexpr size_t sizeofof_boot_menu_layout = 96; - static constexpr size_t __total_size = 2193; + static constexpr size_t __total_size = 2214; }; extern const unsigned char __R_menu_options[] PROGMEM; diff --git a/avr/cores/megacommand/resources/R_menu_layouts.cpp b/avr/cores/megacommand/resources/R_menu_layouts.cpp index cdda04b27..46799111e 100644 --- a/avr/cores/megacommand/resources/R_menu_layouts.cpp +++ b/avr/cores/megacommand/resources/R_menu_layouts.cpp @@ -18,95 +18,105 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 103, 14, 4, - 253, + 255, 4, 59, 255, 0, 117, + 82, + 69, + 78, + 246, + 65, + 77, + 69, 0, - 128, 0, - 251, + 3, + 255, + 200, + 30, + 0, + 31, 69, 68, 73, + 179, 84, - 28, - 54, - 32, - 12, + 49, + 96, + 53, + 203, 40, - 191, 80, + 246, 87, 65, 86, 58, - 96, 35, - 61, + 3, 6, + 219, 6, 41, - 182, 20, 74, - 73, - 254, + 111, + 94, 65, 78, 83, + 236, 70, 69, 82, - 203, - 23, - 255, - 255, + 74, + 7, 22, 0, + 253, 23, 0, 83, 108, 111, - 179, 116, + 159, 14, - 253, 71, 82, 73, + 236, 68, 58, 32, - 147, 29, + 158, 2, - 219, 2, 31, + 223, 53, 52, - 246, 77, 79, 68, + 178, 69, 75, - 95, + 253, 1, 4, 3, - 183, 32, + 187, 20, 20, 76, - 218, - 69, - 78, + 149, + 90, 40, 214, 0, @@ -176,17 +186,10 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 59, 38, 20, - 173, - 82, - 125, - 225, - 65, - 77, - 69, - 25, - 3, + 130, + 40, + 0, 251, - 255, 20, 0, 21, @@ -194,7 +197,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 41, 97, 80, - 73, + 94, 5, 148, 95, @@ -240,7 +243,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 67, 75, 18, - 170, + 191, 109, 1, 49, @@ -329,7 +332,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 104, 86, 98, - 76, + 97, 18, 124, 194, @@ -477,596 +480,594 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 79, 85, 252, - 132, - 102, - 12, - 107, - 184, + 164, + 83, + 38, + 39, + 223, 2, - 125, 14, 0, 70, 73, - 163, + 104, 149, + 193, 57, - 5, - 182, + 109, 48, 67, + 163, 220, - 140, 90, - 37, - 173, + 9, + 107, 2, 238, - 194, + 112, 87, 32, + 187, 178, - 236, 82, 46, 20, + 3, 12, - 51, 238, + 214, 51, - 90, 180, - 200, + 178, 41, - 70, + 17, + 149, 153, - 86, - 235, + 186, 20, 79, + 234, 178, - 169, 87, + 86, 111, - 90, 44, - 194, + 176, 41, - 255, + 191, 67, 86, 32, 65, + 200, 76, 76, - 33, - 45, + 75, 216, - 107, + 90, 157, + 202, 20, - 41, - 116, + 93, 22, 89, - 53, + 13, 30, 77, - 237, + 123, 9, 133, - 11, + 66, 168, + 225, 76, - 132, 65, 233, - 55, + 13, + 214, 212, - 91, 13, 32, + 227, 23, - 141, 1, 176, - 100, + 89, 211, - 244, + 61, 83, 82, 67, - 201, + 50, 109, + 64, 110, - 1, - 142, + 99, 43, 132, - 107, + 154, 170, + 212, 63, - 82, + 132, 131, - 19, + 206, 44, - 56, - 96, + 24, 10, - 151, + 37, 94, + 198, 1, 27, - 27, + 222, 45, - 123, 149, + 208, 19, - 67, + 204, 29, - 48, 191, - 155, + 38, 25, + 214, 4, - 88, 95, - 13, + 3, 73, - 40, + 74, 205, - 219, + 54, 117, 84, + 192, 32, - 3, - 134, + 225, 33, 31, - 109, + 155, 18, 77, - 188, + 111, 181, 73, 90, 69, - 33, + 8, 106, - 219, + 118, 8, 74, + 195, 16, - 15, 148, + 199, 32, - 28, 107, - 22, + 5, 91, + 132, 71, - 18, 148, - 88, + 150, 74, - 246, + 61, 32, 77, 73, + 161, 198, - 135, 106, - 241, + 252, 72, 82, 79, 32, - 236, + 123, 77, 53, - 253, + 63, 18, 2, 9, 255, - 175, + 107, 4, 53, - 97, + 216, 20, - 50, + 76, 46, - 210, + 180, 88, + 173, 110, - 181, 67, - 132, + 97, 20, - 221, + 55, 57, 41, + 90, 24, - 107, 172, + 208, 193, - 66, + 130, 83, - 11, + 255, 81, - 254, 32, 49, 32, 70, + 141, 87, - 53, 194, - 39, + 73, 101, + 219, 7, - 109, 32, 10, - 140, + 99, 20, 50, - 128, - 203, + 32, + 50, 51, + 251, 92, - 236, 85, 83, 66, 17, - 20, - 131, + 5, + 32, 143, + 219, 52, - 110, 20, 96, + 141, 67, - 53, 41, - 120, + 94, 187, - 75, + 18, 85, - 183, + 237, 11, 20, + 195, 86, 24, - 12, 118, - 53, + 13, 11, - 97, + 88, 79, - 211, + 116, 79, + 193, 239, - 7, 178, - 140, + 227, 58, 117, - 237, + 59, 5, 32, - 129, + 96, 7, + 69, 99, - 22, + 129, 20, - 7, + 204, 53, - 51, - 41, - 48, 204, + 41, + 51, 199, 116, - 56, + 14, 6, - 91, + 22, 65, 100, + 197, 41, - 22, + 129, 20, - 7, + 219, 54, - 109, 41, 100, - 182, + 109, 95, 80, + 182, 192, - 218, 71, 25, - 25, + 134, 215, - 205, + 115, 9, 223, - 2, + 64, + 150, 124, - 91, + 235, 128, - 173, 49, 32, - 190, + 111, 90, 20, + 177, 73, - 197, 242, - 131, + 96, 245, + 195, 47, - 12, 10, - 247, + 61, 20, + 204, 246, - 48, 21, - 251, + 62, 17, 2, 48, + 231, 20, - 156, 74, - 26, + 6, 148, + 172, 83, - 179, 154, - 240, + 252, 85, 82, 66, 79, - 172, + 43, 11, 224, - 189, + 47, 2, 255, - 172, + 107, 79, 20, - 228, + 57, 50, - 185, + 46, 3, - 36, - 53, + 73, + 13, 16, 58, - 131, + 96, 20, + 205, 55, - 52, 68, - 40, + 10, 106, - 230, + 57, 173, + 172, 42, - 178, 137, - 109, + 155, 4, 191, - 131, + 96, 84, - 152, - 23, + 197, + 173, + 235, 98, - 172, 238, - 219, + 54, 41, + 216, 56, - 98, 191, - 19, + 132, 199, - 115, + 220, 0, + 196, 126, - 16, - 133, + 33, 235, - 225, + 120, 34, 0, + 77, 62, - 54, + 132, 0, - 19, + 225, 36, - 132, 0, 179, - 91, + 22, 212, + 216, 71, - 96, 20, - 56, + 14, 37, 0, - 67, + 16, 8, - 96, + 216, 20, - 49, + 12, 35, - 146, + 100, 40, - 192, + 176, 20, - 111, + 27, 38, 4, - 115, + 220, 39, + 220, 138, - 112, 65, 71, - 214, + 53, 247, 76, + 181, 71, - 214, 75, + 150, 221, - 91, + 234, 170, - 169, 1, + 71, 44, - 30, 65, 85, + 177, 88, - 198, 32, + 179, 83, - 207, 42, + 236, 97, 103, - 178, 101, 35, - 225, + 184, 31, + 118, 204, - 217, 167, - 97, + 88, + 91, 171, - 109, 65, 100, - 116, + 93, 124, 74, - 40, + 10, 195, - 193, + 48, 210, - 164, + 105, 25, 236, - 88, + 22, 19, - 74, - 107, + 18, + 154, 2, 2, + 197, 234, - 22, + 133, 203, - 23, + 221, 26, - 116, 161, 65, - 107, + 26, 147, + 208, 131, - 64, - 169, + 42, 54, + 86, 52, - 88, 186, - 118, + 29, 27, + 128, 126, - 2, - 201, + 178, 41, - 164, + 105, 29, 192, - 54, + 13, + 129, 62, - 7, - 30, - 14, - 54, - 193, + 137, + 216, + 22, 102, - 97, + 11, 137, - 6, - 232, + 8, + 55, 4, + 70, 66, - 214, 170, + 176, 15, - 14, + 112, 79, 83, - 22, + 176, 190, 80, - 24, + 195, 57, - 106, 56, - 73, + 82, 173, - 111, + 75, 129, + 120, 68, 70, 85, - 24, + 197, 75, - 164, + 32, 194, - 5, - 163, + 45, 171, + 30, 246, - 215, + 186, 59, - 88, 75, + 192, 20, - 12, + 98, 28, - 91, + 218, 78, 88, - 90, + 212, 147, - 146, + 144, 236, - 27, + 220, 29, 4, - 128, 0, 0, 0, 0, - 1, - 63, + 0, + 9, 255, }; diff --git a/resource/menu_layouts.cpp b/resource/menu_layouts.cpp index 49c516e61..4e2db8a5a 100644 --- a/resource/menu_layouts.cpp +++ b/resource/menu_layouts.cpp @@ -269,6 +269,7 @@ menu_t perf_menu_layout = { // m r n d p f o {"CTRL SEL:",0, 4, 4, 59, 255, 0, 117}, + {"RENAME", 0, 0, 0, 0, 255, 30, 0}, // {"PARAM:", 0, 17, 1, 58, 255, 0, 116}, }, 0, 0 From ea062249ca883e0143a561b976d023c5a104930e Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 5 Jul 2023 14:42:47 +1000 Subject: [PATCH 178/413] better --- avr/cores/megacommand/Elektron/Elektron.cpp | 1 - avr/cores/megacommand/Elektron/Elektron.h | 3 --- avr/cores/megacommand/MCL/PerfPage.cpp | 6 ++---- avr/cores/megacommand/MCL/TextInputPage.cpp | 6 ------ avr/cores/megacommand/MCL/TextInputPage.h | 2 -- 5 files changed, 2 insertions(+), 16 deletions(-) diff --git a/avr/cores/megacommand/Elektron/Elektron.cpp b/avr/cores/megacommand/Elektron/Elektron.cpp index 746e1f438..2c3b42cba 100644 --- a/avr/cores/megacommand/Elektron/Elektron.cpp +++ b/avr/cores/megacommand/Elektron/Elektron.cpp @@ -172,7 +172,6 @@ void ElektronDevice::set_rec_mode(uint8_t mode) { } void ElektronDevice::set_key_repeat(uint8_t mode) { - key_repeat = mode; uint8_t data[3] = {0x70, 0x4E, mode}; sendRequest(data, sizeof(data)); // waitBlocking(); diff --git a/avr/cores/megacommand/Elektron/Elektron.h b/avr/cores/megacommand/Elektron/Elektron.h index 92b5f9f66..e09dd3d84 100644 --- a/avr/cores/megacommand/Elektron/Elektron.h +++ b/avr/cores/megacommand/Elektron/Elektron.h @@ -334,10 +334,7 @@ class ElektronDevice : public MidiDevice { bool loadedKit; /** Set to true if the global was loaded (usually set by MDTask). **/ bool loadedGlobal; - bool encoder_interface; - uint8_t key_repeat; - ElektronDevice( MidiClass* _midi, const char* _name, const uint8_t _id, const ElektronSysexProtocol& protocol) diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index a830642d3..e98e8432f 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -27,6 +27,7 @@ void PerfPage::init() { show_menu = false; last_page_mode = 255; MD.set_rec_mode(3); + config_encoders(); } void PerfPage::set_led_mask() { @@ -550,10 +551,7 @@ bool PerfPage::handleEvent(gui_event_t *event) { DEBUG_PRINTLN("calling menu func"); (*row_func)(); } - - show_menu = false; - config_encoders(); - + init(); return true; } diff --git a/avr/cores/megacommand/MCL/TextInputPage.cpp b/avr/cores/megacommand/MCL/TextInputPage.cpp index acc07c7f0..f250ffe82 100644 --- a/avr/cores/megacommand/MCL/TextInputPage.cpp +++ b/avr/cores/megacommand/MCL/TextInputPage.cpp @@ -28,12 +28,6 @@ void TextInputPage::setup() {} void TextInputPage::init() { oled_display.setTextColor(WHITE, BLACK); - key_repeat_old = MD.key_repeat; - MD.set_key_repeat(1); -} - -void TextInputPage::cleanup() { - MD.set_key_repeat(key_repeat_old); } void TextInputPage::init_text(char *text_, const char *title_, uint8_t len) { diff --git a/avr/cores/megacommand/MCL/TextInputPage.h b/avr/cores/megacommand/MCL/TextInputPage.h index 07cb9dda1..b568a3539 100644 --- a/avr/cores/megacommand/MCL/TextInputPage.h +++ b/avr/cores/megacommand/MCL/TextInputPage.h @@ -17,13 +17,11 @@ class TextInputPage : public LightPage { bool return_state; uint16_t last_clock; bool normal_mode; - uint8_t key_repeat_old; uint8_t cursor_position; TextInputPage(Encoder *e1 = NULL, Encoder *e2 = NULL, Encoder *e3 = NULL, Encoder *e4 = NULL) : LightPage(e1, e2, e3, e4) {} virtual bool handleEvent(gui_event_t *event); - void cleanup(); void config_normal(); void config_charpane(); From 21829637c1ea5495d999ce4e43b9cb35cd73698a Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 5 Jul 2023 14:57:05 +1000 Subject: [PATCH 179/413] add undo restore for poly tracks clear --- avr/cores/megacommand/MCL/SeqPage.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index 657dea657..ebb884602 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -746,6 +746,7 @@ void opt_clear_track_handler() { if (is_poly) { for (uint8_t c = 0; c < 16; c++) { if (IS_BIT_SET16(mcl_cfg.poly_mask, c)) { + mcl_clipboard.copy_sequencer_track(c); mcl_seq.md_tracks[c].clear_track(); } } @@ -908,15 +909,26 @@ void opt_paste_track_handler() { } if (opt_paste == 1) { if (SeqPage::midi_device == &MD) { + bool is_poly = false; if (!undo) { oled_display.textbox("PASTE TRACK", ""); MD.popup_text(6); } else { oled_display.textbox("UNDO TRACK", ""); + is_poly = IS_BIT_SET16(mcl_cfg.poly_mask, last_md_track); MD.popup_text(23); } + if (is_poly) { + for (uint8_t c = 0; c < 16; c++) { + if (IS_BIT_SET16(mcl_cfg.poly_mask, c)) { + mcl_clipboard.paste_sequencer_track(mcl_clipboard.copy_track, c); + } + } + } + else { mcl_clipboard.paste_sequencer_track(mcl_clipboard.copy_track, last_md_track); + } } else { char *str = "UNDO EXT TRACK"; if (!undo) { From db94c080d6600b02cb1413f669a2327103ff5f6b Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 5 Jul 2023 15:24:38 +1000 Subject: [PATCH 180/413] Oct/fine_tune per device --- avr/cores/megacommand/MCL/SeqPtcPage.cpp | 34 +++++++++++++++++------- avr/cores/megacommand/MCL/SeqPtcPage.h | 3 +++ 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.cpp b/avr/cores/megacommand/MCL/SeqPtcPage.cpp index 38a64298b..7bae2f4f9 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPtcPage.cpp @@ -38,8 +38,10 @@ void SeqPtcPage::setup() { SeqPage::setup(); init_poly(); midi_events.setup_callbacks(); - ptc_param_oct.cur = 1; - ptc_param_fine_tune.cur = 32; + octs[0] = 1; + octs[1] = 4; + fine_tunes[0] = 32; + fine_tunes[1] = 32; memset(dev_note_masks, 0, sizeof(dev_note_masks)); memset(dev_note_channels, 17, sizeof(dev_note_channels)); memset(note_mask, 0, sizeof(note_mask)); @@ -53,7 +55,13 @@ void SeqPtcPage::config_encoders() { SeqPage::config_encoders(); ptc_param_len.min = 1; bool show_chan = true; - if (midi_device == &MD) { + + uint8_t dev = midi_device == &MD ? 0 : 1; + + encoders[0]->cur = octs[dev]; + encoders[1]->cur = fine_tunes[dev]; + + if (dev == 0) { ptc_param_len.max = 64; ptc_param_len.cur = mcl_seq.md_tracks[last_md_track].length; show_chan = false; @@ -136,8 +144,12 @@ void SeqPtcPage::loop() { } if (ptc_param_oct.hasChanged() || ptc_param_scale.hasChanged() || ptc_param_fine_tune.hasChanged()) { + uint8_t dev = midi_device == &MD ? 0 : 1; + octs[dev] = encoders[0]->cur; + fine_tunes[dev] = encoders[1]->cur; + uint8_t track = last_md_track; - if (midi_device != &MD) { + if (dev) { track = last_ext_track; mcl_seq.ext_tracks[last_ext_track].buffer_notesoff(); } @@ -515,8 +527,7 @@ bool SeqPtcPage::handleEvent(gui_event_t *event) { note += MIDI_NOTE_C4; bool is_poly = IS_BIT_SET16(mcl_cfg.poly_mask, last_md_track); channel_event = is_poly ? POLY_EVENT : CTRL_EVENT; - } - else { + } else { note += MIDI_NOTE_C1; } uint8_t msg[] = {MIDI_NOTE_ON | (is_md ? last_md_track : last_ext_track), @@ -572,7 +583,9 @@ bool SeqPtcPage::handleEvent(gui_event_t *event) { return true; } case MDX_KEY_SCALE: { - midi_device = midi_device == &MD ? midi_active_peering.get_device(UART2_PORT) : midi_active_peering.get_device(UART1_PORT); + midi_device = midi_device == &MD + ? midi_active_peering.get_device(UART2_PORT) + : midi_active_peering.get_device(UART1_PORT); config(); return true; } @@ -627,10 +640,11 @@ uint8_t SeqPtcPage::process_ext_event(uint8_t note_num, bool note_type, dev_note_channels[dev] = channel; if (note_type) { if (arp_enabled.cur == ARP_LATCH) { - if (seq_ptc_page.dev_note_masks[dev][0] == 0 && seq_ptc_page.dev_note_masks[dev][1] == 0) { - memset(seq_ptc_page.note_mask,0,sizeof(seq_ptc_page.note_mask)); + if (seq_ptc_page.dev_note_masks[dev][0] == 0 && + seq_ptc_page.dev_note_masks[dev][1] == 0) { + memset(seq_ptc_page.note_mask, 0, sizeof(seq_ptc_page.note_mask)); } - } + } SET_BIT128_P(seq_ptc_page.dev_note_masks[dev], note_num); if (pitch != 255) { SET_BIT128_P(seq_ptc_page.note_mask, pitch); diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.h b/avr/cores/megacommand/MCL/SeqPtcPage.h index 489e99eac..95f9a784c 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.h +++ b/avr/cores/megacommand/MCL/SeqPtcPage.h @@ -55,6 +55,9 @@ class SeqPtcPage : public SeqPage, public ClockCallback { bool scale_padding; bool cc_link_enable; + uint8_t octs[NUM_DEVS]; + uint8_t fine_tunes[NUM_DEVS]; + uint8_t find_arp_track(uint8_t channel_event); SeqPtcMidiEvents midi_events; From 5c2e4b281a4072711f3edec903b5ff3ba3a2afc4 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 5 Jul 2023 18:07:45 +1000 Subject: [PATCH 181/413] Fix icon sprites and page layouts --- art/sprites/chromatic.png | Bin 452 -> 483 bytes art/sprites/perf.png | Bin 0 -> 321 bytes art/sprites/route_icon.png | Bin 306 -> 316 bytes art/sprites/step.png | Bin 459 -> 492 bytes avr/cores/megacommand/MCL/MCL.cpp | 1 - avr/cores/megacommand/ResourceManager.cpp | 28 +- avr/cores/megacommand/resources/R.h | 20 +- .../megacommand/resources/R_icons_page.cpp | 359 +++++++++--------- .../megacommand/resources/R_page_entries.cpp | 157 ++++---- resource/icons_page.cpp | 42 +- resource/page_entries.cpp | 13 +- 11 files changed, 312 insertions(+), 308 deletions(-) create mode 100644 art/sprites/perf.png diff --git a/art/sprites/chromatic.png b/art/sprites/chromatic.png index bd7c660feafbc52f071c71449f239199ca010ac1..136475f4df424be5512753c0986870d65e4fefbf 100644 GIT binary patch delta 445 zcmX@Y{Fr%yK|O;-YJ_K+uP=iZ0|NsG17mw80}GJF2*grA%)r33fC(-lv49!QmIO)u znOmn0R2=E);uzw=yLC!qUyA~d%f&nY>o-PDKmK%Ls{K%VT_3xXQJAEZiZhoZl&MawW3X}PRoDSw>!DE|d zOy^^`qd0BOoG9~Oj_3|=h69X^g}GtJBIoSgqv4w{&Bf=@mSB}! z!=2lrLmdBFJH(c+xpZW|!5ix{NAs_T1cilsWqovC^Cot~R!-rb*Ku9)iOWfrs0Fz?*WsvoiaYrXh9cZ+VFZ2kCy>g1ji hJEXi1vhAv{VRVqu)TrOEX*wvpJzf1=);T3K0RXd?yiEWA delta 414 zcmV;P0b%~*1H=Q6Fn%p>FMfJCc|ZU*h)+j*Rc~W zGf&gBx9i{5g7Uua<1(+i9P!M->YC@dL*0M~K(LZMPyC82zHM7?`X`Grro&w17AIa~ zgmaAv>c~}$JWVr3FzeyU=SCe{P5VE@X=GE0UEZQ6?G!l^7Jqv+!LlsVx~{j+LSY)D ziN^^jfS4VhO_#!ogFQ~5Fnbk2sA9?MapN2wvIX^ZLoAm(Fq;rdlfwiM-UusBT{S_6 zXEqFyV0_ha3TJFxPO<=U38pA9c%G$5jpd0`KfYuVmWL?}miS$qCdBPF{dy>p!Ww1~ z82On=^5x8pxPL1E!G(ahF+1xH=PX~8Zg5rvrf|k-lChlJ`&-mV<2%6Jw03FX6^C<| zwdDOZRg@i9bBW|{g@;)S`UHx0*D{G`X{dnwY~XO#l5vX^vdElbu6%fMQtT`qU$TdY zaw!U~QN^vf+rR#<>!^w&(%*_U$(!}{B~y$^-Nn+dlNTO-K6YPT2Z-iPH2?qr07*qo IM6N<$g3;v1p8x;= diff --git a/art/sprites/perf.png b/art/sprites/perf.png new file mode 100644 index 0000000000000000000000000000000000000000..c053853be3444e3088638064e30e41334815c923 GIT binary patch literal 321 zcmeAS@N?(olHy`uVBq!ia0vp^5no)UZcNK~eudr9@mQ5*=B_BO%-8>KneTPGci_JGjQJ6P*}sjiMah1;DC%l4 zMUOKf=wIHMuS`2i583>A^G||TUHWZ{R-4(8+`Fpmj@w_)vU;#2-Nf4P)f(>S3)sul zmK6Cpi1r*=qpaTGQj*v`HDX#h6IX$`n*7ZEBa@Y`#hO`GFJYL}^0kShXL*d^!;KYB t>Ru$UEUQ|=9BLu;oAuJ!zuI2mTNqxdTB>;;j${XU#naW#Wt~$(69C7BYP0|V literal 0 HcmV?d00001 diff --git a/art/sprites/route_icon.png b/art/sprites/route_icon.png index 5167e2dd0cec240757b5d01b139ee4a17deb4c6d..56753ad090522c496878fe4a9e032fc8f565df79 100644 GIT binary patch delta 276 zcmdnQw1;VeVZB9aglC$sFM}2X0|N&GV|yk83y{SK#8N=az`(SC2`(bBfEmt~1WEpx zTc-}BHhH=@hIsJ44Zg^ASV7?O#{d6Qw>tzI>EB9zG27|p%%?@uFI)@q`fYdnT=wiw zs(RPqZArfAoP2Zc z%DsLsP%QDmV1atSl<0M-zg12yzn*v9+UHt(EblN6J9k^h4URxA;l;}L(q)QrT|{-F@NkyL_t(Y4ee7w4#O}AOQ!w*%h@c=m2pUmrgW!Ost90gplNTd zjrV)o^SF)qL;PF`jFAu4dp}Alm~?_lVFiOumJ=YU-NMhFD@-~;M)YkA3q6)y8M}hf zX2Jy7xE^yKWLb_P+qC&~(l zVUCt@w?Tm2JE-bs^+DjOn~XrkQSTf=6Zo`u71PN}8DAJC8Tnq`6&rtg z*S0S~r&`udE4Ws%N^x?%P4U-2j>?dPdCxN=r`=nrBH+oR)@n3eyC{Xz!%ygsq%c3< z|6In&7d?3#yDVz`%C!<2LN$JEvQB<6(I&Z_NkHY}s5f#E6=^>10kPP*h4 zCY_n+UVk)qd#D53q%+rxRXljie#ZPXv1-+IBCjxaI!Ke&cYRaOIZYX6O8?nXcO< o`5Ei|K1_Hl^e_HFku6I-BZr8roaLi!mY{(5boFyt=akR{0DteXhyVZp delta 421 zcmV;W0b2g-1Iq)DFn)+wX@_9lt(=Sl1`_SWgr=c zVOZAd-)mWV`8bXPzE;6W=dDFd@vIf25$jchX_|(4p0}MUf{?;+a?$4Uh#Xk~ick|*YLhXy7%3YS>!&K$OiXKvR3ffRnT>wntZ+O0wE0&+IvXfmHZ zygG##__&hWLk7gvw&VxX$11LfadPlkmph7-AKw@mFELiFQPiu})xEntries[0].Page = GRID_PAGE; R.page_entries->Entries[0].IconData = R.icons_page->icon_grid; - R.page_entries->Entries[1].Page = MIXER_PAGE; R.page_entries->Entries[1].IconData = R.icons_page->icon_mixer; - R.page_entries->Entries[2].Page = ROUTE_PAGE; - R.page_entries->Entries[2].IconData = R.icons_page->icon_route; - R.page_entries->Entries[3].Page = LFO_PAGE; - R.page_entries->Entries[3].IconData = R.icons_page->icon_lfo; + R.page_entries->Entries[2].IconData = R.icons_page->icon_perf; + R.page_entries->Entries[3].IconData = R.icons_page->icon_route; - R.page_entries->Entries[4].Page = SEQ_STEP_PAGE; - R.page_entries->Entries[4].IconData = R.icons_page->icon_step; - R.page_entries->Entries[5].Page = SEQ_EXTSTEP_PAGE; + R.page_entries->Entries[4].IconData = R.icons_page->icon_step; R.page_entries->Entries[5].IconData = R.icons_page->icon_pianoroll; - R.page_entries->Entries[6].Page = SEQ_PTC_PAGE; R.page_entries->Entries[6].IconData = R.icons_page->icon_chroma; + R.page_entries->Entries[7].IconData = R.icons_page->icon_lfo; + - uint8_t idx = 7; + uint8_t idx = 8; #ifdef SOUND_PAGE - R.page_entries->Entries[idx].Page = SAMPLE_BROWSER; R.page_entries->Entries[idx].IconData = R.icons_page->icon_sample; ++idx; #endif #ifdef WAV_DESIGNER - R.page_entries->Entries[idx].Page = WD_PAGE_0; R.page_entries->Entries[idx].IconData = R.icons_page->icon_wavd; ++idx; - R.page_entries->Entries[idx].Page = PERF_PAGE_0; - R.page_entries->Entries[idx].IconData = R.icons_page->icon_wavd; - ++idx; - #endif #ifdef LOUDNESS_PAGE - R.page_entries->Entries[idx].Page = LOUDNESS_PAGE; R.page_entries->Entries[idx].IconData = R.icons_page->icon_loudness; ++idx; #endif - R.page_entries->Entries[idx].Page = FX_PAGE_A; R.page_entries->Entries[idx].IconData = R.icons_page->icon_rhytmecho; ++idx; - R.page_entries->Entries[idx].Page = FX_PAGE_B; R.page_entries->Entries[idx].IconData = R.icons_page->icon_gatebox; ++idx; - R.page_entries->Entries[idx].Page = RAM_PAGE_A; R.page_entries->Entries[idx].IconData = R.icons_page->icon_ram1; ++idx; - R.page_entries->Entries[idx].Page = RAM_PAGE_B; R.page_entries->Entries[idx].IconData = R.icons_page->icon_ram2; // calibration complete } diff --git a/avr/cores/megacommand/resources/R.h b/avr/cores/megacommand/resources/R.h index d7806045d..c053437a1 100644 --- a/avr/cores/megacommand/resources/R.h +++ b/avr/cores/megacommand/resources/R.h @@ -109,6 +109,12 @@ struct __T_icons_knob { extern const unsigned char __R_icons_page[] PROGMEM; struct __T_icons_page { + union { + unsigned char icon_perf[0]; + char zz__icon_perf[54]; + }; + static constexpr size_t countof_icon_perf = 54 / sizeof(unsigned char); + static constexpr size_t sizeofof_icon_perf = 54; union { unsigned char icon_chroma[0]; char zz__icon_chroma[75]; @@ -141,10 +147,10 @@ struct __T_icons_page { static constexpr size_t sizeofof_icon_sample = 75; union { unsigned char icon_route[0]; - char zz__icon_route[48]; + char zz__icon_route[42]; }; - static constexpr size_t countof_icon_route = 48 / sizeof(unsigned char); - static constexpr size_t sizeofof_icon_route = 48; + static constexpr size_t countof_icon_route = 42 / sizeof(unsigned char); + static constexpr size_t sizeofof_icon_route = 42; union { unsigned char icon_rhytmecho[0]; char zz__icon_rhytmecho[75]; @@ -165,10 +171,10 @@ struct __T_icons_page { static constexpr size_t sizeofof_icon_mixer = 48; union { unsigned char icon_step[0]; - char zz__icon_step[75]; + char zz__icon_step[63]; }; - static constexpr size_t countof_icon_step = 75 / sizeof(unsigned char); - static constexpr size_t sizeofof_icon_step = 75; + static constexpr size_t countof_icon_step = 63 / sizeof(unsigned char); + static constexpr size_t sizeofof_icon_step = 63; union { unsigned char icon_wavd[0]; char zz__icon_wavd[57]; @@ -193,7 +199,7 @@ struct __T_icons_page { }; static constexpr size_t countof_icon_grid = 45 / sizeof(unsigned char); static constexpr size_t sizeofof_icon_grid = 45; - static constexpr size_t __total_size = 918; + static constexpr size_t __total_size = 954; }; extern const unsigned char __R_machine_names_long[] PROGMEM; diff --git a/avr/cores/megacommand/resources/R_icons_page.cpp b/avr/cores/megacommand/resources/R_icons_page.cpp index 31130adc1..b3d375888 100644 --- a/avr/cores/megacommand/resources/R_icons_page.cpp +++ b/avr/cores/megacommand/resources/R_icons_page.cpp @@ -1,172 +1,191 @@ #include "R.h" const unsigned char __R_icons_page[] PROGMEM = { - 255, + 202, 0, 0, + 98, + 13, + 112, + 191, + 2, + 96, 0, - 117, - 119, + 28, + 80, + 0, + 207, + 99, + 8, + 255, + 207, + 132, + 16, + 128, + 230, + 8, + 127, + 0, + 246, + 5, + 28, 0, - 69, - 85, - 254, 3, - 71, - 101, + 30, + 216, + 7, + 47, + 75, + 16, + 173, 15, - 117, - 87, + 2, + 150, 57, - 223, - 13, 231, - 0, - 3, + 217, + 10, 156, - 255, - 0, - 15, + 125, 241, 0, 63, 194, - 0, - 255, - 255, + 191, + 53, 9, 3, 252, 100, 15, + 255, 240, 178, 55, - 255, 194, 89, 215, 9, 45, + 255, 220, 100, 150, - 255, 112, 178, 89, 130, 89, + 255, 103, 201, 45, - 255, 158, 236, 150, 120, 118, + 255, 89, 224, 59, - 255, 103, 128, 29, 158, 0, + 255, 14, 120, 0, - 251, 6, 224, 0, 2, 128, + 107, 5, - 91, 60, + 119, 254, - 185, 0, 5, - 155, + 51, 8, + 96, 2, - 7, + 243, 6, 7, - 153, 192, - 128, + 48, + 23, 23, - 186, 5, + 92, 62, - 230, 2, + 203, 32, - 93, + 185, 248, - 204, 2, + 144, 56, - 133, - 131, + 176, 0, + 127, 31, - 251, 255, 248, 32, 0, 4, + 103, 2, - 63, 35, 255, + 255, 196, 36, - 255, 194, 100, 37, 66, 164, + 253, 38, 67, 36, - 236, 35, 129, 196, + 131, 23, - 29, 255, + 185, 4, - 204, 35, + 159, 44, - 255, 7, 56, 112, + 253, 15, 188, 240, - 237, 13, 182, 192, + 175, 2, - 124, 5, + 151, 15, - 190, 7, 54, - 112, - 0, + 10, + 4, 194, 74, 23, @@ -239,62 +258,63 @@ const unsigned char __R_icons_page[] PROGMEM = { 101, 183, 0, - 125, + 127, + 1, + 248, + 252, 3, 241, 248, - 7, - 227, - 187, - 92, 3, - 0, + 221, + 1, + 128, 2, - 182, - 31, - 143, - 179, - 238, + 15, + 251, + 199, + 224, 7, - 128, + 131, + 192, 8, - 115, - 128, + 156, + 203, + 238, 8, - 183, - 25, - 140, - 14, - 185, - 41, - 128, - 194, - 239, + 12, + 198, + 96, + 230, + 5, + 116, + 30, 254, 63, + 251, 2, - 253, 252, - 0, - 1, + 48, + 127, 252, 7, 225, - 223, - 56, 248, - 15, - 199, + 7, + 227, + 183, + 248, + 44, 240, 15, 220, 255, 240, - 146, + 140, 208, 2, 191, - 174, + 168, 127, 128, 63, @@ -324,243 +344,228 @@ const unsigned char __R_icons_page[] PROGMEM = { 153, 17, 176, - 75, + 114, 67, - 104, + 98, 91, 30, - 92, + 98, 126, - 255, + 237, 224, 1, 254, - 224, - 7, + 110, + 254, 255, 144, 3, - 246, 254, 112, 12, 249, - 74, 219, + 74, 38, 2, + 127, 220, - 253, 240, 239, 211, 55, 15, + 133, 223, - 191, - 122, + 55, + 255, 159, 240, 14, 95, 224, - 251, 9, 223, 128, + 219, 7, 222, 109, - 109, 216, + 109, 44, - 191, 64, + 255, 52, 61, 239, - 255, 72, 33, 41, + 251, 72, 45, 233, 48, 37, - 107, 5, + 92, 11, - 157, + 235, 17, 238, - 97, 0, - 179, + 13, + 157, 85, - 177, 14, + 141, 2, - 181, 238, + 175, 4, - 238, 2, + 117, 28, - 185, 224, + 204, 2, - 129, 32, - 186, + 13, + 209, 0, 215, - 223, - 243, + 190, + 87, 221, 0, 12, 245, - 10, - 63, - 55, - 115, + 23, + 57, + 119, + 0, + 255, 224, 60, - 255, 3, 128, 127, 15, 1, 222, + 255, 57, 135, - 255, 56, 214, 204, 225, 217, 251, + 255, 134, 127, - 255, 254, 25, 167, 152, 103, 222, + 241, 97, 158, - 198, 233, 134, - 93, - 242, + 188, + 87, 25, 224, 58, - 23, - 0, - 183, - 119, - 50, - 66, - 69, - 253, - 0, - 114, - 103, - 0, - 18, - 68, - 183, - 5, - 116, - 75, - 91, + 132, + 176, + 63, + 109, 136, 2, + 150, 204, - 44, 170, - 47, - 228, + 23, + 210, 153, 17, + 247, 16, - 109, - 20, + 0, + 18, 168, - 210, 2, + 75, 32, - 203, 81, + 47, 138, - 252, 116, 169, + 242, 4, 16, 170, 0, - 140, + 50, 238, - 189, + 247, 170, 16, 68, - 208, 35, + 70, 187, - 129, - 74, - 133, - 46, - 255, + 218, + 6, + 23, + 34, 17, 255, + 255, 136, 37, 195, 164, 41, 153, - 237, 148, 41, + 183, 165, 2, - 220, 181, 148, + 115, 8, - 231, 14, + 157, 20, - 125, 1, - 255, - 128, + 75, + 17, 1, + 189, 231, - 238, 2, + 205, 8, - 107, 38, + 101, 49, - 46, + 219, 224, - 223, 15, 16, + 165, 30, - 0, - 8, + 41, 181, 96, 2, @@ -582,7 +587,7 @@ const unsigned char __R_icons_page[] PROGMEM = { 192, 62, 28, - 128, + 116, 125, 62, 192, @@ -590,7 +595,7 @@ const unsigned char __R_icons_page[] PROGMEM = { 99, 225, 2, - 123, + 111, 109, 224, 2, @@ -605,27 +610,27 @@ const unsigned char __R_icons_page[] PROGMEM = { 96, 28, 29, - 181, - 2, - 221, - 196, + 6, + 185, + 119, + 184, 54, 219, 108, - 214, + 117, 2, 0, + 144, 8, - 65, - 199, + 116, 1, - 23, + 192, + 122, 0, 0, 0, 0, 0, - 2, - 127, + 159, 255, }; diff --git a/avr/cores/megacommand/resources/R_page_entries.cpp b/avr/cores/megacommand/resources/R_page_entries.cpp index 0973bfc69..487b675d8 100644 --- a/avr/cores/megacommand/resources/R_page_entries.cpp +++ b/avr/cores/megacommand/resources/R_page_entries.cpp @@ -27,6 +27,20 @@ const unsigned char __R_page_entries[] PROGMEM = { 23, 16, 7, + 109, + 80, + 21, + 176, + 70, + 43, + 62, + 40, + 0, + 2, + 219, + 23, + 18, + 7, 126, 82, 79, @@ -35,26 +49,16 @@ const unsigned char __R_page_entries[] PROGMEM = { 69, 192, 23, - 121, - 21, - 0, - 2, - 30, - 76, - 70, - 79, - 194, - 67, 110, - 22, + 21, 49, 219, 24, - 24, + 14, 7, 83, 111, - 45, + 21, 80, 32, 69, @@ -68,144 +72,147 @@ const unsigned char __R_page_entries[] PROGMEM = { 0, 4, 1, - 219, + 221, 24, - 25, - 7, - 80, - 251, + 21, + 71, 73, + 246, 65, 78, 79, 32, - 77, - 118, + 53, + 236, 76, 76, 23, - 124, + 249, 8, 0, - 6, - 142, + 5, + 109, + 25, + 7, + 219, 67, 72, - 223, 19, 77, + 246, 65, 84, 73, - 176, 67, 47, - 109, + 15, 9, - 49, + 0, + 6, 99, 23, - 83, - 254, + 76, + 216, + 70, + 79, + 163, + 77, + 22, + 173, + 73, + 23, + 187, + 24, + 95, 65, 77, + 251, 80, 76, 69, 32, 77, - 221, - 53, + 77, + 119, 65, 71, - 246, - 152, + 176, + 219, 12, - 49, - 223, + 73, 2, - 23, + 127, + 47, 87, - 255, 65, 86, + 254, 32, 68, 69, 83, 73, 71, - 179, 78, - 174, - 181, + 206, + 198, 18, - 49, - 183, + 214, + 73, 23, + 218, + 19, + 7, + 222, 19, - 95, - 54, - 14, - 70, - 192, - 143, - 251, - 40, - 0, - 10, - 23, - 22, - 43, - 246, 76, 65, 89, - 23, - 3, - 16, + 192, + 71, 109, - 73, + 16, + 49, + 191, 3, - 253, - 71, + 47, 82, 69, - 86, 182, - 49, + 86, + 40, 66, + 203, 23, - 95, + 228, 17, 0, 13, - 38, - 221, - 119, + 219, + 95, 45, + 176, 49, - 128, 47, - 246, + 30, 23, 0, 14, + 201, 23, - 76, + 132, 50, - 32, 51, - 123, + 15, 0, 15, + 98, 23, - 16, 0, 0, 0, 0, 0, - 79, + 9, 255, }; diff --git a/resource/icons_page.cpp b/resource/icons_page.cpp index 37f3cd5f6..243f80139 100644 --- a/resource/icons_page.cpp +++ b/resource/icons_page.cpp @@ -32,15 +32,12 @@ unsigned char icon_wavd[] = { 0x00, 0x10, 0xaa, 0xee, 0x10, 0xaa, 0xaa, 0x10, 0x44, 0xaa, 0x70, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; -// 'step', 24x25px +// 'step', 24x21px unsigned char icon_step[] = { - 0x00, 0x00, 0xd7, 0x00, 0x03, 0xdd, 0x00, 0x0c, 0xf5, 0x00, 0x38, - 0x77, 0x00, 0xe0, 0x3c, 0x03, 0x80, 0x7f, 0x0f, 0x01, 0xde, 0x39, - 0x87, 0x38, 0xd6, 0xcc, 0xe1, 0xd9, 0xfb, 0x86, 0x7f, 0xfe, 0x19, - 0xa7, 0x98, 0x67, 0xde, 0x61, 0x9e, 0xe9, 0x86, 0x78, 0x76, 0x19, - 0xe0, 0x3a, 0x67, 0x80, 0x1d, 0x9e, 0x00, 0x0e, 0x78, 0x00, 0x06, - 0xe0, 0x00, 0x02, 0x80, 0x00, 0x00, 0x77, 0x77, 0x00, 0x42, 0x45, - 0x00, 0x72, 0x67, 0x00, 0x12, 0x44, 0x00, 0x72, 0x74}; + 0x00, 0x00, 0xd7, 0x00, 0x03, 0xdd, 0x00, 0x0c, 0xf5, 0x00, 0x38, 0x77, 0x00, 0xe0, 0x3c, 0x03, + 0x80, 0x7f, 0x0f, 0x01, 0xde, 0x39, 0x87, 0x38, 0xd6, 0xcc, 0xe1, 0xd9, 0xfb, 0x86, 0x7f, 0xfe, + 0x19, 0xa7, 0x98, 0x67, 0xde, 0x61, 0x9e, 0xe9, 0x86, 0x78, 0x76, 0x19, 0xe0, 0x3a, 0x67, 0x80, + 0x1d, 0x9e, 0x00, 0x0e, 0x78, 0x00, 0x06, 0xe0, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00}; // 'mixer', 24x16px unsigned char icon_mixer[] = { @@ -69,12 +66,11 @@ unsigned char icon_rhytmecho[] = { 0x1b, 0x6c, 0x7b, 0x1f, 0x6c, 0x7b, 0x1f, 0x6c, 0x63, 0x1b, 0x6c, 0x7b, 0xdb, 0x7c, 0x7b, 0xdb, 0x7c, 0x00, 0x00, 0x00}; -// 'route', 24x16px +// 'route', 24x14px unsigned char icon_route[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf1, 0xf8, 0x07, 0xe3, 0xf0, - 0x06, 0x03, 0x00, 0x06, 0x03, 0x00, 0x1f, 0x8f, 0xc0, 0x0f, 0x07, 0x80, - 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x07, 0x80, 0x19, 0x8c, 0xc0, - 0x0f, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf8, 0xfc, 0x03, 0xf1, 0xf8, 0x03, 0x01, 0x80, 0x03, + 0x01, 0x80, 0x0f, 0xc7, 0xe0, 0x07, 0x83, 0xc0, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, 0x07, 0x83, + 0xc0, 0x0c, 0xc6, 0x60, 0x07, 0x83, 0xc0, 0x00, 0x00, 0x00}; // 'sample', 24x25 unsigned char icon_sample [] = { @@ -125,11 +121,17 @@ unsigned char icon_pianoroll[] = { // 'chroma', 24x25px unsigned char icon_chroma[] = { - 0x00, 0x00, 0x00, 0x75, 0x77, 0x00, 0x45, 0x55, 0x03, 0x47, 0x65, - 0x0f, 0x75, 0x57, 0x39, 0x00, 0x00, 0xe7, 0x00, 0x03, 0x9c, 0x00, - 0x0f, 0xf1, 0x00, 0x3f, 0xc2, 0x00, 0xff, 0x09, 0x03, 0xfc, 0x64, - 0x0f, 0xf0, 0xb2, 0x37, 0xc2, 0x59, 0xd7, 0x09, 0x2d, 0xdc, 0x64, - 0x96, 0x70, 0xb2, 0x59, 0x82, 0x59, 0x67, 0xc9, 0x2d, 0x9e, 0xec, - 0x96, 0x78, 0x76, 0x59, 0xe0, 0x3b, 0x67, 0x80, 0x1d, 0x9e, 0x00, - 0x0e, 0x78, 0x00, 0x06, 0xe0, 0x00, 0x02, 0x80, 0x00}; + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x39, 0x00, + 0x00, 0xe7, 0x00, 0x03, 0x9c, 0x00, 0x0f, 0xf1, 0x00, 0x3f, 0xc2, 0x00, 0xff, 0x09, 0x03, 0xfc, + 0x64, 0x0f, 0xf0, 0xb2, 0x37, 0xc2, 0x59, 0xd7, 0x09, 0x2d, 0xdc, 0x64, 0x96, 0x70, 0xb2, 0x59, + 0x82, 0x59, 0x67, 0xc9, 0x2d, 0x9e, 0xec, 0x96, 0x78, 0x76, 0x59, 0xe0, 0x3b, 0x67, 0x80, 0x1d, + 0x9e, 0x00, 0x0e, 0x78, 0x00, 0x06, 0xe0, 0x00, 0x02, 0x80, 0x00}; + +// 'perf', 24x18px +unsigned char icon_perf[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, + 0x00, 0x60, 0x00, 0x1c, 0x50, 0x00, 0x63, 0x08, 0x00, 0x63, 0x08, 0x00, 0xff, 0x84, 0x10, 0xff, + 0x84, 0x10, 0xff, 0x80, 0x08, 0x7f, 0x00, 0x08, 0x7f, 0x00, 0x05, 0x1c, 0x00, 0x03, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00}; + diff --git a/resource/page_entries.cpp b/resource/page_entries.cpp index 79e89a837..45227f32a 100644 --- a/resource/page_entries.cpp +++ b/resource/page_entries.cpp @@ -4,18 +4,19 @@ PageSelectEntry Entries[] = { {"GRID", GRID_PAGE, 0, 0, 24, 15, nullptr}, {"MIXER", MIXER_PAGE, 1, 0, 24, 16, nullptr}, - {"ROUTE", ROUTE_PAGE, 2, 0, 24, 16, nullptr}, - {"LFO", LFO_PAGE, 3, 0, 24, 24, nullptr}, - {"STEP EDIT", SEQ_STEP_PAGE, 4, 1, 24, 25, nullptr}, - {"PIANO ROLL", SEQ_EXTSTEP_PAGE, 6, 1, 24, 25, nullptr}, - {"CHROMATIC", SEQ_PTC_PAGE, 7, 1, 24, 25, nullptr}, + {"PERF", PERF_PAGE_0, 2, 0, 24, 18, nullptr}, + {"ROUTE", ROUTE_PAGE, 3, 0, 24, 14, nullptr}, + + {"STEP EDIT", SEQ_STEP_PAGE, 4, 1, 24, 21, nullptr}, + {"PIANO ROLL", SEQ_EXTSTEP_PAGE, 5, 1, 24, 25, nullptr}, + {"CHROMATIC", SEQ_PTC_PAGE, 6, 1, 24, 25, nullptr}, + {"LFO", LFO_PAGE, 7, 1, 24, 24, nullptr}, #ifdef SOUND_PAGE {"SAMPLE MANAGER", SAMPLE_BROWSER, 8, 2, 24, 25, nullptr}, #endif #ifdef WAV_DESIGNER {"WAV DESIGNER", WD_PAGE_0, 9, 2, 24, 19, nullptr}, #endif - {"PERF", PERF_PAGE_0, 10, 2, 24, 19, nullptr}, {"DELAY", FX_PAGE_A, 12, 3, 24, 25, nullptr}, {"REVERB", FX_PAGE_B, 13, 3, 24, 25, nullptr}, {"RAM-1", RAM_PAGE_A, 14, 3, 24, 25, nullptr}, From e51e51174603c89d3072f88d36b892b4148bbabb Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 5 Jul 2023 18:11:00 +1000 Subject: [PATCH 182/413] route page icon fix --- avr/cores/megacommand/MCL/RoutePage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/RoutePage.cpp b/avr/cores/megacommand/MCL/RoutePage.cpp index a19b6574f..8006581bc 100644 --- a/avr/cores/megacommand/MCL/RoutePage.cpp +++ b/avr/cores/megacommand/MCL/RoutePage.cpp @@ -99,7 +99,7 @@ void RoutePage::display() { auto *oldfont = oled_display.getFont(); oled_display.clearDisplay(); - oled_display.drawBitmap(0, 0, R.icons_page->icon_route, 24, 16, WHITE); + oled_display.drawBitmap(0, 0, R.icons_page->icon_route, 24, 14, WHITE); mcl_gui.draw_knob_frame(); From baa03509cb24d3d5995dc1f9a514449e7ac333c9 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 5 Jul 2023 18:11:19 +1000 Subject: [PATCH 183/413] Mixer page, mixer_params added back in --- avr/cores/megacommand/MCL/MixerPage.cpp | 33 ++++++++++++++++--------- avr/cores/megacommand/MCL/MixerPage.h | 2 ++ 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index fc80d62f9..69da00c24 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -42,22 +42,27 @@ void MixerPage::oled_draw_mutes() { } void MixerPage::setup() { - /* - encoders[0]->handler = encoder_level_handle; - encoders[1]->handler = encoder_filtf_handle; - encoders[2]->handler = encoder_filtw_handle; - encoders[3]->handler = encoder_filtq_handle; - */ + mixer_param1.handler = encoder_level_handle; + mixer_param2.handler = encoder_filtf_handle; + mixer_param3.handler = encoder_filtw_handle; + mixer_param4.handler = encoder_filtq_handle; +} + +void MixerPage::restore_encoders() { + encoders[0] = &perf_param1; + encoders[1] = &perf_param2; + encoders[2] = &perf_param3; + encoders[3] = &perf_param4; } void MixerPage::init() { level_pressmode = 0; - /* - for (uint8_t i = 0; i < 4; i++) { - encoders[i]->cur = 64; - encoders[i]->old = 64; + if (note_interface.notes_count_on() > 0) { + for (uint8_t i = 0; i < 4; i++) { + encoders[i]->cur = 64; + encoders[i]->old = 64; + } } - */ MD.set_key_repeat(0); trig_interface.on(); MD.set_trigleds(0, TRIGLED_OVERLAY); @@ -71,6 +76,7 @@ void MixerPage::init() { redraw_mask = -1; show_mixer_menu = 0; populate_mute_set(); + restore_encoders(); // R.Clear(); // R.use_machine_param_names(); } @@ -394,6 +400,10 @@ bool MixerPage::handleEvent(gui_event_t *event) { if (event->mask == EVENT_BUTTON_PRESSED && track <= len) { if (note_interface.is_note(track)) { + encoders[0] = &mixer_param1; + encoders[1] = &mixer_param2; + encoders[2] = &mixer_param3; + encoders[3] = &mixer_param4; if (show_mixer_menu || preview_mute_set != 255) { SeqTrack *seq_track = is_md_device @@ -437,6 +447,7 @@ bool MixerPage::handleEvent(gui_event_t *event) { if (event->mask == EVENT_BUTTON_RELEASED) { SET_BIT16(redraw_mask, track); if (note_interface.notes_count_on() == 0) { + restore_encoders(); first_track = 255; note_interface.init_notes(); oled_draw_mutes(); diff --git a/avr/cores/megacommand/MCL/MixerPage.h b/avr/cores/megacommand/MCL/MixerPage.h index 9e888f23e..50e6daba7 100644 --- a/avr/cores/megacommand/MCL/MixerPage.h +++ b/avr/cores/megacommand/MCL/MixerPage.h @@ -29,6 +29,8 @@ class MixerPage : public LightPage { public: MixerMidiEvents midi_events; + void restore_encoders(); + uint8_t level_pressmode = 0; int8_t disp_levels[16]; int8_t ext_disp_levels[6]; From 4f04cc84fc6bf9d2b9cf42ffc4a49009354fb30f Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 5 Jul 2023 18:11:25 +1000 Subject: [PATCH 184/413] Revert "Mixer page, mixer_params added back in" This reverts commit baa03509cb24d3d5995dc1f9a514449e7ac333c9. --- avr/cores/megacommand/MCL/MixerPage.cpp | 33 +++++++++---------------- avr/cores/megacommand/MCL/MixerPage.h | 2 -- 2 files changed, 11 insertions(+), 24 deletions(-) diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 69da00c24..fc80d62f9 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -42,27 +42,22 @@ void MixerPage::oled_draw_mutes() { } void MixerPage::setup() { - mixer_param1.handler = encoder_level_handle; - mixer_param2.handler = encoder_filtf_handle; - mixer_param3.handler = encoder_filtw_handle; - mixer_param4.handler = encoder_filtq_handle; -} - -void MixerPage::restore_encoders() { - encoders[0] = &perf_param1; - encoders[1] = &perf_param2; - encoders[2] = &perf_param3; - encoders[3] = &perf_param4; + /* + encoders[0]->handler = encoder_level_handle; + encoders[1]->handler = encoder_filtf_handle; + encoders[2]->handler = encoder_filtw_handle; + encoders[3]->handler = encoder_filtq_handle; + */ } void MixerPage::init() { level_pressmode = 0; - if (note_interface.notes_count_on() > 0) { - for (uint8_t i = 0; i < 4; i++) { - encoders[i]->cur = 64; - encoders[i]->old = 64; - } + /* + for (uint8_t i = 0; i < 4; i++) { + encoders[i]->cur = 64; + encoders[i]->old = 64; } + */ MD.set_key_repeat(0); trig_interface.on(); MD.set_trigleds(0, TRIGLED_OVERLAY); @@ -76,7 +71,6 @@ void MixerPage::init() { redraw_mask = -1; show_mixer_menu = 0; populate_mute_set(); - restore_encoders(); // R.Clear(); // R.use_machine_param_names(); } @@ -400,10 +394,6 @@ bool MixerPage::handleEvent(gui_event_t *event) { if (event->mask == EVENT_BUTTON_PRESSED && track <= len) { if (note_interface.is_note(track)) { - encoders[0] = &mixer_param1; - encoders[1] = &mixer_param2; - encoders[2] = &mixer_param3; - encoders[3] = &mixer_param4; if (show_mixer_menu || preview_mute_set != 255) { SeqTrack *seq_track = is_md_device @@ -447,7 +437,6 @@ bool MixerPage::handleEvent(gui_event_t *event) { if (event->mask == EVENT_BUTTON_RELEASED) { SET_BIT16(redraw_mask, track); if (note_interface.notes_count_on() == 0) { - restore_encoders(); first_track = 255; note_interface.init_notes(); oled_draw_mutes(); diff --git a/avr/cores/megacommand/MCL/MixerPage.h b/avr/cores/megacommand/MCL/MixerPage.h index 50e6daba7..9e888f23e 100644 --- a/avr/cores/megacommand/MCL/MixerPage.h +++ b/avr/cores/megacommand/MCL/MixerPage.h @@ -29,8 +29,6 @@ class MixerPage : public LightPage { public: MixerMidiEvents midi_events; - void restore_encoders(); - uint8_t level_pressmode = 0; int8_t disp_levels[16]; int8_t ext_disp_levels[6]; From b671f786252f017039106019d38975b238012135 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 5 Jul 2023 18:22:59 +1000 Subject: [PATCH 185/413] Func perf hard pan --- avr/cores/megacommand/MCL/MCL.h | 2 +- avr/cores/megacommand/MCL/MixerPage.cpp | 4 ++- avr/cores/megacommand/MCL/PerfPage.cpp | 45 +++++++++++++++++++------ avr/cores/megacommand/MCL/PerfPage.h | 1 + 4 files changed, 39 insertions(+), 13 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCL.h b/avr/cores/megacommand/MCL/MCL.h index fdc9b941a..3f3ea571e 100644 --- a/avr/cores/megacommand/MCL/MCL.h +++ b/avr/cores/megacommand/MCL/MCL.h @@ -17,7 +17,7 @@ #include "Fonts/TomThumb.h" #define VERSION 4050 -#define VERSION_STR "Z4.50" +#define VERSION_STR "BA4.50" #define CALLBACK_TIMEOUT 500 #define GUI_NAME_TIMEOUT 800 diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index fc80d62f9..ae5fe96a0 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -89,7 +89,9 @@ void MixerPage::set_level(int curtrack, int value) { // in_sysex = 0; } -void MixerPage::loop() {} +void MixerPage::loop() { + perf_page.func_enc_check(); +} void MixerPage::draw_levels() {} diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index e98e8432f..6c25eafc9 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -37,8 +37,7 @@ void PerfPage::set_led_mask() { if (show_menu) { SET_BIT16(mask, perf_id); - } - else { + } else { if (e->active_scene_a < NUM_SCENES) { SET_BIT16(mask, e->active_scene_a); } @@ -49,7 +48,10 @@ void PerfPage::set_led_mask() { if (last_mask != mask) { MD.set_trigleds(mask, TRIGLED_EXCLUSIVENDYNAMIC); } - if (show_menu) { last_mask = mask; return; } + if (show_menu) { + last_mask = mask; + return; + } bool blink = true; uint16_t blink_mask = 0; @@ -70,7 +72,21 @@ void PerfPage::cleanup() { trig_interface.off(); MD.set_rec_mode(0); } - +void PerfPage::func_enc_check() { + if (trig_interface.is_key_down(MDX_KEY_FUNC)) { + for (uint8_t n = 0; n < 4; n++) { + PerfEncoder *e = perf_encoders[n]; + int dir = e->cur - e->old; + if (dir < 0) { + e->cur = 0; + } + if (dir > 0) { + e->cur = 127; + } + e->send(); + } + } +} void PerfPage::config_encoder_range(uint8_t i) { ((PerfEncoder *)encoders[i])->max = NUM_MD_TRACKS + 4 + 16; ((PerfEncoder *)encoders[i + 1])->min = 0; @@ -140,7 +156,9 @@ void PerfPage::config_encoders(uint8_t show_val) { } } void PerfPage::update_params() { - if (show_menu) { return; } + if (show_menu) { + return; + } uint8_t c = page_mode - 1; if (page_mode > PERF_DESTINATION) { config_encoder_range(1); @@ -179,6 +197,7 @@ void PerfPage::loop() { perf_menu_page.loop(); return; } + func_enc_check(); update_params(); } @@ -295,7 +314,7 @@ void PerfPage::learn_param(uint8_t dest, uint8_t param, uint8_t value) { } if (mcl.currentPage() == PERF_PAGE_0) { if (dest > NUM_MD_TRACKS + 4 && MidiClock.state == 2) { - return; + return; } if (learn) { uint8_t scene = learn - 1; @@ -326,11 +345,10 @@ void PerfPage::learn_param(uint8_t dest, uint8_t param, uint8_t value) { void rename_perf() { const char *my_title = "PerfCtrl Name:"; - mcl_gui.wait_for_input(perf_page.perf_encoders[perf_page.perf_id]->name, my_title, 8); - + mcl_gui.wait_for_input(perf_page.perf_encoders[perf_page.perf_id]->name, + my_title, 8); } - void PerfPage::send_locks(uint8_t scene) { MDSeqTrack &active_track = mcl_seq.md_tracks[last_md_track]; uint8_t params[24]; @@ -371,7 +389,10 @@ bool PerfPage::handleEvent(gui_event_t *event) { return true; } - if (show_menu) { perf_id = track; return true; } + if (show_menu) { + perf_id = track; + return true; + } PerfEncoder *e = perf_encoders[perf_id]; @@ -394,7 +415,9 @@ bool PerfPage::handleEvent(gui_event_t *event) { } } if (event->mask == EVENT_BUTTON_RELEASED) { - if (show_menu) { return true; } + if (show_menu) { + return true; + } if (note_interface.notes_all_off()) { learn = LEARN_OFF; seq_step_page.enable_paramupdate_events(); diff --git a/avr/cores/megacommand/MCL/PerfPage.h b/avr/cores/megacommand/MCL/PerfPage.h index 103daf97a..0e0c9c70b 100644 --- a/avr/cores/megacommand/MCL/PerfPage.h +++ b/avr/cores/megacommand/MCL/PerfPage.h @@ -47,6 +47,7 @@ class PerfPage : public LightPage, PerfPageParent { void loop(); void cleanup(); + void func_enc_check(); void set_led_mask(); void config_encoders(uint8_t show_val = false); From 5b9817ab887285dbb0ea94fcf62bdfd6cfe7d5d2 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 5 Jul 2023 19:20:47 +1000 Subject: [PATCH 186/413] encoder drawing on mixer page --- avr/cores/megacommand/MCL/MCL.h | 2 +- avr/cores/megacommand/MCL/MCLGUI.cpp | 6 ++-- avr/cores/megacommand/MCL/MCLGUI.h | 2 +- avr/cores/megacommand/MCL/MixerPage.cpp | 42 ++++++++++++++++++++----- avr/cores/megacommand/MCL/MixerPage.h | 2 ++ 5 files changed, 42 insertions(+), 12 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCL.h b/avr/cores/megacommand/MCL/MCL.h index 3f3ea571e..26d9be6b1 100644 --- a/avr/cores/megacommand/MCL/MCL.h +++ b/avr/cores/megacommand/MCL/MCL.h @@ -17,7 +17,7 @@ #include "Fonts/TomThumb.h" #define VERSION 4050 -#define VERSION_STR "BA4.50" +#define VERSION_STR "BB4.50" #define CALLBACK_TIMEOUT 500 #define GUI_NAME_TIMEOUT 800 diff --git a/avr/cores/megacommand/MCL/MCLGUI.cpp b/avr/cores/megacommand/MCL/MCLGUI.cpp index 5327d9a10..dbea1976d 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.cpp +++ b/avr/cores/megacommand/MCL/MCLGUI.cpp @@ -330,7 +330,7 @@ void MCLGUI::draw_encoder(uint8_t x, uint8_t y, Encoder *encoder) { draw_encoder(x, y, encoder->cur); } -bool MCLGUI::show_encoder_value(Encoder *encoder) { +bool MCLGUI::show_encoder_value(Encoder *encoder, int timeout) { uint8_t match = 255; for (uint8_t i = 0; i < GUI_NUM_ENCODERS && match == 255; i++) { @@ -341,11 +341,11 @@ bool MCLGUI::show_encoder_value(Encoder *encoder) { if (match != 255) { if (clock_diff(((LightPage *)GUI.currentPage())->encoders_used_clock[match], - slowclock) < SHOW_VALUE_TIMEOUT) { + slowclock) < timeout) { return true; } else { ((LightPage *)GUI.currentPage())->encoders_used_clock[match] = - slowclock + SHOW_VALUE_TIMEOUT + 1; + slowclock + timeout + 1; } } diff --git a/avr/cores/megacommand/MCL/MCLGUI.h b/avr/cores/megacommand/MCL/MCLGUI.h index 7be1d5b1a..37aa44a24 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.h +++ b/avr/cores/megacommand/MCL/MCLGUI.h @@ -51,7 +51,7 @@ class MCLGUI { void draw_encoder(uint8_t x, uint8_t y, uint8_t value); void draw_encoder(uint8_t x, uint8_t y, Encoder *encoder); - bool show_encoder_value(Encoder *encoder); + bool show_encoder_value(Encoder *encoder, int timeout = SHOW_VALUE_TIMEOUT); void draw_text_encoder(uint8_t x, uint8_t y, const char *name, const char *value); diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index ae5fe96a0..65ac8806c 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -71,7 +71,8 @@ void MixerPage::init() { redraw_mask = -1; show_mixer_menu = 0; populate_mute_set(); -// R.Clear(); + draw_encoders = false; + // R.Clear(); // R.use_machine_param_names(); } @@ -91,6 +92,22 @@ void MixerPage::set_level(int curtrack, int value) { void MixerPage::loop() { perf_page.func_enc_check(); + bool old_draw_encoders = draw_encoders; + if (draw_encoders && trig_interface.is_key_down(MDX_KEY_FUNC)) { + draw_encoders = true; + } + else { + draw_encoders = false; + constexpr int timeout = 800; + for (uint8_t n = 0; n < 4; n++) { + if (note_interface.notes_on) { encoders_used_clock[n] = slowclock + timeout + 1; } + if (mcl_gui.show_encoder_value(encoders[n],timeout)) { draw_encoders = true; } + } + } + if (draw_encoders != old_draw_encoders) { + if (!draw_encoders) { redraw_mask = -1; + oled_display.clearDisplay(); oled_draw_mutes(); } + } } void MixerPage::draw_levels() {} @@ -189,17 +206,29 @@ void MixerPage::adjust_param(EncoderParent *enc, uint8_t param) { void MixerPage::display() { auto oldfont = oled_display.getFont(); + if (oled_display.textbox_enabled) { + oled_display.clearDisplay(); + oled_draw_mutes(); + redraw_mask = -1; + } + else if (draw_encoders) { + //oled_display.clearDisplay(); + oled_display.fillRect(0,0,128,12,BLACK); + for (uint8_t n = 0; n < 4; n++) { + char *str1 = "A"; + str1[0] = 'A' + n; + uint8_t pos = n * 24; + mcl_gui.draw_encoder(24 + pos, 0, encoders[n]->cur); + oled_display.setCursor(16 + pos, 2); + oled_display.print(str1); + } + } uint8_t fader_level; uint8_t meter_level; uint8_t fader_x = 0; constexpr uint8_t fader_y = 11; - if (oled_display.textbox_enabled) { - oled_display.clearDisplay(); - oled_draw_mutes(); - redraw_mask = -1; - } bool is_md_device = (midi_device == &MD); uint8_t len = is_md_device ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; @@ -389,7 +418,6 @@ bool MixerPage::handleEvent(gui_event_t *event) { if (track > 16) { return false; } - if (!show_mixer_menu && preview_mute_set == 255) { trig_interface.send_md_leds(TRIGLED_OVERLAY); } diff --git a/avr/cores/megacommand/MCL/MixerPage.h b/avr/cores/megacommand/MCL/MixerPage.h index 9e888f23e..03349e339 100644 --- a/avr/cores/megacommand/MCL/MixerPage.h +++ b/avr/cores/megacommand/MCL/MixerPage.h @@ -40,6 +40,8 @@ class MixerPage : public LightPage { uint16_t redraw_mask; bool show_mixer_menu; + bool draw_encoders; + uint8_t current_mute_set = 0; uint8_t preview_mute_set = 255; void send_fx(uint8_t param, Encoder *enc, uint8_t type); From 0f6ebf701f6b0662c5595d93fd7a7efa93cc0617 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 5 Jul 2023 22:33:14 +1000 Subject: [PATCH 187/413] bug --- avr/cores/megacommand/MCL/PerfPage.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 6c25eafc9..c6b3ac32a 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -390,7 +390,9 @@ bool PerfPage::handleEvent(gui_event_t *event) { } if (show_menu) { - perf_id = track; + if (track < 4) { + perf_id = track; + } return true; } From 79277469b7345d6ea7ce127834b79b7928c69712 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 5 Jul 2023 22:45:04 +1000 Subject: [PATCH 188/413] fixes to encoder hard panning --- avr/cores/megacommand/MCL/PerfPage.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index c6b3ac32a..42b66915d 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -76,14 +76,17 @@ void PerfPage::func_enc_check() { if (trig_interface.is_key_down(MDX_KEY_FUNC)) { for (uint8_t n = 0; n < 4; n++) { PerfEncoder *e = perf_encoders[n]; - int dir = e->cur - e->old; - if (dir < 0) { - e->cur = 0; - } - if (dir > 0) { - e->cur = 127; + if (e->hasChanged()) { + int dir = e->cur - e->old; + if (dir < 0) { + e->cur = 0; + } + if (dir > 0) { + e->cur = 127; + } + e->old = e->cur; + e->send(); } - e->send(); } } } From 3572bb33f42a039388d21307a35286021d8e0263 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 6 Jul 2023 11:52:44 +1000 Subject: [PATCH 189/413] Wav d sample transmit menu broken --- avr/cores/megacommand/MCL/WavDesigner.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/WavDesigner.cpp b/avr/cores/megacommand/MCL/WavDesigner.cpp index a72d69f6f..03ee2769c 100644 --- a/avr/cores/megacommand/MCL/WavDesigner.cpp +++ b/avr/cores/megacommand/MCL/WavDesigner.cpp @@ -12,9 +12,8 @@ void WavDesigner::prompt_send() { sample_browser.show_samplemgr = true; sample_browser.pending_action = PA_SELECT; sample_browser.setup(); - sample_browser.show_samplemgr = true; wd.render(); - sample_browser.init(); + sample_browser.init(true); if (sample_browser.file.open(WAV_NAME, O_READ)) { while (mcl.currentPage() == SAMPLE_BROWSER && sample_browser.pending_action == PA_SELECT && sample_browser.show_samplemgr) { From 851e69e8c6471e38a3cd25d7961c15ee1a98a70e Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 6 Jul 2023 11:52:55 +1000 Subject: [PATCH 190/413] Arp idx reset on all notes off. Arp is either quant or not --- avr/cores/megacommand/MCL/SeqPtcPage.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.cpp b/avr/cores/megacommand/MCL/SeqPtcPage.cpp index 7bae2f4f9..b926eafe1 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPtcPage.cpp @@ -637,11 +637,20 @@ uint8_t SeqPtcPage::process_ext_event(uint8_t note_num, bool note_type, uint8_t pitch = seq_ptc_page.seq_ext_pitch(note_num); uint8_t dev = (midi_device == &MD) ? 0 : 1; + SeqTrackBase *arp_track = dev ? (SeqTrackBase*) &mcl_seq.ext_arp_tracks[last_ext_track] : (SeqTrackBase*) &mcl_seq.md_arp_tracks[last_md_track]; dev_note_channels[dev] = channel; if (note_type) { - if (arp_enabled.cur == ARP_LATCH) { - if (seq_ptc_page.dev_note_masks[dev][0] == 0 && - seq_ptc_page.dev_note_masks[dev][1] == 0) { + bool notes_all_off = seq_ptc_page.dev_note_masks[dev][0] == 0 && seq_ptc_page.dev_note_masks[dev][1] == 0; + + if (notes_all_off) { + if (dev) { mcl_seq.ext_arp_tracks[last_ext_track].idx = 0; } + else { mcl_seq.md_arp_tracks[last_md_track].idx = 0; } + + if (mcl_cfg.rec_quant == 0) { + arp_track->mod12_counter = arp_track->get_timing_mid() - 2; + arp_track->step_count = arp_track->length - 1; + } + if (arp_enabled.cur == ARP_LATCH) { memset(seq_ptc_page.note_mask, 0, sizeof(seq_ptc_page.note_mask)); } } From f63d9f887734745ef3826ac4cdf76b4af299c498 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 6 Jul 2023 14:10:00 +1000 Subject: [PATCH 191/413] Arp rate now linear --- avr/cores/megacommand/MCL/ArpPage.cpp | 11 +++++------ avr/cores/megacommand/MCL/ArpSeqTrack.cpp | 1 - avr/cores/megacommand/MCL/ArpSeqTrack.h | 6 ++---- avr/cores/megacommand/MCL/MCL.h | 2 +- avr/cores/megacommand/MCL/SeqTrack.h | 10 ++++++++++ 5 files changed, 18 insertions(+), 12 deletions(-) diff --git a/avr/cores/megacommand/MCL/ArpPage.cpp b/avr/cores/megacommand/MCL/ArpPage.cpp index ee955a5a5..3f4beecc0 100644 --- a/avr/cores/megacommand/MCL/ArpPage.cpp +++ b/avr/cores/megacommand/MCL/ArpPage.cpp @@ -2,13 +2,13 @@ MCLEncoder arp_range(0, 4, ENCODER_RES_SEQ); MCLEncoder arp_mode(0, 17, ENCODER_RES_SEQ); -MCLEncoder arp_rate(0, 4, ENCODER_RES_SEQ); +MCLEncoder arp_rate(1, 16, ENCODER_RES_SEQ); MCLEncoder arp_enabled(0, 2, ENCODER_RES_SEQ); -void ArpPage::setup() {} +void ArpPage::setup() { +} void ArpPage::init() { - DEBUG_PRINT_FN(); oled_display.setFont(); seq_ptc_page.display(); @@ -28,7 +28,7 @@ void ArpPage::track_update(uint8_t n, bool re_render) { arp_track = &mcl_seq.ext_arp_tracks[n]; } - arp_rate.cur = arp_track->rate; + arp_rate.cur = arp_track->length; arp_rate.old = arp_rate.cur; arp_range.cur = arp_track->range; @@ -74,8 +74,7 @@ void ArpPage::loop() { } if (encoders[2]->hasChanged()) { - arp_track->set_length(1 << arp_rate.cur); - arp_track->rate = arp_rate.cur; + arp_track->set_length(arp_rate.cur); } } diff --git a/avr/cores/megacommand/MCL/ArpSeqTrack.cpp b/avr/cores/megacommand/MCL/ArpSeqTrack.cpp index 117a17aef..66785637d 100644 --- a/avr/cores/megacommand/MCL/ArpSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ArpSeqTrack.cpp @@ -19,7 +19,6 @@ void ArpSeqTrack::set_length(uint8_t length_) { } } - void ArpSeqTrack::seq(MidiUartParent *uart_) { MidiUartParent *uart_old = uart; uart = uart_; diff --git a/avr/cores/megacommand/MCL/ArpSeqTrack.h b/avr/cores/megacommand/MCL/ArpSeqTrack.h index 02095d0c1..61ca64988 100644 --- a/avr/cores/megacommand/MCL/ArpSeqTrack.h +++ b/avr/cores/megacommand/MCL/ArpSeqTrack.h @@ -40,8 +40,7 @@ class ArpSeqData { uint8_t enabled : 4; uint8_t range : 4; uint8_t oct : 4; - uint8_t rate : 4; - uint8_t mode; + uint8_t mode : 4; uint8_t fine_tune; uint64_t note_mask[2]; //input notes @@ -68,8 +67,7 @@ class ArpSeqTrack : public ArpSeqData, public SeqTrackBase { void init() { speed = SEQ_SPEED_2X; - rate = 1; - length = 1 << rate; //Arp rate is function of length + length = 1; enabled = false; range = 0; oct = 1; diff --git a/avr/cores/megacommand/MCL/MCL.h b/avr/cores/megacommand/MCL/MCL.h index 26d9be6b1..211e967f2 100644 --- a/avr/cores/megacommand/MCL/MCL.h +++ b/avr/cores/megacommand/MCL/MCL.h @@ -17,7 +17,7 @@ #include "Fonts/TomThumb.h" #define VERSION 4050 -#define VERSION_STR "BB4.50" +#define VERSION_STR "CC4.50" #define CALLBACK_TIMEOUT 500 #define GUI_NAME_TIMEOUT 800 diff --git a/avr/cores/megacommand/MCL/SeqTrack.h b/avr/cores/megacommand/MCL/SeqTrack.h index 8f7c0f8cd..3f521737d 100644 --- a/avr/cores/megacommand/MCL/SeqTrack.h +++ b/avr/cores/megacommand/MCL/SeqTrack.h @@ -20,6 +20,7 @@ #define SEQ_SPEED_1_2X 4 #define SEQ_SPEED_1_4X 5 #define SEQ_SPEED_1_8X 6 +#define SEQ_SPEED_4X 7 #define MASK_PATTERN 0 #define MASK_LOCK 1 @@ -122,6 +123,9 @@ class SeqTrackBase { case SEQ_SPEED_2X: timing_mid = 6; break; + case SEQ_SPEED_4X: + timing_mid = 3; + break; case SEQ_SPEED_3_4X: timing_mid = 16; // 12 * (4.0/3.0); break; @@ -153,6 +157,9 @@ class SeqTrackBase { case SEQ_SPEED_2X: timing_mid = 6; break; + case SEQ_SPEED_4X: + timing_mid = 3; + break; case SEQ_SPEED_3_4X: timing_mid = 16; // 12 * (4.0/3.0); break; @@ -184,6 +191,9 @@ class SeqTrackBase { case SEQ_SPEED_2X: multi = 0.5; break; + case SEQ_SPEED_4X: + multi = 0.25; + break; case SEQ_SPEED_3_4X: multi = (4.0 / 3.0); break; From b91c6fdd2e8e13253998c2003e1f5c3e9b7b7a7a Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 6 Jul 2023 14:44:26 +1000 Subject: [PATCH 192/413] Fix ext arp leaving notes on --- avr/cores/megacommand/MCL/ArpSeqTrack.cpp | 17 ++++++++++++----- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 1 + avr/cores/megacommand/MCL/SeqPtcPage.cpp | 6 ++++++ avr/cores/megacommand/MCL/SeqPtcPage.h | 2 ++ avr/cores/megacommand/MCL/SeqStepPage.cpp | 1 + 5 files changed, 22 insertions(+), 5 deletions(-) diff --git a/avr/cores/megacommand/MCL/ArpSeqTrack.cpp b/avr/cores/megacommand/MCL/ArpSeqTrack.cpp index 66785637d..ddd1f0227 100644 --- a/avr/cores/megacommand/MCL/ArpSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ArpSeqTrack.cpp @@ -38,13 +38,14 @@ void ArpSeqTrack::seq(MidiUartParent *uart_) { if (mod12_counter == 0 && enabled && mute_state == SEQ_MUTE_OFF) { if (step_count == 0) { if (len > 0) { + uint8_t note = notes[idx] + oct * 12; switch (active) { case MD_ARP_TRACK_TYPE: - seq_ptc_page.trig_md(notes[idx] + oct * 12, track_number, fine_tune, uart); + seq_ptc_page.trig_md(note, track_number, fine_tune, uart); break; case EXT_ARP_TRACK_TYPE: - seq_ptc_page.note_on_ext(notes[idx] + oct * 12, 127, track_number, uart); - last_note_on = notes[idx] + oct * 12; + seq_ptc_page.note_on_ext(note, 127, track_number, uart); + last_note_on = note; break; } idx++; @@ -71,6 +72,8 @@ uint8_t ArpSeqTrack::get_next_note_up(int8_t cur) { void ArpSeqTrack::render(uint8_t mode_, uint8_t oct_, uint8_t fine_tune_, uint8_t range_, uint64_t *note_mask_) { DEBUG_PRINT_FN(); + uint8_t mute_state_old = mute_state; + mute_state = SEQ_MUTE_ON; fine_tune = fine_tune_; range = range_; @@ -81,9 +84,13 @@ void ArpSeqTrack::render(uint8_t mode_, uint8_t oct_, uint8_t fine_tune_, uint8_ if (!enabled) { return; } + switch (active) { + case EXT_ARP_TRACK_TYPE: + seq_ptc_page.buffer_notesoff_ext(track_number); + break; + } memcpy(note_mask, note_mask_, sizeof(note_mask)); - uint8_t num_of_notes = 0; uint8_t note = 0; uint8_t b = 0; @@ -276,7 +283,7 @@ void ArpSeqTrack::render(uint8_t mode_, uint8_t oct_, uint8_t fine_tune_, uint8_ if (idx >= len) { idx = len - 1; } - + mute_state = mute_state_old; } diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index f9164c31a..92443eb0b 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -30,6 +30,7 @@ void SeqExtStepPage::config() { } void SeqExtStepPage::config_encoders() { #ifdef EXT_TRACKS + if (show_seq_menu) { return; } SeqPage::config_encoders(); seq_extparam1.max = 127; seq_extparam2.max = 127; diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.cpp b/avr/cores/megacommand/MCL/SeqPtcPage.cpp index b926eafe1..3b4df695b 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPtcPage.cpp @@ -52,6 +52,7 @@ void SeqPtcPage::cleanup() { params_reset(); } void SeqPtcPage::config_encoders() { + if (show_seq_menu) { return; } SeqPage::config_encoders(); ptc_param_len.min = 1; bool show_chan = true; @@ -452,6 +453,7 @@ void SeqPtcPage::note_on_ext(uint8_t note_num, uint8_t velocity, mcl_seq.ext_tracks[track_number].record_track_noteon(note_num, velocity); //} } + void SeqPtcPage::note_off_ext(uint8_t note_num, uint8_t velocity, uint8_t track_number, MidiUartParent *uart_) { if (track_number == 255) { @@ -464,6 +466,10 @@ void SeqPtcPage::note_off_ext(uint8_t note_num, uint8_t velocity, //} } +void SeqPtcPage::buffer_notesoff_ext(uint8_t track_number) { + mcl_seq.ext_tracks[track_number].buffer_notesoff(); +} + void SeqPtcPage::recalc_notemask() { memset(note_mask, 0, sizeof(note_mask)); diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.h b/avr/cores/megacommand/MCL/SeqPtcPage.h index 95f9a784c..5ce462a39 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.h +++ b/avr/cores/megacommand/MCL/SeqPtcPage.h @@ -81,6 +81,8 @@ class SeqPtcPage : public SeqPage, public ClockCallback { uint8_t track_number = 255, MidiUartParent *uart_ = nullptr); + void buffer_notesoff_ext(uint8_t track_number); + void clear_trig_fromext(uint8_t note_num); uint8_t get_note_from_machine_pitch(uint8_t pitch); diff --git a/avr/cores/megacommand/MCL/SeqStepPage.cpp b/avr/cores/megacommand/MCL/SeqStepPage.cpp index 5fc753f8b..c62805024 100644 --- a/avr/cores/megacommand/MCL/SeqStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqStepPage.cpp @@ -36,6 +36,7 @@ void SeqStepPage::config() { } void SeqStepPage::config_encoders() { + if (show_seq_menu || show_step_menu) { return; } SeqPage::config_encoders(); uint8_t timing_mid = mcl_seq.md_tracks[last_md_track].get_timing_mid(); seq_param3.cur = mcl_seq.md_tracks[last_md_track].length; From 0cb0bbcbdb07fe179a997795f387333c07f3c54e Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 6 Jul 2023 15:21:18 +1000 Subject: [PATCH 193/413] menu position reset, only when changing page --- avr/cores/megacommand/MCL/SeqPage.cpp | 10 ++++++++-- avr/cores/megacommand/MCL/SeqPage.h | 2 ++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index ebb884602..a640d7bf8 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -8,6 +8,8 @@ MidiDevice *SeqPage::midi_device = &MD; uint8_t SeqPage::last_param_id = 0; uint8_t SeqPage::last_rec_event = 0; +uint8_t SeqPage::last_seq_page = 0; + uint8_t SeqPage::page_count = 4; uint8_t SeqPage::pianoroll_mode = 0; @@ -97,8 +99,6 @@ void SeqPage::disable_record() { } void SeqPage::config_encoders() { - seq_menu_entry_encoder.cur = 0; - seq_menu_page.cur_row = 0; } void SeqPage::init() { @@ -140,6 +140,7 @@ void SeqPage::init() { R.use_machine_names_short(); R.use_machine_param_names(); MidiUartParent::handle_midi_lock = _midi_lock_tmp; + } void SeqPage::cleanup() { @@ -383,6 +384,11 @@ bool SeqPage::handleEvent(gui_event_t *event) { show_seq_menu = true; // capture current page. opt_seqpage_capture = this; + if (mcl.currentPage() != last_seq_page) { + seq_menu_entry_encoder.cur = 0; + seq_menu_page.cur_row = 0; + last_seq_page = mcl.currentPage(); + } if (midi_device == &MD) { auto &active_track = mcl_seq.md_tracks[last_md_track]; diff --git a/avr/cores/megacommand/MCL/SeqPage.h b/avr/cores/megacommand/MCL/SeqPage.h index db7e94b3e..150f10d93 100644 --- a/avr/cores/megacommand/MCL/SeqPage.h +++ b/avr/cores/megacommand/MCL/SeqPage.h @@ -100,6 +100,8 @@ class SeqPage : public LightPage { static uint8_t last_step; static uint32_t last_md_model; + static uint8_t last_seq_page; + static bool recording; static uint16_t mute_mask; From 3eafced6832208520209c46159b0c1066a59aa2c Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 6 Jul 2023 15:39:15 +1000 Subject: [PATCH 194/413] change page ordering again --- avr/cores/megacommand/ResourceManager.cpp | 6 +- .../megacommand/resources/R_page_entries.cpp | 110 +++++++++--------- resource/page_entries.cpp | 6 +- 3 files changed, 62 insertions(+), 60 deletions(-) diff --git a/avr/cores/megacommand/ResourceManager.cpp b/avr/cores/megacommand/ResourceManager.cpp index e6f3ad974..d60a5bc67 100644 --- a/avr/cores/megacommand/ResourceManager.cpp +++ b/avr/cores/megacommand/ResourceManager.cpp @@ -52,9 +52,9 @@ void ResourceManager::restore_page_entry_deps() { R.page_entries->Entries[4].IconData = R.icons_page->icon_step; - R.page_entries->Entries[5].IconData = R.icons_page->icon_pianoroll; - R.page_entries->Entries[6].IconData = R.icons_page->icon_chroma; - R.page_entries->Entries[7].IconData = R.icons_page->icon_lfo; + R.page_entries->Entries[5].IconData = R.icons_page->icon_lfo; + R.page_entries->Entries[6].IconData = R.icons_page->icon_pianoroll; + R.page_entries->Entries[7].IconData = R.icons_page->icon_chroma; uint8_t idx = 8; diff --git a/avr/cores/megacommand/resources/R_page_entries.cpp b/avr/cores/megacommand/resources/R_page_entries.cpp index 487b675d8..36fbf09ea 100644 --- a/avr/cores/megacommand/resources/R_page_entries.cpp +++ b/avr/cores/megacommand/resources/R_page_entries.cpp @@ -72,81 +72,82 @@ const unsigned char __R_page_entries[] PROGMEM = { 0, 4, 1, - 221, + 219, 24, 21, - 71, + 7, + 76, + 216, + 70, + 79, + 115, + 79, + 22, + 0, + 5, + 109, + 23, + 24, + 223, + 95, 73, - 246, 65, 78, 79, 32, - 53, - 236, + 110, + 77, 76, 76, + 207, 23, - 249, 8, 0, - 5, - 109, + 150, + 6, 25, + 221, 7, - 219, 67, 72, + 191, 19, 77, - 246, 65, 84, 73, 67, + 96, 47, - 15, + 218, 9, - 0, - 6, - 99, - 23, - 76, - 216, - 70, - 79, - 163, - 77, - 22, - 173, 73, + 199, 23, - 187, - 24, - 95, + 83, 65, + 253, 77, - 251, 80, 76, 69, 32, 77, - 77, - 119, + 187, + 53, 65, 71, 176, - 219, + 237, 12, - 73, + 49, + 191, 2, - 127, - 47, + 23, 87, 65, + 255, 86, - 254, 32, 68, 69, @@ -154,65 +155,66 @@ const unsigned char __R_page_entries[] PROGMEM = { 73, 71, 78, - 206, + 103, 198, 18, - 214, - 73, + 107, + 49, 23, - 218, + 109, 19, 7, - 222, + 111, 19, 76, 65, 89, - 192, - 71, - 109, + 96, + 119, + 54, 16, 49, - 191, + 223, 3, 47, 82, + 219, 69, - 182, 86, 40, 66, - 203, + 101, 23, - 228, + 242, 17, 0, 13, - 219, + 109, 95, + 216, 45, - 176, 49, 47, - 30, + 15, 23, 0, 14, - 201, + 100, 23, - 132, + 194, 50, 51, - 15, + 7, 0, + 177, 15, - 98, 23, 0, 0, 0, 0, 0, - 9, + 4, + 255, 255, }; diff --git a/resource/page_entries.cpp b/resource/page_entries.cpp index 45227f32a..f504d3fdb 100644 --- a/resource/page_entries.cpp +++ b/resource/page_entries.cpp @@ -8,9 +8,9 @@ PageSelectEntry Entries[] = { {"ROUTE", ROUTE_PAGE, 3, 0, 24, 14, nullptr}, {"STEP EDIT", SEQ_STEP_PAGE, 4, 1, 24, 21, nullptr}, - {"PIANO ROLL", SEQ_EXTSTEP_PAGE, 5, 1, 24, 25, nullptr}, - {"CHROMATIC", SEQ_PTC_PAGE, 6, 1, 24, 25, nullptr}, - {"LFO", LFO_PAGE, 7, 1, 24, 24, nullptr}, + {"LFO", LFO_PAGE, 5, 1, 24, 24, nullptr}, + {"PIANO ROLL", SEQ_EXTSTEP_PAGE, 6, 1, 24, 25, nullptr}, + {"CHROMATIC", SEQ_PTC_PAGE, 7, 1, 24, 25, nullptr}, #ifdef SOUND_PAGE {"SAMPLE MANAGER", SAMPLE_BROWSER, 8, 2, 24, 25, nullptr}, #endif From ab21dd13a90abb3a695f578a3991f52bfff73d96 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 6 Jul 2023 16:16:08 +1000 Subject: [PATCH 195/413] encoder timeouts --- avr/cores/megacommand/MCL/MCLGUI.cpp | 2 +- avr/cores/megacommand/MCL/MixerPage.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCLGUI.cpp b/avr/cores/megacommand/MCL/MCLGUI.cpp index dbea1976d..c9ef92dbc 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.cpp +++ b/avr/cores/megacommand/MCL/MCLGUI.cpp @@ -341,7 +341,7 @@ bool MCLGUI::show_encoder_value(Encoder *encoder, int timeout) { if (match != 255) { if (clock_diff(((LightPage *)GUI.currentPage())->encoders_used_clock[match], - slowclock) < timeout) { + slowclock) < timeout || BUTTON_DOWN(Buttons.ENCODER1 + match)) { return true; } else { ((LightPage *)GUI.currentPage())->encoders_used_clock[match] = diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 65ac8806c..358da51bd 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -98,7 +98,7 @@ void MixerPage::loop() { } else { draw_encoders = false; - constexpr int timeout = 800; + constexpr int timeout = 1000; for (uint8_t n = 0; n < 4; n++) { if (note_interface.notes_on) { encoders_used_clock[n] = slowclock + timeout + 1; } if (mcl_gui.show_encoder_value(encoders[n],timeout)) { draw_encoders = true; } From 03ed20b301040f7c86f65dc8462e35213f6a92ce Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 6 Jul 2023 16:35:04 +1000 Subject: [PATCH 196/413] Mixer Page space optim, place midi routines in MCLSeq --- .../Adafruit-GFX-Library/Adafruit_GFX.cpp | 8 +++++++ .../Adafruit-GFX-Library/Adafruit_GFX.h | 4 ++-- avr/cores/megacommand/MCL/MCLSeq.cpp | 14 +++++++++---- avr/cores/megacommand/MCL/MixerPage.cpp | 21 ++++++++++++------- avr/cores/megacommand/MCL/MixerPage.h | 8 +++++-- avr/cores/megacommand/MCL/PageSelectPage.cpp | 9 ++++---- 6 files changed, 43 insertions(+), 21 deletions(-) diff --git a/avr/cores/megacommand/Adafruit-GFX-Library/Adafruit_GFX.cpp b/avr/cores/megacommand/Adafruit-GFX-Library/Adafruit_GFX.cpp index 219bf665c..e68cee7eb 100755 --- a/avr/cores/megacommand/Adafruit-GFX-Library/Adafruit_GFX.cpp +++ b/avr/cores/megacommand/Adafruit-GFX-Library/Adafruit_GFX.cpp @@ -963,6 +963,14 @@ void Adafruit_GFX::setRotation(uint8_t x) { } } +void Adafruit_GFX::draw_textbox(const char *text1, const char *text2) { + char str1[16]; + char str2[16]; + strcpy_P(str1, text1); + strcpy_P(str1, text2); + draw_textbox(str1, str2); +} + void Adafruit_GFX::draw_textbox(char *text, char *text2) { auto oldfont = getFont(); setFont(); diff --git a/avr/cores/megacommand/Adafruit-GFX-Library/Adafruit_GFX.h b/avr/cores/megacommand/Adafruit-GFX-Library/Adafruit_GFX.h index 6c8522370..1ff003ed5 100755 --- a/avr/cores/megacommand/Adafruit-GFX-Library/Adafruit_GFX.h +++ b/avr/cores/megacommand/Adafruit-GFX-Library/Adafruit_GFX.h @@ -34,8 +34,8 @@ class Adafruit_GFX : public Print { // optimized code. Otherwise 'generic' versions are used. virtual void setRotation(uint8_t r); virtual void invertDisplay(boolean i); - virtual void draw_textbox(char *text, char *text2); - + void draw_textbox(char *text, char *text2); + void draw_textbox(const char *text1, const char *text2); // BASIC DRAW API // These MAY be overridden by the subclass to provide device-specific // optimized code. Otherwise 'generic' versions are used. diff --git a/avr/cores/megacommand/MCL/MCLSeq.cpp b/avr/cores/megacommand/MCL/MCLSeq.cpp index ea378d28e..5f14df47b 100644 --- a/avr/cores/megacommand/MCL/MCLSeq.cpp +++ b/avr/cores/megacommand/MCL/MCLSeq.cpp @@ -309,7 +309,9 @@ void MCLSeq::seq() { } } -void MCLSeqMidiEvents::onNoteOnCallback_Midi(uint8_t *msg) {} +void MCLSeqMidiEvents::onNoteOnCallback_Midi(uint8_t *msg) { + mixer_page.onNoteOnCallback_Midi(msg); +} void MCLSeqMidiEvents::onNoteOffCallback_Midi(uint8_t *msg) {} @@ -323,6 +325,8 @@ void MCLSeqMidiEvents::onControlChangeCallback_Midi(uint8_t *msg) { MD.parseCC(channel, param, &track, &track_param); if (track > 15) { return; } + if (mcl.currentPage() == MIXER_PAGE) { mixer_page.onControlChangeCallback_Midi(track, track_param, value); } + if (track_param == 32) { // Mute mcl_seq.md_tracks[track].mute_state = value > 0; if (value > 0) { CLEAR_BIT16(mixer_page.mute_sets[0][mixer_page.current_mute_set], track); } @@ -375,10 +379,11 @@ void MCLSeqMidiEvents::setup_callbacks() { if (state) { return; } - /* + Midi.addOnNoteOnCallback( this, (midi_callback_ptr_t)&MCLSeqMidiEvents::onNoteOnCallback_Midi); -` Midi.addOnNoteOffCallback( + /* + Midi.addOnNoteOffCallback( this, (midi_callback_ptr_t)&MCLSeqMidiEvents::onNoteOffCallback_Midi); */ update_params = true; @@ -398,9 +403,10 @@ void MCLSeqMidiEvents::remove_callbacks() { if (!state) { return; } - /* + Midi.removeOnNoteOnCallback( this, (midi_callback_ptr_t)&MCLSeqMidiEvents::onNoteOnCallback_Midi); + /* Midi.removeOnNoteOffCallback( this, (midi_callback_ptr_t)&MCLSeqMidiEvents::onNoteOffCallback_Midi); */ diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 358da51bd..76507da75 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -63,7 +63,6 @@ void MixerPage::init() { MD.set_trigleds(0, TRIGLED_OVERLAY); preview_mute_set = 255; bool switch_tracks = false; - midi_events.setup_callbacks(); oled_display.clearDisplay(); oled_draw_mutes(); set_display_mode(MODEL_LEVEL); @@ -81,7 +80,6 @@ void MixerPage::cleanup() { oled_display.clearDisplay(); MD.set_key_repeat(1); trig_interface.off(); - midi_events.remove_callbacks(); } void MixerPage::set_level(int curtrack, int value) { @@ -165,6 +163,7 @@ void send_fx(uint8_t param, EncoderParent *enc, uint8_t type) { oled_display.textbox(str, str2); } +/* void encoder_filtf_handle(EncoderParent *enc) { mixer_page.adjust_param(enc, MODEL_FLTF); } @@ -180,6 +179,7 @@ void encoder_filtq_handle(EncoderParent *enc) { void encoder_lastparam_handle(EncoderParent *enc) { mixer_page.adjust_param(enc, MD.midi_events.last_md_param); } +*/ void MixerPage::adjust_param(EncoderParent *enc, uint8_t param) { @@ -636,14 +636,15 @@ bool MixerPage::handleEvent(gui_event_t *event) { return false; } +/* void MixerMidiEvents::setup_callbacks() { if (state) { return; } Midi.addOnNoteOnCallback( this, (midi_callback_ptr_t)&MixerMidiEvents::onNoteOnCallback_Midi); - Midi.addOnNoteOffCallback( - this, (midi_callback_ptr_t)&MixerMidiEvents::onNoteOffCallback_Midi); + //Midi.addOnNoteOffCallback( + // this, (midi_callback_ptr_t)&MixerMidiEvents::onNoteOffCallback_Midi); Midi.addOnControlChangeCallback( this, (midi_callback_ptr_t)&MixerMidiEvents::onControlChangeCallback_Midi); @@ -669,7 +670,7 @@ void MixerMidiEvents::remove_callbacks() { } void MixerMidiEvents::onControlChangeCallback_Midi(uint8_t *msg) { - uint8_t channel = MIDI_VOICE_CHANNEL(msg[0]); +uint8_t channel = MIDI_VOICE_CHANNEL(msg[0]); uint8_t param = msg[1]; uint8_t value = msg[2]; uint8_t track; @@ -679,6 +680,10 @@ void MixerMidiEvents::onControlChangeCallback_Midi(uint8_t *msg) { if (track > 15) { return; } +} +*/ + +void MixerPage::onControlChangeCallback_Midi(uint8_t track, uint8_t track_param, uint8_t value) { if (track_param == 32) { return; } // don't process mute @@ -698,7 +703,7 @@ void MixerMidiEvents::onControlChangeCallback_Midi(uint8_t *msg) { mixer_page.set_display_mode(track_param); } -uint8_t MixerMidiEvents::note_to_trig(uint8_t note_num) { +uint8_t MixerPage::note_to_trig(uint8_t note_num) { uint8_t trig_num = 0; for (uint8_t i = 0; i < sizeof(MD.global.drumMapping); i++) { if (note_num == MD.global.drumMapping[i]) { @@ -707,7 +712,8 @@ uint8_t MixerMidiEvents::note_to_trig(uint8_t note_num) { } return trig_num; } -void MixerMidiEvents::onNoteOnCallback_Midi(uint8_t *msg) { + +void MixerPage::onNoteOnCallback_Midi(uint8_t *msg) { uint8_t note_num = msg[1]; uint8_t channel = MIDI_VOICE_CHANNEL(msg[0]); @@ -716,4 +722,3 @@ void MixerMidiEvents::onNoteOnCallback_Midi(uint8_t *msg) { mixer_page.disp_levels[n] = MD.kit.levels[n]; } } -void MixerMidiEvents::onNoteOffCallback_Midi(uint8_t *msg) {} diff --git a/avr/cores/megacommand/MCL/MixerPage.h b/avr/cores/megacommand/MCL/MixerPage.h index 03349e339..bfc97f8f6 100644 --- a/avr/cores/megacommand/MCL/MixerPage.h +++ b/avr/cores/megacommand/MCL/MixerPage.h @@ -13,7 +13,6 @@ class MixerMidiEvents : public MidiCallback { void setup_callbacks(); void remove_callbacks(); - uint8_t note_to_trig(uint8_t note_num); void onNoteOnCallback_Midi(uint8_t *msg); void onNoteOffCallback_Midi(uint8_t *msg); void onControlChangeCallback_Midi(uint8_t *msg); @@ -27,7 +26,6 @@ void encoder_lastparam_handle(EncoderParent *enc); class MixerPage : public LightPage { public: - MixerMidiEvents midi_events; uint8_t level_pressmode = 0; int8_t disp_levels[16]; @@ -65,6 +63,12 @@ class MixerPage : public LightPage { void switch_mute_set(uint8_t state); void populate_mute_set(); + //Handled in MCLSeq + void onNoteOnCallback_Midi(uint8_t *msg); + void onControlChangeCallback_Midi(uint8_t track, uint8_t track_param, uint8_t value); + + uint8_t note_to_trig(uint8_t note_num); + virtual bool handleEvent(gui_event_t *event); virtual void display(); virtual void loop(); diff --git a/avr/cores/megacommand/MCL/PageSelectPage.cpp b/avr/cores/megacommand/MCL/PageSelectPage.cpp index 1e22c2f17..9440eed28 100644 --- a/avr/cores/megacommand/MCL/PageSelectPage.cpp +++ b/avr/cores/megacommand/MCL/PageSelectPage.cpp @@ -228,11 +228,6 @@ void PageSelectPage::display() { oled_display.print(F("PAGE SELECT")); oled_display.setTextColor(WHITE); uint8_t label_pos[4] = {30, 57, 81, 104}; - for (uint8_t i = 0; i < 4; ++i) { - get_category_name_by_idx(i, str); - oled_display.setCursor(label_pos[i], 31); - oled_display.print(str); - } pageidx = get_pageidx(page_select); get_page_icon(pageidx, icon, iconw, iconh); get_page(pageidx, str); @@ -250,6 +245,10 @@ void PageSelectPage::display() { uint8_t group_x = 28; uint8_t pagenr = 0; for (uint8_t i = 0; i < 4; ++i) { + get_category_name_by_idx(i, str); + oled_display.setCursor(label_pos[i], 31); + oled_display.print(str); + uint8_t trig_x = group_x + 2; if (i == catidx) { oled_display.fillRect(group_x, 18, 23, 6, WHITE); From 92488cd48c8b99ed4d9646bec3f018b966630ec5 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 6 Jul 2023 16:48:48 +1000 Subject: [PATCH 197/413] MidiEvents optim --- avr/cores/megacommand/MCL/MCLSeq.cpp | 10 +++++++--- avr/cores/megacommand/MCL/MixerPage.cpp | 3 +-- avr/cores/megacommand/MCL/PageSelectPage.cpp | 9 +++++---- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCLSeq.cpp b/avr/cores/megacommand/MCL/MCLSeq.cpp index 5f14df47b..4f9cf8808 100644 --- a/avr/cores/megacommand/MCL/MCLSeq.cpp +++ b/avr/cores/megacommand/MCL/MCLSeq.cpp @@ -46,8 +46,8 @@ void MCLSeq::setup() { MidiClock.addOnMidiStopCallback( this, (midi_clock_callback_ptr_t)&MCLSeq::onMidiStopCallback); - MidiClock.addOnMidiStartCallback( - this, (midi_clock_callback_ptr_t)&MCLSeq::onMidiStartCallback); +// MidiClock.addOnMidiStartCallback( +// this, (midi_clock_callback_ptr_t)&MCLSeq::onMidiStartCallback); MidiClock.addOnMidiStartImmediateCallback( this, (midi_clock_callback_ptr_t)&MCLSeq::onMidiStartImmediateCallback); @@ -161,9 +161,13 @@ void MCLSeq::onMidiStartImmediateCallback() { seq_rec_play(); MidiUartParent::handle_midi_lock = _midi_lock_tmp; + if (SeqPage::recording) { + oled_display.textbox("REC", ""); + } } -void MCLSeq::onMidiStartCallback() {} +void MCLSeq::onMidiStartCallback() { +} void MCLSeq::onMidiStopCallback() { #ifdef EXT_TRACKS diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 76507da75..eb7085f6e 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -79,6 +79,7 @@ void MixerPage::cleanup() { // md_exploit.off(); oled_display.clearDisplay(); MD.set_key_repeat(1); + disable_record_mutes(); trig_interface.off(); } @@ -615,8 +616,6 @@ bool MixerPage::handleEvent(gui_event_t *event) { } if (EVENT_PRESSED(event, Buttons.BUTTON2)) { - trig_interface.on(); - disable_record_mutes(); mcl.setPage(PAGE_SELECT_PAGE); return true; } diff --git a/avr/cores/megacommand/MCL/PageSelectPage.cpp b/avr/cores/megacommand/MCL/PageSelectPage.cpp index 9440eed28..1e22c2f17 100644 --- a/avr/cores/megacommand/MCL/PageSelectPage.cpp +++ b/avr/cores/megacommand/MCL/PageSelectPage.cpp @@ -228,6 +228,11 @@ void PageSelectPage::display() { oled_display.print(F("PAGE SELECT")); oled_display.setTextColor(WHITE); uint8_t label_pos[4] = {30, 57, 81, 104}; + for (uint8_t i = 0; i < 4; ++i) { + get_category_name_by_idx(i, str); + oled_display.setCursor(label_pos[i], 31); + oled_display.print(str); + } pageidx = get_pageidx(page_select); get_page_icon(pageidx, icon, iconw, iconh); get_page(pageidx, str); @@ -245,10 +250,6 @@ void PageSelectPage::display() { uint8_t group_x = 28; uint8_t pagenr = 0; for (uint8_t i = 0; i < 4; ++i) { - get_category_name_by_idx(i, str); - oled_display.setCursor(label_pos[i], 31); - oled_display.print(str); - uint8_t trig_x = group_x + 2; if (i == catidx) { oled_display.fillRect(group_x, 18, 23, 6, WHITE); From 98252af98bf76069dd79d035d5571b791fc5b166 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 6 Jul 2023 17:06:28 +1000 Subject: [PATCH 198/413] gfx optim --- avr/cores/megacommand/MCL/MCLGUI.cpp | 3 ++- avr/cores/megacommand/MCL/MCLGfx.cpp | 3 --- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCLGUI.cpp b/avr/cores/megacommand/MCL/MCLGUI.cpp index c9ef92dbc..73d64f89f 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.cpp +++ b/avr/cores/megacommand/MCL/MCLGUI.cpp @@ -252,7 +252,8 @@ void MCLGUI::draw_infobox(const char *line1, const char *line2, oled_display.fillRect(dlg_info_x1 + 1, dlg_info_y1 + 1, dlg_info_w - 2, 6, WHITE); - oled_display.fillCircle(dlg_circle_x, dlg_circle_y, 6, WHITE); + oled_display.fillRect(dlg_circle_x - 4, dlg_circle_y - 4, 9, 9, WHITE); + oled_display.fillRect(dlg_circle_x - 1, dlg_circle_y - 3, 3, 4, BLACK); oled_display.fillRect(dlg_circle_x - 1, dlg_circle_y + 2, 3, 2, BLACK); diff --git a/avr/cores/megacommand/MCL/MCLGfx.cpp b/avr/cores/megacommand/MCL/MCLGfx.cpp index ef84b58c7..2ba362336 100644 --- a/avr/cores/megacommand/MCL/MCLGfx.cpp +++ b/avr/cores/megacommand/MCL/MCLGfx.cpp @@ -37,9 +37,6 @@ void MCLGfx::draw_evil(unsigned char* evil) { void MCLGfx::splashscreen(unsigned char* bitmap) { oled_display.setFont(); - oled_display.setTextSize(2); - oled_display.setTextColor(WHITE, BLACK); - oled_display.setCursor(40, 0); oled_display.drawBitmap(35, 8, bitmap, BITMAP_MCL_LOGO_W, BITMAP_MCL_LOGO_H, WHITE); From fe0660d6347b01dd35e454cb2b27ec24bf512b22 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 6 Jul 2023 21:39:30 +1000 Subject: [PATCH 199/413] Make program change 1 shot --- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index fda40c536..52025a211 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -994,8 +994,11 @@ bool ExtSeqTrack::set_track_locks(uint8_t step, uint8_t utiming, DEBUG_DUMP(F("adding lock")); DEBUG_DUMP(lock_idx); + + constexpr uint8_t oneshot = 14; + e->is_lock = true; - e->cond_id = 0; + e->cond_id = track_param == PARAM_PRG ? oneshot : 0; e->lock_idx = lock_idx; e->event_value = value; e->event_on = event_on; From 88d012197ea251aed79b4d462cc0748bd2591b49 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 6 Jul 2023 21:49:03 +1000 Subject: [PATCH 200/413] REC QUANT -> QUANT --- .../megacommand/resources/R_menu_layouts.cpp | 479 +++++++++--------- resource/menu_layouts.cpp | 2 +- 2 files changed, 239 insertions(+), 242 deletions(-) diff --git a/avr/cores/megacommand/resources/R_menu_layouts.cpp b/avr/cores/megacommand/resources/R_menu_layouts.cpp index 46799111e..9ac5723b7 100644 --- a/avr/cores/megacommand/resources/R_menu_layouts.cpp +++ b/avr/cores/megacommand/resources/R_menu_layouts.cpp @@ -460,614 +460,611 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 147, 44, 11, - 107, + 110, 2, - 41, - 125, - 67, - 32, 81, 85, - 173, - 171, - 66, - 8, + 216, + 167, + 84, + 64, 58, - 51, + 230, 42, - 118, + 237, 83, 79, 85, 252, - 164, + 72, 83, - 38, + 77, 39, - 223, + 190, 2, 14, 0, 70, 73, - 104, + 209, 149, - 193, + 130, 57, - 109, - 48, + 219, + 52, 67, - 163, 220, + 70, 90, - 9, - 107, + 18, + 214, 2, 238, - 112, + 225, 87, 32, - 187, 178, + 118, 82, 46, 20, - 3, - 12, + 6, + 25, 238, - 214, + 173, 51, 180, - 178, + 100, 41, - 17, - 149, + 35, 153, - 186, + 43, + 117, 20, 79, - 234, + 212, 178, 87, - 86, + 173, 111, 44, - 176, + 97, 41, - 191, + 127, 67, 86, 32, 65, - 200, 76, + 144, 76, - 75, + 150, 216, - 90, + 181, 157, - 202, + 148, 20, - 93, + 186, 22, 89, - 13, + 26, 30, 77, - 123, + 246, 9, 133, - 66, + 133, 168, - 225, + 194, 76, 65, 233, - 13, - 214, + 178, 212, + 109, 13, 32, - 227, + 198, 23, 1, 176, - 89, + 178, 211, - 61, + 122, 83, 82, 67, - 50, + 100, 109, - 64, + 128, 110, - 99, + 199, 43, 132, - 154, + 53, 170, - 212, + 169, 63, - 132, 131, - 206, + 9, + 156, 44, - 24, + 40, 10, - 37, - 94, - 198, + 64, + 31, + 99, 1, 27, - 222, + 111, 45, 149, - 208, + 104, 19, - 204, + 102, 29, 191, - 38, + 19, 25, - 214, + 107, 4, 95, - 3, + 1, + 165, 73, - 74, 205, - 54, + 27, 117, 84, - 192, + 96, 32, - 225, + 112, 33, + 205, 31, - 155, 18, + 183, 77, - 111, 181, 73, 90, - 69, - 8, - 106, - 118, + 10, + 150, + 193, + 149, + 182, 8, 74, - 195, 16, + 30, 148, - 199, 32, + 56, 107, - 5, + 44, 91, - 132, 71, + 36, 148, - 150, + 177, 74, - 61, + 237, 32, 77, 73, - 161, 198, + 15, 106, - 252, 72, + 227, 82, 79, 32, - 123, 77, + 217, 53, - 63, + 251, 18, 2, 9, 255, - 107, 4, + 94, 53, - 216, + 194, 20, - 76, + 101, 46, - 180, + 165, 88, - 173, 110, + 107, 67, - 97, 20, - 55, + 9, + 186, 57, 41, - 90, 24, + 214, 172, - 208, 193, - 130, + 132, 83, - 255, + 23, 81, + 252, 32, 49, 32, 70, - 141, 87, + 106, 194, - 73, + 78, 101, - 219, 7, + 219, 32, 10, - 99, 20, + 25, 50, - 32, - 50, + 1, + 151, 51, - 251, 92, 85, + 216, 83, 66, 17, - 5, - 32, + 41, 143, - 219, + 6, 52, + 218, 20, 96, - 141, - 67, - 41, - 94, + 90, + 122, + 32, + 240, 187, - 18, + 151, 85, - 237, 11, + 110, 20, - 195, 86, 24, + 24, 118, - 13, + 106, 11, - 88, + 195, 79, - 116, + 166, 79, - 193, 239, + 15, 178, - 227, 58, + 25, 117, - 59, + 219, 5, 32, - 96, 7, - 69, + 2, 99, - 129, + 44, 20, - 204, + 14, 53, - 204, + 102, 41, - 51, + 97, 199, + 152, 116, - 14, + 112, 6, - 22, + 182, 65, 100, - 197, 41, - 129, + 44, 20, - 219, + 14, 54, + 219, 41, 100, - 109, 95, + 109, 80, - 182, 192, + 180, 71, 25, - 134, + 51, 215, - 115, 9, + 154, 223, - 64, - 150, + 4, 124, - 235, + 183, 128, + 91, 49, 32, - 111, 90, + 125, 20, - 177, 73, + 139, 242, - 96, 245, - 195, + 6, 47, + 25, 10, - 61, + 238, 20, - 204, 246, + 97, 21, - 62, + 247, 17, 2, 48, - 231, 20, + 56, 74, - 6, + 53, 148, - 172, 83, + 103, 154, - 252, 85, + 225, 82, 66, 79, - 43, 11, + 89, 224, - 47, + 123, 2, 255, - 107, 79, + 89, 20, - 57, + 201, 50, - 46, + 114, 3, - 73, - 13, + 72, + 107, 16, 58, - 96, 20, - 205, + 6, 55, + 104, 68, - 10, + 81, 106, - 57, + 205, 173, - 172, 42, + 100, 137, - 155, + 219, 4, 191, - 96, 84, - 197, + 6, 173, - 235, + 47, 98, + 89, 238, - 54, + 182, 41, - 216, 56, + 196, 191, - 132, + 38, 199, - 220, + 230, 0, - 196, 126, 33, 235, - 120, + 11, + 194, 34, 0, - 77, 62, - 132, + 108, 0, - 225, + 39, 36, 0, + 8, 179, - 22, + 182, 212, - 216, 71, + 192, 20, - 14, + 112, 37, 0, - 16, + 134, 8, - 216, + 192, 20, - 12, + 99, 35, - 100, 40, - 176, + 37, + 128, 20, - 27, + 222, 38, 4, - 220, + 230, 39, - 220, 138, + 225, 65, 71, - 53, 247, + 173, 76, - 181, 71, + 172, 75, - 150, 221, - 234, + 183, 170, + 82, 1, - 71, 44, + 61, 65, 85, - 177, 88, + 141, 32, - 179, 83, + 159, 42, - 236, 97, 103, 101, + 101, 35, - 184, + 195, 31, - 118, 204, + 178, 167, - 88, - 91, + 194, 171, + 218, 65, 100, - 93, + 232, 124, 74, - 10, + 81, 195, - 48, + 131, 210, - 105, 25, + 72, 236, - 22, + 176, 19, - 18, - 154, + 148, + 214, 2, 2, - 197, 234, - 133, + 44, 203, - 221, + 46, 26, + 232, 161, 65, - 26, + 214, 147, - 208, 131, - 42, + 129, 54, - 86, + 82, 52, + 176, 186, - 29, + 236, 27, - 128, 126, - 178, + 5, + 147, 41, - 105, 29, + 72, 192, - 13, - 129, + 108, 62, - 137, + 12, + 72, 216, - 22, + 176, 102, - 11, + 88, 137, - 8, - 55, + 65, + 186, 4, - 70, 66, + 53, 170, - 176, + 131, 15, - 112, 79, + 133, 83, - 176, 190, + 134, 80, - 195, 57, + 26, 56, - 82, + 146, 173, - 75, + 91, 129, - 120, 68, + 198, 70, 85, - 197, 75, - 32, + 41, 194, - 45, + 1, + 104, 171, - 30, + 245, 246, - 186, + 214, 59, 75, - 192, 20, - 98, + 3, 28, - 218, + 22, 78, + 214, 88, - 212, 147, - 144, + 164, 236, - 220, + 134, 29, + 224, 4, 0, 0, 0, 0, 0, - 9, + 79, 255, }; diff --git a/resource/menu_layouts.cpp b/resource/menu_layouts.cpp index 4e2db8a5a..039c20c62 100644 --- a/resource/menu_layouts.cpp +++ b/resource/menu_layouts.cpp @@ -210,7 +210,7 @@ menu_t seq_menu_layout = { {"SHIFT:", 0, 5, 5, 28, 255, 12, 35}, {"REVERSE:", 0, 3, 3, 29, 255, 13, 27}, {"POLYPHONY", 0, 0, 0, 0, POLY_PAGE, 0, 0}, - {"REC QUANT:", 0, 2, 2, 42, 255, 0, 25}, + {"QUANT:", 0, 2, 2, 42, 255, 0, 25}, {"SOUND", 0, 0, 0, 0, SOUND_BROWSER, 0, 0}, }, 14, 0 From 49cb0cb72d14f15075ba5da5939545e149660210 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 6 Jul 2023 21:49:17 +1000 Subject: [PATCH 201/413] A more elegant solution to out of bounds menu problem. --- avr/cores/megacommand/MCL/MenuPage.cpp | 3 +++ avr/cores/megacommand/MCL/SeqPage.cpp | 7 ------- avr/cores/megacommand/MCL/SeqPage.h | 2 -- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/avr/cores/megacommand/MCL/MenuPage.cpp b/avr/cores/megacommand/MCL/MenuPage.cpp index 8ab88a81d..3ed03cb0e 100644 --- a/avr/cores/megacommand/MCL/MenuPage.cpp +++ b/avr/cores/megacommand/MCL/MenuPage.cpp @@ -12,9 +12,12 @@ void MenuPageBase::init() { R.restore_menu_layout_deps(); ((MCLEncoder *)encoders[1])->max = get_menu()->get_number_of_items() - 1; + if (((MCLEncoder *)encoders[1])->cur > ((MCLEncoder *)encoders[1])->max) { ((MCLEncoder *)encoders[1])->cur = 0; + cur_row = 0; } + ((MCLEncoder *)encoders[0])->max = get_menu()->get_option_range(encoders[1]->cur) - 1; ((MCLEncoder *)encoders[0])->min = diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index a640d7bf8..4c385357f 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -8,8 +8,6 @@ MidiDevice *SeqPage::midi_device = &MD; uint8_t SeqPage::last_param_id = 0; uint8_t SeqPage::last_rec_event = 0; -uint8_t SeqPage::last_seq_page = 0; - uint8_t SeqPage::page_count = 4; uint8_t SeqPage::pianoroll_mode = 0; @@ -384,11 +382,6 @@ bool SeqPage::handleEvent(gui_event_t *event) { show_seq_menu = true; // capture current page. opt_seqpage_capture = this; - if (mcl.currentPage() != last_seq_page) { - seq_menu_entry_encoder.cur = 0; - seq_menu_page.cur_row = 0; - last_seq_page = mcl.currentPage(); - } if (midi_device == &MD) { auto &active_track = mcl_seq.md_tracks[last_md_track]; diff --git a/avr/cores/megacommand/MCL/SeqPage.h b/avr/cores/megacommand/MCL/SeqPage.h index 150f10d93..db7e94b3e 100644 --- a/avr/cores/megacommand/MCL/SeqPage.h +++ b/avr/cores/megacommand/MCL/SeqPage.h @@ -100,8 +100,6 @@ class SeqPage : public LightPage { static uint8_t last_step; static uint32_t last_md_model; - static uint8_t last_seq_page; - static bool recording; static uint16_t mute_mask; From c9bd18cb0e7ebde2e572398e073af83411513867 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 6 Jul 2023 23:44:51 +1000 Subject: [PATCH 202/413] LFO refactor. much more efficient --- avr/cores/megacommand/MCL/LFO.cpp | 10 +- avr/cores/megacommand/MCL/LFOPage.cpp | 29 +++--- avr/cores/megacommand/MCL/LFOSeqTrack.cpp | 113 ++++++++++------------ avr/cores/megacommand/MCL/LFOSeqTrack.h | 20 ++-- avr/cores/megacommand/MCL/MCL.h | 2 +- avr/cores/megacommand/MCL/MCLSeq.cpp | 3 + 6 files changed, 86 insertions(+), 91 deletions(-) diff --git a/avr/cores/megacommand/MCL/LFO.cpp b/avr/cores/megacommand/MCL/LFO.cpp index 5b5717b7b..930091634 100644 --- a/avr/cores/megacommand/MCL/LFO.cpp +++ b/avr/cores/megacommand/MCL/LFO.cpp @@ -34,9 +34,9 @@ uint8_t ExpLFO::get_sample(uint8_t sample_number) { uint8_t IExpLFO::get_sample(uint8_t sample_number) { - uint8_t y = amplitude - (uint8_t)((float)amplitude * - powf(M_E, (float)-1 * (float)sample_number * - (float)time_constant)); + ExpLFO e; + e.amplitude = amplitude; + uint8_t y = amplitude - e.get_sample(sample_number); return y; } @@ -48,7 +48,9 @@ uint8_t RampLFO::get_sample(uint8_t sample_number) { } uint8_t IRampLFO::get_sample(uint8_t sample_number) { - uint8_t y = amplitude - ((float)amplitude / (float)(LFO_LENGTH)) * (sample_number); + RampLFO r; + r.amplitude = amplitude; + uint8_t y = amplitude - r.get_sample(sample_number); return y; } diff --git a/avr/cores/megacommand/MCL/LFOPage.cpp b/avr/cores/megacommand/MCL/LFOPage.cpp index 93c02eb04..74cecba81 100644 --- a/avr/cores/megacommand/MCL/LFOPage.cpp +++ b/avr/cores/megacommand/MCL/LFOPage.cpp @@ -14,8 +14,6 @@ void LFOPage::setup() { lfo_track->params[0].update_offset(); lfo_track->params[1].update_offset(); - lfo_track->wav_table_state[0] = false; - lfo_track->wav_table_state[1] = false; DEBUG_PRINT_FN(); } @@ -153,13 +151,6 @@ void LFOPage::loop() { } } - if (!lfo_track->wav_table_up_to_date(0)) { - lfo_track->load_wav_table(0); - } - - if (!lfo_track->wav_table_up_to_date(1)) { - lfo_track->load_wav_table(1); - } } void LFOPage::display() { @@ -174,7 +165,6 @@ void LFOPage::display() { uint8_t y = 8; uint8_t lfo_height = 7; uint8_t width = 13; - LFOSeqTrack temp_track; // mcl_gui.draw_vertical_dashline(x, 0, knob_y); SeqPage::draw_knob_frame(); @@ -186,14 +176,23 @@ void LFOPage::display() { draw_param(3, encoders[2]->cur, encoders[3]->cur); } if (page_mode == LFO_SETTINGS) { - temp_track.set_wav_type(lfo_track->wav_type); - temp_track.set_depth(0, lfo_height); - temp_track.load_wav_table(0); uint8_t inc = LFO_LENGTH / width; for (uint8_t n = 0; n < LFO_LENGTH; n += inc, x++) { if (n < LFO_LENGTH) { - oled_display.drawPixel(x, y + lfo_height - temp_track.wav_table[0][n], - WHITE); + int16_t out = 0; + + switch (lfo_track->wav_type) { + case IRAMP_WAV: + case EXP_WAV: + out = (int16_t)128 - lfo_track->wav_tables[lfo_track->wav_type - 2][n]; + break; + default: + out = lfo_track->wav_tables[lfo_track->wav_type][n]; + break; + } + uint8_t sample = ((int16_t) out * (int16_t) lfo_height) / 128; + + oled_display.drawPixel(x, y + lfo_height - sample, WHITE); } } diff --git a/avr/cores/megacommand/MCL/LFOSeqTrack.cpp b/avr/cores/megacommand/MCL/LFOSeqTrack.cpp index dbd649bec..dd218dcb1 100644 --- a/avr/cores/megacommand/MCL/LFOSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/LFOSeqTrack.cpp @@ -1,79 +1,73 @@ #include "MCL_impl.h" -void LFOSeqTrack::load_wav_table(uint8_t table) { +static uint8_t LFOSeqTrack::wav_tables[4][WAV_LENGTH]; + +void LFOSeqTrack::load_tables() { SinLFO sin_lfo; TriLFO tri_lfo; RampLFO ramp_lfo; - IRampLFO iramp_lfo; - ExpLFO exp_lfo; IExpLFO iexp_lfo; LFO *lfo; + + + for (uint8_t n = 0; n < 4; n++) { + switch (n) { + case SIN_WAV: + lfo = (LFO *)&sin_lfo; + offset_behaviour = LFO_OFFSET_CENTRE; + break; + case TRI_WAV: + lfo = (LFO *)&tri_lfo; + offset_behaviour = LFO_OFFSET_CENTRE; + break; + case RAMP_WAV: + lfo = (LFO *)&ramp_lfo; + offset_behaviour = LFO_OFFSET_MAX; + break; + case IEXP_WAV: + lfo = (LFO *)&iexp_lfo; + offset_behaviour = LFO_OFFSET_MAX; + break; + } + lfo->amplitude = 128; + for (uint8_t i = 0; i < LFO_LENGTH; i++) { + wav_tables[n][i] = lfo->get_sample(i); + } + } +} + +int16_t LFOSeqTrack::get_sample(uint8_t n) { + + int8_t out = 0; switch (wav_type) { - case SIN_WAV: - lfo = (LFO *)&sin_lfo; - offset_behaviour = LFO_OFFSET_CENTRE; - break; - case TRI_WAV: - lfo = (LFO *)&tri_lfo; - offset_behaviour = LFO_OFFSET_CENTRE; - break; - case IRAMP_WAV: - lfo = (LFO *)&iramp_lfo; - offset_behaviour = LFO_OFFSET_MAX; - break; - case RAMP_WAV: - lfo = (LFO *)&ramp_lfo; - offset_behaviour = LFO_OFFSET_MAX; + case IRAMP_WAV: + case EXP_WAV: + out = 128 - wav_tables[wav_type - 2][n]; break; - case EXP_WAV: - lfo = (LFO *)&exp_lfo; - offset_behaviour = LFO_OFFSET_MAX; - break; - case IEXP_WAV: - lfo = (LFO *)&iexp_lfo; - offset_behaviour = LFO_OFFSET_MAX; + default: + out = wav_tables[wav_type][n]; break; } - lfo->amplitude = params[table].depth; - // ExpLFO exp_lfo(20); - for (uint8_t n = 0; n < LFO_LENGTH; n++) { - wav_table[table][n] = (float)lfo->get_sample(n); + + switch (offset_behaviour) { + case LFO_OFFSET_CENTRE: + out -= 64; + break; } - wav_table_state[table] = true; + + return out; } uint8_t LFOSeqTrack::get_wav_value(uint8_t sample_count, uint8_t param) { int8_t offset = params[param].offset; - int8_t depth = params[param].depth; - int8_t sample = wav_table[param][sample_count]; - int16_t val; + int16_t depth = params[param].depth; - switch (offset_behaviour) { - case LFO_OFFSET_CENTRE: - val = offset + (sample - (depth / 2)); - if (val > 127) { - return 127; - } - if (val < 0) { - return 0; - } else { - return (uint8_t)val; - } - break; - case LFO_OFFSET_MAX: - // val = 127 - sample; - val = offset - depth + sample; - if (val > 127) { - return 127; - } - if (val < 0) { - return 0; - } else { - return (uint8_t)val; - } - break; - } - return offset; + int8_t sample = (get_sample(sample_count) * depth) / 128; + int val = sample + offset; + if (val > 127) { return 127; } + if (val < 0) { return 0; } + + return (uint8_t)val; } void LFOSeqTrack::seq(MidiUartParent *uart_) { @@ -141,7 +135,6 @@ void LFOSeqTrack::check_and_update_params_offset(uint8_t track, uint8_t dest, uint8_t value) { for (uint8_t n = 0; n < NUM_LFO_PARAMS; n++) { if ((params[n].dest == track) && (params[n].param == dest)) { - wav_table_state[n] = false; params[n].offset = value; } } diff --git a/avr/cores/megacommand/MCL/LFOSeqTrack.h b/avr/cores/megacommand/MCL/LFOSeqTrack.h index d92bdcc2a..da2fcfd25 100644 --- a/avr/cores/megacommand/MCL/LFOSeqTrack.h +++ b/avr/cores/megacommand/MCL/LFOSeqTrack.h @@ -40,8 +40,7 @@ class LFOSeqTrackData { LFOSeqParam params[NUM_LFO_PARAMS]; uint8_t wav_type; - uint8_t wav_table[NUM_LFO_PARAMS][WAV_LENGTH]; - bool wav_table_state[NUM_LFO_PARAMS]; + uint8_t last_wav_value[NUM_LFO_PARAMS]; uint8_t sample_hold; @@ -65,6 +64,7 @@ class LFOSeqTrackData { } }; + class LFOSeqTrack : public LFOSeqTrackData { public: MidiUartParent *uart; @@ -72,29 +72,27 @@ class LFOSeqTrack : public LFOSeqTrackData { uint8_t step_count; uint8_t sample_count; + static uint8_t wav_tables[4][WAV_LENGTH]; + LFOSeqTrack() { init(); }; + + int16_t get_sample(uint8_t n); + + void load_tables(); + ALWAYS_INLINE() uint8_t get_wav_value(uint8_t sample_count, uint8_t param); void update_kit_params(); void update_params_offset(); void reset_params_offset(); - bool wav_table_up_to_date(uint8_t n) { return wav_table_state[n]; } - void check_and_update_params_offset(uint8_t dest, uint8_t param, uint8_t value); void set_wav_type(uint8_t _wav_type) { - if (wav_type != _wav_type) { wav_type = _wav_type; - wav_table_state[0] = false; - wav_table_state[1] = false; - } } void set_speed(uint8_t _speed) { speed = _speed; } void set_depth(uint8_t param, uint8_t depth) { - if (params[param].depth != depth) { params[param].depth = depth; - wav_table_state[param] = false; - } } void load_wav_table(uint8_t table); ALWAYS_INLINE() void seq(MidiUartParent *uart_); diff --git a/avr/cores/megacommand/MCL/MCL.h b/avr/cores/megacommand/MCL/MCL.h index 211e967f2..6db36b133 100644 --- a/avr/cores/megacommand/MCL/MCL.h +++ b/avr/cores/megacommand/MCL/MCL.h @@ -17,7 +17,7 @@ #include "Fonts/TomThumb.h" #define VERSION 4050 -#define VERSION_STR "CC4.50" +#define VERSION_STR "EE4.50" #define CALLBACK_TIMEOUT 500 #define GUI_NAME_TIMEOUT 800 diff --git a/avr/cores/megacommand/MCL/MCLSeq.cpp b/avr/cores/megacommand/MCL/MCLSeq.cpp index 4f9cf8808..cef605a74 100644 --- a/avr/cores/megacommand/MCL/MCLSeq.cpp +++ b/avr/cores/megacommand/MCL/MCLSeq.cpp @@ -12,6 +12,9 @@ void MCLSeq::setup() { md_arp_tracks[i].track_number = i; } #ifdef LFO_TRACKS + + lfo_tracks[0].load_tables(); + for (uint8_t i = 0; i < num_lfo_tracks; i++) { lfo_tracks[i].track_number = i; if (i == 0) { From e354978d3d28ee0c071c28f270cabe9ad0823bdb Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 7 Jul 2023 11:34:53 +1000 Subject: [PATCH 203/413] Fixed overflow lfo --- avr/cores/megacommand/MCL/LFOSeqTrack.cpp | 25 ++++++++++------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/avr/cores/megacommand/MCL/LFOSeqTrack.cpp b/avr/cores/megacommand/MCL/LFOSeqTrack.cpp index dd218dcb1..074965223 100644 --- a/avr/cores/megacommand/MCL/LFOSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/LFOSeqTrack.cpp @@ -38,7 +38,7 @@ void LFOSeqTrack::load_tables() { int16_t LFOSeqTrack::get_sample(uint8_t n) { - int8_t out = 0; + int16_t out = 0; switch (wav_type) { case IRAMP_WAV: case EXP_WAV: @@ -62,12 +62,12 @@ uint8_t LFOSeqTrack::get_wav_value(uint8_t sample_count, uint8_t param) { int8_t offset = params[param].offset; int16_t depth = params[param].depth; - int8_t sample = (get_sample(sample_count) * depth) / 128; - int val = sample + offset; - if (val > 127) { return 127; } - if (val < 0) { return 0; } + int16_t sample = (get_sample(sample_count) * depth) / 128; + sample += offset; + if (sample > 127) { return 127; } + if (sample < 0) { return 0; } - return (uint8_t)val; + return (uint8_t) sample; } void LFOSeqTrack::seq(MidiUartParent *uart_) { @@ -75,18 +75,15 @@ void LFOSeqTrack::seq(MidiUartParent *uart_) { uart = uart_; if ((MidiClock.mod12_counter == 0) && (mode != LFO_MODE_FREE) && - IS_BIT_SET64(pattern_mask, step_count)) { - sample_count = 0; - } + IS_BIT_SET64(pattern_mask, step_count)) { + sample_count = 0; + } if (enable) { for (uint8_t i = 0; i < NUM_LFO_PARAMS; i++) { uint8_t wav_value = get_wav_value(sample_count, i); if (last_wav_value[i] != wav_value) { uint8_t dest = params[i].dest - 1; uint8_t param = params[i].param; - if (dest == 0) { - continue; - } if (dest >= NUM_MD_TRACKS + 4) { uint8_t channel = dest - NUM_MD_TRACKS; @@ -107,12 +104,12 @@ void LFOSeqTrack::seq(MidiUartParent *uart_) { sample_count += 2; } else { sample_hold += 1; - if (sample_hold >= speed - 1) { + if (sample_hold >= (speed - 1)) { sample_hold = 0; sample_count += 1; } } - if (sample_count > LFO_LENGTH) { + if (sample_count >= LFO_LENGTH) { // Free running LFO should reset, oneshot should hold at last value. if (mode == LFO_MODE_ONE) { sample_count = LFO_LENGTH - 1; From 0431ece6d7ae3c89c88a53e38a2c42f0a5d34d27 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 7 Jul 2023 11:36:12 +1000 Subject: [PATCH 204/413] Support faster LFO rate --- avr/cores/megacommand/MCL/LFOSeqTrack.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/avr/cores/megacommand/MCL/LFOSeqTrack.cpp b/avr/cores/megacommand/MCL/LFOSeqTrack.cpp index 074965223..5a542608a 100644 --- a/avr/cores/megacommand/MCL/LFOSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/LFOSeqTrack.cpp @@ -100,11 +100,11 @@ void LFOSeqTrack::seq(MidiUartParent *uart_) { } } - if (speed == 0) { - sample_count += 2; + if (speed < 8) { + sample_count += 8 - speed; } else { sample_hold += 1; - if (sample_hold >= (speed - 1)) { + if (sample_hold >= (speed - 8)) { sample_hold = 0; sample_count += 1; } From 499d995bf6888e91a938b44fde3183e78ae69454 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 7 Jul 2023 14:48:47 +1000 Subject: [PATCH 205/413] fix for offset behaviour --- avr/cores/megacommand/MCL/LFOSeqTrack.cpp | 23 ++++++++++++----------- avr/cores/megacommand/MCL/LFOSeqTrack.h | 4 ++-- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/avr/cores/megacommand/MCL/LFOSeqTrack.cpp b/avr/cores/megacommand/MCL/LFOSeqTrack.cpp index 5a542608a..0dff98be2 100644 --- a/avr/cores/megacommand/MCL/LFOSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/LFOSeqTrack.cpp @@ -14,19 +14,15 @@ void LFOSeqTrack::load_tables() { switch (n) { case SIN_WAV: lfo = (LFO *)&sin_lfo; - offset_behaviour = LFO_OFFSET_CENTRE; break; case TRI_WAV: lfo = (LFO *)&tri_lfo; - offset_behaviour = LFO_OFFSET_CENTRE; break; case RAMP_WAV: lfo = (LFO *)&ramp_lfo; - offset_behaviour = LFO_OFFSET_MAX; break; case IEXP_WAV: lfo = (LFO *)&iexp_lfo; - offset_behaviour = LFO_OFFSET_MAX; break; } lfo->amplitude = 128; @@ -49,12 +45,17 @@ int16_t LFOSeqTrack::get_sample(uint8_t n) { break; } - switch (offset_behaviour) { - case LFO_OFFSET_CENTRE: - out -= 64; - break; + switch (wav_type) { + //OFFSET CENTRE + case SIN_WAV: + case TRI_WAV: + out -= 64; + break; + //OFFSET MAX + default: + out -= 128; + break; } - return out; } @@ -62,8 +63,8 @@ uint8_t LFOSeqTrack::get_wav_value(uint8_t sample_count, uint8_t param) { int8_t offset = params[param].offset; int16_t depth = params[param].depth; - int16_t sample = (get_sample(sample_count) * depth) / 128; - sample += offset; + int16_t sample = ((get_sample(sample_count) * depth) / 128) + offset; + if (sample > 127) { return 127; } if (sample < 0) { return 0; } diff --git a/avr/cores/megacommand/MCL/LFOSeqTrack.h b/avr/cores/megacommand/MCL/LFOSeqTrack.h index da2fcfd25..6196dfed4 100644 --- a/avr/cores/megacommand/MCL/LFOSeqTrack.h +++ b/avr/cores/megacommand/MCL/LFOSeqTrack.h @@ -42,11 +42,11 @@ class LFOSeqTrackData { uint8_t wav_type; uint8_t last_wav_value[NUM_LFO_PARAMS]; - uint8_t sample_hold; + uint8_t sample_hold; //<--- shouldnt be stored here; uint8_t speed; uint8_t mode; - uint8_t offset_behaviour; + uint8_t offset_behaviour; //<--- no longer needed uint64_t pattern_mask; bool enable; uint8_t length; From 7392c1651bb6edb5ababc440ed9f2c0aa77a6975 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 7 Jul 2023 21:54:59 +1000 Subject: [PATCH 206/413] needed a to check all 4 perf controllers --- avr/cores/megacommand/MCL/PerfPage.cpp | 31 +++++++++++++++----------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 42b66915d..0c4c49fc5 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -299,27 +299,32 @@ void PerfPage::display() { void PerfPage::learn_param(uint8_t dest, uint8_t param, uint8_t value) { // Intercept controller param. - PerfData *d = &perf_encoders[perf_id]->perf_data; - if (dest + 1 == d->src && param == d->param) { - // Controller param, start value; - uint8_t min = d->min; - uint8_t max = 127; - if (value >= min) { - uint8_t cur = value - min; - int8_t range = max - min; - uint8_t val = ((float)cur / (float)range) * 127.0f; - perf_encoders[perf_id]->cur = val; - perf_encoders[perf_id]->send(); - if (mcl.currentPage() == PERF_PAGE_0) { - update_params(); + + for (uint8_t i = 0; i < 4; i++) { + PerfData *d = &perf_encoders[i]->perf_data; + if (dest + 1 == d->src && param == d->param) { + // Controller param, start value; + uint8_t min = d->min; + uint8_t max = 127; + if (value >= min) { + uint8_t cur = value - min; + int8_t range = max - min; + uint8_t val = ((float)cur / (float)range) * 127.0f; + perf_encoders[i]->cur = val; + perf_encoders[i]->send(); + if (mcl.currentPage() == PERF_PAGE_0) { + update_params(); + } } } } + if (mcl.currentPage() == PERF_PAGE_0) { if (dest > NUM_MD_TRACKS + 4 && MidiClock.state == 2) { return; } if (learn) { + PerfData *d = &perf_encoders[perf_id]->perf_data; uint8_t scene = learn - 1; uint8_t n = d->add_param(dest, param, scene, value); if (n < 255) { From 050dd86bd6eefbb8e65b16aa035f105a340de969 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 7 Jul 2023 22:12:45 +1000 Subject: [PATCH 207/413] PRG message oneshot, only first event will be sent, rest ignored --- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 37 +++++++++++++---------- avr/cores/megacommand/MCL/ExtSeqTrack.h | 2 ++ 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index 52025a211..441d98017 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -571,7 +571,10 @@ void ExtSeqTrack::handle_event(uint16_t index, uint8_t step) { // plock uint8_t param = locks_params[ev.lock_idx] - 1; if (param == PARAM_PRG) { - uart->sendProgramChange(channel, ev.event_value); + if (!pgm_oneshot) { + pgm_oneshot = true; + uart->sendProgramChange(channel, ev.event_value); + } } else { if (param == PARAM_PB) { uart->sendPitchBend(channel, ev.event_value << 7); @@ -730,77 +733,79 @@ void ExtSeqTrack::noteon_conditional(uint8_t condition, uint8_t note, if (condition > 64) { condition -= 64; } + bool send_note = false; switch (condition) { case 0: case 1: - note_on(note, velocity); + send_note = true; break; case 2: if (!IS_BIT_SET(iterations_8, 0)) { - note_on(note, velocity); + send_note = true; } break; case 3: if ((iterations_6 == 3) || (iterations_6 == 6)) { - note_on(note, velocity); + send_note = true; } break; case 6: if (iterations_6 == 6) { - note_on(note, velocity); + send_note = true; } break; case 4: if ((iterations_8 == 4) || (iterations_8 == 8)) { - note_on(note, velocity); + send_note = true; } break; case 8: if (iterations_8 == 8) { - note_on(note, velocity); + send_note = true; } case 5: if (iterations_5 == 5) { - note_on(note, velocity); + send_note = true; } break; case 7: if (iterations_7 == 7) { - note_on(note, velocity); + send_note = true; } break; case 9: if (get_random_byte() <= 13) { - note_on(note, velocity); + send_note = true; } break; case 10: if (get_random_byte() <= 32) { - note_on(note, velocity); + send_note = true; } break; case 11: if (get_random_byte() <= 64) { - note_on(note, velocity); + send_note = true; } break; case 12: if (get_random_byte() <= 96) { - note_on(note, velocity); + send_note = true; } break; case 13: if (get_random_byte() <= 115) { - note_on(note, velocity); + send_note = true; } break; case 14: if (!IS_BIT_SET128_P(oneshot_mask, step_count)) { SET_BIT128_P(oneshot_mask, step_count); - note_on(note, velocity); + send_note = true; } } + if (send_note) { note_on(note, velocity); } } void ExtSeqTrack::pitch_bend(uint16_t value, MidiUartParent *uart_) { @@ -998,7 +1003,7 @@ bool ExtSeqTrack::set_track_locks(uint8_t step, uint8_t utiming, constexpr uint8_t oneshot = 14; e->is_lock = true; - e->cond_id = track_param == PARAM_PRG ? oneshot : 0; + e->cond_id = 0; e->lock_idx = lock_idx; e->event_value = value; e->event_on = event_on; diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.h b/avr/cores/megacommand/MCL/ExtSeqTrack.h index cdded0d72..e30158995 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.h +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.h @@ -151,6 +151,7 @@ class ExtSeqTrack : public ExtSeqTrackData, public SeqSlideTrack { 0}; // 2 x 64 bit masks to store state of 128 notes. uint64_t oneshot_mask[2]; uint64_t ignore_notes[2]; + bool pgm_oneshot; NoteVector notes_on[NUM_NOTES_ON]; uint8_t notes_on_count; @@ -163,6 +164,7 @@ class ExtSeqTrack : public ExtSeqTrackData, public SeqSlideTrack { SeqTrack::reset(); memset(oneshot_mask,0,sizeof(oneshot_mask)); memset(ignore_notes,0, sizeof(ignore_notes)); + pgm_oneshot = 0; } void seq(MidiUartParent *uart_); From e0fda95a61d5f19eaa97d1178859e665fb7eab2f Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 7 Jul 2023 23:16:43 +1000 Subject: [PATCH 208/413] Experiment with print --- avr/cores/megacommand/MCL/MCLGUI.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/avr/cores/megacommand/MCL/MCLGUI.h b/avr/cores/megacommand/MCL/MCLGUI.h index 37aa44a24..d27a55dd1 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.h +++ b/avr/cores/megacommand/MCL/MCLGUI.h @@ -6,8 +6,25 @@ #include "QuestionDialogPage.h" #include "TextInputPage.h" +//class MCLGUI : public Print { class MCLGUI { public: + + /* + * Print child implementation: + * + char str_print[30]; + bool str_offset = 0; + size_t write(uint8_t c) { }; + size_t write(const uint8_t *buffer, size_t size) { + uint8_t s = min(sizeof(str_print),size); + strncpy(str_print, buffer + str_offset, s); + str_offset += s; + } + */ + + void print_str() { oled_display.print(str_print); str_offset = 0; } + uint8_t s_progress_cookie = 0b00110011; uint8_t s_progress_count = 0; From f7fb6c60d10fd57a843bc2748aea15f913eea8cf Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 7 Jul 2023 23:30:27 +1000 Subject: [PATCH 209/413] 256 files 32 chars in length. SampleMgr show KB not time --- avr/cores/megacommand/MCL/FileBrowserPage.cpp | 4 +-- avr/cores/megacommand/MCL/MCLGUI.h | 2 +- avr/cores/megacommand/MCL/MCLMemory.h | 4 +-- .../megacommand/MCL/SampleBrowserPage.cpp | 28 ++++++++++++++----- avr/cores/megacommand/MCL/SampleBrowserPage.h | 2 +- 5 files changed, 26 insertions(+), 14 deletions(-) diff --git a/avr/cores/megacommand/MCL/FileBrowserPage.cpp b/avr/cores/megacommand/MCL/FileBrowserPage.cpp index 34278112a..546e0c0da 100644 --- a/avr/cores/megacommand/MCL/FileBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/FileBrowserPage.cpp @@ -115,9 +115,7 @@ void FileBrowserPage::query_filesystem() { } // iterate through the files while (file.openNext(&d, O_READ) && (numEntries < MAX_ENTRIES)) { - for (uint8_t c = 0; c < FILE_ENTRY_SIZE; c++) { - temp_entry[c] = 0; - } + memset(temp_entry, 0, sizeof(temp_entry)); file.getName(temp_entry, FILE_ENTRY_SIZE); bool is_match_file = false; DEBUG_PRINTLN(numEntries); diff --git a/avr/cores/megacommand/MCL/MCLGUI.h b/avr/cores/megacommand/MCL/MCLGUI.h index d27a55dd1..4502583ba 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.h +++ b/avr/cores/megacommand/MCL/MCLGUI.h @@ -21,9 +21,9 @@ class MCLGUI { strncpy(str_print, buffer + str_offset, s); str_offset += s; } - */ void print_str() { oled_display.print(str_print); str_offset = 0; } + */ uint8_t s_progress_cookie = 0b00110011; uint8_t s_progress_count = 0; diff --git a/avr/cores/megacommand/MCL/MCLMemory.h b/avr/cores/megacommand/MCL/MCLMemory.h index dbf9420a5..5efc2eb78 100644 --- a/avr/cores/megacommand/MCL/MCLMemory.h +++ b/avr/cores/megacommand/MCL/MCLMemory.h @@ -106,8 +106,8 @@ constexpr size_t BANK1_MDTEMPO_TRACK_START = BANK1_MDFX_TRACK_START + MDFX_TRACK constexpr size_t BANK1_A4_TRACKS_START = BANK1_MDTEMPO_TRACK_START + MDTEMPO_TRACK_LEN;; // 512x file entries (16 bytes each), stored in Bank3 -constexpr size_t NUM_FILE_ENTRIES = 408; -constexpr size_t FILE_ENTRY_SIZE = 20; +constexpr size_t NUM_FILE_ENTRIES = 256; +constexpr size_t FILE_ENTRY_SIZE = 32; constexpr size_t BANK3_FILE_ENTRIES_START = 0x0000; constexpr size_t BANK3_FILE_ENTRIES_END = 0x2000; diff --git a/avr/cores/megacommand/MCL/SampleBrowserPage.cpp b/avr/cores/megacommand/MCL/SampleBrowserPage.cpp index 495b6033c..04cd7c08d 100644 --- a/avr/cores/megacommand/MCL/SampleBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/SampleBrowserPage.cpp @@ -58,18 +58,28 @@ void SampleBrowserPage::display() { oled_display.print(wav_file.header.fmt.bitRate); oled_display.print(F("/")); oled_display.print(wav_file.header.fmt.numChannels); + /* float seconds = wav_file.header.get_length() / (float)wav_file.header.fmt.sampleRate; int16_t minutes = seconds * 0.01666666667f; int16_t ms = ((float)seconds - int(seconds)) * 1000; - + */ oled_display.setCursor(0, 30); - + /* oled_display.print(minutes); oled_display.print(F(":")); oled_display.print(int(seconds)); oled_display.print(F(":")); oled_display.print(ms); - + */ + uint32_t size = wav_file.file.size(); + if (size < 1024) { + oled_display.print(size); + oled_display.print("B"); + } + else { + oled_display.print(size / 1024); + oled_display.print("kB"); + } wav_file.close(); } } @@ -79,7 +89,7 @@ void SampleBrowserPage::display() { oled_display.display(); } -void SampleBrowserPage::init(uint8_t show_samplemgr_) { +void SampleBrowserPage::init(uint8_t show_samplemgr_, bool query) { FileBrowserPage::selection_change = true; file_types.reset(); file_types.add(c_wav_suffix); @@ -109,8 +119,10 @@ void SampleBrowserPage::init(uint8_t show_samplemgr_) { show_filemenu = true; show_new_folder = true; show_parent = true; - SD.chdir(lwd); - query_filesystem(); + if (query) { + SD.chdir(lwd); + query_filesystem(); + } } } @@ -216,16 +228,18 @@ void SampleBrowserPage::on_select(const char *__) { init(true); } else { auto slot = encoders[1]->cur; + bool query = true; switch (pending_action) { case PA_NEW: recv_wav(slot); break; case PA_SELECT: send_sample(slot); + query = false; break; } pending_action = 0; - init(false); + init(false, query); } } diff --git a/avr/cores/megacommand/MCL/SampleBrowserPage.h b/avr/cores/megacommand/MCL/SampleBrowserPage.h index 2e806fd2a..5795d2f62 100644 --- a/avr/cores/megacommand/MCL/SampleBrowserPage.h +++ b/avr/cores/megacommand/MCL/SampleBrowserPage.h @@ -32,7 +32,7 @@ class SampleBrowserPage : public FileBrowserPage, public MidiSysexListenerClass virtual bool handleEvent(gui_event_t *event); virtual void display(); - void init(uint8_t show_samplemgr_); + void init(uint8_t show_samplemgr_, bool query = true); virtual void init() { init(false); } void setup(); void send_sample(int slot, char *newname = nullptr, bool silent = false); From aa09dc0277362a5ca2e57ed0eb9c21b9c71fd96e Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 7 Jul 2023 23:35:27 +1000 Subject: [PATCH 210/413] revert lfo speeds for now --- avr/cores/megacommand/MCL/LFOSeqTrack.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/avr/cores/megacommand/MCL/LFOSeqTrack.cpp b/avr/cores/megacommand/MCL/LFOSeqTrack.cpp index 0dff98be2..61d463e0d 100644 --- a/avr/cores/megacommand/MCL/LFOSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/LFOSeqTrack.cpp @@ -100,7 +100,17 @@ void LFOSeqTrack::seq(MidiUartParent *uart_) { } } } + if (speed < 1) { + sample_count += 1; + } else { + sample_hold += 1; + if (sample_hold >= (speed - 1)) { + sample_hold = 0; + sample_count += 1; + } + } + /* if (speed < 8) { sample_count += 8 - speed; } else { @@ -110,6 +120,7 @@ void LFOSeqTrack::seq(MidiUartParent *uart_) { sample_count += 1; } } + */ if (sample_count >= LFO_LENGTH) { // Free running LFO should reset, oneshot should hold at last value. if (mode == LFO_MODE_ONE) { From 136d2ceb05d2d492ad9d3cb27b4856d11714e0a9 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 8 Jul 2023 13:52:01 +1000 Subject: [PATCH 211/413] Add button press remove lock. Fix for threshold. Fix for MIDI channel --- avr/cores/megacommand/MCL/PerfPage.cpp | 19 ++++++++++++++----- avr/cores/megacommand/MCL/PerfPage.h | 4 ++-- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 0c4c49fc5..bba2d97ed 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -187,7 +187,7 @@ void PerfPage::update_params() { if (encoders[1]->hasChanged() && encoders[1]->cur == 0) { encoders[2]->cur = 0; } - if (encoders[1]->hasChanged() || encoders[2]->hasChanged()) { + if (encoders[1]->hasChanged() || encoders[2]->hasChanged() || encoders[3]->hasChanged()) { PerfData *d = &perf_encoders[perf_id]->perf_data; d->update_src(encoders[1]->cur, encoders[2]->cur, encoders[3]->cur); } @@ -307,9 +307,9 @@ void PerfPage::learn_param(uint8_t dest, uint8_t param, uint8_t value) { uint8_t min = d->min; uint8_t max = 127; if (value >= min) { - uint8_t cur = value - min; - int8_t range = max - min; - uint8_t val = ((float)cur / (float)range) * 127.0f; + int16_t cur = value - min; + int16_t range = max - min; + uint8_t val = (cur * (int16_t)127) / range; perf_encoders[i]->cur = val; perf_encoders[i]->send(); if (mcl.currentPage() == PERF_PAGE_0) { @@ -320,7 +320,7 @@ void PerfPage::learn_param(uint8_t dest, uint8_t param, uint8_t value) { } if (mcl.currentPage() == PERF_PAGE_0) { - if (dest > NUM_MD_TRACKS + 4 && MidiClock.state == 2) { + if (dest >= NUM_MD_TRACKS + 4 && MidiClock.state == 2) { return; } if (learn) { @@ -560,6 +560,15 @@ bool PerfPage::handleEvent(gui_event_t *event) { } return true; } + if (EVENT_PRESSED(event, Buttons.ENCODER4)) { + if (learn) { + PerfData *d = &perf_encoders[perf_id]->perf_data; + uint8_t scene = learn - 1; + d->clear_param_scene(encoders[1]->cur - 1 , encoders[2]->cur, scene); + config_encoders(); + } + } + if (EVENT_PRESSED(event, Buttons.BUTTON4)) { page_mode_up: page_mode++; diff --git a/avr/cores/megacommand/MCL/PerfPage.h b/avr/cores/megacommand/MCL/PerfPage.h index 0e0c9c70b..82696108b 100644 --- a/avr/cores/megacommand/MCL/PerfPage.h +++ b/avr/cores/megacommand/MCL/PerfPage.h @@ -26,8 +26,8 @@ class PerfPage : public LightPage, PerfPageParent { uint8_t last_page_mode; bool midi_state = false; - uint8_t page_mode; - uint8_t perf_id; + uint8_t page_mode = 0; + uint8_t perf_id = 0; uint16_t last_mask = 0; uint16_t last_blink_mask = 0; From 3fb1fe2df74a9e91f79291e33b80ba5dd0086e06 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 8 Jul 2023 13:52:46 +1000 Subject: [PATCH 212/413] disable Midi Clock learn block --- avr/cores/megacommand/MCL/PerfPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index bba2d97ed..951d99c14 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -320,7 +320,7 @@ void PerfPage::learn_param(uint8_t dest, uint8_t param, uint8_t value) { } if (mcl.currentPage() == PERF_PAGE_0) { - if (dest >= NUM_MD_TRACKS + 4 && MidiClock.state == 2) { + if (dest >= NUM_MD_TRACKS + 4) { // && MidiClock.state == 2) { return; } if (learn) { From ac05b88940557019c8dda3a9521d2371c3d4e5f8 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 8 Jul 2023 14:55:28 +1000 Subject: [PATCH 213/413] Enums were 16bit wide --- avr/cores/megacommand/Makefile | 2 +- resource/gen-resource-linux.ps1 | 2 +- resource/gen-resource.ps1 | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/avr/cores/megacommand/Makefile b/avr/cores/megacommand/Makefile index 1e1bd6eff..a1d8241cf 100644 --- a/avr/cores/megacommand/Makefile +++ b/avr/cores/megacommand/Makefile @@ -34,7 +34,7 @@ F_CPU = 16000000L INOFILES=$(wildcard *.pde) -OPTIM_FLAGS = -Os +OPTIM_FLAGS = -Os --short-enums WARN_FLAGS = -Wall -Wextra -Wdouble-promotion COMPILE_FLAGS = -c $(OPTIM_FLAGS) $(WARN_FLAGS) -MMD FEATURE_FLAGS = -ffunction-sections -fdata-sections -flto=jobserver diff --git a/resource/gen-resource-linux.ps1 b/resource/gen-resource-linux.ps1 index 5263bb479..97a26c703 100644 --- a/resource/gen-resource-linux.ps1 +++ b/resource/gen-resource-linux.ps1 @@ -37,7 +37,7 @@ function compile($f) { -D__AVR_ATmega2560__ ` -DAVR ` -std=gnu++1z ` - -Os -fpermissive $f -c -o "$m/$n.o" + -Os --short-enums -fpermissive $f -c -o "$m/$n.o" ../../tools/avr/bin/avr-objcopy -O binary -j .data "$m/$n.o" "$m/$n.hex" cd ../compress dotnet run "$m/$n.hex" "$m/$n.ez" diff --git a/resource/gen-resource.ps1 b/resource/gen-resource.ps1 index f7b9c126d..e70333dc7 100644 --- a/resource/gen-resource.ps1 +++ b/resource/gen-resource.ps1 @@ -36,7 +36,7 @@ function compile($f) { -D__AVR_ATmega2560__ ` -DAVR ` -std=gnu++1z ` - -Os $f -c -o "$n.o" + -Os --short-enums $f -c -o "$n.o" avr-objcopy -O binary -j .data "$n.o" "$n.hex" ../compress/bin/Release/netcoreapp3.1/compress.exe "$n.hex" "$n.ez" Remove-Item -ErrorAction Ignore patterns.txt From 22d796ff5a74747e772594730db11a852ef34ea2 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 8 Jul 2023 15:13:51 +1000 Subject: [PATCH 214/413] Add PF group to group select --- avr/cores/megacommand/MCL/GridIOPage.cpp | 27 ++++++++++++++++++++ avr/cores/megacommand/MCL/GridIOPage.h | 1 + avr/cores/megacommand/MCL/GridLoadPage.cpp | 29 +--------------------- avr/cores/megacommand/MCL/GridLoadPage.h | 1 + avr/cores/megacommand/MCL/GridSavePage.cpp | 29 +--------------------- avr/cores/megacommand/MCL/GridSavePage.h | 1 + avr/cores/megacommand/MCL/MCLGUI.cpp | 14 +++++++---- avr/cores/megacommand/MCL/MidiDeviceGrid.h | 14 +++++++---- avr/cores/megacommand/MD/MD.cpp | 2 +- 9 files changed, 51 insertions(+), 67 deletions(-) diff --git a/avr/cores/megacommand/MCL/GridIOPage.cpp b/avr/cores/megacommand/MCL/GridIOPage.cpp index b50406c45..2255ee421 100644 --- a/avr/cores/megacommand/MCL/GridIOPage.cpp +++ b/avr/cores/megacommand/MCL/GridIOPage.cpp @@ -30,6 +30,7 @@ void GridIOPage::track_select_array_from_type_select( match = gdt->device_idx; break; case GROUP_AUX: + case GROUP_PERF: case GROUP_TEMPO: match = gdt->group_type + 1; break; @@ -44,6 +45,32 @@ void GridIOPage::track_select_array_from_type_select( } bool GridIOPage::handleEvent(gui_event_t *event) { + if (note_interface.is_event(event)) { + uint8_t track = event->source - 128; + if (event->mask == EVENT_BUTTON_PRESSED) { + if (show_track_type) { + if (track < 5) { + TOGGLE_BIT16(mcl_cfg.track_type_select, track); + MD.set_trigleds(mcl_cfg.track_type_select, TRIGLED_EXCLUSIVE); + } + } else { + trig_interface.send_md_leds(TRIGLED_OVERLAY); + } + } else { + if (!show_track_type) { + trig_interface.send_md_leds(TRIGLED_OVERLAY); + if (note_interface.notes_all_off()) { + if (BUTTON_DOWN(Buttons.BUTTON2)) { + return true; + } else { + action(); + } + } + } + } + + return true; + } if (EVENT_CMD(event)) { uint8_t key = event->source - 64; if (event->mask == EVENT_BUTTON_PRESSED) { diff --git a/avr/cores/megacommand/MCL/GridIOPage.h b/avr/cores/megacommand/MCL/GridIOPage.h index dc438bc18..f41a2a6ba 100644 --- a/avr/cores/megacommand/MCL/GridIOPage.h +++ b/avr/cores/megacommand/MCL/GridIOPage.h @@ -20,6 +20,7 @@ class GridIOPage : public LightPage { virtual void cleanup(); virtual void draw_popup(); virtual void group_select(); + virtual void action() = 0; virtual bool handleEvent(gui_event_t *event); }; diff --git a/avr/cores/megacommand/MCL/GridLoadPage.cpp b/avr/cores/megacommand/MCL/GridLoadPage.cpp index 095937b94..1beaf9ab4 100644 --- a/avr/cores/megacommand/MCL/GridLoadPage.cpp +++ b/avr/cores/megacommand/MCL/GridLoadPage.cpp @@ -108,7 +108,7 @@ void GridLoadPage::display() { auto oldfont = oled_display.getFont(); if (show_track_type) { - mcl_gui.draw_track_type_select(36, MCLGUI::s_menu_y + 12, + mcl_gui.draw_track_type_select(23, MCLGUI::s_menu_y + 12, mcl_cfg.track_type_select); } else { mcl_gui.draw_trigs(MCLGUI::s_menu_x + 4, MCLGUI::s_menu_y + 21, note_interface.notes_off | note_interface.notes_on ); @@ -230,33 +230,6 @@ bool GridLoadPage::handleEvent(gui_event_t *event) { return true; } DEBUG_DUMP(event->source); - if (note_interface.is_event(event)) { - uint8_t track = event->source - 128; - if (event->mask == EVENT_BUTTON_PRESSED) { - if (show_track_type) { - if (track < 4) { - TOGGLE_BIT16(mcl_cfg.track_type_select, track); - MD.set_trigleds(mcl_cfg.track_type_select, TRIGLED_EXCLUSIVE); - } - } else { - trig_interface.send_md_leds(TRIGLED_OVERLAY); - } - } else { - if (!show_track_type) { - trig_interface.send_md_leds(TRIGLED_OVERLAY); - if (note_interface.notes_all_off()) { - DEBUG_PRINTLN(F("notes all off")); - if (BUTTON_DOWN(Buttons.BUTTON2)) { - return true; - } else { - load(); - } - } - } - } - return true; - } - if (EVENT_CMD(event)) { uint8_t key = event->source - 64; if (event->mask == EVENT_BUTTON_PRESSED) { diff --git a/avr/cores/megacommand/MCL/GridLoadPage.h b/avr/cores/megacommand/MCL/GridLoadPage.h index c88eaf3fb..369d13fbb 100644 --- a/avr/cores/megacommand/MCL/GridLoadPage.h +++ b/avr/cores/megacommand/MCL/GridLoadPage.h @@ -22,6 +22,7 @@ class GridLoadPage : public GridIOPage { void draw_popup(); void draw_popup_title(); void display(); + void action() { load(); } void init(); void setup(); }; diff --git a/avr/cores/megacommand/MCL/GridSavePage.cpp b/avr/cores/megacommand/MCL/GridSavePage.cpp index 98155dc74..3f29ef05d 100644 --- a/avr/cores/megacommand/MCL/GridSavePage.cpp +++ b/avr/cores/megacommand/MCL/GridSavePage.cpp @@ -34,7 +34,7 @@ void GridSavePage::display() { const uint64_t slide_mask = 0; const uint64_t mute_mask = 0; if (show_track_type) { - mcl_gui.draw_track_type_select(36, MCLGUI::s_menu_y + 12, + mcl_gui.draw_track_type_select(23, MCLGUI::s_menu_y + 12, mcl_cfg.track_type_select); } else { mcl_gui.draw_trigs(MCLGUI::s_menu_x + 4, MCLGUI::s_menu_y + 21, note_interface.notes_off | note_interface.notes_on ); @@ -114,33 +114,6 @@ bool GridSavePage::handleEvent(gui_event_t *event) { return true; } - if (note_interface.is_event(event)) { - uint8_t track = event->source - 128; - if (event->mask == EVENT_BUTTON_PRESSED) { - if (show_track_type) { - if (track < 4) { - TOGGLE_BIT16(mcl_cfg.track_type_select, track); - MD.set_trigleds(mcl_cfg.track_type_select, TRIGLED_EXCLUSIVE); - } - } else { - trig_interface.send_md_leds(TRIGLED_OVERLAY); - } - } else { - if (!show_track_type) { - trig_interface.send_md_leds(TRIGLED_OVERLAY); - if (note_interface.notes_all_off()) { - if (BUTTON_DOWN(Buttons.BUTTON2)) { - return true; - } else { - save(); - } - } - } - } - - return true; - } - if (EVENT_CMD(event)) { uint8_t key = event->source - 64; diff --git a/avr/cores/megacommand/MCL/GridSavePage.h b/avr/cores/megacommand/MCL/GridSavePage.h index 53bfba145..3113a8745 100644 --- a/avr/cores/megacommand/MCL/GridSavePage.h +++ b/avr/cores/megacommand/MCL/GridSavePage.h @@ -15,6 +15,7 @@ class GridSavePage : public GridIOPage { bool handleEvent(gui_event_t *event); void group_select(); void loop(); + void action() { save(); } void display(); void init(); void setup(); diff --git a/avr/cores/megacommand/MCL/MCLGUI.cpp b/avr/cores/megacommand/MCL/MCLGUI.cpp index 73d64f89f..b1193e17b 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.cpp +++ b/avr/cores/megacommand/MCL/MCLGUI.cpp @@ -659,7 +659,9 @@ void MCLGUI::draw_track_type_select(uint8_t x, uint8_t y, midi_active_peering.get_device(UART2_PORT), }; - for (uint8_t i = 0; i < 4; i++) { + for (uint8_t i = 0; i < 5; i++) { + + oled_display.setCursor(x, y); switch (i) { case 0: strcpy(dev, devs[0]->name); @@ -672,21 +674,23 @@ void MCLGUI::draw_track_type_select(uint8_t x, uint8_t y, } break; case 2: - strcpy(dev, "FX"); + strcpy(dev, "PF"); break; case 3: - strcpy(dev, "TEMPO"); + strcpy(dev, "FX"); + break; + case 4: + strcpy(dev, "TP"); break; } - oled_display.setCursor(x, y); oled_display.print(dev); if (IS_BIT_SET(track_type_select, i)) { oled_display.fillRect(x, y + 4, seq_w, trig_h, WHITE); } else { oled_display.drawRect(x, y + 4, seq_w, trig_h, WHITE); } - x += 16; + x += 18; } } diff --git a/avr/cores/megacommand/MCL/MidiDeviceGrid.h b/avr/cores/megacommand/MCL/MidiDeviceGrid.h index 37e678cab..5fa65027e 100644 --- a/avr/cores/megacommand/MCL/MidiDeviceGrid.h +++ b/avr/cores/megacommand/MCL/MidiDeviceGrid.h @@ -2,18 +2,22 @@ #include "Grid.h" -#define GROUP_DEV 0 -#define GROUP_AUX 1 -#define GROUP_TEMPO 2 #define EMPTY_TRACK_TYPE 0 +enum GridGroup { + GROUP_DEV, + GROUP_PERF, + GROUP_AUX, + GROUP_TEMPO, +}; + class SeqTrack; class GridDeviceTrack { public: uint8_t device_idx; uint8_t track_type; - uint8_t group_type; + GridGroup group_type; uint8_t mem_slot_idx; SeqTrack *seq_track; @@ -21,7 +25,7 @@ class GridDeviceTrack { init(); } - void init(uint8_t _track_type = EMPTY_TRACK_TYPE, uint8_t _group_type = GROUP_DEV, uint8_t _device_idx = 255, SeqTrack *_seq_track = nullptr, uint8_t _mem_slot_idx = 255) { + void init(uint8_t _track_type = EMPTY_TRACK_TYPE, GridGroup _group_type = GROUP_DEV, uint8_t _device_idx = 255, SeqTrack *_seq_track = nullptr, uint8_t _mem_slot_idx = 255) { track_type = _track_type; group_type = _group_type; mem_slot_idx = _mem_slot_idx; diff --git a/avr/cores/megacommand/MD/MD.cpp b/avr/cores/megacommand/MD/MD.cpp index 29f4bdda6..0b272e207 100644 --- a/avr/cores/megacommand/MD/MD.cpp +++ b/avr/cores/megacommand/MD/MD.cpp @@ -165,7 +165,7 @@ void MDClass::init_grid_devices(uint8_t device_idx) { gdt.init(MDTEMPO_TRACK_TYPE, GROUP_TEMPO, device_idx, (SeqTrack*) &(mcl_seq.aux_tracks[2]), 0); add_track_to_grid(grid_idx, MDFX_TRACK_NUM + 3, &gdt); - gdt.init(PERF_TRACK_TYPE, GROUP_AUX, device_idx, (SeqTrack*) &(mcl_seq.aux_tracks[3]), 0); + gdt.init(PERF_TRACK_TYPE, GROUP_PERF, device_idx, (SeqTrack*) &(mcl_seq.aux_tracks[3]), 0); add_track_to_grid(grid_idx, PERF_TRACK_NUM, &gdt); } From 68e4e941d4f86bad50414c6b62650d76a7a6a21b Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 8 Jul 2023 15:14:14 +1000 Subject: [PATCH 215/413] Related to --short-enum recompile --- avr/cores/megacommand/resources/R.h | 8 +- .../megacommand/resources/R_page_entries.cpp | 190 ++++++++---------- 2 files changed, 92 insertions(+), 106 deletions(-) diff --git a/avr/cores/megacommand/resources/R.h b/avr/cores/megacommand/resources/R.h index c053437a1..2fece7fcc 100644 --- a/avr/cores/megacommand/resources/R.h +++ b/avr/cores/megacommand/resources/R.h @@ -393,11 +393,11 @@ extern const unsigned char __R_page_entries[] PROGMEM; struct __T_page_entries { union { PageSelectEntry Entries[0]; - char zz__Entries[336]; + char zz__Entries[322]; }; - static constexpr size_t countof_Entries = 336 / sizeof(PageSelectEntry); - static constexpr size_t sizeofof_Entries = 336; - static constexpr size_t __total_size = 336; + static constexpr size_t countof_Entries = 322 / sizeof(PageSelectEntry); + static constexpr size_t sizeofof_Entries = 322; + static constexpr size_t __total_size = 322; }; extern const unsigned char __R_tuning[] PROGMEM; diff --git a/avr/cores/megacommand/resources/R_page_entries.cpp b/avr/cores/megacommand/resources/R_page_entries.cpp index 36fbf09ea..6a8bad035 100644 --- a/avr/cores/megacommand/resources/R_page_entries.cpp +++ b/avr/cores/megacommand/resources/R_page_entries.cpp @@ -7,7 +7,7 @@ const unsigned char __R_page_entries[] PROGMEM = { 68, 0, 18, - 94, + 78, 24, 15, 223, @@ -19,202 +19,188 @@ const unsigned char __R_page_entries[] PROGMEM = { 176, 82, 19, - 30, + 29, 3, - 0, 1, - 219, - 23, + 182, + 22, 16, - 7, - 109, + 6, + 219, 80, - 21, - 176, + 20, 70, - 43, - 62, + 96, + 42, + 123, 40, - 0, 2, - 219, - 23, + 22, + 109, 18, - 7, - 126, + 6, + 251, 82, 79, 85, 84, 69, - 192, - 23, - 110, + 22, + 1, + 203, 21, - 49, - 219, - 24, + 3, 14, - 7, + 109, + 6, 83, - 111, - 21, + 191, + 20, 80, 32, 69, - 236, 68, 73, + 176, 84, - 23, - 31, + 22, + 126, 7, - 0, 4, 1, - 219, 24, 21, - 7, + 222, + 6, 76, - 216, 70, 79, - 115, - 79, + 194, + 111, + 118, 22, - 0, 5, - 109, - 23, + 22, + 221, 24, - 223, - 95, + 91, 73, + 246, 65, 78, 79, 32, - 110, - 77, + 74, + 236, 76, 76, - 207, - 23, + 22, + 242, 8, - 0, - 150, 6, + 219, 25, - 221, - 7, + 6, 67, + 183, 72, - 191, - 19, + 18, 77, 65, + 236, 84, 73, 67, - 96, - 47, - 218, + 45, + 29, 9, - 73, - 199, - 23, + 7, + 143, + 22, 83, 65, - 253, 77, + 251, 80, 76, 69, 32, 77, - 187, - 53, + 51, + 119, 65, 71, - 176, - 237, + 169, + 247, 12, - 49, - 191, + 8, 2, - 23, + 22, + 255, 87, 65, - 255, 86, 32, 68, 69, 83, + 236, 73, 71, 78, - 103, - 198, + 190, + 246, 18, - 107, - 49, - 23, - 109, - 19, - 7, - 111, + 9, + 22, + 218, 19, + 6, + 222, + 18, 76, 65, 89, - 96, - 119, - 54, + 192, + 114, + 123, 16, - 49, - 223, + 12, 3, - 47, + 45, + 251, 82, - 219, 69, 86, - 40, + 38, + 108, 66, - 101, - 23, - 242, + 22, + 188, 17, - 0, 13, - 109, - 95, - 216, + 155, + 91, + 118, 45, 49, - 47, - 15, + 45, + 3, 23, - 0, + 178, 14, - 100, - 23, - 194, + 22, + 97, 50, - 51, - 7, - 0, - 177, - 15, - 23, + 39, + 9, + 98, + 22, 0, 0, 0, 0, 0, - 4, - 255, + 9, 255, }; From 5bf1318c8a6923a4db8319b59fa2866be8f8087e Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 8 Jul 2023 15:14:59 +1000 Subject: [PATCH 216/413] SampleBrowser cur_row when exiting SampleMgr --- avr/cores/megacommand/MCL/FileBrowserPage.cpp | 1 - avr/cores/megacommand/MCL/SampleBrowserPage.cpp | 16 ++++++++++------ avr/cores/megacommand/MCL/SampleBrowserPage.h | 7 ++++++- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/avr/cores/megacommand/MCL/FileBrowserPage.cpp b/avr/cores/megacommand/MCL/FileBrowserPage.cpp index 546e0c0da..7e85b6f50 100644 --- a/avr/cores/megacommand/MCL/FileBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/FileBrowserPage.cpp @@ -159,7 +159,6 @@ void FileBrowserPage::init() { draw_dirs = false; strcpy(focus_match, ""); file_types.reset(); - query_filesystem(); } void FileBrowserPage::draw_menu() { diff --git a/avr/cores/megacommand/MCL/SampleBrowserPage.cpp b/avr/cores/megacommand/MCL/SampleBrowserPage.cpp index 04cd7c08d..99f6d349d 100644 --- a/avr/cores/megacommand/MCL/SampleBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/SampleBrowserPage.cpp @@ -89,7 +89,7 @@ void SampleBrowserPage::display() { oled_display.display(); } -void SampleBrowserPage::init(uint8_t show_samplemgr_, bool query) { +void SampleBrowserPage::init(uint8_t show_samplemgr_) { FileBrowserPage::selection_change = true; file_types.reset(); file_types.add(c_wav_suffix); @@ -104,6 +104,7 @@ void SampleBrowserPage::init(uint8_t show_samplemgr_, bool query) { if (show_samplemgr) { strcpy(title, "MD-ROM"); + encoders[1] = &samplebrowser_param3; draw_dirs = false; show_dirs = false; show_save = false; @@ -113,16 +114,18 @@ void SampleBrowserPage::init(uint8_t show_samplemgr_, bool query) { query_sample_slots(); } else { strcpy(title, "SAMPLE"); + encoders[1] = &samplebrowser_param2; + if (old_cur_row != 255) { cur_row = old_cur_row; old_cur_row = 255;} draw_dirs = true; show_dirs = true; show_save = true; show_filemenu = true; show_new_folder = true; show_parent = true; - if (query) { + //if (query) { SD.chdir(lwd); query_filesystem(); - } + // } } } @@ -228,18 +231,16 @@ void SampleBrowserPage::on_select(const char *__) { init(true); } else { auto slot = encoders[1]->cur; - bool query = true; switch (pending_action) { case PA_NEW: recv_wav(slot); break; case PA_SELECT: send_sample(slot); - query = false; break; } pending_action = 0; - init(false, query); + init(false); } } @@ -267,6 +268,7 @@ bool SampleBrowserPage::handleEvent(gui_event_t *event) { void SampleBrowserPage::query_sample_slots() { encoders[1]->cur = 0; encoders[1]->old = 0; + old_cur_row = cur_row; numEntries = 0; cur_file = 255; // XXX why 255? cur_row = 0; @@ -407,4 +409,6 @@ void SampleBrowserPage::end() { MCLEncoder samplebrowser_param1(0, 1, ENCODER_RES_SYS); MCLEncoder samplebrowser_param2(0, 36, ENCODER_RES_SYS); +MCLEncoder samplebrowser_param3(0, 36, ENCODER_RES_SYS); + SampleBrowserPage sample_browser(&samplebrowser_param1, &samplebrowser_param2); diff --git a/avr/cores/megacommand/MCL/SampleBrowserPage.h b/avr/cores/megacommand/MCL/SampleBrowserPage.h index 5795d2f62..93fd6a1c4 100644 --- a/avr/cores/megacommand/MCL/SampleBrowserPage.h +++ b/avr/cores/megacommand/MCL/SampleBrowserPage.h @@ -26,13 +26,15 @@ class SampleBrowserPage : public FileBrowserPage, public MidiSysexListenerClass uint8_t pending_action = 0; bool show_ram_slots = false; + uint8_t old_cur_row = 255; + virtual void on_new(); virtual void on_select(const char*); virtual void on_cancel(); virtual bool handleEvent(gui_event_t *event); virtual void display(); - void init(uint8_t show_samplemgr_, bool query = true); + void init(uint8_t show_samplemgr_); virtual void init() { init(false); } void setup(); void send_sample(int slot, char *newname = nullptr, bool silent = false); @@ -45,6 +47,9 @@ class SampleBrowserPage : public FileBrowserPage, public MidiSysexListenerClass void query_sample_slots(); }; +extern MCLEncoder samplebrowser_param1; +extern MCLEncoder samplebrowser_param2; +extern MCLEncoder samplebrowser_param3; extern SampleBrowserPage sample_browser; #endif /* SAMPLEBROWSERPAGE_H__ */ From 25401f030e5f3a679d38ef899e5605e5d72f6b34 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 8 Jul 2023 15:18:14 +1000 Subject: [PATCH 217/413] edge case: clear pgm oneshot on event delete --- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index 441d98017..809d05020 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -901,6 +901,8 @@ bool ExtSeqTrack::del_track_locks(int16_t cur_x, uint8_t lock_idx, continue; int16_t event_x = n * timing_mid + events[i].micro_timing - timing_mid; if (event_x == cur_x || (event_x <= cur_x + r && event_x >= cur_x - r)) { + uint8_t param = locks_params[lock_idx] - 1; + if (param == PARAM_PRG) { pgm_oneshot = 0; } remove_event(i); ret = true; } From fc270e08644ae406f9e4f95b5b726fbc76fb358f Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 8 Jul 2023 22:45:48 +1000 Subject: [PATCH 218/413] Refactor for no longer needing lock_orig_params --- avr/cores/megacommand/Elektron/Elektron.cpp | 6 ++ avr/cores/megacommand/Elektron/Elektron.h | 1 + avr/cores/megacommand/MCL/MCL.h | 2 +- avr/cores/megacommand/MCL/MCLSeq.cpp | 14 +---- avr/cores/megacommand/MCL/MDSeqTrack.cpp | 68 ++------------------- avr/cores/megacommand/MCL/MDSeqTrack.h | 11 +--- avr/cores/megacommand/MCL/MDTrack.cpp | 1 - avr/cores/megacommand/MCL/MixerPage.cpp | 4 -- avr/cores/megacommand/MCL/RAMPage.cpp | 15 ++--- avr/cores/megacommand/MCL/SeqPtcPage.cpp | 4 -- avr/cores/megacommand/MCL/SeqStepPage.cpp | 7 --- avr/cores/megacommand/MD/MD.cpp | 6 -- avr/cores/megacommand/MD/MDSysex.cpp | 1 - 13 files changed, 23 insertions(+), 117 deletions(-) diff --git a/avr/cores/megacommand/Elektron/Elektron.cpp b/avr/cores/megacommand/Elektron/Elektron.cpp index 2c3b42cba..915c56cad 100644 --- a/avr/cores/megacommand/Elektron/Elektron.cpp +++ b/avr/cores/megacommand/Elektron/Elektron.cpp @@ -252,6 +252,12 @@ void ElektronDevice::undokit_sync() { sendRequest(data, sizeof(data)); } +void ElektronDevice::reset_dsp_params() { + uint8_t data[2] = { 0x70, 0x43 }; + sendRequest(data, sizeof(data)); +} + + void ElektronDevice::set_trigleds(uint16_t bitmask, TrigLEDMode mode, uint8_t blink) { uint8_t data[5] = {0x70, 0x35, 0x00, 0x00, 0x00}; diff --git a/avr/cores/megacommand/Elektron/Elektron.h b/avr/cores/megacommand/Elektron/Elektron.h index e09dd3d84..c89fa8d04 100644 --- a/avr/cores/megacommand/Elektron/Elektron.h +++ b/avr/cores/megacommand/Elektron/Elektron.h @@ -427,6 +427,7 @@ class ElektronDevice : public MidiDevice { void set_key_repeat(uint8_t mode); void undokit_sync(); + void reset_dsp_params(); /** * Send a sysex request to the device. All the request calls * are wrapped in appropriate methods like requestKit, diff --git a/avr/cores/megacommand/MCL/MCL.h b/avr/cores/megacommand/MCL/MCL.h index 6db36b133..4416f6ca6 100644 --- a/avr/cores/megacommand/MCL/MCL.h +++ b/avr/cores/megacommand/MCL/MCL.h @@ -17,7 +17,7 @@ #include "Fonts/TomThumb.h" #define VERSION 4050 -#define VERSION_STR "EE4.50" +#define VERSION_STR "FF4.50" #define CALLBACK_TIMEOUT 500 #define GUI_NAME_TIMEOUT 800 diff --git a/avr/cores/megacommand/MCL/MCLSeq.cpp b/avr/cores/megacommand/MCL/MCLSeq.cpp index cef605a74..270b8d9d6 100644 --- a/avr/cores/megacommand/MCL/MCLSeq.cpp +++ b/avr/cores/megacommand/MCL/MCLSeq.cpp @@ -75,9 +75,6 @@ void MCLSeq::disable() { } // restore kit params void MCLSeq::update_kit_params() { - for (uint8_t n = 0; n < NUM_MD_TRACKS; n++) { - mcl_seq.md_tracks[n].update_kit_params(); - } #ifdef LFO_TRACKS for (uint8_t n = 0; n < NUM_LFO_TRACKS; n++) { mcl_seq.lfo_tracks[n].update_kit_params(); @@ -85,9 +82,6 @@ void MCLSeq::update_kit_params() { #endif } void MCLSeq::update_params() { - for (uint8_t i = 0; i < num_md_tracks; i++) { - md_tracks[i].update_params(); - } #ifdef LFO_TRACKS for (uint8_t i = 0; i < num_lfo_tracks; i++) { lfo_tracks[i].update_params_offset(); @@ -152,10 +146,6 @@ void MCLSeq::onMidiStartImmediateCallback() { sei(); - for (uint8_t i = 0; i < num_md_tracks; i++) { - md_tracks[i].update_params(); - } - #ifdef LFO_TRACKS for (uint8_t i = 0; i < num_lfo_tracks; i++) { lfo_tracks[i].update_params_offset(); @@ -183,8 +173,9 @@ void MCLSeq::onMidiStopCallback() { } } #endif + MD.reset_dsp_params(); + for (uint8_t i = 0; i < num_md_tracks; i++) { - md_tracks[i].reset_params(); md_tracks[i].locks_slides_recalc = 255; for (uint8_t c = 0; c < NUM_LOCKS; c++) { md_tracks[i].locks_slide_data[c].init(); @@ -348,7 +339,6 @@ void MCLSeqMidiEvents::onControlChangeCallback_Midi(uint8_t *msg) { if (!update_params) { return; } - mcl_seq.md_tracks[track].update_param(track_param, value); for (uint8_t n = 0; n < mcl_seq.num_lfo_tracks; n++) { mcl_seq.lfo_tracks[n].check_and_update_params_offset(track + 1, track_param, value); diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.cpp b/avr/cores/megacommand/MCL/MDSeqTrack.cpp index 0743ca1e0..a59f05838 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/MDSeqTrack.cpp @@ -183,58 +183,6 @@ bool MDSeqTrack::is_param(uint8_t param_id) { return false; } -void MDSeqTrack::update_param(uint8_t param_id, uint8_t value) { - bool match = false; - for (uint8_t c = 0; c < NUM_LOCKS && match == false; c++) { - if (locks_params[c] > 0) { - if (locks_params[c] - 1 == param_id) { - locks_params_orig[c] = value; - match = true; - } - } - } -} - -void MDSeqTrack::update_kit_params() { - for (uint8_t c = 0; c < NUM_LOCKS; c++) { - if (locks_params[c] > 0) { - uint8_t param_id = locks_params[c] - 1; - MD.kit.params[track_number][param_id] = locks_params_orig[c]; - } - } -} - -void MDSeqTrack::update_params() { - for (uint8_t c = 0; c < NUM_LOCKS; c++) { - if (locks_params[c] > 0) { - uint8_t param_id = locks_params[c] - 1; - locks_params_orig[c] = MD.kit.params[track_number][param_id]; - } - } -} - -void MDSeqTrack::reset_params() { - MDTrack md_track; - - md_track.get_machine_from_kit(track_number); - bool re_assign = false; - for (uint8_t c = 0; c < NUM_LOCKS; c++) { - if (locks_params[c] > 0) { - uint8_t param = locks_params[c] - 1; - if (param > 23) { - DEBUG_PRINTLN("param out of bounds"); - return; - } - re_assign = true; - md_track.machine.params[param] = locks_params_orig[c]; - } - } - if (re_assign) { - DEBUG_PRINTLN("re-assign machine"); - MD.assignMachineBulk(track_number, &md_track.machine, 255, 1, true); - } -} - void MDSeqTrack::recalc_slides() { if (locks_slides_recalc == 255) { return; @@ -309,7 +257,7 @@ void MDSeqTrack::find_next_locks(uint8_t curidx, uint8_t step, uint8_t mask) { mask &= ~cur_mask; // all targets hit? } else if (steps[next_step].trig) { - locks_slide_next_lock_val[i] = locks_params_orig[i]; + locks_slide_next_lock_val[i] = MD.kit.params[track_number][locks_params[i] - 1]; locks_slide_next_lock_step[i] = next_step; mask &= ~cur_mask; } @@ -427,7 +375,7 @@ void MDSeqTrack::send_parameter_locks_inline(uint8_t step, bool trig, send_param = locks[lock_idx]; send = true; } else if (trig) { - send_param = locks_params_orig[c]; + send_param = MD.kit.params[track_number][locks_params[c] - 1]; send = true; } } @@ -576,7 +524,6 @@ bool MDSeqTrack::set_track_locks(uint8_t step, uint8_t track_param, for (uint8_t c = 0; c < NUM_LOCKS && match == 255; c++) { if (locks_params[c] == 0) { locks_params[c] = track_param + 1; - locks_params_orig[c] = MD.kit.params[track_number][track_param]; match = c; } } @@ -751,7 +698,7 @@ void MDSeqTrack::clear_param_locks(uint8_t param_id) { } } - MD.setTrackParam(track_number, param_id, locks_params_orig[match]); + MD.setTrackParam(track_number, param_id, MD.kit.params[track_number][locks_params[match] - 1]); } @@ -790,7 +737,7 @@ void MDSeqTrack::clear_conditional() { oneshot_mask = 0; } -void MDSeqTrack::clear_locks(bool reset_params_) { +void MDSeqTrack::clear_locks() { // Need to buffer this, as we dont want sequencer interrupt // to access it whilst we're cleaning up DEBUG_DUMP("Clear these locks"); @@ -799,17 +746,14 @@ void MDSeqTrack::clear_locks(bool reset_params_) { } memset(locks, 0, sizeof(locks)); - if (reset_params_) { - reset_params(); - } cur_event_idx = 0; } -void MDSeqTrack::clear_track(bool locks, bool reset_params_) { +void MDSeqTrack::clear_track(bool locks) { clear_conditional(); if (locks) { DEBUG_DUMP("clear locks"); - clear_locks(reset_params_); + clear_locks(); } memset(steps, 0, sizeof(steps)); } diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.h b/avr/cores/megacommand/MCL/MDSeqTrack.h index e239b2d14..f20365be1 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.h +++ b/avr/cores/megacommand/MCL/MDSeqTrack.h @@ -21,8 +21,6 @@ class MDSeqTrack : public MDSeqTrackData, public SeqSlideTrack { uint64_t oneshot_mask; - uint8_t locks_params_orig[NUM_LOCKS]; - static uint16_t gui_update; static uint16_t md_trig_mask; static uint32_t load_machine_cache; @@ -77,14 +75,11 @@ class MDSeqTrack : public MDSeqTrackData, public SeqSlideTrack { uint8_t get_step_locks(uint8_t step); void clear_conditional(); void clear_step_lock(uint8_t step, uint8_t param_id); - void clear_locks(bool reset_params_ = true); - void clear_track(bool locks = true, bool reset_params_ = true); + void clear_locks(); + void clear_track(bool locks = true); void clear_param_locks(uint8_t param_id); bool is_param(uint8_t param_id); - void update_kit_params(); - void update_params(); - void update_param(uint8_t param_id, uint8_t value); - void reset_params(); + void merge_from_md(uint8_t track_number, MDPattern *pattern); void set_length(uint8_t len, bool expand = false); diff --git a/avr/cores/megacommand/MCL/MDTrack.cpp b/avr/cores/megacommand/MCL/MDTrack.cpp index 054e935c7..fef7dbca2 100644 --- a/avr/cores/megacommand/MCL/MDTrack.cpp +++ b/avr/cores/megacommand/MCL/MDTrack.cpp @@ -115,7 +115,6 @@ void MDTrack::load_seq_data(SeqTrack *seq_track) { load_link_data(seq_track); md_seq_track->oneshot_mask = 0; md_seq_track->set_length(md_seq_track->length); - md_seq_track->update_params(); } void MDTrack::scale_seq_vol(float scale) { diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index eb7085f6e..51e130a27 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -501,7 +501,6 @@ bool MixerPage::handleEvent(gui_event_t *event) { for (uint8_t c = 0; c < 24; c++) { MD.restore_kit_param(i, c); } - mcl_seq.md_tracks[i].update_params(); } } } @@ -693,9 +692,6 @@ void MixerPage::onControlChangeCallback_Midi(uint8_t track, uint8_t track_param, for (int i = 0; i < 16; i++) { if (note_interface.is_note_on(i) && (i != track)) { MD.setTrackParam(i, track_param, value, nullptr, true); - if (track_param < 24) { - mcl_seq.md_tracks[i].update_param(track_param, value); - } SET_BIT16(mixer_page.redraw_mask, i); } } diff --git a/avr/cores/megacommand/MCL/RAMPage.cpp b/avr/cores/megacommand/MCL/RAMPage.cpp index 6d1f8ff41..6412d96d7 100644 --- a/avr/cores/megacommand/MCL/RAMPage.cpp +++ b/avr/cores/megacommand/MCL/RAMPage.cpp @@ -83,9 +83,8 @@ void RAMPage::setup_ram_rec(uint8_t track, uint8_t model, uint8_t lev, MDTrack md_track; MDSeqTrack md_seq_track; bool clear_locks = true; - bool send_params = false; - md_seq_track.clear_track(clear_locks, send_params); + md_seq_track.clear_track(clear_locks); md_track.machine.init(); @@ -194,11 +193,10 @@ bool RAMPage::slice(uint8_t track, uint8_t linked_track) { uint8_t track_length = encoders[3]->cur * 4; uint8_t step_inc = track_length / slices; bool clear_locks = true; - bool send_params = false; auto &trk = mcl_seq.md_tracks[track]; auto &ln_trk = mcl_seq.md_tracks[linked_track]; - trk.clear_track(clear_locks, send_params); + trk.clear_track(clear_locks); trk.locks_params[0] = ROM_STRT + 1; trk.locks_params[1] = ROM_END + 1; @@ -284,12 +282,10 @@ void RAMPage::setup_ram_play(uint8_t track, uint8_t model, uint8_t pan, MDSeqTrack md_seq_track; bool clear_locks = true; - bool send_params = false; - md_seq_track.clear_track(clear_locks, send_params); + md_seq_track.clear_track(clear_locks); - mcl_seq.md_tracks[track].clear_track( - clear_locks, send_params); // make sure current track does not retrigger + mcl_seq.md_tracks[track].clear_track(clear_locks); // make sure current track does not retrigger md_track.machine.init(); @@ -659,9 +655,6 @@ void RAMPage::onControlChangeCallback_Midi(uint8_t *msg) { } */ } else { - if (track_param < 24) { - mcl_seq.md_tracks[n].update_param(track_param, value); - } MD.setTrackParam(n, track_param, value, nullptr, true); } } diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.cpp b/avr/cores/megacommand/MCL/SeqPtcPage.cpp index 3b4df695b..ce6fc07e5 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPtcPage.cpp @@ -880,9 +880,6 @@ void SeqPtcMidiEvents::onControlChangeCallback_Midi2(uint8_t *msg) { if (channel_event == POLY_EVENT) { for (uint8_t n = 0; n < NUM_MD_TRACKS; n++) { if (IS_BIT_SET16(mcl_cfg.poly_mask, n)) { - if (track_param < 24) { - mcl_seq.md_tracks[n].update_param(param - 16, value); - } MD.setTrackParam(n, param - 16, value, nullptr, true); } } @@ -1023,7 +1020,6 @@ void SeqPtcMidiEvents::onControlChangeCallback_Midi(uint8_t *msg) { if (IS_BIT_SET16(mcl_cfg.poly_mask, n) && (n != track)) { if ((track_param < 24 && track_param > 7) || (track_param < 8 && MD.kit.models[n] == MD.kit.models[track])) { - mcl_seq.md_tracks[n].update_param(track_param, value); MD.setTrackParam(n, track_param, value, nullptr, true); display_polylink = 1; } diff --git a/avr/cores/megacommand/MCL/SeqStepPage.cpp b/avr/cores/megacommand/MCL/SeqStepPage.cpp index c62805024..85c513db7 100644 --- a/avr/cores/megacommand/MCL/SeqStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqStepPage.cpp @@ -275,10 +275,6 @@ void SeqStepPage::loop() { update_params_clock = slowclock; note_interface.init_notes(); - if (reset_on_release) { - active_track.reset_params(); - reset_on_release = false; - } } MidiUartParent::handle_midi_lock = _midi_lock_tmp; } @@ -697,9 +693,6 @@ void SeqStepMidiEvents::onControlChangeCallback_Midi(uint8_t *msg) { } seq_step_page.config_encoders(); - mcl_seq.md_tracks[track].update_param(track_param, value); - - MD.kit.params[track][track_param] = value; mcl_seq.md_tracks[track].record_track_locks(track_param, value); return; } diff --git a/avr/cores/megacommand/MD/MD.cpp b/avr/cores/megacommand/MD/MD.cpp index 0b272e207..65c5c5585 100644 --- a/avr/cores/megacommand/MD/MD.cpp +++ b/avr/cores/megacommand/MD/MD.cpp @@ -359,9 +359,6 @@ void MDClass::parallelTrig(uint16_t mask, MidiUartParent *uart_) { void MDClass::restore_kit_params() { memcpy(kit.params, kit.params_orig, sizeof(kit.params)); - for (uint8_t n = 0; n < NUM_MD_TRACKS; n++) { - mcl_seq.md_tracks[n].update_params(); - } for (uint8_t n = 0; n < mcl_seq.num_lfo_tracks; n++) { mcl_seq.lfo_tracks[n].update_params_offset(); } @@ -1164,9 +1161,6 @@ void MDClass::updateKitParams() { for (uint8_t n = 0; n < NUM_MD_TRACKS; n++) { old_mutes[n] = mcl_seq.md_tracks[n].mute_state; mcl_seq.md_tracks[n].mute_state = SEQ_MUTE_ON; - mcl_seq.md_tracks[n].update_kit_params(); - //Perform silent reset, to prevent MDkit copying running parameter locks in to undo kit - mcl_seq.md_tracks[n].reset_params(); } undokit_sync(); diff --git a/avr/cores/megacommand/MD/MDSysex.cpp b/avr/cores/megacommand/MD/MDSysex.cpp index 4421ef5b1..0e0bbb55e 100644 --- a/avr/cores/megacommand/MD/MDSysex.cpp +++ b/avr/cores/megacommand/MD/MDSysex.cpp @@ -100,7 +100,6 @@ void MDSysexListenerClass::end() { //LFOS, LFOD, LFOM if (4 < param && param < 8) { - mcl_seq.md_tracks[track].update_param(param + 16, value); MD.kit.params[track][param + 16] = value; for (uint8_t n = 0; n < mcl_seq.num_lfo_tracks; n++) { mcl_seq.lfo_tracks[n].check_and_update_params_offset(track + 1, param + 16, value); From ac4416ad237f32000f30f69813198305a44520bc Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 8 Jul 2023 23:10:32 +1000 Subject: [PATCH 219/413] LFOTrack spec changed --- avr/cores/megacommand/MCL/LFOSeqTrack.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/avr/cores/megacommand/MCL/LFOSeqTrack.h b/avr/cores/megacommand/MCL/LFOSeqTrack.h index 6196dfed4..472b77516 100644 --- a/avr/cores/megacommand/MCL/LFOSeqTrack.h +++ b/avr/cores/megacommand/MCL/LFOSeqTrack.h @@ -40,6 +40,8 @@ class LFOSeqTrackData { LFOSeqParam params[NUM_LFO_PARAMS]; uint8_t wav_type; + uint8_t wav_table[NUM_LFO_PARAMS][WAV_LENGTH];// <--- remove + bool wav_table_state[NUM_LFO_PARAMS]; // <---- remove uint8_t last_wav_value[NUM_LFO_PARAMS]; uint8_t sample_hold; //<--- shouldnt be stored here; From 1e4e8807291780089b62d78ad3f6f6f8705b72c9 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 8 Jul 2023 23:24:00 +1000 Subject: [PATCH 220/413] Refactor LFOs for no longer needing lock_orig_params --- avr/cores/megacommand/MCL/FXPage.cpp | 5 -- avr/cores/megacommand/MCL/LFOPage.cpp | 13 ---- avr/cores/megacommand/MCL/LFOSeqTrack.cpp | 77 +++-------------------- avr/cores/megacommand/MCL/LFOSeqTrack.h | 14 +---- avr/cores/megacommand/MCL/MCLSeq.cpp | 16 ----- avr/cores/megacommand/MD/MD.cpp | 6 -- avr/cores/megacommand/MD/MDSysex.cpp | 7 --- 7 files changed, 11 insertions(+), 127 deletions(-) diff --git a/avr/cores/megacommand/MCL/FXPage.cpp b/avr/cores/megacommand/MCL/FXPage.cpp index 9d9f42914..eb56fc0a1 100644 --- a/avr/cores/megacommand/MCL/FXPage.cpp +++ b/avr/cores/megacommand/MCL/FXPage.cpp @@ -79,11 +79,6 @@ void FXPage::loop() { MD.kit.eq[fx_param] = encoders[i]->cur; break; } - for (uint8_t n = 0; n < mcl_seq.num_lfo_tracks; n++) { - mcl_seq.lfo_tracks[n].check_and_update_params_offset( - NUM_MD_TRACKS + 1 + fx_type - MD_FX_ECHO, fx_param, - encoders[i]->cur); - } } } } diff --git a/avr/cores/megacommand/MCL/LFOPage.cpp b/avr/cores/megacommand/MCL/LFOPage.cpp index 74cecba81..13b82e58f 100644 --- a/avr/cores/megacommand/MCL/LFOPage.cpp +++ b/avr/cores/megacommand/MCL/LFOPage.cpp @@ -12,8 +12,6 @@ void LFOPage::setup() { // lfo_track = &mcl_seq.lfo_tracks[0]; - lfo_track->params[0].update_offset(); - lfo_track->params[1].update_offset(); DEBUG_PRINT_FN(); } @@ -96,38 +94,30 @@ void LFOPage::loop() { if (encoders[0]->hasChanged()) { USE_LOCK(); SET_LOCK(); - lfo_track->params[0].reset_param_offset(); lfo_track->params[0].dest = encoders[0]->cur; - lfo_track->params[0].update_offset(); CLEAR_LOCK(); } if (encoders[1]->hasChanged()) { USE_LOCK(); SET_LOCK(); - lfo_track->params[0].reset_param_offset(); lfo_track->params[0].param = encoders[1]->cur; // lfo_track->params[0].offset = lfo_track->params[0].get_param_offset( // encoders[0]->cur, encoders[1]->cur); - lfo_track->params[0].update_offset(); CLEAR_LOCK(); } if (encoders[2]->hasChanged()) { USE_LOCK(); SET_LOCK(); - lfo_track->params[1].reset_param_offset(); lfo_track->params[1].dest = encoders[2]->cur; - lfo_track->params[1].update_offset(); CLEAR_LOCK(); } if (encoders[3]->hasChanged()) { USE_LOCK(); SET_LOCK(); - lfo_track->params[1].reset_param_offset(); lfo_track->params[1].param = encoders[3]->cur; // lfo_track->params[1].offset = lfo_track->params[1].get_param_offset( // encoders[2]->cur, encoders[3]->cur); - lfo_track->params[1].update_offset(); CLEAR_LOCK(); } } @@ -315,9 +305,6 @@ bool LFOPage::handleEvent(gui_event_t *event) { } if (EVENT_PRESSED(event, Buttons.BUTTON1)) { - if (lfo_track->enable) { - lfo_track->reset_params_offset(); - } lfo_track->enable = !(lfo_track->enable); } return false; diff --git a/avr/cores/megacommand/MCL/LFOSeqTrack.cpp b/avr/cores/megacommand/MCL/LFOSeqTrack.cpp index 61d463e0d..50576626c 100644 --- a/avr/cores/megacommand/MCL/LFOSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/LFOSeqTrack.cpp @@ -59,8 +59,8 @@ int16_t LFOSeqTrack::get_sample(uint8_t n) { return out; } -uint8_t LFOSeqTrack::get_wav_value(uint8_t sample_count, uint8_t param) { - int8_t offset = params[param].offset; +uint8_t LFOSeqTrack::get_wav_value(uint8_t sample_count, uint8_t dest, uint8_t param) { + int8_t offset = get_param_offset(dest, param); int16_t depth = params[param].depth; int16_t sample = ((get_sample(sample_count) * depth) / 128) + offset; @@ -81,9 +81,9 @@ void LFOSeqTrack::seq(MidiUartParent *uart_) { } if (enable) { for (uint8_t i = 0; i < NUM_LFO_PARAMS; i++) { - uint8_t wav_value = get_wav_value(sample_count, i); + uint8_t dest = params[i].dest - 1; + uint8_t wav_value = get_wav_value(sample_count, dest, i); if (last_wav_value[i] != wav_value) { - uint8_t dest = params[i].dest - 1; uint8_t param = params[i].param; if (dest >= NUM_MD_TRACKS + 4) { @@ -140,72 +140,11 @@ void LFOSeqTrack::seq(MidiUartParent *uart_) { uart = uart_old; } -void LFOSeqTrack::check_and_update_params_offset(uint8_t track, uint8_t dest, - uint8_t value) { - for (uint8_t n = 0; n < NUM_LFO_PARAMS; n++) { - if ((params[n].dest == track) && (params[n].param == dest)) { - params[n].offset = value; - } - } -} - -void LFOSeqTrack::reset_params_offset() { - if (enable) { - for (uint8_t n = 0; n < NUM_LFO_PARAMS; n++) { - params[n].reset_param_offset(); - } - } -} - -void LFOSeqTrack::update_params_offset() { - for (uint8_t n = 0; n < NUM_LFO_PARAMS; n++) { - params[n].update_offset(); - } -} - -void LFOSeqTrack::update_kit_params() { - for (uint8_t n = 0; n < NUM_LFO_PARAMS; n++) { - params[n].update_kit(); - } -} - -void LFOSeqParam::update_kit() { - if (dest <= NUM_MD_TRACKS) { - MD.kit.params[dest - 1][param] = offset; - } else { - switch (dest - NUM_MD_TRACKS - 1) { - case MD_FX_ECHO - MD_FX_ECHO: - MD.kit.delay[param] = offset; - break; - case MD_FX_DYN - MD_FX_ECHO: - MD.kit.dynamics[param] = offset; - break; - case MD_FX_REV - MD_FX_ECHO: - MD.kit.reverb[param] = offset; - break; - case MD_FX_EQ - MD_FX_ECHO: - MD.kit.eq[param] = offset; - break; - } - } -} - -void LFOSeqParam::update_offset() { offset = get_param_offset(dest, param); } -void LFOSeqParam::reset_param_offset() { reset_param(dest, param, offset); } - -void LFOSeqParam::reset_param(uint8_t dest, uint8_t param, uint8_t value) { - if (dest <= NUM_MD_TRACKS) { - MD.setTrackParam(dest - 1, param, value); - } else { - MD.sendFXParam(param, value, MD_FX_ECHO + dest - NUM_MD_TRACKS - 1); - } -} - -uint8_t LFOSeqParam::get_param_offset(uint8_t dest, uint8_t param) { - if (dest <= NUM_MD_TRACKS) { - return MD.kit.params[dest - 1][param]; +uint8_t LFOSeqTrack::get_param_offset(uint8_t dest, uint8_t param) { + if (dest < NUM_MD_TRACKS) { + return MD.kit.params[dest][param]; } else { - switch (dest - NUM_MD_TRACKS - 1) { + switch (dest - NUM_MD_TRACKS) { case MD_FX_ECHO - MD_FX_ECHO: return MD.kit.delay[param]; break; diff --git a/avr/cores/megacommand/MCL/LFOSeqTrack.h b/avr/cores/megacommand/MCL/LFOSeqTrack.h index 472b77516..c2eae775e 100644 --- a/avr/cores/megacommand/MCL/LFOSeqTrack.h +++ b/avr/cores/megacommand/MCL/LFOSeqTrack.h @@ -28,11 +28,6 @@ class LFOSeqParam { uint8_t depth; uint8_t offset; - uint8_t get_param_offset(uint8_t dest, uint8_t param); - void reset_param(uint8_t dest, uint8_t param, uint8_t value); - void reset_param_offset(); - void update_offset(); - void update_kit(); }; class LFOSeqTrackData { @@ -46,6 +41,7 @@ class LFOSeqTrackData { uint8_t last_wav_value[NUM_LFO_PARAMS]; uint8_t sample_hold; //<--- shouldnt be stored here; + uint8_t speed; uint8_t mode; uint8_t offset_behaviour; //<--- no longer needed @@ -82,13 +78,9 @@ class LFOSeqTrack : public LFOSeqTrackData { void load_tables(); - ALWAYS_INLINE() uint8_t get_wav_value(uint8_t sample_count, uint8_t param); - void update_kit_params(); - void update_params_offset(); - void reset_params_offset(); + uint8_t get_param_offset(uint8_t dest, uint8_t param); + ALWAYS_INLINE() uint8_t get_wav_value(uint8_t sample_count, uint8_t dest, uint8_t param); - void check_and_update_params_offset(uint8_t dest, uint8_t param, - uint8_t value); void set_wav_type(uint8_t _wav_type) { wav_type = _wav_type; } diff --git a/avr/cores/megacommand/MCL/MCLSeq.cpp b/avr/cores/megacommand/MCL/MCLSeq.cpp index 270b8d9d6..78cfbac69 100644 --- a/avr/cores/megacommand/MCL/MCLSeq.cpp +++ b/avr/cores/megacommand/MCL/MCLSeq.cpp @@ -76,16 +76,10 @@ void MCLSeq::disable() { // restore kit params void MCLSeq::update_kit_params() { #ifdef LFO_TRACKS - for (uint8_t n = 0; n < NUM_LFO_TRACKS; n++) { - mcl_seq.lfo_tracks[n].update_kit_params(); - } #endif } void MCLSeq::update_params() { #ifdef LFO_TRACKS - for (uint8_t i = 0; i < num_lfo_tracks; i++) { - lfo_tracks[i].update_params_offset(); - } #endif } @@ -147,9 +141,6 @@ void MCLSeq::onMidiStartImmediateCallback() { sei(); #ifdef LFO_TRACKS - for (uint8_t i = 0; i < num_lfo_tracks; i++) { - lfo_tracks[i].update_params_offset(); - } #endif seq_rec_play(); @@ -182,9 +173,6 @@ void MCLSeq::onMidiStopCallback() { } } #ifdef LFO_TRACKS - for (uint8_t i = 0; i < num_lfo_tracks; i++) { - lfo_tracks[i].reset_params_offset(); - } #endif } @@ -339,10 +327,6 @@ void MCLSeqMidiEvents::onControlChangeCallback_Midi(uint8_t *msg) { if (!update_params) { return; } - for (uint8_t n = 0; n < mcl_seq.num_lfo_tracks; n++) { - mcl_seq.lfo_tracks[n].check_and_update_params_offset(track + 1, track_param, - value); - } } diff --git a/avr/cores/megacommand/MD/MD.cpp b/avr/cores/megacommand/MD/MD.cpp index 65c5c5585..582de5b1d 100644 --- a/avr/cores/megacommand/MD/MD.cpp +++ b/avr/cores/megacommand/MD/MD.cpp @@ -359,17 +359,11 @@ void MDClass::parallelTrig(uint16_t mask, MidiUartParent *uart_) { void MDClass::restore_kit_params() { memcpy(kit.params, kit.params_orig, sizeof(kit.params)); - for (uint8_t n = 0; n < mcl_seq.num_lfo_tracks; n++) { - mcl_seq.lfo_tracks[n].update_params_offset(); - } } void MDClass::restore_kit_param(uint8_t track, uint8_t param) { if (MD.kit.params[track][param] != MD.kit.params_orig[track][param]) { MD.setTrackParam(track, param, MD.kit.params_orig[track][param], nullptr, true); - for (uint8_t n = 0; n < mcl_seq.num_lfo_tracks; n++) { - mcl_seq.lfo_tracks[n].check_and_update_params_offset(track + 1, param, MD.kit.params_orig[track][param]); - } } } diff --git a/avr/cores/megacommand/MD/MDSysex.cpp b/avr/cores/megacommand/MD/MDSysex.cpp index 0e0bbb55e..d63b00242 100644 --- a/avr/cores/megacommand/MD/MDSysex.cpp +++ b/avr/cores/megacommand/MD/MDSysex.cpp @@ -80,10 +80,6 @@ void MDSysexListenerClass::end() { perf_page.learn_param(fx_type + 16, param, value); - for (uint8_t n = 0; n < mcl_seq.num_lfo_tracks; n++) { - mcl_seq.lfo_tracks[n].check_and_update_params_offset(17 + fx_type, param, value); - } - break; case MD_SET_LFO_PARAM_ID: @@ -101,9 +97,6 @@ void MDSysexListenerClass::end() { //LFOS, LFOD, LFOM if (4 < param && param < 8) { MD.kit.params[track][param + 16] = value; - for (uint8_t n = 0; n < mcl_seq.num_lfo_tracks; n++) { - mcl_seq.lfo_tracks[n].check_and_update_params_offset(track + 1, param + 16, value); - } } break; From ba7d313908855e5461d94ebee8595e3862465c03 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 9 Jul 2023 21:02:02 +1000 Subject: [PATCH 221/413] PerfTrack stores MuteSets. Current mute set is 255 to begin with --- avr/cores/megacommand/MCL/MCL.h | 2 +- avr/cores/megacommand/MCL/MCLMemory.h | 2 +- avr/cores/megacommand/MCL/MCLSeq.cpp | 66 +++++++++++++++---------- avr/cores/megacommand/MCL/MixerPage.cpp | 33 +++++++------ avr/cores/megacommand/MCL/MixerPage.h | 10 +++- avr/cores/megacommand/MCL/PerfTrack.cpp | 3 +- avr/cores/megacommand/MCL/PerfTrack.h | 3 ++ 7 files changed, 72 insertions(+), 47 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCL.h b/avr/cores/megacommand/MCL/MCL.h index 4416f6ca6..3f9867bf9 100644 --- a/avr/cores/megacommand/MCL/MCL.h +++ b/avr/cores/megacommand/MCL/MCL.h @@ -17,7 +17,7 @@ #include "Fonts/TomThumb.h" #define VERSION 4050 -#define VERSION_STR "FF4.50" +#define VERSION_STR "GG4.50" #define CALLBACK_TIMEOUT 500 #define GUI_NAME_TIMEOUT 800 diff --git a/avr/cores/megacommand/MCL/MCLMemory.h b/avr/cores/megacommand/MCL/MCLMemory.h index 5efc2eb78..3caa00732 100644 --- a/avr/cores/megacommand/MCL/MCLMemory.h +++ b/avr/cores/megacommand/MCL/MCLMemory.h @@ -74,7 +74,7 @@ constexpr size_t MDLFO_TRACK_LEN = 226; constexpr size_t MDROUTE_TRACK_LEN = 25; constexpr size_t MDFX_TRACK_LEN = 43; constexpr size_t MDTEMPO_TRACK_LEN = 11; -constexpr size_t PERF_TRACK_LEN = 459; +constexpr size_t PERF_TRACK_LEN = 475; constexpr size_t GRIDCHAIN_TRACK_LEN = 551; //Use these to produce compiler errors that probes the sizes! diff --git a/avr/cores/megacommand/MCL/MCLSeq.cpp b/avr/cores/megacommand/MCL/MCLSeq.cpp index 78cfbac69..56872bda7 100644 --- a/avr/cores/megacommand/MCL/MCLSeq.cpp +++ b/avr/cores/megacommand/MCL/MCLSeq.cpp @@ -49,8 +49,8 @@ void MCLSeq::setup() { MidiClock.addOnMidiStopCallback( this, (midi_clock_callback_ptr_t)&MCLSeq::onMidiStopCallback); -// MidiClock.addOnMidiStartCallback( -// this, (midi_clock_callback_ptr_t)&MCLSeq::onMidiStartCallback); + // MidiClock.addOnMidiStartCallback( + // this, (midi_clock_callback_ptr_t)&MCLSeq::onMidiStartCallback); MidiClock.addOnMidiStartImmediateCallback( this, (midi_clock_callback_ptr_t)&MCLSeq::onMidiStartImmediateCallback); @@ -150,8 +150,7 @@ void MCLSeq::onMidiStartImmediateCallback() { } } -void MCLSeq::onMidiStartCallback() { -} +void MCLSeq::onMidiStartCallback() {} void MCLSeq::onMidiStopCallback() { #ifdef EXT_TRACKS @@ -309,14 +308,25 @@ void MCLSeqMidiEvents::onControlChangeCallback_Midi(uint8_t *msg) { uint8_t track_param; MD.parseCC(channel, param, &track, &track_param); - if (track > 15) { return; } + if (track > 15) { + return; + } - if (mcl.currentPage() == MIXER_PAGE) { mixer_page.onControlChangeCallback_Midi(track, track_param, value); } + if (mcl.currentPage() == MIXER_PAGE) { + mixer_page.onControlChangeCallback_Midi(track, track_param, value); + } if (track_param == 32) { // Mute mcl_seq.md_tracks[track].mute_state = value > 0; - if (value > 0) { CLEAR_BIT16(mixer_page.mute_sets[0][mixer_page.current_mute_set], track); } - else { SET_BIT16(mixer_page.mute_sets[0][mixer_page.current_mute_set], track); } + if (mixer_page.current_mute_set != 255) { + if (value > 0) { + CLEAR_BIT16(mixer_page.mute_sets[0].mutes[mixer_page.current_mute_set], + track); + } else { + SET_BIT16(mixer_page.mute_sets[0].mutes[mixer_page.current_mute_set], + track); + } + } } if (track_param > 23) { return; @@ -327,7 +337,6 @@ void MCLSeqMidiEvents::onControlChangeCallback_Midi(uint8_t *msg) { if (!update_params) { return; } - } void MCLSeqMidiEvents::onControlChangeCallback_Midi2(uint8_t *msg) { @@ -336,21 +345,24 @@ void MCLSeqMidiEvents::onControlChangeCallback_Midi2(uint8_t *msg) { uint8_t value = msg[2]; if (param == midi_active_peering.get_device(UART2_PORT)->get_mute_cc()) { - for (uint8_t n = 0; n < NUM_EXT_TRACKS; n++) { - if (mcl_seq.ext_tracks[n].channel == channel) { - if (value > 0) { - CLEAR_BIT16(mixer_page.mute_sets[1][mixer_page.current_mute_set], n); - mcl_seq.ext_tracks[n].mute_state = SEQ_MUTE_ON; - mcl_seq.ext_tracks[n].buffer_notesoff(); - } else { - SET_BIT16(mixer_page.mute_sets[1][mixer_page.current_mute_set], n); - mcl_seq.ext_tracks[n].mute_state = SEQ_MUTE_OFF; - } + for (uint8_t n = 0; n < NUM_EXT_TRACKS; n++) { + if (mcl_seq.ext_tracks[n].channel != channel) { + continue; + } + mcl_seq.ext_tracks[n].mute_state = value > 0; + if (mixer_page.current_mute_set == 255) { + continue; + } + if (value > 0) { + CLEAR_BIT16( + mixer_page.mute_sets[1].mutes[mixer_page.current_mute_set], n); + mcl_seq.ext_tracks[n].buffer_notesoff(); } else { - mcl_seq.ext_tracks[n].update_param(param, value); + SET_BIT16( + mixer_page.mute_sets[1].mutes[mixer_page.current_mute_set], n); } } - return; + return; } perf_page.learn_param(channel + 16 + 4, param, value); @@ -360,13 +372,13 @@ void MCLSeqMidiEvents::setup_callbacks() { if (state) { return; } - + Midi.addOnNoteOnCallback( this, (midi_callback_ptr_t)&MCLSeqMidiEvents::onNoteOnCallback_Midi); - /* - Midi.addOnNoteOffCallback( - this, (midi_callback_ptr_t)&MCLSeqMidiEvents::onNoteOffCallback_Midi); - */ + /* + Midi.addOnNoteOffCallback( + this, (midi_callback_ptr_t)&MCLSeqMidiEvents::onNoteOffCallback_Midi); + */ update_params = true; Midi.addOnControlChangeCallback( this, @@ -384,7 +396,7 @@ void MCLSeqMidiEvents::remove_callbacks() { if (!state) { return; } - + Midi.removeOnNoteOnCallback( this, (midi_callback_ptr_t)&MCLSeqMidiEvents::onNoteOnCallback_Midi); /* diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 51e130a27..84118ff05 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -24,7 +24,7 @@ void MixerPage::oled_draw_mutes() { uint8_t mute_state = preview_mute_set != 255 - ? IS_BIT_SET16(mute_sets[!is_md_device][preview_mute_set], i) + ? IS_BIT_SET16(mute_sets[!is_md_device].mutes[preview_mute_set], i) : seq_track->mute_state == SEQ_MUTE_OFF; // if (note_interface.is_note(i)) { @@ -236,17 +236,17 @@ void MixerPage::display() { uint8_t *levels = is_md_device ? disp_levels : ext_disp_levels; if (preview_mute_set != 255) { - if (mute_sets[!is_md_device][preview_mute_set] != seq_step_page.mute_mask) { - seq_step_page.mute_mask = mute_sets[!is_md_device][preview_mute_set]; - MD.set_trigleds(mute_sets[!is_md_device][preview_mute_set], + if (mute_sets[!is_md_device].mutes[preview_mute_set] != seq_step_page.mute_mask) { + seq_step_page.mute_mask = mute_sets[!is_md_device].mutes[preview_mute_set]; + MD.set_trigleds(mute_sets[!is_md_device].mutes[preview_mute_set], TRIGLED_EXCLUSIVE); oled_draw_mutes(); } } else if (show_mixer_menu && seq_step_page.display_mute_mask(midi_device)) { oled_draw_mutes(); - } else if (mute_sets[!is_md_device][current_mute_set] != + } else if (current_mute_set != 255 && mute_sets[!is_md_device].mutes[current_mute_set] != seq_step_page.mute_mask) { - seq_step_page.mute_mask = mute_sets[!is_md_device][current_mute_set]; + seq_step_page.mute_mask = mute_sets[!is_md_device].mutes[current_mute_set]; oled_draw_mutes(); } @@ -340,6 +340,7 @@ void MixerPage::disable_record_mutes() { } void MixerPage::populate_mute_set() { + if (current_mute_set == 255) { return; } for (uint8_t dev = 0; dev < 2; dev++) { uint8_t len = (dev == 0) ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; @@ -348,9 +349,9 @@ void MixerPage::populate_mute_set() { SeqTrack *seq_track = (dev == 0) ? (SeqTrack *)&mcl_seq.md_tracks[n] : (SeqTrack *)&mcl_seq.ext_tracks[n]; if (seq_track->mute_state == SEQ_MUTE_ON) { - CLEAR_BIT16(mute_sets[dev][current_mute_set], n); + CLEAR_BIT16(mute_sets[dev].mutes[current_mute_set], n); } else { - SET_BIT16(mute_sets[dev][current_mute_set], n); + SET_BIT16(mute_sets[dev].mutes[current_mute_set], n); } } } @@ -377,7 +378,7 @@ void MixerPage::switch_mute_set(uint8_t state) { SeqTrack *seq_track = (dev == 0) ? (SeqTrack *)&mcl_seq.md_tracks[n] : (SeqTrack *)&mcl_seq.ext_tracks[n]; - if (IS_BIT_CLEAR16(mute_sets[dev][state], n)) { + if (IS_BIT_CLEAR16(mute_sets[dev].mutes[state], n)) { if (seq_track->mute_state == SEQ_MUTE_OFF) { seq_track->toggle_mute(); devs[dev]->muteTrack(n, SEQ_MUTE_ON); @@ -432,6 +433,7 @@ bool MixerPage::handleEvent(gui_event_t *event) { : (SeqTrack *)&mcl_seq.ext_tracks[track]; uint8_t mute_set = current_mute_set; + if (current_mute_set == 255) { return; } uint8_t state = 0; if (preview_mute_set == 255 || preview_mute_set == current_mute_set) { @@ -444,13 +446,13 @@ bool MixerPage::handleEvent(gui_event_t *event) { } else { update_mute_set: mute_set = preview_mute_set; - state = IS_BIT_SET16(mute_sets[!is_md_device][mute_set], track); + state = IS_BIT_SET16(mute_sets[!is_md_device].mutes[mute_set], track); } if (state == SEQ_MUTE_ON) { - CLEAR_BIT16(mute_sets[!is_md_device][mute_set], track); + CLEAR_BIT16(mute_sets[!is_md_device].mutes[mute_set], track); } else { - SET_BIT16(mute_sets[!is_md_device][mute_set], track); + SET_BIT16(mute_sets[!is_md_device].mutes[mute_set], track); } if (trig_interface.is_key_down(MDX_KEY_PATSONG)) { @@ -533,12 +535,13 @@ bool MixerPage::handleEvent(gui_event_t *event) { : (SeqTrack *)&mcl_seq.ext_tracks[i]; seq_track->toggle_mute(); midi_device->muteTrack(i, seq_track->mute_state); + if (current_mute_set == 255) { break; } uint8_t state = - IS_BIT_SET16(mute_sets[!is_md_device][current_mute_set], i); + IS_BIT_SET16(mute_sets[!is_md_device].mutes[current_mute_set], i); if (state == SEQ_MUTE_ON) { - CLEAR_BIT16(mute_sets[!is_md_device][current_mute_set], i); + CLEAR_BIT16(mute_sets[!is_md_device].mutes[current_mute_set], i); } else { - SET_BIT16(mute_sets[!is_md_device][current_mute_set], i); + SET_BIT16(mute_sets[!is_md_device].mutes[current_mute_set], i); } } } diff --git a/avr/cores/megacommand/MCL/MixerPage.h b/avr/cores/megacommand/MCL/MixerPage.h index bfc97f8f6..b2186838d 100644 --- a/avr/cores/megacommand/MCL/MixerPage.h +++ b/avr/cores/megacommand/MCL/MixerPage.h @@ -7,6 +7,11 @@ #include "GUI.h" +class MuteSet { + public: + uint16_t mutes[4]; +}; + class MixerMidiEvents : public MidiCallback { public: bool state; @@ -40,10 +45,11 @@ class MixerPage : public LightPage { bool draw_encoders; - uint8_t current_mute_set = 0; + uint8_t current_mute_set = 255; uint8_t preview_mute_set = 255; void send_fx(uint8_t param, Encoder *enc, uint8_t type); - uint16_t mute_sets[2][4]; + + MuteSet mute_sets[2]; uint8_t get_mute_set(uint8_t key); diff --git a/avr/cores/megacommand/MCL/PerfTrack.cpp b/avr/cores/megacommand/MCL/PerfTrack.cpp index d156812b4..5bfd08458 100644 --- a/avr/cores/megacommand/MCL/PerfTrack.cpp +++ b/avr/cores/megacommand/MCL/PerfTrack.cpp @@ -24,6 +24,7 @@ void PerfTrack::get_perf() { DEBUG_PRINTLN("get perf"); DEBUG_PRINTLN(sizeof(scenes)); memcpy(scenes, PerfData::scenes, sizeof(PerfScene) * NUM_SCENES); + memcpy(mute_sets,mixer_page.mute_sets, sizeof(mute_sets)); } @@ -41,8 +42,8 @@ void PerfTrack::load_perf() { e->cur = encs[n].cur; memcpy(e->name,encs[n].name, PERF_NAME_LENGTH); } - memcpy(PerfData::scenes, scenes, sizeof(PerfScene) * NUM_SCENES); + memcpy(mixer_page.mute_sets, mute_sets, sizeof(mute_sets)); } void PerfTrack::load_immediate(uint8_t tracknumber, SeqTrack *seq_track) { diff --git a/avr/cores/megacommand/MCL/PerfTrack.h b/avr/cores/megacommand/MCL/PerfTrack.h index f4620fd44..06e1c88d7 100644 --- a/avr/cores/megacommand/MCL/PerfTrack.h +++ b/avr/cores/megacommand/MCL/PerfTrack.h @@ -27,10 +27,12 @@ class PerfTrackData { public: PerfTrackEncoderData encs[4]; PerfScene scenes[NUM_SCENES]; + MuteSet mute_sets[2]; }; class PerfTrack : public AUXTrack, public PerfTrackData { public: + PerfTrack() { active = PERF_TRACK_TYPE; static_assert(sizeof(PerfTrack) <= PERF_TRACK_LEN); @@ -43,6 +45,7 @@ class PerfTrack : public AUXTrack, public PerfTrackData { } scenes[n].init(); } + memset(mute_sets, 0, sizeof(mute_sets)); } void load_perf(); From a4353bb342caef381240481dfa980435aa486e63 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 9 Jul 2023 21:47:42 +1000 Subject: [PATCH 222/413] MixerPage does not load a mute set by default. Redraw mutes when no mute set. Fix encoder redraw bug --- avr/cores/megacommand/GUI/Pages.cpp | 8 ++++++++ avr/cores/megacommand/GUI/Pages.h | 6 +----- avr/cores/megacommand/MCL/LFOPage.cpp | 6 +----- avr/cores/megacommand/MCL/MixerPage.cpp | 16 ++++++++++++---- avr/cores/megacommand/MCL/MixerPage.h | 1 + avr/cores/megacommand/MCL/PerfPage.cpp | 6 +----- 6 files changed, 24 insertions(+), 19 deletions(-) diff --git a/avr/cores/megacommand/GUI/Pages.cpp b/avr/cores/megacommand/GUI/Pages.cpp index 0f1aec445..f22158c8a 100644 --- a/avr/cores/megacommand/GUI/Pages.cpp +++ b/avr/cores/megacommand/GUI/Pages.cpp @@ -72,6 +72,14 @@ void LightPage::update() { } } +void LightPage::init_encoders_used_clock(uint16_t timeout) { + for (uint8_t i = 0; i < GUI_NUM_ENCODERS; i++) { + encoders[i]->old = encoders[i]->cur; + ((LightPage *)this)->encoders_used_clock[i] = + slowclock + timeout + 1; + } +} + void LightPage::clear() { for (uint8_t i = 0; i < GUI_NUM_ENCODERS; i++) { if (encoders[i] != NULL) diff --git a/avr/cores/megacommand/GUI/Pages.h b/avr/cores/megacommand/GUI/Pages.h index 7966f577f..c945d4b93 100644 --- a/avr/cores/megacommand/GUI/Pages.h +++ b/avr/cores/megacommand/GUI/Pages.h @@ -184,11 +184,7 @@ class LightPage : public PageParent { **/ void unlockEncoders() {} // TODO - void init_encoders_used_clock() { - for (uint8_t n = 0; n < 4; n++) { - encoders_used_clock[n] = slowclock + SHOW_VALUE_TIMEOUT + 1; - } - } + void init_encoders_used_clock(uint16_t timeout = SHOW_VALUE_TIMEOUT); }; class Page : public PageParent { diff --git a/avr/cores/megacommand/MCL/LFOPage.cpp b/avr/cores/megacommand/MCL/LFOPage.cpp index 13b82e58f..ae54bd90e 100644 --- a/avr/cores/megacommand/MCL/LFOPage.cpp +++ b/avr/cores/megacommand/MCL/LFOPage.cpp @@ -78,11 +78,7 @@ void LFOPage::config_encoders() { } // loop(); - for (uint8_t i = 0; i < GUI_NUM_ENCODERS; i++) { - encoders[i]->old = encoders[i]->cur; - encoders_used_clock[i] = - slowclock; - } + init_encoders_used_clock(); } diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 84118ff05..079a12c25 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -64,13 +64,13 @@ void MixerPage::init() { preview_mute_set = 255; bool switch_tracks = false; oled_display.clearDisplay(); - oled_draw_mutes(); set_display_mode(MODEL_LEVEL); first_track = 255; redraw_mask = -1; show_mixer_menu = 0; - populate_mute_set(); + //populate_mute_set(); draw_encoders = false; + redraw_mutes = true; // R.Clear(); // R.use_machine_param_names(); } @@ -90,6 +90,7 @@ void MixerPage::set_level(int curtrack, int value) { } void MixerPage::loop() { + constexpr int timeout = 1500; perf_page.func_enc_check(); bool old_draw_encoders = draw_encoders; if (draw_encoders && trig_interface.is_key_down(MDX_KEY_FUNC)) { @@ -97,7 +98,6 @@ void MixerPage::loop() { } else { draw_encoders = false; - constexpr int timeout = 1000; for (uint8_t n = 0; n < 4; n++) { if (note_interface.notes_on) { encoders_used_clock[n] = slowclock + timeout + 1; } if (mcl_gui.show_encoder_value(encoders[n],timeout)) { draw_encoders = true; } @@ -107,6 +107,11 @@ void MixerPage::loop() { if (!draw_encoders) { redraw_mask = -1; oled_display.clearDisplay(); oled_draw_mutes(); } } + + if (!draw_encoders) { + init_encoders_used_clock(timeout); + } + } void MixerPage::draw_levels() {} @@ -225,6 +230,7 @@ void MixerPage::display() { oled_display.print(str1); } } + else if (redraw_mutes) { oled_draw_mutes(); redraw_mutes = false; } uint8_t fader_level; uint8_t meter_level; uint8_t fader_x = 0; @@ -433,7 +439,6 @@ bool MixerPage::handleEvent(gui_event_t *event) { : (SeqTrack *)&mcl_seq.ext_tracks[track]; uint8_t mute_set = current_mute_set; - if (current_mute_set == 255) { return; } uint8_t state = 0; if (preview_mute_set == 255 || preview_mute_set == current_mute_set) { @@ -449,6 +454,8 @@ bool MixerPage::handleEvent(gui_event_t *event) { state = IS_BIT_SET16(mute_sets[!is_md_device].mutes[mute_set], track); } + if (mute_set == 255) { return; } + if (state == SEQ_MUTE_ON) { CLEAR_BIT16(mute_sets[!is_md_device].mutes[mute_set], track); } else { @@ -686,6 +693,7 @@ uint8_t channel = MIDI_VOICE_CHANNEL(msg[0]); void MixerPage::onControlChangeCallback_Midi(uint8_t track, uint8_t track_param, uint8_t value) { if (track_param == 32) { + redraw_mutes = true; return; } // don't process mute if (mixer_page.midi_device != &MD) { diff --git a/avr/cores/megacommand/MCL/MixerPage.h b/avr/cores/megacommand/MCL/MixerPage.h index b2186838d..9b6802641 100644 --- a/avr/cores/megacommand/MCL/MixerPage.h +++ b/avr/cores/megacommand/MCL/MixerPage.h @@ -41,6 +41,7 @@ class MixerPage : public LightPage { uint8_t display_mode; uint8_t first_track; uint16_t redraw_mask; + bool redraw_mutes; bool show_mixer_menu; bool draw_encoders; diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 951d99c14..a11a27a4d 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -151,11 +151,7 @@ void PerfPage::config_encoders(uint8_t show_val) { } if (!show_val) { - for (uint8_t i = 0; i < GUI_NUM_ENCODERS; i++) { - encoders[i]->old = encoders[i]->cur; - ((LightPage *)this)->encoders_used_clock[i] = - slowclock + SHOW_VALUE_TIMEOUT + 1; - } + init_encoders_used_clock(); } } void PerfPage::update_params() { From 815df567e7d5a80656da33d17b196615f0d5204d Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 10 Jul 2023 11:23:02 +1000 Subject: [PATCH 223/413] MD AfterTocuh is now CC without kit update --- avr/cores/megacommand/MD/MD.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/avr/cores/megacommand/MD/MD.cpp b/avr/cores/megacommand/MD/MD.cpp index 582de5b1d..ba78b1753 100644 --- a/avr/cores/megacommand/MD/MD.cpp +++ b/avr/cores/megacommand/MD/MD.cpp @@ -397,7 +397,12 @@ void MDClass::setTrackParam_inline(uint8_t track, uint8_t param, uint8_t value, } else { return; } + if (update_kit) { uart_->sendCC(channel + global.baseChannel, cc, value); + } + else { + uart_->sendPolyKeyPressure(channel + global.baseChannel, cc, value); + } } void MDClass::setSampleName(uint8_t slot, char *name) { From 4d90f318020a0d74a73479133133237086968648 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 10 Jul 2023 15:20:09 +1000 Subject: [PATCH 224/413] minor --- avr/cores/megacommand/MD/MDSysex.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MD/MDSysex.cpp b/avr/cores/megacommand/MD/MDSysex.cpp index d63b00242..cfd50e1ee 100644 --- a/avr/cores/megacommand/MD/MDSysex.cpp +++ b/avr/cores/megacommand/MD/MDSysex.cpp @@ -61,7 +61,7 @@ void MDSysexListenerClass::end() { value = sysex->getByte(offset++); fx_type = msgType - MD_SET_RHYTHM_ECHO_PARAM_ID; - if (param > 8) { return; } + if (param > 7) { return; } switch (msgType) { case MD_SET_RHYTHM_ECHO_PARAM_ID: From f14054d30a4bdce26c12e4c11eed832ac3c4ac04 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 10 Jul 2023 17:56:28 +1000 Subject: [PATCH 225/413] Fix very bad memory leak, FX Page --- avr/cores/megacommand/MCL/FXPage.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/FXPage.h b/avr/cores/megacommand/MCL/FXPage.h index ff0445547..a0991c740 100644 --- a/avr/cores/megacommand/MCL/FXPage.h +++ b/avr/cores/megacommand/MCL/FXPage.h @@ -33,7 +33,9 @@ class FXPage : public LightPage, MidiCallback { bool midi_state = false; char fx_page_title[8]; - fx_param_t *params; + + fx_param_t params[2][8]; + uint8_t num_of_params; bool page_mode; From 3bc703b632bdee6dbc1d6fe54bb837d26eb82493 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 10 Jul 2023 17:58:44 +1000 Subject: [PATCH 226/413] finally use compressed knob bitmaps --- .../Adafruit-GFX-Library/Adafruit_GFX.cpp | 47 +++++++++-- .../Adafruit-GFX-Library/Adafruit_GFX.h | 4 +- avr/cores/megacommand/MCL/FXPage.cpp | 5 +- avr/cores/megacommand/MCL/MCLGUI.cpp | 81 +++---------------- avr/cores/megacommand/MCL/MixerPage.cpp | 3 +- avr/cores/megacommand/MCL/PerfPageParent.cpp | 1 + avr/cores/megacommand/MCL/RAMPage.cpp | 21 +++-- avr/cores/megacommand/MCL/SeqPage.cpp | 1 + avr/cores/megacommand/resources/R.h | 47 +++++++++++ avr/cores/megacommand/resources/ResMan.h | 2 + 10 files changed, 125 insertions(+), 87 deletions(-) diff --git a/avr/cores/megacommand/Adafruit-GFX-Library/Adafruit_GFX.cpp b/avr/cores/megacommand/Adafruit-GFX-Library/Adafruit_GFX.cpp index e68cee7eb..94e4f8a54 100755 --- a/avr/cores/megacommand/Adafruit-GFX-Library/Adafruit_GFX.cpp +++ b/avr/cores/megacommand/Adafruit-GFX-Library/Adafruit_GFX.cpp @@ -561,20 +561,38 @@ void Adafruit_GFX::drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[], // Draw a RAM-resident 1-bit image at the specified (x,y) position, // using the specified foreground color (unset bits are transparent). void Adafruit_GFX::drawBitmap(int16_t x, int16_t y, uint8_t *bitmap, int16_t w, - int16_t h, uint16_t color) { + int16_t h, uint16_t color, bool flip_vert, bool flip_horiz) { int16_t byteWidth = (w + 7) / 8; // Bitmap scanline pad = whole byte uint8_t byte = 0; startWrite(); - for (int16_t j = 0; j < h; j++, y++) { + for (int16_t j = 0; j < h; j++) { for (int16_t i = 0; i < w; i++) { if (i & 7) byte <<= 1; else byte = bitmap[j * byteWidth + i / 8]; + uint8_t x_r, y_r; + if (flip_vert) { + x_r = x + w - i - 1; + } + + else { + x_r = x + i; + } + + if (flip_horiz) { + y_r = y + h - j - 1; + } + + else { + y_r = y + j; + } + + if (byte & 0x80) - writePixel(x + i, y, color); + writePixel(x_r, y_r, color); } } endWrite(); @@ -584,19 +602,36 @@ void Adafruit_GFX::drawBitmap(int16_t x, int16_t y, uint8_t *bitmap, int16_t w, // using the specified foreground (for set bits) and background (unset // bits) colors. void Adafruit_GFX::drawBitmap(int16_t x, int16_t y, uint8_t *bitmap, int16_t w, - int16_t h, uint16_t color, uint16_t bg) { + int16_t h, uint16_t color, uint16_t bg, bool flip_vert, bool flip_horiz) { int16_t byteWidth = (w + 7) / 8; // Bitmap scanline pad = whole byte uint8_t byte = 0; startWrite(); - for (int16_t j = 0; j < h; j++, y++) { + for (int16_t j = 0; j < h; j++) { for (int16_t i = 0; i < w; i++) { if (i & 7) byte <<= 1; else byte = bitmap[j * byteWidth + i / 8]; - writePixel(x + i, y, (byte & 0x80) ? color : bg); + uint8_t x_r, y_r; + if (flip_vert) { + x_r = x + w - i - 1; + } + + else { + x_r = x + i; + } + + if (flip_horiz) { + y_r = y + h - j - 1; + } + + else { + y_r = y + j; + } + + writePixel(x_r, y_r, (byte & 0x80) ? color : bg); } } endWrite(); diff --git a/avr/cores/megacommand/Adafruit-GFX-Library/Adafruit_GFX.h b/avr/cores/megacommand/Adafruit-GFX-Library/Adafruit_GFX.h index 1ff003ed5..3dff2ad1f 100755 --- a/avr/cores/megacommand/Adafruit-GFX-Library/Adafruit_GFX.h +++ b/avr/cores/megacommand/Adafruit-GFX-Library/Adafruit_GFX.h @@ -72,9 +72,9 @@ class Adafruit_GFX : public Print { drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w, int16_t h, uint16_t color, uint16_t bg, bool flip_vert = false, bool flip_horiz = false), drawBitmap(int16_t x, int16_t y, uint8_t *bitmap, - int16_t w, int16_t h, uint16_t color), + int16_t w, int16_t h, uint16_t color, bool flip_vert = false, bool flip_horiz = false), drawBitmap(int16_t x, int16_t y, uint8_t *bitmap, - int16_t w, int16_t h, uint16_t color, uint16_t bg), + int16_t w, int16_t h, uint16_t color, uint16_t bg, bool flip_vert = false, bool flip_horiz = false), drawXBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w, int16_t h, uint16_t color), drawGrayscaleBitmap(int16_t x, int16_t y, const uint8_t bitmap[], diff --git a/avr/cores/megacommand/MCL/FXPage.cpp b/avr/cores/megacommand/MCL/FXPage.cpp index eb56fc0a1..c6d0989d6 100644 --- a/avr/cores/megacommand/MCL/FXPage.cpp +++ b/avr/cores/megacommand/MCL/FXPage.cpp @@ -18,6 +18,7 @@ void FXPage::init() { R.Clear(); R.use_icons_page(); R.use_machine_param_names(); + R.use_icons_knob(); last_page = mcl.currentPage(); } void FXPage::update_encoders() { @@ -25,7 +26,7 @@ void FXPage::update_encoders() { for (uint8_t n = 0; n < GUI_NUM_ENCODERS; n++) { ((MCLEncoder *)encoders[n])->max = 127; - uint8_t a = ((page_mode ? 1 : 0) * GUI_NUM_ENCODERS) + n; + uint8_t a = ((!page_mode * GUI_NUM_ENCODERS) + n; uint8_t fx_param = params[a].param; switch (params[a].type) { @@ -108,7 +109,7 @@ void FXPage::display() { // mcl_gui.draw_light_encoder(30 + 20 * i, 18, encoders[i], str); } oled_display.setFont(&TomThumb); - const char *info1; + const char *info1;; const char *info2; if (page_mode) { info1 = "FX A"; diff --git a/avr/cores/megacommand/MCL/MCLGUI.cpp b/avr/cores/megacommand/MCL/MCLGUI.cpp index b1193e17b..5d7d8a96c 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.cpp +++ b/avr/cores/megacommand/MCL/MCLGUI.cpp @@ -1,5 +1,5 @@ #include "MCL_impl.h" - +#include "ResourceManager.h" void MCLGUI::put_value_at2(uint8_t value, char *str) { str[0] = (value % 100) / 10 + '0'; @@ -279,8 +279,9 @@ void MCLGUI::draw_encoder(uint8_t x, uint8_t y, uint8_t value) { // Scale encoder values to 123. encoder animation does not start and stop on // 0. - value = (uint8_t)((float)value * .95); + value = (((uint16_t)value * (uint16_t) 122) / 128); + //value = (uint8_t)((float)value * .95); value += 4; if (value < 32) { @@ -303,28 +304,24 @@ void MCLGUI::draw_encoder(uint8_t x, uint8_t y, uint8_t value) { value = 32 - (value - 96); } + uint8_t *icon = R.icons_knob->encoder_small_0; if (value < 4) { - oled_display.drawBitmap(x, y, encoder_small_0, image_w, image_h, WHITE, - vert_flip, horiz_flip); } else if (value < 9) { - oled_display.drawBitmap(x, y, encoder_small_1, image_w, image_h, WHITE, - vert_flip, horiz_flip); + icon = R.icons_knob->encoder_small_1; } else if (value < 14) { - oled_display.drawBitmap(x, y, encoder_small_2, image_w, image_h, WHITE, - vert_flip, horiz_flip); + icon = R.icons_knob->encoder_small_2; } else if (value < 19) { - oled_display.drawBitmap(x, y, encoder_small_3, image_w, image_h, WHITE, - vert_flip, horiz_flip); + icon = R.icons_knob->encoder_small_3; } else if (value < 24) { - oled_display.drawBitmap(x, y, encoder_small_4, image_w, image_h, WHITE, - vert_flip, horiz_flip); + icon = R.icons_knob->encoder_small_4; } else if (value < 30) { - oled_display.drawBitmap(x, y, encoder_small_5, image_w, image_h, WHITE, - vert_flip, horiz_flip); + icon = R.icons_knob->encoder_small_5; } else { - oled_display.drawBitmap(x, y, encoder_small_6, image_w, image_h, WHITE, - vert_flip, horiz_flip); + icon = R.icons_knob->encoder_small_6; } + + oled_display.drawBitmap(x, y, icon, image_w, image_h, WHITE, + vert_flip, horiz_flip); } void MCLGUI::draw_encoder(uint8_t x, uint8_t y, Encoder *encoder) { @@ -792,56 +789,4 @@ void MCLGUI::draw_panel_number(uint8_t number) { oled_display.print(number); } -// ================ SPRITES ================ - -const unsigned char encoder_small_0[] PROGMEM = { - 0x0e, 0x00, 0x31, 0x80, 0x40, 0x40, 0x40, 0x40, 0x80, 0x20, 0x80, - 0x20, 0x80, 0x20, 0x4e, 0x40, 0x4e, 0x40, 0x31, 0x80, 0x0e, 0x00}; -// 'encoder1', 11x11px -const unsigned char encoder_small_1[] PROGMEM = { - 0x0e, 0x00, 0x31, 0x80, 0x40, 0x40, 0x40, 0x40, 0x80, 0x20, 0x80, - 0x20, 0x80, 0x20, 0x5c, 0x40, 0x4c, 0x40, 0x31, 0x80, 0x0e, 0x00}; -// 'encoder2', 11x11px -const unsigned char encoder_small_2[] PROGMEM = { - 0x0e, 0x00, 0x31, 0x80, 0x40, 0x40, 0x40, 0x40, 0x80, 0x20, 0x80, - 0x20, 0x90, 0x20, 0x58, 0x40, 0x48, 0x40, 0x31, 0x80, 0x0e, 0x00}; -// 'encoder3', 11x11px -const unsigned char encoder_small_3[] PROGMEM = { - 0x0e, 0x00, 0x31, 0x80, 0x40, 0x40, 0x40, 0x40, 0x80, 0x20, 0x80, - 0x20, 0xb0, 0x20, 0x58, 0x40, 0x40, 0x40, 0x31, 0x80, 0x0e, 0x00}; -// 'encoder4', 11x11px -const unsigned char encoder_small_4[] PROGMEM = { - 0x0e, 0x00, 0x31, 0x80, 0x40, 0x40, 0x40, 0x40, 0x80, 0x20, 0xb0, - 0x20, 0xb0, 0x20, 0x58, 0x40, 0x40, 0x40, 0x31, 0x80, 0x0e, 0x00}; -// 'encoder5', 11x11px -const unsigned char encoder_small_5[] PROGMEM = { - 0x0e, 0x00, 0x31, 0x80, 0x40, 0x40, 0x40, 0x40, 0x80, 0x20, 0xb0, - 0x20, 0xb0, 0x20, 0x50, 0x40, 0x40, 0x40, 0x31, 0x80, 0x0e, 0x00}; -// 'encoder6', 11x11px -const unsigned char encoder_small_6[] PROGMEM = { - 0x0e, 0x00, 0x31, 0x80, 0x40, 0x40, 0x40, 0x40, 0xb0, 0x20, 0xb0, - 0x20, 0xb0, 0x20, 0x40, 0x40, 0x40, 0x40, 0x31, 0x80, 0x0e, 0x00}; - -// 'wheel1', 19x19px -const unsigned char wheel_top[] PROGMEM = { - 0x03, 0xf8, 0x00, 0x0e, 0x0e, 0x00, 0x1e, 0x0f, 0x00, 0x3e, 0x0f, 0x80, - 0x7f, 0x1f, 0xc0, 0x7f, 0x1f, 0xc0, 0xff, 0xbf, 0xe0, 0xff, 0xff, 0xe0, - 0xff, 0xbf, 0xe0, 0xff, 0x5f, 0xe0, 0xff, 0xbf, 0xe0, 0xf8, 0xe3, 0xe0, - 0x60, 0xe0, 0xe0, 0x40, 0xe0, 0x40, 0x61, 0xf0, 0xc0, 0x31, 0xf1, 0x80, - 0x1b, 0xf7, 0x00, 0x0f, 0xfe, 0x00, 0x03, 0xf8, 0x00}; -// 'wheel2', 19x19px -const unsigned char wheel_angle[] PROGMEM = { - 0x03, 0xf8, 0x00, 0x0f, 0xfe, 0x00, 0x1f, 0xfb, 0x00, 0x3f, 0xf1, 0x80, - 0x7f, 0xf0, 0xc0, 0x7f, 0xe0, 0x40, 0xff, 0xe0, 0xe0, 0x8f, 0xe3, 0xe0, - 0x83, 0xbf, 0xe0, 0x81, 0x5f, 0xe0, 0x83, 0xbf, 0xe0, 0x8f, 0xff, 0xe0, - 0xff, 0xbf, 0xe0, 0x7f, 0x1f, 0xc0, 0x7f, 0x1f, 0xc0, 0x3e, 0x0f, 0x80, - 0x1e, 0x0f, 0x00, 0x0e, 0x0e, 0x00, 0x03, 0xf8, 0x00}; -// 'wheel3', 19x19px -const unsigned char wheel_side[] PROGMEM = { - 0x03, 0xf8, 0x00, 0x0f, 0xfe, 0x00, 0x1b, 0xff, 0x00, 0x31, 0xff, 0x80, - 0x61, 0xff, 0xc0, 0x40, 0xff, 0xc0, 0xe0, 0xff, 0xe0, 0xf8, 0xfe, 0x20, - 0xff, 0xb8, 0x20, 0xff, 0x50, 0x20, 0xff, 0xb8, 0x20, 0xf8, 0xfe, 0x20, - 0xe0, 0xff, 0xe0, 0x40, 0xff, 0xc0, 0x61, 0xff, 0xc0, 0x31, 0xff, 0x80, - 0x1b, 0xff, 0x00, 0x0f, 0xfe, 0x00, 0x03, 0xf8, 0x00}; - MCLGUI mcl_gui; diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 079a12c25..2cbe5e389 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -71,7 +71,8 @@ void MixerPage::init() { //populate_mute_set(); draw_encoders = false; redraw_mutes = true; - // R.Clear(); + R.Clear(); + R.use_icons_knob(); // R.use_machine_param_names(); } diff --git a/avr/cores/megacommand/MCL/PerfPageParent.cpp b/avr/cores/megacommand/MCL/PerfPageParent.cpp index 7a9eb7211..72e4358e9 100644 --- a/avr/cores/megacommand/MCL/PerfPageParent.cpp +++ b/avr/cores/megacommand/MCL/PerfPageParent.cpp @@ -13,6 +13,7 @@ void PerfPageParent::init() { config_encoders(); R.Clear(); R.use_machine_param_names(); + R.use_icons_knob(); setup_callbacks(); } diff --git a/avr/cores/megacommand/MCL/RAMPage.cpp b/avr/cores/megacommand/MCL/RAMPage.cpp index 6412d96d7..b651af8bd 100644 --- a/avr/cores/megacommand/MCL/RAMPage.cpp +++ b/avr/cores/megacommand/MCL/RAMPage.cpp @@ -46,6 +46,8 @@ void RAMPage::init() { } } } + R.Clear(); + R.use_icons_knob(); } void RAMPage::cleanup() { oled_display.clearDisplay(); } @@ -563,32 +565,35 @@ void RAMPage::display() { oled_display.fillRect(progress_x + 1, progress_y, width, 4, WHITE); } + bool flip_hor = false, flip_vert = false; + uint8_t *icon = R.icons_knob->wheel_top; switch (wheel_spin) { case 0: - oled_display.drawBitmap(w_x, w_y, wheel_top, 19, 19, WHITE); break; case 1: - oled_display.drawBitmap(w_x, w_y, wheel_angle, 19, 19, WHITE); + icon = R.icons_knob->wheel_angle; break; case 2: - oled_display.drawBitmap(w_x, w_y, wheel_side, 19, 19, WHITE); + icon = R.icons_knob->wheel_side; break; case 3: - oled_display.drawBitmap(w_x, w_y, wheel_angle, 19, 19, WHITE, false, true); + icon = R.icons_knob->wheel_angle; flip_hor = false; flip_vert = true; break; case 4: - oled_display.drawBitmap(w_x, w_y, wheel_top, 19, 19, WHITE, false, true); + icon = R.icons_knob->wheel_top; flip_hor = false; flip_vert = true; break; case 5: - oled_display.drawBitmap(w_x, w_y, wheel_angle, 19, 19, WHITE, true, true); + icon = R.icons_knob->wheel_angle; flip_hor = true; flip_vert = true; break; case 6: - oled_display.drawBitmap(w_x, w_y, wheel_side, 19, 19, WHITE, true, false); + icon = R.icons_knob->wheel_side; flip_hor = true; flip_vert = false; break; case 7: - oled_display.drawBitmap(w_x, w_y, wheel_angle, 19, 19, WHITE, true, false); + icon = R.icons_knob->wheel_angle; flip_hor = true; flip_vert = false; break; } + oled_display.drawBitmap(w_x, w_y, icon, 19, 19, WHITE, flip_hor, flip_vert); + if ((wheel_spin_last_clock != MidiClock.div16th_counter) && ((RAMPage::rec_states[page_id] == STATE_RECORD) || (RAMPage::rec_states[page_id] == STATE_PLAY))) { diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index 4c385357f..88f34de26 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -135,6 +135,7 @@ void SeqPage::init() { last_md_model = MD.kit.models[MD.currentTrack]; R.Clear(); + R.use_icons_knob(); R.use_machine_names_short(); R.use_machine_param_names(); MidiUartParent::handle_midi_lock = _midi_lock_tmp; diff --git a/avr/cores/megacommand/resources/R.h b/avr/cores/megacommand/resources/R.h index 2fece7fcc..a4ae75dd5 100644 --- a/avr/cores/megacommand/resources/R.h +++ b/avr/cores/megacommand/resources/R.h @@ -107,6 +107,53 @@ struct __T_icons_knob { static constexpr size_t __total_size = 325; }; +extern const unsigned char __R_icons_logo[] PROGMEM; +struct __T_icons_logo { + union { + unsigned char icon_md_logo_medium[0]; + char zz__icon_md_logo_medium[27]; + }; + static constexpr size_t countof_icon_md_logo_medium = 27 / sizeof(unsigned char); + static constexpr size_t sizeofof_icon_md_logo_medium = 27; + union { + unsigned char icon_analog_logo_medium[0]; + char zz__icon_analog_logo_medium[18]; + }; + static constexpr size_t countof_icon_analog_logo_medium = 18 / sizeof(unsigned char); + static constexpr size_t sizeofof_icon_analog_logo_medium = 18; + union { + unsigned char icon_metronome_logo_medium[0]; + char zz__icon_metronome_logo_medium[18]; + }; + static constexpr size_t countof_icon_metronome_logo_medium = 18 / sizeof(unsigned char); + static constexpr size_t sizeofof_icon_metronome_logo_medium = 18; + union { + unsigned char icon_route_logo_medium[0]; + char zz__icon_route_logo_medium[20]; + }; + static constexpr size_t countof_icon_route_logo_medium = 20 / sizeof(unsigned char); + static constexpr size_t sizeofof_icon_route_logo_medium = 20; + union { + unsigned char icon_perf_logo_small[0]; + char zz__icon_perf_logo_small[8]; + }; + static constexpr size_t countof_icon_perf_logo_small = 8 / sizeof(unsigned char); + static constexpr size_t sizeofof_icon_perf_logo_small = 8; + union { + unsigned char icon_mnm_logo_medium[0]; + char zz__icon_mnm_logo_medium[18]; + }; + static constexpr size_t countof_icon_mnm_logo_medium = 18 / sizeof(unsigned char); + static constexpr size_t sizeofof_icon_mnm_logo_medium = 18; + union { + unsigned char icon_midi_logo_medium[0]; + char zz__icon_midi_logo_medium[18]; + }; + static constexpr size_t countof_icon_midi_logo_medium = 18 / sizeof(unsigned char); + static constexpr size_t sizeofof_icon_midi_logo_medium = 18; + static constexpr size_t __total_size = 127; +}; + extern const unsigned char __R_icons_page[] PROGMEM; struct __T_icons_page { union { diff --git a/avr/cores/megacommand/resources/ResMan.h b/avr/cores/megacommand/resources/ResMan.h index 17e9511de..50deebfcf 100644 --- a/avr/cores/megacommand/resources/ResMan.h +++ b/avr/cores/megacommand/resources/ResMan.h @@ -5,6 +5,8 @@ __T_icons_device *icons_device; void use_icons_device() { icons_device = (__T_icons_device*) __use_resource(__R_icons_device); } __T_icons_knob *icons_knob; void use_icons_knob() { icons_knob = (__T_icons_knob*) __use_resource(__R_icons_knob); } +__T_icons_logo *icons_logo; +void use_icons_logo() { icons_logo = (__T_icons_logo*) __use_resource(__R_icons_logo); } __T_icons_page *icons_page; void use_icons_page() { icons_page = (__T_icons_page*) __use_resource(__R_icons_page); } __T_machine_names_long *machine_names_long; From 0d209a11f047d973c4d36fb4f5ea156a7eb19a0f Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 10 Jul 2023 18:02:15 +1000 Subject: [PATCH 227/413] icons_logo wip --- .../megacommand/resources/R_icons_logo.cpp | 120 ++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 avr/cores/megacommand/resources/R_icons_logo.cpp diff --git a/avr/cores/megacommand/resources/R_icons_logo.cpp b/avr/cores/megacommand/resources/R_icons_logo.cpp new file mode 100644 index 000000000..ddd215989 --- /dev/null +++ b/avr/cores/megacommand/resources/R_icons_logo.cpp @@ -0,0 +1,120 @@ +#include "R.h" +const unsigned char __R_icons_logo[] PROGMEM = { + 246, + 15, + 129, + 192, + 31, + 2, + 249, + 63, + 131, + 128, + 127, + 124, + 251, + 135, + 0, + 115, + 190, + 35, + 158, + 0, + 3, + 111, + 156, + 0, + 63, + 224, + 251, + 66, + 16, + 153, + 8, + 189, + 1, + 22, + 7, + 183, + 11, + 60, + 224, + 253, + 28, + 0, + 20, + 32, + 34, + 192, + 191, + 1, + 73, + 0, + 67, + 0, + 132, + 255, + 128, + 136, + 128, + 255, + 128, + 30, + 60, + 60, + 254, + 120, + 48, + 96, + 253, + 248, + 120, + 240, + 221, + 5, + 0, + 0, + 185, + 3, + 72, + 144, + 127, + 60, + 66, + 137, + 133, + 129, + 129, + 238, + 66, + 60, + 252, + 0, + 146, + 204, + 102, + 207, + 253, + 242, + 200, + 170, + 40, + 170, + 168, + 214, + 1, + 200, + 43, + 239, + 255, + 248, + 1, + 0, + 0, + 0, + 0, + 0, + 4, + 255, + 255, +}; From 4bc9c4b10d790eed8f05e318740c66fd31fbbfd3 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 10 Jul 2023 18:03:38 +1000 Subject: [PATCH 228/413] Revert "Fix very bad memory leak, FX Page" This reverts commit f14054d30a4bdce26c12e4c11eed832ac3c4ac04. --- avr/cores/megacommand/MCL/FXPage.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/avr/cores/megacommand/MCL/FXPage.h b/avr/cores/megacommand/MCL/FXPage.h index a0991c740..ff0445547 100644 --- a/avr/cores/megacommand/MCL/FXPage.h +++ b/avr/cores/megacommand/MCL/FXPage.h @@ -33,9 +33,7 @@ class FXPage : public LightPage, MidiCallback { bool midi_state = false; char fx_page_title[8]; - - fx_param_t params[2][8]; - + fx_param_t *params; uint8_t num_of_params; bool page_mode; From 4419aa7b0f3c687efe0e958ea62d10854200f921 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 10 Jul 2023 22:26:44 +1000 Subject: [PATCH 229/413] some improvements to fx page --- avr/cores/megacommand/MCL/FXPage.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/avr/cores/megacommand/MCL/FXPage.cpp b/avr/cores/megacommand/MCL/FXPage.cpp index c6d0989d6..c75d396a5 100644 --- a/avr/cores/megacommand/MCL/FXPage.cpp +++ b/avr/cores/megacommand/MCL/FXPage.cpp @@ -26,7 +26,7 @@ void FXPage::update_encoders() { for (uint8_t n = 0; n < GUI_NUM_ENCODERS; n++) { ((MCLEncoder *)encoders[n])->max = 127; - uint8_t a = ((!page_mode * GUI_NUM_ENCODERS) + n; + uint8_t a = ((uint8_t)!page_mode * GUI_NUM_ENCODERS) + n; uint8_t fx_param = params[a].param; switch (params[a].type) { @@ -90,11 +90,12 @@ void FXPage::display() { oled_display.clearDisplay(); auto oldfont = oled_display.getFont(); - if (page_id == 0) { - oled_display.drawBitmap(0, 0, R.icons_page->icon_rhytmecho, 24, 18, WHITE); - } else { - oled_display.drawBitmap(0, 0, R.icons_page->icon_gatebox, 24, 18, WHITE); + uint8_t *icon = R.icons_page->icon_rhytmecho; + if (page_id == 1) { + icon = R.icons_page->icon_gatebox; } + + oled_display.drawBitmap(0, 0, icon, 24, 18, WHITE); mcl_gui.draw_knob_frame(); for (uint8_t i = 0; i < GUI_NUM_ENCODERS; i++) { @@ -113,8 +114,8 @@ void FXPage::display() { const char *info2; if (page_mode) { info1 = "FX A"; - } else { - info1 = "FX B"; + } else { + info1 = "FX B"; } info2 = &fx_page_title[0]; mcl_gui.draw_panel_labels(info1, info2); From e35f86d2588a2ca705925b782a83ab91072a1a21 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 10 Jul 2023 23:05:35 +1000 Subject: [PATCH 230/413] Forbidden fruit --- avr/cores/megacommand/MCL/AuxPages.cpp | 2 +- avr/cores/megacommand/MCL/GridLoadPage.cpp | 7 ++++--- avr/cores/megacommand/MCL/GridSavePage.cpp | 9 +++++---- avr/cores/megacommand/MCL/MCL.h | 2 +- avr/cores/megacommand/MCL/MCLClipBoard.cpp | 2 +- avr/cores/megacommand/MCL/MixerPage.cpp | 2 +- avr/cores/megacommand/MCL/OscPage.cpp | 2 +- avr/cores/megacommand/MCL/PerfPage.cpp | 14 +++++++------- avr/cores/megacommand/MCL/PerfPageParent.cpp | 2 +- avr/cores/megacommand/MCL/SeqPage.cpp | 18 +++++++++--------- avr/cores/megacommand/MCL/SeqPtcPage.cpp | 4 ++-- 11 files changed, 33 insertions(+), 31 deletions(-) diff --git a/avr/cores/megacommand/MCL/AuxPages.cpp b/avr/cores/megacommand/MCL/AuxPages.cpp index 1e56c883b..c7f84316c 100644 --- a/avr/cores/megacommand/MCL/AuxPages.cpp +++ b/avr/cores/megacommand/MCL/AuxPages.cpp @@ -51,5 +51,5 @@ FXPage fx_page_b(&fx_param1, &fx_param2, &fx_param3, &fx_param4, LFOPage lfo_page(&(mcl_seq.lfo_tracks[0]), &fx_param1, &fx_param2, &fx_param3, &fx_param4); -PerfPage perf_page(&perf_param1, &perf_param2, &perf_param3, &perf_param4); +PerfPage perf_page(&perf_param1, &fx_param2, &fx_param3, &fx_param4); diff --git a/avr/cores/megacommand/MCL/GridLoadPage.cpp b/avr/cores/megacommand/MCL/GridLoadPage.cpp index 1beaf9ab4..37e5eb64b 100644 --- a/avr/cores/megacommand/MCL/GridLoadPage.cpp +++ b/avr/cores/megacommand/MCL/GridLoadPage.cpp @@ -52,8 +52,8 @@ void GridLoadPage::draw_popup() { } void GridLoadPage::display_load() { - char *str2 = " SLOTS"; - char *str1 = "LOAD"; + const char *str2 = " SLOTS"; + const char *str1 = "LOAD"; if (mcl_cfg.load_mode == LOAD_QUEUE) { str1 = "QUEUE"; } @@ -205,7 +205,8 @@ void GridLoadPage::load() { void GridLoadPage::group_select() { show_track_type = true; - MD.popup_text("LOAD GROUPS", true); + char str[] = "LOAD GROUPS"; + MD.popup_text(str, true); MD.set_trigleds(mcl_cfg.track_type_select, TRIGLED_EXCLUSIVE); } diff --git a/avr/cores/megacommand/MCL/GridSavePage.cpp b/avr/cores/megacommand/MCL/GridSavePage.cpp index 3f29ef05d..a5db2e232 100644 --- a/avr/cores/megacommand/MCL/GridSavePage.cpp +++ b/avr/cores/megacommand/MCL/GridSavePage.cpp @@ -7,15 +7,15 @@ void GridSavePage::init() { trig_interface.send_md_leds(TRIGLED_OVERLAY); trig_interface.on(); grid_page.reload_slot_models = false; - MD.popup_text("SAVE SLOTS", true); + char str[] = "SAVE SLOTS"; + MD.popup_text(str, true); draw_popup(); } void GridSavePage::setup() {} void GridSavePage::draw_popup() { - char str[16]; - strcpy(str, "GROUP SAVE"); + char str[16] = "GROUP SAVE"; if (!show_track_type) { strcpy(str, "SAVE TO "); @@ -105,7 +105,8 @@ void GridSavePage::save() { void GridSavePage::group_select() { show_track_type = true; - MD.popup_text("SAVE GROUPS", true); + char str[] = "SAVE GROUPS"; + MD.popup_text(str, true); MD.set_trigleds(mcl_cfg.track_type_select, TRIGLED_EXCLUSIVE); } diff --git a/avr/cores/megacommand/MCL/MCL.h b/avr/cores/megacommand/MCL/MCL.h index 3f9867bf9..896d7ee82 100644 --- a/avr/cores/megacommand/MCL/MCL.h +++ b/avr/cores/megacommand/MCL/MCL.h @@ -17,7 +17,7 @@ #include "Fonts/TomThumb.h" #define VERSION 4050 -#define VERSION_STR "GG4.50" +#define VERSION_STR "II4.50" #define CALLBACK_TIMEOUT 500 #define GUI_NAME_TIMEOUT 800 diff --git a/avr/cores/megacommand/MCL/MCLClipBoard.cpp b/avr/cores/megacommand/MCL/MCLClipBoard.cpp index dd49bdeb2..f34ece62b 100644 --- a/avr/cores/megacommand/MCL/MCLClipBoard.cpp +++ b/avr/cores/megacommand/MCL/MCLClipBoard.cpp @@ -17,7 +17,7 @@ bool MCLClipBoard::open() { DEBUG_PRINT_FN(); SD.chdir("/"); - char *str = FILENAME_CLIPBOARD; + char str[] = FILENAME_CLIPBOARD; char grid_filename[sizeof(FILENAME_CLIPBOARD) + 2]; strcpy(grid_filename, str); uint8_t l = strlen(grid_filename); diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 2cbe5e389..5be54fb31 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -223,7 +223,7 @@ void MixerPage::display() { //oled_display.clearDisplay(); oled_display.fillRect(0,0,128,12,BLACK); for (uint8_t n = 0; n < 4; n++) { - char *str1 = "A"; + char str1[] = "A"; str1[0] = 'A' + n; uint8_t pos = n * 24; mcl_gui.draw_encoder(24 + pos, 0, encoders[n]->cur); diff --git a/avr/cores/megacommand/MCL/OscPage.cpp b/avr/cores/megacommand/MCL/OscPage.cpp index 6996f7858..a42bf677e 100644 --- a/avr/cores/megacommand/MCL/OscPage.cpp +++ b/avr/cores/megacommand/MCL/OscPage.cpp @@ -167,7 +167,7 @@ void OscPage::display() { } oled_display.print(F(" ")); - char *str = " "; + char str[] = " "; if (show_freq) { float freq = get_freq(); oled_display.print((int)freq); diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index a11a27a4d..9d7feaf35 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -227,7 +227,7 @@ void PerfPage::display() { PerfEncoder *e = perf_encoders[perf_id]; - char *str1 = " A"; + char str1[] = " A"; str1[1] = 'A' + perf_id; mcl_gui.draw_knob(0, encoders[0], str1); @@ -238,7 +238,7 @@ void PerfPage::display() { info1 = "LCK> "; mcl_gui.put_value_at(page_mode, info1 + 4); - char *str1 = "LCK"; + const char *str1 = "LCK"; uint8_t v = encoders[3]->cur; bool is_lock = encoders[3]->cur != 0; if (!is_lock) { @@ -283,7 +283,7 @@ void PerfPage::display() { } oled_display.setCursor(80, MCLGUI::pane_info2_y + 4); - char *str3 = "SCENE: A B"; + char str3[] = "SCENE: A B"; str3[7] = e->active_scene_a == 255 ? '-' : '1' + e->active_scene_a; str3[12] = e->active_scene_b == 255 ? '-' : '1' + e->active_scene_b; oled_display.print(str3); @@ -478,7 +478,7 @@ bool PerfPage::handleEvent(gui_event_t *event) { if (t < NUM_SCENES) { switch (key) { case MDX_KEY_COPY: { - char *str = "COPY SCENE"; + char str[] = "COPY SCENE"; oled_display.textbox(str, ""); MD.popup_text(str); mcl_clipboard.copy_scene( @@ -492,7 +492,7 @@ bool PerfPage::handleEvent(gui_event_t *event) { } if (mcl_clipboard.paste_scene( &perf_encoders[perf_id]->perf_data.scenes[t])) { - char *str = "PASTE SCENE"; + char str[] = "PASTE SCENE"; oled_display.textbox(str, ""); MD.popup_text(str); config_encoders(); @@ -504,7 +504,7 @@ bool PerfPage::handleEvent(gui_event_t *event) { if (t == undo) { if (mcl_clipboard.paste_scene( &perf_encoders[perf_id]->perf_data.scenes[undo])) { - char *str = "UNDO CLEAR"; + char str[] = "UNDO CLEAR"; oled_display.textbox(str, ""); MD.popup_text(str); undo = 255; @@ -517,7 +517,7 @@ bool PerfPage::handleEvent(gui_event_t *event) { mcl_clipboard.copy_scene( &perf_encoders[perf_id]->perf_data.scenes[t]); } - char *str = "CLEAR SCENE"; + char str[] = "CLEAR SCENE"; oled_display.textbox(str, ""); MD.popup_text(str); perf_encoders[perf_id]->perf_data.clear_scene(t); diff --git a/avr/cores/megacommand/MCL/PerfPageParent.cpp b/avr/cores/megacommand/MCL/PerfPageParent.cpp index 72e4358e9..0d291bbfd 100644 --- a/avr/cores/megacommand/MCL/PerfPageParent.cpp +++ b/avr/cores/megacommand/MCL/PerfPageParent.cpp @@ -73,7 +73,7 @@ void PerfPageParent::draw_dest(uint8_t knob, uint8_t value, bool dest) { mcl_gui.put_value_at(value, K + 1); break; } - char *str1 = "DEST"; + const char *str1 = "DEST"; if (!dest) { str1 = "SRC"; } mcl_gui.draw_knob(knob, str1, K); } diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index 88f34de26..beac16b1a 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -734,12 +734,12 @@ void opt_clear_track_handler() { } } else if (opt_clear == 1) { bool is_poly = IS_BIT_SET16(mcl_cfg.poly_mask, last_md_track); - char *str = "CLEAR TRACK"; + const char *str = "CLEAR TRACK"; if (is_poly) { str = "CLEAR POLY TRACKS"; } oled_display.textbox(str, ""); - MD.popup_text(str); + MD.popup_text((char*) str); if (copy) { opt_copy_track_handler(opt_clear); } @@ -758,7 +758,7 @@ void opt_clear_track_handler() { if (copy) { opt_copy_track_handler(opt_clear); } - char *str = "CLEAR EXT TRACK"; + const char *str = "CLEAR EXT TRACK"; if (opt_clear == 2) { for (uint8_t n = 0; n < mcl_seq.num_ext_tracks; n++) { str = "CLEAR EXT TRACKS"; @@ -768,8 +768,8 @@ void opt_clear_track_handler() { mcl_seq.ext_tracks[last_ext_track].clear_track(); } if (opt_clear) { - oled_display.textbox(str, ""); - MD.popup_text(str); + oled_display.textbox((char*) str, ""); + MD.popup_text((char*) str); } } opt_clear = 0; @@ -898,12 +898,12 @@ void opt_paste_track_handler() { } mcl_clipboard.paste_sequencer(); } else { - char *str = "UNDO EXT TRACKS"; + const char *str = "UNDO EXT TRACKS"; if (!undo) { str = "PASTE EXT TRACKS"; } oled_display.textbox(str, ""); - MD.popup_text(str); + MD.popup_text((char*)str); mcl_clipboard.paste_sequencer(NUM_MD_TRACKS); } } @@ -930,12 +930,12 @@ void opt_paste_track_handler() { last_md_track); } } else { - char *str = "UNDO EXT TRACK"; + const char *str = "UNDO EXT TRACK"; if (!undo) { str = "PASTE EXT TRACK"; } oled_display.textbox(str, ""); - MD.popup_text(str); + MD.popup_text((char*)str); mcl_clipboard.paste_sequencer_track(mcl_clipboard.copy_track, last_ext_track + NUM_MD_TRACKS); diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.cpp b/avr/cores/megacommand/MCL/SeqPtcPage.cpp index ce6fc07e5..9ca398e34 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPtcPage.cpp @@ -486,13 +486,13 @@ void SeqPtcPage::recalc_notemask() { } void SeqPtcPage::draw_popup_transpose() { - char *str = "KEY: "; + char str[] = "KEY: "; mcl_gui.put_value_at(transpose, str + 5); MD.popup_text(str); } void SeqPtcPage::draw_popup_octave() { - char *str = "OCT: "; + char str[] = "OCT: "; mcl_gui.put_value_at(ptc_param_oct.cur, str + 5); MD.popup_text(str); } From 123a9e7fc404f4263cc6ab9ae58ca76daec777a4 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 11 Jul 2023 22:54:26 +1000 Subject: [PATCH 231/413] New Group select page --- avr/cores/megacommand/A4/A4.cpp | 4 + avr/cores/megacommand/A4/A4.h | 1 + avr/cores/megacommand/Elektron/Elektron.cpp | 3 +- avr/cores/megacommand/Elektron/Elektron.h | 1 + avr/cores/megacommand/MCL/GridIOPage.cpp | 3 + avr/cores/megacommand/MCL/GridLoadPage.cpp | 3 +- avr/cores/megacommand/MCL/GridSavePage.cpp | 3 +- avr/cores/megacommand/MCL/MCLGUI.cpp | 51 +++++- avr/cores/megacommand/MCL/MCLGUI.h | 2 +- avr/cores/megacommand/MD/MD.cpp | 1 + avr/cores/megacommand/MD/MD.h | 2 +- avr/cores/megacommand/MNM/MNM.cpp | 1 + avr/cores/megacommand/MNM/MNM.h | 1 + avr/cores/megacommand/resources/R.h | 34 ++-- .../megacommand/resources/R_icons_logo.cpp | 156 +++++++++++------- 15 files changed, 172 insertions(+), 94 deletions(-) diff --git a/avr/cores/megacommand/A4/A4.cpp b/avr/cores/megacommand/A4/A4.cpp index d6959800e..8e41dff24 100644 --- a/avr/cores/megacommand/A4/A4.cpp +++ b/avr/cores/megacommand/A4/A4.cpp @@ -114,6 +114,10 @@ bool A4Class::probe() { uint8_t* A4Class::icon() { return R.icons_device->icon_a4; } +uint8_t* A4Class::icon_logo() { + return R.icons_logo->icon_analog_logo_medium; +} + void A4Class::requestKitX(uint8_t kit) { sendRequest(A4_KITX_REQUEST_ID, kit); } diff --git a/avr/cores/megacommand/A4/A4.h b/avr/cores/megacommand/A4/A4.h index 76e6dd838..0ef045d0f 100644 --- a/avr/cores/megacommand/A4/A4.h +++ b/avr/cores/megacommand/A4/A4.h @@ -39,6 +39,7 @@ class A4Class : public ElektronDevice { virtual bool probe(); virtual void init_grid_devices(uint8_t device_idx); virtual uint8_t* icon(); + virtual uint8_t* icon_logo(); virtual uint16_t sendKitParams(uint8_t* masks); diff --git a/avr/cores/megacommand/Elektron/Elektron.cpp b/avr/cores/megacommand/Elektron/Elektron.cpp index 915c56cad..d94805712 100644 --- a/avr/cores/megacommand/Elektron/Elektron.cpp +++ b/avr/cores/megacommand/Elektron/Elektron.cpp @@ -1,5 +1,6 @@ #include "Elektron.h" #include "Project.h" +#include "ResourceManager.h" #define SYSEX_RETRIES 1 @@ -12,7 +13,7 @@ void MidiDevice::cleanup(uint8_t device_idx) { proj.grids[n].cleanup(device_idx); } } - +uint8_t *MidiDevice::icon_logo() { return R.icons_logo->icon_midi_logo_medium; } uint16_t ElektronDevice::sendRequest(uint8_t *data, uint8_t len, bool send, MidiUartParent *uart_) { if (uart_ == nullptr) { uart_ = uart; } diff --git a/avr/cores/megacommand/Elektron/Elektron.h b/avr/cores/megacommand/Elektron/Elektron.h index c89fa8d04..b5e18a8b8 100644 --- a/avr/cores/megacommand/Elektron/Elektron.h +++ b/avr/cores/megacommand/Elektron/Elektron.h @@ -173,6 +173,7 @@ class MidiDevice { virtual void muteTrack(uint8_t track, bool mute = true, MidiUartParent *uart_ = nullptr) {}; // 34x42 bitmap icon of the device virtual uint8_t *icon() { return nullptr; } + virtual uint8_t *icon_logo(); }; /// Base class for Elektron sysex listeners diff --git a/avr/cores/megacommand/MCL/GridIOPage.cpp b/avr/cores/megacommand/MCL/GridIOPage.cpp index 2255ee421..edbb70cd8 100644 --- a/avr/cores/megacommand/MCL/GridIOPage.cpp +++ b/avr/cores/megacommand/MCL/GridIOPage.cpp @@ -1,4 +1,5 @@ #include "MCL_impl.h" +#include "ResourceManager.h" uint32_t GridIOPage::track_select = 0; bool GridIOPage::show_track_type = false; @@ -14,6 +15,8 @@ void GridIOPage::init() { old_grid = proj.get_grid(); show_track_type = false; track_select = 0; + R.Clear(); + R.use_icons_logo(); } void GridIOPage::track_select_array_from_type_select( diff --git a/avr/cores/megacommand/MCL/GridLoadPage.cpp b/avr/cores/megacommand/MCL/GridLoadPage.cpp index 37e5eb64b..a2e0fd141 100644 --- a/avr/cores/megacommand/MCL/GridLoadPage.cpp +++ b/avr/cores/megacommand/MCL/GridLoadPage.cpp @@ -108,8 +108,7 @@ void GridLoadPage::display() { auto oldfont = oled_display.getFont(); if (show_track_type) { - mcl_gui.draw_track_type_select(23, MCLGUI::s_menu_y + 12, - mcl_cfg.track_type_select); + mcl_gui.draw_track_type_select(mcl_cfg.track_type_select); } else { mcl_gui.draw_trigs(MCLGUI::s_menu_x + 4, MCLGUI::s_menu_y + 21, note_interface.notes_off | note_interface.notes_on ); diff --git a/avr/cores/megacommand/MCL/GridSavePage.cpp b/avr/cores/megacommand/MCL/GridSavePage.cpp index a5db2e232..2720d9465 100644 --- a/avr/cores/megacommand/MCL/GridSavePage.cpp +++ b/avr/cores/megacommand/MCL/GridSavePage.cpp @@ -34,8 +34,7 @@ void GridSavePage::display() { const uint64_t slide_mask = 0; const uint64_t mute_mask = 0; if (show_track_type) { - mcl_gui.draw_track_type_select(23, MCLGUI::s_menu_y + 12, - mcl_cfg.track_type_select); + mcl_gui.draw_track_type_select(mcl_cfg.track_type_select); } else { mcl_gui.draw_trigs(MCLGUI::s_menu_x + 4, MCLGUI::s_menu_y + 21, note_interface.notes_off | note_interface.notes_on ); oled_display.setFont(&Elektrothic); diff --git a/avr/cores/megacommand/MCL/MCLGUI.cpp b/avr/cores/megacommand/MCL/MCLGUI.cpp index 5d7d8a96c..43a7acf33 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.cpp +++ b/avr/cores/megacommand/MCL/MCLGUI.cpp @@ -648,22 +648,34 @@ void MCLGUI::draw_trigs(uint8_t x, uint8_t y, uint8_t offset, } } -void MCLGUI::draw_track_type_select(uint8_t x, uint8_t y, - uint8_t track_type_select) { +void MCLGUI::draw_track_type_select(uint8_t track_type_select) { char dev[6]; MidiDevice *devs[2] = { midi_active_peering.get_device(UART1_PORT), midi_active_peering.get_device(UART2_PORT), }; + oled_display.clearDisplay(); + + uint8_t x = 0; + oled_display.fillRect(0, 0, 128, 7, WHITE); + oled_display.setCursor(s_title_x + (s_title_w - 5 * 4) / 2, 6); + // oled_display.setCursor(s_title_x + 2, s_menu_y + 3); + oled_display.setTextColor(BLACK); + oled_display.println("GROUPS"); for (uint8_t i = 0; i < 5; i++) { - oled_display.setCursor(x, y); + uint8_t *icon = nullptr; + uint8_t w = 18, h = 9; + uint8_t offset = 3; + int8_t y_offset = 0; switch (i) { case 0: - strcpy(dev, devs[0]->name); + icon = devs[0]->icon_logo(); break; case 1: + icon = devs[1]->icon_logo(); + offset = 4; if (devs[1] != nullptr) { strcpy(dev, devs[1]->name); } else { @@ -671,23 +683,44 @@ void MCLGUI::draw_track_type_select(uint8_t x, uint8_t y, } break; case 2: + icon = R.icons_logo->icon_perf_logo_medium; strcpy(dev, "PF"); + offset = 3; break; case 3: + icon = R.icons_logo->icon_route_logo_medium; + w = 14, h = 10; + offset = 5; strcpy(dev, "FX"); break; case 4: + w = 15, h = 12; + offset = 6; + y_offset = -1; + icon = R.icons_logo->icon_metronome_logo_medium; strcpy(dev, "TP"); break; } - oled_display.print(dev); - if (IS_BIT_SET(track_type_select, i)) { - oled_display.fillRect(x, y + 4, seq_w, trig_h, WHITE); +// oled_display.drawRect(x, y - 4, 24, 18, WHITE); + if (icon) { oled_display.drawBitmap(x + offset, 15 + y_offset, icon, w, h, WHITE); } + //oled_display.print(dev); + bool select = IS_BIT_SET(track_type_select, i); + + if (select) { + oled_display.fillRect(x, 9, 24, 21, INVERT); + + oled_display.drawRect(x + 1, 10, 22, 19, BLACK); } else { - oled_display.drawRect(x, y + 4, seq_w, trig_h, WHITE); + oled_display.drawRect(x, 9, 24, 21, WHITE); } - x += 18; + oled_display.drawPixel(x,9,!select); + oled_display.drawPixel(x + 23,9,!select); + oled_display.drawPixel(x,9 + 20,!select); + oled_display.drawPixel(x + 23,9 + 20,!select); + + + x += 26; } } diff --git a/avr/cores/megacommand/MCL/MCLGUI.h b/avr/cores/megacommand/MCL/MCLGUI.h index 4502583ba..e9efc9286 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.h +++ b/avr/cores/megacommand/MCL/MCLGUI.h @@ -88,7 +88,7 @@ class MCLGUI { void draw_leds(uint8_t x, uint8_t y, uint8_t offset, const uint64_t &lock_mask, uint8_t step_count, uint8_t length, bool show_current_step); - void draw_track_type_select(uint8_t x, uint8_t y, uint8_t track_type_select); + void draw_track_type_select(uint8_t track_type_select); void draw_panel_toggle(const char *s1, const char *s2, bool s1_active); void draw_panel_labels(const char *info1, const char *info2); diff --git a/avr/cores/megacommand/MD/MD.cpp b/avr/cores/megacommand/MD/MD.cpp index ba78b1753..1bea2d3ff 100644 --- a/avr/cores/megacommand/MD/MD.cpp +++ b/avr/cores/megacommand/MD/MD.cpp @@ -261,6 +261,7 @@ bool MDClass::probe() { // Caller is responsible to make sure icons_device is loaded in RM uint8_t *MDClass::icon() { return R.icons_device->icon_md; } +uint8_t *MDClass::icon_logo() { return R.icons_logo->icon_md_logo_medium; } uint8_t MDClass::noteToTrack(uint8_t pitch) { uint8_t i; diff --git a/avr/cores/megacommand/MD/MD.h b/avr/cores/megacommand/MD/MD.h index a944c8abe..1541ce069 100644 --- a/avr/cores/megacommand/MD/MD.h +++ b/avr/cores/megacommand/MD/MD.h @@ -63,7 +63,7 @@ class MDClass : public ElektronDevice { virtual void setup(); virtual void init_grid_devices(uint8_t device_idx); virtual uint8_t* icon(); - + virtual uint8_t* icon_logo(); // TODO not necessary if we have FW_CAP_READ_LIVE_KIT virtual bool canReadWorkspaceKit() { return true; } virtual bool canReadKit() { return true; } diff --git a/avr/cores/megacommand/MNM/MNM.cpp b/avr/cores/megacommand/MNM/MNM.cpp index 9b244938f..ec64d771e 100644 --- a/avr/cores/megacommand/MNM/MNM.cpp +++ b/avr/cores/megacommand/MNM/MNM.cpp @@ -111,6 +111,7 @@ uint8_t* MNMClass::icon() { return R.icons_device->icon_mnm; } +uint8_t *MNMClass::icon_logo() { return R.icons_logo->icon_mnm_logo_medium; } void MNMClass::requestKit(uint8_t kit) { uint8_t workspace = 0; diff --git a/avr/cores/megacommand/MNM/MNM.h b/avr/cores/megacommand/MNM/MNM.h index ed4fbc2a6..875519887 100644 --- a/avr/cores/megacommand/MNM/MNM.h +++ b/avr/cores/megacommand/MNM/MNM.h @@ -20,6 +20,7 @@ class MNMClass : public ElektronDevice { virtual bool probe(); virtual void init_grid_devices(uint8_t device_idx); virtual uint8_t* icon(); + virtual uint8_t* icon_logo(); virtual bool canReadWorkspaceKit() { return true; } virtual bool getWorkSpaceKit() { diff --git a/avr/cores/megacommand/resources/R.h b/avr/cores/megacommand/resources/R.h index a4ae75dd5..02ffceaba 100644 --- a/avr/cores/megacommand/resources/R.h +++ b/avr/cores/megacommand/resources/R.h @@ -117,16 +117,16 @@ struct __T_icons_logo { static constexpr size_t sizeofof_icon_md_logo_medium = 27; union { unsigned char icon_analog_logo_medium[0]; - char zz__icon_analog_logo_medium[18]; + char zz__icon_analog_logo_medium[27]; }; - static constexpr size_t countof_icon_analog_logo_medium = 18 / sizeof(unsigned char); - static constexpr size_t sizeofof_icon_analog_logo_medium = 18; + static constexpr size_t countof_icon_analog_logo_medium = 27 / sizeof(unsigned char); + static constexpr size_t sizeofof_icon_analog_logo_medium = 27; union { unsigned char icon_metronome_logo_medium[0]; - char zz__icon_metronome_logo_medium[18]; + char zz__icon_metronome_logo_medium[24]; }; - static constexpr size_t countof_icon_metronome_logo_medium = 18 / sizeof(unsigned char); - static constexpr size_t sizeofof_icon_metronome_logo_medium = 18; + static constexpr size_t countof_icon_metronome_logo_medium = 24 / sizeof(unsigned char); + static constexpr size_t sizeofof_icon_metronome_logo_medium = 24; union { unsigned char icon_route_logo_medium[0]; char zz__icon_route_logo_medium[20]; @@ -134,24 +134,24 @@ struct __T_icons_logo { static constexpr size_t countof_icon_route_logo_medium = 20 / sizeof(unsigned char); static constexpr size_t sizeofof_icon_route_logo_medium = 20; union { - unsigned char icon_perf_logo_small[0]; - char zz__icon_perf_logo_small[8]; + unsigned char icon_perf_logo_medium[0]; + char zz__icon_perf_logo_medium[27]; }; - static constexpr size_t countof_icon_perf_logo_small = 8 / sizeof(unsigned char); - static constexpr size_t sizeofof_icon_perf_logo_small = 8; + static constexpr size_t countof_icon_perf_logo_medium = 27 / sizeof(unsigned char); + static constexpr size_t sizeofof_icon_perf_logo_medium = 27; union { unsigned char icon_mnm_logo_medium[0]; - char zz__icon_mnm_logo_medium[18]; + char zz__icon_mnm_logo_medium[27]; }; - static constexpr size_t countof_icon_mnm_logo_medium = 18 / sizeof(unsigned char); - static constexpr size_t sizeofof_icon_mnm_logo_medium = 18; + static constexpr size_t countof_icon_mnm_logo_medium = 27 / sizeof(unsigned char); + static constexpr size_t sizeofof_icon_mnm_logo_medium = 27; union { unsigned char icon_midi_logo_medium[0]; - char zz__icon_midi_logo_medium[18]; + char zz__icon_midi_logo_medium[27]; }; - static constexpr size_t countof_icon_midi_logo_medium = 18 / sizeof(unsigned char); - static constexpr size_t sizeofof_icon_midi_logo_medium = 18; - static constexpr size_t __total_size = 127; + static constexpr size_t countof_icon_midi_logo_medium = 27 / sizeof(unsigned char); + static constexpr size_t sizeofof_icon_midi_logo_medium = 27; + static constexpr size_t __total_size = 179; }; extern const unsigned char __R_icons_page[] PROGMEM; diff --git a/avr/cores/megacommand/resources/R_icons_logo.cpp b/avr/cores/megacommand/resources/R_icons_logo.cpp index ddd215989..5f7ea821b 100644 --- a/avr/cores/megacommand/resources/R_icons_logo.cpp +++ b/avr/cores/megacommand/resources/R_icons_logo.cpp @@ -24,97 +24,131 @@ const unsigned char __R_icons_logo[] PROGMEM = { 111, 156, 0, - 63, - 224, - 251, - 66, + 15, + 252, + 255, + 0, 16, - 153, - 8, - 189, - 1, - 22, - 7, - 183, - 11, - 60, - 224, - 253, - 28, + 66, 0, - 20, + 39, + 33, + 0, + 47, + 144, + 161, + 92, + 11, + 235, + 17, + 15, + 26, + 191, + 2, + 13, + 4, + 24, + 152, + 26, + 255, + 152, + 50, + 96, + 50, + 64, + 96, + 160, + 97, + 255, 32, - 34, + 194, + 16, 192, - 191, - 1, - 73, - 0, - 67, - 0, - 132, + 16, 255, - 128, - 136, - 128, + 224, + 63, 255, - 128, + 192, 30, 60, 60, - 254, 120, 48, 96, 253, + 237, 248, 120, 240, - 221, 5, + 219, 0, 0, - 185, 3, 72, + 151, 144, - 127, - 60, - 66, - 137, - 133, - 129, - 129, - 238, - 66, - 60, - 252, + 1, + 224, + 255, 0, - 146, + 34, + 17, + 192, + 68, + 73, + 128, + 132, + 253, + 41, + 64, + 132, + 8, + 64, + 164, + 191, + 2, + 98, + 16, + 128, + 225, + 225, + 187, + 0, + 0, + 252, + 252, + 126, + 2, + 204, 204, - 102, + 66, + 121, 207, - 253, - 242, - 200, - 170, - 40, + 207, + 192, + 190, + 60, + 178, + 0, + 42, + 138, + 89, 170, - 168, - 214, - 1, - 200, - 43, - 239, - 255, - 248, - 1, + 27, + 178, + 44, + 246, + 63, + 254, + 2, + 8, 0, 0, 0, 0, 0, - 4, - 255, + 39, 255, }; From bc676e567ac3898c57da61af321e61d8075916a4 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 11 Jul 2023 23:30:41 +1000 Subject: [PATCH 232/413] add sprites --- art/sprites/analog_logo_medium.png | Bin 0 -> 246 bytes art/sprites/analog_logo_small.png | Bin 0 -> 230 bytes art/sprites/fx_logo_small.png | Bin 0 -> 238 bytes art/sprites/md_logo_medium.png | Bin 0 -> 240 bytes art/sprites/md_logo_medium_thick.png | Bin 0 -> 237 bytes art/sprites/md_logo_small.png | Bin 0 -> 227 bytes art/sprites/metronome_larger.png | Bin 0 -> 267 bytes art/sprites/metronome_logo_medium.png | Bin 0 -> 231 bytes art/sprites/metronome_logo_small.png | Bin 0 -> 231 bytes art/sprites/midi_logo_medium.png | Bin 0 -> 242 bytes art/sprites/mnm_logo_medium.png | Bin 0 -> 202 bytes art/sprites/mnm_logo_small.png | Bin 0 -> 200 bytes art/sprites/perf_logo_medium.png | Bin 0 -> 251 bytes art/sprites/perf_logo_small.png | Bin 0 -> 211 bytes art/sprites/route_logo_medium.png | Bin 0 -> 251 bytes art/sprites/sample_icon.png | Bin 0 -> 338 bytes 16 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 art/sprites/analog_logo_medium.png create mode 100644 art/sprites/analog_logo_small.png create mode 100644 art/sprites/fx_logo_small.png create mode 100644 art/sprites/md_logo_medium.png create mode 100644 art/sprites/md_logo_medium_thick.png create mode 100644 art/sprites/md_logo_small.png create mode 100644 art/sprites/metronome_larger.png create mode 100644 art/sprites/metronome_logo_medium.png create mode 100644 art/sprites/metronome_logo_small.png create mode 100644 art/sprites/midi_logo_medium.png create mode 100644 art/sprites/mnm_logo_medium.png create mode 100644 art/sprites/mnm_logo_small.png create mode 100644 art/sprites/perf_logo_medium.png create mode 100644 art/sprites/perf_logo_small.png create mode 100644 art/sprites/route_logo_medium.png create mode 100644 art/sprites/sample_icon.png diff --git a/art/sprites/analog_logo_medium.png b/art/sprites/analog_logo_medium.png new file mode 100644 index 0000000000000000000000000000000000000000..ac67241d7820ec99ac1efcf93760fa30efd5d592 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^LO{&P!3HGl@7M4HDaPU;cPEB*=VV?2ITooAo@u_m z3|c@o2Loe!CIbsd2@p#GF#`kB0w%bK&;n*Sn-e6tF3{``kjn9NaSYKA-8vzVtHFTB zIsD_l@Of?(s@=ao96y-xS;{H1*YMfj-)DE8cy=@7YLj0$muK@c>v=vK&vV%YoL9c_ z{LCC#hgIzzOOH+eDmtZY{jdEBd56?iK8*Z*L+Z!JJ3AhqoThNd#>F=J=flJb{omz= UygGAOJwf(+y85}Sb4q9e0D*%~ivR!s literal 0 HcmV?d00001 diff --git a/art/sprites/analog_logo_small.png b/art/sprites/analog_logo_small.png new file mode 100644 index 0000000000000000000000000000000000000000..a8008f9de5354f241d884ceb4c471a758ef5003a GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp@K+M6x1|*f#O3wo+#^NA%Cx&(BWL^R}7O4@QX}-P; zS|C*njP02WEFdL7ECs|23``4{;3B*WnBi;=kfhV2txtedjHioZh=gS8gh0Ln3LMUf zH~+3bqjOUEZ-LjMDNcbWI#!e}S~d5<`qZ@Nad(9r7FZPSoYd;jYSe%5-kXmJ?GNwt zpExNkH?jWk$90X@7H&-A>+*}~4mlwt@Nw4X0{I1+h8#_wm6<^HdAjnA0}4Dx zu08br_21sgzvIr9WY)mPOU-_*SiPcS#+CWyW#ad^6&W(s?ln|%yxZOV$nbz++0~92 z`~UW>l@}=e7PZN0lTE{k{yS46H*wG5R62CiKJ~~M6>Ig&t=rj?l{G7vYUY}P?Dcf@ Kb6Mw<&;$To#70E` literal 0 HcmV?d00001 diff --git a/art/sprites/md_logo_medium.png b/art/sprites/md_logo_medium.png new file mode 100644 index 0000000000000000000000000000000000000000..4eb2093dea499dd7706dd56d2ddc3ce3e6bb4493 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^LO{&P!3HGl@7M4HDaPU;cPEB*=VV?2ITooAo@u_m z3|c@o2Loe!CIbsd2@p#GF#`kB0w%bK&;n*Sn-e6tF3{``kV^A(aSYKA?VZrb#h}RH zeD(kTbnDiWdQ*6uVn3&@?D(-gd*}aCS3fRULjnJuHkM_(+x~U^G%->3^ELD|_xy-ZAtV})^Wxk&Me*FTEz3El8_}e1$kN*>%*|OD5k#$=Pd%V;-c|q-eOFx6G^>p=f JS?83{1ON-PK>z>% literal 0 HcmV?d00001 diff --git a/art/sprites/md_logo_small.png b/art/sprites/md_logo_small.png new file mode 100644 index 0000000000000000000000000000000000000000..95648eb58720e0611e466e699e2a601e017f4412 GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^fuq{Jc&&NuFwJzoW}3^J=PS2u;=DbhVemFtc5L zHs_>@C~=mgpqa023X_e~zR9innQf=4EcX0u%ha3feTKize6-r?b)k3pw~upoZZj|a p^ZQopgXeM)_MF$tH$Ki2DQ7mkZz=0h{`(ThQJ$`TF6*2UngGfSR@ndm literal 0 HcmV?d00001 diff --git a/art/sprites/metronome_logo_medium.png b/art/sprites/metronome_logo_medium.png new file mode 100644 index 0000000000000000000000000000000000000000..65542565b6faf48a1325cff48e8559c0e3c01e96 GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^+(699!3HFsq+HVlQjEnx?oJHr&dIz4ax79KJkxxA z8MJ_G4hF{dOa>N^5+IfWVg?4L1x#=e?gh+nHYZ5(#y0I3AQkKB;us)_i8ZrM_UHRi~n{N^5+IfWVg?4L1x#=e?gh+nHYZ5(#y0I3AQkKB;us)_i8ZrM_UHRi~n{wp3e z^X-lQ>vu+<;#;K=o!F$JVwzE6++7{*(v+cB?mtDZ&;IrK9kK$7&R-SwZJF9<&!V_) zg7jLO%=yh_j4#$I{CZU2YHGDD<}RE4%-YutJG*N7wp_cMb>d7t_b!H%dRdW~zKTyk Oc6++|xvXs literal 0 HcmV?d00001 diff --git a/art/sprites/mnm_logo_medium.png b/art/sprites/mnm_logo_medium.png new file mode 100644 index 0000000000000000000000000000000000000000..91c7f53c1ba9d8a6553780669dfc15a7345e47b8 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^LO{&P!3HGl@7M4HDaPU;cPEB*=VV?2ITooAo@u_m z3|c@o2Loe!CIbsd2@p#GF#`kB0w%bK&;n*Sn-e6tF3{``kaF;JaSYKAP5#5r!V|%u ztgIX%(r&`+Be!fS=dlG-+N4=FG2RtRIm~(TFt5`!7rtr<=_5_rHU+NMKDN7Tt{&oG XP!Z&noW|KUA7rMdtDnm{r-UW|o;NB* literal 0 HcmV?d00001 diff --git a/art/sprites/mnm_logo_small.png b/art/sprites/mnm_logo_small.png new file mode 100644 index 0000000000000000000000000000000000000000..e7b13420fe5ae1ea0eb66d28900fe88dd7d5a8af GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~c!3HEhl+{lMQjEnx?oJHr&dIz4ax79KJkxxA z8MHvE7#Q0#8CXC{fLIEM85o!rFu_Fx7BIuv93V+|-u`YNW#{SQ7@{GX{D+@~CxSs) zSvf+a-Gtd^9%pylq?QM44L&V1yUw!2d@5kxkg4RB^ME(u;8UNNh5W(%lb7G%X86&_ UD{j-n4RSMsr>mdKI;Vst0Np|>tpET3 literal 0 HcmV?d00001 diff --git a/art/sprites/perf_logo_medium.png b/art/sprites/perf_logo_medium.png new file mode 100644 index 0000000000000000000000000000000000000000..5f111d39640e2f4dad1910e33b8f1b75e3188e1a GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^LO{&P!3HGl@7M4HDaPU;cPEB*=VV?2ITooAo@u_m z3|c@o2Loe!CIbsd2@p#GF#`kB0w%bK&;n*Sn-e6tF3{``kSg?aaSYKAog2i+#h}P> z`NjYEZ+YbvJ~IncLM)!gOq?Bg$J@6?!9_S0FeBI?$!$K789>U@)5S4FLbA4>k&8irgE{oq z|LJQv*^?$t*nBo}*UYDu(;^paI&_zN`X-l-Bx&*Blu10RnAtlH{LPwhVScsQ1F>T= gohR;ZIbD91cg+$7{&}qD>_LWmy85}Sb4q9e00=ua&Hw-a literal 0 HcmV?d00001 diff --git a/art/sprites/route_logo_medium.png b/art/sprites/route_logo_medium.png new file mode 100644 index 0000000000000000000000000000000000000000..2788cdddb0e97fdf5adc352d54d596834e0f992b GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^d_c^_!3HE-Zss2cQjEnx?oJHr&dIz4ax79KJkxxA z8MJ_G4hF{dOa>N^5+IfWVg?4L1x#=ez6H#1Hpm8s>>YbSRH3JfV~B=m?Zied21O2M z(_jDN-_6;Q>?zjrZ1%FJY1@*XN4+lp{N~;4mK7TugAQtQ<`_*36P8#U`mFHs&HG`F zR}`3~qn3u%ZJZOx`fBlndHnV_wuaujck^-R?wJDXb%X_7q;G^?F#J=n?G(%0=G=QX Y*l#hL$i0}oat+9KPgg&ebxsLQ0DrMglK=n! literal 0 HcmV?d00001 diff --git a/art/sprites/sample_icon.png b/art/sprites/sample_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1f02b14bd14932929ead3a1b71c079d8eda81e50 GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0vp^5z6J%3 zmaSj^toNS$yfXNnH{fA`z__V!&Q-DA+6zO zY^H9vhgXqd88^oa*SvCus~t}l&r~`fpxME?|mo_{I&T)(;d;zi*tF zTz25(8|9b1rPe>V+yv9ue^?yW6W>wyD`@S!c^T|Ad(0a(HcTyNaF#W6;+E)60r}0- L)z4*}Q$iB}D{gVI literal 0 HcmV?d00001 From 36f20ddab81148a3ca1dd08f8cfd8cd82126f98e Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 11 Jul 2023 23:31:57 +1000 Subject: [PATCH 233/413] update gfx --- avr/cores/megacommand/MCL/MCLGUI.cpp | 6 +- avr/cores/megacommand/MCL/MCLGUI.h | 2 +- .../megacommand/resources/R_icons_logo.cpp | 76 ++++++++++--------- 3 files changed, 44 insertions(+), 40 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCLGUI.cpp b/avr/cores/megacommand/MCL/MCLGUI.cpp index 43a7acf33..b84b8ddd5 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.cpp +++ b/avr/cores/megacommand/MCL/MCLGUI.cpp @@ -654,15 +654,17 @@ void MCLGUI::draw_track_type_select(uint8_t track_type_select) { midi_active_peering.get_device(UART1_PORT), midi_active_peering.get_device(UART2_PORT), }; - oled_display.clearDisplay(); +// oled_display.clearDisplay(); uint8_t x = 0; - oled_display.fillRect(0, 0, 128, 7, WHITE); + //oled_display.fillRect(0, 0, 128, 7, WHITE); + oled_display.fillRect(s_title_x + 10, 0, 40, 7, WHITE); oled_display.setCursor(s_title_x + (s_title_w - 5 * 4) / 2, 6); // oled_display.setCursor(s_title_x + 2, s_menu_y + 3); oled_display.setTextColor(BLACK); oled_display.println("GROUPS"); + oled_display.fillRect(0, 8, 128, 23, BLACK); for (uint8_t i = 0; i < 5; i++) { uint8_t *icon = nullptr; diff --git a/avr/cores/megacommand/MCL/MCLGUI.h b/avr/cores/megacommand/MCL/MCLGUI.h index e9efc9286..8dfce8c41 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.h +++ b/avr/cores/megacommand/MCL/MCLGUI.h @@ -104,7 +104,7 @@ class MCLGUI { static constexpr uint8_t trig_h = 5; static constexpr uint8_t s_menu_w = 104; - static constexpr uint8_t s_menu_h = 24; + static constexpr uint8_t s_menu_h = 25; static constexpr uint8_t s_menu_x = (128 - s_menu_w) / 2; static constexpr uint8_t s_menu_y = (32 - s_menu_h) / 2; static constexpr uint8_t s_title_x = 31; diff --git a/avr/cores/megacommand/resources/R_icons_logo.cpp b/avr/cores/megacommand/resources/R_icons_logo.cpp index 5f7ea821b..200c48cd5 100644 --- a/avr/cores/megacommand/resources/R_icons_logo.cpp +++ b/avr/cores/megacommand/resources/R_icons_logo.cpp @@ -2,153 +2,155 @@ const unsigned char __R_icons_logo[] PROGMEM = { 246, 15, - 129, + 131, 192, 31, 2, 249, 63, - 131, + 135, 128, 127, 124, - 251, - 135, + 255, + 143, 0, - 115, + 119, + 190, + 39, 190, - 35, - 158, 0, - 3, + 7, 111, - 156, + 188, 0, 15, 252, - 255, + 237, 0, 16, 66, - 0, - 39, + 14, + 246, 33, 0, 47, - 144, 161, - 92, + 2, + 11, 11, - 235, + 157, 17, 15, - 26, - 191, + 183, + 156, + 2, 2, 13, + 255, 4, 24, 152, 26, - 255, 152, 50, 96, 50, + 255, 64, 96, 160, 97, - 255, 32, 194, 16, 192, + 255, 16, 255, 224, 63, - 255, 192, 30, 60, 60, + 254, 120, 48, 96, 253, - 237, 248, 120, 240, + 221, 5, - 219, 0, 0, + 185, 3, 72, - 151, 144, + 127, 1, 224, - 255, 0, 34, 17, 192, + 255, 68, 73, 128, 132, - 253, 41, 64, 132, 8, + 219, 64, 164, - 191, 2, 98, + 251, 16, 128, 225, 225, - 187, 0, 0, + 183, 252, 252, - 126, 2, + 228, 204, 204, - 66, - 121, + 39, 207, 207, + 155, 192, - 190, 60, 178, + 229, 0, 42, 138, - 89, + 145, 170, - 27, + 191, 178, 44, - 246, 63, 254, + 96, 2, - 8, - 0, + 128, 0, 0, 0, 0, - 39, + 2, + 127, 255, }; From e1db5b72f004b25c68f96bdb900302328b412ca2 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 13 Jul 2023 18:39:11 +1000 Subject: [PATCH 234/413] MCLGIF class and associated animations. WIP --- .../analog_frames/pixil-frame-0.png | Bin 0 -> 171 bytes .../analog_frames/pixil-frame-1.png | Bin 0 -> 178 bytes .../analog_frames/pixil-frame-2.png | Bin 0 -> 158 bytes .../analog_frames/pixil-frame-3.png | Bin 0 -> 163 bytes .../analog_frames/pixil-frame-4.png | Bin 0 -> 152 bytes .../analog_frames/pixil-frame-5.png | Bin 0 -> 139 bytes .../analog_frames/pixil-frame-6.png | Bin 0 -> 125 bytes art/animations/analog_logo_7frames.pixil | 1 + art/animations/machinedrum_8frames.pixil | 1 + .../machinedrum_frames/pixil-frame-0.png | Bin 0 -> 182 bytes .../machinedrum_frames/pixil-frame-1.png | Bin 0 -> 183 bytes .../machinedrum_frames/pixil-frame-2.png | Bin 0 -> 183 bytes .../machinedrum_frames/pixil-frame-3.png | Bin 0 -> 190 bytes .../machinedrum_frames/pixil-frame-4.png | Bin 0 -> 192 bytes .../machinedrum_frames/pixil-frame-5.png | Bin 0 -> 185 bytes .../machinedrum_frames/pixil-frame-6.png | Bin 0 -> 184 bytes .../machinedrum_frames/pixil-frame-7.png | Bin 0 -> 190 bytes art/animations/metronome_10frames_fixed.pixil | 1 + .../metronome_frames/pixil-frame-0.png | Bin 0 -> 198 bytes .../metronome_frames/pixil-frame-1.png | Bin 0 -> 200 bytes .../metronome_frames/pixil-frame-2.png | Bin 0 -> 195 bytes .../metronome_frames/pixil-frame-3.png | Bin 0 -> 188 bytes .../metronome_frames/pixil-frame-4.png | Bin 0 -> 187 bytes .../metronome_frames/pixil-frame-5.png | Bin 0 -> 190 bytes .../metronome_frames/pixil-frame-6.png | Bin 0 -> 194 bytes .../metronome_frames/pixil-frame-7.png | Bin 0 -> 197 bytes .../metronome_frames/pixil-frame-8.png | Bin 0 -> 198 bytes .../metronome_frames/pixil-frame-9.png | Bin 0 -> 201 bytes art/animations/midi_frames/pixil-frame-0.png | Bin 0 -> 174 bytes art/animations/midi_frames/pixil-frame-1.png | Bin 0 -> 171 bytes art/animations/midi_frames/pixil-frame-2.png | Bin 0 -> 177 bytes art/animations/midi_frames/pixil-frame-3.png | Bin 0 -> 172 bytes art/animations/midi_frames/pixil-frame-4.png | Bin 0 -> 179 bytes art/animations/midi_frames/pixil-frame-5.png | Bin 0 -> 175 bytes art/animations/midi_frames/pixil-frame-6.png | Bin 0 -> 181 bytes art/animations/midi_frames/pixil-frame-7.png | Bin 0 -> 172 bytes art/animations/midi_logo_eightframes.pixil | 1 + art/animations/mono_logo_10frames.pixil | 1 + .../monomachine_frames/pixil-frame-0.png | Bin 0 -> 149 bytes .../monomachine_frames/pixil-frame-1.png | Bin 0 -> 160 bytes .../monomachine_frames/pixil-frame-2.png | Bin 0 -> 155 bytes .../monomachine_frames/pixil-frame-3.png | Bin 0 -> 160 bytes .../monomachine_frames/pixil-frame-4.png | Bin 0 -> 144 bytes .../monomachine_frames/pixil-frame-5.png | Bin 0 -> 147 bytes .../monomachine_frames/pixil-frame-6.png | Bin 0 -> 143 bytes .../monomachine_frames/pixil-frame-7.png | Bin 0 -> 135 bytes .../monomachine_frames/pixil-frame-8.png | Bin 0 -> 122 bytes .../monomachine_frames/pixil-frame-9.png | Bin 0 -> 112 bytes art/animations/perf_frames/pixil-frame-0.png | Bin 0 -> 191 bytes art/animations/perf_frames/pixil-frame-1.png | Bin 0 -> 192 bytes art/animations/perf_frames/pixil-frame-2.png | Bin 0 -> 193 bytes art/animations/perf_frames/pixil-frame-3.png | Bin 0 -> 194 bytes art/animations/perf_frames/pixil-frame-4.png | Bin 0 -> 192 bytes art/animations/perf_frames/pixil-frame-5.png | Bin 0 -> 189 bytes art/animations/perf_frames/pixil-frame-6.png | Bin 0 -> 194 bytes art/animations/perf_logo_7frames.pixil | 1 + art/animations/route_frames/pixil-frame-0.png | Bin 0 -> 170 bytes art/animations/route_frames/pixil-frame-1.png | Bin 0 -> 170 bytes art/animations/route_frames/pixil-frame-2.png | Bin 0 -> 170 bytes art/animations/route_frames/pixil-frame-3.png | Bin 0 -> 168 bytes art/animations/route_frames/pixil-frame-4.png | Bin 0 -> 151 bytes art/animations/route_logo_5frames.pixil | 1 + avr/cores/megacommand/MCL/MCLGUI.cpp | 48 +- avr/cores/megacommand/MCL/MCLGUI.h | 4 +- avr/cores/megacommand/MCL/MCLGfx.cpp | 9 + avr/cores/megacommand/MCL/MCLGfx.h | 77 +- avr/cores/megacommand/resources/R.h | 44 +- .../megacommand/resources/R_icons_logo.cpp | 762 ++++++++++++++++-- resource/icons_logo.cpp | 233 ++++++ 69 files changed, 1086 insertions(+), 98 deletions(-) create mode 100644 art/animations/analog_frames/pixil-frame-0.png create mode 100644 art/animations/analog_frames/pixil-frame-1.png create mode 100644 art/animations/analog_frames/pixil-frame-2.png create mode 100644 art/animations/analog_frames/pixil-frame-3.png create mode 100644 art/animations/analog_frames/pixil-frame-4.png create mode 100644 art/animations/analog_frames/pixil-frame-5.png create mode 100644 art/animations/analog_frames/pixil-frame-6.png create mode 100644 art/animations/analog_logo_7frames.pixil create mode 100644 art/animations/machinedrum_8frames.pixil create mode 100644 art/animations/machinedrum_frames/pixil-frame-0.png create mode 100644 art/animations/machinedrum_frames/pixil-frame-1.png create mode 100644 art/animations/machinedrum_frames/pixil-frame-2.png create mode 100644 art/animations/machinedrum_frames/pixil-frame-3.png create mode 100644 art/animations/machinedrum_frames/pixil-frame-4.png create mode 100644 art/animations/machinedrum_frames/pixil-frame-5.png create mode 100644 art/animations/machinedrum_frames/pixil-frame-6.png create mode 100644 art/animations/machinedrum_frames/pixil-frame-7.png create mode 100644 art/animations/metronome_10frames_fixed.pixil create mode 100644 art/animations/metronome_frames/pixil-frame-0.png create mode 100644 art/animations/metronome_frames/pixil-frame-1.png create mode 100644 art/animations/metronome_frames/pixil-frame-2.png create mode 100644 art/animations/metronome_frames/pixil-frame-3.png create mode 100644 art/animations/metronome_frames/pixil-frame-4.png create mode 100644 art/animations/metronome_frames/pixil-frame-5.png create mode 100644 art/animations/metronome_frames/pixil-frame-6.png create mode 100644 art/animations/metronome_frames/pixil-frame-7.png create mode 100644 art/animations/metronome_frames/pixil-frame-8.png create mode 100644 art/animations/metronome_frames/pixil-frame-9.png create mode 100644 art/animations/midi_frames/pixil-frame-0.png create mode 100644 art/animations/midi_frames/pixil-frame-1.png create mode 100644 art/animations/midi_frames/pixil-frame-2.png create mode 100644 art/animations/midi_frames/pixil-frame-3.png create mode 100644 art/animations/midi_frames/pixil-frame-4.png create mode 100644 art/animations/midi_frames/pixil-frame-5.png create mode 100644 art/animations/midi_frames/pixil-frame-6.png create mode 100644 art/animations/midi_frames/pixil-frame-7.png create mode 100644 art/animations/midi_logo_eightframes.pixil create mode 100644 art/animations/mono_logo_10frames.pixil create mode 100644 art/animations/monomachine_frames/pixil-frame-0.png create mode 100644 art/animations/monomachine_frames/pixil-frame-1.png create mode 100644 art/animations/monomachine_frames/pixil-frame-2.png create mode 100644 art/animations/monomachine_frames/pixil-frame-3.png create mode 100644 art/animations/monomachine_frames/pixil-frame-4.png create mode 100644 art/animations/monomachine_frames/pixil-frame-5.png create mode 100644 art/animations/monomachine_frames/pixil-frame-6.png create mode 100644 art/animations/monomachine_frames/pixil-frame-7.png create mode 100644 art/animations/monomachine_frames/pixil-frame-8.png create mode 100644 art/animations/monomachine_frames/pixil-frame-9.png create mode 100644 art/animations/perf_frames/pixil-frame-0.png create mode 100644 art/animations/perf_frames/pixil-frame-1.png create mode 100644 art/animations/perf_frames/pixil-frame-2.png create mode 100644 art/animations/perf_frames/pixil-frame-3.png create mode 100644 art/animations/perf_frames/pixil-frame-4.png create mode 100644 art/animations/perf_frames/pixil-frame-5.png create mode 100644 art/animations/perf_frames/pixil-frame-6.png create mode 100644 art/animations/perf_logo_7frames.pixil create mode 100644 art/animations/route_frames/pixil-frame-0.png create mode 100644 art/animations/route_frames/pixil-frame-1.png create mode 100644 art/animations/route_frames/pixil-frame-2.png create mode 100644 art/animations/route_frames/pixil-frame-3.png create mode 100644 art/animations/route_frames/pixil-frame-4.png create mode 100644 art/animations/route_logo_5frames.pixil create mode 100644 resource/icons_logo.cpp diff --git a/art/animations/analog_frames/pixil-frame-0.png b/art/animations/analog_frames/pixil-frame-0.png new file mode 100644 index 0000000000000000000000000000000000000000..8df0c738bf18b67566d4001598d98926721be1cc GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}sh%#5Ar}5` zCwX%*C~&xZ{nu{B({pi3f%eu@{{5L#Iz2f0I=DAJd3WYbGK;2)Sw{J^e#@hIoDmM8 zY;_0q0=}8H@-obfH=DH0{c6drU}M&)H>X}&yywo2w1ex@KO1hVzi@lcK{?&B+X-BO T=RfiREoAU?^>bP0l+XkK#SK2@ literal 0 HcmV?d00001 diff --git a/art/animations/analog_frames/pixil-frame-1.png b/art/animations/analog_frames/pixil-frame-1.png new file mode 100644 index 0000000000000000000000000000000000000000..f0be2726429557b6de3d0f3daaa26b36349b58e9 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}Ii4<#Ar}5` zCwucTC~`QT{>y)M3AfPC7bzF6x=i=2^m1fez~OG{c}`JjBTGn(sN&SZE86|cuA5`C zABe7D30*7rjagu`U%z?|58zD%brEDT=6&8XzxEEc&+wgb`rrQ6gbtTknz2f+rsUX_oN!SQv6-l8Y+SO6$&qX0*?rqWI5zpdh-dnF z^+L$)&Ueh2eD0E!2UhvD+WJhj?s{jq_F=HE@~)4~-x_V_1Ty=5^x%?Sd}#vEA_h-a KKbLh*2~7Z=A2}!h literal 0 HcmV?d00001 diff --git a/art/animations/analog_frames/pixil-frame-4.png b/art/animations/analog_frames/pixil-frame-4.png new file mode 100644 index 0000000000000000000000000000000000000000..3ed601cd39a256ec537d94ea5a06471ff962c4d6 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}L7py-Ar}5` zCmC`v7;rF8{%?Qlk%C9N%P!H9P<~5i2F74P#z{q5yM;mo*e5Tjjy&kL;AH6hrdP4& y`-BWWPA>lTS9V#`lHg~PZvEo^wCUQ!@)8Cn4JR&BmmF!J=?tE(elF{r5}E*CBr!Gs literal 0 HcmV?d00001 diff --git a/art/animations/analog_frames/pixil-frame-5.png b/art/animations/analog_frames/pixil-frame-5.png new file mode 100644 index 0000000000000000000000000000000000000000..24598a397be76a7f91aa9fe7f7e82608bc95fbf6 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}uAVNAAr}5` zCmC`v81OKC{olW>aDxGD#{7igQ#ZY*`nS?lAS)TyIffU5<^5wW|L7&Ft5` ldwy%{j%BP*H`%>=!SFmrh0A$qkQC5B22WQ%mvv4FO#pL@E!6-3 literal 0 HcmV?d00001 diff --git a/art/animations/analog_frames/pixil-frame-6.png b/art/animations/analog_frames/pixil-frame-6.png new file mode 100644 index 0000000000000000000000000000000000000000..5d9b00f1610c67fc38b692919befc4693c168f5e GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}=AJH&Ar}70 zDG3Qb&O5Lk@aS>;|Nnn_LJEuKQC>G*scnfaK1PSR;ypk<@qGJrO6;5 zh`B@imSdlzs%piND?ic$Cra+tTBf$&v1Iewol6fpgw6`i(tRB7Sh(%elBE}|ckftm fYx(QIw-=e$3A(aW^S#vo+RfnU>gTe~DWM4fm>@&C literal 0 HcmV?d00001 diff --git a/art/animations/machinedrum_frames/pixil-frame-1.png b/art/animations/machinedrum_frames/pixil-frame-1.png new file mode 100644 index 0000000000000000000000000000000000000000..78cb6fbc32b7e758e17cfb03a61027f40c28406e GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}g`O^sAr}5` zCmj@GP+)QS`M>{~!Q#jutI}1$8*S4Pm4upS!H+N0I f`^(=~e9vGw)#S<*{Pf^Apydpnu6{1-oD!MI literal 0 HcmV?d00001 diff --git a/art/animations/machinedrum_frames/pixil-frame-3.png b/art/animations/machinedrum_frames/pixil-frame-3.png new file mode 100644 index 0000000000000000000000000000000000000000..24bb54a0f47f7185a833251601fa0d4252c3dc8c GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}6`n4RAr}5` zCk65yP~dQW`IrCgAu$=Ji9goI&w8|3L{Z84j?`m&rVp1keJ|C@c)CaO==KE-Qx(_@ zxdo>w9C)6=zB1-0$AzF--_GO~En(W6m%Hj%(d@+EOl-FfUcT~Yb=|cysb}&e|8r_= o3;)04lXlU=re6p0+-lwU>!!N0T-x*wLX15CQW>H&n?+(xv44$rjF6*2UngDudNMQf~ literal 0 HcmV?d00001 diff --git a/art/animations/machinedrum_frames/pixil-frame-5.png b/art/animations/machinedrum_frames/pixil-frame-5.png new file mode 100644 index 0000000000000000000000000000000000000000..dff15a02df17126affcda3f81485c34cdb0754ed GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}#hxyXAr}5` zCk65yP~dQW_^&-}rDUhJ!sGb=M}p)-MFoYU((X@MwaKMP&DiO>o{VJW<9k!C{t$X| zkvYw}x5-%T)EB9kdnTI-wPv{M*7e`l i7xey`ljm0J#{YMMH_HS@i>*NG89ZJ6T-G@yGywp~g+;Ca literal 0 HcmV?d00001 diff --git a/art/animations/machinedrum_frames/pixil-frame-6.png b/art/animations/machinedrum_frames/pixil-frame-6.png new file mode 100644 index 0000000000000000000000000000000000000000..bb9b889f76f3eab9e63da86e0e3d78c016b1165a GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}MV>B>Ar}5` zCpq#RP~c#>`QLsPTM!RZSLUVJ^F#__#2s9G@(lgm&oX>a-PKPrG*J1J^ zucDFVdQ&MBb@06dpM+W-In literal 0 HcmV?d00001 diff --git a/art/animations/machinedrum_frames/pixil-frame-7.png b/art/animations/machinedrum_frames/pixil-frame-7.png new file mode 100644 index 0000000000000000000000000000000000000000..74f1248b2863b599b731e7124ceaffc94a1f0210 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}6`n4RAr}5` zCwX%nFyL_c`mcSP%cMu?L7f3F7DYZ?tp8X;c;bXerFSdz&*V6l$Uk;FGPhIV_ySp$ z#z|6XL9YH2lm%AZoRwtjl=Wrvi;Et&Se+-QE6Zf8bXc%z_WPzJ&d{Bw7n|hF?Y7w@ od+JS;@zv#jyRxMBKflQ8eb|ZR%$4#NKsPXWy85}Sb4q9e0Nx!+3IG5A literal 0 HcmV?d00001 diff --git a/art/animations/metronome_10frames_fixed.pixil b/art/animations/metronome_10frames_fixed.pixil new file mode 100644 index 000000000..04be5051e --- /dev/null +++ b/art/animations/metronome_10frames_fixed.pixil @@ -0,0 +1 @@ +{"application":"pixil","type":".pixil","version":"2.7.0","website":"pixilart.com","author":"https://www.pixilart.com","contact":"support@pixilart.com","width":"17","height":"15","colors":{"default":["000000","ffffff","f44336","E91E63","9C27B0","673AB7","3F51B5","2196F3","03A9F4","00BCD4","009688","4CAF50","8BC34A","CDDC39","FFEB3B","FFC107","FF9800","FF5722","795548","9E9E9E","607D8B","ffebee","ffcdd2","ef9a9a","e57373","ef5350","e53935","d32f2f","c62828","b71c1c","ff8a80","ff5252","ff1744","d50000","fce4ec","f8bbd0","f48fb1","f06292","ec407a","e91e63","d81b60","c2185b","ad1457","880e4f","ff80ab","ff4081","f50057","c51162","f3e5f5","e1bee7","ce93d8","ba68c8","ab47bc","9c27b0","8e24aa","7b1fa2","6a1b9a","4a148c","ea80fc","e040fb","d500f9","aa00ff","ede7f6","d1c4e9","b39ddb","9575cd","7e57c2","673ab7","5e35b1","512da8","4527a0","311b92","b388ff","7c4dff","651fff","6200ea","e8eaf6","c5cae9","9fa8da","7986cb","5c6bc0","3f51b5","3949ab","303f9f","283593","1a237e","8c9eff","536dfe","3d5afe","304ffe","e3f2fd","bbdefb","90caf9","64b5f6","42a5f5","2196f3","1e88e5","1976d2","1565c0","0d47a1","82b1ff","448aff","2979ff","2962ff","e1f5fe","b3e5fc","81d4fa","4fc3f7","29b6f6","03a9f4","039be5","0288d1","0277bd","01579b","80d8ff","40c4ff","00b0ff","0091ea","e0f7fa","b2ebf2","80deea","4dd0e1","26c6da","00bcd4","00acc1","0097a7","00838f","006064","84ffff","18ffff","00e5ff","00b8d4","e0f2f1","b2dfdb","80cbc4","4db6ac","26a69a","009688","00897b","00796b","00695c","004d40","a7ffeb","64ffda","1de9b6","00bfa5","e8f5e9","c8e6c9","a5d6a7","81c784","66bb6a","4caf50","43a047","388e3c","2e7d32","1b5e20","b9f6ca","69f0ae","00e676","00c853","f1f8e9","dcedc8","c5e1a5","aed581","9ccc65","8bc34a","7cb342","689f38","558b2f","33691e","ccff90","b2ff59","76ff03","64dd17","f9fbe7","f0f4c3","e6ee9c","dce775","d4e157","cddc39","c0ca33","afb42b","9e9d24","827717","f4ff81","eeff41","c6ff00","aeea00","fffde7","fff9c4","fff59d","fff176","ffee58","ffeb3b","fdd835","fbc02d","f9a825","f57f17","ffff8d","ffff00","ffea00","ffd600","fff8e1","ffecb3","ffe082","ffd54f","ffca28","ffc107","ffb300","ffa000","ff8f00","ff6f00","ffe57f","ffd740","ffc400","ffab00","fff3e0","ffe0b2","ffcc80","ffb74d","ffa726","ff9800","fb8c00","f57c00","ef6c00","e65100","ffd180","ffab40","ff9100","ff6d00","fbe9e7","ffccbc","ffab91","ff8a65","ff7043","ff5722","f4511e","e64a19","d84315","bf360c","ff9e80","ff6e40","ff3d00","dd2c00","efebe9","d7ccc8","bcaaa4","a1887f","8d6e63","795548","6d4c41","5d4037","4e342e","3e2723","fafafa","f5f5f5","eeeeee","e0e0e0","bdbdbd","9e9e9e","757575","616161","424242","212121","eceff1","cfd8dc","b0bec5","90a4ae","78909c","607d8b","546e7a","455a64","37474f","263238"],"simple":["ffffff","d4d4d4","a1a1a1","787878","545454","303030","000000","edc5c5","e68383","ff0000","de2424","ad3636","823737","592b2b","f5d2ee","eb8dd7","f700b9","bf1f97","9c277f","732761","4f2445","e2bcf7","bf79e8","9d00ff","8330ba","6d3096","502c69","351b47","c5c3f0","736feb","0905f7","2e2eb0","2d2d80","252554","090936","c7e2ed","6ac3e6","00bbff","279ac4","347c96","2d5b6b","103947","bbf0d9","6febb3","00ff88","2eb878","349166","2b694c","0c3d25","c2edc0","76ed70","0dff00","36c72c","408c3b","315c2e","144511","d6edbb","b5eb73","8cff00","89c93a","6f8f44","4b632a","2a400c","f1f2bf","eef069","ffff00","baba30","91913f","5e5e2b","3b3b09","ffdeb8","f2ae61","ff8400","c48037","85623d","573e25","3d2309","fcbbae","ff8066","ff2b00","cc553d","9c5b4e","61372e","36130b"],"common":["000000","ffffff","464646","b4b4b4","990030","9c5a3c","ed1c24","ffa3b1","ff7e00","e5aa7a","ffc20e","f5e49c","fff200","fff9bd","a8e61d","d3f9bc","22b14c","00b7ef","99d9ea","4d6df3","709ad1","2f3699","546d8e","6f3198","b5a5d5"],"skin tones":["ffe0bd","ffdbac","ffcd94","eac086","e0ac69","f1c27d","ffad60","c68642","8d5524","896347","765339","613D24","4C2D17","391E0B","351606","2D1304","180A01","090300"],"Black and White":["FFFFFF","000000","FFFFFE","000001","ff0000","ffffff"]},"colorSelected":"Black and White","frames":[{"name":"","speed":"100","layers":[{"id":0,"src":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAAXNSR0IArs4c6QAAAHZJREFUOE/Nk8EOwCAIQ9f//2gWDhCsRUx2mSeD8mxLhJnZ83Hh/xAAi8nOtd9r7QTEm32vIFGXkAoIORXE5yMkXytqRsh24dCcKnnEE0RmUyEqC85Ehbxk0kE4VFaTkBuAmpTXRoj6Vmxpg9z8xdZOlXoCqem8iASV1yhMPaMAAAAASUVORK5CYII=","edit":true,"name":"Background","opacity":"1","active":true,"unqid":"n5f9zd","options":{"blend":"source-over","locked":false,"filter":{"brightness":"100%","contrast":"100%","grayscale":"0%","blur":0,"dropshadow_x":0,"dropshadow_y":0,"dropshadow_blur":0,"dropshadow_alpha":1}}}],"active":true,"selectedLayer":0,"unqid":"j9rwej","preview":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAAXNSR0IArs4c6QAAAHZJREFUOE/Nk8EOwCAIQ9f//2gWDhCsRUx2mSeD8mxLhJnZ83Hh/xAAi8nOtd9r7QTEm32vIFGXkAoIORXE5yMkXytqRsh24dCcKnnEE0RmUyEqC85Ehbxk0kE4VFaTkBuAmpTXRoj6Vmxpg9z8xdZOlXoCqem8iASV1yhMPaMAAAAASUVORK5CYII=","width":"17","height":"15","data_id":0},{"name":"","speed":"100","layers":[{"id":0,"src":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAAXNSR0IArs4c6QAAAHhJREFUOE/Fk0EOACEIA+X/j8aQiIFaV4yH9ailmWoVVdX2uORXExFpHmJLYqK4MPWViQ2ngWEeTSmJUyThwKdn7GKj0CnYsMddSFCMUVgjyiZlkp3wRJNInk0qBvMiQ9Fsb5J8ZcavFeNRk8pfXNqLPcG6oyl74g7l4pjU7RJtZQAAAABJRU5ErkJggg==","edit":true,"name":"Background","opacity":"1","active":true,"unqid":"n5f9zd","options":{"blend":"source-over","locked":false,"filter":{"brightness":"100%","contrast":"100%","grayscale":"0%","blur":0,"dropshadow_x":0,"dropshadow_y":0,"dropshadow_blur":0,"dropshadow_alpha":1}}}],"active":true,"selectedLayer":0,"unqid":"nsa03f","preview":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAAXNSR0IArs4c6QAAAHhJREFUOE/Fk0EOACEIA+X/j8aQiIFaV4yH9ailmWoVVdX2uORXExFpHmJLYqK4MPWViQ2ngWEeTSmJUyThwKdn7GKj0CnYsMddSFCMUVgjyiZlkp3wRJNInk0qBvMiQ9Fsb5J8ZcavFeNRk8pfXNqLPcG6oyl74g7l4pjU7RJtZQAAAABJRU5ErkJggg==","width":"17","height":"15","data_id":1},{"name":"","speed":"100","layers":[{"id":0,"src":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAAXNSR0IArs4c6QAAAHdJREFUOE+tk0EOwCAIBN3/P5qGAwlsXSltPRodYFxhZrY+LryBAFi59hjCAB9CQvxwXl459thAC4nLY8iuoupCjpMvhIMRhA//BvGWsxuOVREr7adctE+shJZgUdCK2CddxBgysSf7Nwcq9pzQ059sE9vBdp/+AlI2mNRGRHc6AAAAAElFTkSuQmCC","edit":true,"name":"Background","opacity":"1","active":true,"unqid":"n5f9zd","options":{"blend":"source-over","locked":false,"filter":{"brightness":"100%","contrast":"100%","grayscale":"0%","blur":0,"dropshadow_x":0,"dropshadow_y":0,"dropshadow_blur":0,"dropshadow_alpha":1}}}],"active":true,"selectedLayer":0,"unqid":"z05t0b","preview":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAAXNSR0IArs4c6QAAAHdJREFUOE+tk0EOwCAIBN3/P5qGAwlsXSltPRodYFxhZrY+LryBAFi59hjCAB9CQvxwXl459thAC4nLY8iuoupCjpMvhIMRhA//BvGWsxuOVREr7adctE+shJZgUdCK2CddxBgysSf7Nwcq9pzQ059sE9vBdp/+AlI2mNRGRHc6AAAAAElFTkSuQmCC","width":"17","height":"15","data_id":2},{"name":"","speed":"100","layers":[{"id":0,"src":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAAXNSR0IArs4c6QAAAG5JREFUOE+lk0ESwCAIA+X/j6bDwQ7FxEbh5oElkGju7qNZdgIxs4FmypAARB1BZlPd9AoSTTsVMQSug5rYPSRIXosZuSipKvJbdqcNUW6B1HzWaUOYjXBySe6r5C8LOXQVvECUv1itphYzGMrKAz7Cj9RAg+JtAAAAAElFTkSuQmCC","edit":true,"name":"Background","opacity":"1","active":true,"unqid":"n5f9zd","options":{"blend":"source-over","locked":false,"filter":{"brightness":"100%","contrast":"100%","grayscale":"0%","blur":0,"dropshadow_x":0,"dropshadow_y":0,"dropshadow_blur":0,"dropshadow_alpha":1}}}],"active":true,"selectedLayer":0,"unqid":"fnw8f","preview":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAAXNSR0IArs4c6QAAAG5JREFUOE+lk0ESwCAIA+X/j6bDwQ7FxEbh5oElkGju7qNZdgIxs4FmypAARB1BZlPd9AoSTTsVMQSug5rYPSRIXosZuSipKvJbdqcNUW6B1HzWaUOYjXBySe6r5C8LOXQVvECUv1itphYzGMrKAz7Cj9RAg+JtAAAAAElFTkSuQmCC","width":"17","height":"15","data_id":3},{"name":"","speed":"100","layers":[{"id":0,"src":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAAXNSR0IArs4c6QAAAG9JREFUOE+9k1EOwCAIQ+39D83CB4urBRI181vKK1CYmY3mARjVN/wi4hT+tkiiOJweiXjx1kzYQmdJDnYuCoqKZhFRFDGPTOi+iPLO3RXNh+RYJNuA7EwxeEm6Nc7xWixGdvhCq0zy9abbyUTU+T8jr5XUXPp5kgAAAABJRU5ErkJggg==","edit":true,"name":"Background","opacity":"1","active":true,"unqid":"n5f9zd","options":{"blend":"source-over","locked":false,"filter":{"brightness":"100%","contrast":"100%","grayscale":"0%","blur":0,"dropshadow_x":0,"dropshadow_y":0,"dropshadow_blur":0,"dropshadow_alpha":1}}}],"active":true,"selectedLayer":0,"unqid":"6erafs","preview":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAAXNSR0IArs4c6QAAAG9JREFUOE+9k1EOwCAIQ+39D83CB4urBRI181vKK1CYmY3mARjVN/wi4hT+tkiiOJweiXjx1kzYQmdJDnYuCoqKZhFRFDGPTOi+iPLO3RXNh+RYJNuA7EwxeEm6Nc7xWixGdvhCq0zy9abbyUTU+T8jr5XUXPp5kgAAAABJRU5ErkJggg==","width":"17","height":"15","data_id":4},{"name":"","speed":"100","layers":[{"id":0,"src":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAAXNSR0IArs4c6QAAAHBJREFUOE+9k0EKwDAIBLP/f7TFg8WaXSUE6jU4jlFhZrZEAFjN85uFXyBebrKRJt5Kjg40Qjx5+hsKyRZh0IFaSLY4goQFM1CgzeQaUgE+nVqd2XxMriEMwEyoXay9grCz2lqsEHWM3fbK6SgYW/8HU6+V1KGJUsgAAAAASUVORK5CYII=","edit":true,"name":"Background","opacity":"1","active":true,"unqid":"n5f9zd","options":{"blend":"source-over","locked":false,"filter":{"brightness":"100%","contrast":"100%","grayscale":"0%","blur":0,"dropshadow_x":0,"dropshadow_y":0,"dropshadow_blur":0,"dropshadow_alpha":1}}}],"active":true,"selectedLayer":0,"unqid":"bk1t6p","preview":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAAXNSR0IArs4c6QAAAHBJREFUOE+9k0EKwDAIBLP/f7TFg8WaXSUE6jU4jlFhZrZEAFjN85uFXyBebrKRJt5Kjg40Qjx5+hsKyRZh0IFaSLY4goQFM1CgzeQaUgE+nVqd2XxMriEMwEyoXay9grCz2lqsEHWM3fbK6SgYW/8HU6+V1KGJUsgAAAAASUVORK5CYII=","width":"17","height":"15","data_id":5},{"name":"","speed":"100","layers":[{"id":0,"src":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAAXNSR0IArs4c6QAAAHVJREFUOE+l01EKwDAIA9B6/0M7HDgkTZyl+9ugb8aqubuvy8cYYmbrxJZIFDeFWqSm7ECKxOGIlNX8xRvH6aBRnIhyhGCM2mAFbZVUJHuTTR0hCCDC3t9vddiuEQbIP8NEf5UohK0V9mZDJruI0ytvR2Fs/B/mno/UdDC2UQAAAABJRU5ErkJggg==","edit":true,"name":"Background","opacity":"1","active":true,"unqid":"n5f9zd","options":{"blend":"source-over","locked":false,"filter":{"brightness":"100%","contrast":"100%","grayscale":"0%","blur":0,"dropshadow_x":0,"dropshadow_y":0,"dropshadow_blur":0,"dropshadow_alpha":1}}}],"active":true,"selectedLayer":0,"unqid":"i5vjp","preview":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAAXNSR0IArs4c6QAAAHVJREFUOE+l01EKwDAIA9B6/0M7HDgkTZyl+9ugb8aqubuvy8cYYmbrxJZIFDeFWqSm7ECKxOGIlNX8xRvH6aBRnIhyhGCM2mAFbZVUJHuTTR0hCCDC3t9vddiuEQbIP8NEf5UohK0V9mZDJruI0ytvR2Fs/B/mno/UdDC2UQAAAABJRU5ErkJggg==","width":"17","height":"15","data_id":6},{"name":"","speed":50,"layers":[{"id":0,"src":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAAXNSR0IArs4c6QAAAHZJREFUOE+lk1EOwCAIQ+X+h2bho4urRdDxY2LgWZpq7u7jZ9kMMbNxw/xAQtANSELUdjuFJSSGK3ULBCvFOb++A5UQDB9BohnFq2Sg1BPlRQsCFfBCDck7Dltl6BbCKuBLR83rSQZRwWPwAun8RU5vmViGqvg/ECKS1P+7ZS8AAAAASUVORK5CYII=","edit":true,"name":"Background","opacity":"1","active":true,"unqid":"n5f9zd","options":{"blend":"source-over","locked":false,"filter":{"brightness":"100%","contrast":"100%","grayscale":"0%","blur":0,"dropshadow_x":0,"dropshadow_y":0,"dropshadow_blur":0,"dropshadow_alpha":1}}}],"active":true,"selectedLayer":0,"unqid":"8idwwm","preview":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAAXNSR0IArs4c6QAAAHZJREFUOE+lk1EOwCAIQ+X+h2bho4urRdDxY2LgWZpq7u7jZ9kMMbNxw/xAQtANSELUdjuFJSSGK3ULBCvFOb++A5UQDB9BohnFq2Sg1BPlRQsCFfBCDck7Dltl6BbCKuBLR83rSQZRwWPwAun8RU5vmViGqvg/ECKS1P+7ZS8AAAAASUVORK5CYII=","width":"17","height":"15","data_id":7},{"name":"","speed":"100","layers":[{"id":0,"src":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAAXNSR0IArs4c6QAAAHhJREFUOE+tk1EOwCAMQu39D92lHyyIXVN1fk0TntChubuPy2W/QsxsnJp6nSgk9ryqC6Y4EIZAv7chcMDCKm462MzFFoRngVhw9AVanCiEh9uCcIwQZ6L0jMt2DVEAYnTcTGULYae1SzERRxtavUm9qPw7GShz+gD2MZLUy4ceUQAAAABJRU5ErkJggg==","edit":true,"name":"Background","opacity":"1","active":true,"unqid":"n5f9zd","options":{"blend":"source-over","locked":false,"filter":{"brightness":"100%","contrast":"100%","grayscale":"0%","blur":0,"dropshadow_x":0,"dropshadow_y":0,"dropshadow_blur":0,"dropshadow_alpha":1}}}],"active":true,"selectedLayer":0,"unqid":"7yh45j","preview":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAAXNSR0IArs4c6QAAAHhJREFUOE+tk1EOwCAMQu39D92lHyyIXVN1fk0TntChubuPy2W/QsxsnJp6nSgk9ryqC6Y4EIZAv7chcMDCKm462MzFFoRngVhw9AVanCiEh9uCcIwQZ6L0jMt2DVEAYnTcTGULYae1SzERRxtavUm9qPw7GShz+gD2MZLUy4ceUQAAAABJRU5ErkJggg==","width":"17","height":"15","data_id":8},{"name":"","speed":"100","layers":[{"id":0,"src":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAAXNSR0IArs4c6QAAAHpJREFUOE/Nk1EOwCAIQ+H+h2ZhCUtXQEj2M/9UeFKKamYmH5f+ByIiZTGq+hJ5Un3L8QQOCoifV/f4wtMTTvIgBJ9AIySSV5AoD3vBUjpQshhl8fisIJtmliagv1xF51pyMiCdjA2odGf6SgxOkAnA8+P71p0OVo3/BTPpktTooufjAAAAAElFTkSuQmCC","edit":true,"name":"Background","opacity":"1","active":true,"unqid":"n5f9zd","options":{"blend":"source-over","locked":false,"filter":{"brightness":"100%","contrast":"100%","grayscale":"0%","blur":0,"dropshadow_x":0,"dropshadow_y":0,"dropshadow_blur":0,"dropshadow_alpha":1}}}],"active":true,"selectedLayer":0,"unqid":"jsztf7","preview":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAAXNSR0IArs4c6QAAAHpJREFUOE/Nk1EOwCAIQ+H+h2ZhCUtXQEj2M/9UeFKKamYmH5f+ByIiZTGq+hJ5Un3L8QQOCoifV/f4wtMTTvIgBJ9AIySSV5AoD3vBUjpQshhl8fisIJtmliagv1xF51pyMiCdjA2odGf6SgxOkAnA8+P71p0OVo3/BTPpktTooufjAAAAAElFTkSuQmCC","width":"17","height":"15","data_id":9}],"currentFrame":0,"speed":100,"name":"Untitled","preview":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAABEA/sfR5H8Fkddasdmnacvx//8745jkhasdASD945kjknhj/AAAPCAYAAAACsSQRAAAAAXNSR0IArs4c6QAAAHZJREFUOE/Nk8EOwCAIQ9f//2gWDhCsRUx2mSeD8mxLhJnZ83Hh/xAAi8nOtd9r7QTEm32vIFGXkAoIORXE5yMkXytqRsh24dCcKnnEE0RmUyEqC85Ehbxk0kE4VFaTkBuAmpTXRoj6Vmxpg9z8xdZOlXoCqem8iASV1yhMPaMAAAAASUVORK5CYII=","previewApp":"","art_edit_id":0,"palette_id":false,"created_at":1689226136902,"updated_at":1689226136902,"isExternal":true,"id":1689225698685,"edit":{"status":true,"unqid":"0ed9deef5af474e"}} \ No newline at end of file diff --git a/art/animations/metronome_frames/pixil-frame-0.png b/art/animations/metronome_frames/pixil-frame-0.png new file mode 100644 index 0000000000000000000000000000000000000000..03848729b422f4573efe657995d113e601cdd5b3 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2co#^NA%Cx&(BWL^R}4W2HJAr}5; zCm-ZHpupjL{C~X(H#T}`A|B6aMK7Q-g=52W_P@PlF^0AoX zB*XN{j(_JlJ=(sc&8e^H^y7e=(PtD4X7e~ke(?!7p*orKlJnavrcI0s{BBCNF4*{L w8sCXDF?Z|8SG+8{H~*Y@^@?Wl)x&?egDa-q%;7%w2-G2co#^NA%Cx&(BWL^R}O`a}}Ar}5e zCkOH!P~dQW`ma4rQIL5npP2o#<anZ^3YDz{nMA$-Zllf^%=&Qp&nSHO#xYqRi?0TSU7(8A5T-G@yGywp4u}m)j literal 0 HcmV?d00001 diff --git a/art/animations/metronome_frames/pixil-frame-2.png b/art/animations/metronome_frames/pixil-frame-2.png new file mode 100644 index 0000000000000000000000000000000000000000..2b9d7241a8a516885e8d9fede236b2ff54d54fc5 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2co#^NA%Cx&(BWL^R}wVp1HAr}5? zr#SL4C~`1A{okK0s-#6<66IEwE~=M zcJfAsro>(-Olr!$(3J4OxMQo#R>x@7#Ff7eia!-LcAUKNK!)dy$$B+BuWro!HJRzopr0D9+4CIA2c literal 0 HcmV?d00001 diff --git a/art/animations/metronome_frames/pixil-frame-3.png b/art/animations/metronome_frames/pixil-frame-3.png new file mode 100644 index 0000000000000000000000000000000000000000..0426ee5aeeb8c6d738e90e6931436dfdaa2efe82 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2co#^NA%Cx&(BWL^R}Wu7jMAr}5i zCkOH!P~dQW`ma4r@ifojvTFzDciM2V7MIJP-5}gClQ$%|jYZ)R$0wDme)Wz@FTGtw z8s9EZG2`c)bUVpS&udlJpJ{h9ou@=9n659oC6K1PCdRB>>*iahxLsUv3a50#R-G2co#^NA%Cx&(BWL^R}rJgR1Ar}67 zCkOH!P~dQW`ma4rk^9(Hrp_53b-#+PSh1>akxNR-`6uFni#J#)eM~FACA9I`;+YFt zPYKDsx%EUu@~qk+jT*U$7itBc$=0Wv$WPklv4!!M@sWf{A=xpHw?=+>^Pn|t=8@OD l+l4zfe6GKIb&a+X|J$;u*A6P$`2rol;OXk;vd$@?2>?pAN(%r0 literal 0 HcmV?d00001 diff --git a/art/animations/metronome_frames/pixil-frame-5.png b/art/animations/metronome_frames/pixil-frame-5.png new file mode 100644 index 0000000000000000000000000000000000000000..f9b267c1723d12dc3e8a8bfde374a35408dd35b9 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2co#^NA%Cx&(BWL^R}6`n4RAr}67 zCp+>TP~c#B`oDkK!v@DYt!8Fbp>2*1A))M+N=99;B~`-}rmfq&P%X^MMs!7MM8S7+ z0U_Nx3z()($oR8lbks-gX(MGm)>b2~kvt~dyFnGH9xvX-G2co#^NA%Cx&(BWL^R}HJ&bxAr}5? zFF)jKP~c!msQll)EO7D0&k8a>_08=qodQE+53BMBPApAY-XVIu)k|gB8i%eMiQP}G z)*Q_~zH&jBOm|UBLeGr{Jh!wuJH8*AealI}p{4eIb>WR;9L$$yCoa10Wz=G;{pM_2 q$vq{%{9olpJ-z>pZy)~3UBp=8-hZv(p(Q8K9SokXelF{r5}E+O%}ba7 literal 0 HcmV?d00001 diff --git a/art/animations/metronome_frames/pixil-frame-7.png b/art/animations/metronome_frames/pixil-frame-7.png new file mode 100644 index 0000000000000000000000000000000000000000..08df5581d03fb2e1ccf28279c35974d166739655 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2co#^NA%Cx&(BWL^R}^`0({Ar}5? zC*S5fpupk$^uPVA)^@-4r$**+K0Gqs!LFgDH9C=sN=AM&_&YeQ7y~(O>jg(R;x;H&JwF^KIm>Ae*N;nq#nnQN5g%+S tnoIsI^3R_c!JqnZ{=yd?994CVG1j*xUE^INvIFQ822WQ%mvv4FO#qKXM$!NP literal 0 HcmV?d00001 diff --git a/art/animations/metronome_frames/pixil-frame-8.png b/art/animations/metronome_frames/pixil-frame-8.png new file mode 100644 index 0000000000000000000000000000000000000000..9023d2f015eb9bdfd7120f405c3d1906bee6e4a7 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2co#^NA%Cx&(BWL^R}4W2HJAr}5? zr`+Z{pupk$^uN8-VP@}@Jr9m9KfC1kw5y$~UhRnaB%-AB_{x>%EsEdzR$D0?DO||; zqf+`2UqHlBU-sEMZ!|s7v6*K5i&@uCqUmt1qd{Azap11@)ZJ|c2a-$fv}~HW;qtAe wGvwN(qwadzt@vXlsZlJYf8wG3L(UW?#UGQdiMMio0lJ03)78&qol`;+08vX$djJ3c literal 0 HcmV?d00001 diff --git a/art/animations/metronome_frames/pixil-frame-9.png b/art/animations/metronome_frames/pixil-frame-9.png new file mode 100644 index 0000000000000000000000000000000000000000..234ecd2be753789ec586d12cc006638a89ba7044 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2co#^NA%Cx&(BWL^R}&7LlfAr}5; zCkOH!P~dQW_^&-Jk(2wHlFIGle}W%+YOb0&b5G1K`HqeYNg<_zl|i+qKeF&}bvH|rmP|5a3@qQZ yzU2Y$CB}lfn)qG82XFjXFP{>`*7=jAh%tWQq-)A|=B)%ehr!d;&t;ucLK6U1w@ZNl literal 0 HcmV?d00001 diff --git a/art/animations/midi_frames/pixil-frame-0.png b/art/animations/midi_frames/pixil-frame-0.png new file mode 100644 index 0000000000000000000000000000000000000000..80145e1b7a39015d6258c409b29ea019b7c0baf2 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}8J;eVAr}5` zCk65yP~dPr{g=Nt(OWommgAGtC;GX*v34^#1PVA!cy&T}qfkQS?al8#ze!{WG>F!G zaj+#ym**41yvwpvo93xoytk8m%a>=lm7^lF%;nDgj|?Yu z(1m8st+$Lcm}V?j*JAxC+EjkoWjDWh#gx|CS$nxpy^8-mKR#SQ{7e3$gL0;e-)3^9 TS51rqTFBt(>gTe~DWM4fN=H7{ literal 0 HcmV?d00001 diff --git a/art/animations/midi_frames/pixil-frame-2.png b/art/animations/midi_frames/pixil-frame-2.png new file mode 100644 index 0000000000000000000000000000000000000000..8103a38eda95c66bc276db45d835a94509eba88d GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}*`6+rAr}5` zCk1jHFyL@L`RmOP!)L zt6_C8C*LB~VmdKI;Vst0DQwhasU7T literal 0 HcmV?d00001 diff --git a/art/animations/midi_frames/pixil-frame-4.png b/art/animations/midi_frames/pixil-frame-4.png new file mode 100644 index 0000000000000000000000000000000000000000..a2e1753437af693016b29c304884259d092676d4 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}xt=bLAr}5` zCwcQV7;w0>|CX=fnPs?C@HeNn@@%sJIfE+<0<39F6DOuWQ#|muE_~1T)$I&Hhc2&d z5z|?5yhr6eLv0dQmiui+z5Z#LOZf78%f!@AtPI??RkA=}w~$G2&5vilN?E@(A5*G} aSj_Bwq=+lvYJ)w{Vg^rFKbLh*2~7a06Fs2- literal 0 HcmV?d00001 diff --git a/art/animations/midi_frames/pixil-frame-5.png b/art/animations/midi_frames/pixil-frame-5.png new file mode 100644 index 0000000000000000000000000000000000000000..ed945a0c44768977ab723517faea95a4c169a37b GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}nVv3=Ar}5` zCpq#RP~c#h{@;EU+icG(2~mrdFN+hIaB^4Dq!{*Tj79R5X@QfJHNoAYIu0%|+I} X$RhTY5^nE+mNIy{`njxgN@xNA5c54b literal 0 HcmV?d00001 diff --git a/art/animations/midi_frames/pixil-frame-6.png b/art/animations/midi_frames/pixil-frame-6.png new file mode 100644 index 0000000000000000000000000000000000000000..b67e29f509022ad12b19ad5f22d1d97db026a535 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}`JOJ0Ar}5` zCk65yP~dPr{g?mjp>1jh3{E||Zd4btL0?pap^I0MWu@D^j;Rc%Z_oQWXL&orq6JZ! z9}=9_ZsR${FzdHsjY-a|+V#!*lz{N~d;9C|w*7GY etX8+foqZ)|5zCcIw#h)N89ZJ6T-G@yGywp~m_qXa literal 0 HcmV?d00001 diff --git a/art/animations/midi_frames/pixil-frame-7.png b/art/animations/midi_frames/pixil-frame-7.png new file mode 100644 index 0000000000000000000000000000000000000000..291a821c1702a7d23d23a40efb421beb8862b987 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}X`U{QAr}5` zCk1jbC~~+Q|1E#(Xwrcc?c~?$*X9R(PF&37u<>Av!qsW&Nty>9m8IJqyXnlFbnx~` zCVsUmMVSFCF8_@)er7B8dX*nvKJ6xl{gih9c?-;TwC`qy4C_N5lF UC+y4j1=`5q>FVdQ&MBb@0E!Sl!TM9r5UsQ280e*dyg)A<$kZ!N@S_;$p&^f}(Rq6QSr|fIhqJUVcX|Z0g~8L+&t;uc GLK6UrQZxqu literal 0 HcmV?d00001 diff --git a/art/animations/monomachine_frames/pixil-frame-2.png b/art/animations/monomachine_frames/pixil-frame-2.png new file mode 100644 index 0000000000000000000000000000000000000000..2399481c39a187ef5829deca6c2ac6fcf9e04d03 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}p`I>|Ar}5` zgB-aS6gX!8uP>QssOa4CL8NL$*rt@(3=$EiFP!yq`SRxd%>(6!pSq+xW2sxj5ie{y zai_$tXQo!07!-P$->z5qG~fQA?ER*!MKMSEO=oSB@?!~$X)6I*z~JfX=d#Wzp$PyR Cj5bpM literal 0 HcmV?d00001 diff --git a/art/animations/monomachine_frames/pixil-frame-3.png b/art/animations/monomachine_frames/pixil-frame-3.png new file mode 100644 index 0000000000000000000000000000000000000000..f09061211977935df9311fe6a18ec22324e3ba34 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}QJyZ2Ar}70 zDG3Qb&Ns0C`QINqYvM#fSMd(__~rz?hMf~~#3$wm?CNd#v7zA*hq9AY=QpXVyiWdt zFA`f6`{n+&T;lbstm&L6VtM6>XP2MJ*2Qdse0vgQ+!&rFIk7xAtLYE4g~8L+&t;uc GLK6TBRW=j= literal 0 HcmV?d00001 diff --git a/art/animations/monomachine_frames/pixil-frame-4.png b/art/animations/monomachine_frames/pixil-frame-4.png new file mode 100644 index 0000000000000000000000000000000000000000..01e62bb572ffbf803c42eac428921f90d9f776f8 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}UY;(FAr}70 zDG3Qb&Ns0C`QINqYvM#fSMd(__~rz?hMf~~#CxS$B>%s-*eB=q!m7Z{-jeO1cfZT& qg=+qbwkB%Hn06FA;C*bs#PH*_C5zDao*6(>89ZJ6T-G@yGywpvDlgms literal 0 HcmV?d00001 diff --git a/art/animations/monomachine_frames/pixil-frame-5.png b/art/animations/monomachine_frames/pixil-frame-5.png new file mode 100644 index 0000000000000000000000000000000000000000..8919ca92716273c9b2a0b89abf4ac286a589253b GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}zMd|QAr}70 zDG3Qb&Ns0C`QINqYvM#fSMd(__~rz?hMf~~#CheKFFbC{S%2}4LJ2pAo4uZRqA^E& sl}Z$!X{FFw-r$ET99x+4CE5iUSOauf7_EJTfd(^py85}Sb4q9e0FF5-y8r+H literal 0 HcmV?d00001 diff --git a/art/animations/monomachine_frames/pixil-frame-6.png b/art/animations/monomachine_frames/pixil-frame-6.png new file mode 100644 index 0000000000000000000000000000000000000000..4eacad642872730027240ca30ce4fe6a2e9adca7 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}o}Mm_Ar}70 zDG3Qb&O5OD_%9zSsjRHrr6LHl;kRh9yzPdIYu$W9 ok680KKV9M2!kll?!_h9t(AKBI@{vF2F3?a0Pgg&ebxsLQ0O4dTY5)KL literal 0 HcmV?d00001 diff --git a/art/animations/monomachine_frames/pixil-frame-7.png b/art/animations/monomachine_frames/pixil-frame-7.png new file mode 100644 index 0000000000000000000000000000000000000000..4662b6a7def1ca7b0eec72a1b8c0f3f6f48b7966 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}j-D=#Ar}70 zDG3Qb&O5Lku*ecP7@%U=^Y4HA5ng3w4{au%J&rHxRByZ9;8Bv8a74p_*D$H%L4a|V gz{3O5#}Zi>E=Gv5{OHvQ0UE~O>FVdQ&MBb@09KtSfdBvi literal 0 HcmV?d00001 diff --git a/art/animations/monomachine_frames/pixil-frame-8.png b/art/animations/monomachine_frames/pixil-frame-8.png new file mode 100644 index 0000000000000000000000000000000000000000..7910901add20e520f02b965787986c19d4526502 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}CY~;iAr}70 zDG3Qb&O5Lku*ecP7$D=8_~pNS)+)u@**AEUBqkiuVA$EAm2gGj&_Roy!yF8mJ^U=L T^8=!R`WZZ3{an^LB{Ts5asDJg literal 0 HcmV?d00001 diff --git a/art/animations/monomachine_frames/pixil-frame-9.png b/art/animations/monomachine_frames/pixil-frame-9.png new file mode 100644 index 0000000000000000000000000000000000000000..485dcc2de0616d0167130513736a0b34b3032f1a GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}TAnVBAr}70 zDG3Qb&O5Lku*ecP7$C!|+~jzKflGN+Ltrxp`{N7=K|W=Mdm5ZvpCask19dTYy85}S Ib4q9e0E>zp6951J literal 0 HcmV?d00001 diff --git a/art/animations/perf_frames/pixil-frame-0.png b/art/animations/perf_frames/pixil-frame-0.png new file mode 100644 index 0000000000000000000000000000000000000000..f5f64ddab301f669d73fc8b2a8c6c8f301977b28 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}m7Xq+Ar}5` zCk1jHFyL_h`mepr#iQ_2z;Eko`;%&pte71+qeAfgq}|#p7f#AD2~GU3&3lq_mcxyJ zttC9nd|uo46fbso;rmy_Wrxhn1$mKARUOZ8T+2Vaj{C&Luur*rmwyc}&;I+#p^ddR p(b-||;?vXi{wXi%`*>K=_NqX}zuC8#dw`B$@O1TaS?83{1OU2^Ov?ZO literal 0 HcmV?d00001 diff --git a/art/animations/perf_frames/pixil-frame-1.png b/art/animations/perf_frames/pixil-frame-1.png new file mode 100644 index 0000000000000000000000000000000000000000..62dc5f41723cc4d55496553ce35b8f339739251c GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}Rh}-6Ar}5` zgBMA(`=8w(-x9_v`+>$h+n*zQpo@ q^fi%=>JpEY5BD#w?U6tCg0WsNt?){ot1)?2>X91`L(ZNk=TyO*r;(F!ZvD%*8vPrB3u*(;7o zw)N5{cvb{%dOCSF*Q@`_6t+0%Gj`lO|1wCx$Z7rCvoD`Ae7jcmsa3kL}9#sn`?P#~W5IS*fMueIhbjex=srF5j5kWg2J7moeUSluel> zd4g$0U{T795Dq1rwEbE}43f9XrbUABw7gL!_m o%?-Hc(mpNfpZcuqJv$b&7y4xUJ8YzE1at+1r>mdKI;Vst0DSgFr2qf` literal 0 HcmV?d00001 diff --git a/art/animations/perf_frames/pixil-frame-5.png b/art/animations/perf_frames/pixil-frame-5.png new file mode 100644 index 0000000000000000000000000000000000000000..b894e25d48d250f515d795d1bb6e403a888b6f11 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}<(@8%Ar}5` zCk1jHFyL_h`meoAW627g8<+NP{3n`Rp|YxD#)R}R_f@BsJenNvJ4o!C{pACeJ!L){ zCTvwGVc6_L;|=YSLR^n5sZ4u6X;oQ}PH{=ne)?S3j3^P6I{(nFFf!*1u_nE1$TQEBR*l}dl@J~D2PbYr?D Sp!Nr7AA_f>pUXO@geCyYDL=OW literal 0 HcmV?d00001 diff --git a/art/animations/route_frames/pixil-frame-1.png b/art/animations/route_frames/pixil-frame-1.png new file mode 100644 index 0000000000000000000000000000000000000000..f797f93604155e90cf74c4b9f01c3400d1bbb921 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa#^NA%Cx&(BWL^R}DV{ElAr}67 zCk65yP~dRB{aaqD`P3noj>3~ame^>pFbT-CoY>tX$DH^R{22WQ%mvv4FO#r8FIuZZ? literal 0 HcmV?d00001 diff --git a/art/animations/route_frames/pixil-frame-2.png b/art/animations/route_frames/pixil-frame-2.png new file mode 100644 index 0000000000000000000000000000000000000000..75ad78a49ed2c8aa30182311deee228a30a8a51e GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa#^NA%Cx&(BWL^R}DV{ElAr}67 zCk65yP~dQW`IrCfA+ard5jT8}O;@blvO+*`s@uwSMkNOr7&kS{JaDK&-r#2_^O*(J z`3`Sp_@sdXEHoclN`p&gW7qKK{=+v>EP5aO3qZG?_@0EFkqu>*RPf<*Z zf0$g>_`|a{AT>bM(t2IewnbXAdM?YBH+OE_8qb%0edEXcbyKXT;$jb6>Y{9+5vTQRYfs>A~gXYh3Ob6Mw<&;$Uu4l;oN literal 0 HcmV?d00001 diff --git a/art/animations/route_logo_5frames.pixil b/art/animations/route_logo_5frames.pixil new file mode 100644 index 000000000..a8fb02798 --- /dev/null +++ b/art/animations/route_logo_5frames.pixil @@ -0,0 +1 @@ +{"application":"pixil","type":".pixil","version":"2.7.0","website":"pixilart.com","author":"https://www.pixilart.com","contact":"support@pixilart.com","width":14,"height":10,"colors":{"default":["000000","ffffff","f44336","E91E63","9C27B0","673AB7","3F51B5","2196F3","03A9F4","00BCD4","009688","4CAF50","8BC34A","CDDC39","FFEB3B","FFC107","FF9800","FF5722","795548","9E9E9E","607D8B","ffebee","ffcdd2","ef9a9a","e57373","ef5350","e53935","d32f2f","c62828","b71c1c","ff8a80","ff5252","ff1744","d50000","fce4ec","f8bbd0","f48fb1","f06292","ec407a","e91e63","d81b60","c2185b","ad1457","880e4f","ff80ab","ff4081","f50057","c51162","f3e5f5","e1bee7","ce93d8","ba68c8","ab47bc","9c27b0","8e24aa","7b1fa2","6a1b9a","4a148c","ea80fc","e040fb","d500f9","aa00ff","ede7f6","d1c4e9","b39ddb","9575cd","7e57c2","673ab7","5e35b1","512da8","4527a0","311b92","b388ff","7c4dff","651fff","6200ea","e8eaf6","c5cae9","9fa8da","7986cb","5c6bc0","3f51b5","3949ab","303f9f","283593","1a237e","8c9eff","536dfe","3d5afe","304ffe","e3f2fd","bbdefb","90caf9","64b5f6","42a5f5","2196f3","1e88e5","1976d2","1565c0","0d47a1","82b1ff","448aff","2979ff","2962ff","e1f5fe","b3e5fc","81d4fa","4fc3f7","29b6f6","03a9f4","039be5","0288d1","0277bd","01579b","80d8ff","40c4ff","00b0ff","0091ea","e0f7fa","b2ebf2","80deea","4dd0e1","26c6da","00bcd4","00acc1","0097a7","00838f","006064","84ffff","18ffff","00e5ff","00b8d4","e0f2f1","b2dfdb","80cbc4","4db6ac","26a69a","009688","00897b","00796b","00695c","004d40","a7ffeb","64ffda","1de9b6","00bfa5","e8f5e9","c8e6c9","a5d6a7","81c784","66bb6a","4caf50","43a047","388e3c","2e7d32","1b5e20","b9f6ca","69f0ae","00e676","00c853","f1f8e9","dcedc8","c5e1a5","aed581","9ccc65","8bc34a","7cb342","689f38","558b2f","33691e","ccff90","b2ff59","76ff03","64dd17","f9fbe7","f0f4c3","e6ee9c","dce775","d4e157","cddc39","c0ca33","afb42b","9e9d24","827717","f4ff81","eeff41","c6ff00","aeea00","fffde7","fff9c4","fff59d","fff176","ffee58","ffeb3b","fdd835","fbc02d","f9a825","f57f17","ffff8d","ffff00","ffea00","ffd600","fff8e1","ffecb3","ffe082","ffd54f","ffca28","ffc107","ffb300","ffa000","ff8f00","ff6f00","ffe57f","ffd740","ffc400","ffab00","fff3e0","ffe0b2","ffcc80","ffb74d","ffa726","ff9800","fb8c00","f57c00","ef6c00","e65100","ffd180","ffab40","ff9100","ff6d00","fbe9e7","ffccbc","ffab91","ff8a65","ff7043","ff5722","f4511e","e64a19","d84315","bf360c","ff9e80","ff6e40","ff3d00","dd2c00","efebe9","d7ccc8","bcaaa4","a1887f","8d6e63","795548","6d4c41","5d4037","4e342e","3e2723","fafafa","f5f5f5","eeeeee","e0e0e0","bdbdbd","9e9e9e","757575","616161","424242","212121","eceff1","cfd8dc","b0bec5","90a4ae","78909c","607d8b","546e7a","455a64","37474f","263238"],"simple":["ffffff","d4d4d4","a1a1a1","787878","545454","303030","000000","edc5c5","e68383","ff0000","de2424","ad3636","823737","592b2b","f5d2ee","eb8dd7","f700b9","bf1f97","9c277f","732761","4f2445","e2bcf7","bf79e8","9d00ff","8330ba","6d3096","502c69","351b47","c5c3f0","736feb","0905f7","2e2eb0","2d2d80","252554","090936","c7e2ed","6ac3e6","00bbff","279ac4","347c96","2d5b6b","103947","bbf0d9","6febb3","00ff88","2eb878","349166","2b694c","0c3d25","c2edc0","76ed70","0dff00","36c72c","408c3b","315c2e","144511","d6edbb","b5eb73","8cff00","89c93a","6f8f44","4b632a","2a400c","f1f2bf","eef069","ffff00","baba30","91913f","5e5e2b","3b3b09","ffdeb8","f2ae61","ff8400","c48037","85623d","573e25","3d2309","fcbbae","ff8066","ff2b00","cc553d","9c5b4e","61372e","36130b"],"common":["000000","ffffff","464646","b4b4b4","990030","9c5a3c","ed1c24","ffa3b1","ff7e00","e5aa7a","ffc20e","f5e49c","fff200","fff9bd","a8e61d","d3f9bc","22b14c","00b7ef","99d9ea","4d6df3","709ad1","2f3699","546d8e","6f3198","b5a5d5"],"skin tones":["ffe0bd","ffdbac","ffcd94","eac086","e0ac69","f1c27d","ffad60","c68642","8d5524","896347","765339","613D24","4C2D17","391E0B","351606","2D1304","180A01","090300"],"Black and White":["FFFFFF","000000","FFFFFE","000001","ff0000","ffffff"]},"colorSelected":"Black and White","frames":[{"name":"","speed":100,"layers":[{"id":0,"src":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAKCAYAAACE2W/HAAAAAXNSR0IArs4c6QAAAFhJREFUKFOlUEkKACEMS/7/6A4NRooLqOMpmLZZCCDQXkSH+iFpChPnxaslEnlSMl6sKqOTyjFGqTadQxtKEaR4a1P5n63WVnuFB+CfYmZ0YxW77RX3rPgBW0VF/jZ+qx4AAAAASUVORK5CYII=","edit":false,"name":"Background","opacity":"1","active":true,"unqid":"ypohn8","options":{"blend":"source-over","locked":false,"filter":{"brightness":"100%","contrast":"100%","grayscale":"0%","blur":0,"dropshadow_x":0,"dropshadow_y":0,"dropshadow_blur":0,"dropshadow_alpha":1}}}],"active":true,"selectedLayer":0,"unqid":"87flea","preview":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAKCAYAAACE2W/HAAAAAXNSR0IArs4c6QAAAFhJREFUKFOlUEkKACEMS/7/6A4NRooLqOMpmLZZCCDQXkSH+iFpChPnxaslEnlSMl6sKqOTyjFGqTadQxtKEaR4a1P5n63WVnuFB+CfYmZ0YxW77RX3rPgBW0VF/jZ+qx4AAAAASUVORK5CYII=","width":14,"height":10},{"name":"","speed":100,"layers":[{"id":0,"src":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAKCAYAAACE2W/HAAAAAXNSR0IArs4c6QAAAFVJREFUKFOdUEEOACAIgv8/2mbLZpqu5VEEAQIQPIzIeUZPTCAVBm77TaxInsglpLtE9GAUs0R6QylQE6iczI+dzS+rXdltRiOao1SOAj5TLOiGfX8cWQlF/hR2qeEAAAAASUVORK5CYII=","edit":false,"name":"Background","opacity":"1","active":true,"unqid":"ypohn8","options":{"blend":"source-over","locked":false,"filter":{"brightness":"100%","contrast":"100%","grayscale":"0%","blur":0,"dropshadow_x":0,"dropshadow_y":0,"dropshadow_blur":0,"dropshadow_alpha":1}}}],"active":true,"selectedLayer":0,"unqid":"vmsyfu","preview":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAKCAYAAACE2W/HAAAAAXNSR0IArs4c6QAAAFVJREFUKFOdUEEOACAIgv8/2mbLZpqu5VEEAQIQPIzIeUZPTCAVBm77TaxInsglpLtE9GAUs0R6QylQE6iczI+dzS+rXdltRiOao1SOAj5TLOiGfX8cWQlF/hR2qeEAAAAASUVORK5CYII=","width":14,"height":10},{"name":"","speed":100,"layers":[{"id":0,"src":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAKCAYAAACE2W/HAAAAAXNSR0IArs4c6QAAAFZJREFUKFOdkFEKACAIQ7f7H9qwMFZpRH6F7G0zAjA8jNkq4wt4QCQWMBN4mdiTLh8zwQzadxPSxMxV0xTqiVbYaq2yanXb7bOPGzUpwK9Eh8JM39+JDVOgP/7j87QEAAAAAElFTkSuQmCC","edit":false,"name":"Background","opacity":"1","active":true,"unqid":"ypohn8","options":{"blend":"source-over","locked":false,"filter":{"brightness":"100%","contrast":"100%","grayscale":"0%","blur":0,"dropshadow_x":0,"dropshadow_y":0,"dropshadow_blur":0,"dropshadow_alpha":1}}}],"active":true,"selectedLayer":0,"unqid":"4ek7ta","preview":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAKCAYAAACE2W/HAAAAAXNSR0IArs4c6QAAAFZJREFUKFOdkFEKACAIQ7f7H9qwMFZpRH6F7G0zAjA8jNkq4wt4QCQWMBN4mdiTLh8zwQzadxPSxMxV0xTqiVbYaq2yanXb7bOPGzUpwK9Eh8JM39+JDVOgP/7j87QEAAAAAElFTkSuQmCC","width":14,"height":10},{"name":"","speed":100,"layers":[{"id":0,"src":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAKCAYAAACE2W/HAAAAAXNSR0IArs4c6QAAAFdJREFUKFOdkFEOwCAIQ9v7H5qFxS44BI1+GeortQRguDg8Bc1m/wlMIl0GVvMPrKAIchj5LIFR/JupCn9DK1QZVEnejV3Mq6iKJuP0x10xMbbubTndxgdSDz/+nvmQ9AAAAABJRU5ErkJggg==","edit":false,"name":"Background","opacity":"1","active":true,"unqid":"ypohn8","options":{"blend":"source-over","locked":false,"filter":{"brightness":"100%","contrast":"100%","grayscale":"0%","blur":0,"dropshadow_x":0,"dropshadow_y":0,"dropshadow_blur":0,"dropshadow_alpha":1}}}],"active":true,"selectedLayer":0,"unqid":"0qrh4c","preview":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAKCAYAAACE2W/HAAAAAXNSR0IArs4c6QAAAFdJREFUKFOdkFEOwCAIQ9v7H5qFxS44BI1+GeortQRguDg8Bc1m/wlMIl0GVvMPrKAIchj5LIFR/JupCn9DK1QZVEnejV3Mq6iKJuP0x10xMbbubTndxgdSDz/+nvmQ9AAAAABJRU5ErkJggg==","width":14,"height":10},{"name":"","speed":100,"layers":[{"id":0,"src":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAKCAYAAACE2W/HAAAAAXNSR0IArs4c6QAAAEhJREFUKFO9jkkOACAIA9v/PxqDikGMB4ix1y5TAhAUxCdFkR1O6u7Q4RkxVSKxrlrRUyLNe5SImmkNXSyo14nZm7pdv/qd2AD1UTn+z8LM9wAAAABJRU5ErkJggg==","edit":false,"name":"Background","opacity":"1","active":true,"unqid":"ypohn8","options":{"blend":"source-over","locked":false,"filter":{"brightness":"100%","contrast":"100%","grayscale":"0%","blur":0,"dropshadow_x":0,"dropshadow_y":0,"dropshadow_blur":0,"dropshadow_alpha":1}}}],"active":true,"selectedLayer":0,"unqid":"hprcnf","preview":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAKCAYAAACE2W/HAAAAAXNSR0IArs4c6QAAAEhJREFUKFO9jkkOACAIA9v/PxqDikGMB4ix1y5TAhAUxCdFkR1O6u7Q4RkxVSKxrlrRUyLNe5SImmkNXSyo14nZm7pdv/qd2AD1UTn+z8LM9wAAAABJRU5ErkJggg==","width":14,"height":10}],"currentFrame":0,"speed":100,"name":"Untitled","preview":"data:image/pngp98kjasdnasd983/24kasdjasdbase64,iVBORw0KGgoAAAANSUhEUgAAAA4A/sfR5H8Fkddasdmnacvx//8745jkhasdASD945kjknhj/AAAKCAYAAACE2W/HAAAAAXNSR0IArs4c6QAAAFhJREFUKFOlUEkKACEMS/7/6A4NRooLqOMpmLZZCCDQXkSH+iFpChPnxaslEnlSMl6sKqOTyjFGqTadQxtKEaR4a1P5n63WVnuFB+CfYmZ0YxW77RX3rPgBW0VF/jZ+qx4AAAAASUVORK5CYII=","previewApp":"","art_edit_id":0,"palette_id":false,"created_at":1689144504355,"updated_at":1689144504355,"isExternal":true,"id":1689137183549} \ No newline at end of file diff --git a/avr/cores/megacommand/MCL/MCLGUI.cpp b/avr/cores/megacommand/MCL/MCLGUI.cpp index b84b8ddd5..c59c9aa4d 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.cpp +++ b/avr/cores/megacommand/MCL/MCLGUI.cpp @@ -143,15 +143,15 @@ void MCLGUI::draw_popup(const char *title, bool deferred_display, uint8_t h) { oled_display.setFont(&TomThumb); // draw menu body - oled_display.fillRect(s_menu_x - 1, s_menu_y - 2, s_menu_w + 2, h + 2, BLACK); - oled_display.drawRect(s_menu_x, s_menu_y, s_menu_w, h, WHITE); - oled_display.fillRect(s_menu_x + 1, s_menu_y - 1, s_menu_w - 2, 5, WHITE); + oled_display.fillRect(s_menu_x - 1, s_menu_y + 1, s_menu_w + 2, h + 2, BLACK); + oled_display.drawRect(s_menu_x, s_menu_y + 2, s_menu_w, h, WHITE); + oled_display.fillRect(s_menu_x + 1, s_menu_y + 3, s_menu_w - 2, 4, WHITE); // draw the title '____/**********\____' part - oled_display.drawRect(s_title_x, s_menu_y - 4, s_title_w, 4, BLACK); - oled_display.fillRect(s_title_x, s_menu_y - 3, s_title_w, 3, WHITE); - oled_display.drawPixel(s_title_x, s_menu_y - 3, BLACK); - oled_display.drawPixel(s_title_x + s_title_w - 1, s_menu_y - 3, BLACK); + oled_display.drawRect(s_title_x, s_menu_y, s_title_w, 2, BLACK); + oled_display.fillRect(s_title_x, s_menu_y + 0, s_title_w, 2, WHITE); + oled_display.drawPixel(s_title_x, s_menu_y + 0, BLACK); + oled_display.drawPixel(s_title_x + s_title_w - 1, s_menu_y, BLACK); oled_display.setTextColor(BLACK); @@ -161,7 +161,7 @@ void MCLGUI::draw_popup(const char *title, bool deferred_display, uint8_t h) { if (title_buf[n] == ' ') { whitespace++; } } len -= whitespace; - oled_display.setCursor(s_title_x + (s_title_w - len * 4) / 2, s_menu_y + 3); + oled_display.setCursor(s_title_x + (s_title_w - len * 4) / 2, s_menu_y + 6); // oled_display.setCursor(s_title_x + 2, s_menu_y + 3); oled_display.println(title_buf); oled_display.setTextColor(WHITE); @@ -674,10 +674,19 @@ void MCLGUI::draw_track_type_select(uint8_t track_type_select) { switch (i) { case 0: icon = devs[0]->icon_logo(); + machinedrum_gif.set_bmp(R.icons_logo->machinedrum_gif); + icon = machinedrum_gif.get_next_frame(); + w = machinedrum_gif.w; + h = machinedrum_gif.h; break; case 1: icon = devs[1]->icon_logo(); offset = 4; + midi_gif.set_bmp(R.icons_logo->midi_gif); + icon = midi_gif.get_next_frame(); + w = midi_gif.w; + h = midi_gif.h; + if (devs[1] != nullptr) { strcpy(dev, devs[1]->name); } else { @@ -686,20 +695,33 @@ void MCLGUI::draw_track_type_select(uint8_t track_type_select) { break; case 2: icon = R.icons_logo->icon_perf_logo_medium; + perf_gif.set_bmp(R.icons_logo->perf_gif); + + w = perf_gif.w; + h = perf_gif.h; + icon = perf_gif.get_next_frame(); strcpy(dev, "PF"); offset = 3; break; case 3: icon = R.icons_logo->icon_route_logo_medium; - w = 14, h = 10; + route_gif.set_bmp(R.icons_logo->route_gif); + icon = route_gif.get_next_frame(); + w = route_gif.w; + h = route_gif.h; offset = 5; strcpy(dev, "FX"); break; case 4: - w = 15, h = 12; - offset = 6; - y_offset = -1; - icon = R.icons_logo->icon_metronome_logo_medium; + w = metronome_gif.w; + h = metronome_gif.h; + offset = 4; + y_offset = -3; + //MCLGIF metronome_gif2(R.icons_logo->metronome_gif, 45, 10, 17, 15, DIR_FWDBACK); + //icon = R.icons_logo:->icon_metronome_logo_medium; + metronome_gif.set_bmp(R.icons_logo->metronome_gif); + icon = metronome_gif.get_next_frame(); + //icon = R.icons_logo->metronome_gif; strcpy(dev, "TP"); break; } diff --git a/avr/cores/megacommand/MCL/MCLGUI.h b/avr/cores/megacommand/MCL/MCLGUI.h index 8dfce8c41..ac20203c0 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.h +++ b/avr/cores/megacommand/MCL/MCLGUI.h @@ -104,9 +104,9 @@ class MCLGUI { static constexpr uint8_t trig_h = 5; static constexpr uint8_t s_menu_w = 104; - static constexpr uint8_t s_menu_h = 25; + static constexpr uint8_t s_menu_h = 28; static constexpr uint8_t s_menu_x = (128 - s_menu_w) / 2; - static constexpr uint8_t s_menu_y = (32 - s_menu_h) / 2; + static constexpr uint8_t s_menu_y = 0; static constexpr uint8_t s_title_x = 31; static constexpr uint8_t s_title_w = 64; diff --git a/avr/cores/megacommand/MCL/MCLGfx.cpp b/avr/cores/megacommand/MCL/MCLGfx.cpp index 2ba362336..75f7e4067 100644 --- a/avr/cores/megacommand/MCL/MCLGfx.cpp +++ b/avr/cores/megacommand/MCL/MCLGfx.cpp @@ -1,4 +1,13 @@ #include "MCL_impl.h" +#include "ResourceManager.h" + +MCLGIF metronome_gif(nullptr, 45, 10, 17, 15, DIR_FWDBACK); +MCLGIF perf_gif(nullptr, 27, 7, 18, 9, DIR_FWDBACK); +MCLGIF route_gif(nullptr, 20, 5, 14, 10, DIR_FWDBACK); +MCLGIF analog_gif(nullptr, 27, 7, 18, 9, DIR_FWDBACK); +MCLGIF monomachine_gif(nullptr, 27, 10, 18, 9, DIR_FWDBACK); +MCLGIF machinedrum_gif(nullptr, 27, 8, 18, 9, DIR_FWD); +MCLGIF midi_gif(nullptr, 27, 8, 18, 9, DIR_FWD); void MCLGfx::init_oled() { oled_display.begin(); diff --git a/avr/cores/megacommand/MCL/MCLGfx.h b/avr/cores/megacommand/MCL/MCLGfx.h index 69b60f134..89223c08a 100644 --- a/avr/cores/megacommand/MCL/MCLGfx.h +++ b/avr/cores/megacommand/MCL/MCLGfx.h @@ -3,15 +3,84 @@ #ifndef MCLGFX_H__ #define MCLGFX_H__ +enum MCLGIFDir { + DIR_FWD, + DIR_FWDBACK, +}; + +class MCLGIF { +private: + int8_t cur_frame = 0; + int8_t inc = 0; + uint16_t last_frame_clock; +public: + uint8_t *bitmap; + uint8_t frame_offset_bytes; + uint8_t num_of_frames; + uint8_t w; + uint8_t h; + MCLGIFDir dir; + + MCLGIF(uint8_t *bmp, uint8_t frame_offset_, uint8_t num_of_frames_, uint8_t w_, uint8_t h_, MCLGIFDir dir_) { + bitmap = bmp; + frame_offset_bytes = frame_offset_; + num_of_frames = num_of_frames_; + w = w_; + h = h_; + dir = dir_; + reset(); + } + + void reset() { + inc = 1; + cur_frame = 0; + } + + void set_bmp(uint8_t *bmp) { bitmap = bmp; } + + uint8_t *get_frame(uint8_t n) { + uint16_t index = frame_offset_bytes * n; + return &bitmap[index]; + } + + uint8_t *get_next_frame() { + uint8_t *bmp = get_frame(cur_frame); + if (clock_diff(last_frame_clock,slowclock) < 100) { return bmp; } + last_frame_clock = slowclock; + cur_frame += inc; + + if (cur_frame < 0) { + cur_frame = 0; + inc = 1; + } + + if (cur_frame == num_of_frames) { + if (dir == DIR_FWD) { + cur_frame = 0; + } + if (dir == DIR_FWDBACK) { + cur_frame -= 2; + inc = -1; + } + } + return bmp; + } +}; class MCLGfx { - public: - void draw_evil(unsigned char* bitmap); - void splashscreen(unsigned char* bitmap); +public: + void draw_evil(unsigned char *bitmap); + void splashscreen(unsigned char *bitmap); void init_oled(); void alert(const char *str1, const char *str2); - }; extern MCLGfx gfx; +extern MCLGIF metronome_gif; +extern MCLGIF perf_gif; +extern MCLGIF route_gif; +extern MCLGIF analog_gif; +extern MCLGIF midi_gif; +extern MCLGIF monomachine_gif; +extern MCLGIF machinedrum_gif; #endif /* MCLGFX_H__ */ diff --git a/avr/cores/megacommand/resources/R.h b/avr/cores/megacommand/resources/R.h index 02ffceaba..4d929fe37 100644 --- a/avr/cores/megacommand/resources/R.h +++ b/avr/cores/megacommand/resources/R.h @@ -109,6 +109,48 @@ struct __T_icons_knob { extern const unsigned char __R_icons_logo[] PROGMEM; struct __T_icons_logo { + union { + unsigned char metronome_gif[0]; + char zz__metronome_gif[450]; + }; + static constexpr size_t countof_metronome_gif = 450 / sizeof(unsigned char); + static constexpr size_t sizeofof_metronome_gif = 450; + union { + unsigned char monomachine_gif[0]; + char zz__monomachine_gif[270]; + }; + static constexpr size_t countof_monomachine_gif = 270 / sizeof(unsigned char); + static constexpr size_t sizeofof_monomachine_gif = 270; + union { + unsigned char midi_gif[0]; + char zz__midi_gif[216]; + }; + static constexpr size_t countof_midi_gif = 216 / sizeof(unsigned char); + static constexpr size_t sizeofof_midi_gif = 216; + union { + unsigned char machinedrum_gif[0]; + char zz__machinedrum_gif[216]; + }; + static constexpr size_t countof_machinedrum_gif = 216 / sizeof(unsigned char); + static constexpr size_t sizeofof_machinedrum_gif = 216; + union { + unsigned char analog_gif[0]; + char zz__analog_gif[189]; + }; + static constexpr size_t countof_analog_gif = 189 / sizeof(unsigned char); + static constexpr size_t sizeofof_analog_gif = 189; + union { + unsigned char route_gif[0]; + char zz__route_gif[100]; + }; + static constexpr size_t countof_route_gif = 100 / sizeof(unsigned char); + static constexpr size_t sizeofof_route_gif = 100; + union { + unsigned char perf_gif[0]; + char zz__perf_gif[189]; + }; + static constexpr size_t countof_perf_gif = 189 / sizeof(unsigned char); + static constexpr size_t sizeofof_perf_gif = 189; union { unsigned char icon_md_logo_medium[0]; char zz__icon_md_logo_medium[27]; @@ -151,7 +193,7 @@ struct __T_icons_logo { }; static constexpr size_t countof_icon_midi_logo_medium = 27 / sizeof(unsigned char); static constexpr size_t sizeofof_icon_midi_logo_medium = 27; - static constexpr size_t __total_size = 179; + static constexpr size_t __total_size = 1809; }; extern const unsigned char __R_icons_page[] PROGMEM; diff --git a/avr/cores/megacommand/resources/R_icons_logo.cpp b/avr/cores/megacommand/resources/R_icons_logo.cpp index 200c48cd5..5de10576a 100644 --- a/avr/cores/megacommand/resources/R_icons_logo.cpp +++ b/avr/cores/megacommand/resources/R_icons_logo.cpp @@ -1,156 +1,762 @@ #include "R.h" const unsigned char __R_icons_logo[] PROGMEM = { + 230, + 0, + 0, + 0, + 55, + 3, + 192, + 128, + 251, + 3, + 65, + 0, + 6, + 38, + 2, + 124, + 166, + 0, + 12, + 152, + 190, + 144, + 0, + 24, + 40, + 95, + 72, + 0, + 48, + 132, + 47, + 4, + 0, + 63, 246, + 248, + 0, + 15, + 240, + 42, + 29, + 2, + 182, + 44, + 194, + 2, + 219, + 76, + 41, + 44, + 109, + 2, + 176, + 249, + 41, + 12, + 176, + 152, + 44, + 7, + 4, + 109, + 2, + 8, + 182, + 41, + 216, + 2, + 219, + 88, + 41, + 48, + 98, + 44, + 235, + 2, + 208, + 44, + 25, + 136, + 41, + 218, + 16, + 0, + 15, + 219, + 41, + 240, + 2, + 109, + 96, + 41, + 182, + 32, + 2, + 224, + 230, + 41, + 44, + 50, + 136, + 83, + 64, + 99, + 2, + 192, + 107, + 179, + 2, + 173, + 64, + 41, + 117, + 47, + 160, + 141, + 134, + 144, + 128, + 44, + 59, + 1, + 0, + 2, + 27, + 128, + 44, + 7, + 7, + 32, + 36, + 11, + 178, + 7, + 6, + 0, + 107, + 38, + 89, + 23, + 134, + 91, + 7, + 44, + 13, + 33, + 93, + 16, + 237, + 223, + 11, + 181, + 192, + 2, + 204, + 44, + 89, + 118, + 14, + 144, + 47, + 183, + 21, + 25, + 8, + 96, + 224, + 11, + 0, + 173, + 32, + 2, + 182, + 35, + 44, + 27, + 89, + 30, + 14, + 14, + 119, + 2, + 4, + 103, + 1, + 117, + 0, + 131, + 178, + 44, + 67, + 237, + 54, + 32, + 2, + 99, + 44, + 12, + 44, + 26, + 148, + 239, + 252, + 252, + 2, + 200, + 204, + 204, + 79, + 207, + 207, + 192, + 51, + 26, + 33, + 177, + 12, + 2, + 181, 15, + 23, + 214, + 2, + 60, + 23, + 181, + 2, 131, + 17, + 12, + 97, + 26, + 118, + 0, + 23, + 190, + 2, + 204, + 86, + 26, + 20, + 176, + 2, + 155, + 3, + 23, + 108, + 3, + 26, + 174, + 12, + 224, + 2, + 139, + 26, + 2, + 179, + 60, + 0, + 48, + 17, + 108, + 12, + 26, + 45, + 132, + 0, + 176, + 26, + 172, + 96, + 166, + 47, + 2, + 100, + 0, + 79, + 60, + 178, + 0, + 219, + 42, + 138, + 2, + 170, + 35, + 178, + 126, + 17, + 63, + 254, + 231, + 2, + 8, + 216, + 124, + 26, + 66, + 58, + 77, + 188, + 219, + 14, + 106, + 26, + 0, + 236, + 160, + 80, + 108, + 170, + 26, + 14, + 1, + 205, + 80, + 151, + 107, + 170, + 96, + 26, + 200, + 128, + 108, + 134, + 135, + 128, + 42, + 186, + 179, + 97, + 128, 192, + 26, + 29, + 171, + 64, + 141, + 80, + 64, + 148, + 26, + 216, + 128, + 80, + 216, + 64, + 134, + 190, + 56, + 15, + 54, + 10, 31, + 223, 2, - 249, 63, 135, 128, 127, - 124, + 47, 255, 143, 0, + 151, 119, - 190, 39, 190, + 26, + 156, + 235, + 2, + 188, + 26, + 114, + 130, 0, - 7, - 111, + 200, + 0, + 22, + 233, + 53, + 129, + 109, + 128, + 26, + 27, + 48, + 255, + 176, + 142, + 26, + 156, + 14, + 3, + 182, + 3, + 80, + 54, + 131, + 53, + 219, + 129, + 26, + 136, + 44, 188, + 131, + 8, + 109, + 53, + 28, + 185, + 26, + 62, + 7, + 108, + 7, + 80, + 109, + 135, + 26, + 182, + 162, + 23, + 176, + 217, + 2, + 184, + 91, + 26, + 3, + 109, + 2, + 49, + 182, + 53, + 120, + 2, + 253, + 252, + 15, 0, + 118, 15, - 252, + 182, + 26, + 30, + 20, + 219, + 142, + 2, + 132, + 96, + 161, + 219, + 31, + 23, + 15, + 109, + 2, + 199, + 182, + 53, + 99, + 2, 237, - 0, - 16, + 49, + 190, + 189, + 110, + 2, + 4, + 60, + 194, + 188, + 109, + 63, + 23, + 218, + 23, + 143, + 104, + 198, + 134, + 3, + 234, + 161, + 252, + 91, + 68, 66, - 14, - 246, + 68, + 125, 33, 0, 47, 161, + 130, 2, + 231, 11, - 11, - 157, 17, + 109, 15, - 183, 156, + 32, + 183, + 248, + 137, + 36, + 0, + 219, + 19, + 146, + 47, + 210, + 96, + 2, + 185, + 11, + 216, + 17, + 7, + 216, + 90, + 48, + 240, + 219, + 132, + 8, + 89, + 125, + 228, + 0, + 5, + 244, + 130, 2, + 231, + 11, + 17, + 59, + 23, + 0, + 224, + 109, + 5, + 16, + 182, + 11, + 72, 2, - 13, - 255, - 4, - 24, - 152, - 26, - 152, - 50, - 96, - 50, - 255, - 64, - 96, + 200, + 232, + 119, + 72, + 17, + 57, + 23, + 99, + 52, 160, - 97, - 32, - 194, - 16, - 192, - 255, + 126, + 11, + 1, + 80, + 195, + 2, + 185, 16, - 255, + 17, + 115, + 79, + 2, + 14, 224, - 63, - 192, + 66, + 88, + 20, + 55, + 0, + 32, + 48, + 2, + 5, + 223, + 0, 30, 60, 60, - 254, 120, 48, + 251, 96, 253, 248, 120, 240, - 221, 5, - 0, - 0, - 185, - 3, + 87, + 188, + 119, + 96, 72, 144, + 7, 127, - 1, - 224, + 60, + 30, + 120, + 60, + 96, + 49, + 248, + 251, + 252, + 240, + 120, + 96, + 48, + 19, + 39, 0, + 120, + 255, + 30, + 96, + 61, + 248, + 48, + 240, + 252, + 96, + 155, + 120, + 120, + 144, + 123, + 47, + 41, + 3, + 96, + 19, + 178, + 83, + 23, + 3, + 219, + 1, + 135, 34, + 255, 17, 192, - 255, 68, - 73, + 9, 128, 132, - 41, + 9, 64, + 255, 132, - 8, - 219, + 40, 64, 164, - 2, + 72, + 64, 98, - 251, 16, + 239, 128, 225, 225, - 0, - 0, - 183, - 252, - 252, - 2, - 228, - 204, - 204, - 39, - 207, - 207, - 155, - 192, - 60, - 178, - 229, - 0, 42, - 138, + 101, + 26, + 200, + 41, + 201, + 8, + 76, + 73, + 140, + 8, + 128, + 119, + 201, + 80, + 48, + 26, + 135, + 137, + 128, + 144, + 133, + 142, + 9, + 121, + 133, + 8, + 100, + 132, + 228, + 136, 145, - 170, - 191, - 178, - 44, - 63, - 254, + 133, + 181, + 97, + 248, + 34, + 127, + 15, + 2, + 13, + 4, + 24, + 152, + 255, + 26, + 152, + 50, 96, + 50, + 64, + 96, + 160, + 255, + 97, + 32, + 194, + 16, + 192, + 16, + 255, + 224, + 194, + 63, + 192, + 110, + 1, + 176, + 232, + 172, + 9, + 24, + 6, + 176, + 34, + 141, + 192, 2, - 128, 0, 0, 0, 0, - 2, - 127, + 0, + 159, 255, }; diff --git a/resource/icons_logo.cpp b/resource/icons_logo.cpp new file mode 100644 index 000000000..de000bfdf --- /dev/null +++ b/resource/icons_logo.cpp @@ -0,0 +1,233 @@ +// 'midi_logo_medium', 18x9px +unsigned char icon_midi_logo_medium [] = { + 0x3c, 0xb2, 0x00, 0x2a, 0x8a, 0x00, 0x2a, 0xaa, 0x00, 0x2a, 0xaa, 0x00, 0x2a, 0xb2, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x3f, 0xfe, 0x00, 0x3f, 0xfe, 0x00 +}; +// 'mnm_logo_medium', 18x9px +unsigned char icon_mnm_logo_medium [] = { + 0xfc, 0xfc, 0x00, 0xfc, 0xfc, 0x00, 0xcc, 0xcc, 0x00, 0xcc, 0xcc, 0x00, 0xcc, 0xcc, 0x00, 0xcc, + 0xcc, 0x00, 0xcc, 0xcc, 0x00, 0xcf, 0xcf, 0xc0, 0xcf, 0xcf, 0xc0 +}; +// 'perf_logo_small', 18x9px +unsigned char icon_perf_logo_medium [] = { + 0x01, 0xe0, 0x00, 0x22, 0x11, 0xc0, 0x44, 0x49, 0x80, 0x84, 0x29, 0x40, 0x84, 0x08, 0x40, 0xa4, + 0x08, 0x40, 0x62, 0x10, 0x80, 0xe1, 0xe1, 0x00, 0x00, 0x00, 0x00 +}; +// 'route_logo_medium', 14x10px +unsigned char icon_route_logo_medium [] = { + 0x1e, 0x3c, 0x3c, 0x78, 0x30, 0x60, 0xfd, 0xf8, 0x78, 0xf0, 0x30, 0x60, 0x00, 0x00, 0x30, 0x60, + 0x48, 0x90, 0x30, 0x60 +}; +// 'metronome_logo_medium', 15x12px +unsigned char icon_metronome_logo_medium [] = { + 0x0f, 0x02, 0x0d, 0x04, 0x18, 0x98, 0x1a, 0x98, 0x32, 0x60, 0x32, 0x40, 0x60, 0xa0, 0x61, 0x20, + 0xc2, 0x10, 0xc0, 0x10, 0xff, 0xe0, 0x3f, 0xc0 +}; +// 'analog_logo_medium', 18x9px +unsigned char icon_analog_logo_medium [] = { + 0x0f, 0xfc, 0x00, 0x10, 0x42, 0x00, 0x27, 0x21, 0x00, 0x2f, 0xa1, 0x00, 0x2f, 0xa1, 0x00, 0x2f, + 0xa1, 0x00, 0x27, 0x21, 0x00, 0x10, 0x42, 0x00, 0x0f, 0x9c, 0x00 +}; +// 'md_logo_medium', 18x9px +unsigned char icon_md_logo_medium [] = { + 0x0f, 0x83, 0xc0, 0x1f, 0x83, 0xc0, 0x3f, 0x87, 0x80, 0x7f, 0x87, 0x80, 0xff, 0x8f, 0x00, 0x77, + 0x8f, 0x00, 0x27, 0xbe, 0x00, 0x07, 0xbe, 0x00, 0x07, 0xbc, 0x00 +}; + +unsigned char perf_gif [] = { +// 'pixil-frame-0', 18x9px + 0x01, 0xe0, 0x00, 0x22, 0x11, 0xc0, 0x44, 0x09, 0x80, 0x84, 0x09, 0x40, 0x84, 0x28, 0x40, 0xa4, + 0x48, 0x40, 0x62, 0x10, 0x80, 0xe1, 0xe1, 0x00, 0x00, 0x00, 0x00, +// 'pixil-frame-1', 18x9px + 0x01, 0xe0, 0x00, 0x22, 0x11, 0xc0, 0x44, 0x09, 0x80, 0x84, 0x29, 0x40, 0x84, 0x28, 0x40, 0xa4, + 0x08, 0x40, 0x62, 0x10, 0x80, 0xe1, 0xe1, 0x00, 0x00, 0x00, 0x00, +// 'pixil-frame-2', 18x9px + 0x01, 0xe0, 0x00, 0x22, 0x11, 0xc0, 0x44, 0x49, 0x80, 0x84, 0x29, 0x40, 0x84, 0x08, 0x40, 0xa4, + 0x08, 0x40, 0x62, 0x10, 0x80, 0xe1, 0xe1, 0x00, 0x00, 0x00, 0x00, +// 'pixil-frame-3', 18x9px + 0x01, 0xe0, 0x00, 0x22, 0x11, 0xc0, 0x44, 0xc9, 0x80, 0x84, 0x09, 0x40, 0x84, 0x08, 0x40, 0xa4, + 0x08, 0x40, 0x62, 0x10, 0x80, 0xe1, 0xe1, 0x00, 0x00, 0x00, 0x00, +// 'pixil-frame-4', 18x9px + 0x01, 0xe0, 0x00, 0x22, 0x11, 0xc0, 0x44, 0x89, 0x80, 0x85, 0x09, 0x40, 0x84, 0x08, 0x40, 0xa4, + 0x08, 0x40, 0x62, 0x10, 0x80, 0xe1, 0xe1, 0x00, 0x00, 0x00, 0x00, +// 'pixil-frame-5', 18x9px + 0x01, 0xe0, 0x00, 0x22, 0x11, 0xc0, 0x44, 0x09, 0x80, 0x85, 0x09, 0x40, 0x85, 0x08, 0x40, 0xa4, + 0x08, 0x40, 0x62, 0x10, 0x80, 0xe1, 0xe1, 0x00, 0x00, 0x00, 0x00, +// 'pixil-frame-6', 18x9px + 0x01, 0xe0, 0x00, 0x22, 0x11, 0xc0, 0x44, 0x09, 0x80, 0x84, 0x09, 0x40, 0x85, 0x08, 0x40, 0xa4, + 0x88, 0x40, 0x62, 0x10, 0x80, 0xe1, 0xe1, 0x00, 0x00, 0x00, 0x00, +}; + +unsigned char route_gif [] = { +// 'pixil-frame-0', 14x10px + 0x1e, 0x3c, 0x3c, 0x78, 0x30, 0x60, 0xfd, 0xf8, 0x78, 0xf0, 0x30, 0x60, 0x00, 0x00, 0x30, 0x60, + 0x48, 0x90, 0x30, 0x60, +// 'pixil-frame-1', 14x10px + 0x00, 0x3c, 0x1e, 0x78, 0x3c, 0x60, 0x31, 0xf8, 0xfc, 0xf0, 0x78, 0x60, 0x30, 0x00, 0x30, 0x60, + 0x48, 0x90, 0x30, 0x60, +// 'pixil-frame-2', 14x10px + 0x00, 0x3c, 0x00, 0x78, 0x1e, 0x60, 0x3d, 0xf8, 0x30, 0xf0, 0xfc, 0x60, 0x78, 0x00, 0x30, 0x60, + 0x78, 0x90, 0x30, 0x60, +// 'pixil-frame-3', 14x10px + 0x00, 0x00, 0x00, 0x3c, 0x1e, 0x78, 0x3c, 0x60, 0x31, 0xf8, 0xfc, 0xf0, 0x78, 0x60, 0x30, 0x60, + 0x78, 0x90, 0x30, 0x60, +// 'pixil-frame-4', 14x10px + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x3c, 0x3c, 0x78, 0x30, 0x60, 0xfd, 0xf8, 0x78, 0xf0, 0x30, 0x60, + 0x78, 0xf0, 0x30, 0x60, +}; + +unsigned char analog_gif [] = { +// 'pixil-frame-0', 18x9px + 0x0f, 0xfc, 0x00, 0x10, 0x42, 0x00, 0x27, 0x21, 0x00, 0x2f, 0xa1, 0x00, 0x2f, 0xa1, 0x00, 0x2f, + 0xa1, 0x00, 0x27, 0x21, 0x00, 0x10, 0x42, 0x00, 0x0f, 0x9c, 0x00, +// 'pixil-frame-1', 18x9px + 0x07, 0xf8, 0x00, 0x08, 0x24, 0x00, 0x13, 0x92, 0x00, 0x17, 0xd2, 0x00, 0x17, 0xd2, 0x00, 0x17, + 0xd2, 0x00, 0x13, 0x92, 0x00, 0x08, 0x24, 0x00, 0x07, 0xd8, 0x00, +// 'pixil-frame-2', 18x9px + 0x01, 0xf0, 0x00, 0x02, 0x08, 0x00, 0x04, 0xe4, 0x00, 0x05, 0xf4, 0x00, 0x05, 0xf4, 0x00, 0x05, + 0xf4, 0x00, 0x04, 0xe4, 0x00, 0x02, 0x08, 0x00, 0x01, 0xf0, 0x00, +// 'pixil-frame-3', 18x9px + 0x00, 0xe0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x48, 0x00, 0x02, 0xe8, 0x00, 0x02, 0xe8, 0x00, 0x02, + 0xe8, 0x00, 0x02, 0x48, 0x00, 0x01, 0x10, 0x00, 0x00, 0xe0, 0x00, +// 'pixil-frame-4', 18x9px + 0x00, 0x40, 0x00, 0x00, 0xa0, 0x00, 0x01, 0x10, 0x00, 0x01, 0x50, 0x00, 0x01, 0x50, 0x00, 0x01, + 0x50, 0x00, 0x01, 0x10, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x40, 0x00, +// 'pixil-frame-5', 18x9px + 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, +// 'pixil-frame-6', 18x9px + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +}; + +unsigned char machinedrum_gif [] = { +// 'pixil-frame-0', 18x9px + 0x0f, 0x83, 0xc0, 0x1f, 0x83, 0xc0, 0x3f, 0x87, 0x80, 0x7f, 0x87, 0x80, 0xff, 0x8f, 0x00, 0x77, + 0x8f, 0x00, 0x27, 0xbe, 0x00, 0x07, 0xbe, 0x00, 0x07, 0xbc, 0x00, +// 'pixil-frame-1', 18x9px + 0x0f, 0x82, 0x00, 0x1f, 0x83, 0x00, 0x3f, 0x87, 0x80, 0x7f, 0x87, 0x80, 0xff, 0x8f, 0x00, 0x77, + 0x8f, 0x00, 0x27, 0xbe, 0x00, 0x07, 0xbe, 0x00, 0x07, 0xbc, 0x00, +// 'pixil-frame-2', 18x9px + 0x0f, 0x83, 0xc0, 0x1f, 0x81, 0xc0, 0x3f, 0x80, 0x80, 0x7f, 0x84, 0x00, 0xff, 0x8e, 0x00, 0x77, + 0x8f, 0x00, 0x27, 0xbe, 0x00, 0x07, 0xbe, 0x00, 0x07, 0xbc, 0x00, +// 'pixil-frame-3', 18x9px + 0x0e, 0x03, 0xc0, 0x1f, 0x03, 0xc0, 0x3f, 0x87, 0x80, 0x7f, 0x83, 0x80, 0xff, 0x81, 0x00, 0x77, + 0x88, 0x00, 0x27, 0xbc, 0x00, 0x07, 0xbe, 0x00, 0x07, 0xbc, 0x00, +// 'pixil-frame-4', 18x9px + 0x08, 0x83, 0xc0, 0x1c, 0x03, 0xc0, 0x3e, 0x07, 0x80, 0x7f, 0x07, 0x80, 0xff, 0x8f, 0x00, 0x77, + 0x87, 0x00, 0x27, 0xa2, 0x00, 0x07, 0xb0, 0x00, 0x07, 0xb8, 0x00, +// 'pixil-frame-5', 18x9px + 0x07, 0x83, 0xc0, 0x03, 0x83, 0xc0, 0x31, 0x87, 0x80, 0x78, 0x87, 0x80, 0xfc, 0x0f, 0x00, 0x76, + 0x0f, 0x00, 0x27, 0x1e, 0x00, 0x07, 0x8e, 0x00, 0x07, 0x84, 0x00, +// 'pixil-frame-6', 18x9px + 0x0f, 0x83, 0xc0, 0x1f, 0x83, 0xc0, 0x1f, 0x87, 0x80, 0x0f, 0x87, 0x80, 0xc7, 0x8f, 0x00, 0x63, + 0x8f, 0x00, 0x31, 0xbe, 0x00, 0x00, 0xbe, 0x00, 0x04, 0x3c, 0x00, +// 'pixil-frame-7', 18x9px + 0x0f, 0x83, 0xc0, 0x1f, 0x83, 0xc0, 0x3f, 0x87, 0x80, 0x7f, 0x87, 0x80, 0x3f, 0x8f, 0x00, 0x17, + 0x8f, 0x00, 0x07, 0xbe, 0x00, 0x07, 0xbe, 0x00, 0x03, 0xbc, 0x00, +}; + + +unsigned char midi_gif [] = { +// 'pixil-frame-0', 18x9px + 0x00, 0x00, 0x00, 0x3c, 0xb2, 0x00, 0x2a, 0x8a, 0x00, 0x2a, 0xaa, 0x00, 0x2a, 0xaa, 0x00, 0x2a, + 0xb2, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x3f, 0xfe, 0x00, +// 'pixil-frame-1', 18x9px + 0x00, 0x00, 0x00, 0x7c, 0xb2, 0x00, 0x2a, 0x8a, 0x00, 0x2a, 0xaa, 0x00, 0x2a, 0xaa, 0x00, 0x2a, + 0xb2, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x3f, 0xfe, 0x00, +// 'pixil-frame-2', 18x9px + 0x40, 0x00, 0x00, 0xbc, 0xb2, 0x00, 0x6a, 0x8a, 0x00, 0x2a, 0xaa, 0x00, 0x2a, 0xaa, 0x00, 0x2a, + 0xb2, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x3f, 0xfe, 0x00, +// 'pixil-frame-3', 18x9px + 0xa0, 0x00, 0x00, 0x3c, 0xb2, 0x00, 0xaa, 0x8a, 0x00, 0x2a, 0xaa, 0x00, 0x2a, 0xaa, 0x00, 0x2a, + 0xb2, 0x00, 0x00, 0x01, 0x00, 0x3f, 0xfe, 0x00, 0x3f, 0xfe, 0x00, +// 'pixil-frame-4', 18x9px + 0x00, 0x00, 0x00, 0x3c, 0xb2, 0x00, 0x2a, 0x8a, 0x00, 0xaa, 0xaa, 0x00, 0x2a, 0xaa, 0x00, 0x2a, + 0xb2, 0x80, 0x00, 0x01, 0x00, 0x3f, 0xfe, 0x00, 0x3f, 0xfe, 0x00, +// 'pixil-frame-5', 18x9px + 0x00, 0x00, 0x00, 0x3c, 0xb2, 0x00, 0x2a, 0x8a, 0x00, 0x2a, 0xaa, 0x00, 0x2a, 0xaa, 0x80, 0x2a, + 0xb3, 0x40, 0x00, 0x00, 0x80, 0x3f, 0xfe, 0x00, 0x3f, 0xfe, 0x00, +// 'pixil-frame-6', 18x9px + 0x00, 0x00, 0x00, 0x3c, 0xb2, 0x00, 0x2a, 0x8a, 0x00, 0x2a, 0xaa, 0x00, 0x2a, 0xab, 0x40, 0x2a, + 0xb2, 0x00, 0x00, 0x01, 0x40, 0x3f, 0xfe, 0x00, 0x3f, 0xfe, 0x00, +// 'pixil-frame-7', 18x9px + 0x00, 0x00, 0x00, 0x3c, 0xb2, 0x00, 0x2a, 0x8a, 0x00, 0x2a, 0xaa, 0x80, 0x2a, 0xaa, 0x00, 0x2a, + 0xb2, 0x40, 0x00, 0x00, 0x00, 0x3f, 0xfe, 0x80, 0x3f, 0xfe, 0x00, +}; +unsigned char monomachine_gif [] = { +// 'pixil-frame-0', 18x9px + 0xfc, 0xfc, 0x00, 0xfc, 0xfc, 0x00, 0xcc, 0xcc, 0x00, 0xcc, 0xcc, 0x00, 0xcc, 0xcc, 0x00, 0xcc, + 0xcc, 0x00, 0xcc, 0xcc, 0x00, 0xcf, 0xcf, 0xc0, 0xcf, 0xcf, 0xc0, +// 'pixil-frame-1', 18x9px + 0xfc, 0xfc, 0x00, 0xfc, 0xfc, 0x00, 0xcc, 0xcc, 0x00, 0xcc, 0xcc, 0x00, 0xcc, 0xcc, 0x00, 0x0c, + 0xcc, 0x00, 0x0c, 0xcc, 0x00, 0x0f, 0xcf, 0xc0, 0x0f, 0xcf, 0xc0, +// 'pixil-frame-2', 18x9px + 0x3c, 0xfc, 0x00, 0x3c, 0xfc, 0x00, 0x0c, 0xcc, 0x00, 0x0c, 0xcc, 0x00, 0x0c, 0xcc, 0x00, 0x0c, + 0xcc, 0x00, 0x0c, 0xcc, 0x00, 0x0f, 0xcf, 0xc0, 0x0f, 0xcf, 0xc0, +// 'pixil-frame-3', 18x9px + 0x00, 0xfc, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0x00, 0x0c, 0xcc, 0x00, 0x0c, + 0xcc, 0x00, 0x0c, 0xcc, 0x00, 0x0f, 0xcf, 0xc0, 0x0f, 0xcf, 0xc0, +// 'pixil-frame-4', 18x9px + 0x00, 0xfc, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0x00, 0x00, + 0xcc, 0x00, 0x00, 0xcc, 0x00, 0x03, 0xcf, 0xc0, 0x03, 0xcf, 0xc0, +// 'pixil-frame-5', 18x9px + 0x00, 0xfc, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x0f, 0xc0, +// 'pixil-frame-6', 18x9px + 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0c, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x0f, 0xc0, +// 'pixil-frame-7', 18x9px + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x0f, 0xc0, +// 'pixil-frame-8', 18x9px + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x03, 0xc0, +// 'pixil-frame-9', 18x9px + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +unsigned char metronome_gif [] = { +// 'pixil-frame-0', 17x15px + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x80, 0x03, 0x41, 0x00, 0x06, + 0x26, 0x00, 0x06, 0xa6, 0x00, 0x0c, 0x98, 0x00, 0x0c, 0x90, 0x00, 0x18, 0x28, 0x00, 0x18, 0x48, + 0x00, 0x30, 0x84, 0x00, 0x30, 0x04, 0x00, 0x3f, 0xf8, 0x00, 0x0f, 0xf0, 0x00, +// 'pixil-frame-1', 17x15px + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0xc2, 0x00, 0x03, 0x4c, 0x00, 0x06, + 0x2c, 0x00, 0x06, 0xb0, 0x00, 0x0c, 0x90, 0x00, 0x0c, 0xb0, 0x00, 0x18, 0x48, 0x00, 0x18, 0x48, + 0x00, 0x30, 0x84, 0x00, 0x30, 0x04, 0x00, 0x3f, 0xf8, 0x00, 0x0f, 0xf0, 0x00, +// 'pixil-frame-2', 17x15px + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x03, 0xd8, 0x00, 0x03, 0x58, 0x00, 0x06, + 0x30, 0x00, 0x06, 0xb0, 0x00, 0x0c, 0xb0, 0x00, 0x0c, 0xd0, 0x00, 0x18, 0x48, 0x00, 0x18, 0x88, + 0x00, 0x30, 0x84, 0x00, 0x30, 0x04, 0x00, 0x3f, 0xf8, 0x00, 0x0f, 0xf0, 0x00, +// 'pixil-frame-3', 17x15px + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x03, 0xf0, 0x00, 0x03, 0x60, 0x00, 0x06, + 0x20, 0x00, 0x06, 0xe0, 0x00, 0x0c, 0xd0, 0x00, 0x0c, 0xd0, 0x00, 0x18, 0x88, 0x00, 0x18, 0x88, + 0x00, 0x30, 0x84, 0x00, 0x30, 0x04, 0x00, 0x3f, 0xf8, 0x00, 0x0f, 0xf0, 0x00, +// 'pixil-frame-4', 17x15px + 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xc0, 0x00, 0x03, 0xc0, 0x00, 0x03, 0x40, 0x00, 0x06, + 0x60, 0x00, 0x06, 0xa0, 0x00, 0x0c, 0x90, 0x00, 0x0c, 0x90, 0x00, 0x18, 0x88, 0x00, 0x18, 0x88, + 0x00, 0x30, 0x84, 0x00, 0x30, 0x04, 0x00, 0x3f, 0xf8, 0x00, 0x0f, 0xf0, 0x00, +// 'pixil-frame-5', 17x15px + 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x80, 0x00, 0x03, 0xc0, 0x00, 0x03, 0x40, 0x00, 0x07, + 0x20, 0x00, 0x06, 0xa0, 0x00, 0x0c, 0x90, 0x00, 0x0c, 0x90, 0x00, 0x18, 0x88, 0x00, 0x18, 0x88, + 0x00, 0x30, 0x84, 0x00, 0x30, 0x04, 0x00, 0x3f, 0xf8, 0x00, 0x0f, 0xf0, 0x00, +// 'pixil-frame-6', 17x15px + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x06, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x03, 0x40, 0x00, 0x06, + 0x20, 0x00, 0x07, 0xa0, 0x00, 0x0d, 0x90, 0x00, 0x0c, 0x90, 0x00, 0x18, 0x88, 0x00, 0x18, 0x88, + 0x00, 0x30, 0x84, 0x00, 0x30, 0x04, 0x00, 0x3f, 0xf8, 0x00, 0x0f, 0xf0, 0x00, +// 'pixil-frame-7', 17x15px + 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x0f, 0x40, 0x00, 0x06, + 0x20, 0x00, 0x06, 0xa0, 0x00, 0x0e, 0x90, 0x00, 0x0d, 0x10, 0x00, 0x19, 0x08, 0x00, 0x18, 0x88, + 0x00, 0x30, 0x84, 0x00, 0x30, 0x04, 0x00, 0x3f, 0xf8, 0x00, 0x0f, 0xf0, 0x00, +// 'pixil-frame-8', 17x15px + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x23, 0xc0, 0x00, 0x1b, 0x40, 0x00, 0x1e, + 0x20, 0x00, 0x06, 0xa0, 0x00, 0x0e, 0x90, 0x00, 0x0e, 0x10, 0x00, 0x19, 0x08, 0x00, 0x19, 0x08, + 0x00, 0x30, 0x84, 0x00, 0x30, 0x04, 0x00, 0x3f, 0xf8, 0x00, 0x0f, 0xf0, 0x00, +// 'pixil-frame-9', 17x15px + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc0, 0x00, 0x43, 0x40, 0x00, 0x36, + 0x20, 0x00, 0x36, 0xa0, 0x00, 0x0e, 0x90, 0x00, 0x0c, 0x10, 0x00, 0x1a, 0x08, 0x00, 0x19, 0x08, + 0x00, 0x30, 0x84, 0x00, 0x30, 0x04, 0x00, 0x3f, 0xf8, 0x00, 0x0f, 0xf0, 0x00, +}; + + From 94d9a603305efbbf5c22848792a671c5146bbf2e Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 13 Jul 2023 22:19:54 +1000 Subject: [PATCH 235/413] Animation fixes --- avr/cores/megacommand/A4/A4.cpp | 6 +- avr/cores/megacommand/A4/A4.h | 1 + avr/cores/megacommand/Elektron/Elektron.cpp | 3 +- avr/cores/megacommand/Elektron/Elektron.h | 2 + avr/cores/megacommand/MCL/GridLoadPage.cpp | 26 +-- avr/cores/megacommand/MCL/GridSavePage.cpp | 22 +-- avr/cores/megacommand/MCL/MCLGUI.cpp | 66 +++---- avr/cores/megacommand/MCL/MCLGfx.cpp | 15 +- avr/cores/megacommand/MCL/MCLGfx.h | 18 +- avr/cores/megacommand/MD/MD.cpp | 3 +- avr/cores/megacommand/MD/MD.h | 1 + avr/cores/megacommand/MNM/MNM.cpp | 3 +- avr/cores/megacommand/MNM/MNM.h | 1 + avr/cores/megacommand/resources/R.h | 181 +----------------- .../megacommand/resources/R_icons_logo.cpp | 48 +---- avr/cores/megacommand/resources/ResMan.h | 4 +- resource/icons_logo.cpp | 2 + resource/tuning.cpp | 110 ----------- 18 files changed, 92 insertions(+), 420 deletions(-) delete mode 100644 resource/tuning.cpp diff --git a/avr/cores/megacommand/A4/A4.cpp b/avr/cores/megacommand/A4/A4.cpp index 8e41dff24..f674ae8c4 100644 --- a/avr/cores/megacommand/A4/A4.cpp +++ b/avr/cores/megacommand/A4/A4.cpp @@ -111,11 +111,15 @@ bool A4Class::probe() { } // Caller is responsible to make sure icons_device is loaded in RM +MCLGIF* A4Class::gif() { + return &analog_gif; +} + uint8_t* A4Class::icon() { return R.icons_device->icon_a4; } uint8_t* A4Class::icon_logo() { - return R.icons_logo->icon_analog_logo_medium; + return R.icons_logo->analog_gif; ; } diff --git a/avr/cores/megacommand/A4/A4.h b/avr/cores/megacommand/A4/A4.h index 0ef045d0f..a66886652 100644 --- a/avr/cores/megacommand/A4/A4.h +++ b/avr/cores/megacommand/A4/A4.h @@ -39,6 +39,7 @@ class A4Class : public ElektronDevice { virtual bool probe(); virtual void init_grid_devices(uint8_t device_idx); virtual uint8_t* icon(); + virtual MCLGIF* gif(); virtual uint8_t* icon_logo(); virtual uint16_t sendKitParams(uint8_t* masks); diff --git a/avr/cores/megacommand/Elektron/Elektron.cpp b/avr/cores/megacommand/Elektron/Elektron.cpp index d94805712..576e67f5d 100644 --- a/avr/cores/megacommand/Elektron/Elektron.cpp +++ b/avr/cores/megacommand/Elektron/Elektron.cpp @@ -13,7 +13,8 @@ void MidiDevice::cleanup(uint8_t device_idx) { proj.grids[n].cleanup(device_idx); } } -uint8_t *MidiDevice::icon_logo() { return R.icons_logo->icon_midi_logo_medium; } +uint8_t *MidiDevice::icon_logo() { return R.icons_logo->midi_gif; } +MCLGIF *MidiDevice::gif() { return &midi_gif; } uint16_t ElektronDevice::sendRequest(uint8_t *data, uint8_t len, bool send, MidiUartParent *uart_) { if (uart_ == nullptr) { uart_ = uart; } diff --git a/avr/cores/megacommand/Elektron/Elektron.h b/avr/cores/megacommand/Elektron/Elektron.h index b5e18a8b8..684cef0b7 100644 --- a/avr/cores/megacommand/Elektron/Elektron.h +++ b/avr/cores/megacommand/Elektron/Elektron.h @@ -9,6 +9,7 @@ #include "MidiSysex.h" #include "MCLMemory.h" #include "MidiDeviceGrid.h" +#include "MCLGfx.h" /** Store the name of a monomachine machine. **/ typedef struct mnm_machine_name_s { @@ -173,6 +174,7 @@ class MidiDevice { virtual void muteTrack(uint8_t track, bool mute = true, MidiUartParent *uart_ = nullptr) {}; // 34x42 bitmap icon of the device virtual uint8_t *icon() { return nullptr; } + virtual MCLGIF *gif(); virtual uint8_t *icon_logo(); }; diff --git a/avr/cores/megacommand/MCL/GridLoadPage.cpp b/avr/cores/megacommand/MCL/GridLoadPage.cpp index a2e0fd141..32531e68b 100644 --- a/avr/cores/megacommand/MCL/GridLoadPage.cpp +++ b/avr/cores/megacommand/MCL/GridLoadPage.cpp @@ -48,7 +48,7 @@ void GridLoadPage::draw_popup() { strcpy(str, "LOAD FROM "); str[10] = 'X' + proj.get_grid(); } - mcl_gui.draw_popup(str, true, 28); + mcl_gui.draw_popup(str, true); } void GridLoadPage::display_load() { @@ -110,7 +110,7 @@ void GridLoadPage::display() { if (show_track_type) { mcl_gui.draw_track_type_select(mcl_cfg.track_type_select); } else { - mcl_gui.draw_trigs(MCLGUI::s_menu_x + 4, MCLGUI::s_menu_y + 21, note_interface.notes_off | note_interface.notes_on ); + mcl_gui.draw_trigs(MCLGUI::s_menu_x + 4, MCLGUI::s_menu_y + 4 + 21, note_interface.notes_off | note_interface.notes_on ); oled_display.setFont(&Elektrothic); @@ -120,13 +120,13 @@ void GridLoadPage::display() { oled_display.setFont(&TomThumb); char K[4] = {'\0'}; - // mcl_gui.draw_text_encoder(MCLGUI::s_menu_x + 4, MCLGUI::s_menu_y + 4, + // mcl_gui.draw_text_encoder(MCLGUI::s_menu_x + 4, MCLGUI::s_menu_y + 8, // "STEP", K); char modestr[7]; get_modestr(modestr); - mcl_gui.draw_text_encoder(MCLGUI::s_menu_x + 4 + 9, MCLGUI::s_menu_y + 4, + mcl_gui.draw_text_encoder(MCLGUI::s_menu_x + 4 + 9, MCLGUI::s_menu_y + 8, "MODE", modestr); @@ -136,7 +136,7 @@ void GridLoadPage::display() { } else { mcl_gui.put_value_at(encoders[1]->cur, K); } - mcl_gui.draw_text_encoder(MCLGUI::s_menu_x + 28 + 9, MCLGUI::s_menu_y + 4, + mcl_gui.draw_text_encoder(MCLGUI::s_menu_x + 28 + 9, MCLGUI::s_menu_y + 8, "LEN", K); } // draw quantize @@ -146,7 +146,7 @@ void GridLoadPage::display() { mcl_gui.put_value_at(mcl_cfg.chain_load_quant, K); } mcl_gui.draw_text_encoder(MCLGUI::s_menu_x + MCLGUI::s_menu_w - 38, - MCLGUI::s_menu_y + 4, "QUANT", K); + MCLGUI::s_menu_y + 8, "QUANT", K); oled_display.setFont(&TomThumb); // draw step count @@ -155,22 +155,22 @@ void GridLoadPage::display() { (64 * ((MidiClock.div16th_counter - mcl_actions.start_clock32th / 2) / 64)); oled_display.setCursor(MCLGUI::s_menu_x + MCLGUI::s_menu_w - 11, - MCLGUI::s_menu_y + 18); + MCLGUI::s_menu_y + 4 + 18); oled_display.print(step_count); // draw data flow in the center /* - oled_display.setCursor(48, MCLGUI::s_menu_y + 12); + oled_display.setCursor(48, MCLGUI::s_menu_y + 4 + 12); oled_display.print(F("SND")); - oled_display.setCursor(46, MCLGUI::s_menu_y + 19); + oled_display.setCursor(46, MCLGUI::s_menu_y + 4 + 19); oled_display.print(F("GRID")); - mcl_gui.draw_horizontal_arrow(63, MCLGUI::s_menu_y + 8, 5); - mcl_gui.draw_horizontal_arrow(63, MCLGUI::s_menu_y + 15, 5); + mcl_gui.draw_horizontal_arrow(63, MCLGUI::s_menu_y + 4 + 8, 5); + mcl_gui.draw_horizontal_arrow(63, MCLGUI::s_menu_y + 4 + 15, 5); - oled_display.setCursor(74, MCLGUI::s_menu_y + 12); + oled_display.setCursor(74, MCLGUI::s_menu_y + 4 + 12); oled_display.print(F("MD")); - oled_display.setCursor(74, MCLGUI::s_menu_y + 19); + oled_display.setCursor(74, MCLGUI::s_menu_y + 4 + 19); oled_display.print(F("SEQ")); */ } diff --git a/avr/cores/megacommand/MCL/GridSavePage.cpp b/avr/cores/megacommand/MCL/GridSavePage.cpp index 2720d9465..67154d2cc 100644 --- a/avr/cores/megacommand/MCL/GridSavePage.cpp +++ b/avr/cores/megacommand/MCL/GridSavePage.cpp @@ -21,7 +21,7 @@ void GridSavePage::draw_popup() { strcpy(str, "SAVE TO "); str[8] = 'X' + proj.get_grid(); } - mcl_gui.draw_popup(str, true, 28); + mcl_gui.draw_popup(str, true); } void GridSavePage::loop() {} @@ -36,14 +36,14 @@ void GridSavePage::display() { if (show_track_type) { mcl_gui.draw_track_type_select(mcl_cfg.track_type_select); } else { - mcl_gui.draw_trigs(MCLGUI::s_menu_x + 4, MCLGUI::s_menu_y + 21, note_interface.notes_off | note_interface.notes_on ); + mcl_gui.draw_trigs(MCLGUI::s_menu_x + 4, MCLGUI::s_menu_y + 25, note_interface.notes_off | note_interface.notes_on ); oled_display.setFont(&Elektrothic); oled_display.setCursor(MCLGUI::s_menu_x + 4, 22); oled_display.print((char)(0x3A + proj.get_grid())); oled_display.setFont(&TomThumb); - mcl_gui.draw_text_encoder(MCLGUI::s_menu_x + 4 + 9, MCLGUI::s_menu_y + 4, + mcl_gui.draw_text_encoder(MCLGUI::s_menu_x + 4 + 9, MCLGUI::s_menu_y + 8, "MODE", "SAVE"); char step[4] = {'\0'}; @@ -54,24 +54,24 @@ void GridSavePage::display() { mcl_gui.put_value_at(step_count, step); // mcl_gui.draw_text_encoder(MCLGUI::s_menu_x + MCLGUI::s_menu_w - 26, - // MCLGUI::s_menu_y + 4, "STEP", step); + // MCLGUI::s_menu_y + 8, "STEP", step); oled_display.setFont(&TomThumb); // draw data flow in the center constexpr uint8_t data_x = 56; - oled_display.setCursor(data_x + 9, MCLGUI::s_menu_y + 12); + oled_display.setCursor(data_x + 9, MCLGUI::s_menu_y + 16); oled_display.print(F("SND")); - oled_display.setCursor(data_x + 9, MCLGUI::s_menu_y + 19); + oled_display.setCursor(data_x + 9, MCLGUI::s_menu_y + 23); oled_display.print(F("SEQ")); - oled_display.drawFastHLine(data_x + 13 + 9, MCLGUI::s_menu_y + 8, 2, WHITE); - oled_display.drawFastHLine(data_x + 13 + 9, MCLGUI::s_menu_y + 15, 2, + oled_display.drawFastHLine(data_x + 13 + 9, MCLGUI::s_menu_y + 12, 2, WHITE); + oled_display.drawFastHLine(data_x + 13 + 9, MCLGUI::s_menu_y + 19, 2, WHITE); - oled_display.drawFastVLine(data_x + 15 + 9, MCLGUI::s_menu_y + 8, 8, WHITE); - mcl_gui.draw_horizontal_arrow(data_x + 16 + 9, MCLGUI::s_menu_y + 12, 5); + oled_display.drawFastVLine(data_x + 15 + 9, MCLGUI::s_menu_y + 12, 8, WHITE); + mcl_gui.draw_horizontal_arrow(data_x + 16 + 9, MCLGUI::s_menu_y + 16, 5); - oled_display.setCursor(data_x + 24 + 9, MCLGUI::s_menu_y + 15); + oled_display.setCursor(data_x + 24 + 9, MCLGUI::s_menu_y + 19); oled_display.print(F("GRID")); } oled_display.display(); diff --git a/avr/cores/megacommand/MCL/MCLGUI.cpp b/avr/cores/megacommand/MCL/MCLGUI.cpp index c59c9aa4d..3a31d0906 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.cpp +++ b/avr/cores/megacommand/MCL/MCLGUI.cpp @@ -144,8 +144,10 @@ void MCLGUI::draw_popup(const char *title, bool deferred_display, uint8_t h) { // draw menu body oled_display.fillRect(s_menu_x - 1, s_menu_y + 1, s_menu_w + 2, h + 2, BLACK); - oled_display.drawRect(s_menu_x, s_menu_y + 2, s_menu_w, h, WHITE); + oled_display.drawRect(s_menu_x, s_menu_y + 2, s_menu_w, h + 2, WHITE); oled_display.fillRect(s_menu_x + 1, s_menu_y + 3, s_menu_w - 2, 4, WHITE); + oled_display.drawPixel(s_menu_x, s_menu_y + 2, BLACK); + oled_display.drawPixel(s_menu_x + s_menu_w - 1, s_menu_y + 2, BLACK); // draw the title '____/**********\____' part oled_display.drawRect(s_title_x, s_menu_y, s_title_w, 2, BLACK); @@ -665,73 +667,54 @@ void MCLGUI::draw_track_type_select(uint8_t track_type_select) { oled_display.println("GROUPS"); oled_display.fillRect(0, 8, 128, 23, BLACK); + MCLGIF *gif; + for (uint8_t i = 0; i < 5; i++) { + bool select = IS_BIT_SET(track_type_select, i); + uint8_t *icon = nullptr; - uint8_t w = 18, h = 9; uint8_t offset = 3; int8_t y_offset = 0; switch (i) { case 0: icon = devs[0]->icon_logo(); - machinedrum_gif.set_bmp(R.icons_logo->machinedrum_gif); - icon = machinedrum_gif.get_next_frame(); - w = machinedrum_gif.w; - h = machinedrum_gif.h; + gif = devs[0]->gif(); + gif->set_bmp(icon); break; case 1: icon = devs[1]->icon_logo(); + gif = devs[1]->gif(); + gif->set_bmp(icon); offset = 4; - midi_gif.set_bmp(R.icons_logo->midi_gif); - icon = midi_gif.get_next_frame(); - w = midi_gif.w; - h = midi_gif.h; - - if (devs[1] != nullptr) { - strcpy(dev, devs[1]->name); - } else { - strcpy(dev, "MI"); - } break; case 2: - icon = R.icons_logo->icon_perf_logo_medium; - perf_gif.set_bmp(R.icons_logo->perf_gif); - - w = perf_gif.w; - h = perf_gif.h; - icon = perf_gif.get_next_frame(); - strcpy(dev, "PF"); + gif = &perf_gif; + gif->set_bmp(R.icons_logo->perf_gif); offset = 3; break; case 3: - icon = R.icons_logo->icon_route_logo_medium; - route_gif.set_bmp(R.icons_logo->route_gif); - icon = route_gif.get_next_frame(); - w = route_gif.w; - h = route_gif.h; + gif = &route_gif; + gif->set_bmp(R.icons_logo->route_gif); offset = 5; - strcpy(dev, "FX"); break; case 4: - w = metronome_gif.w; - h = metronome_gif.h; + gif = &metronome_gif; + gif->set_bmp(R.icons_logo->metronome_gif); offset = 4; y_offset = -3; - //MCLGIF metronome_gif2(R.icons_logo->metronome_gif, 45, 10, 17, 15, DIR_FWDBACK); - //icon = R.icons_logo:->icon_metronome_logo_medium; - metronome_gif.set_bmp(R.icons_logo->metronome_gif); - icon = metronome_gif.get_next_frame(); - //icon = R.icons_logo->metronome_gif; - strcpy(dev, "TP"); break; } -// oled_display.drawRect(x, y - 4, 24, 18, WHITE); - if (icon) { oled_display.drawBitmap(x + offset, 15 + y_offset, icon, w, h, WHITE); } - //oled_display.print(dev); - bool select = IS_BIT_SET(track_type_select, i); + icon = select ? gif->get_frame(0) : gif->get_next_frame(); + //icon = gif->get_next_frame(); + + if (icon) { oled_display.drawBitmap(x + offset, 15 + y_offset, icon, gif->w, gif->h, WHITE); } + + //if (note_interface.is_note_on(i)) { gif->loop_count = 0; } if (select) { + gif->reset(); oled_display.fillRect(x, 9, 24, 21, INVERT); oled_display.drawRect(x + 1, 10, 22, 19, BLACK); @@ -743,7 +726,6 @@ void MCLGUI::draw_track_type_select(uint8_t track_type_select) { oled_display.drawPixel(x,9 + 20,!select); oled_display.drawPixel(x + 23,9 + 20,!select); - x += 26; } } diff --git a/avr/cores/megacommand/MCL/MCLGfx.cpp b/avr/cores/megacommand/MCL/MCLGfx.cpp index 75f7e4067..fb78e2999 100644 --- a/avr/cores/megacommand/MCL/MCLGfx.cpp +++ b/avr/cores/megacommand/MCL/MCLGfx.cpp @@ -1,13 +1,14 @@ #include "MCL_impl.h" #include "ResourceManager.h" -MCLGIF metronome_gif(nullptr, 45, 10, 17, 15, DIR_FWDBACK); -MCLGIF perf_gif(nullptr, 27, 7, 18, 9, DIR_FWDBACK); -MCLGIF route_gif(nullptr, 20, 5, 14, 10, DIR_FWDBACK); -MCLGIF analog_gif(nullptr, 27, 7, 18, 9, DIR_FWDBACK); -MCLGIF monomachine_gif(nullptr, 27, 10, 18, 9, DIR_FWDBACK); -MCLGIF machinedrum_gif(nullptr, 27, 8, 18, 9, DIR_FWD); -MCLGIF midi_gif(nullptr, 27, 8, 18, 9, DIR_FWD); +MCLGIF metronome_gif(45, 10, 17, 15, DIR_FWDBACK,1); +MCLGIF perf_gif(27, 7, 18, 9, DIR_FWDBACK, 1); +MCLGIF route_gif(20, 5, 14, 10, DIR_FWDBACK, 2); + +MCLGIF analog_gif(27, 7, 18, 9, DIR_FWDBACK, 1); +MCLGIF monomachine_gif(27, 10, 18, 9, DIR_FWDBACK, 1); +MCLGIF machinedrum_gif(27, 8, 18, 9, DIR_FWD, 2); +MCLGIF midi_gif(27, 8, 18, 9, DIR_FWD, 2); void MCLGfx::init_oled() { oled_display.begin(); diff --git a/avr/cores/megacommand/MCL/MCLGfx.h b/avr/cores/megacommand/MCL/MCLGfx.h index 89223c08a..034d8d202 100644 --- a/avr/cores/megacommand/MCL/MCLGfx.h +++ b/avr/cores/megacommand/MCL/MCLGfx.h @@ -19,21 +19,26 @@ class MCLGIF { uint8_t num_of_frames; uint8_t w; uint8_t h; + uint8_t loops; + + uint8_t loop_count; MCLGIFDir dir; - MCLGIF(uint8_t *bmp, uint8_t frame_offset_, uint8_t num_of_frames_, uint8_t w_, uint8_t h_, MCLGIFDir dir_) { - bitmap = bmp; + MCLGIF(uint8_t frame_offset_, uint8_t num_of_frames_, uint8_t w_, uint8_t h_, MCLGIFDir dir_, uint8_t loops_ = 0) { frame_offset_bytes = frame_offset_; num_of_frames = num_of_frames_; w = w_; h = h_; dir = dir_; + loops = loops_; reset(); + uint8_t loop_count = 255; } void reset() { inc = 1; cur_frame = 0; + loop_count = 0; } void set_bmp(uint8_t *bmp) { bitmap = bmp; } @@ -43,19 +48,26 @@ class MCLGIF { return &bitmap[index]; } + uint8_t *get_current_frame() { + uint8_t *bmp = get_frame(cur_frame); + return bmp; + } + uint8_t *get_next_frame() { uint8_t *bmp = get_frame(cur_frame); - if (clock_diff(last_frame_clock,slowclock) < 100) { return bmp; } + if (clock_diff(last_frame_clock,slowclock) < 100 || loop_count == loops) { return bmp; } last_frame_clock = slowclock; cur_frame += inc; if (cur_frame < 0) { cur_frame = 0; inc = 1; + loop_count++; } if (cur_frame == num_of_frames) { if (dir == DIR_FWD) { + loop_count++; cur_frame = 0; } if (dir == DIR_FWDBACK) { diff --git a/avr/cores/megacommand/MD/MD.cpp b/avr/cores/megacommand/MD/MD.cpp index 1bea2d3ff..77e531087 100644 --- a/avr/cores/megacommand/MD/MD.cpp +++ b/avr/cores/megacommand/MD/MD.cpp @@ -261,7 +261,8 @@ bool MDClass::probe() { // Caller is responsible to make sure icons_device is loaded in RM uint8_t *MDClass::icon() { return R.icons_device->icon_md; } -uint8_t *MDClass::icon_logo() { return R.icons_logo->icon_md_logo_medium; } +MCLGIF *MDClass::gif() { return &machinedrum_gif; } +uint8_t *MDClass::icon_logo() { return R.icons_logo->machinedrum_gif; ; } uint8_t MDClass::noteToTrack(uint8_t pitch) { uint8_t i; diff --git a/avr/cores/megacommand/MD/MD.h b/avr/cores/megacommand/MD/MD.h index 1541ce069..afb739535 100644 --- a/avr/cores/megacommand/MD/MD.h +++ b/avr/cores/megacommand/MD/MD.h @@ -63,6 +63,7 @@ class MDClass : public ElektronDevice { virtual void setup(); virtual void init_grid_devices(uint8_t device_idx); virtual uint8_t* icon(); + virtual MCLGIF *gif(); virtual uint8_t* icon_logo(); // TODO not necessary if we have FW_CAP_READ_LIVE_KIT virtual bool canReadWorkspaceKit() { return true; } diff --git a/avr/cores/megacommand/MNM/MNM.cpp b/avr/cores/megacommand/MNM/MNM.cpp index ec64d771e..4525c5c4f 100644 --- a/avr/cores/megacommand/MNM/MNM.cpp +++ b/avr/cores/megacommand/MNM/MNM.cpp @@ -111,7 +111,8 @@ uint8_t* MNMClass::icon() { return R.icons_device->icon_mnm; } -uint8_t *MNMClass::icon_logo() { return R.icons_logo->icon_mnm_logo_medium; } +uint8_t *MNMClass::icon_logo() { return R.icons_logo->monomachine_gif; ; } +MCLGIF *MNMClass::gif() { return &monomachine_gif; } void MNMClass::requestKit(uint8_t kit) { uint8_t workspace = 0; diff --git a/avr/cores/megacommand/MNM/MNM.h b/avr/cores/megacommand/MNM/MNM.h index 875519887..7d1673747 100644 --- a/avr/cores/megacommand/MNM/MNM.h +++ b/avr/cores/megacommand/MNM/MNM.h @@ -20,6 +20,7 @@ class MNMClass : public ElektronDevice { virtual bool probe(); virtual void init_grid_devices(uint8_t device_idx); virtual uint8_t* icon(); + virtual MCLGIF* gif(); virtual uint8_t* icon_logo(); virtual bool canReadWorkspaceKit() { return true; } diff --git a/avr/cores/megacommand/resources/R.h b/avr/cores/megacommand/resources/R.h index 4d929fe37..e1044ff0d 100644 --- a/avr/cores/megacommand/resources/R.h +++ b/avr/cores/megacommand/resources/R.h @@ -151,49 +151,7 @@ struct __T_icons_logo { }; static constexpr size_t countof_perf_gif = 189 / sizeof(unsigned char); static constexpr size_t sizeofof_perf_gif = 189; - union { - unsigned char icon_md_logo_medium[0]; - char zz__icon_md_logo_medium[27]; - }; - static constexpr size_t countof_icon_md_logo_medium = 27 / sizeof(unsigned char); - static constexpr size_t sizeofof_icon_md_logo_medium = 27; - union { - unsigned char icon_analog_logo_medium[0]; - char zz__icon_analog_logo_medium[27]; - }; - static constexpr size_t countof_icon_analog_logo_medium = 27 / sizeof(unsigned char); - static constexpr size_t sizeofof_icon_analog_logo_medium = 27; - union { - unsigned char icon_metronome_logo_medium[0]; - char zz__icon_metronome_logo_medium[24]; - }; - static constexpr size_t countof_icon_metronome_logo_medium = 24 / sizeof(unsigned char); - static constexpr size_t sizeofof_icon_metronome_logo_medium = 24; - union { - unsigned char icon_route_logo_medium[0]; - char zz__icon_route_logo_medium[20]; - }; - static constexpr size_t countof_icon_route_logo_medium = 20 / sizeof(unsigned char); - static constexpr size_t sizeofof_icon_route_logo_medium = 20; - union { - unsigned char icon_perf_logo_medium[0]; - char zz__icon_perf_logo_medium[27]; - }; - static constexpr size_t countof_icon_perf_logo_medium = 27 / sizeof(unsigned char); - static constexpr size_t sizeofof_icon_perf_logo_medium = 27; - union { - unsigned char icon_mnm_logo_medium[0]; - char zz__icon_mnm_logo_medium[27]; - }; - static constexpr size_t countof_icon_mnm_logo_medium = 27 / sizeof(unsigned char); - static constexpr size_t sizeofof_icon_mnm_logo_medium = 27; - union { - unsigned char icon_midi_logo_medium[0]; - char zz__icon_midi_logo_medium[27]; - }; - static constexpr size_t countof_icon_midi_logo_medium = 27 / sizeof(unsigned char); - static constexpr size_t sizeofof_icon_midi_logo_medium = 27; - static constexpr size_t __total_size = 1809; + static constexpr size_t __total_size = 1630; }; extern const unsigned char __R_icons_page[] PROGMEM; @@ -489,140 +447,3 @@ struct __T_page_entries { static constexpr size_t __total_size = 322; }; -extern const unsigned char __R_tuning[] PROGMEM; -struct __T_tuning { - union { - unsigned char tonal_tuning[0]; - char zz__tonal_tuning[64]; - }; - static constexpr size_t countof_tonal_tuning = 64 / sizeof(unsigned char); - static constexpr size_t sizeofof_tonal_tuning = 64; - union { - unsigned char e12_lt_tuning[0]; - char zz__e12_lt_tuning[40]; - }; - static constexpr size_t countof_e12_lt_tuning = 40 / sizeof(unsigned char); - static constexpr size_t sizeofof_e12_lt_tuning = 40; - union { - unsigned char e12_cb_tuning[0]; - char zz__e12_cb_tuning[48]; - }; - static constexpr size_t countof_e12_cb_tuning = 48 / sizeof(unsigned char); - static constexpr size_t sizeofof_e12_cb_tuning = 48; - union { - unsigned char e12_bc_tuning[0]; - char zz__e12_bc_tuning[48]; - }; - static constexpr size_t countof_e12_bc_tuning = 48 / sizeof(unsigned char); - static constexpr size_t sizeofof_e12_bc_tuning = 48; - union { - unsigned char efm_cy_tuning[0]; - char zz__efm_cy_tuning[30]; - }; - static constexpr size_t countof_efm_cy_tuning = 30 / sizeof(unsigned char); - static constexpr size_t sizeofof_efm_cy_tuning = 30; - union { - unsigned char efm_cb_tuning[0]; - char zz__efm_cb_tuning[30]; - }; - static constexpr size_t countof_efm_cb_tuning = 30 / sizeof(unsigned char); - static constexpr size_t sizeofof_efm_cb_tuning = 30; - union { - unsigned char trx_rs_tuning[0]; - char zz__trx_rs_tuning[12]; - }; - static constexpr size_t countof_trx_rs_tuning = 12 / sizeof(unsigned char); - static constexpr size_t sizeofof_trx_rs_tuning = 12; - union { - unsigned char trx_b2_tuning[0]; - char zz__trx_b2_tuning[24]; - }; - static constexpr size_t countof_trx_b2_tuning = 24 / sizeof(unsigned char); - static constexpr size_t sizeofof_trx_b2_tuning = 24; - union { - unsigned char gnd_sn_tuning[0]; - char zz__gnd_sn_tuning[96]; - }; - static constexpr size_t countof_gnd_sn_tuning = 96 / sizeof(unsigned char); - static constexpr size_t sizeofof_gnd_sn_tuning = 96; - union { - unsigned char rom_tuning[0]; - char zz__rom_tuning[48]; - }; - static constexpr size_t countof_rom_tuning = 48 / sizeof(unsigned char); - static constexpr size_t sizeofof_rom_tuning = 48; - union { - unsigned char trx_s2_tuning[0]; - char zz__trx_s2_tuning[19]; - }; - static constexpr size_t countof_trx_s2_tuning = 19 / sizeof(unsigned char); - static constexpr size_t sizeofof_trx_s2_tuning = 19; - union { - unsigned char trx_bd_tuning[0]; - char zz__trx_bd_tuning[24]; - }; - static constexpr size_t countof_trx_bd_tuning = 24 / sizeof(unsigned char); - static constexpr size_t sizeofof_trx_bd_tuning = 24; - union { - unsigned char trx_xt_tuning[0]; - char zz__trx_xt_tuning[24]; - }; - static constexpr size_t countof_trx_xt_tuning = 24 / sizeof(unsigned char); - static constexpr size_t sizeofof_trx_xt_tuning = 24; - union { - unsigned char trx_xc_tuning[0]; - char zz__trx_xc_tuning[24]; - }; - static constexpr size_t countof_trx_xc_tuning = 24 / sizeof(unsigned char); - static constexpr size_t sizeofof_trx_xc_tuning = 24; - union { - unsigned char trx_sd_tuning[0]; - char zz__trx_sd_tuning[12]; - }; - static constexpr size_t countof_trx_sd_tuning = 12 / sizeof(unsigned char); - static constexpr size_t sizeofof_trx_sd_tuning = 12; - union { - unsigned char trx_cl_tuning[0]; - char zz__trx_cl_tuning[21]; - }; - static constexpr size_t countof_trx_cl_tuning = 21 / sizeof(unsigned char); - static constexpr size_t sizeofof_trx_cl_tuning = 21; - union { - unsigned char efm_bd_tuning[0]; - char zz__efm_bd_tuning[48]; - }; - static constexpr size_t countof_efm_bd_tuning = 48 / sizeof(unsigned char); - static constexpr size_t sizeofof_efm_bd_tuning = 48; - union { - unsigned char efm_xt_tuning[0]; - char zz__efm_xt_tuning[24]; - }; - static constexpr size_t countof_efm_xt_tuning = 24 / sizeof(unsigned char); - static constexpr size_t sizeofof_efm_xt_tuning = 24; - union { - unsigned char efm_sd_tuning[0]; - char zz__efm_sd_tuning[30]; - }; - static constexpr size_t countof_efm_sd_tuning = 30 / sizeof(unsigned char); - static constexpr size_t sizeofof_efm_sd_tuning = 30; - union { - unsigned char efm_cp_tuning[0]; - char zz__efm_cp_tuning[66]; - }; - static constexpr size_t countof_efm_cp_tuning = 66 / sizeof(unsigned char); - static constexpr size_t sizeofof_efm_cp_tuning = 66; - union { - unsigned char efm_hh_tuning[0]; - char zz__efm_hh_tuning[30]; - }; - static constexpr size_t countof_efm_hh_tuning = 30 / sizeof(unsigned char); - static constexpr size_t sizeofof_efm_hh_tuning = 30; - union { - unsigned char efm_rs_tuning[0]; - char zz__efm_rs_tuning[48]; - }; - static constexpr size_t countof_efm_rs_tuning = 48 / sizeof(unsigned char); - static constexpr size_t sizeofof_efm_rs_tuning = 48; - static constexpr size_t __total_size = 810; -}; - diff --git a/avr/cores/megacommand/resources/R_icons_logo.cpp b/avr/cores/megacommand/resources/R_icons_logo.cpp index 5de10576a..f3f82c653 100644 --- a/avr/cores/megacommand/resources/R_icons_logo.cpp +++ b/avr/cores/megacommand/resources/R_icons_logo.cpp @@ -705,58 +705,12 @@ const unsigned char __R_icons_logo[] PROGMEM = { 132, 228, 136, - 145, - 133, - 181, - 97, - 248, - 34, - 127, - 15, - 2, - 13, - 4, - 24, - 152, - 255, - 26, - 152, - 50, - 96, - 50, - 64, - 96, - 160, - 255, - 97, - 32, - 194, - 16, - 192, - 16, - 255, - 224, - 194, - 63, - 192, - 110, - 1, 176, - 232, - 172, - 9, - 24, - 6, - 176, - 34, - 141, - 192, - 2, 0, 0, 0, 0, 0, - 159, + 79, 255, }; diff --git a/avr/cores/megacommand/resources/ResMan.h b/avr/cores/megacommand/resources/ResMan.h index 50deebfcf..39e041272 100644 --- a/avr/cores/megacommand/resources/ResMan.h +++ b/avr/cores/megacommand/resources/ResMan.h @@ -20,6 +20,4 @@ void use_menu_layouts() { menu_layouts = (__T_menu_layouts*) __use_resource(__R_ __T_menu_options *menu_options; void use_menu_options() { menu_options = (__T_menu_options*) __use_resource(__R_menu_options); } __T_page_entries *page_entries; -void use_page_entries() { page_entries = (__T_page_entries*) __use_resource(__R_page_entries); } -__T_tuning *tuning; -void use_tuning() { tuning = (__T_tuning*) __use_resource(__R_tuning); } +void use_page_entries() { page_entries = (__T_page_entries*) __use_resource(__R_page_entries); } diff --git a/resource/icons_logo.cpp b/resource/icons_logo.cpp index de000bfdf..9d7eebd62 100644 --- a/resource/icons_logo.cpp +++ b/resource/icons_logo.cpp @@ -1,3 +1,4 @@ +/* // 'midi_logo_medium', 18x9px unsigned char icon_midi_logo_medium [] = { 0x3c, 0xb2, 0x00, 0x2a, 0x8a, 0x00, 0x2a, 0xaa, 0x00, 0x2a, 0xaa, 0x00, 0x2a, 0xb2, 0x00, 0x00, @@ -33,6 +34,7 @@ unsigned char icon_md_logo_medium [] = { 0x0f, 0x83, 0xc0, 0x1f, 0x83, 0xc0, 0x3f, 0x87, 0x80, 0x7f, 0x87, 0x80, 0xff, 0x8f, 0x00, 0x77, 0x8f, 0x00, 0x27, 0xbe, 0x00, 0x07, 0xbe, 0x00, 0x07, 0xbc, 0x00 }; +*/ unsigned char perf_gif [] = { // 'pixil-frame-0', 18x9px diff --git a/resource/tuning.cpp b/resource/tuning.cpp deleted file mode 100644 index 27d67b79e..000000000 --- a/resource/tuning.cpp +++ /dev/null @@ -1,110 +0,0 @@ -unsigned char efm_rs_tuning[] = { - 1, 3, 6, 9, 11, 14, 17, 19, 22, 25, 27, 30, 33, 35, 38, 41, 43, - 46, 49, 51, 54, 57, 59, 62, 65, 67, 70, 73, 75, 78, 81, 83, 86, - 89, 91, 94, 97, 99, 102, 105, 107, 110, 113, 115, 118, 121, 123, - 126 -}; -unsigned char efm_hh_tuning[] = { - 1, 5, 9, 14, 18, 22, 27, 31, 35, 39, 44, 48, 52, 56, 61, 65, 69, - 73, 78, 82, 86, 91, 95, 99, 103, 108, 112, 116, 120, 125 -}; -unsigned char efm_cp_tuning[] = { - 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 29, 31, 33, - 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 62, 64, 66, - 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 95, 97, 99, 101, - 103, 105, 107, 109, 111, 113, 115, 117, 119, 121, 123, 125, 127}; - -unsigned char efm_sd_tuning[] = { - 1, 5, 9, 14, 18, 22, 27, 31, 35, 39, 44, 48, 52, 56, 61, 65, 69, 73, 78, 82, -86, 91, 95, 99, 103, 108, 112, 116, 120, 125, -}; - -unsigned char efm_xt_tuning[] = { - 1, 7, 12, 17, 23, 28, 33, 39, 44, 49, 55, 60, 65, 71, 76, 81, 87, 92, 97, 102, - 108, 113, 118, 124, -}; - -unsigned char efm_bd_tuning[] = { - 1, 3, 6, 9, 11, 14, 17, 19, 22, 25, 27, 30, 33, 35, 38, 41, 43, 46, 49, 51, 54, - 57, 59, 62, 65, 67, 70, 73, 75, 78, 81, 83, 86, 89, 91, 94, 97, 99, 102, 105, 107, - 110, 113, 115, 118, 121, 123, 126, -}; -unsigned char trx_cl_tuning[] = { - 5, 11, 17, 23, 29, 36, 42, 48, 54, 60, 66, 72, 78, 84, 91, 97, 103, 109, 115, 121, - 127, -}; -unsigned char trx_sd_tuning[] = { - 3, 13, 24, 35, 45, 56, 67, 77, 88, 98, 109, 120, -}; -unsigned char trx_xc_tuning[] = { - 1, 6, 11, 17, 22, 27, 33, 38, 43, 49, 54, 60, 65, 70, 76, 81, 86, 92, 97, 102, - 108, 113, 118, 124, -}; -unsigned char trx_xt_tuning[] = { - 2, 7, 12, 18, 23, 28, 34, 39, 44, 49, 55, 60, 65, 71, 76, 81, 87, 92, 97, 103, - 108, 113, 118, 124, -}; -unsigned char trx_bd_tuning[] = { - 1, 7, 12, 17, 23, 28, 33, 39, 44, 49, 55, 60, 66, 71, 76, 82, 87, 92, 98, 103, - 108, 114, 119, 124, -}; - -unsigned char trx_s2_tuning[] = { - 3, 7, 11, 15, 20, 24, 30, 35, 41, 47, 54, 60, 68, 76, 84, 92, 101, 111, 121 -}; - -unsigned char rom_tuning[] = { - 0, 2, 5, 7, 9, 12, 14, 16, 19, 21, 23, 26, 28, 31, 34, 37, 40, 43, 46, 49, 52, - 55, 58, 61, 64, 67, 70, 73, 76, 79, 82, 85, 88, 91, 94, 97, 100, 102, 105, 107, - 109, (112), 114, 116, 119, 121, 123, 125, -}; - -unsigned char gnd_sn_tuning[] = { - 0, 2, 3, 4, 6, 7, 8, 10, 11, 12, 14, 15, 16, 18, 19, 20, - 22, 23, 24, 26, 27, 28, 30, 31, 32, 34, 35, 36, 38, 39, 40, 42, 43, 44, 46, 47, 48, - 50, 51, 52, 54, 55, 56, 58, 59, 60, 62, 63, 64, 66, 67, 68, 70, 71, 72, 74, 75, 76, - 78, 79, 80, 82, 83, 84, 86, 87, 88, 90, 91, 92, 94, 95, 96, 98, 99, 100, - 102, 103, 104, 106, 107, 108, 110, 111, 112, 114, 115, 116, 118, 119, 120, - 122, 123, 124, 126, 127 -}; - -unsigned char trx_b2_tuning[] = { - 31, 33, 36, 39, 43, 45, 48, 51, 56, 60, 62, 66, 70, 74, 79, 83, 89, 94, 97, 104, 108, 113, 120, 125 -}; - -unsigned char trx_rs_tuning[] = { - 2, 10, 17, 26, 36, 45, 55, 66, 78, 90, 103, 117 -}; - -unsigned char efm_cb_tuning[] = { - 2, 6, 10, 14, 19, 23, 27, 32, 36, 40, 44, 48, 53, 57, 62, 66, 70, 74, 78, 83, - 87, 91, 96, 100, 104, 108, 113, 117, 121, 126 -}; - -unsigned char efm_cy_tuning[] = { - 1, 6, 10, 14, 18, 22, 27, 31, 36, 40, 44, 49, 52, 57, 61, 65, 70, 74, 78, 82, - 87, 91, 95, 100, 103, 108, 112, 116, 121, 125 -}; - -unsigned char e12_bc_tuning[] = { - 2, 4, 7, 9, 12, 15, 17, 20, 22, 25, 28, 31, 34, 36, 39, 42, 44, 47, 49, 52, 55, 57, 60, 62, 65, - 68, 71, 74, 76, 79, 82, 84, 87, 89, 92, 95, 97, 100, 103, 106, 108, 111, 114, 116, 119, 122, - 124, 127 -}; - -unsigned char e12_cb_tuning[] = { - 1, 4, 6, 9, 12, 14, 17, 19, 22, 25, 27, 30, 33, 36, 39, 41, 44, 46, 49, 52, 54, 57, 59, - 62, 65, 68, 71, 73, 76, 79, 81, 84, 86, 89, 92, 94, 97, 100, 102, 105, 107, 111, 113, 116, - 119, 121, 124, 126 -}; - -unsigned char e12_lt_tuning[] = { - 2, 5, 8, 11, 15, 18, 21, 25, 28, 31, 34, 37, 41, 44, 47, 50, 53, 57, 60, 63, 66, 70, - 73, 76, 79, 82, 85, 89, 92, 95, 98, 101, 105, 108, 111, 114, 118, 121, 124, 127 -}; - -unsigned char tonal_tuning[] = { -0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, -48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, -94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126 -}; From 22661593b75d435eddde0cc2d6142b07101ced85 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 13 Jul 2023 22:43:25 +1000 Subject: [PATCH 236/413] better --- avr/cores/megacommand/MCL/GridLoadPage.cpp | 12 ++++++------ avr/cores/megacommand/MCL/GridSavePage.cpp | 20 ++++++++++---------- avr/cores/megacommand/MCL/MCLGUI.cpp | 2 +- avr/cores/megacommand/MCL/MCLGUI.h | 2 +- avr/cores/megacommand/MCL/TextInputPage.cpp | 2 +- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/avr/cores/megacommand/MCL/GridLoadPage.cpp b/avr/cores/megacommand/MCL/GridLoadPage.cpp index 32531e68b..55639568a 100644 --- a/avr/cores/megacommand/MCL/GridLoadPage.cpp +++ b/avr/cores/megacommand/MCL/GridLoadPage.cpp @@ -110,11 +110,11 @@ void GridLoadPage::display() { if (show_track_type) { mcl_gui.draw_track_type_select(mcl_cfg.track_type_select); } else { - mcl_gui.draw_trigs(MCLGUI::s_menu_x + 4, MCLGUI::s_menu_y + 4 + 21, note_interface.notes_off | note_interface.notes_on ); + mcl_gui.draw_trigs(MCLGUI::s_menu_x + 4, MCLGUI::s_menu_y + 4 + 20, note_interface.notes_off | note_interface.notes_on ); oled_display.setFont(&Elektrothic); - oled_display.setCursor(MCLGUI::s_menu_x + 4, 22); + oled_display.setCursor(MCLGUI::s_menu_x + 4, 21); oled_display.print((char) (0x3A + proj.get_grid())); oled_display.setFont(&TomThumb); @@ -126,7 +126,7 @@ void GridLoadPage::display() { char modestr[7]; get_modestr(modestr); - mcl_gui.draw_text_encoder(MCLGUI::s_menu_x + 4 + 9, MCLGUI::s_menu_y + 8, + mcl_gui.draw_text_encoder(MCLGUI::s_menu_x + 4 + 9, MCLGUI::s_menu_y + 7, "MODE", modestr); @@ -136,7 +136,7 @@ void GridLoadPage::display() { } else { mcl_gui.put_value_at(encoders[1]->cur, K); } - mcl_gui.draw_text_encoder(MCLGUI::s_menu_x + 28 + 9, MCLGUI::s_menu_y + 8, + mcl_gui.draw_text_encoder(MCLGUI::s_menu_x + 28 + 9, MCLGUI::s_menu_y + 7, "LEN", K); } // draw quantize @@ -146,7 +146,7 @@ void GridLoadPage::display() { mcl_gui.put_value_at(mcl_cfg.chain_load_quant, K); } mcl_gui.draw_text_encoder(MCLGUI::s_menu_x + MCLGUI::s_menu_w - 38, - MCLGUI::s_menu_y + 8, "QUANT", K); + MCLGUI::s_menu_y + 7, "QUANT", K); oled_display.setFont(&TomThumb); // draw step count @@ -155,7 +155,7 @@ void GridLoadPage::display() { (64 * ((MidiClock.div16th_counter - mcl_actions.start_clock32th / 2) / 64)); oled_display.setCursor(MCLGUI::s_menu_x + MCLGUI::s_menu_w - 11, - MCLGUI::s_menu_y + 4 + 18); + MCLGUI::s_menu_y + 4 + 17); oled_display.print(step_count); // draw data flow in the center diff --git a/avr/cores/megacommand/MCL/GridSavePage.cpp b/avr/cores/megacommand/MCL/GridSavePage.cpp index 67154d2cc..d5fc843ac 100644 --- a/avr/cores/megacommand/MCL/GridSavePage.cpp +++ b/avr/cores/megacommand/MCL/GridSavePage.cpp @@ -36,14 +36,14 @@ void GridSavePage::display() { if (show_track_type) { mcl_gui.draw_track_type_select(mcl_cfg.track_type_select); } else { - mcl_gui.draw_trigs(MCLGUI::s_menu_x + 4, MCLGUI::s_menu_y + 25, note_interface.notes_off | note_interface.notes_on ); + mcl_gui.draw_trigs(MCLGUI::s_menu_x + 4, MCLGUI::s_menu_y + 24, note_interface.notes_off | note_interface.notes_on ); oled_display.setFont(&Elektrothic); - oled_display.setCursor(MCLGUI::s_menu_x + 4, 22); + oled_display.setCursor(MCLGUI::s_menu_x + 4, 21); oled_display.print((char)(0x3A + proj.get_grid())); oled_display.setFont(&TomThumb); - mcl_gui.draw_text_encoder(MCLGUI::s_menu_x + 4 + 9, MCLGUI::s_menu_y + 8, + mcl_gui.draw_text_encoder(MCLGUI::s_menu_x + 4 + 9, MCLGUI::s_menu_y + 7, "MODE", "SAVE"); char step[4] = {'\0'}; @@ -60,18 +60,18 @@ void GridSavePage::display() { // draw data flow in the center constexpr uint8_t data_x = 56; - oled_display.setCursor(data_x + 9, MCLGUI::s_menu_y + 16); + oled_display.setCursor(data_x + 9, MCLGUI::s_menu_y + 15); oled_display.print(F("SND")); - oled_display.setCursor(data_x + 9, MCLGUI::s_menu_y + 23); + oled_display.setCursor(data_x + 9, MCLGUI::s_menu_y + 22); oled_display.print(F("SEQ")); - oled_display.drawFastHLine(data_x + 13 + 9, MCLGUI::s_menu_y + 12, 2, WHITE); - oled_display.drawFastHLine(data_x + 13 + 9, MCLGUI::s_menu_y + 19, 2, + oled_display.drawFastHLine(data_x + 13 + 9, MCLGUI::s_menu_y + 11, 2, WHITE); + oled_display.drawFastHLine(data_x + 13 + 9, MCLGUI::s_menu_y + 18, 2, WHITE); - oled_display.drawFastVLine(data_x + 15 + 9, MCLGUI::s_menu_y + 12, 8, WHITE); - mcl_gui.draw_horizontal_arrow(data_x + 16 + 9, MCLGUI::s_menu_y + 16, 5); + oled_display.drawFastVLine(data_x + 15 + 9, MCLGUI::s_menu_y + 11, 8, WHITE); + mcl_gui.draw_horizontal_arrow(data_x + 16 + 9, MCLGUI::s_menu_y + 15, 5); - oled_display.setCursor(data_x + 24 + 9, MCLGUI::s_menu_y + 19); + oled_display.setCursor(data_x + 24 + 9, MCLGUI::s_menu_y + 18); oled_display.print(F("GRID")); } oled_display.display(); diff --git a/avr/cores/megacommand/MCL/MCLGUI.cpp b/avr/cores/megacommand/MCL/MCLGUI.cpp index 3a31d0906..820644f4b 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.cpp +++ b/avr/cores/megacommand/MCL/MCLGUI.cpp @@ -143,7 +143,7 @@ void MCLGUI::draw_popup(const char *title, bool deferred_display, uint8_t h) { oled_display.setFont(&TomThumb); // draw menu body - oled_display.fillRect(s_menu_x - 1, s_menu_y + 1, s_menu_w + 2, h + 2, BLACK); + oled_display.fillRect(s_menu_x - 1, s_menu_y + 1, s_menu_w + 2, h + 4, BLACK); oled_display.drawRect(s_menu_x, s_menu_y + 2, s_menu_w, h + 2, WHITE); oled_display.fillRect(s_menu_x + 1, s_menu_y + 3, s_menu_w - 2, 4, WHITE); oled_display.drawPixel(s_menu_x, s_menu_y + 2, BLACK); diff --git a/avr/cores/megacommand/MCL/MCLGUI.h b/avr/cores/megacommand/MCL/MCLGUI.h index ac20203c0..efeb74f57 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.h +++ b/avr/cores/megacommand/MCL/MCLGUI.h @@ -104,7 +104,7 @@ class MCLGUI { static constexpr uint8_t trig_h = 5; static constexpr uint8_t s_menu_w = 104; - static constexpr uint8_t s_menu_h = 28; + static constexpr uint8_t s_menu_h = 27; static constexpr uint8_t s_menu_x = (128 - s_menu_w) / 2; static constexpr uint8_t s_menu_y = 0; static constexpr uint8_t s_title_x = 31; diff --git a/avr/cores/megacommand/MCL/TextInputPage.cpp b/avr/cores/megacommand/MCL/TextInputPage.cpp index f250ffe82..bb4e77d4b 100644 --- a/avr/cores/megacommand/MCL/TextInputPage.cpp +++ b/avr/cores/megacommand/MCL/TextInputPage.cpp @@ -60,7 +60,7 @@ void TextInputPage::config_normal() { update_char(); #ifdef OLED_DISPLAY // redraw popup body - mcl_gui.draw_popup(title); + mcl_gui.draw_popup(title,false,24); #endif // update clock last_clock = slowclock; From 811fb8a59a6a6ef70b76981dbb349d74765745a5 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 13 Jul 2023 22:53:30 +1000 Subject: [PATCH 237/413] Change GIF behaviour in group select pages. --- avr/cores/megacommand/MCL/MCLGUI.cpp | 8 ++++---- avr/cores/megacommand/MCL/MCLGfx.cpp | 6 +++--- avr/cores/megacommand/MCL/MCLGfx.h | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCLGUI.cpp b/avr/cores/megacommand/MCL/MCLGUI.cpp index 820644f4b..34c7790a6 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.cpp +++ b/avr/cores/megacommand/MCL/MCLGUI.cpp @@ -706,15 +706,15 @@ void MCLGUI::draw_track_type_select(uint8_t track_type_select) { break; } - icon = select ? gif->get_frame(0) : gif->get_next_frame(); - //icon = gif->get_next_frame(); + //icon = select ? gif->get_frame(0) : gif->get_next_frame(); + icon = gif->get_next_frame(); if (icon) { oled_display.drawBitmap(x + offset, 15 + y_offset, icon, gif->w, gif->h, WHITE); } - //if (note_interface.is_note_on(i)) { gif->loop_count = 0; } + if (note_interface.is_note_on(i)) { gif->loop_count = 0; } if (select) { - gif->reset(); + // gif->reset(); oled_display.fillRect(x, 9, 24, 21, INVERT); oled_display.drawRect(x + 1, 10, 22, 19, BLACK); diff --git a/avr/cores/megacommand/MCL/MCLGfx.cpp b/avr/cores/megacommand/MCL/MCLGfx.cpp index fb78e2999..a39026f36 100644 --- a/avr/cores/megacommand/MCL/MCLGfx.cpp +++ b/avr/cores/megacommand/MCL/MCLGfx.cpp @@ -3,12 +3,12 @@ MCLGIF metronome_gif(45, 10, 17, 15, DIR_FWDBACK,1); MCLGIF perf_gif(27, 7, 18, 9, DIR_FWDBACK, 1); -MCLGIF route_gif(20, 5, 14, 10, DIR_FWDBACK, 2); +MCLGIF route_gif(20, 5, 14, 10, DIR_FWDBACK, 1); MCLGIF analog_gif(27, 7, 18, 9, DIR_FWDBACK, 1); MCLGIF monomachine_gif(27, 10, 18, 9, DIR_FWDBACK, 1); -MCLGIF machinedrum_gif(27, 8, 18, 9, DIR_FWD, 2); -MCLGIF midi_gif(27, 8, 18, 9, DIR_FWD, 2); +MCLGIF machinedrum_gif(27, 8, 18, 9, DIR_FWD, 1); +MCLGIF midi_gif(27, 8, 18, 9, DIR_FWD, 1); void MCLGfx::init_oled() { oled_display.begin(); diff --git a/avr/cores/megacommand/MCL/MCLGfx.h b/avr/cores/megacommand/MCL/MCLGfx.h index 034d8d202..39b505cac 100644 --- a/avr/cores/megacommand/MCL/MCLGfx.h +++ b/avr/cores/megacommand/MCL/MCLGfx.h @@ -32,7 +32,7 @@ class MCLGIF { dir = dir_; loops = loops_; reset(); - uint8_t loop_count = 255; + loop_count = loops; } void reset() { From 7bacdf939fcb541f56651ddab06616093fa1e197 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 13 Jul 2023 22:55:58 +1000 Subject: [PATCH 238/413] FX and LFO track now loaded with MD group. --- avr/cores/megacommand/MD/MD.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MD/MD.cpp b/avr/cores/megacommand/MD/MD.cpp index 77e531087..b209d60a1 100644 --- a/avr/cores/megacommand/MD/MD.cpp +++ b/avr/cores/megacommand/MD/MD.cpp @@ -153,13 +153,13 @@ void MDClass::init_grid_devices(uint8_t device_idx) { } grid_idx = 1; - gdt.init(MDFX_TRACK_TYPE, GROUP_AUX, device_idx, (SeqTrack*) &(mcl_seq.mdfx_track), 0); + gdt.init(MDFX_TRACK_TYPE, GROUP_DEV, device_idx, (SeqTrack*) &(mcl_seq.mdfx_track), 0); add_track_to_grid(grid_idx, MDFX_TRACK_NUM, &gdt); gdt.init(MDROUTE_TRACK_TYPE, GROUP_AUX, device_idx, (SeqTrack*) &(mcl_seq.aux_tracks[0]), 0); add_track_to_grid(grid_idx, MDFX_TRACK_NUM + 1, &gdt); - gdt.init(MDLFO_TRACK_TYPE, GROUP_AUX, device_idx, (SeqTrack*) &(mcl_seq.aux_tracks[1]), 0); + gdt.init(MDLFO_TRACK_TYPE, GROUP_DEV, device_idx, (SeqTrack*) &(mcl_seq.aux_tracks[1]), 0); add_track_to_grid(grid_idx, MDFX_TRACK_NUM + 2, &gdt); gdt.init(MDTEMPO_TRACK_TYPE, GROUP_TEMPO, device_idx, (SeqTrack*) &(mcl_seq.aux_tracks[2]), 0); From f75f708b32d9b97e071cf680cc612c8ea22aad35 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 13 Jul 2023 23:52:14 +1000 Subject: [PATCH 239/413] perfpage learn regression --- avr/cores/megacommand/MCL/PerfPage.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 9d7feaf35..6c980042d 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -316,9 +316,9 @@ void PerfPage::learn_param(uint8_t dest, uint8_t param, uint8_t value) { } if (mcl.currentPage() == PERF_PAGE_0) { - if (dest >= NUM_MD_TRACKS + 4) { // && MidiClock.state == 2) { - return; - } + //if (dest >= NUM_MD_TRACKS + 4 && MidiClock.state == 2) { + // return; + //} if (learn) { PerfData *d = &perf_encoders[perf_id]->perf_data; uint8_t scene = learn - 1; From bc08b98f6a7dd2d4241b03897f004315b1d3eb4d Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 14 Jul 2023 00:02:09 +1000 Subject: [PATCH 240/413] GFX animations again --- avr/cores/megacommand/MCL/MCLGUI.cpp | 6 +++--- avr/cores/megacommand/MCL/MCLGfx.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCLGUI.cpp b/avr/cores/megacommand/MCL/MCLGUI.cpp index 34c7790a6..5f1c464d7 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.cpp +++ b/avr/cores/megacommand/MCL/MCLGUI.cpp @@ -660,11 +660,11 @@ void MCLGUI::draw_track_type_select(uint8_t track_type_select) { uint8_t x = 0; //oled_display.fillRect(0, 0, 128, 7, WHITE); - oled_display.fillRect(s_title_x + 10, 0, 40, 7, WHITE); - oled_display.setCursor(s_title_x + (s_title_w - 5 * 4) / 2, 6); + oled_display.fillRect(s_title_x + 10, 0, 50, 7, WHITE); + oled_display.setCursor(s_title_x + (s_title_w - 12 * 4) / 2 + 2, 6); // oled_display.setCursor(s_title_x + 2, s_menu_y + 3); oled_display.setTextColor(BLACK); - oled_display.println("GROUPS"); + oled_display.println("GROUP SELECT"); oled_display.fillRect(0, 8, 128, 23, BLACK); MCLGIF *gif; diff --git a/avr/cores/megacommand/MCL/MCLGfx.h b/avr/cores/megacommand/MCL/MCLGfx.h index 39b505cac..4f3cc9bef 100644 --- a/avr/cores/megacommand/MCL/MCLGfx.h +++ b/avr/cores/megacommand/MCL/MCLGfx.h @@ -55,7 +55,7 @@ class MCLGIF { uint8_t *get_next_frame() { uint8_t *bmp = get_frame(cur_frame); - if (clock_diff(last_frame_clock,slowclock) < 100 || loop_count == loops) { return bmp; } + if (clock_diff(last_frame_clock,slowclock) < 80 || loop_count == loops) { return bmp; } last_frame_clock = slowclock; cur_frame += inc; From 4ed7b310981758730f5b29479367c8407a4c7310 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 14 Jul 2023 00:02:27 +1000 Subject: [PATCH 241/413] bad mask? also fix perf encoders glitch with mute states --- avr/cores/megacommand/MCL/MixerPage.cpp | 531 +++++++++++++----------- 1 file changed, 278 insertions(+), 253 deletions(-) diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 5be54fb31..8d85b7357 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -42,12 +42,12 @@ void MixerPage::oled_draw_mutes() { } void MixerPage::setup() { - /* - encoders[0]->handler = encoder_level_handle; - encoders[1]->handler = encoder_filtf_handle; - encoders[2]->handler = encoder_filtw_handle; - encoders[3]->handler = encoder_filtq_handle; - */ + /* +encoders[0]->handler = encoder_level_handle; +encoders[1]->handler = encoder_filtf_handle; +encoders[2]->handler = encoder_filtw_handle; +encoders[3]->handler = encoder_filtq_handle; +*/ } void MixerPage::init() { @@ -68,12 +68,12 @@ void MixerPage::init() { first_track = 255; redraw_mask = -1; show_mixer_menu = 0; - //populate_mute_set(); + // populate_mute_set(); draw_encoders = false; redraw_mutes = true; R.Clear(); R.use_icons_knob(); -// R.use_machine_param_names(); + // R.use_machine_param_names(); } void MixerPage::cleanup() { @@ -96,23 +96,31 @@ void MixerPage::loop() { bool old_draw_encoders = draw_encoders; if (draw_encoders && trig_interface.is_key_down(MDX_KEY_FUNC)) { draw_encoders = true; - } - else { - draw_encoders = false; - for (uint8_t n = 0; n < 4; n++) { - if (note_interface.notes_on) { encoders_used_clock[n] = slowclock + timeout + 1; } - if (mcl_gui.show_encoder_value(encoders[n],timeout)) { draw_encoders = true; } - } + } else { + draw_encoders = false; + for (uint8_t n = 0; n < 4; n++) { + uint64_t mask = ((uint64_t)1 << MDX_KEY_LEFT) | ((uint64_t)1 << MDX_KEY_UP) | + ((uint64_t)1 << MDX_KEY_RIGHT) | ((uint64_t)1 << MDX_KEY_DOWN) | + ((uint64_t)1 << MDX_KEY_YES); + bool check = (trig_interface.cmd_key_state & mask); + + if (note_interface.notes_on || check) { + encoders_used_clock[n] = slowclock + timeout + 1; } + if (mcl_gui.show_encoder_value(encoders[n],timeout)) { + draw_encoders = true; } + } } if (draw_encoders != old_draw_encoders) { - if (!draw_encoders) { redraw_mask = -1; - oled_display.clearDisplay(); oled_draw_mutes(); } + if (!draw_encoders) { + redraw_mask = -1; + oled_display.clearDisplay(); + oled_draw_mutes(); + } } if (!draw_encoders) { init_encoders_used_clock(timeout); } - } void MixerPage::draw_levels() {} @@ -130,9 +138,9 @@ void encoder_level_handle(EncoderParent *enc) { for (int i = 0; i < 16; i++) { if (note_interface.is_note_on(i)) { - track_newval = min(max(MD.kit.levels[i] + dir,0),127); - mixer_page.set_level(i, track_newval); - SET_BIT16(mixer_page.redraw_mask, i); + track_newval = min(max(MD.kit.levels[i] + dir, 0), 127); + mixer_page.set_level(i, track_newval); + SET_BIT16(mixer_page.redraw_mask, i); } } enc->cur = 64 + dir; @@ -201,9 +209,9 @@ void MixerPage::adjust_param(EncoderParent *enc, uint8_t param) { for (int i = 0; i < 16; i++) { if (note_interface.is_note_on(i)) { - newval =min(max(MD.kit.params[i][param] + dir,0),127); - MD.setTrackParam(i, param, newval, nullptr, true); - SET_BIT16(redraw_mask, i); + newval = min(max(MD.kit.params[i][param] + dir, 0), 127); + MD.setTrackParam(i, param, newval, nullptr, true); + SET_BIT16(redraw_mask, i); } } enc->cur = 64 + dir; @@ -220,18 +228,20 @@ void MixerPage::display() { } else if (draw_encoders) { - //oled_display.clearDisplay(); - oled_display.fillRect(0,0,128,12,BLACK); + // oled_display.clearDisplay(); + oled_display.fillRect(0, 0, 128, 12, BLACK); for (uint8_t n = 0; n < 4; n++) { - char str1[] = "A"; - str1[0] = 'A' + n; - uint8_t pos = n * 24; - mcl_gui.draw_encoder(24 + pos, 0, encoders[n]->cur); - oled_display.setCursor(16 + pos, 2); - oled_display.print(str1); + char str1[] = "A"; + str1[0] = 'A' + n; + uint8_t pos = n * 24; + mcl_gui.draw_encoder(24 + pos, 0, encoders[n]->cur); + oled_display.setCursor(16 + pos, 2); + oled_display.print(str1); } + } else if (redraw_mutes) { + oled_draw_mutes(); + redraw_mutes = false; } - else if (redraw_mutes) { oled_draw_mutes(); redraw_mutes = false; } uint8_t fader_level; uint8_t meter_level; uint8_t fader_x = 0; @@ -243,16 +253,19 @@ void MixerPage::display() { uint8_t *levels = is_md_device ? disp_levels : ext_disp_levels; if (preview_mute_set != 255) { - if (mute_sets[!is_md_device].mutes[preview_mute_set] != seq_step_page.mute_mask) { - seq_step_page.mute_mask = mute_sets[!is_md_device].mutes[preview_mute_set]; - MD.set_trigleds(mute_sets[!is_md_device].mutes[preview_mute_set], - TRIGLED_EXCLUSIVE); - oled_draw_mutes(); + if (mute_sets[!is_md_device].mutes[preview_mute_set] != + seq_step_page.mute_mask) { + seq_step_page.mute_mask = + mute_sets[!is_md_device].mutes[preview_mute_set]; + MD.set_trigleds(mute_sets[!is_md_device].mutes[preview_mute_set], + TRIGLED_EXCLUSIVE); + oled_draw_mutes(); } } else if (show_mixer_menu && seq_step_page.display_mute_mask(midi_device)) { oled_draw_mutes(); - } else if (current_mute_set != 255 && mute_sets[!is_md_device].mutes[current_mute_set] != - seq_step_page.mute_mask) { + } else if (current_mute_set != 255 && + mute_sets[!is_md_device].mutes[current_mute_set] != + seq_step_page.mute_mask) { seq_step_page.mute_mask = mute_sets[!is_md_device].mutes[current_mute_set]; oled_draw_mutes(); } @@ -262,13 +275,13 @@ void MixerPage::display() { for (int i = 0; i < len; i++) { if (is_md_device) { - if (display_mode == MODEL_LEVEL) { - fader_level = MD.kit.levels[i]; - } else { - fader_level = MD.kit.params[i][display_mode]; - } + if (display_mode == MODEL_LEVEL) { + fader_level = MD.kit.levels[i]; + } else { + fader_level = MD.kit.params[i][display_mode]; + } } else { - fader_level = 127; + fader_level = 127; } fader_level = ((fader_level * 0.00787) * FADER_LEN) + 0; @@ -276,30 +289,30 @@ void MixerPage::display() { meter_level = min(fader_level, meter_level); if (IS_BIT_SET16(redraw_mask, i)) { - oled_display.fillRect(fader_x, fader_y - 1, 6, FADER_LEN + 1, BLACK); - oled_display.drawRect(fader_x, fader_y + (FADER_LEN - fader_level), 6, - fader_level + 2, WHITE); + oled_display.fillRect(fader_x, fader_y - 1, 6, FADER_LEN + 1, BLACK); + oled_display.drawRect(fader_x, fader_y + (FADER_LEN - fader_level), 6, + fader_level + 2, WHITE); } if (note_interface.is_note_on(i)) { - oled_display.fillRect(fader_x, fader_y + 1 + (FADER_LEN - fader_level), 6, - fader_level, WHITE); + oled_display.fillRect(fader_x, fader_y + 1 + (FADER_LEN - fader_level), + 6, fader_level, WHITE); } else { - oled_display.fillRect(fader_x + 1, - fader_y + 1 + (FADER_LEN - fader_level), 4, - FADER_LEN - meter_level - 1, BLACK); - oled_display.fillRect(fader_x + 1, - fader_y + 1 + (FADER_LEN - meter_level), 4, - meter_level + 1, WHITE); + oled_display.fillRect(fader_x + 1, + fader_y + 1 + (FADER_LEN - fader_level), 4, + FADER_LEN - meter_level - 1, BLACK); + oled_display.fillRect(fader_x + 1, + fader_y + 1 + (FADER_LEN - meter_level), 4, + meter_level + 1, WHITE); } fader_x += 8; CLEAR_BIT16(redraw_mask, i); if (levels[i] < dec) { - levels[i] = 0; + levels[i] = 0; } else { - levels[i] -= dec; + levels[i] -= dec; } } @@ -325,20 +338,20 @@ void MixerPage::disable_record_mutes() { for (uint8_t n = 0; n < mcl_seq.num_md_tracks; n++) { if (n < mcl_seq.num_ext_tracks) { - if (mcl_seq.ext_tracks[n].record_mutes) { - mcl_seq.ext_tracks[n].record_mutes = false; - if (mcl_seq.ext_tracks[n].mute_state == SEQ_MUTE_ON) { - mcl_seq.ext_tracks[n].toggle_mute(); - devs[1]->muteTrack(n, SEQ_MUTE_OFF); - } - } + if (mcl_seq.ext_tracks[n].record_mutes) { + mcl_seq.ext_tracks[n].record_mutes = false; + if (mcl_seq.ext_tracks[n].mute_state == SEQ_MUTE_ON) { + mcl_seq.ext_tracks[n].toggle_mute(); + devs[1]->muteTrack(n, SEQ_MUTE_OFF); + } + } } if (mcl_seq.md_tracks[n].record_mutes) { - mcl_seq.md_tracks[n].record_mutes = false; - if (mcl_seq.md_tracks[n].mute_state == SEQ_MUTE_ON) { - mcl_seq.md_tracks[n].toggle_mute(); - devs[0]->muteTrack(n, SEQ_MUTE_OFF); - } + mcl_seq.md_tracks[n].record_mutes = false; + if (mcl_seq.md_tracks[n].mute_state == SEQ_MUTE_ON) { + mcl_seq.md_tracks[n].toggle_mute(); + devs[0]->muteTrack(n, SEQ_MUTE_OFF); + } } } if (!seq_step_page.recording) { @@ -347,19 +360,21 @@ void MixerPage::disable_record_mutes() { } void MixerPage::populate_mute_set() { - if (current_mute_set == 255) { return; } + if (current_mute_set == 255) { + return; + } for (uint8_t dev = 0; dev < 2; dev++) { uint8_t len = (dev == 0) ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; for (uint8_t n = 0; n < len; n++) { - SeqTrack *seq_track = (dev == 0) ? (SeqTrack *)&mcl_seq.md_tracks[n] - : (SeqTrack *)&mcl_seq.ext_tracks[n]; - if (seq_track->mute_state == SEQ_MUTE_ON) { - CLEAR_BIT16(mute_sets[dev].mutes[current_mute_set], n); - } else { - SET_BIT16(mute_sets[dev].mutes[current_mute_set], n); - } + SeqTrack *seq_track = (dev == 0) ? (SeqTrack *)&mcl_seq.md_tracks[n] + : (SeqTrack *)&mcl_seq.ext_tracks[n]; + if (seq_track->mute_state == SEQ_MUTE_ON) { + CLEAR_BIT16(mute_sets[dev].mutes[current_mute_set], n); + } else { + SET_BIT16(mute_sets[dev].mutes[current_mute_set], n); + } } } } @@ -382,20 +397,20 @@ void MixerPage::switch_mute_set(uint8_t state) { uint8_t len = (dev == 0) ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; for (uint8_t n = 0; n < len; n++) { - SeqTrack *seq_track = (dev == 0) ? (SeqTrack *)&mcl_seq.md_tracks[n] - : (SeqTrack *)&mcl_seq.ext_tracks[n]; - - if (IS_BIT_CLEAR16(mute_sets[dev].mutes[state], n)) { - if (seq_track->mute_state == SEQ_MUTE_OFF) { - seq_track->toggle_mute(); - devs[dev]->muteTrack(n, SEQ_MUTE_ON); - } - } else { - if (seq_track->mute_state == SEQ_MUTE_ON) { - seq_track->toggle_mute(); - devs[dev]->muteTrack(n, SEQ_MUTE_OFF); - } - } + SeqTrack *seq_track = (dev == 0) ? (SeqTrack *)&mcl_seq.md_tracks[n] + : (SeqTrack *)&mcl_seq.ext_tracks[n]; + + if (IS_BIT_CLEAR16(mute_sets[dev].mutes[state], n)) { + if (seq_track->mute_state == SEQ_MUTE_OFF) { + seq_track->toggle_mute(); + devs[dev]->muteTrack(n, SEQ_MUTE_ON); + } + } else { + if (seq_track->mute_state == SEQ_MUTE_ON) { + seq_track->toggle_mute(); + devs[dev]->muteTrack(n, SEQ_MUTE_OFF); + } + } } } current_mute_set = state; @@ -425,64 +440,68 @@ bool MixerPage::handleEvent(gui_event_t *event) { uint8_t len = is_md_device ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; if (track > 16) { - return false; + return false; } if (!show_mixer_menu && preview_mute_set == 255) { - trig_interface.send_md_leds(TRIGLED_OVERLAY); + trig_interface.send_md_leds(TRIGLED_OVERLAY); } if (event->mask == EVENT_BUTTON_PRESSED && track <= len) { - if (note_interface.is_note(track)) { - if (show_mixer_menu || preview_mute_set != 255) { - - SeqTrack *seq_track = is_md_device - ? (SeqTrack *)&mcl_seq.md_tracks[track] - : (SeqTrack *)&mcl_seq.ext_tracks[track]; - - uint8_t mute_set = current_mute_set; - uint8_t state = 0; - - if (preview_mute_set == 255 || preview_mute_set == current_mute_set) { - seq_track->toggle_mute(); - midi_device->muteTrack(track, seq_track->mute_state); - state = seq_track->mute_state; - if (preview_mute_set == current_mute_set) { - goto update_mute_set; - } - } else { - update_mute_set: - mute_set = preview_mute_set; - state = IS_BIT_SET16(mute_sets[!is_md_device].mutes[mute_set], track); - } - - if (mute_set == 255) { return; } - - if (state == SEQ_MUTE_ON) { - CLEAR_BIT16(mute_sets[!is_md_device].mutes[mute_set], track); - } else { - SET_BIT16(mute_sets[!is_md_device].mutes[mute_set], track); - } - - if (trig_interface.is_key_down(MDX_KEY_PATSONG)) { - seq_track->record_mutes = true; - } - // oled_draw_mutes(); - } else if (first_track == 255) { - first_track = track; - MD.setStatus(0x22, track); - } - } - return true; + if (note_interface.is_note(track)) { + if (show_mixer_menu || preview_mute_set != 255) { + + SeqTrack *seq_track = is_md_device + ? (SeqTrack *)&mcl_seq.md_tracks[track] + : (SeqTrack *)&mcl_seq.ext_tracks[track]; + + uint8_t mute_set = current_mute_set; + uint8_t state = 0; + + if (preview_mute_set == 255 || + preview_mute_set == current_mute_set) { + seq_track->toggle_mute(); + midi_device->muteTrack(track, seq_track->mute_state); + state = seq_track->mute_state; + if (preview_mute_set == current_mute_set) { + goto update_mute_set; + } + } else { + update_mute_set: + mute_set = preview_mute_set; + state = IS_BIT_SET16(mute_sets[!is_md_device].mutes[mute_set], + track); + } + + if (mute_set == 255) { + return; + } + + if (state == SEQ_MUTE_ON) { + CLEAR_BIT16(mute_sets[!is_md_device].mutes[mute_set], track); + } else { + SET_BIT16(mute_sets[!is_md_device].mutes[mute_set], track); + } + + if (trig_interface.is_key_down(MDX_KEY_PATSONG)) { + seq_track->record_mutes = true; + } + // oled_draw_mutes(); + } else if (first_track == 255) { + first_track = track; + MD.setStatus(0x22, track); + } + } + return true; } if (event->mask == EVENT_BUTTON_RELEASED) { - SET_BIT16(redraw_mask, track); - if (note_interface.notes_count_on() == 0) { - first_track = 255; - note_interface.init_notes(); - oled_draw_mutes(); - } - return true; + SET_BIT16(redraw_mask, track); + if (note_interface.notes_count_on() == 0) { + first_track = 255; + note_interface.init_notes(); + oled_draw_mutes(); + } + return true; } } /* @@ -498,114 +517,119 @@ bool MixerPage::handleEvent(gui_event_t *event) { if (EVENT_CMD(event)) { uint8_t key = event->source - 64; if (event->mask == EVENT_BUTTON_PRESSED) { - switch (key) { - case MDX_KEY_NO: { - if (note_interface.notes_count_on() == 0) { - disable_record_mutes(); - mcl.setPage(fx_page_a.last_page); - return true; - } - if (midi_device == &MD) { - for (uint8_t i = 0; i < 16; i++) { - if (note_interface.is_note_on(i)) { - for (uint8_t c = 0; c < 24; c++) { - MD.restore_kit_param(i, c); - } - } - } - } - break; - } - case MDX_KEY_YES: { - if (trig_interface.is_key_down(MDX_KEY_LEFT)) { - switch_mute_set(1); - break; - } else if (trig_interface.is_key_down(MDX_KEY_UP)) { - switch_mute_set(2); - break; - } else if (trig_interface.is_key_down(MDX_KEY_RIGHT)) { - switch_mute_set(3); - break; - } else if (trig_interface.is_key_down(MDX_KEY_DOWN)) { - switch_mute_set(0); - break; - } else { - if (!note_interface.notes_on) { - seq_step_page.mute_mask = 0; - show_mixer_menu = true; - } else { - uint8_t is_md_device = (midi_device == &MD); - uint8_t len = is_md_device ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; - for (int i = 0; i < len; i++) { - if (note_interface.is_note_on(i)) { - SeqTrack *seq_track = is_md_device - ? (SeqTrack *)&mcl_seq.md_tracks[i] - : (SeqTrack *)&mcl_seq.ext_tracks[i]; - seq_track->toggle_mute(); - midi_device->muteTrack(i, seq_track->mute_state); - if (current_mute_set == 255) { break; } - uint8_t state = - IS_BIT_SET16(mute_sets[!is_md_device].mutes[current_mute_set], i); - if (state == SEQ_MUTE_ON) { - CLEAR_BIT16(mute_sets[!is_md_device].mutes[current_mute_set], i); - } else { - SET_BIT16(mute_sets[!is_md_device].mutes[current_mute_set], i); - } - } - } - } - } - break; - } - - case MDX_KEY_LEFT: - case MDX_KEY_UP: - case MDX_KEY_RIGHT: - case MDX_KEY_DOWN: { - uint8_t set = get_mute_set(key); - if (trig_interface.is_key_down(MDX_KEY_YES)) { - switch_mute_set(set); - } else { - preview_mute_set = set; - // force redraw in display() - seq_step_page.mute_mask++; - } - break; - } - case MDX_KEY_SCALE: { - if (midi_device != &MD) { - midi_device = &MD; - } else { - midi_device = midi_active_peering.get_device(UART2_PORT); - } - redraw_mask = -1; - oled_display.clearDisplay(); - oled_draw_mutes(); - break; - } - } + switch (key) { + case MDX_KEY_NO: { + if (note_interface.notes_count_on() == 0) { + disable_record_mutes(); + mcl.setPage(fx_page_a.last_page); + return true; + } + if (midi_device == &MD) { + for (uint8_t i = 0; i < 16; i++) { + if (note_interface.is_note_on(i)) { + for (uint8_t c = 0; c < 24; c++) { + MD.restore_kit_param(i, c); + } + } + } + } + break; + } + case MDX_KEY_YES: { + if (trig_interface.is_key_down(MDX_KEY_LEFT)) { + switch_mute_set(1); + break; + } else if (trig_interface.is_key_down(MDX_KEY_UP)) { + switch_mute_set(2); + break; + } else if (trig_interface.is_key_down(MDX_KEY_RIGHT)) { + switch_mute_set(3); + break; + } else if (trig_interface.is_key_down(MDX_KEY_DOWN)) { + switch_mute_set(0); + break; + } else { + if (!note_interface.notes_on) { + seq_step_page.mute_mask = 0; + show_mixer_menu = true; + } else { + uint8_t is_md_device = (midi_device == &MD); + uint8_t len = is_md_device ? mcl_seq.num_md_tracks + : mcl_seq.num_ext_tracks; + for (int i = 0; i < len; i++) { + if (note_interface.is_note_on(i)) { + SeqTrack *seq_track = + is_md_device ? (SeqTrack *)&mcl_seq.md_tracks[i] + : (SeqTrack *)&mcl_seq.ext_tracks[i]; + seq_track->toggle_mute(); + midi_device->muteTrack(i, seq_track->mute_state); + if (current_mute_set == 255) { + break; + } + uint8_t state = IS_BIT_SET16( + mute_sets[!is_md_device].mutes[current_mute_set], i); + if (state == SEQ_MUTE_ON) { + CLEAR_BIT16( + mute_sets[!is_md_device].mutes[current_mute_set], i); + } else { + SET_BIT16(mute_sets[!is_md_device].mutes[current_mute_set], + i); + } + } + } + } + } + break; + } + + case MDX_KEY_LEFT: + case MDX_KEY_UP: + case MDX_KEY_RIGHT: + case MDX_KEY_DOWN: { + uint8_t set = get_mute_set(key); + if (trig_interface.is_key_down(MDX_KEY_YES)) { + switch_mute_set(set); + } else { + preview_mute_set = set; + // force redraw in display() + seq_step_page.mute_mask++; + } + break; + } + case MDX_KEY_SCALE: { + if (midi_device != &MD) { + midi_device = &MD; + } else { + midi_device = midi_active_peering.get_device(UART2_PORT); + } + redraw_mask = -1; + oled_display.clearDisplay(); + oled_draw_mutes(); + break; + } + } } if (event->mask == EVENT_BUTTON_RELEASED) { - switch (key) { - case MDX_KEY_GLOBAL: - case MDX_KEY_YES: { - goto global_release; - } - case MDX_KEY_LEFT: - case MDX_KEY_UP: - case MDX_KEY_RIGHT: - case MDX_KEY_DOWN: { - uint64_t mask = _BV(MDX_KEY_LEFT) | _BV(MDX_KEY_UP) | - _BV(MDX_KEY_RIGHT) | _BV(MDX_KEY_DOWN) | - _BV(MDX_KEY_YES); - if ((trig_interface.cmd_key_state & mask) == 0) { - trig_interface.send_md_leds(TRIGLED_OVERLAY); - preview_mute_set = 255; - oled_draw_mutes(); - } - break; - } - } + switch (key) { + case MDX_KEY_GLOBAL: + case MDX_KEY_YES: { + goto global_release; + } + case MDX_KEY_LEFT: + case MDX_KEY_UP: + case MDX_KEY_RIGHT: + case MDX_KEY_DOWN: { + uint64_t mask = ((uint64_t)1 << MDX_KEY_LEFT) | ((uint64_t)1 << MDX_KEY_UP) | + ((uint64_t)1 << MDX_KEY_RIGHT) | ((uint64_t)1 << MDX_KEY_DOWN) | + ((uint64_t)1 << MDX_KEY_YES); + if ((trig_interface.cmd_key_state & mask) == 0) { + trig_interface.send_md_leds(TRIGLED_OVERLAY); + preview_mute_set = 255; + oled_draw_mutes(); + } + break; + } + } } } if (EVENT_PRESSED(event, Buttons.BUTTON3) && !BUTTON_DOWN(Buttons.BUTTON4)) { @@ -692,7 +716,8 @@ uint8_t channel = MIDI_VOICE_CHANNEL(msg[0]); } */ -void MixerPage::onControlChangeCallback_Midi(uint8_t track, uint8_t track_param, uint8_t value) { +void MixerPage::onControlChangeCallback_Midi(uint8_t track, uint8_t track_param, + uint8_t value) { if (track_param == 32) { redraw_mutes = true; return; @@ -703,8 +728,8 @@ void MixerPage::onControlChangeCallback_Midi(uint8_t track, uint8_t track_param, SET_BIT16(mixer_page.redraw_mask, track); for (int i = 0; i < 16; i++) { if (note_interface.is_note_on(i) && (i != track)) { - MD.setTrackParam(i, track_param, value, nullptr, true); - SET_BIT16(mixer_page.redraw_mask, i); + MD.setTrackParam(i, track_param, value, nullptr, true); + SET_BIT16(mixer_page.redraw_mask, i); } } mixer_page.set_display_mode(track_param); @@ -714,7 +739,7 @@ uint8_t MixerPage::note_to_trig(uint8_t note_num) { uint8_t trig_num = 0; for (uint8_t i = 0; i < sizeof(MD.global.drumMapping); i++) { if (note_num == MD.global.drumMapping[i]) { - trig_num = i; + trig_num = i; } } return trig_num; From 0e0fce8b0079a3c40346815cda6b124b03c5f436 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 14 Jul 2023 12:08:06 +1000 Subject: [PATCH 242/413] Fix problems with last note of ext sequencer --- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 19 +++++++++++++------ avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 16 ++++++++++------ avr/cores/megacommand/MCL/SeqExtStepPage.h | 4 ++-- 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index 809d05020..8d12a9e51 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -443,19 +443,25 @@ void ExtSeqTrack::add_note(uint16_t cur_x, uint16_t cur_w, uint8_t cur_y, uint8_t step = (cur_x / timing_mid); uint8_t start_utiming = timing_mid + cur_x - (step * timing_mid); + DEBUG_DUMP(step); + DEBUG_DUMP(start_utiming); + uint8_t end_step = ((cur_x + cur_w) / timing_mid); + again: uint8_t end_utiming = timing_mid + (cur_x + cur_w) - (end_step * timing_mid); + DEBUG_DUMP(end_step); + DEBUG_DUMP(end_utiming); + if (end_step == step) { DEBUG_PRINTLN(F("ALERT start == end")); end_step = end_step + 1; - end_utiming -= timing_mid; + goto again; } if (end_step >= length) { end_step = end_step - length; } - uint16_t ev_idx; uint16_t note_idx = find_midi_note(step, cur_y, ev_idx, /*event_on*/ true); if (note_idx != 0xFFFF) { @@ -488,7 +494,7 @@ bool ExtSeqTrack::del_note(uint16_t cur_x, uint16_t cur_w, uint8_t cur_y) { uint16_t note_idx_off, note_idx_on; bool note_on_found = false; uint16_t ev_idx, ev_end; - uint16_t note_start, note_end; + int16_t note_start, note_end; bool ret = false; for (int i = 0; i < length; i++) { @@ -525,10 +531,9 @@ bool ExtSeqTrack::del_note(uint16_t cur_x, uint16_t cur_w, uint8_t cur_y) { note_idx_off = find_midi_note(i, cur_y, ev_idx, /*event_on*/ false); if (note_idx_off != 0xFFFF) { - DEBUG_DUMP(F("Wrap")); // Remove wrap around notes auto &ev = events[note_idx_off]; - uint16_t note_end = i * timing_mid + ev.micro_timing - timing_mid; + int16_t note_end = i * timing_mid + ev.micro_timing - timing_mid; if (note_end > cur_x) { remove_event(note_idx_off); for (uint8_t j = length - 1; j > i; j--) { @@ -684,7 +689,7 @@ void ExtSeqTrack::seq(MidiUartParent *uart_) { // Locate NEXT uint8_t next_step = 0; - if (step_count == length) { + if (step_count == length - 1) { next_step = 0; ev_idx = 0; } else { @@ -1031,6 +1036,8 @@ bool ExtSeqTrack::set_track_step(uint8_t &step, uint8_t utiming, e.event_on = event_on; e.micro_timing = utiming; + DEBUG_PRINTLN("adding step"); + DEBUG_DUMP(event_on); DEBUG_DUMP(step); DEBUG_DUMP(utiming); if (add_event(step, &e) == 0xFFFF) { return false; } diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index 92443eb0b..850737c9b 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -230,8 +230,8 @@ void SeqExtStepPage::draw_lockeditor() { } auto &ev_j = active_track.events[next_lock_ev]; - uint16_t start_x = i * timing_mid + ev.micro_timing - timing_mid; - uint16_t end_x = j * timing_mid + ev_j.micro_timing - timing_mid; + int16_t start_x = i * timing_mid + ev.micro_timing - timing_mid; + int16_t end_x = j * timing_mid + ev_j.micro_timing - timing_mid; if (is_within_fov(start_x, end_x)) { uint8_t start_fov_x, end_fov_x; @@ -239,8 +239,8 @@ void SeqExtStepPage::draw_lockeditor() { uint8_t start_y = ev.event_value; uint8_t end_y = ev_j.event_value; - uint16_t start_x_tmp = start_x; - uint16_t end_x_tmp = end_x; + int16_t start_x_tmp = start_x; + int16_t end_x_tmp = end_x; uint8_t start_y_tmp = start_y; uint8_t end_y_tmp = end_y; @@ -379,8 +379,12 @@ void SeqExtStepPage::draw_pianoroll() { } auto &ev_j = active_track.events[note_off_idx]; - uint16_t note_start = i * timing_mid + ev.micro_timing - timing_mid; - uint16_t note_end = j * timing_mid + ev_j.micro_timing - timing_mid; + int16_t note_start = i * timing_mid + ev.micro_timing - timing_mid; + int16_t note_end = j * timing_mid + ev_j.micro_timing - timing_mid; + + if (note_end < note_start) { + note_end += active_track.length * timing_mid; + } if (is_within_fov(note_start, note_end)) { uint8_t note_fov_start, note_fov_end; diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.h b/avr/cores/megacommand/MCL/SeqExtStepPage.h index 91118207b..17d858d52 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.h +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.h @@ -73,13 +73,13 @@ class SeqExtStepPage : public SeqPage { void pos_cur_y(int16_t diff); void pos_cur_w(int16_t diff); - bool is_within_fov(uint16_t x) { + bool is_within_fov(int16_t x) { if ((x >= fov_offset) && (x < fov_offset + fov_length)) { return true; } return false; } - bool is_within_fov(uint16_t start_x, uint16_t end_x) { + bool is_within_fov(int16_t start_x, int16_t end_x) { if (is_within_fov(start_x) || is_within_fov(end_x) || ((start_x < fov_offset) && (end_x >= fov_offset + fov_length)) || (end_x < start_x && From 0f4e1b35c5ccee09d43d5294efa9efe583a4ea03 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 14 Jul 2023 12:09:04 +1000 Subject: [PATCH 243/413] GUI optim --- avr/cores/megacommand/GUI/GUI.cpp | 11 ----------- avr/cores/megacommand/GUI/GUI.h | 9 +-------- avr/cores/megacommand/GUI/Pages.cpp | 8 ++------ avr/cores/megacommand/GUI/Pages.h | 19 ++----------------- 4 files changed, 5 insertions(+), 42 deletions(-) diff --git a/avr/cores/megacommand/GUI/GUI.cpp b/avr/cores/megacommand/GUI/GUI.cpp index 404a21e6b..8cfc7a692 100644 --- a/avr/cores/megacommand/GUI/GUI.cpp +++ b/avr/cores/megacommand/GUI/GUI.cpp @@ -21,8 +21,6 @@ void GuiClass::setSketch(Sketch *_sketch) { if (sketch != NULL) { sketch->show(); } - if (currentPage() != NULL) - currentPage()->redisplayPage(); } void GuiClass::setPage(LightPage *page) { @@ -52,14 +50,6 @@ LightPage *GuiClass::currentPage() { return NULL; } -void GuiClass::redisplay() { - if (sketch != NULL) { - PageParent *page = sketch->currentPage(); - if (page != NULL) - page->redisplay = true; - } -} - void loop(); void GuiClass::loop() { @@ -130,7 +120,6 @@ void GuiClass::display() { page = sketch->currentPage(); if (page != NULL) { page->display(); - page->redisplay = false; } } diff --git a/avr/cores/megacommand/GUI/GUI.h b/avr/cores/megacommand/GUI/GUI.h index 39aac5466..5bfb02fff 100644 --- a/avr/cores/megacommand/GUI/GUI.h +++ b/avr/cores/megacommand/GUI/GUI.h @@ -74,8 +74,7 @@ class GuiClass { * * If a sketch is already active, its hide() method is called. * After the sketch is switched, the show() method of the new sketch - * is called, and the currentPage() is redisplayed by calling - * redisplayPage(). + * is called **/ void setSketch(Sketch *_sketch); /** Returns a pointer to the current sketches currentPage(). **/ @@ -190,12 +189,6 @@ class GuiClass { void display(); - /** - * This method sets the redisplay flag of the active page to true so - * that it gets redisplayed on the next call to display(). - **/ - void redisplay(); - }; /** diff --git a/avr/cores/megacommand/GUI/Pages.cpp b/avr/cores/megacommand/GUI/Pages.cpp index f22158c8a..450605067 100644 --- a/avr/cores/megacommand/GUI/Pages.cpp +++ b/avr/cores/megacommand/GUI/Pages.cpp @@ -18,6 +18,8 @@ * GUI Pages **/ +uint16_t LightPage::encoders_used_clock[4]; + void Page::update() {} void PageContainer::pushPage(LightPage* page) { @@ -35,7 +37,6 @@ void PageContainer::pushPage(LightPage* page) { pageStack.push(page); page->init(); - page->redisplayPage(); page->show(); #ifdef ENABLE_DIAG_LOGGING // deactivate diagnostic page on pushPage @@ -43,10 +44,6 @@ void PageContainer::pushPage(LightPage* page) { #endif } -void PageParent::redisplayPage() { - redisplay = true; -} - void LightPage::update() { encoder_t _encoders[GUI_NUM_ENCODERS]; @@ -66,7 +63,6 @@ void LightPage::update() { clock_minutes = 0; minuteclock = 0; encoders_used_clock[i] = slowclock; - redisplay = true; } } } diff --git a/avr/cores/megacommand/GUI/Pages.h b/avr/cores/megacommand/GUI/Pages.h index c945d4b93..68ebe98cb 100644 --- a/avr/cores/megacommand/GUI/Pages.h +++ b/avr/cores/megacommand/GUI/Pages.h @@ -64,9 +64,6 @@ class PageParent { **/ public: - /** Set to true will cause the next call to display() to redisplay the page on - * the display. **/ - bool redisplay; /** Set to true when the setup() function has been called. **/ bool isSetup; @@ -119,11 +116,6 @@ class PageParent { **/ virtual void hide() {} - /** - * This method clears the display and sets the redisplay flag of the - * page to true. - **/ - void redisplayPage(); /** * The basic event handler of the page, called by the event handling * part of the GUI main loop when the page is active. Should return @@ -153,11 +145,10 @@ class PageParent { class LightPage : public PageParent { public: - uint8_t curpage; PageContainer *parent; Encoder *encoders[GUI_NUM_ENCODERS]; - uint16_t encoders_used_clock[4]; + static uint16_t encoders_used_clock[4]; LightPage(Encoder *e1 = NULL, Encoder *e2 = NULL, Encoder *e3 = NULL, Encoder *e4 = NULL) { @@ -192,11 +183,9 @@ class Page : public PageParent { /** The parent container of the page, usually the Sketch which contains it. * **/ PageContainer *parent; - bool redisplay; Page(const char *_name = NULL, const char *_shortName = NULL) : PageParent() { parent = NULL; - redisplay = false; isSetup = false; } @@ -277,12 +266,8 @@ class PageContainer { page->parent = NULL; page->hide(); } - page = currentPage(); - if (page != NULL) { - page->redisplayPage(); - } - else { + if (page == NULL) { if (lastpage == NULL) { return; } pageStack.reset(); pushPage(lastpage); From dae728e682d435ec9c64f6b695b56f962ce46b3a Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 14 Jul 2023 21:03:53 +1000 Subject: [PATCH 244/413] checkpoint --- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 77 ++++++++++++-------- 1 file changed, 48 insertions(+), 29 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index 850737c9b..6bd4093ab 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -382,10 +382,6 @@ void SeqExtStepPage::draw_pianoroll() { int16_t note_start = i * timing_mid + ev.micro_timing - timing_mid; int16_t note_end = j * timing_mid + ev_j.micro_timing - timing_mid; - if (note_end < note_start) { - note_end += active_track.length * timing_mid; - } - if (is_within_fov(note_start, note_end)) { uint8_t note_fov_start, note_fov_end; @@ -425,7 +421,7 @@ void SeqExtStepPage::draw_pianoroll() { } if (note_end > fov_offset) { - oled_display.drawRect(draw_x, proj_y, note_fov_end, 1, WHITE); + oled_display.drawRect(draw_x, proj_y, note_fov_end, 1, WHITE); } } else { @@ -476,8 +472,11 @@ void SeqExtStepPage::draw_pianoroll() { void SeqExtStepPage::draw_viewport_minimap() { auto &active_track = mcl_seq.ext_tracks[last_ext_track]; uint8_t timing_mid = active_track.get_timing_mid(); + constexpr uint16_t width = pidx_w * 4 + 3; - uint16_t pattern_end = active_track.length * timing_mid; + + uint16_t pattern_end = max(16,active_track.length) * timing_mid; + uint16_t cur_tick_x = active_track.step_count * timing_mid + active_track.mod12_counter; @@ -489,7 +488,9 @@ void SeqExtStepPage::draw_viewport_minimap() { uint16_t s = fov_offset * (width - 1) / pattern_end; uint16_t w = fov_length * (width - 2) / pattern_end; uint16_t p = min(width, cur_tick_x * (width - 1) / pattern_end); + oled_display.drawFastHLine(pidx_x0 + 1 + s, pidx_y + 1, w, WHITE); + oled_display.drawPixel(pidx_x0 + 1 + p, pidx_y + 1, INVERT); } @@ -514,12 +515,18 @@ void SeqExtStepPage::pos_cur_x(int16_t diff) { } } else { - if (cur_x >= fov_offset + fov_length - w) { - if (fov_offset + fov_length + diff < roll_length) { + if (cur_x + w >= fov_offset + fov_length) { + if (fov_offset + fov_length < roll_length) { fov_offset += diff; cur_x = fov_offset + fov_length - w; } - } else { + else { + if (cur_x + diff < roll_length) { + cur_x += diff; + cur_w = roll_length - cur_x; + } + } + } else { cur_x += diff; if (cur_x > fov_offset + fov_length - w) { cur_x = fov_offset + fov_length - w; @@ -597,7 +604,7 @@ void SeqExtStepPage::pos_cur_w(int16_t diff) { cur_w += diff; cur_w = max(cur_w, cur_w_min); } else { - if (cur_x >= fov_offset + fov_length - cur_w - diff) { + if (cur_x + cur_w >= fov_offset + fov_length) { if (fov_offset + fov_length + diff < roll_length) { cur_w += diff; fov_offset += diff; @@ -685,34 +692,45 @@ void SeqExtStepPage::loop() { } seq_extparam3.cur = 64; seq_extparam3.old = 64; -} -void SeqExtStepPage::display() { -#ifdef EXT_TRACKS - oled_display.clearDisplay(); + roll_length = active_track.length * timing_mid; // in ticks - auto &active_track = mcl_seq.ext_tracks[last_ext_track]; - uint8_t timing_mid = active_track.get_timing_mid(); + if (seq_extparam4.hasChanged()) { - roll_length = active_track.length * timing_mid; // in ticks + if (seq_extparam4.cur > zoom_max) { + seq_extparam4.cur = zoom_max; + } + if (seq_extparam4.cur > active_track.length) { + seq_extparam4.cur = active_track.length; + } - // FOV offsets + uint8_t fov_zoom = seq_extparam4.cur; - if (seq_extparam4.cur > zoom_max) { - seq_extparam4.cur = zoom_max; - } - if (seq_extparam4.cur > active_track.length) { - seq_extparam4.cur = active_track.length; - } + int old_length = fov_length; + fov_length = fov_zoom * timing_mid; // how many ticks to display on screen. + + + int diff = (fov_length - old_length); + + int x = cur_x - fov_offset; + + fov_offset -= (float) diff * ((float) x / (float) fov_length); + //fov_offset -= (diff * x) / fov_length; - uint8_t fov_zoom = seq_extparam4.cur; + if (fov_length + fov_offset > roll_length) { + fov_offset = roll_length - fov_length; + } - fov_length = fov_zoom * timing_mid; // how many ticks to display on screen. - if (fov_length + fov_offset > roll_length) { - fov_offset = roll_length - fov_length; + fov_pixels_per_tick = (float)fov_w / (float)fov_length; } - fov_pixels_per_tick = (float)fov_w / (float)fov_length; +} + +void SeqExtStepPage::display() { +#ifdef EXT_TRACKS + oled_display.clearDisplay(); + auto &active_track = mcl_seq.ext_tracks[last_ext_track]; + uint8_t timing_mid = active_track.get_timing_mid(); draw_viewport_minimap(); draw_grid(); @@ -818,6 +836,7 @@ bool SeqExtStepPage::handleEvent(gui_event_t *event) { // cur_x = fov_offset + (float)(fov_length / 16) * (float)track; int a = 16 * timing_mid; pos_cur_x(((cur_x / a) * a + timing_mid * track) - cur_x); + pos_cur_x(((cur_x / a) * a + timing_mid * track) - cur_x); note_interface.last_note = track; } if (mask == EVENT_BUTTON_RELEASED) { From b16165edcac0408c1599e4331661801f1a228668 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 14 Jul 2023 21:37:16 +1000 Subject: [PATCH 245/413] Allow cursor to extend beyond pianoroll, but truncate notes. Wrapping fixed --- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 72 +++++++++++--------- 1 file changed, 41 insertions(+), 31 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index 6bd4093ab..129746acc 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -523,7 +523,7 @@ void SeqExtStepPage::pos_cur_x(int16_t diff) { else { if (cur_x + diff < roll_length) { cur_x += diff; - cur_w = roll_length - cur_x; + // cur_w = roll_length - cur_x; } } } else { @@ -546,15 +546,17 @@ void SeqExtStepPage::set_cur_y(uint8_t cur_y_) { // if (MidiClock.state != 2) { fov_y = fov_y_; cur_y = cur_y_; - for (uint8_t n = 0; n < 16; n++) { if (note_interface.is_note_on(n)) { auto &active_track = mcl_seq.ext_tracks[last_ext_track]; uint8_t timing_mid = active_track.get_timing_mid(); - active_track.del_note(fov_offset + timing_mid * n, cur_w - 1, cur_y); - active_track.add_note(fov_offset + timing_mid * n, cur_w, cur_y, velocity, - cond); + uint16_t pos = fov_offset + timing_mid * n; + uint8_t w = cur_w; + if (pos + w >= roll_length) { w = roll_length - pos - 1; } + + active_track.del_note(pos, w - 1, cur_y); + active_track.add_note(pos, w, cur_y, velocity, cond); } } @@ -786,11 +788,14 @@ void SeqExtStepPage::display() { void SeqExtStepPage::enter_notes() { auto &active_track = mcl_seq.ext_tracks[last_ext_track]; + uint8_t w = cur_w; + if (cur_x + w >= roll_length) { w = roll_length - cur_x - 1; } + for (uint8_t n = 0; n < NUM_NOTES_ON; n++) { if (active_track.notes_on[n].value == 255) continue; - active_track.del_note(cur_x, cur_w - 1, active_track.notes_on[n].value); - active_track.add_note(cur_x, cur_w, active_track.notes_on[n].value, + active_track.del_note(cur_x, w - 1, active_track.notes_on[n].value); + active_track.add_note(cur_x, w, active_track.notes_on[n].value, velocity, cond); } } @@ -865,10 +870,30 @@ bool SeqExtStepPage::handleEvent(gui_event_t *event) { w = seq_extparam4.cur / 2; if (trig_interface.is_key_down(MDX_KEY_FUNC)) { w *= 2; - inc = 8; + inc = 12; + } + } + if (event->mask == EVENT_BUTTON_RELEASED) { + switch (key) { + case MDX_KEY_SCALE: { + // seq_extparam4.cur = 16; + int diff = cur_x - fov_offset; + int a = timing_mid * 16; + fov_offset += a; + cur_x += a; + if (cur_x + cur_w > roll_length) { + cur_x = cur_x - (cur_x / a ) * a; + fov_offset = 0; + } + pos_cur_x(0); + /* if (fov_offset + fov_length > roll_length) { + cur_x = cur_x - fov_offset; + fov_offset = 0; + } */ + return true; + } } } - if (event->mask == EVENT_BUTTON_PRESSED) { if (trig_interface.is_key_down(MDX_KEY_YES)) { w = 1; @@ -877,11 +902,11 @@ bool SeqExtStepPage::handleEvent(gui_event_t *event) { if (trig_interface.is_key_down(MDX_KEY_NO) || note_interface.notes_count_on()) { switch (key) { case MDX_KEY_UP: { - seq_extparam4.cur -= inc; + seq_extparam4.cur -= 2; return true; } case MDX_KEY_DOWN: { - seq_extparam4.cur += inc; + seq_extparam4.cur += 2; return true; } case MDX_KEY_LEFT: { @@ -934,24 +959,7 @@ bool SeqExtStepPage::handleEvent(gui_event_t *event) { pos_cur_y(-1 * inc); return true; } - case MDX_KEY_SCALE: { - // seq_extparam4.cur = 16; - int diff = cur_x - fov_offset; - int a = timing_mid * 16; - fov_offset += a; - cur_x += a; - if (cur_x + cur_w > roll_length) { - cur_x = cur_x - (cur_x / a ) * a; - fov_offset = 0; - } - pos_cur_x(0); - /* if (fov_offset + fov_length > roll_length) { - cur_x = cur_x - fov_offset; - fov_offset = 0; - } */ - return true; - } - // case MDX_KEY_YES: { + // case MDX_KEY_YES: { // ignore_clear = true; // goto YES; // } @@ -997,9 +1005,11 @@ bool SeqExtStepPage::handleEvent(gui_event_t *event) { if (active_track.notes_on_count > 0) { enter_notes(); } else { + uint8_t w = cur_w; + if (cur_x + w >= roll_length) { w = roll_length - cur_x - 1; } - if (!active_track.del_note(cur_x, cur_w - 1, cur_y)) { - active_track.add_note(cur_x, cur_w, cur_y, velocity, cond); + if (!active_track.del_note(cur_x, w - 1, cur_y)) { + active_track.add_note(cur_x, w, cur_y, velocity, cond); } } return true; From 5f404b01a40ea47b6edd16ace09415c4adcdc5a8 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 14 Jul 2023 23:45:05 +1000 Subject: [PATCH 246/413] SYX transfer was broken, because of missing sysex listener. --- avr/cores/megacommand/Midi/MidiSDS.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/avr/cores/megacommand/Midi/MidiSDS.cpp b/avr/cores/megacommand/Midi/MidiSDS.cpp index 827df6a34..57ece1b4a 100644 --- a/avr/cores/megacommand/Midi/MidiSDS.cpp +++ b/avr/cores/megacommand/Midi/MidiSDS.cpp @@ -119,8 +119,8 @@ bool MidiSDSClass::sendSyx(const char *filename, uint16_t sample_number) { return false; } - file.seekEnd(); - fsize = file.position(); + MidiSDSSysexListener.setup(&Midi); + fsize = file.size(); file.seek(0); // 1st packet: sysex request. @@ -131,8 +131,8 @@ bool MidiSDSClass::sendSyx(const char *filename, uint16_t sample_number) { } buf[4] = sample_number & 0x7F; buf[5] = (sample_number >> 7) & 0x7F; - MidiUart.sendRaw(buf, szbuf); state = SDS_SEND; + MidiUart.sendRaw(buf, szbuf); reply = waitForHandshake(); if (reply == MIDI_SDS_CANCEL) { ret = false; @@ -194,10 +194,10 @@ bool MidiSDSClass::sendSyx(const char *filename, uint16_t sample_number) { } // otherwise, don't expect ACK reply (maybe MD-specific name-setting command) } // later packets - cleanup: file.close(); state = SDS_READY; + MidiSDSSysexListener.cleanup(&Midi); return ret; } From 847d077b90b84d3ac606ddfba8a63081bde1831a Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 15 Jul 2023 19:52:03 +1000 Subject: [PATCH 247/413] Store MCLGIF objects as compressed data --- avr/cores/megacommand/A4/A4.cpp | 9 +- avr/cores/megacommand/A4/A4.h | 2 +- avr/cores/megacommand/Elektron/Elektron.cpp | 4 +- avr/cores/megacommand/Elektron/Elektron.h | 2 +- avr/cores/megacommand/MCL/MCL.h | 2 +- avr/cores/megacommand/MCL/MCLGUI.cpp | 18 ++-- avr/cores/megacommand/MCL/MCLGfx.cpp | 9 -- avr/cores/megacommand/MCL/MCLGfx.h | 33 ++---- avr/cores/megacommand/MD/MD.cpp | 4 +- avr/cores/megacommand/MD/MD.h | 2 +- avr/cores/megacommand/MNM/MNM.cpp | 4 +- avr/cores/megacommand/MNM/MNM.h | 2 +- avr/cores/megacommand/resources/R.h | 100 +++++++++++++----- .../megacommand/resources/R_icons_logo.cpp | 34 +++++- resource/icons_logo.cpp | 27 +++-- 15 files changed, 156 insertions(+), 96 deletions(-) diff --git a/avr/cores/megacommand/A4/A4.cpp b/avr/cores/megacommand/A4/A4.cpp index f674ae8c4..1885f7ba6 100644 --- a/avr/cores/megacommand/A4/A4.cpp +++ b/avr/cores/megacommand/A4/A4.cpp @@ -112,16 +112,15 @@ bool A4Class::probe() { // Caller is responsible to make sure icons_device is loaded in RM MCLGIF* A4Class::gif() { - return &analog_gif; + return R.icons_logo->analog_gif; +} +uint8_t* A4Class::gif_data() { + return R.icons_logo->analog_gif_data; ; } uint8_t* A4Class::icon() { return R.icons_device->icon_a4; } -uint8_t* A4Class::icon_logo() { - return R.icons_logo->analog_gif; ; -} - void A4Class::requestKitX(uint8_t kit) { sendRequest(A4_KITX_REQUEST_ID, kit); } diff --git a/avr/cores/megacommand/A4/A4.h b/avr/cores/megacommand/A4/A4.h index a66886652..eefb5ab58 100644 --- a/avr/cores/megacommand/A4/A4.h +++ b/avr/cores/megacommand/A4/A4.h @@ -40,7 +40,7 @@ class A4Class : public ElektronDevice { virtual void init_grid_devices(uint8_t device_idx); virtual uint8_t* icon(); virtual MCLGIF* gif(); - virtual uint8_t* icon_logo(); + virtual uint8_t* gif_data(); virtual uint16_t sendKitParams(uint8_t* masks); diff --git a/avr/cores/megacommand/Elektron/Elektron.cpp b/avr/cores/megacommand/Elektron/Elektron.cpp index 576e67f5d..a6217ce9a 100644 --- a/avr/cores/megacommand/Elektron/Elektron.cpp +++ b/avr/cores/megacommand/Elektron/Elektron.cpp @@ -13,8 +13,8 @@ void MidiDevice::cleanup(uint8_t device_idx) { proj.grids[n].cleanup(device_idx); } } -uint8_t *MidiDevice::icon_logo() { return R.icons_logo->midi_gif; } -MCLGIF *MidiDevice::gif() { return &midi_gif; } +uint8_t *MidiDevice::gif_data() { return R.icons_logo->midi_gif_data; } +MCLGIF *MidiDevice::gif() { return R.icons_logo->midi_gif; } uint16_t ElektronDevice::sendRequest(uint8_t *data, uint8_t len, bool send, MidiUartParent *uart_) { if (uart_ == nullptr) { uart_ = uart; } diff --git a/avr/cores/megacommand/Elektron/Elektron.h b/avr/cores/megacommand/Elektron/Elektron.h index 684cef0b7..dbe2f253b 100644 --- a/avr/cores/megacommand/Elektron/Elektron.h +++ b/avr/cores/megacommand/Elektron/Elektron.h @@ -175,7 +175,7 @@ class MidiDevice { // 34x42 bitmap icon of the device virtual uint8_t *icon() { return nullptr; } virtual MCLGIF *gif(); - virtual uint8_t *icon_logo(); + virtual uint8_t *gif_data(); }; /// Base class for Elektron sysex listeners diff --git a/avr/cores/megacommand/MCL/MCL.h b/avr/cores/megacommand/MCL/MCL.h index 896d7ee82..ab150e568 100644 --- a/avr/cores/megacommand/MCL/MCL.h +++ b/avr/cores/megacommand/MCL/MCL.h @@ -17,7 +17,7 @@ #include "Fonts/TomThumb.h" #define VERSION 4050 -#define VERSION_STR "II4.50" +#define VERSION_STR "KK4.50" #define CALLBACK_TIMEOUT 500 #define GUI_NAME_TIMEOUT 800 diff --git a/avr/cores/megacommand/MCL/MCLGUI.cpp b/avr/cores/megacommand/MCL/MCLGUI.cpp index 5f1c464d7..877f3d2d4 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.cpp +++ b/avr/cores/megacommand/MCL/MCLGUI.cpp @@ -678,29 +678,29 @@ void MCLGUI::draw_track_type_select(uint8_t track_type_select) { int8_t y_offset = 0; switch (i) { case 0: - icon = devs[0]->icon_logo(); + icon = devs[0]->gif_data(); gif = devs[0]->gif(); gif->set_bmp(icon); break; case 1: - icon = devs[1]->icon_logo(); + icon = devs[1]->gif_data(); gif = devs[1]->gif(); gif->set_bmp(icon); offset = 4; break; case 2: - gif = &perf_gif; - gif->set_bmp(R.icons_logo->perf_gif); + gif = R.icons_logo->perf_gif; + gif->set_bmp(R.icons_logo->perf_gif_data); offset = 3; break; case 3: - gif = &route_gif; - gif->set_bmp(R.icons_logo->route_gif); + gif = R.icons_logo->route_gif; + gif->set_bmp(R.icons_logo->route_gif_data); offset = 5; break; case 4: - gif = &metronome_gif; - gif->set_bmp(R.icons_logo->metronome_gif); + gif = R.icons_logo->metronome_gif; + gif->set_bmp(R.icons_logo->metronome_gif_data); offset = 4; y_offset = -3; break; @@ -711,7 +711,7 @@ void MCLGUI::draw_track_type_select(uint8_t track_type_select) { if (icon) { oled_display.drawBitmap(x + offset, 15 + y_offset, icon, gif->w, gif->h, WHITE); } - if (note_interface.is_note_on(i)) { gif->loop_count = 0; } + if (note_interface.is_note_on(i)) { gif->reset(); } if (select) { // gif->reset(); diff --git a/avr/cores/megacommand/MCL/MCLGfx.cpp b/avr/cores/megacommand/MCL/MCLGfx.cpp index a39026f36..3e757efe0 100644 --- a/avr/cores/megacommand/MCL/MCLGfx.cpp +++ b/avr/cores/megacommand/MCL/MCLGfx.cpp @@ -1,15 +1,6 @@ #include "MCL_impl.h" #include "ResourceManager.h" -MCLGIF metronome_gif(45, 10, 17, 15, DIR_FWDBACK,1); -MCLGIF perf_gif(27, 7, 18, 9, DIR_FWDBACK, 1); -MCLGIF route_gif(20, 5, 14, 10, DIR_FWDBACK, 1); - -MCLGIF analog_gif(27, 7, 18, 9, DIR_FWDBACK, 1); -MCLGIF monomachine_gif(27, 10, 18, 9, DIR_FWDBACK, 1); -MCLGIF machinedrum_gif(27, 8, 18, 9, DIR_FWD, 1); -MCLGIF midi_gif(27, 8, 18, 9, DIR_FWD, 1); - void MCLGfx::init_oled() { oled_display.begin(); diff --git a/avr/cores/megacommand/MCL/MCLGfx.h b/avr/cores/megacommand/MCL/MCLGfx.h index 4f3cc9bef..8b690d090 100644 --- a/avr/cores/megacommand/MCL/MCLGfx.h +++ b/avr/cores/megacommand/MCL/MCLGfx.h @@ -8,33 +8,25 @@ enum MCLGIFDir { DIR_FWDBACK, }; + class MCLGIF { -private: - int8_t cur_frame = 0; - int8_t inc = 0; - uint16_t last_frame_clock; public: - uint8_t *bitmap; uint8_t frame_offset_bytes; uint8_t num_of_frames; uint8_t w; uint8_t h; + MCLGIFDir dir; uint8_t loops; - uint8_t loop_count; - MCLGIFDir dir; +// MCLGIF(uint8_t b, uint8_t n, uint8_t w_, uint8_t h_, MCLGIFDir d, uint8_t l) : frame_offset_bytes(b), num_of_frames(n), w(w_), h(h_), dir(d),loops(l) { } - MCLGIF(uint8_t frame_offset_, uint8_t num_of_frames_, uint8_t w_, uint8_t h_, MCLGIFDir dir_, uint8_t loops_ = 0) { - frame_offset_bytes = frame_offset_; - num_of_frames = num_of_frames_; - w = w_; - h = h_; - dir = dir_; - loops = loops_; - reset(); - loop_count = loops; - } +//private: + uint8_t loop_count; + int8_t cur_frame; + int8_t inc; + uint16_t last_frame_clock; + uint8_t *bitmap; void reset() { inc = 1; cur_frame = 0; @@ -88,11 +80,4 @@ class MCLGfx { }; extern MCLGfx gfx; -extern MCLGIF metronome_gif; -extern MCLGIF perf_gif; -extern MCLGIF route_gif; -extern MCLGIF analog_gif; -extern MCLGIF midi_gif; -extern MCLGIF monomachine_gif; -extern MCLGIF machinedrum_gif; #endif /* MCLGFX_H__ */ diff --git a/avr/cores/megacommand/MD/MD.cpp b/avr/cores/megacommand/MD/MD.cpp index b209d60a1..a8a3ff1c0 100644 --- a/avr/cores/megacommand/MD/MD.cpp +++ b/avr/cores/megacommand/MD/MD.cpp @@ -261,8 +261,8 @@ bool MDClass::probe() { // Caller is responsible to make sure icons_device is loaded in RM uint8_t *MDClass::icon() { return R.icons_device->icon_md; } -MCLGIF *MDClass::gif() { return &machinedrum_gif; } -uint8_t *MDClass::icon_logo() { return R.icons_logo->machinedrum_gif; ; } +MCLGIF *MDClass::gif() { return R.icons_logo->machinedrum_gif; } +uint8_t *MDClass::gif_data() { return R.icons_logo->machinedrum_gif_data; } uint8_t MDClass::noteToTrack(uint8_t pitch) { uint8_t i; diff --git a/avr/cores/megacommand/MD/MD.h b/avr/cores/megacommand/MD/MD.h index afb739535..15ca21bc2 100644 --- a/avr/cores/megacommand/MD/MD.h +++ b/avr/cores/megacommand/MD/MD.h @@ -64,7 +64,7 @@ class MDClass : public ElektronDevice { virtual void init_grid_devices(uint8_t device_idx); virtual uint8_t* icon(); virtual MCLGIF *gif(); - virtual uint8_t* icon_logo(); + virtual uint8_t* gif_data(); // TODO not necessary if we have FW_CAP_READ_LIVE_KIT virtual bool canReadWorkspaceKit() { return true; } virtual bool canReadKit() { return true; } diff --git a/avr/cores/megacommand/MNM/MNM.cpp b/avr/cores/megacommand/MNM/MNM.cpp index 4525c5c4f..cf5bb7f77 100644 --- a/avr/cores/megacommand/MNM/MNM.cpp +++ b/avr/cores/megacommand/MNM/MNM.cpp @@ -111,8 +111,8 @@ uint8_t* MNMClass::icon() { return R.icons_device->icon_mnm; } -uint8_t *MNMClass::icon_logo() { return R.icons_logo->monomachine_gif; ; } -MCLGIF *MNMClass::gif() { return &monomachine_gif; } +uint8_t *MNMClass::gif_data() { return R.icons_logo->monomachine_gif_data; ; } +MCLGIF *MNMClass::gif() { return R.icons_logo->monomachine_gif;; } void MNMClass::requestKit(uint8_t kit) { uint8_t workspace = 0; diff --git a/avr/cores/megacommand/MNM/MNM.h b/avr/cores/megacommand/MNM/MNM.h index 7d1673747..6139cb967 100644 --- a/avr/cores/megacommand/MNM/MNM.h +++ b/avr/cores/megacommand/MNM/MNM.h @@ -21,7 +21,7 @@ class MNMClass : public ElektronDevice { virtual void init_grid_devices(uint8_t device_idx); virtual uint8_t* icon(); virtual MCLGIF* gif(); - virtual uint8_t* icon_logo(); + virtual uint8_t* gif_data(); virtual bool canReadWorkspaceKit() { return true; } virtual bool getWorkSpaceKit() { diff --git a/avr/cores/megacommand/resources/R.h b/avr/cores/megacommand/resources/R.h index e1044ff0d..5c8081409 100644 --- a/avr/cores/megacommand/resources/R.h +++ b/avr/cores/megacommand/resources/R.h @@ -110,48 +110,90 @@ struct __T_icons_knob { extern const unsigned char __R_icons_logo[] PROGMEM; struct __T_icons_logo { union { - unsigned char metronome_gif[0]; - char zz__metronome_gif[450]; + unsigned char metronome_gif_data[0]; + char zz__metronome_gif_data[450]; }; - static constexpr size_t countof_metronome_gif = 450 / sizeof(unsigned char); - static constexpr size_t sizeofof_metronome_gif = 450; + static constexpr size_t countof_metronome_gif_data = 450 / sizeof(unsigned char); + static constexpr size_t sizeofof_metronome_gif_data = 450; union { - unsigned char monomachine_gif[0]; - char zz__monomachine_gif[270]; + unsigned char monomachine_gif_data[0]; + char zz__monomachine_gif_data[270]; }; - static constexpr size_t countof_monomachine_gif = 270 / sizeof(unsigned char); - static constexpr size_t sizeofof_monomachine_gif = 270; + static constexpr size_t countof_monomachine_gif_data = 270 / sizeof(unsigned char); + static constexpr size_t sizeofof_monomachine_gif_data = 270; union { - unsigned char midi_gif[0]; - char zz__midi_gif[216]; + unsigned char midi_gif_data[0]; + char zz__midi_gif_data[216]; }; - static constexpr size_t countof_midi_gif = 216 / sizeof(unsigned char); - static constexpr size_t sizeofof_midi_gif = 216; + static constexpr size_t countof_midi_gif_data = 216 / sizeof(unsigned char); + static constexpr size_t sizeofof_midi_gif_data = 216; union { - unsigned char machinedrum_gif[0]; - char zz__machinedrum_gif[216]; + unsigned char machinedrum_gif_data[0]; + char zz__machinedrum_gif_data[216]; }; - static constexpr size_t countof_machinedrum_gif = 216 / sizeof(unsigned char); - static constexpr size_t sizeofof_machinedrum_gif = 216; + static constexpr size_t countof_machinedrum_gif_data = 216 / sizeof(unsigned char); + static constexpr size_t sizeofof_machinedrum_gif_data = 216; union { - unsigned char analog_gif[0]; - char zz__analog_gif[189]; + unsigned char analog_gif_data[0]; + char zz__analog_gif_data[189]; }; - static constexpr size_t countof_analog_gif = 189 / sizeof(unsigned char); - static constexpr size_t sizeofof_analog_gif = 189; + static constexpr size_t countof_analog_gif_data = 189 / sizeof(unsigned char); + static constexpr size_t sizeofof_analog_gif_data = 189; union { - unsigned char route_gif[0]; - char zz__route_gif[100]; + unsigned char route_gif_data[0]; + char zz__route_gif_data[100]; }; - static constexpr size_t countof_route_gif = 100 / sizeof(unsigned char); - static constexpr size_t sizeofof_route_gif = 100; + static constexpr size_t countof_route_gif_data = 100 / sizeof(unsigned char); + static constexpr size_t sizeofof_route_gif_data = 100; union { - unsigned char perf_gif[0]; - char zz__perf_gif[189]; + unsigned char perf_gif_data[0]; + char zz__perf_gif_data[189]; }; - static constexpr size_t countof_perf_gif = 189 / sizeof(unsigned char); - static constexpr size_t sizeofof_perf_gif = 189; - static constexpr size_t __total_size = 1630; + static constexpr size_t countof_perf_gif_data = 189 / sizeof(unsigned char); + static constexpr size_t sizeofof_perf_gif_data = 189; + union { + MCLGIF midi_gif[0]; + char zz__midi_gif[13]; + }; + static constexpr size_t countof_midi_gif = 13 / sizeof(MCLGIF); + static constexpr size_t sizeofof_midi_gif = 13; + union { + MCLGIF machinedrum_gif[0]; + char zz__machinedrum_gif[13]; + }; + static constexpr size_t countof_machinedrum_gif = 13 / sizeof(MCLGIF); + static constexpr size_t sizeofof_machinedrum_gif = 13; + union { + MCLGIF monomachine_gif[0]; + char zz__monomachine_gif[13]; + }; + static constexpr size_t countof_monomachine_gif = 13 / sizeof(MCLGIF); + static constexpr size_t sizeofof_monomachine_gif = 13; + union { + MCLGIF analog_gif[0]; + char zz__analog_gif[13]; + }; + static constexpr size_t countof_analog_gif = 13 / sizeof(MCLGIF); + static constexpr size_t sizeofof_analog_gif = 13; + union { + MCLGIF route_gif[0]; + char zz__route_gif[13]; + }; + static constexpr size_t countof_route_gif = 13 / sizeof(MCLGIF); + static constexpr size_t sizeofof_route_gif = 13; + union { + MCLGIF perf_gif[0]; + char zz__perf_gif[13]; + }; + static constexpr size_t countof_perf_gif = 13 / sizeof(MCLGIF); + static constexpr size_t sizeofof_perf_gif = 13; + union { + MCLGIF metronome_gif[0]; + char zz__metronome_gif[13]; + }; + static constexpr size_t countof_metronome_gif = 13 / sizeof(MCLGIF); + static constexpr size_t sizeofof_metronome_gif = 13; + static constexpr size_t __total_size = 1721; }; extern const unsigned char __R_icons_page[] PROGMEM; diff --git a/avr/cores/megacommand/resources/R_icons_logo.cpp b/avr/cores/megacommand/resources/R_icons_logo.cpp index f3f82c653..0abd4e307 100644 --- a/avr/cores/megacommand/resources/R_icons_logo.cpp +++ b/avr/cores/megacommand/resources/R_icons_logo.cpp @@ -705,12 +705,42 @@ const unsigned char __R_icons_logo[] PROGMEM = { 132, 228, 136, - 176, + 191, + 27, + 8, + 18, + 9, + 3, + 126, + 217, 0, + 12, + 92, + 10, + 178, + 1, + 76, + 7, + 128, + 251, + 20, + 5, + 14, + 10, + 25, + 2, + 253, + 45, + 10, + 17, + 15, + 146, + 12, 0, 0, 0, 0, - 79, + 0, + 9, 255, }; diff --git a/resource/icons_logo.cpp b/resource/icons_logo.cpp index 9d7eebd62..3a5bd589d 100644 --- a/resource/icons_logo.cpp +++ b/resource/icons_logo.cpp @@ -1,3 +1,6 @@ +#include "MCL_impl.h" +#include "MCLGfx.h" + /* // 'midi_logo_medium', 18x9px unsigned char icon_midi_logo_medium [] = { @@ -36,7 +39,17 @@ unsigned char icon_md_logo_medium [] = { }; */ -unsigned char perf_gif [] = { + +MCLGIF metronome_gif = {45, 10, 17, 15, DIR_FWDBACK, 1}; +MCLGIF perf_gif = {27, 7, 18, 9, DIR_FWDBACK, 1}; +MCLGIF route_gif = {20, 5, 14, 10, DIR_FWDBACK, 1}; + +MCLGIF analog_gif = {27, 7, 18, 9, DIR_FWDBACK, 1}; +MCLGIF monomachine_gif = {27, 10, 18, 9, DIR_FWDBACK, 1}; +MCLGIF machinedrum_gif = {27, 8, 18, 9, DIR_FWD, 1}; +MCLGIF midi_gif = {27, 8, 18, 9, DIR_FWD, 1}; + +unsigned char perf_gif_data [] = { // 'pixil-frame-0', 18x9px 0x01, 0xe0, 0x00, 0x22, 0x11, 0xc0, 0x44, 0x09, 0x80, 0x84, 0x09, 0x40, 0x84, 0x28, 0x40, 0xa4, 0x48, 0x40, 0x62, 0x10, 0x80, 0xe1, 0xe1, 0x00, 0x00, 0x00, 0x00, @@ -60,7 +73,7 @@ unsigned char perf_gif [] = { 0x88, 0x40, 0x62, 0x10, 0x80, 0xe1, 0xe1, 0x00, 0x00, 0x00, 0x00, }; -unsigned char route_gif [] = { +unsigned char route_gif_data [] = { // 'pixil-frame-0', 14x10px 0x1e, 0x3c, 0x3c, 0x78, 0x30, 0x60, 0xfd, 0xf8, 0x78, 0xf0, 0x30, 0x60, 0x00, 0x00, 0x30, 0x60, 0x48, 0x90, 0x30, 0x60, @@ -78,7 +91,7 @@ unsigned char route_gif [] = { 0x78, 0xf0, 0x30, 0x60, }; -unsigned char analog_gif [] = { +unsigned char analog_gif_data [] = { // 'pixil-frame-0', 18x9px 0x0f, 0xfc, 0x00, 0x10, 0x42, 0x00, 0x27, 0x21, 0x00, 0x2f, 0xa1, 0x00, 0x2f, 0xa1, 0x00, 0x2f, 0xa1, 0x00, 0x27, 0x21, 0x00, 0x10, 0x42, 0x00, 0x0f, 0x9c, 0x00, @@ -102,7 +115,7 @@ unsigned char analog_gif [] = { 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }; -unsigned char machinedrum_gif [] = { +unsigned char machinedrum_gif_data [] = { // 'pixil-frame-0', 18x9px 0x0f, 0x83, 0xc0, 0x1f, 0x83, 0xc0, 0x3f, 0x87, 0x80, 0x7f, 0x87, 0x80, 0xff, 0x8f, 0x00, 0x77, 0x8f, 0x00, 0x27, 0xbe, 0x00, 0x07, 0xbe, 0x00, 0x07, 0xbc, 0x00, @@ -130,7 +143,7 @@ unsigned char machinedrum_gif [] = { }; -unsigned char midi_gif [] = { +unsigned char midi_gif_data [] = { // 'pixil-frame-0', 18x9px 0x00, 0x00, 0x00, 0x3c, 0xb2, 0x00, 0x2a, 0x8a, 0x00, 0x2a, 0xaa, 0x00, 0x2a, 0xaa, 0x00, 0x2a, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x3f, 0xfe, 0x00, @@ -156,7 +169,7 @@ unsigned char midi_gif [] = { 0x00, 0x00, 0x00, 0x3c, 0xb2, 0x00, 0x2a, 0x8a, 0x00, 0x2a, 0xaa, 0x80, 0x2a, 0xaa, 0x00, 0x2a, 0xb2, 0x40, 0x00, 0x00, 0x00, 0x3f, 0xfe, 0x80, 0x3f, 0xfe, 0x00, }; -unsigned char monomachine_gif [] = { +unsigned char monomachine_gif_data [] = { // 'pixil-frame-0', 18x9px 0xfc, 0xfc, 0x00, 0xfc, 0xfc, 0x00, 0xcc, 0xcc, 0x00, 0xcc, 0xcc, 0x00, 0xcc, 0xcc, 0x00, 0xcc, 0xcc, 0x00, 0xcc, 0xcc, 0x00, 0xcf, 0xcf, 0xc0, 0xcf, 0xcf, 0xc0, @@ -189,7 +202,7 @@ unsigned char monomachine_gif [] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; -unsigned char metronome_gif [] = { +unsigned char metronome_gif_data [] = { // 'pixil-frame-0', 17x15px 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x80, 0x03, 0x41, 0x00, 0x06, 0x26, 0x00, 0x06, 0xa6, 0x00, 0x0c, 0x98, 0x00, 0x0c, 0x90, 0x00, 0x18, 0x28, 0x00, 0x18, 0x48, From 67d988b11f6ae2ce116ebfb3b5209bbcabc02c6a Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 15 Jul 2023 20:29:27 +1000 Subject: [PATCH 248/413] Encoder button cleark scene lock bug --- avr/cores/megacommand/MCL/PerfPage.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 6c980042d..6d47581ae 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -173,6 +173,7 @@ void PerfPage::update_params() { PerfParam *p = &perf_encoders[perf_id]->perf_data.scenes[scene].params[c]; p->dest = encoders[1]->cur; p->param = encoders[2]->cur; + if (encoders[3]->hasChanged() && BUTTON_DOWN(Buttons.ENCODER4)) { GUI.ignoreNextEvent(Buttons.ENCODER4); } if (encoders[3]->cur > 0) { p->val = encoders[3]->cur - 1; } @@ -556,7 +557,9 @@ bool PerfPage::handleEvent(gui_event_t *event) { } return true; } - if (EVENT_PRESSED(event, Buttons.ENCODER4)) { + + if (EVENT_RELEASED(event, Buttons.ENCODER4)) { + //if (EVENT_PRESSED(event, Buttons.ENCODER4)) { if (learn) { PerfData *d = &perf_encoders[perf_id]->perf_data; uint8_t scene = learn - 1; From b1b089ea7297dd880d36b1505723f59746990896 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 15 Jul 2023 21:07:38 +1000 Subject: [PATCH 249/413] don't allow menu page to call pagePop and exit function if it is not current page --- avr/cores/megacommand/MCL/MenuPage.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/MenuPage.cpp b/avr/cores/megacommand/MCL/MenuPage.cpp index 3ed03cb0e..8107512a8 100644 --- a/avr/cores/megacommand/MCL/MenuPage.cpp +++ b/avr/cores/megacommand/MCL/MenuPage.cpp @@ -196,11 +196,12 @@ bool MenuPageBase::enter() { } bool MenuPageBase::exit() { + if (GUI.currentPage() != this) { return; } // Page *exit_page_callback = get_menu()->get_exit_page_callback(); DEBUG_PRINTLN("calling exit func"); void (*exit_func)() = get_menu()->get_exit_function(); if (exit_func != NULL) { - (*exit_func)(); + // (*exit_func)(); // } // if (exit_page_callback != NULL) { From da6073728397147e9838139af61da272f6b25113 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 15 Jul 2023 21:09:55 +1000 Subject: [PATCH 250/413] LFOSeqTracks transmitting on wrong channel --- avr/cores/megacommand/MCL/LFOSeqTrack.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/LFOSeqTrack.cpp b/avr/cores/megacommand/MCL/LFOSeqTrack.cpp index 50576626c..ef85204d0 100644 --- a/avr/cores/megacommand/MCL/LFOSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/LFOSeqTrack.cpp @@ -87,7 +87,7 @@ void LFOSeqTrack::seq(MidiUartParent *uart_) { uint8_t param = params[i].param; if (dest >= NUM_MD_TRACKS + 4) { - uint8_t channel = dest - NUM_MD_TRACKS; + uint8_t channel = dest - (NUM_MD_TRACKS + 4); MidiUart2.sendCC(channel, param, wav_value); } else if (dest >= NUM_MD_TRACKS) { MD.sendFXParam(param, wav_value, MD_FX_ECHO + dest - NUM_MD_TRACKS, From 0c2a622ab5088de2ac0f58524891ca4b79b047c3 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 15 Jul 2023 22:09:52 +1000 Subject: [PATCH 251/413] fix midi learn for lfo tracks --- avr/cores/megacommand/MCL/MCLSeq.cpp | 2 ++ avr/cores/megacommand/MD/MDSysex.cpp | 1 + 2 files changed, 3 insertions(+) diff --git a/avr/cores/megacommand/MCL/MCLSeq.cpp b/avr/cores/megacommand/MCL/MCLSeq.cpp index 56872bda7..96e2bc3c8 100644 --- a/avr/cores/megacommand/MCL/MCLSeq.cpp +++ b/avr/cores/megacommand/MCL/MCLSeq.cpp @@ -366,6 +366,8 @@ void MCLSeqMidiEvents::onControlChangeCallback_Midi2(uint8_t *msg) { } perf_page.learn_param(channel + 16 + 4, param, value); + lfo_page.learn_param(channel + 16 + 4, param, value); + } void MCLSeqMidiEvents::setup_callbacks() { diff --git a/avr/cores/megacommand/MD/MDSysex.cpp b/avr/cores/megacommand/MD/MDSysex.cpp index cfd50e1ee..91bca0223 100644 --- a/avr/cores/megacommand/MD/MDSysex.cpp +++ b/avr/cores/megacommand/MD/MDSysex.cpp @@ -79,6 +79,7 @@ void MDSysexListenerClass::end() { } perf_page.learn_param(fx_type + 16, param, value); + lfo_page.learn_param(fx_type + 16, param, value); break; From f08f62ce63fc27b590c7a4b7752ed0aed623af89 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 15 Jul 2023 22:10:05 +1000 Subject: [PATCH 252/413] Fix track select broken --- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 1 - avr/cores/megacommand/MCL/SeqPage.cpp | 6 ++---- avr/cores/megacommand/MCL/SeqPage.h | 2 +- avr/cores/megacommand/MCL/SeqPtcPage.cpp | 1 - avr/cores/megacommand/MCL/SeqStepPage.cpp | 1 - 5 files changed, 3 insertions(+), 8 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index 129746acc..66f644967 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -31,7 +31,6 @@ void SeqExtStepPage::config() { void SeqExtStepPage::config_encoders() { #ifdef EXT_TRACKS if (show_seq_menu) { return; } - SeqPage::config_encoders(); seq_extparam1.max = 127; seq_extparam2.max = 127; seq_extparam3.max = 128; diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index beac16b1a..518397731 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -96,9 +96,6 @@ void SeqPage::disable_record() { clearLed2(); } -void SeqPage::config_encoders() { -} - void SeqPage::init() { uint8_t _midi_lock_tmp = MidiUartParent::handle_midi_lock; MidiUartParent::handle_midi_lock = 0; @@ -246,7 +243,8 @@ void SeqPage::select_track(MidiDevice *device, uint8_t track, bool send) { active_track.step_count); } #endif - config_encoders(); + GUI.currentPage()->config(); + //config_encoders(); } bool SeqPage::display_mute_mask(MidiDevice* device, uint8_t offset) { diff --git a/avr/cores/megacommand/MCL/SeqPage.h b/avr/cores/megacommand/MCL/SeqPage.h index db7e94b3e..fad5896e7 100644 --- a/avr/cores/megacommand/MCL/SeqPage.h +++ b/avr/cores/megacommand/MCL/SeqPage.h @@ -157,7 +157,7 @@ class SeqPage : public LightPage { virtual void setup(); virtual void init(); virtual void cleanup(); - virtual void config_encoders(); + virtual void config_encoders() = 0; static constexpr uint8_t pidx_x0 = 0; static constexpr uint8_t pidx_y = 15; static constexpr uint8_t pidx_w = 6; diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.cpp b/avr/cores/megacommand/MCL/SeqPtcPage.cpp index 9ca398e34..219eed771 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPtcPage.cpp @@ -53,7 +53,6 @@ void SeqPtcPage::cleanup() { } void SeqPtcPage::config_encoders() { if (show_seq_menu) { return; } - SeqPage::config_encoders(); ptc_param_len.min = 1; bool show_chan = true; diff --git a/avr/cores/megacommand/MCL/SeqStepPage.cpp b/avr/cores/megacommand/MCL/SeqStepPage.cpp index 85c513db7..f893a8542 100644 --- a/avr/cores/megacommand/MCL/SeqStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqStepPage.cpp @@ -37,7 +37,6 @@ void SeqStepPage::config() { void SeqStepPage::config_encoders() { if (show_seq_menu || show_step_menu) { return; } - SeqPage::config_encoders(); uint8_t timing_mid = mcl_seq.md_tracks[last_md_track].get_timing_mid(); seq_param3.cur = mcl_seq.md_tracks[last_md_track].length; seq_param3.old = seq_param3.cur; From 17a45428ef980edf0bd6146a46ddf8b4406a48b8 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 15 Jul 2023 22:25:28 +1000 Subject: [PATCH 253/413] speed, length and channel to always be updated --- avr/cores/megacommand/MCL/SeqPage.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index 518397731..47d2214a1 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -414,6 +414,9 @@ bool SeqPage::handleEvent(gui_event_t *event) { row_func = seq_menu_page.menu.get_row_function(seq_menu_page.encoders[1]->cur); midi_device = midi_active_peering.get_device(mcl_cfg.seq_dev); + opt_speed_handler(); + opt_length_handler(); + opt_channel_handler(); } else if (show_step_menu) { row_func = step_menu_page.menu.get_row_function(step_menu_page.encoders[1]->cur); From ebc9eafe2ee30a9e0eb34ba1f6d0f1281bdffadc Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 16 Jul 2023 01:21:50 +1000 Subject: [PATCH 254/413] fixes but menus still broken --- avr/cores/megacommand/GUI/Pages.h | 9 +- avr/cores/megacommand/MCL/GridPage.h | 2 +- avr/cores/megacommand/MCL/MCL.h | 13 +- avr/cores/megacommand/MCL/Menu.cpp | 8 +- avr/cores/megacommand/MCL/Menu.h | 4 +- avr/cores/megacommand/MCL/MenuPage.cpp | 5 +- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 19 ++- avr/cores/megacommand/MCL/SeqExtStepPage.h | 1 + avr/cores/megacommand/MCL/SeqPage.cpp | 8 +- avr/cores/megacommand/MCL/SeqStepPage.h | 2 +- avr/cores/megacommand/Makefile | 2 +- .../megacommand/resources/R_menu_layouts.cpp | 38 ++--- resource/gen-resource-linux.ps1 | 2 +- resource/menu_layouts.cpp | 158 +++++++++--------- 14 files changed, 145 insertions(+), 126 deletions(-) diff --git a/avr/cores/megacommand/GUI/Pages.h b/avr/cores/megacommand/GUI/Pages.h index 68ebe98cb..003439e30 100644 --- a/avr/cores/megacommand/GUI/Pages.h +++ b/avr/cores/megacommand/GUI/Pages.h @@ -260,14 +260,15 @@ class PageContainer { void popPage() { LightPage *lastpage = currentPage(); currentPage()->cleanup(); - LightPage *page; - pageStack.pop(&page); - if (page != NULL) { + LightPage *page = nullptr; + if (!pageStack.pop(&page)) { goto reset; } + if (page != nullptr) { page->parent = NULL; page->hide(); } page = currentPage(); - if (page == NULL) { + if (page == nullptr) { + reset: if (lastpage == NULL) { return; } pageStack.reset(); pushPage(lastpage); diff --git a/avr/cores/megacommand/MCL/GridPage.h b/avr/cores/megacommand/MCL/GridPage.h index 6d0cfe182..aa445d510 100644 --- a/avr/cores/megacommand/MCL/GridPage.h +++ b/avr/cores/megacommand/MCL/GridPage.h @@ -52,7 +52,7 @@ class GridPage : public LightPage { uint8_t row_scan = 0; uint64_t row_states[2]; - PageIndex last_page = 255; + PageIndex last_page = NULL_PAGE; uint8_t bank_popup = 0; uint16_t bank_popup_lastclock; diff --git a/avr/cores/megacommand/MCL/MCL.h b/avr/cores/megacommand/MCL/MCL.h index ab150e568..c18175f44 100644 --- a/avr/cores/megacommand/MCL/MCL.h +++ b/avr/cores/megacommand/MCL/MCL.h @@ -77,7 +77,8 @@ enum PageIndex { MIDIROUTE_MENU_PAGE, // Index: 37 MIDIMACHINEDRUM_MENU_PAGE,// Index: 38 SOUND_BROWSER, // Index: 39 - PERF_PAGE_0 // Index: 40 + PERF_PAGE_0, // Index: 40 + NULL_PAGE = 255 }; @@ -87,14 +88,14 @@ class MCL { static LightPage *const pages_table[NUM_PAGES] PROGMEM; - PageIndex current_page = 0; + PageIndex current_page = GRID_PAGE; LightPage *getPage(PageIndex page) { return (LightPage*) pgm_read_word(pages_table + page); } void setPage(PageIndex page) { if (page >= NUM_PAGES) { - page = 0; + page = GRID_PAGE; } current_page = page; GUI.setPage(getPage(page)); @@ -102,7 +103,7 @@ class MCL { void pushPage(PageIndex page) { if (page >= NUM_PAGES) { - page = 0; + page = GRID_PAGE; } current_page = page; GUI.pushPage(getPage(page)); @@ -112,11 +113,11 @@ class MCL { GUI.popPage(); for (uint8_t n = 0; n < NUM_PAGES; n++) { if (GUI.currentPage() == getPage(n)) { - current_page = n; + current_page = (PageIndex) n; return; } } - current_page = 255; + current_page = NULL_PAGE; } bool isSeqPage() { diff --git a/avr/cores/megacommand/MCL/Menu.cpp b/avr/cores/megacommand/MCL/Menu.cpp index 552097304..56de7b065 100644 --- a/avr/cores/megacommand/MCL/Menu.cpp +++ b/avr/cores/megacommand/MCL/Menu.cpp @@ -15,7 +15,7 @@ void MenuBase::enable_entry(uint8_t entry_index, bool en) { bool MenuBase::is_entry_enable(uint8_t entry_index) { auto midx = entry_index / 8; auto bit = entry_index % 8; - return bit_is_set(entry_mask[midx], bit); + return IS_BIT_SET(entry_mask[midx], bit); } menu_function_t MenuBase::get_row_function(uint8_t item_n) { @@ -37,8 +37,10 @@ const menu_item_t *MenuBase::get_item(uint8_t item_n) { uint8_t entry_cnt = get_entry_count(); for(uint8_t idx = 0; idx < entry_cnt; ++idx) { if(is_entry_enable(idx)) { + DEBUG_PRINTLN(idx); if (item_n == 0) { - return get_entry_address(idx); + DEBUG_PRINTLN(idx); + return get_entry_address(idx); }else { --item_n; } @@ -59,7 +61,9 @@ const char* MenuBase::get_item_name(uint8_t item_n) { } PageIndex MenuBase::get_page_callback(uint8_t item_n) { + DEBUG_PRINTLN("get page callback"); auto *item = get_item(item_n); + DEBUG_PRINTLN(item->page_callback_id); return (PageIndex) item->page_callback_id; } diff --git a/avr/cores/megacommand/MCL/Menu.h b/avr/cores/megacommand/MCL/Menu.h index 2cec610e4..09e546b71 100644 --- a/avr/cores/megacommand/MCL/Menu.h +++ b/avr/cores/megacommand/MCL/Menu.h @@ -19,7 +19,7 @@ struct menu_item_t { uint8_t range; uint8_t number_of_options; uint8_t destination_var_id; // look up the value in menu_target_param - uint8_t page_callback_id; // look up the page callback in menu_target_pages + PageIndex page_callback_id; // look up the page callback in menu_target_pages uint8_t row_function_id; // look up the value in menu_target_functions uint8_t options_begin; }; @@ -28,7 +28,7 @@ template struct menu_t { char name[10]; menu_item_t items[N]; uint8_t exit_function_id; // look up the value in menu_target_functions - uint8_t exit_page_callback_id; + PageIndex exit_page_callback_id; }; class MenuBase { diff --git a/avr/cores/megacommand/MCL/MenuPage.cpp b/avr/cores/megacommand/MCL/MenuPage.cpp index 8107512a8..fe06d41e1 100644 --- a/avr/cores/megacommand/MCL/MenuPage.cpp +++ b/avr/cores/megacommand/MCL/MenuPage.cpp @@ -182,8 +182,8 @@ bool MenuPageBase::enter() { DEBUG_PRINT_FN(); void (*row_func)() = get_menu()->get_row_function(encoders[1]->cur); PageIndex page_callback = get_menu()->get_page_callback(encoders[1]->cur); - if (page_callback != 255) { - DEBUG_PRINTLN("pushing page"); + if (page_callback != NULL_PAGE) { + DEBUG_PRINTLN("menu pushing page"); DEBUG_PRINTLN((uint16_t)page_callback); mcl.pushPage(page_callback); return true; @@ -246,6 +246,7 @@ bool MenuPageBase::handleEvent(gui_event_t *event) { if (EVENT_PRESSED(event, Buttons.BUTTON4)) { GUI.ignoreNextEvent(event->source); YES: + DEBUG_PRINTLN("YES"); enter(); return true; } diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index 66f644967..ce247b722 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -63,6 +63,7 @@ void SeqExtStepPage::config_encoders() { config(); SeqPage::midi_device = midi_active_peering.get_device(UART2_PORT); + #endif } @@ -78,14 +79,10 @@ void SeqExtStepPage::init() { trig_interface.send_md_leds(TRIGLED_EXCLUSIVE); last_cur_x = -1; + config_menu_entries(); config_encoders(); // midi_events.setup_callbacks(); - // Common menu entries - seq_menu_page.menu.enable_entry(SEQ_MENU_TRACK, true); - seq_menu_page.menu.enable_entry(SEQ_MENU_CHANNEL, true); - seq_menu_page.menu.enable_entry(SEQ_MENU_PIANOROLL, true); - seq_menu_page.menu.enable_entry(SEQ_MENU_SLIDE, true); } void SeqExtStepPage::cleanup() { @@ -381,6 +378,8 @@ void SeqExtStepPage::draw_pianoroll() { int16_t note_start = i * timing_mid + ev.micro_timing - timing_mid; int16_t note_end = j * timing_mid + ev_j.micro_timing - timing_mid; + if (i > j && j == 0) { note_end += timing_mid * active_track.length; } + if (is_within_fov(note_start, note_end)) { uint8_t note_fov_start, note_fov_end; @@ -615,8 +614,11 @@ void SeqExtStepPage::pos_cur_w(int16_t diff) { } } } +void SeqExtStepPage::config_menu_entries() { + seq_menu_page.menu.enable_entry(SEQ_MENU_PIANOROLL, true); + seq_menu_page.menu.enable_entry(SEQ_MENU_TRACK, true); + seq_menu_page.menu.enable_entry(SEQ_MENU_CHANNEL, true); -void SeqExtStepPage::loop() { if (pianoroll_mode == 0) { seq_menu_page.menu.enable_entry(SEQ_MENU_ARP, true); @@ -636,6 +638,11 @@ void SeqExtStepPage::loop() { seq_menu_page.menu.enable_entry(SEQ_MENU_CLEAR_LOCKS, true); seq_menu_page.menu.enable_entry(SEQ_MENU_SLIDE, true); } + +} + +void SeqExtStepPage::loop() { + config_menu_entries(); auto &active_track = mcl_seq.ext_tracks[last_ext_track]; uint8_t timing_mid = active_track.get_timing_mid(); SeqPage::loop(); diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.h b/avr/cores/megacommand/MCL/SeqExtStepPage.h index 17d858d52..72bed3785 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.h +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.h @@ -90,6 +90,7 @@ class SeqExtStepPage : public SeqPage { } void param_select_update(); void enter_notes(); + void config_menu_entries(); virtual bool handleEvent(gui_event_t *event); virtual void display(); virtual void loop(); diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index 47d2214a1..4b76b3c0c 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -108,6 +108,7 @@ void SeqPage::init() { oled_display.clearDisplay(); toggle_device = true; + DEBUG_PRINTLN("seq page init"); seq_menu_page.menu.enable_entry(SEQ_MENU_DEVICE, false); seq_menu_page.menu.enable_entry(SEQ_MENU_CHANNEL, false); @@ -658,8 +659,11 @@ void opt_length_handler() { void opt_channel_handler() { if (SeqPage::midi_device == &MD) { } else { - mcl_seq.ext_tracks[last_ext_track].buffer_notesoff(); - mcl_seq.ext_tracks[last_ext_track].channel = opt_channel - 1; + uint8_t chan = opt_channel - 1; + if (mcl_seq.ext_tracks[last_ext_track].channel != chan) { + mcl_seq.ext_tracks[last_ext_track].buffer_notesoff(); + mcl_seq.ext_tracks[last_ext_track].channel = chan; + } } } diff --git a/avr/cores/megacommand/MCL/SeqStepPage.h b/avr/cores/megacommand/MCL/SeqStepPage.h index 7894caa64..e9c195d70 100644 --- a/avr/cores/megacommand/MCL/SeqStepPage.h +++ b/avr/cores/megacommand/MCL/SeqStepPage.h @@ -26,7 +26,7 @@ class SeqStepPage : public SeqPage { uint16_t update_params_clock; uint8_t last_param_id; uint8_t last_rec_event; - PageIndex last_page = 255; + PageIndex last_page = NULL_PAGE; SeqStepMidiEvents midi_events; SeqStepPage(Encoder *e1 = NULL, Encoder *e2 = NULL, Encoder *e3 = NULL, Encoder *e4 = NULL) diff --git a/avr/cores/megacommand/Makefile b/avr/cores/megacommand/Makefile index a1d8241cf..344b2e380 100644 --- a/avr/cores/megacommand/Makefile +++ b/avr/cores/megacommand/Makefile @@ -37,7 +37,7 @@ INOFILES=$(wildcard *.pde) OPTIM_FLAGS = -Os --short-enums WARN_FLAGS = -Wall -Wextra -Wdouble-promotion COMPILE_FLAGS = -c $(OPTIM_FLAGS) $(WARN_FLAGS) -MMD -FEATURE_FLAGS = -ffunction-sections -fdata-sections -flto=jobserver +FEATURE_FLAGS = -ffunction-sections -fdata-sections -flto=jobserver -fshort-enums LINK_FLAGS = -lm -Wl,--gc-sections,--defsym=__stack=0x801FA1,--section-start,.sdcard=0x801FA2,--section-start,.data=0x802200,--defsym=__heap_end=0x80ffff,--relax ARCH_FLAGS = -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10803 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR diff --git a/avr/cores/megacommand/resources/R_menu_layouts.cpp b/avr/cores/megacommand/resources/R_menu_layouts.cpp index 9ac5723b7..5c1c33821 100644 --- a/avr/cores/megacommand/resources/R_menu_layouts.cpp +++ b/avr/cores/megacommand/resources/R_menu_layouts.cpp @@ -21,7 +21,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 255, 4, 59, - 255, + 126, 0, 117, 82, @@ -34,7 +34,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 0, 0, 3, - 255, + 126, 200, 30, 0, @@ -126,7 +126,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 0, 39, 181, - 255, + 126, 6, 144, 20, @@ -152,7 +152,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 128, 34, 182, - 255, + 126, 4, 67, 222, @@ -164,7 +164,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 125, 118, 36, - 255, + 126, 44, 219, 67, @@ -203,7 +203,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 95, 249, 30, - 255, + 126, 15, 30, 238, @@ -219,7 +219,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 44, 21, 39, - 255, + 126, 17, 237, 0, @@ -249,7 +249,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 49, 240, 14, - 255, + 126, 3, 0, 189, @@ -269,7 +269,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 178, 79, 15, - 255, + 126, 4, 178, 48, @@ -362,7 +362,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 7, 7, 22, - 255, + 126, 5, 41, 27, @@ -374,7 +374,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 58, 125, 23, - 255, + 126, 6, 177, 62, @@ -387,7 +387,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 251, 188, 24, - 255, + 126, 7, 0, 36, @@ -396,7 +396,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 3, 3, 25, - 255, + 126, 8, 132, 27, @@ -405,7 +405,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 220, 20, 26, - 255, + 126, 9, 128, 120, @@ -417,7 +417,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 20, 27, 254, - 255, + 126, 11, 27, 83, @@ -430,7 +430,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 5, 5, 28, - 255, + 126, 194, 12, 35, @@ -444,7 +444,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 41, 39, 29, - 255, + 126, 255, 13, 27, @@ -667,7 +667,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 18, 2, 9, - 255, + 126, 4, 94, 53, @@ -838,7 +838,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 224, 123, 2, - 255, + 126, 79, 89, 20, diff --git a/resource/gen-resource-linux.ps1 b/resource/gen-resource-linux.ps1 index 97a26c703..1f6ab38be 100644 --- a/resource/gen-resource-linux.ps1 +++ b/resource/gen-resource-linux.ps1 @@ -37,7 +37,7 @@ function compile($f) { -D__AVR_ATmega2560__ ` -DAVR ` -std=gnu++1z ` - -Os --short-enums -fpermissive $f -c -o "$m/$n.o" + -Os --short-enums -fpermissive -fshort-enums $f -c -o "$m/$n.o" ../../tools/avr/bin/avr-objcopy -O binary -j .data "$m/$n.o" "$m/$n.hex" cd ../compress dotnet run "$m/$n.hex" "$m/$n.ez" diff --git a/resource/menu_layouts.cpp b/resource/menu_layouts.cpp index 039c20c62..d20aeec63 100644 --- a/resource/menu_layouts.cpp +++ b/resource/menu_layouts.cpp @@ -15,10 +15,10 @@ menu_t boot_menu_layout = { "BOOT", { // m r n d p f o - {"OS UPGRADE", 0, 0, 0, 0, 255, 27, 0}, - {"DFU MODE", 0, 0, 0, 0, 255, 26, 0}, - {"USB DISK", 0, 0, 0, 0, 255, 28, 0}, - {"EXIT", 0, 0, 0, 0, 255, 29, 0}, + {"OS UPGRADE", 0, 0, 0, 0, NULL_PAGE, 27, 0}, + {"DFU MODE", 0, 0, 0, 0, NULL_PAGE, 26, 0}, + {"USB DISK", 0, 0, 0, 0, NULL_PAGE, 28, 0}, + {"EXIT", 0, 0, 0, 0, NULL_PAGE, 29, 0}, }, 0, 0 }; @@ -29,7 +29,7 @@ menu_t start_menu_layout = { { // m r n d p f o {"LOAD PROJECT", 0, 0, 0, 0, LOAD_PROJ_PAGE, 0, 0}, - {"NEW PROJECT", 0, 0, 0, 0, 255, 2, 0}, + {"NEW PROJECT", 0, 0, 0, 0, NULL_PAGE, 2, 0}, }, 0, 0 }; @@ -40,7 +40,7 @@ menu_t system_menu_layout = { // m r n d p f o {"LOAD PROJECT", 0, 0, 0, 0, LOAD_PROJ_PAGE, 0, 0}, //{"CONV PROJECT", 0, 0, 0, 0, 2, 0, 0}, - {"NEW PROJECT", 0, 0, 0, 0, 255, 2, 0}, + {"NEW PROJECT", 0, 0, 0, 0, NULL_PAGE, 2, 0}, {"MIDI", 0, 0, 0, 0, MIDI_CONFIG_PAGE, 0, 0}, {"MACHINEDRUM", 0, 0, 0, 0, MD_CONFIG_PAGE, 0, 0}, {"AUX PAGES", 0, 0, 0, 0, AUX_CONFIG_PAGE, 0, 0}, @@ -62,7 +62,7 @@ menu_t rampage1_menu_layout = { "RAM PAGE", { // m r n d p f o - {"LINK:", 0, 2, 2, 1, 255, 0, 0}, + {"LINK:", 0, 2, 2, 1, NULL_PAGE, 0, 0}, }, 0, 0 }; @@ -82,11 +82,11 @@ menu_t midiconfig_menu_layout = { menu_t midiport_menu_layout = { "PORTS", { - {"TURBO 1:", 0, 4, 4, 2, 255, 0, 2}, - {"TURBO 2:", 0, 4, 4, 3, 255, 0, 2}, - {"TURBO USB:", 0, 4, 4, 55, 255 , 0, 2}, - {"DRIVER 2:", 0, 2, 2, 4, 0, 255, 84}, - {"CTRL PORT:", 1, 4, 4, 56, 255, 0, 100}, + {"TURBO 1:", 0, 4, 4, 2, NULL_PAGE, 0, 2}, + {"TURBO 2:", 0, 4, 4, 3, NULL_PAGE, 0, 2}, + {"TURBO USB:", 0, 4, 4, 55, NULL_PAGE , 0, 2}, + {"DRIVER 2:", 0, 2, 2, 4, 0, NULL_PAGE, 84}, + {"CTRL PORT:", 1, 4, 4, 56, NULL_PAGE, 0, 100}, }, 24, 0 }; @@ -94,9 +94,9 @@ menu_t midiport_menu_layout = { menu_t midiprogram_menu_layout = { "PROGRAM", { - {"PRG MODE:", 0, 2, 2, 49, 255, 0, 90}, - {"PRG IN:", 0, 18, 2, 47, 255, 0, 88}, - {"PRG OUT:", 0, 17, 2, 48, 255, 0, 88}, + {"PRG MODE:", 0, 2, 2, 49, NULL_PAGE, 0, 90}, + {"PRG IN:", 0, 18, 2, 47, NULL_PAGE, 0, 88}, + {"PRG OUT:", 0, 17, 2, 48, NULL_PAGE, 0, 88}, }, 24, 0 }; @@ -105,10 +105,10 @@ menu_t midiprogram_menu_layout = { menu_t midiclock_menu_layout = { "SYNC", { - {"CLOCK RECV:", 0, 3, 3, 5, 255, 0, 7}, - {"TRANS RECV:", 0, 3, 3, 53, 255, 0, 7}, - {"CLOCK SEND:", 0, 4, 4, 6, 0, 255, 100}, - {"TRANS SEND:", 0, 4, 4, 54, 255, 0, 100}, + {"CLOCK RECV:", 0, 3, 3, 5, NULL_PAGE, 0, 7}, + {"TRANS RECV:", 0, 3, 3, 53, NULL_PAGE, 0, 7}, + {"CLOCK SEND:", 0, 4, 4, 6, 0, NULL_PAGE, 100}, + {"TRANS SEND:", 0, 4, 4, 54, NULL_PAGE, 0, 100}, }, 24, 0 }; @@ -117,12 +117,12 @@ menu_t midiroute_menu_layout = { "ROUTE", { // m r n d p f o - {"MIDI 1 FWD:", 0, 4, 4, 7, 255, 0, 10}, - {"MIDI 2 FWD:", 0, 4, 4, 51, 255, 0, 92}, + {"MIDI 1 FWD:", 0, 4, 4, 7, NULL_PAGE, 0, 10}, + {"MIDI 2 FWD:", 0, 4, 4, 51, NULL_PAGE, 0, 92}, - {"USB FWD:", 0, 4, 4, 52, 255, 0, 96}, + {"USB FWD:", 0, 4, 4, 52, NULL_PAGE, 0, 96}, - {"CC LOOP:", 0, 2, 2, 11, 255, 0, 86}, + {"CC LOOP:", 0, 2, 2, 11, NULL_PAGE, 0, 86}, }, 24, 0 }; @@ -131,9 +131,9 @@ menu_t midimachinedrum_menu_layout = { "MD MIDI", { // m r n d p f o - {"CHRO CHAN:", 0, 18, 2, 9, 255, 0, 18}, - {"POLY CHAN:", 0, 18, 2, 46, 255, 0, 88}, - {"TRIG CHAN:", 0, 18, 2, 57, 255, 0, 18}, + {"CHRO CHAN:", 0, 18, 2, 9, NULL_PAGE, 0, 18}, + {"POLY CHAN:", 0, 18, 2, 46, NULL_PAGE, 0, 88}, + {"TRIG CHAN:", 0, 18, 2, 57, NULL_PAGE, 0, 18}, }, 24, 0 }; @@ -144,7 +144,7 @@ menu_t mdconfig_menu_layout = { { // m r n d p f o {"IMPORT", 0, 0, 0, 0, MD_IMPORT_PAGE, 0, 0}, - {"NORMALIZE:", 0, 2, 2, 8, 255, 0, 16}, + {"NORMALIZE:", 0, 2, 2, 8, NULL_PAGE, 0, 16}, {"POLY CONFIG", 0, 0, 0, 0, POLY_PAGE, 0, 0}, }, 0, 0 @@ -154,10 +154,10 @@ menu_t mdimport_menu_layout = { "MD", { // m r n d p f o - {"SRC: ", 0, 128, 128, 43, 255, 0, 128}, - {"DEST: ", 0, 128, 128, 44, 255, 0, 128}, - {"COUNT:", 1, 128, 0, 45, 255, 0, 0}, - {"RUN", 0, 0, 0, 0, 255, 25, 0}, + {"SRC: ", 0, 128, 128, 43, NULL_PAGE, 0, 128}, + {"DEST: ", 0, 128, 128, 44, NULL_PAGE, 0, 128}, + {"COUNT:", 1, 128, 0, 45, NULL_PAGE, 0, 0}, + {"RUN", 0, 0, 0, 0, NULL_PAGE, 25, 0}, }, 0, 0 }; @@ -166,7 +166,7 @@ menu_t mclconfig_menu_layout = { "SYSTEM", { // m r n d p f o - {"DISPLAY:", 0, 2, 2, 13, 255, 0, 23}, + {"DISPLAY:", 0, 2, 2, 13, NULL_PAGE, 0, 23}, }, 1, 0 }; @@ -175,13 +175,13 @@ menu_t file_menu_layout = { "FILE", { // m r n d p f o - {"CANCEL", 0, 0, 0, 0, 255, 0, 0}, - {"NEW DIR.", 0, 0, 0, 0, 255, 0, 0}, - {"DELETE", 0, 0, 0, 0, 255, 0, 0}, - {"RENAME", 0, 0, 0, 0, 255, 0, 0}, - {"OVERWRITE", 0, 0, 0, 0, 255, 0, 0}, - {"RECV ALL", 0, 0, 0, 0, 255, 0, 0}, - {"SEND ALL", 0, 0, 0, 0, 255, 0, 0}, + {"CANCEL", 0, 0, 0, 0, NULL_PAGE, 0, 0}, + {"NEW DIR.", 0, 0, 0, 0, NULL_PAGE, 0, 0}, + {"DELETE", 0, 0, 0, 0, NULL_PAGE, 0, 0}, + {"RENAME", 0, 0, 0, 0, NULL_PAGE, 0, 0}, + {"OVERWRITE", 0, 0, 0, 0, NULL_PAGE, 0, 0}, + {"RECV ALL", 0, 0, 0, 0, NULL_PAGE, 0, 0}, + {"SEND ALL", 0, 0, 0, 0, NULL_PAGE, 0, 0}, }, 0, 0 }; @@ -190,27 +190,27 @@ menu_t seq_menu_layout = { "SEQ", { // m r n d p f o - {"TRACK SEL:", 1, 17, 0, 14, 255, 3, 0}, - {"DEVICE:", 1, 3, 2, 50, 255, 0, 128}, - {"EDIT:", 0, 4, 4, 15, 255, 4, 48}, - {"EDIT:", 0, 1 + NUM_LOCKS, 1, 16, 255, 0, 54}, - {"CC:", 0, 133, 5, 17, 255, 0, 55}, - {"SLIDE:", 0, 2, 2, 18, 255, 0, 25}, + {"TRACK SEL:", 1, 17, 0, 14, NULL_PAGE, 3, 0}, + {"DEVICE:", 1, 3, 2, 50, NULL_PAGE, 0, 128}, + {"EDIT:", 0, 4, 4, 15, NULL_PAGE, 4, 48}, + {"EDIT:", 0, 1 + NUM_LOCKS, 1, 16, NULL_PAGE, 0, 54}, + {"CC:", 0, 133, 5, 17, NULL_PAGE, 0, 55}, + {"SLIDE:", 0, 2, 2, 18, NULL_PAGE, 0, 25}, {"ARPEGGIATOR", 0, 0, 0, 0, ARP_PAGE, 0, 0}, - {"KEY:", 0, 12, 12, 19, 255, 0, 104}, - {"VEL:", 0, 128, 0, 20, 255, 0, 0}, - {"COND:", 1, NUM_TRIG_CONDITIONS + 1, NUM_TRIG_CONDITIONS + 1, 21, 255, 0, 60}, - {"SPEED:", 0, 7, 7, 22, 255, 5, 41}, - {"LENGTH:", 1, 129, 0, 23, 255, 6, 0}, - {"CHANNEL:", 1, 17, 0, 24, 255, 7, 0}, - {"COPY: ", 0, 3, 3, 25, 255, 8, 27}, - {"CLEAR:", 0, 3, 3, 26, 255, 9, 27}, - {"CLEAR:", 0, 3, 3, 26, 255, 10, 30}, - {"PASTE:", 0, 3, 3, 27, 255, 11, 27}, - {"SHIFT:", 0, 5, 5, 28, 255, 12, 35}, - {"REVERSE:", 0, 3, 3, 29, 255, 13, 27}, + {"KEY:", 0, 12, 12, 19, NULL_PAGE, 0, 104}, + {"VEL:", 0, 128, 0, 20, NULL_PAGE, 0, 0}, + {"COND:", 1, NUM_TRIG_CONDITIONS + 1, NUM_TRIG_CONDITIONS + 1, 21, NULL_PAGE, 0, 60}, + {"SPEED:", 0, 7, 7, 22, NULL_PAGE, 5, 41}, + {"LENGTH:", 1, 129, 0, 23, NULL_PAGE, 6, 0}, + {"CHANNEL:", 1, 17, 0, 24, NULL_PAGE, 7, 0}, + {"COPY: ", 0, 3, 3, 25, NULL_PAGE, 8, 27}, + {"CLEAR:", 0, 3, 3, 26, NULL_PAGE, 9, 27}, + {"CLEAR:", 0, 3, 3, 26, NULL_PAGE, 10, 30}, + {"PASTE:", 0, 3, 3, 27, NULL_PAGE, 11, 27}, + {"SHIFT:", 0, 5, 5, 28, NULL_PAGE, 12, 35}, + {"REVERSE:", 0, 3, 3, 29, NULL_PAGE, 13, 27}, {"POLYPHONY", 0, 0, 0, 0, POLY_PAGE, 0, 0}, - {"QUANT:", 0, 2, 2, 42, 255, 0, 25}, + {"QUANT:", 0, 2, 2, 42, NULL_PAGE, 0, 25}, {"SOUND", 0, 0, 0, 0, SOUND_BROWSER, 0, 0}, }, 14, 0 @@ -220,10 +220,10 @@ menu_t step_menu_layout = { "STP", { // m r n d p f o - {"CLEAR:", 0, 2, 2, 30, 255, 15, 30}, - {"COPY STEP", 0, 0, 0, 0, 255, 16, 0}, - {"PASTE STEP", 0, 0, 0, 0, 255, 17, 0}, - {"MUTE STEP", 0, 0, 0, 0, 255, 18, 0}, + {"CLEAR:", 0, 2, 2, 30, NULL_PAGE, 15, 30}, + {"COPY STEP", 0, 0, 0, 0, NULL_PAGE, 16, 0}, + {"PASTE STEP", 0, 0, 0, 0, NULL_PAGE, 17, 0}, + {"MUTE STEP", 0, 0, 0, 0, NULL_PAGE, 18, 0}, }, 19, 0 }; @@ -232,22 +232,22 @@ menu_t slot_menu_layout = { "Slot", { // m r n d p f o - {"GRID: ", 0, 2, 2, 31, 255, 0, 52}, - {"MODE:", 1, 4, 3, 32, 255, 0, 20}, + {"GRID: ", 0, 2, 2, 31, NULL_PAGE, 0, 52}, + {"MODE:", 1, 4, 3, 32, NULL_PAGE, 0, 20}, // for non-ext tracks - {"LEN: ", 1, 65, 0, 39, 255, 0, 0}, + {"LEN: ", 1, 65, 0, 39, NULL_PAGE, 0, 0}, // for ext tracks - {"LEN: ", 1, 129, 0, 39, 255, 0, 0}, - {"LOOP: ", 0, 64, 0, 33, 255, 0, 0}, + {"LEN: ", 1, 129, 0, 39, NULL_PAGE, 0, 0}, + {"LOOP: ", 0, 64, 0, 33, NULL_PAGE, 0, 0}, // o=128, generate the table on-demand - {"JUMP: ", 0, 128, 128, 34, 255, 0, 128}, + {"JUMP: ", 0, 128, 128, 34, NULL_PAGE, 0, 128}, #ifndef OLED_DISPLAY - {"APPLY:", 1, 21, 1, 35, 255, 0, 40}, + {"APPLY:", 1, 21, 1, 35, NULL_PAGE, 0, 40}, #endif - {"CLEAR:", 0, 2, 2, 36, 255, 0, 33}, - {"COPY: ", 0, 2, 2, 37, 255, 0, 33}, - {"PASTE:", 0, 2, 2, 38, 255, 0, 33}, - {"RENAME", 0, 0, 0, 0, 255, 20, 0}, + {"CLEAR:", 0, 2, 2, 36, NULL_PAGE, 0, 33}, + {"COPY: ", 0, 2, 2, 37, NULL_PAGE, 0, 33}, + {"PASTE:", 0, 2, 2, 38, NULL_PAGE, 0, 33}, + {"RENAME", 0, 0, 0, 0, NULL_PAGE, 20, 0}, }, 21, 0, }; @@ -256,9 +256,9 @@ menu_t wavdesign_menu_layout = { "", { // m r n d p f o - {"EDIT:", 0, 4, 4, 40, 255, 0, 80}, - {"WAV:", 0, 6, 6, 41, 255, 0, 74}, - {"TRANSFER", 0, 0, 0, 0, 255, 22, 0}, + {"EDIT:", 0, 4, 4, 40, NULL_PAGE, 0, 80}, + {"WAV:", 0, 6, 6, 41, NULL_PAGE, 0, 74}, + {"TRANSFER", 0, 0, 0, 0, NULL_PAGE, 22, 0}, }, 23, 0 }; @@ -268,9 +268,9 @@ menu_t perf_menu_layout = { { // m r n d p f o - {"CTRL SEL:",0, 4, 4, 59, 255, 0, 117}, - {"RENAME", 0, 0, 0, 0, 255, 30, 0}, - // {"PARAM:", 0, 17, 1, 58, 255, 0, 116}, + {"CTRL SEL:",0, 4, 4, 59, NULL_PAGE, 0, 117}, + {"RENAME", 0, 0, 0, 0, NULL_PAGE, 30, 0}, + // {"PARAM:", 0, 17, 1, 58, NULL_PAGE, 0, 116}, }, 0, 0 }; From 7793a2a7e57435f1dfaf0571d10a46ab4a02338f Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 16 Jul 2023 12:04:50 +1000 Subject: [PATCH 255/413] Menu corruption by pre-emptively calling R.clear --- avr/cores/megacommand/MCL/Menu.cpp | 2 - avr/cores/megacommand/MCL/SeqPage.cpp | 7 +--- .../megacommand/resources/R_menu_layouts.cpp | 38 +++++++++---------- 3 files changed, 21 insertions(+), 26 deletions(-) diff --git a/avr/cores/megacommand/MCL/Menu.cpp b/avr/cores/megacommand/MCL/Menu.cpp index 56de7b065..965df5fb3 100644 --- a/avr/cores/megacommand/MCL/Menu.cpp +++ b/avr/cores/megacommand/MCL/Menu.cpp @@ -37,9 +37,7 @@ const menu_item_t *MenuBase::get_item(uint8_t item_n) { uint8_t entry_cnt = get_entry_count(); for(uint8_t idx = 0; idx < entry_cnt; ++idx) { if(is_entry_enable(idx)) { - DEBUG_PRINTLN(idx); if (item_n == 0) { - DEBUG_PRINTLN(idx); return get_entry_address(idx); }else { --item_n; diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index 4b76b3c0c..2905dba7f 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -53,7 +53,6 @@ bool SeqPage::recording = false; uint8_t SeqPage::last_midi_state = 0; uint8_t SeqPage::last_step = 255; -static SeqPage *opt_seqpage_capture = nullptr; static MCLEncoder *opt_param1_capture = nullptr; static MCLEncoder *opt_param2_capture = nullptr; @@ -380,8 +379,6 @@ bool SeqPage::handleEvent(gui_event_t *event) { return true; } else if (!show_seq_menu) { show_seq_menu = true; - // capture current page. - opt_seqpage_capture = this; if (midi_device == &MD) { auto &active_track = mcl_seq.md_tracks[last_md_track]; @@ -670,7 +667,7 @@ void opt_channel_handler() { void opt_mask_handler() { seq_step_page.config_mask_info(false); } void opt_trackid_handler() { - opt_seqpage_capture->select_track(SeqPage::midi_device, opt_trackid - 1); + seq_step_page.select_track(SeqPage::midi_device, opt_trackid - 1); } void opt_speed_handler() { @@ -703,7 +700,7 @@ void opt_speed_handler() { } } #endif - opt_seqpage_capture->init(); +// opt_seqpage_capture->init(); } void opt_clear_track_handler() { diff --git a/avr/cores/megacommand/resources/R_menu_layouts.cpp b/avr/cores/megacommand/resources/R_menu_layouts.cpp index 5c1c33821..9ac5723b7 100644 --- a/avr/cores/megacommand/resources/R_menu_layouts.cpp +++ b/avr/cores/megacommand/resources/R_menu_layouts.cpp @@ -21,7 +21,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 255, 4, 59, - 126, + 255, 0, 117, 82, @@ -34,7 +34,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 0, 0, 3, - 126, + 255, 200, 30, 0, @@ -126,7 +126,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 0, 39, 181, - 126, + 255, 6, 144, 20, @@ -152,7 +152,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 128, 34, 182, - 126, + 255, 4, 67, 222, @@ -164,7 +164,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 125, 118, 36, - 126, + 255, 44, 219, 67, @@ -203,7 +203,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 95, 249, 30, - 126, + 255, 15, 30, 238, @@ -219,7 +219,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 44, 21, 39, - 126, + 255, 17, 237, 0, @@ -249,7 +249,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 49, 240, 14, - 126, + 255, 3, 0, 189, @@ -269,7 +269,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 178, 79, 15, - 126, + 255, 4, 178, 48, @@ -362,7 +362,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 7, 7, 22, - 126, + 255, 5, 41, 27, @@ -374,7 +374,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 58, 125, 23, - 126, + 255, 6, 177, 62, @@ -387,7 +387,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 251, 188, 24, - 126, + 255, 7, 0, 36, @@ -396,7 +396,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 3, 3, 25, - 126, + 255, 8, 132, 27, @@ -405,7 +405,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 220, 20, 26, - 126, + 255, 9, 128, 120, @@ -417,7 +417,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 20, 27, 254, - 126, + 255, 11, 27, 83, @@ -430,7 +430,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 5, 5, 28, - 126, + 255, 194, 12, 35, @@ -444,7 +444,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 41, 39, 29, - 126, + 255, 255, 13, 27, @@ -667,7 +667,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 18, 2, 9, - 126, + 255, 4, 94, 53, @@ -838,7 +838,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 224, 123, 2, - 126, + 255, 79, 89, 20, From 587b8959334dfb83cd76ed2fa236101b87dedbec Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 16 Jul 2023 12:10:24 +1000 Subject: [PATCH 256/413] dont clear display? --- avr/cores/megacommand/MCL/ArpPage.cpp | 2 +- avr/cores/megacommand/MCL/SeqPage.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/ArpPage.cpp b/avr/cores/megacommand/MCL/ArpPage.cpp index 3f4beecc0..b9d6009f9 100644 --- a/avr/cores/megacommand/MCL/ArpPage.cpp +++ b/avr/cores/megacommand/MCL/ArpPage.cpp @@ -11,7 +11,7 @@ void ArpPage::setup() { void ArpPage::init() { DEBUG_PRINT_FN(); oled_display.setFont(); - seq_ptc_page.display(); +// seq_ptc_page.display(); track_update(); trig_interface.send_md_leds(TRIGLED_EXCLUSIVE); } diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index 2905dba7f..a29fad008 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -406,7 +406,7 @@ bool SeqPage::handleEvent(gui_event_t *event) { if (EVENT_RELEASED(event, Buttons.BUTTON3)) { encoders[0] = opt_param1_capture; encoders[1] = opt_param2_capture; - oled_display.clearDisplay(); + //oled_display.clearDisplay(); void (*row_func)(); if (show_seq_menu) { row_func = From 9e6e267842092be69e1d66a5b49010cddadad685 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 16 Jul 2023 12:32:37 +1000 Subject: [PATCH 257/413] PianoRoll: fix zoom out of bounds --- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 25 +++++++++++--------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index ce247b722..19449cb77 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -29,8 +29,8 @@ void SeqExtStepPage::config() { display_page_index = false; } void SeqExtStepPage::config_encoders() { -#ifdef EXT_TRACKS if (show_seq_menu) { return; } + seq_extparam1.max = 127; seq_extparam2.max = 127; seq_extparam3.max = 128; @@ -38,9 +38,11 @@ void SeqExtStepPage::config_encoders() { seq_extparam4.min = 4; seq_extparam4.max = 128; + auto &active_track = mcl_seq.ext_tracks[last_ext_track]; + if (encoder_init) { encoder_init = false; - uint8_t timing_mid = mcl_seq.ext_tracks[last_ext_track].get_timing_mid(); + uint8_t timing_mid = active_track.get_timing_mid(); seq_extparam1.cur = 64; seq_extparam2.cur = 64; @@ -63,8 +65,6 @@ void SeqExtStepPage::config_encoders() { config(); SeqPage::midi_device = midi_active_peering.get_device(UART2_PORT); - -#endif } void SeqExtStepPage::init() { @@ -703,14 +703,17 @@ void SeqExtStepPage::loop() { roll_length = active_track.length * timing_mid; // in ticks - if (seq_extparam4.hasChanged()) { - - if (seq_extparam4.cur > zoom_max) { + if (seq_extparam4.cur > zoom_max) { seq_extparam4.cur = zoom_max; - } - if (seq_extparam4.cur > active_track.length) { - seq_extparam4.cur = active_track.length; - } + } + + uint8_t z = (float)active_track.length * active_track.get_speed_multiplier(); + if (seq_extparam4.cur > z) { + seq_extparam4.cur = z; + } + + + if (seq_extparam4.hasChanged()) { uint8_t fov_zoom = seq_extparam4.cur; From 667ed3d07c8ee4913b7f42794cfd02b80ee0cc29 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 16 Jul 2023 12:33:16 +1000 Subject: [PATCH 258/413] Octave on ptc page for ext to middle c. --- avr/cores/megacommand/MCL/SeqPtcPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.cpp b/avr/cores/megacommand/MCL/SeqPtcPage.cpp index 219eed771..3a79dde80 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPtcPage.cpp @@ -39,7 +39,7 @@ void SeqPtcPage::setup() { init_poly(); midi_events.setup_callbacks(); octs[0] = 1; - octs[1] = 4; + octs[1] = 1; fine_tunes[0] = 32; fine_tunes[1] = 32; memset(dev_note_masks, 0, sizeof(dev_note_masks)); From 8584eb4edb13555dd2d529c168f4df669dc67091 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 16 Jul 2023 12:49:28 +1000 Subject: [PATCH 259/413] fix pianoroll out of bounds --- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index 19449cb77..b8ea3549e 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -707,10 +707,10 @@ void SeqExtStepPage::loop() { seq_extparam4.cur = zoom_max; } - uint8_t z = (float)active_track.length * active_track.get_speed_multiplier(); - if (seq_extparam4.cur > z) { - seq_extparam4.cur = z; - } +// uint8_t z = (float)active_track.length * active_track.get_speed_multiplier(); +// if (seq_extparam4.cur > z) { +// seq_extparam4.cur = z; +// } if (seq_extparam4.hasChanged()) { @@ -719,7 +719,7 @@ void SeqExtStepPage::loop() { int old_length = fov_length; fov_length = fov_zoom * timing_mid; // how many ticks to display on screen. - + if (fov_length > roll_length) { fov_length = roll_length; } int diff = (fov_length - old_length); @@ -731,6 +731,7 @@ void SeqExtStepPage::loop() { if (fov_length + fov_offset > roll_length) { fov_offset = roll_length - fov_length; } + fov_offset = max(0,fov_offset); fov_pixels_per_tick = (float)fov_w / (float)fov_length; } From 1f628c68b269739363721c193a5d3e7c605036dd Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 16 Jul 2023 19:37:57 +1000 Subject: [PATCH 260/413] zoom equation solved, no more left drift --- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index b8ea3549e..4e4cc3fc1 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -717,23 +717,25 @@ void SeqExtStepPage::loop() { uint8_t fov_zoom = seq_extparam4.cur; - int old_length = fov_length; fov_length = fov_zoom * timing_mid; // how many ticks to display on screen. if (fov_length > roll_length) { fov_length = roll_length; } + int x = cur_x - fov_offset; - int diff = (fov_length - old_length); + int fov_old_x = x * fov_pixels_per_tick; - int x = cur_x - fov_offset; + fov_pixels_per_tick = (float)fov_w / (float)fov_length; - fov_offset -= (float) diff * ((float) x / (float) fov_length); - //fov_offset -= (diff * x) / fov_length; + int fov_cur_x = x * fov_pixels_per_tick; + + int offset = (fov_cur_x - fov_old_x) / fov_pixels_per_tick; + + fov_offset += offset; if (fov_length + fov_offset > roll_length) { fov_offset = roll_length - fov_length; } fov_offset = max(0,fov_offset); - fov_pixels_per_tick = (float)fov_w / (float)fov_length; } } From 8ca8cd6690dafd4f5fd43472682f563c764b1391 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 16 Jul 2023 20:11:35 +1000 Subject: [PATCH 261/413] Zoom bounds check when speed changes --- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index 4e4cc3fc1..cba9ebf05 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -707,18 +707,19 @@ void SeqExtStepPage::loop() { seq_extparam4.cur = zoom_max; } -// uint8_t z = (float)active_track.length * active_track.get_speed_multiplier(); -// if (seq_extparam4.cur > z) { -// seq_extparam4.cur = z; -// } + int z = (float)active_track.length * active_track.get_speed_multiplier(); + if (seq_extparam4.cur > z) { + seq_extparam4.cur = z; + } - if (seq_extparam4.hasChanged()) { + if (seq_extparam4.hasChanged()) { uint8_t fov_zoom = seq_extparam4.cur; fov_length = fov_zoom * timing_mid; // how many ticks to display on screen. if (fov_length > roll_length) { fov_length = roll_length; } + int x = cur_x - fov_offset; int fov_old_x = x * fov_pixels_per_tick; From 3c5a4430d853a3b8ac66255be41a99a64a985ca7 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 16 Jul 2023 21:03:20 +1000 Subject: [PATCH 262/413] Only apply length/speed/channel changes if device is static --- avr/cores/megacommand/MCL/SeqPage.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index a29fad008..b5709cd7b 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -121,6 +121,9 @@ void SeqPage::init() { seq_menu_page.menu.enable_entry(SEQ_MENU_SLIDE, false); seq_menu_page.menu.enable_entry(SEQ_MENU_POLY, false); seq_menu_page.menu.enable_entry(SEQ_MENU_SOUND, false); + + seq_menu_page.menu.enable_entry(SEQ_MENU_LENGTH_MD, false); + seq_menu_page.menu.enable_entry(SEQ_MENU_LENGTH_EXT, false); /* if (mcl_cfg.track_select == 1) { seq_menu_page.menu.enable_entry(SEQ_MENU_TRACK, false); @@ -411,10 +414,13 @@ bool SeqPage::handleEvent(gui_event_t *event) { if (show_seq_menu) { row_func = seq_menu_page.menu.get_row_function(seq_menu_page.encoders[1]->cur); + uint8_t old_dev = midi_device; midi_device = midi_active_peering.get_device(mcl_cfg.seq_dev); - opt_speed_handler(); - opt_length_handler(); - opt_channel_handler(); + if (old_dev == midi_device) { + opt_speed_handler(); + opt_length_handler(); + opt_channel_handler(); + } } else if (show_step_menu) { row_func = step_menu_page.menu.get_row_function(step_menu_page.encoders[1]->cur); @@ -647,6 +653,7 @@ void opt_length_handler() { MD.sync_seqtrack(active_track.length, active_track.speed, active_track.step_count); } else { + opt_length = max(opt_length, 2); mcl_seq.ext_tracks[last_ext_track].buffer_notesoff(); mcl_seq.ext_tracks[last_ext_track].set_length(opt_length); seq_extparam4.cur = opt_length; From b1be7aac6d5787a27de60e8253e03fb0c9f966dd Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 16 Jul 2023 21:04:21 +1000 Subject: [PATCH 263/413] Length menu option is now device dependent. Fix cur_w bounds problems --- avr/cores/megacommand/MCL/MCLMenus.h | 2 +- avr/cores/megacommand/MCL/MidiDeviceGrid.h | 2 +- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 11 +- avr/cores/megacommand/MCL/SeqPages.h | 22 +- avr/cores/megacommand/MCL/SeqPtcPage.cpp | 4 + avr/cores/megacommand/MCL/SeqStepPage.cpp | 2 + avr/cores/megacommand/resources/R.h | 8 +- .../megacommand/resources/R_menu_layouts.cpp | 785 +++++++++--------- resource/menu_layouts.cpp | 121 +-- 9 files changed, 494 insertions(+), 463 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCLMenus.h b/avr/cores/megacommand/MCL/MCLMenus.h index 285e2f752..27d28a031 100644 --- a/avr/cores/megacommand/MCL/MCLMenus.h +++ b/avr/cores/megacommand/MCL/MCLMenus.h @@ -91,7 +91,7 @@ extern MenuPage file_menu_page; extern MCLEncoder seq_menu_value_encoder; extern MCLEncoder seq_menu_entry_encoder; -constexpr size_t seq_menu_page_N = 22; +constexpr size_t seq_menu_page_N = 23; extern MenuPage seq_menu_page; extern MCLEncoder step_menu_value_encoder; diff --git a/avr/cores/megacommand/MCL/MidiDeviceGrid.h b/avr/cores/megacommand/MCL/MidiDeviceGrid.h index 5fa65027e..73c465613 100644 --- a/avr/cores/megacommand/MCL/MidiDeviceGrid.h +++ b/avr/cores/megacommand/MCL/MidiDeviceGrid.h @@ -1,4 +1,4 @@ -#pragma once; +#pragma once #include "Grid.h" diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index cba9ebf05..dfb6b12f9 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -493,7 +493,7 @@ void SeqExtStepPage::draw_viewport_minimap() { } void SeqExtStepPage::pos_cur_x(int16_t diff) { - uint8_t w = cur_w; + uint16_t w = cur_w; if (pianoroll_mode >= 1) { w = 3; } @@ -550,7 +550,7 @@ void SeqExtStepPage::set_cur_y(uint8_t cur_y_) { uint8_t timing_mid = active_track.get_timing_mid(); uint16_t pos = fov_offset + timing_mid * n; - uint8_t w = cur_w; + uint16_t w = cur_w; if (pos + w >= roll_length) { w = roll_length - pos - 1; } active_track.del_note(pos, w - 1, cur_y); @@ -618,7 +618,7 @@ void SeqExtStepPage::config_menu_entries() { seq_menu_page.menu.enable_entry(SEQ_MENU_PIANOROLL, true); seq_menu_page.menu.enable_entry(SEQ_MENU_TRACK, true); seq_menu_page.menu.enable_entry(SEQ_MENU_CHANNEL, true); - + seq_menu_page.menu.enable_entry(SEQ_MENU_LENGTH_EXT, true); if (pianoroll_mode == 0) { seq_menu_page.menu.enable_entry(SEQ_MENU_ARP, true); @@ -707,6 +707,7 @@ void SeqExtStepPage::loop() { seq_extparam4.cur = zoom_max; } + if (cur_w > roll_length) { cur_w = roll_length / 2; } int z = (float)active_track.length * active_track.get_speed_multiplier(); if (seq_extparam4.cur > z) { @@ -801,7 +802,7 @@ void SeqExtStepPage::display() { void SeqExtStepPage::enter_notes() { auto &active_track = mcl_seq.ext_tracks[last_ext_track]; - uint8_t w = cur_w; + uint16_t w = cur_w; if (cur_x + w >= roll_length) { w = roll_length - cur_x - 1; } for (uint8_t n = 0; n < NUM_NOTES_ON; n++) { @@ -1018,7 +1019,7 @@ bool SeqExtStepPage::handleEvent(gui_event_t *event) { if (active_track.notes_on_count > 0) { enter_notes(); } else { - uint8_t w = cur_w; + uint16_t w = cur_w; if (cur_x + w >= roll_length) { w = roll_length - cur_x - 1; } if (!active_track.del_note(cur_x, w - 1, cur_y)) { diff --git a/avr/cores/megacommand/MCL/SeqPages.h b/avr/cores/megacommand/MCL/SeqPages.h index 8b284d9ca..e33477cfc 100644 --- a/avr/cores/megacommand/MCL/SeqPages.h +++ b/avr/cores/megacommand/MCL/SeqPages.h @@ -24,16 +24,18 @@ #define SEQ_MENU_VEL 8 #define SEQ_MENU_PROB 9 #define SEQ_MENU_SPEED 10 -#define SEQ_MENU_LENGTH 11 -#define SEQ_MENU_CHANNEL 12 -#define SEQ_MENU_COPY 13 -#define SEQ_MENU_CLEAR_TRACK 14 -#define SEQ_MENU_CLEAR_LOCKS 15 -#define SEQ_MENU_PASTE 16 -#define SEQ_MENU_SHIFT 17 -#define SEQ_MENU_REVERSE 18 -#define SEQ_MENU_POLY 19 -#define SEQ_MENU_SOUND 21 +#define SEQ_MENU_LENGTH_MD 11 +#define SEQ_MENU_LENGTH_EXT 12 +#define SEQ_MENU_CHANNEL 13 +#define SEQ_MENU_COPY 14 +#define SEQ_MENU_CLEAR_TRACK 15 +#define SEQ_MENU_CLEAR_LOCKS 16 +#define SEQ_MENU_PASTE 17 +#define SEQ_MENU_SHIFT 18 +#define SEQ_MENU_REVERSE 19 +#define SEQ_MENU_POLY 20 +#define SEQ_MENU_QUANT 21 +#define SEQ_MENU_SOUND 22 extern MCLEncoder seq_param1; extern MCLEncoder seq_param2; diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.cpp b/avr/cores/megacommand/MCL/SeqPtcPage.cpp index 3a79dde80..5ad962866 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPtcPage.cpp @@ -93,6 +93,10 @@ void SeqPtcPage::init() { seq_menu_page.menu.enable_entry(SEQ_MENU_POLY, true); if (midi_device == &MD) { seq_menu_page.menu.enable_entry(SEQ_MENU_SOUND, true); + seq_menu_page.menu.enable_entry(SEQ_MENU_LENGTH_MD, true); + } + else { + seq_menu_page.menu.enable_entry(SEQ_MENU_LENGTH_EXT, true); } cc_link_enable = true; scale_padding = false; diff --git a/avr/cores/megacommand/MCL/SeqStepPage.cpp b/avr/cores/megacommand/MCL/SeqStepPage.cpp index f893a8542..dee184861 100644 --- a/avr/cores/megacommand/MCL/SeqStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqStepPage.cpp @@ -53,6 +53,8 @@ void SeqStepPage::init() { pitch_param = 255; seq_menu_page.menu.enable_entry(SEQ_MENU_MASK, true); seq_menu_page.menu.enable_entry(SEQ_MENU_SOUND, true); + seq_menu_page.menu.enable_entry(SEQ_MENU_LENGTH_MD, true); + SeqPage::midi_device = midi_active_peering.get_device(UART1_PORT); midi_events.setup_callbacks(); diff --git a/avr/cores/megacommand/resources/R.h b/avr/cores/megacommand/resources/R.h index 5c8081409..a83df44a9 100644 --- a/avr/cores/megacommand/resources/R.h +++ b/avr/cores/megacommand/resources/R.h @@ -370,10 +370,10 @@ struct __T_menu_layouts { static constexpr size_t sizeofof_step_menu_layout = 96; union { menu_t seq_menu_layout[0]; - char zz__seq_menu_layout[474]; + char zz__seq_menu_layout[495]; }; - static constexpr size_t countof_seq_menu_layout = 474 / sizeof(menu_t); - static constexpr size_t sizeofof_seq_menu_layout = 474; + static constexpr size_t countof_seq_menu_layout = 495 / sizeof(menu_t); + static constexpr size_t sizeofof_seq_menu_layout = 495; union { menu_t file_menu_layout[0]; char zz__file_menu_layout[159]; @@ -464,7 +464,7 @@ struct __T_menu_layouts { }; static constexpr size_t countof_boot_menu_layout = 96 / sizeof(menu_t); static constexpr size_t sizeofof_boot_menu_layout = 96; - static constexpr size_t __total_size = 2214; + static constexpr size_t __total_size = 2235; }; extern const unsigned char __R_menu_options[] PROGMEM; diff --git a/avr/cores/megacommand/resources/R_menu_layouts.cpp b/avr/cores/megacommand/resources/R_menu_layouts.cpp index 9ac5723b7..68113a54f 100644 --- a/avr/cores/megacommand/resources/R_menu_layouts.cpp +++ b/avr/cores/megacommand/resources/R_menu_layouts.cpp @@ -27,426 +27,438 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 82, 69, 78, - 246, + 236, 65, 77, 69, - 0, - 0, - 3, + 35, + 155, + 255, + 1, + 119, 255, - 200, 30, - 0, - 31, + 6, + 50, + 53, + 253, 69, 68, 73, - 179, 84, + 155, 49, - 96, 53, - 203, + 6, 40, + 223, + 28, 80, - 246, 87, 65, 86, - 58, - 35, - 3, + 96, + 19, + 62, + 0, 6, - 219, 6, 41, + 219, 20, 74, - 111, 94, + 127, 65, 78, 83, - 236, 70, 69, 82, + 96, 74, - 7, + 63, 22, 0, - 253, 23, - 0, + 255, 83, + 236, 108, 111, 116, - 159, - 14, + 17, + 255, 71, 82, 73, - 236, 68, 58, 32, - 29, - 158, + 100, + 53, + 246, 2, 2, 31, - 223, - 53, + 35, + 253, 52, 77, 79, 68, - 178, 69, + 151, 75, - 253, 1, + 237, 4, 3, 32, - 187, 20, + 218, 20, 76, 149, - 90, - 40, 214, + 40, 0, + 176, 20, - 31, + 251, 65, 0, 39, - 181, - 255, - 6, - 144, + 145, + 153, 20, - 201, + 12, 129, - 246, + 159, 79, 79, 80, + 96, 83, - 3, + 61, 64, - 221, 0, 33, + 220, 20, 74, - 200, 85, 77, - 31, + 129, + 251, 128, 128, 34, - 182, 255, 4, + 109, 67, - 222, 63, + 236, 65, 82, 58, - 192, 125, - 118, + 7, 36, 255, + 109, 44, - 219, 67, + 183, 61, 89, - 115, 84, + 50, 20, - 46, + 230, 37, - 111, + 251, 80, 65, 83, 84, - 176, 69, 41, - 59, + 3, + 184, 38, 20, - 130, + 32, 40, - 0, - 251, + 15, 20, 0, 21, - 0, + 182, + 255, 41, - 97, 80, + 16, 94, - 5, - 148, + 89, 95, - 249, + 79, 30, 255, 15, + 158, 30, - 238, 32, + 235, 77, - 178, 80, 53, - 246, + 47, 16, 0, + 98, 95, - 44, + 193, 21, - 39, - 255, + 96, + 20, + 251, 17, - 237, 0, 77, 85, 19, - 100, + 89, 41, - 61, + 15, 18, 0, 19, - 187, + 110, 95, 69, 81, - 14, - 4, - 54, + 193, + 80, + 13, 94, 67, + 132, 75, - 18, 191, - 109, + 155, 1, 49, - 240, + 124, 14, 255, 3, 0, - 189, + 47, 59, 86, 73, 67, - 147, + 100, 171, + 251, 1, - 238, 3, 2, 50, 233, - 9, + 130, 178, - 79, + 83, 15, + 236, 255, 4, - 178, 48, 20, - 30, + 135, 9, 1, + 183, 16, - 223, 41, 54, 67, + 132, 67, - 58, - 96, - 209, - 125, + 198, + 15, + 0, 133, + 219, 5, 17, - 188, 20, 55, + 194, 83, 76, - 43, 166, + 176, 254, - 9, - 182, + 155, 18, 20, + 109, 25, - 223, 218, + 255, 80, 69, 71, 71, - 240, 73, 65, 84, 79, - 134, + 12, 223, - 27, + 49, + 32, + 13, 52, 75, + 216, 69, - 176, 89, 63, - 62, + 31, 12, 12, 19, - 220, - 41, + 110, + 23, 104, 86, - 98, + 49, 97, - 18, + 9, 124, - 194, + 97, 205, - 134, - 145, - 11, + 92, + 44, + 23, 7, 78, - 132, 68, + 8, 229, - 7, 15, 15, - 183, + 15, 21, + 110, 20, 60, 83, - 109, + 219, 82, 69, - 128, 21, - 254, + 1, + 252, 7, 7, 22, 255, 5, 41, - 27, + 55, 229, 71, 84, - 201, 72, - 58, - 125, - 23, - 255, + 100, + 209, + 199, + 65, + 65, + 108, 6, - 177, - 62, + 0, + 20, + 47, + 2, + 129, + 35, + 67, + 141, 72, - 182, - 90, + 111, + 178, 78, - 87, - 75, - 251, - 188, + 108, + 67, + 16, + 120, 24, 255, 7, 0, - 36, - 187, - 63, + 72, + 208, + 127, 3, 3, 25, 255, 8, - 132, 27, - 133, - 45, - 220, + 8, + 154, + 91, 20, + 185, 26, 255, 9, - 128, - 120, + 0, + 240, 10, 30, - 66, - 229, - 221, + 133, + 250, + 187, 20, 27, - 254, 255, + 252, 11, 27, 83, 72, 73, 70, - 16, - 38, - 31, + 32, + 59, + 63, 5, 5, 28, 255, - 194, 12, + 141, 35, - 250, - 183, - 211, + 15, + 110, + 232, 82, 83, - 107, + 214, 43, 41, - 39, + 79, 29, 255, - 255, 13, + 254, 27, 80, 79, @@ -454,79 +466,81 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 89, 80, 72, - 109, - 214, + 216, + 235, 89, - 147, - 44, + 67, + 196, + 219, + 0, 11, - 110, 2, 81, + 182, 85, - 216, 167, 84, - 64, - 58, - 230, + 16, + 79, + 57, 42, - 237, + 184, 83, 79, 85, - 252, - 72, - 83, - 77, + 80, + 17, + 150, + 37, + 236, + 41, 39, - 190, - 2, - 14, 0, + 54, + 209, 70, 73, 209, 149, 130, - 57, + 78, 219, 52, 67, 220, 70, - 90, - 18, - 214, + 111, + 6, + 230, 2, 238, 225, 87, 32, - 178, + 199, 118, 82, 46, 20, - 6, - 25, - 238, + 18, + 21, + 172, 173, 51, 180, 100, 41, 35, - 153, + 174, 43, 117, - 20, + 2, 79, 212, 178, 87, 173, - 111, + 132, 44, 97, 41, @@ -551,102 +565,105 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 30, 77, 246, - 9, + 17, 133, 133, - 168, + 189, 194, 76, 65, - 233, + 254, 178, 212, 109, 13, - 32, - 198, + 30, + 246, 23, 1, - 176, - 178, + 255, + 77, 211, - 122, + 79, 83, 82, 67, - 100, - 109, - 128, - 110, - 199, + 76, + 130, + 144, + 131, + 24, 43, - 132, - 53, + 230, + 153, 170, - 169, + 181, 63, - 131, - 9, - 156, + 33, + 152, + 51, 44, - 40, + 133, 10, - 64, + 8, 31, - 99, + 12, 1, - 27, - 111, + 109, + 48, 45, + 237, 149, - 104, - 19, - 102, - 29, - 191, 19, + 176, + 0, + 0, + 189, + 255, 25, - 107, - 4, + 172, + 3, 95, - 1, - 165, + 6, 73, - 205, - 27, - 117, + 148, + 226, + 109, + 138, 84, - 96, - 32, - 112, + 129, + 224, + 195, 33, - 205, 31, + 54, 18, - 183, 77, + 220, 181, 73, 90, - 10, + 43, 150, - 193, 149, - 182, + 6, 8, - 74, + 216, + 23, 16, - 30, + 120, 148, 32, - 56, - 107, - 44, + 224, + 128, + 182, 91, 71, - 36, - 148, - 177, + 41, + 13, + 11, + 206, + 4, 74, 237, 32, @@ -677,7 +694,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 46, 165, 88, - 110, + 131, 107, 67, 20, @@ -700,9 +717,9 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 70, 87, 106, - 194, + 215, 78, - 101, + 122, 7, 219, 32, @@ -720,17 +737,17 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 66, 17, 41, - 143, + 164, 6, 52, 218, 20, 96, 90, - 122, + 143, 32, 240, - 187, + 208, 151, 85, 11, @@ -743,10 +760,10 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 106, 11, 195, + 100, + 174, 79, - 166, - 79, - 239, + 4, 15, 178, 58, @@ -757,7 +774,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 32, 7, 2, - 99, + 120, 44, 20, 14, @@ -768,190 +785,191 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 199, 152, 116, - 112, + 118, 6, - 182, - 65, + 242, + 216, 100, 41, - 44, + 176, 20, - 14, + 59, 54, - 219, 41, + 109, 100, 95, - 109, + 182, 80, 192, - 180, 71, + 208, 25, - 51, + 237, 215, 9, - 154, + 104, 223, - 4, - 124, - 183, + 18, + 145, + 221, 128, - 91, 49, + 109, 32, 90, - 125, + 246, 20, 73, - 139, 242, + 44, 245, - 6, + 24, 47, - 25, + 103, 10, - 238, 20, + 185, 246, - 97, + 135, 21, - 247, 17, + 220, 2, 48, 20, - 56, + 224, 74, - 53, + 213, 148, 83, - 103, - 154, + 159, + 175, 85, - 225, 82, 66, + 133, 79, 11, - 89, + 101, 224, - 123, + 237, 2, 255, 79, - 89, + 103, 20, - 201, 50, - 114, + 37, + 201, 3, - 72, - 107, + 33, 16, + 172, 58, 20, - 6, + 25, 55, - 104, + 161, 68, - 81, 106, - 205, + 71, 173, + 53, 42, - 100, + 147, 137, - 219, 4, + 108, 191, 84, - 6, - 173, - 47, + 24, + 194, + 188, 98, - 89, - 238, + 9, + 3, 182, 41, 56, 196, 191, - 38, + 32, 199, - 230, - 0, - 126, - 33, + 185, + 191, + 225, + 27, 235, 11, 194, 34, 0, 62, - 108, - 0, - 39, + 8, + 192, + 42, + 240, 36, 0, - 8, + 139, 179, - 182, 212, + 108, 71, - 192, 20, - 112, + 7, 37, 0, - 134, 8, - 192, + 8, + 108, 20, - 99, + 6, 35, + 50, 40, - 37, - 128, + 88, 20, - 222, + 13, 38, - 4, - 230, + 238, + 6, 39, + 110, 138, - 225, 65, 71, + 26, 247, - 173, 76, + 218, 71, - 172, 75, - 221, - 183, + 203, + 242, + 117, 170, - 82, 1, + 35, 44, - 61, 65, + 216, 85, 88, - 141, 32, - 83, - 159, + 133, + 14, + 99, 42, 97, + 217, 103, 101, - 101, - 35, - 195, + 66, + 119, 31, - 204, + 32, 178, 167, 194, @@ -959,112 +977,115 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 218, 65, 100, - 232, + 237, 124, 74, - 81, - 195, - 131, - 210, + 69, + 172, + 225, + 98, + 233, 25, - 72, 236, - 176, + 22, 19, - 148, - 214, - 2, + 74, + 65, + 131, + 140, 2, - 234, - 44, + 96, + 88, 203, - 46, + 93, 26, - 232, + 192, 161, - 65, - 214, - 147, - 131, - 129, - 54, - 82, - 52, - 176, - 186, - 236, + 213, + 25, + 173, + 162, + 46, + 10, + 50, + 13, + 247, + 96, + 20, + 216, 27, 126, - 5, - 147, + 11, 41, + 38, 29, - 72, + 144, 192, - 108, - 62, - 12, - 72, 216, - 176, + 62, + 29, + 30, + 236, + 4, 102, - 88, + 22, 137, - 65, - 186, - 4, + 16, + 110, + 6, + 141, 66, - 53, 170, - 131, - 15, + 72, + 128, + 56, 79, - 133, 83, + 88, 190, - 134, 80, + 97, 57, - 26, + 171, 56, - 146, - 173, - 91, + 46, + 13, + 220, 129, 68, - 198, 70, 85, + 98, 75, - 41, - 194, - 1, - 104, + 178, + 67, + 220, 171, - 245, + 61, 246, - 214, + 117, 59, 75, + 128, 20, - 3, + 197, 28, - 22, - 78, - 214, + 181, + 99, 88, + 172, 147, - 164, - 236, - 134, - 29, - 224, - 4, + 212, + 45, + 174, + 171, + 6, 0, 0, 0, 0, 0, - 79, + 4, + 255, 255, }; diff --git a/resource/menu_layouts.cpp b/resource/menu_layouts.cpp index d20aeec63..09d73b57b 100644 --- a/resource/menu_layouts.cpp +++ b/resource/menu_layouts.cpp @@ -15,12 +15,12 @@ menu_t boot_menu_layout = { "BOOT", { // m r n d p f o - {"OS UPGRADE", 0, 0, 0, 0, NULL_PAGE, 27, 0}, - {"DFU MODE", 0, 0, 0, 0, NULL_PAGE, 26, 0}, - {"USB DISK", 0, 0, 0, 0, NULL_PAGE, 28, 0}, - {"EXIT", 0, 0, 0, 0, NULL_PAGE, 29, 0}, + {"OS UPGRADE", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 27, 0}, + {"DFU MODE", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 26, 0}, + {"USB DISK", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 28, 0}, + {"EXIT", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 29, 0}, }, - 0, 0 + 0, NULL_PAGE }; @@ -28,55 +28,55 @@ menu_t start_menu_layout = { "PROJECT", { // m r n d p f o - {"LOAD PROJECT", 0, 0, 0, 0, LOAD_PROJ_PAGE, 0, 0}, - {"NEW PROJECT", 0, 0, 0, 0, NULL_PAGE, 2, 0}, + {"LOAD PROJECT", 0, NULL_PAGE, 0, NULL_PAGE, LOAD_PROJ_PAGE, 0, NULL_PAGE}, + {"NEW PROJECT", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 2, 0}, }, - 0, 0 + 0, NULL_PAGE }; menu_t system_menu_layout = { "CONFIG", { // m r n d p f o - {"LOAD PROJECT", 0, 0, 0, 0, LOAD_PROJ_PAGE, 0, 0}, - //{"CONV PROJECT", 0, 0, 0, 0, 2, 0, 0}, - {"NEW PROJECT", 0, 0, 0, 0, NULL_PAGE, 2, 0}, - {"MIDI", 0, 0, 0, 0, MIDI_CONFIG_PAGE, 0, 0}, - {"MACHINEDRUM", 0, 0, 0, 0, MD_CONFIG_PAGE, 0, 0}, - {"AUX PAGES", 0, 0, 0, 0, AUX_CONFIG_PAGE, 0, 0}, - {"SYSTEM", 0, 0, 0, 0, MCL_CONFIG_PAGE, 0, 0}, + {"LOAD PROJECT", 0, NULL_PAGE, 0, NULL_PAGE, LOAD_PROJ_PAGE, 0, NULL_PAGE}, + //{"CONV PROJECT", 0, NULL_PAGE, 0, NULL_PAGE, 2, 0, NULL_PAGE}, + {"NEW PROJECT", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 2, 0}, + {"MIDI", 0, NULL_PAGE, 0, NULL_PAGE, MIDI_CONFIG_PAGE, 0, NULL_PAGE}, + {"MACHINEDRUM", 0, NULL_PAGE, 0, NULL_PAGE, MD_CONFIG_PAGE, 0, NULL_PAGE}, + {"AUX PAGES", 0, NULL_PAGE, 0, NULL_PAGE, AUX_CONFIG_PAGE, 0, NULL_PAGE}, + {"SYSTEM", 0, NULL_PAGE, 0, NULL_PAGE, MCL_CONFIG_PAGE, 0, NULL_PAGE}, }, - 0, 0 + 0, NULL_PAGE }; menu_t auxconfig_menu_layout = { "AUX PAGES", { // m r n d p f o - {"RAM Page" ,0, 0, 0, 0, RAM_CONFIG_PAGE, 0, 0}, + {"RAM Page" ,0, 0, NULL_PAGE, 0, RAM_CONFIG_PAGE, 0, NULL_PAGE}, }, - 0, 0, + 0, NULL_PAGE, }; menu_t rampage1_menu_layout = { "RAM PAGE", { // m r n d p f o - {"LINK:", 0, 2, 2, 1, NULL_PAGE, 0, 0}, + {"LINK:", 0, 2, 2, 1, NULL_PAGE, 0, NULL_PAGE}, }, - 0, 0 + 0, NULL_PAGE }; menu_t midiconfig_menu_layout = { "MIDI", { - {"PORT CONFIG", 0, 0, 0, 0, MIDIPORT_MENU_PAGE, 0, 0}, - {"SYNC", 0, 0, 0, 0, MIDICLOCK_MENU_PAGE, 0, 0}, - {"ROUTING", 0, 0, 0, 0, MIDIROUTE_MENU_PAGE, 0, 0}, - {"PROGRAM", 0, 0, 0, 0, MIDIPROGRAM_MENU_PAGE, 0, 0}, - {"MD MIDI", 0, 0, 0, 0, MIDIMACHINEDRUM_MENU_PAGE, 0 ,0}, + {"PORT CONFIG", 0, NULL_PAGE, 0, NULL_PAGE, MIDIPORT_MENU_PAGE, 0, NULL_PAGE}, + {"SYNC", 0, NULL_PAGE, 0, NULL_PAGE, MIDICLOCK_MENU_PAGE, 0, NULL_PAGE}, + {"ROUTING", 0, NULL_PAGE, 0, NULL_PAGE, MIDIROUTE_MENU_PAGE, 0, NULL_PAGE}, + {"PROGRAM", 0, NULL_PAGE, 0, NULL_PAGE, MIDIPROGRAM_MENU_PAGE, 0, NULL_PAGE}, + {"MD MIDI", 0, NULL_PAGE, 0, NULL_PAGE, MIDIMACHINEDRUM_MENU_PAGE, 0 ,0}, }, - 0, 0 + 0, NULL_PAGE }; menu_t midiport_menu_layout = { @@ -88,7 +88,7 @@ menu_t midiport_menu_layout = { {"DRIVER 2:", 0, 2, 2, 4, 0, NULL_PAGE, 84}, {"CTRL PORT:", 1, 4, 4, 56, NULL_PAGE, 0, 100}, }, - 24, 0 + 24, NULL_PAGE }; menu_t midiprogram_menu_layout = { @@ -98,7 +98,7 @@ menu_t midiprogram_menu_layout = { {"PRG IN:", 0, 18, 2, 47, NULL_PAGE, 0, 88}, {"PRG OUT:", 0, 17, 2, 48, NULL_PAGE, 0, 88}, }, - 24, 0 + 24, NULL_PAGE }; @@ -110,7 +110,7 @@ menu_t midiclock_menu_layout = { {"CLOCK SEND:", 0, 4, 4, 6, 0, NULL_PAGE, 100}, {"TRANS SEND:", 0, 4, 4, 54, NULL_PAGE, 0, 100}, }, - 24, 0 + 24, NULL_PAGE }; menu_t midiroute_menu_layout = { @@ -124,7 +124,7 @@ menu_t midiroute_menu_layout = { {"CC LOOP:", 0, 2, 2, 11, NULL_PAGE, 0, 86}, }, - 24, 0 + 24, NULL_PAGE }; menu_t midimachinedrum_menu_layout = { @@ -135,7 +135,7 @@ menu_t midimachinedrum_menu_layout = { {"POLY CHAN:", 0, 18, 2, 46, NULL_PAGE, 0, 88}, {"TRIG CHAN:", 0, 18, 2, 57, NULL_PAGE, 0, 18}, }, - 24, 0 + 24, NULL_PAGE }; @@ -143,11 +143,11 @@ menu_t mdconfig_menu_layout = { "MD", { // m r n d p f o - {"IMPORT", 0, 0, 0, 0, MD_IMPORT_PAGE, 0, 0}, + {"IMPORT", 0, NULL_PAGE, 0, NULL_PAGE, MD_IMPORT_PAGE, 0, NULL_PAGE}, {"NORMALIZE:", 0, 2, 2, 8, NULL_PAGE, 0, 16}, - {"POLY CONFIG", 0, 0, 0, 0, POLY_PAGE, 0, 0}, + {"POLY CONFIG", 0, NULL_PAGE, 0, NULL_PAGE, POLY_PAGE, 0, NULL_PAGE}, }, - 0, 0 + 0, NULL_PAGE }; menu_t mdimport_menu_layout = { @@ -156,10 +156,10 @@ menu_t mdimport_menu_layout = { // m r n d p f o {"SRC: ", 0, 128, 128, 43, NULL_PAGE, 0, 128}, {"DEST: ", 0, 128, 128, 44, NULL_PAGE, 0, 128}, - {"COUNT:", 1, 128, 0, 45, NULL_PAGE, 0, 0}, + {"COUNT:", 1, 128, 0, 45, NULL_PAGE, 0, NULL_PAGE}, {"RUN", 0, 0, 0, 0, NULL_PAGE, 25, 0}, }, - 0, 0 + 0, NULL_PAGE }; menu_t mclconfig_menu_layout = { @@ -168,22 +168,22 @@ menu_t mclconfig_menu_layout = { // m r n d p f o {"DISPLAY:", 0, 2, 2, 13, NULL_PAGE, 0, 23}, }, - 1, 0 + 1, NULL_PAGE }; menu_t file_menu_layout = { "FILE", { // m r n d p f o - {"CANCEL", 0, 0, 0, 0, NULL_PAGE, 0, 0}, - {"NEW DIR.", 0, 0, 0, 0, NULL_PAGE, 0, 0}, - {"DELETE", 0, 0, 0, 0, NULL_PAGE, 0, 0}, - {"RENAME", 0, 0, 0, 0, NULL_PAGE, 0, 0}, - {"OVERWRITE", 0, 0, 0, 0, NULL_PAGE, 0, 0}, - {"RECV ALL", 0, 0, 0, 0, NULL_PAGE, 0, 0}, - {"SEND ALL", 0, 0, 0, 0, NULL_PAGE, 0, 0}, + {"CANCEL", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 0, NULL_PAGE}, + {"NEW DIR.", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 0, NULL_PAGE}, + {"DELETE", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 0, NULL_PAGE}, + {"RENAME", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 0, NULL_PAGE}, + {"OVERWRITE", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 0, NULL_PAGE}, + {"RECV ALL", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 0, NULL_PAGE}, + {"SEND ALL", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 0, NULL_PAGE}, }, - 0, 0 + 0, NULL_PAGE }; menu_t seq_menu_layout = { @@ -196,12 +196,13 @@ menu_t seq_menu_layout = { {"EDIT:", 0, 1 + NUM_LOCKS, 1, 16, NULL_PAGE, 0, 54}, {"CC:", 0, 133, 5, 17, NULL_PAGE, 0, 55}, {"SLIDE:", 0, 2, 2, 18, NULL_PAGE, 0, 25}, - {"ARPEGGIATOR", 0, 0, 0, 0, ARP_PAGE, 0, 0}, + {"ARPEGGIATOR", 0, NULL_PAGE, 0, 0, ARP_PAGE, 0, 0}, {"KEY:", 0, 12, 12, 19, NULL_PAGE, 0, 104}, {"VEL:", 0, 128, 0, 20, NULL_PAGE, 0, 0}, {"COND:", 1, NUM_TRIG_CONDITIONS + 1, NUM_TRIG_CONDITIONS + 1, 21, NULL_PAGE, 0, 60}, {"SPEED:", 0, 7, 7, 22, NULL_PAGE, 5, 41}, - {"LENGTH:", 1, 129, 0, 23, NULL_PAGE, 6, 0}, + {"LENGTH:", 1, 65, 0, 23, NULL_PAGE, 6, 0}, + {"LENGTH:", 2, 129, 0, 23, NULL_PAGE, 6, 0}, {"CHANNEL:", 1, 17, 0, 24, NULL_PAGE, 7, 0}, {"COPY: ", 0, 3, 3, 25, NULL_PAGE, 8, 27}, {"CLEAR:", 0, 3, 3, 26, NULL_PAGE, 9, 27}, @@ -209,11 +210,11 @@ menu_t seq_menu_layout = { {"PASTE:", 0, 3, 3, 27, NULL_PAGE, 11, 27}, {"SHIFT:", 0, 5, 5, 28, NULL_PAGE, 12, 35}, {"REVERSE:", 0, 3, 3, 29, NULL_PAGE, 13, 27}, - {"POLYPHONY", 0, 0, 0, 0, POLY_PAGE, 0, 0}, + {"POLYPHONY", 0, NULL_PAGE, 0, 0, POLY_PAGE, 0, 0}, {"QUANT:", 0, 2, 2, 42, NULL_PAGE, 0, 25}, - {"SOUND", 0, 0, 0, 0, SOUND_BROWSER, 0, 0}, + {"SOUND", 0, NULL_PAGE, 0, 0, SOUND_BROWSER, 0, 0}, }, - 14, 0 + 14, NULL_PAGE }; menu_t step_menu_layout = { @@ -221,11 +222,11 @@ menu_t step_menu_layout = { { // m r n d p f o {"CLEAR:", 0, 2, 2, 30, NULL_PAGE, 15, 30}, - {"COPY STEP", 0, 0, 0, 0, NULL_PAGE, 16, 0}, - {"PASTE STEP", 0, 0, 0, 0, NULL_PAGE, 17, 0}, - {"MUTE STEP", 0, 0, 0, 0, NULL_PAGE, 18, 0}, + {"COPY STEP", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 16, 0}, + {"PASTE STEP", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 17, 0}, + {"MUTE STEP", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 18, 0}, }, - 19, 0 + 19, NULL_PAGE }; menu_t slot_menu_layout = { @@ -247,9 +248,9 @@ menu_t slot_menu_layout = { {"CLEAR:", 0, 2, 2, 36, NULL_PAGE, 0, 33}, {"COPY: ", 0, 2, 2, 37, NULL_PAGE, 0, 33}, {"PASTE:", 0, 2, 2, 38, NULL_PAGE, 0, 33}, - {"RENAME", 0, 0, 0, 0, NULL_PAGE, 20, 0}, + {"RENAME", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 20, 0}, }, - 21, 0, + 21, NULL_PAGE }; menu_t wavdesign_menu_layout = { @@ -258,9 +259,9 @@ menu_t wavdesign_menu_layout = { // m r n d p f o {"EDIT:", 0, 4, 4, 40, NULL_PAGE, 0, 80}, {"WAV:", 0, 6, 6, 41, NULL_PAGE, 0, 74}, - {"TRANSFER", 0, 0, 0, 0, NULL_PAGE, 22, 0}, + {"TRANSFER", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 22, 0}, }, - 23, 0 + 23, NULL_PAGE }; menu_t perf_menu_layout = { @@ -269,9 +270,9 @@ menu_t perf_menu_layout = { // m r n d p f o {"CTRL SEL:",0, 4, 4, 59, NULL_PAGE, 0, 117}, - {"RENAME", 0, 0, 0, 0, NULL_PAGE, 30, 0}, + {"RENAME", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 30, 0}, // {"PARAM:", 0, 17, 1, 58, NULL_PAGE, 0, 116}, }, - 0, 0 + 0, NULL_PAGE }; From 02383e4ce84b765e896924c35d063c18be481643 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 16 Jul 2023 21:12:18 +1000 Subject: [PATCH 264/413] Don't allow empty lock setting, automation page --- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index dfb6b12f9..86f4d0986 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -1006,7 +1006,7 @@ bool SeqExtStepPage::handleEvent(gui_event_t *event) { bool clear = false; clear = active_track.del_track_locks(cur_x, lock_idx, lock_cur_y); - if (!clear) { + if (!clear && active_track.locks_params[lock_idx] - 1 > 0) { active_track.set_track_locks(step, utiming, active_track.locks_params[lock_idx] - 1, lock_cur_y, slide, lock_idx); From deebc98a142acf2cfb2b918d827e4a68a2d08d15 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 16 Jul 2023 21:26:26 +1000 Subject: [PATCH 265/413] regression --- resource/menu_layouts.cpp | 83 +++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 42 deletions(-) diff --git a/resource/menu_layouts.cpp b/resource/menu_layouts.cpp index 09d73b57b..d732c5d9a 100644 --- a/resource/menu_layouts.cpp +++ b/resource/menu_layouts.cpp @@ -15,10 +15,10 @@ menu_t boot_menu_layout = { "BOOT", { // m r n d p f o - {"OS UPGRADE", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 27, 0}, - {"DFU MODE", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 26, 0}, - {"USB DISK", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 28, 0}, - {"EXIT", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 29, 0}, + {"OS UPGRADE", 0, 0, 0, 0, NULL_PAGE, 27, 0}, + {"DFU MODE", 0, 0, 0, 0, NULL_PAGE, 26, 0}, + {"USB DISK", 0, 0, 0, 0, NULL_PAGE, 28, 0}, + {"EXIT", 0, 0, 0, 0, NULL_PAGE, 29, 0}, }, 0, NULL_PAGE }; @@ -28,8 +28,8 @@ menu_t start_menu_layout = { "PROJECT", { // m r n d p f o - {"LOAD PROJECT", 0, NULL_PAGE, 0, NULL_PAGE, LOAD_PROJ_PAGE, 0, NULL_PAGE}, - {"NEW PROJECT", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 2, 0}, + {"LOAD PROJECT", 0, 0, 0, 0, LOAD_PROJ_PAGE, 0, 0}, + {"NEW PROJECT", 0, 0, 0, 0, NULL_PAGE, 2, 0}, }, 0, NULL_PAGE }; @@ -38,13 +38,13 @@ menu_t system_menu_layout = { "CONFIG", { // m r n d p f o - {"LOAD PROJECT", 0, NULL_PAGE, 0, NULL_PAGE, LOAD_PROJ_PAGE, 0, NULL_PAGE}, - //{"CONV PROJECT", 0, NULL_PAGE, 0, NULL_PAGE, 2, 0, NULL_PAGE}, - {"NEW PROJECT", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 2, 0}, - {"MIDI", 0, NULL_PAGE, 0, NULL_PAGE, MIDI_CONFIG_PAGE, 0, NULL_PAGE}, - {"MACHINEDRUM", 0, NULL_PAGE, 0, NULL_PAGE, MD_CONFIG_PAGE, 0, NULL_PAGE}, - {"AUX PAGES", 0, NULL_PAGE, 0, NULL_PAGE, AUX_CONFIG_PAGE, 0, NULL_PAGE}, - {"SYSTEM", 0, NULL_PAGE, 0, NULL_PAGE, MCL_CONFIG_PAGE, 0, NULL_PAGE}, + {"LOAD PROJECT", 0, 0, 0, 0, LOAD_PROJ_PAGE, 0, 0}, + //{"CONV PROJECT", 0, 0, 0, 0, 2, 0, 0}, + {"NEW PROJECT", 0, 0, 0, 0, NULL_PAGE, 2, 0}, + {"MIDI", 0, 0, 0, 0, MIDI_CONFIG_PAGE, 0, 0}, + {"MACHINEDRUM", 0, 0, 0, 0, MD_CONFIG_PAGE, 0, 0}, + {"AUX PAGES", 0, 0, 0, 0, AUX_CONFIG_PAGE, 0, 0}, + {"SYSTEM", 0, 0, 0, 0, MCL_CONFIG_PAGE, 0, 0}, }, 0, NULL_PAGE }; @@ -53,16 +53,16 @@ menu_t auxconfig_menu_layout = { "AUX PAGES", { // m r n d p f o - {"RAM Page" ,0, 0, NULL_PAGE, 0, RAM_CONFIG_PAGE, 0, NULL_PAGE}, + {"RAM Page" ,0, 0, 0, 0, RAM_CONFIG_PAGE, 0, 0}, }, - 0, NULL_PAGE, + 0, NULL_PAGE }; menu_t rampage1_menu_layout = { "RAM PAGE", { // m r n d p f o - {"LINK:", 0, 2, 2, 1, NULL_PAGE, 0, NULL_PAGE}, + {"LINK:", 0, 2, 2, 1, NULL_PAGE, 0, 0}, }, 0, NULL_PAGE }; @@ -70,11 +70,11 @@ menu_t rampage1_menu_layout = { menu_t midiconfig_menu_layout = { "MIDI", { - {"PORT CONFIG", 0, NULL_PAGE, 0, NULL_PAGE, MIDIPORT_MENU_PAGE, 0, NULL_PAGE}, - {"SYNC", 0, NULL_PAGE, 0, NULL_PAGE, MIDICLOCK_MENU_PAGE, 0, NULL_PAGE}, - {"ROUTING", 0, NULL_PAGE, 0, NULL_PAGE, MIDIROUTE_MENU_PAGE, 0, NULL_PAGE}, - {"PROGRAM", 0, NULL_PAGE, 0, NULL_PAGE, MIDIPROGRAM_MENU_PAGE, 0, NULL_PAGE}, - {"MD MIDI", 0, NULL_PAGE, 0, NULL_PAGE, MIDIMACHINEDRUM_MENU_PAGE, 0 ,0}, + {"PORT CONFIG", 0, 0, 0, 0, MIDIPORT_MENU_PAGE, 0, 0}, + {"SYNC", 0, 0, 0, 0, MIDICLOCK_MENU_PAGE, 0, 0}, + {"ROUTING", 0, 0, 0, 0, MIDIROUTE_MENU_PAGE, 0, 0}, + {"PROGRAM", 0, 0, 0, 0, MIDIPROGRAM_MENU_PAGE, 0, 0}, + {"MD MIDI", 0, 0, 0, 0, MIDIMACHINEDRUM_MENU_PAGE, 0 ,0}, }, 0, NULL_PAGE }; @@ -138,14 +138,13 @@ menu_t midimachinedrum_menu_layout = { 24, NULL_PAGE }; - menu_t mdconfig_menu_layout = { "MD", { // m r n d p f o - {"IMPORT", 0, NULL_PAGE, 0, NULL_PAGE, MD_IMPORT_PAGE, 0, NULL_PAGE}, + {"IMPORT", 0, 0, 0, 0, MD_IMPORT_PAGE, 0, 0}, {"NORMALIZE:", 0, 2, 2, 8, NULL_PAGE, 0, 16}, - {"POLY CONFIG", 0, NULL_PAGE, 0, NULL_PAGE, POLY_PAGE, 0, NULL_PAGE}, + {"POLY CONFIG", 0, 0, 0, 0, POLY_PAGE, 0, 0}, }, 0, NULL_PAGE }; @@ -156,7 +155,7 @@ menu_t mdimport_menu_layout = { // m r n d p f o {"SRC: ", 0, 128, 128, 43, NULL_PAGE, 0, 128}, {"DEST: ", 0, 128, 128, 44, NULL_PAGE, 0, 128}, - {"COUNT:", 1, 128, 0, 45, NULL_PAGE, 0, NULL_PAGE}, + {"COUNT:", 1, 128, 0, 45, NULL_PAGE, 0, 0}, {"RUN", 0, 0, 0, 0, NULL_PAGE, 25, 0}, }, 0, NULL_PAGE @@ -175,13 +174,13 @@ menu_t file_menu_layout = { "FILE", { // m r n d p f o - {"CANCEL", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 0, NULL_PAGE}, - {"NEW DIR.", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 0, NULL_PAGE}, - {"DELETE", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 0, NULL_PAGE}, - {"RENAME", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 0, NULL_PAGE}, - {"OVERWRITE", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 0, NULL_PAGE}, - {"RECV ALL", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 0, NULL_PAGE}, - {"SEND ALL", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 0, NULL_PAGE}, + {"CANCEL", 0, 0, 0, 0, NULL_PAGE, 0, 0}, + {"NEW DIR.", 0, 0, 0, 0, NULL_PAGE, 0, 0}, + {"DELETE", 0, 0, 0, 0, NULL_PAGE, 0, 0}, + {"RENAME", 0, 0, 0, 0, NULL_PAGE, 0, 0}, + {"OVERWRITE", 0, 0, 0, 0, NULL_PAGE, 0, 0}, + {"RECV ALL", 0, 0, 0, 0, NULL_PAGE, 0, 0}, + {"SEND ALL", 0, 0, 0, 0, NULL_PAGE, 0, 0}, }, 0, NULL_PAGE }; @@ -196,12 +195,12 @@ menu_t seq_menu_layout = { {"EDIT:", 0, 1 + NUM_LOCKS, 1, 16, NULL_PAGE, 0, 54}, {"CC:", 0, 133, 5, 17, NULL_PAGE, 0, 55}, {"SLIDE:", 0, 2, 2, 18, NULL_PAGE, 0, 25}, - {"ARPEGGIATOR", 0, NULL_PAGE, 0, 0, ARP_PAGE, 0, 0}, + {"ARPEGGIATOR", 0, 0, 0, 0, ARP_PAGE, 0, 0}, {"KEY:", 0, 12, 12, 19, NULL_PAGE, 0, 104}, {"VEL:", 0, 128, 0, 20, NULL_PAGE, 0, 0}, {"COND:", 1, NUM_TRIG_CONDITIONS + 1, NUM_TRIG_CONDITIONS + 1, 21, NULL_PAGE, 0, 60}, {"SPEED:", 0, 7, 7, 22, NULL_PAGE, 5, 41}, - {"LENGTH:", 1, 65, 0, 23, NULL_PAGE, 6, 0}, + {"LENGTH:", 1, 65, 0, 23, NULL_PAGE, 6, 0}, {"LENGTH:", 2, 129, 0, 23, NULL_PAGE, 6, 0}, {"CHANNEL:", 1, 17, 0, 24, NULL_PAGE, 7, 0}, {"COPY: ", 0, 3, 3, 25, NULL_PAGE, 8, 27}, @@ -210,9 +209,9 @@ menu_t seq_menu_layout = { {"PASTE:", 0, 3, 3, 27, NULL_PAGE, 11, 27}, {"SHIFT:", 0, 5, 5, 28, NULL_PAGE, 12, 35}, {"REVERSE:", 0, 3, 3, 29, NULL_PAGE, 13, 27}, - {"POLYPHONY", 0, NULL_PAGE, 0, 0, POLY_PAGE, 0, 0}, + {"POLYPHONY", 0, 0, 0, 0, POLY_PAGE, 0, 0}, {"QUANT:", 0, 2, 2, 42, NULL_PAGE, 0, 25}, - {"SOUND", 0, NULL_PAGE, 0, 0, SOUND_BROWSER, 0, 0}, + {"SOUND", 0, 0, 0, 0, SOUND_BROWSER, 0, 0}, }, 14, NULL_PAGE }; @@ -222,9 +221,9 @@ menu_t step_menu_layout = { { // m r n d p f o {"CLEAR:", 0, 2, 2, 30, NULL_PAGE, 15, 30}, - {"COPY STEP", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 16, 0}, - {"PASTE STEP", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 17, 0}, - {"MUTE STEP", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 18, 0}, + {"COPY STEP", 0, 0, 0, 0, NULL_PAGE, 16, 0}, + {"PASTE STEP", 0, 0, 0, 0, NULL_PAGE, 17, 0}, + {"MUTE STEP", 0, 0, 0, 0, NULL_PAGE, 18, 0}, }, 19, NULL_PAGE }; @@ -248,7 +247,7 @@ menu_t slot_menu_layout = { {"CLEAR:", 0, 2, 2, 36, NULL_PAGE, 0, 33}, {"COPY: ", 0, 2, 2, 37, NULL_PAGE, 0, 33}, {"PASTE:", 0, 2, 2, 38, NULL_PAGE, 0, 33}, - {"RENAME", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 20, 0}, + {"RENAME", 0, 0, 0, 0, NULL_PAGE, 20, 0}, }, 21, NULL_PAGE }; @@ -259,7 +258,7 @@ menu_t wavdesign_menu_layout = { // m r n d p f o {"EDIT:", 0, 4, 4, 40, NULL_PAGE, 0, 80}, {"WAV:", 0, 6, 6, 41, NULL_PAGE, 0, 74}, - {"TRANSFER", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 22, 0}, + {"TRANSFER", 0, 0, 0, 0, NULL_PAGE, 22, 0}, }, 23, NULL_PAGE }; @@ -270,7 +269,7 @@ menu_t perf_menu_layout = { // m r n d p f o {"CTRL SEL:",0, 4, 4, 59, NULL_PAGE, 0, 117}, - {"RENAME", 0, NULL_PAGE, 0, NULL_PAGE, NULL_PAGE, 30, 0}, + {"RENAME", 0, 0, 0, 0, NULL_PAGE, 30, 0}, // {"PARAM:", 0, 17, 1, 58, NULL_PAGE, 0, 116}, }, 0, NULL_PAGE From db1387c34504aee5e2f63cd84333ae9b871d5c65 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 16 Jul 2023 23:37:38 +1000 Subject: [PATCH 266/413] Don't reset zoom. Fix page toggle on ext seq page --- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index 86f4d0986..72a203de2 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -47,6 +47,7 @@ void SeqExtStepPage::config_encoders() { seq_extparam2.cur = 64; + seq_extparam4.cur = 16; seq_extparam3.handler = NULL; seq_extparam3.cur = 64; fov_offset = 0; @@ -57,7 +58,6 @@ void SeqExtStepPage::config_encoders() { } - seq_extparam4.cur = 16; seq_extparam1.old = seq_extparam1.cur; seq_extparam2.old = seq_extparam2.cur; seq_extparam3.old = seq_extparam3.cur; @@ -890,12 +890,13 @@ bool SeqExtStepPage::handleEvent(gui_event_t *event) { if (event->mask == EVENT_BUTTON_RELEASED) { switch (key) { case MDX_KEY_SCALE: { - // seq_extparam4.cur = 16; - int diff = cur_x - fov_offset; - int a = timing_mid * 16; - fov_offset += a; + // seq_extparam4.cur = 16; + // + //int a = fov_length + int a = timing_mid * 16;// / active_track.get_speed_multiplier(); cur_x += a; - if (cur_x + cur_w > roll_length) { + if (cur_x > fov_offset + fov_length) { fov_offset += a; } + if (cur_x >= roll_length) { cur_x = cur_x - (cur_x / a ) * a; fov_offset = 0; } From 7dd5b4bcb20d04565170504dbc72734f28b8ea5a Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 16 Jul 2023 23:38:21 +1000 Subject: [PATCH 267/413] don't update speed unless we have to --- avr/cores/megacommand/MCL/SeqPage.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index b5709cd7b..cdc65251c 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -688,9 +688,12 @@ void opt_speed_handler() { GUI.ignoreNextEvent(Buttons.BUTTON4); } else { auto &active_track = mcl_seq.md_tracks[last_md_track]; - active_track.set_speed(opt_speed); - MD.sync_seqtrack(active_track.length, active_track.speed, - active_track.step_count); + uint8_t last_speed = active_track.speed; + if (opt_speed != last_speed) { + active_track.set_speed(opt_speed); + MD.sync_seqtrack(active_track.length, active_track.speed, + active_track.step_count); + } } seq_step_page.config_encoders(); } @@ -702,8 +705,11 @@ void opt_speed_handler() { } GUI.ignoreNextEvent(Buttons.BUTTON4); } else { - mcl_seq.ext_tracks[last_ext_track].set_speed(opt_speed); - seq_extstep_page.config_encoders(); + uint8_t last_speed = mcl_seq.ext_tracks[last_ext_track].speed; + if (opt_speed != last_speed) { + mcl_seq.ext_tracks[last_ext_track].set_speed(opt_speed); + seq_extstep_page.config_encoders(); + } } } #endif From a731ee6edc4182b5b2d0c2824d6c3f2736fea2fd Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 16 Jul 2023 23:50:47 +1000 Subject: [PATCH 268/413] LFO seq_track to use uart2 side channel --- avr/cores/megacommand/MCL/LFOSeqTrack.cpp | 4 ++-- avr/cores/megacommand/MCL/LFOSeqTrack.h | 2 +- avr/cores/megacommand/MCL/MCLSeq.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/avr/cores/megacommand/MCL/LFOSeqTrack.cpp b/avr/cores/megacommand/MCL/LFOSeqTrack.cpp index ef85204d0..907f63bb0 100644 --- a/avr/cores/megacommand/MCL/LFOSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/LFOSeqTrack.cpp @@ -71,7 +71,7 @@ uint8_t LFOSeqTrack::get_wav_value(uint8_t sample_count, uint8_t dest, uint8_t p return (uint8_t) sample; } -void LFOSeqTrack::seq(MidiUartParent *uart_) { +void LFOSeqTrack::seq(MidiUartParent *uart_, MidiUartParent *uart2_) { MidiUartParent *uart_old = uart; uart = uart_; @@ -88,7 +88,7 @@ void LFOSeqTrack::seq(MidiUartParent *uart_) { if (dest >= NUM_MD_TRACKS + 4) { uint8_t channel = dest - (NUM_MD_TRACKS + 4); - MidiUart2.sendCC(channel, param, wav_value); + uart2_->sendCC(channel, param, wav_value); } else if (dest >= NUM_MD_TRACKS) { MD.sendFXParam(param, wav_value, MD_FX_ECHO + dest - NUM_MD_TRACKS, uart); diff --git a/avr/cores/megacommand/MCL/LFOSeqTrack.h b/avr/cores/megacommand/MCL/LFOSeqTrack.h index c2eae775e..5157c9393 100644 --- a/avr/cores/megacommand/MCL/LFOSeqTrack.h +++ b/avr/cores/megacommand/MCL/LFOSeqTrack.h @@ -89,7 +89,7 @@ class LFOSeqTrack : public LFOSeqTrackData { params[param].depth = depth; } void load_wav_table(uint8_t table); - ALWAYS_INLINE() void seq(MidiUartParent *uart_); + ALWAYS_INLINE() void seq(MidiUartParent *uart_, MidiUartParent *uart2_); }; #endif /* LFOSEQTRACK_H__ */ diff --git a/avr/cores/megacommand/MCL/MCLSeq.cpp b/avr/cores/megacommand/MCL/MCLSeq.cpp index 96e2bc3c8..75f655e01 100644 --- a/avr/cores/megacommand/MCL/MCLSeq.cpp +++ b/avr/cores/megacommand/MCL/MCLSeq.cpp @@ -267,7 +267,7 @@ void MCLSeq::seq() { #ifdef LFO_TRACKS for (uint8_t i = 0; i < num_lfo_tracks; i++) { - lfo_tracks[i].seq(uart); + lfo_tracks[i].seq(uart, uart2); } #endif From 4991ef6074e7d6baf982428e97728071afa622c0 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 17 Jul 2023 12:26:52 +1000 Subject: [PATCH 269/413] LFOSeqTrack/Page offset for MIDI --- avr/cores/megacommand/MCL/LFOPage.cpp | 101 ++- avr/cores/megacommand/MCL/LFOPage.h | 2 +- avr/cores/megacommand/MCL/LFOSeqTrack.cpp | 10 +- avr/cores/megacommand/MCL/MCL.h | 2 +- .../megacommand/resources/R_menu_layouts.cpp | 635 +++++++++--------- 5 files changed, 405 insertions(+), 345 deletions(-) diff --git a/avr/cores/megacommand/MCL/LFOPage.cpp b/avr/cores/megacommand/MCL/LFOPage.cpp index ae54bd90e..b56c24453 100644 --- a/avr/cores/megacommand/MCL/LFOPage.cpp +++ b/avr/cores/megacommand/MCL/LFOPage.cpp @@ -6,6 +6,7 @@ #define INTERPOLATE #define DIV_1_127 .0079 +#define LFO_OFFSET 2 #define LFO_DESTINATION 1 #define LFO_SETTINGS 0 @@ -63,7 +64,7 @@ void LFOPage::config_encoders() { config_encoder_range(0); config_encoder_range(2); } - if (page_mode == LFO_SETTINGS) { + else if (page_mode == LFO_SETTINGS) { encoders[0]->cur = waveform; ((MCLEncoder *)encoders[0])->max = 5; @@ -76,6 +77,14 @@ void LFOPage::config_encoders() { encoders[3]->cur = lfo_track->params[1].depth; ((MCLEncoder *)encoders[3])->max = 127; } + else if (page_mode == LFO_OFFSET) { + encoders[2]->cur = lfo_track->params[0].offset; + ((MCLEncoder *)encoders[2])->max = 127; + + encoders[3]->cur = lfo_track->params[1].offset; + ((MCLEncoder *)encoders[3])->max = 127; + } + // loop(); init_encoders_used_clock(); @@ -119,7 +128,7 @@ void LFOPage::loop() { } // wav_tables need to be recalculated when depth or waveform changes. - if (page_mode == LFO_SETTINGS) { + else if (page_mode == LFO_SETTINGS) { if (encoders[0]->hasChanged()) { lfo_track->set_wav_type(encoders[0]->cur); } @@ -137,6 +146,22 @@ void LFOPage::loop() { } } + else if (page_mode == LFO_OFFSET) { + if (encoders[2]->hasChanged()) { + if (lfo_track->params[0].dest > NUM_MD_TRACKS + 4) { + lfo_track->params[0].offset = encoders[2]->cur; + } + else { encoders[2]->cur = encoders[2]->old; } + } + + if (encoders[3]->hasChanged()) { + if (lfo_track->params[1].dest > NUM_MD_TRACKS + 4) { + lfo_track->params[1].offset = encoders[3]->cur; + } + else { encoders[3]->cur = encoders[3]->old; } + } + } + } void LFOPage::display() { @@ -154,14 +179,18 @@ void LFOPage::display() { // mcl_gui.draw_vertical_dashline(x, 0, knob_y); SeqPage::draw_knob_frame(); + const char *info1; + const char *info2; + if (page_mode == LFO_DESTINATION) { draw_dest(0, encoders[0]->cur); draw_param(1, encoders[0]->cur, encoders[1]->cur); draw_dest(2, encoders[2]->cur); draw_param(3, encoders[2]->cur, encoders[3]->cur); + info2 = "LFO>DST"; } - if (page_mode == LFO_SETTINGS) { + else if (page_mode == LFO_SETTINGS) { uint8_t inc = LFO_LENGTH / width; for (uint8_t n = 0; n < LFO_LENGTH; n += inc, x++) { if (n < LFO_LENGTH) { @@ -181,7 +210,6 @@ void LFOPage::display() { oled_display.drawPixel(x, y + lfo_height - sample, WHITE); } } - x = mcl_gui.knob_x0 + 2; oled_display.setCursor(x + 5, 6); oled_display.print(F("WAV")); @@ -189,16 +217,15 @@ void LFOPage::display() { draw_knob(1, encoders[1], "SPD"); draw_knob(2, encoders[2], "DEP1"); draw_knob(3, encoders[3], "DEP2"); - } - oled_display.setFont(&TomThumb); - const char *info1; - const char *info2; - - if (page_mode) { - info2 = "LFO>DST"; - } else { info2 = "LFO>MOD"; } + else if (page_mode == LFO_OFFSET) { + draw_knob(2, encoders[2], "PAR1"); + draw_knob(3, encoders[3], "PAR2"); + info2 = "LFO>OFFSET"; + } + + oled_display.setFont(&TomThumb); const uint64_t slide_mask = 0; const uint64_t mute_mask = 0; @@ -232,18 +259,30 @@ void LFOPage::display() { } void LFOPage::learn_param(uint8_t track, uint8_t param, uint8_t value) { + bool reconfig = false; if (mcl.currentPage() == LFO_PAGE) { if (page_mode == LFO_DESTINATION) { if (encoders[0]->cur == 0 && encoders[1]->cur > 0) { - encoders[0]->cur = track + 1; - encoders[1]->cur = param; + lfo_track->params[0].dest = track + 1; + lfo_track->params[0].param = param; + reconfig = true; } if (encoders[2]->cur == 0 && encoders[3]->cur > 0) { - encoders[2]->cur = track + 1; - encoders[3]->cur = param; + lfo_track->params[1].dest = track + 1; + lfo_track->params[1].param = param; + reconfig = true; } } } + if (lfo_track->params[0].dest - 1 == track && lfo_track->params[0].param == param) { + lfo_track->params[0].offset = value; + reconfig = true; + } + if (lfo_track->params[1].dest - 1 == track && lfo_track->params[0].param == param) { + lfo_track->params[1].offset = value; + reconfig = true; + } + if (reconfig) { config_encoders(); } } @@ -275,15 +314,31 @@ bool LFOPage::handleEvent(gui_event_t *event) { } } } - /* if (EVENT_PRESSED(event, Buttons.ENCODER1) || - EVENT_PRESSED(event, Buttons.ENCODER2) || - EVENT_PRESSED(event, Buttons.ENCODER3) || - EVENT_PRESSED(event, Buttons.ENCODER4)) { - mcl.setPage(GRID_PAGE); + if (EVENT_CMD(event)) { + uint8_t key = event->source - 64; + if (event->mask == EVENT_BUTTON_PRESSED) { + switch (key) { + case MDX_KEY_UP: { + if (page_mode < LFO_OFFSET) { + page_mode++; + config_encoders(); + } + return true; + } + case MDX_KEY_DOWN: { + if (page_mode > 0) { + page_mode--; + config_encoders(); + } + return true; + } + } } - */ + } + if (EVENT_PRESSED(event, Buttons.BUTTON4)) { - page_mode = !(page_mode); + page_mode++; + if (page_mode > LFO_OFFSET) { page_mode = 0; } config_encoders(); } diff --git a/avr/cores/megacommand/MCL/LFOPage.h b/avr/cores/megacommand/MCL/LFOPage.h index e176b9ec4..f026005a9 100644 --- a/avr/cores/megacommand/MCL/LFOPage.h +++ b/avr/cores/megacommand/MCL/LFOPage.h @@ -30,7 +30,7 @@ class LFOPage : public SeqPage, PerfPageParent { bool handleEvent(gui_event_t *event); bool midi_state = false; - bool page_mode; + uint8_t page_mode; uint8_t page_id; LFOSeqTrack *lfo_track; diff --git a/avr/cores/megacommand/MCL/LFOSeqTrack.cpp b/avr/cores/megacommand/MCL/LFOSeqTrack.cpp index 907f63bb0..f813cdc23 100644 --- a/avr/cores/megacommand/MCL/LFOSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/LFOSeqTrack.cpp @@ -143,7 +143,7 @@ void LFOSeqTrack::seq(MidiUartParent *uart_, MidiUartParent *uart2_) { uint8_t LFOSeqTrack::get_param_offset(uint8_t dest, uint8_t param) { if (dest < NUM_MD_TRACKS) { return MD.kit.params[dest][param]; - } else { + } else if (dest < NUM_MD_TRACKS + 4) { switch (dest - NUM_MD_TRACKS) { case MD_FX_ECHO - MD_FX_ECHO: return MD.kit.delay[param]; @@ -160,5 +160,13 @@ uint8_t LFOSeqTrack::get_param_offset(uint8_t dest, uint8_t param) { break; } } + else { + if (dest == params[0].dest - 1 && params[0].param == param) { + return params[0].offset; + } + if (dest == params[1].dest - 1 && params[1].param == param) { + return params[1].offset; + } + } return 255; } diff --git a/avr/cores/megacommand/MCL/MCL.h b/avr/cores/megacommand/MCL/MCL.h index c18175f44..d40364a8f 100644 --- a/avr/cores/megacommand/MCL/MCL.h +++ b/avr/cores/megacommand/MCL/MCL.h @@ -17,7 +17,7 @@ #include "Fonts/TomThumb.h" #define VERSION 4050 -#define VERSION_STR "KK4.50" +#define VERSION_STR "LL4.50" #define CALLBACK_TIMEOUT 500 #define GUI_NAME_TIMEOUT 800 diff --git a/avr/cores/megacommand/resources/R_menu_layouts.cpp b/avr/cores/megacommand/resources/R_menu_layouts.cpp index 68113a54f..ae0de47a2 100644 --- a/avr/cores/megacommand/resources/R_menu_layouts.cpp +++ b/avr/cores/megacommand/resources/R_menu_layouts.cpp @@ -27,300 +27,296 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 82, 69, 78, - 236, + 246, 65, 77, 69, - 35, - 155, - 255, - 1, - 119, + 0, + 0, + 3, 255, + 185, 30, - 6, - 50, - 53, - 253, + 3, + 151, + 14, 69, + 236, 68, 73, 84, - 155, 49, + 216, 53, - 6, + 54, 40, - 223, 28, + 253, 80, 87, 65, 86, - 96, - 19, - 62, - 0, + 58, + 128, + 50, + 246, 6, 6, 41, - 219, 20, + 219, 74, 94, - 127, 65, + 251, 78, 83, 70, 69, 82, - 96, 74, - 63, + 1, + 255, 22, 0, 23, 255, 83, - 236, 108, 111, 116, - 17, - 255, + 103, + 14, 71, + 251, 82, 73, 68, 58, 32, - 100, - 53, - 246, + 29, + 39, 2, 2, + 183, 31, - 35, - 253, + 53, 52, 77, + 236, 79, 68, 69, - 151, 75, + 191, 1, - 237, 4, 3, 32, + 110, 20, - 218, 20, 76, - 149, 214, + 149, 40, + 181, 0, - 176, + 135, 20, - 251, 65, + 220, 0, 39, 145, - 153, + 200, 20, - 12, + 100, 129, - 159, + 251, 79, 79, 80, - 96, 83, - 61, + 1, + 238, 64, 0, 33, - 220, 20, + 228, 74, 85, 77, - 129, - 251, + 15, 128, 128, + 219, 34, 255, 4, - 109, 67, + 111, 63, - 236, 65, 82, 58, + 96, 125, - 7, + 59, 36, 255, - 109, 44, + 109, 67, - 183, 61, + 185, 89, 84, - 50, + 151, 20, - 230, 37, - 251, + 55, 80, 65, 83, + 216, 84, 69, 41, - 3, - 184, + 29, 38, + 193, 20, - 32, 40, - 15, + 0, + 125, 20, 0, 21, - 182, 255, + 176, 41, 80, - 16, + 130, 94, - 89, + 202, 95, - 79, + 124, 30, 255, 15, - 158, 30, + 247, 32, - 235, 77, + 89, 80, 53, - 47, + 123, 16, 0, - 98, 95, - 193, + 22, 21, - 96, - 20, - 251, + 19, + 255, + 246, 17, 0, 77, 85, 19, - 89, + 178, 41, - 15, + 30, 18, 0, 19, - 110, + 221, 95, 69, 81, - 193, - 80, - 13, + 130, + 14, + 27, 94, 67, - 132, 75, + 9, 191, - 155, + 54, 1, 49, - 124, + 248, 14, 255, 3, 0, - 47, + 94, 59, 86, 73, 67, - 100, + 201, 171, - 251, + 247, 1, 3, 2, 50, 233, - 130, + 4, 178, - 83, + 167, 15, - 236, 255, + 217, 4, 48, 20, - 135, + 15, 9, 1, - 183, 16, + 111, 41, 54, 67, - 132, 67, - 198, - 15, - 0, + 176, + 58, + 209, + 62, 133, - 219, 5, 17, + 222, 20, 55, - 194, 83, 76, + 21, 166, - 176, + 132, 254, - 155, + 219, 18, 20, - 109, 25, + 111, 218, - 255, 80, 69, 71, + 248, 71, 73, 65, 84, 79, - 12, + 67, 223, - 49, - 32, 13, 52, 75, @@ -333,7 +329,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 12, 19, 110, - 23, + 41, 104, 86, 49, @@ -342,284 +338,283 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 124, 97, 205, - 92, - 44, - 23, + 67, + 145, + 5, 7, + 194, 78, 68, - 8, 229, + 3, 15, - 15, + 219, 15, 21, - 110, 20, 60, + 182, 83, - 219, 82, 69, + 192, 21, - 1, - 252, + 127, 7, 7, 22, 255, 5, 41, - 55, + 13, 229, 71, + 217, 84, 72, - 100, 209, - 199, + 49, 65, + 219, 65, - 108, 6, 0, 20, - 47, + 11, + 200, 2, 129, - 35, + 227, 67, - 141, 72, 111, - 178, + 108, 78, 108, - 67, + 144, + 222, 16, - 120, 24, 255, 7, 0, - 72, + 18, 208, - 127, + 31, 3, 3, 25, 255, + 194, 8, 27, - 8, 154, - 91, + 22, + 238, 20, - 185, 26, 255, 9, - 0, - 240, + 64, + 60, 10, 30, - 133, + 33, 250, - 187, + 110, 20, + 255, 27, 255, - 252, 11, 27, 83, 72, 73, 70, - 32, + 8, 59, - 63, + 15, 5, 5, 28, + 227, 255, 12, - 141, 35, 15, - 110, + 91, 232, 82, + 181, 83, - 214, 43, + 147, 41, - 79, 29, 255, + 255, 13, - 254, 27, 80, 79, 76, 89, 80, + 182, 72, - 216, 235, 89, - 67, - 196, - 219, - 0, + 201, + 44, + 183, 11, 2, 81, - 182, 85, + 108, 167, 84, - 16, + 32, 79, - 57, + 115, 42, - 184, + 112, 83, 79, 85, - 80, + 161, 17, - 150, - 37, - 236, - 41, - 39, + 123, + 3, + 27, + 205, 0, - 54, + 13, 209, 70, + 180, 73, - 209, 149, - 130, + 96, 78, - 219, + 182, 52, 67, + 209, 220, - 70, + 132, 111, - 6, - 230, + 181, 2, + 184, 238, - 225, 87, 32, + 93, 199, - 118, 82, 46, + 129, 20, - 18, - 21, - 172, - 173, + 142, + 3, + 107, 51, 180, - 100, + 89, 41, - 35, + 8, + 202, 174, - 43, - 117, - 2, + 221, + 20, 79, - 212, + 117, 178, 87, - 173, + 43, 132, 44, - 97, + 88, 41, - 127, + 95, 67, 86, 32, + 228, 65, 76, - 144, 76, - 150, + 37, + 173, 216, - 181, 157, - 148, + 100, 20, - 186, - 22, + 110, + 3, + 195, + 83, 89, - 26, 30, - 77, - 246, - 17, - 133, + 94, + 77, + 14, + 208, 133, + 184, 189, - 194, 76, 65, + 86, 254, - 178, 212, - 109, + 77, 13, - 30, - 246, + 190, + 32, 23, 1, 255, 77, + 201, 211, - 79, + 233, 83, 82, 67, - 76, 130, - 144, + 146, 131, - 24, + 3, 43, - 230, + 28, 153, + 214, 170, - 181, 63, - 33, + 164, 152, - 51, + 38, 44, - 133, + 112, + 161, 10, - 8, 31, - 12, 1, - 109, + 141, + 1, 48, + 189, 45, - 237, 149, + 161, 19, - 176, - 0, - 0, - 189, - 255, + 29, + 152, + 191, + 77, 25, 172, 3, @@ -632,7 +627,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 138, 84, 129, - 224, + 32, 195, 33, 31, @@ -649,62 +644,60 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 6, 8, 216, - 23, + 74, 16, 120, 148, 32, 224, 128, - 182, + 176, 91, 71, - 41, - 13, - 11, - 206, - 4, + 146, + 148, + 199, 74, - 237, 32, 77, + 180, 73, 198, - 15, + 63, 106, 72, - 227, 82, 79, + 143, 32, 77, - 217, + 103, 53, - 251, 18, + 237, 2, 9, 255, 4, - 94, + 123, 53, - 194, 20, - 101, + 9, + 150, 46, - 165, 88, + 149, 131, - 107, + 172, 67, 20, - 9, - 186, + 38, 57, + 225, 41, - 24, - 214, - 172, + 182, + 118, + 82, 193, 132, 83, @@ -902,142 +895,146 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 27, 235, 11, - 194, + 142, 34, - 0, + 138, + 12, 62, - 8, - 192, - 42, - 240, + 48, + 75, + 184, 36, - 0, - 139, - 179, + 231, + 96, + 188, + 54, 212, - 108, 71, + 192, 20, - 7, + 109, 37, - 0, + 254, 8, 8, - 108, + 44, 20, 6, 35, - 50, + 20, + 211, + 96, 40, - 88, + 176, 20, - 13, + 24, 38, - 238, - 6, + 247, + 63, 39, - 110, + 55, 138, 65, 71, - 26, + 13, 247, 76, - 218, + 109, 71, 75, - 203, + 101, 242, - 117, + 186, 170, 1, - 35, + 145, 44, + 236, 65, - 216, 85, 88, 32, - 133, + 66, 14, - 99, + 177, 42, + 236, 97, - 217, 103, 101, - 66, - 119, + 35, + 187, 31, 32, - 178, + 217, 167, - 194, + 97, 171, - 218, + 109, 65, 100, - 237, + 116, 124, 74, - 69, - 172, - 225, - 98, - 233, + 40, + 195, + 193, + 210, + 164, 25, 236, - 22, + 88, 19, - 74, - 65, - 131, - 140, + 75, + 49, + 163, 2, 96, - 88, + 22, 203, - 93, + 23, 26, - 192, + 116, 161, - 213, - 25, - 173, - 162, - 46, - 10, - 50, - 13, - 247, - 96, - 20, - 216, + 65, + 107, + 147, + 131, + 64, + 169, + 75, + 52, + 88, + 186, + 118, 27, + 2, + 178, 126, - 11, + 89, 41, - 38, + 48, 29, - 144, + 169, + 10, 192, - 216, + 54, 62, - 29, + 7, 30, - 236, - 4, + 123, + 87, 102, - 22, + 5, + 132, 137, - 16, - 110, - 6, - 141, + 27, + 3, + 163, 66, 170, - 72, - 128, + 88, + 15, 56, 79, 83, @@ -1046,40 +1043,40 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 80, 97, 57, - 171, + 169, 56, - 46, - 13, - 220, + 173, + 37, + 188, 129, 68, 70, 85, 98, 75, - 178, - 67, - 220, + 144, + 194, + 22, 171, - 61, + 143, 246, - 117, + 93, 59, 75, - 128, + 96, 20, - 197, + 49, 28, - 181, + 109, 99, 88, - 172, + 106, 147, - 212, - 45, - 174, - 171, - 6, + 72, + 236, + 110, + 29, + 3, 0, 0, 0, From b32804bb0e0db5a0a75c87be1e18abf9a87e4679 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 17 Jul 2023 23:42:09 +1000 Subject: [PATCH 270/413] MIDI LFOs now working --- avr/cores/megacommand/MCL/LFOPage.cpp | 2 +- avr/cores/megacommand/MCL/LFOSeqTrack.cpp | 13 ++++--------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/avr/cores/megacommand/MCL/LFOPage.cpp b/avr/cores/megacommand/MCL/LFOPage.cpp index b56c24453..85dd0f55c 100644 --- a/avr/cores/megacommand/MCL/LFOPage.cpp +++ b/avr/cores/megacommand/MCL/LFOPage.cpp @@ -222,7 +222,7 @@ void LFOPage::display() { else if (page_mode == LFO_OFFSET) { draw_knob(2, encoders[2], "PAR1"); draw_knob(3, encoders[3], "PAR2"); - info2 = "LFO>OFFSET"; + info2 = "LFO>PAR"; } oled_display.setFont(&TomThumb); diff --git a/avr/cores/megacommand/MCL/LFOSeqTrack.cpp b/avr/cores/megacommand/MCL/LFOSeqTrack.cpp index f813cdc23..f61ce95cb 100644 --- a/avr/cores/megacommand/MCL/LFOSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/LFOSeqTrack.cpp @@ -81,6 +81,7 @@ void LFOSeqTrack::seq(MidiUartParent *uart_, MidiUartParent *uart2_) { } if (enable) { for (uint8_t i = 0; i < NUM_LFO_PARAMS; i++) { + if (params[i].dest == 0) { continue; } uint8_t dest = params[i].dest - 1; uint8_t wav_value = get_wav_value(sample_count, dest, i); if (last_wav_value[i] != wav_value) { @@ -93,7 +94,7 @@ void LFOSeqTrack::seq(MidiUartParent *uart_, MidiUartParent *uart2_) { MD.sendFXParam(param, wav_value, MD_FX_ECHO + dest - NUM_MD_TRACKS, uart); } else { - MD.setTrackParam_inline(dest, param, wav_value, uart); + MD.setTrackParam(dest, param, wav_value, uart); } last_wav_value[i] = wav_value; @@ -151,7 +152,6 @@ uint8_t LFOSeqTrack::get_param_offset(uint8_t dest, uint8_t param) { case MD_FX_DYN - MD_FX_ECHO: return MD.kit.dynamics[param]; break; - case MD_FX_REV - MD_FX_ECHO: return MD.kit.reverb[param]; break; @@ -160,13 +160,8 @@ uint8_t LFOSeqTrack::get_param_offset(uint8_t dest, uint8_t param) { break; } } - else { - if (dest == params[0].dest - 1 && params[0].param == param) { - return params[0].offset; - } - if (dest == params[1].dest - 1 && params[1].param == param) { - return params[1].offset; - } + else if (param < 2) { + return params[param].offset; } return 255; } From 9976f69ab3afd1418434d4369212f873afca9acd Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 17 Jul 2023 23:55:44 +1000 Subject: [PATCH 271/413] LFO Page and LFOSeqTrack init --- avr/cores/megacommand/MCL/LFOPage.cpp | 6 +++--- avr/cores/megacommand/MCL/LFOSeqTrack.h | 3 +-- avr/cores/megacommand/MCL/MCLSeq.cpp | 8 +------- 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/avr/cores/megacommand/MCL/LFOPage.cpp b/avr/cores/megacommand/MCL/LFOPage.cpp index 85dd0f55c..60eab8f76 100644 --- a/avr/cores/megacommand/MCL/LFOPage.cpp +++ b/avr/cores/megacommand/MCL/LFOPage.cpp @@ -220,9 +220,9 @@ void LFOPage::display() { info2 = "LFO>MOD"; } else if (page_mode == LFO_OFFSET) { - draw_knob(2, encoders[2], "PAR1"); - draw_knob(3, encoders[3], "PAR2"); - info2 = "LFO>PAR"; + draw_knob(2, encoders[2], "OFS1"); + draw_knob(3, encoders[3], "OFS2"); + info2 = "LFO>OFS"; } oled_display.setFont(&TomThumb); diff --git a/avr/cores/megacommand/MCL/LFOSeqTrack.h b/avr/cores/megacommand/MCL/LFOSeqTrack.h index 5157c9393..56b5a3975 100644 --- a/avr/cores/megacommand/MCL/LFOSeqTrack.h +++ b/avr/cores/megacommand/MCL/LFOSeqTrack.h @@ -41,7 +41,6 @@ class LFOSeqTrackData { uint8_t last_wav_value[NUM_LFO_PARAMS]; uint8_t sample_hold; //<--- shouldnt be stored here; - uint8_t speed; uint8_t mode; uint8_t offset_behaviour; //<--- no longer needed @@ -57,7 +56,7 @@ class LFOSeqTrackData { length = 16; for (uint8_t a = 0; a < NUM_LFO_PARAMS; a++) { last_wav_value[a] = 255; - params[a].dest = 255; + params[a].dest = 0; } } }; diff --git a/avr/cores/megacommand/MCL/MCLSeq.cpp b/avr/cores/megacommand/MCL/MCLSeq.cpp index 75f655e01..50262fd5b 100644 --- a/avr/cores/megacommand/MCL/MCLSeq.cpp +++ b/avr/cores/megacommand/MCL/MCLSeq.cpp @@ -13,16 +13,10 @@ void MCLSeq::setup() { } #ifdef LFO_TRACKS - lfo_tracks[0].load_tables(); + lfo_tracks[0].load_tables(); //Only needs to be done once for (uint8_t i = 0; i < num_lfo_tracks; i++) { lfo_tracks[i].track_number = i; - if (i == 0) { - lfo_tracks[i].params[0].dest = 17; - lfo_tracks[i].params[1].dest = 18; - lfo_tracks[i].params[0].param = 7; - lfo_tracks[i].params[1].param = 7; - } } #endif #ifdef EXT_TRACKS From 7e22abd5437edaee883368561fa608792c6bbd97 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 18 Jul 2023 15:30:03 +1000 Subject: [PATCH 272/413] GIF reset behaviour, only if not active --- avr/cores/megacommand/MCL/MCLGfx.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCLGfx.h b/avr/cores/megacommand/MCL/MCLGfx.h index 8b690d090..0141e761a 100644 --- a/avr/cores/megacommand/MCL/MCLGfx.h +++ b/avr/cores/megacommand/MCL/MCLGfx.h @@ -28,8 +28,10 @@ class MCLGIF { uint16_t last_frame_clock; uint8_t *bitmap; void reset() { - inc = 1; - cur_frame = 0; + if (inc == 0) { + inc = 1; + cur_frame = 0; + } loop_count = 0; } From f734db9e0b44f4444f2704ddd27d7a5f047244ac Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 18 Jul 2023 15:30:18 +1000 Subject: [PATCH 273/413] Fix guard --- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index 8d12a9e51..b3bf13caa 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -1066,13 +1066,14 @@ void ExtSeqTrack::record_track_noteoff(uint8_t note_num) { uint16_t start_x = notes_on[n].x; uint16_t end_x = step * timing_mid + utiming - timing_mid; + if (MidiClock.state == 2 && SeqPage::recording) { + if (end_x < start_x) { del_note(0, end_x, note_num); end_x += length * timing_mid; } uint16_t w = end_x - start_x; - if (MidiClock.state == 2 && SeqPage::recording) { del_note(start_x, w, note_num); add_note(start_x, w, note_num, notes_on[n].velocity); } From e8b5d11b5ad3e874ff2270ed6d24a1bb7bbdfb2b Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 18 Jul 2023 16:01:06 +1000 Subject: [PATCH 274/413] show size of .syx files --- .../megacommand/MCL/SampleBrowserPage.cpp | 51 +++++++++++-------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/avr/cores/megacommand/MCL/SampleBrowserPage.cpp b/avr/cores/megacommand/MCL/SampleBrowserPage.cpp index 99f6d349d..e25ce321b 100644 --- a/avr/cores/megacommand/MCL/SampleBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/SampleBrowserPage.cpp @@ -36,34 +36,33 @@ void SampleBrowserPage::display() { if (len > 4) { bool is_wav = strcmp(c_wav_suffix, (&temp_entry[len - 4])) == 0; + bool is_syx = strcmp(c_syx_suffix, (&temp_entry[len - 4])) == 0; Wav wav_file; - if (!is_wav || (is_wav && !wav_file.open(temp_entry, false))) { - FileBrowserPage::selection_change = false; - goto end; - } + uint32_t size = 0; - oled_display.setCursor(0, 23); + if (is_wav) { + if (!wav_file.open(temp_entry, false)) { goto end; } + oled_display.setCursor(0, 23); - float sample_rate_f = (wav_file.header.fmt.sampleRate * 0.001f); - uint16_t sample_rate = (uint16_t)sample_rate_f; - oled_display.print(sample_rate); - oled_display.print(F(".")); + float sample_rate_f = (wav_file.header.fmt.sampleRate * 0.001f); + uint16_t sample_rate = (uint16_t)sample_rate_f; + oled_display.print(sample_rate); + oled_display.print('.'); - uint8_t decimal = - ((sample_rate_f - (float)sample_rate) * (float)10.0f) + 0.5f; - oled_display.print(decimal); - oled_display.print(F("k ")); + uint8_t decimal = + ((sample_rate_f - (float)sample_rate) * (float)10.0f) + 0.5f; + oled_display.print(decimal); + oled_display.print(F("k ")); - oled_display.print(wav_file.header.fmt.bitRate); - oled_display.print(F("/")); - oled_display.print(wav_file.header.fmt.numChannels); + oled_display.print(wav_file.header.fmt.bitRate); + oled_display.print('/'); + oled_display.print(wav_file.header.fmt.numChannels); /* float seconds = wav_file.header.get_length() / (float)wav_file.header.fmt.sampleRate; int16_t minutes = seconds * 0.01666666667f; int16_t ms = ((float)seconds - int(seconds)) * 1000; */ - oled_display.setCursor(0, 30); /* oled_display.print(minutes); oled_display.print(F(":")); @@ -71,20 +70,28 @@ void SampleBrowserPage::display() { oled_display.print(F(":")); oled_display.print(ms); */ - uint32_t size = wav_file.file.size(); + uint32_t size = wav_file.file.size(); + wav_file.close(); + } + else if (is_syx) { + File tmp_file; + if (!tmp_file.open(temp_entry)) { goto end; } + size = tmp_file.size(); + tmp_file.close(); + } + oled_display.setCursor(0, 30); if (size < 1024) { oled_display.print(size); - oled_display.print("B"); + oled_display.print('B'); } else { oled_display.print(size / 1024); - oled_display.print("kB"); + oled_display.print(F("kB")); } - wav_file.close(); } } - FileBrowserPage::selection_change = false; end: + FileBrowserPage::selection_change = false; draw_filebrowser(); oled_display.display(); } From 3b136e7bd0528fc3a9d81ad3fbd1c1dff9f3dab4 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 18 Jul 2023 20:17:23 +1000 Subject: [PATCH 275/413] Fix regression with menu exit function, remove menu exit page --- avr/cores/megacommand/MCL/Menu.h | 5 ++-- avr/cores/megacommand/MCL/MenuPage.cpp | 7 +---- resource/menu_layouts.cpp | 40 +++++++++++++------------- 3 files changed, 23 insertions(+), 29 deletions(-) diff --git a/avr/cores/megacommand/MCL/Menu.h b/avr/cores/megacommand/MCL/Menu.h index 09e546b71..3249dd2fb 100644 --- a/avr/cores/megacommand/MCL/Menu.h +++ b/avr/cores/megacommand/MCL/Menu.h @@ -28,7 +28,6 @@ template struct menu_t { char name[10]; menu_item_t items[N]; uint8_t exit_function_id; // look up the value in menu_target_functions - PageIndex exit_page_callback_id; }; class MenuBase { @@ -37,8 +36,8 @@ class MenuBase { uint8_t entry_mask[4]; menu_option_t* custom_options; - MenuBase() { - memset(entry_mask, 0xFF, sizeof(entry_mask)); + MenuBase() { + memset(entry_mask, 0xFF, sizeof(entry_mask)); custom_options = nullptr; } diff --git a/avr/cores/megacommand/MCL/MenuPage.cpp b/avr/cores/megacommand/MCL/MenuPage.cpp index fe06d41e1..a2ad9442c 100644 --- a/avr/cores/megacommand/MCL/MenuPage.cpp +++ b/avr/cores/megacommand/MCL/MenuPage.cpp @@ -197,16 +197,11 @@ bool MenuPageBase::enter() { bool MenuPageBase::exit() { if (GUI.currentPage() != this) { return; } - // Page *exit_page_callback = get_menu()->get_exit_page_callback(); - DEBUG_PRINTLN("calling exit func"); void (*exit_func)() = get_menu()->get_exit_function(); if (exit_func != NULL) { - // (*exit_func)(); - // + (*exit_func)(); } - // if (exit_page_callback != NULL) { mcl.popPage(); - //} } bool MenuPageBase::handleEvent(gui_event_t *event) { diff --git a/resource/menu_layouts.cpp b/resource/menu_layouts.cpp index d732c5d9a..b4ba42b2b 100644 --- a/resource/menu_layouts.cpp +++ b/resource/menu_layouts.cpp @@ -20,7 +20,7 @@ menu_t boot_menu_layout = { {"USB DISK", 0, 0, 0, 0, NULL_PAGE, 28, 0}, {"EXIT", 0, 0, 0, 0, NULL_PAGE, 29, 0}, }, - 0, NULL_PAGE + 0 }; @@ -31,7 +31,7 @@ menu_t start_menu_layout = { {"LOAD PROJECT", 0, 0, 0, 0, LOAD_PROJ_PAGE, 0, 0}, {"NEW PROJECT", 0, 0, 0, 0, NULL_PAGE, 2, 0}, }, - 0, NULL_PAGE + 0 }; menu_t system_menu_layout = { @@ -46,7 +46,7 @@ menu_t system_menu_layout = { {"AUX PAGES", 0, 0, 0, 0, AUX_CONFIG_PAGE, 0, 0}, {"SYSTEM", 0, 0, 0, 0, MCL_CONFIG_PAGE, 0, 0}, }, - 0, NULL_PAGE + 0 }; menu_t auxconfig_menu_layout = { @@ -55,7 +55,7 @@ menu_t auxconfig_menu_layout = { // m r n d p f o {"RAM Page" ,0, 0, 0, 0, RAM_CONFIG_PAGE, 0, 0}, }, - 0, NULL_PAGE + 0 }; menu_t rampage1_menu_layout = { @@ -64,7 +64,7 @@ menu_t rampage1_menu_layout = { // m r n d p f o {"LINK:", 0, 2, 2, 1, NULL_PAGE, 0, 0}, }, - 0, NULL_PAGE + 0 }; menu_t midiconfig_menu_layout = { @@ -76,7 +76,7 @@ menu_t midiconfig_menu_layout = { {"PROGRAM", 0, 0, 0, 0, MIDIPROGRAM_MENU_PAGE, 0, 0}, {"MD MIDI", 0, 0, 0, 0, MIDIMACHINEDRUM_MENU_PAGE, 0 ,0}, }, - 0, NULL_PAGE + 0 }; menu_t midiport_menu_layout = { @@ -88,7 +88,7 @@ menu_t midiport_menu_layout = { {"DRIVER 2:", 0, 2, 2, 4, 0, NULL_PAGE, 84}, {"CTRL PORT:", 1, 4, 4, 56, NULL_PAGE, 0, 100}, }, - 24, NULL_PAGE + 24 }; menu_t midiprogram_menu_layout = { @@ -98,7 +98,7 @@ menu_t midiprogram_menu_layout = { {"PRG IN:", 0, 18, 2, 47, NULL_PAGE, 0, 88}, {"PRG OUT:", 0, 17, 2, 48, NULL_PAGE, 0, 88}, }, - 24, NULL_PAGE + 24 }; @@ -110,7 +110,7 @@ menu_t midiclock_menu_layout = { {"CLOCK SEND:", 0, 4, 4, 6, 0, NULL_PAGE, 100}, {"TRANS SEND:", 0, 4, 4, 54, NULL_PAGE, 0, 100}, }, - 24, NULL_PAGE + 24 }; menu_t midiroute_menu_layout = { @@ -124,7 +124,7 @@ menu_t midiroute_menu_layout = { {"CC LOOP:", 0, 2, 2, 11, NULL_PAGE, 0, 86}, }, - 24, NULL_PAGE + 24 }; menu_t midimachinedrum_menu_layout = { @@ -135,7 +135,7 @@ menu_t midimachinedrum_menu_layout = { {"POLY CHAN:", 0, 18, 2, 46, NULL_PAGE, 0, 88}, {"TRIG CHAN:", 0, 18, 2, 57, NULL_PAGE, 0, 18}, }, - 24, NULL_PAGE + 24 }; menu_t mdconfig_menu_layout = { @@ -146,7 +146,7 @@ menu_t mdconfig_menu_layout = { {"NORMALIZE:", 0, 2, 2, 8, NULL_PAGE, 0, 16}, {"POLY CONFIG", 0, 0, 0, 0, POLY_PAGE, 0, 0}, }, - 0, NULL_PAGE + 0 }; menu_t mdimport_menu_layout = { @@ -158,7 +158,7 @@ menu_t mdimport_menu_layout = { {"COUNT:", 1, 128, 0, 45, NULL_PAGE, 0, 0}, {"RUN", 0, 0, 0, 0, NULL_PAGE, 25, 0}, }, - 0, NULL_PAGE + 0 }; menu_t mclconfig_menu_layout = { @@ -167,7 +167,7 @@ menu_t mclconfig_menu_layout = { // m r n d p f o {"DISPLAY:", 0, 2, 2, 13, NULL_PAGE, 0, 23}, }, - 1, NULL_PAGE + 1 }; menu_t file_menu_layout = { @@ -182,7 +182,7 @@ menu_t file_menu_layout = { {"RECV ALL", 0, 0, 0, 0, NULL_PAGE, 0, 0}, {"SEND ALL", 0, 0, 0, 0, NULL_PAGE, 0, 0}, }, - 0, NULL_PAGE + 0 }; menu_t seq_menu_layout = { @@ -213,7 +213,7 @@ menu_t seq_menu_layout = { {"QUANT:", 0, 2, 2, 42, NULL_PAGE, 0, 25}, {"SOUND", 0, 0, 0, 0, SOUND_BROWSER, 0, 0}, }, - 14, NULL_PAGE + 14 }; menu_t step_menu_layout = { @@ -225,7 +225,7 @@ menu_t step_menu_layout = { {"PASTE STEP", 0, 0, 0, 0, NULL_PAGE, 17, 0}, {"MUTE STEP", 0, 0, 0, 0, NULL_PAGE, 18, 0}, }, - 19, NULL_PAGE + 19 }; menu_t slot_menu_layout = { @@ -249,7 +249,7 @@ menu_t slot_menu_layout = { {"PASTE:", 0, 2, 2, 38, NULL_PAGE, 0, 33}, {"RENAME", 0, 0, 0, 0, NULL_PAGE, 20, 0}, }, - 21, NULL_PAGE + 21 }; menu_t wavdesign_menu_layout = { @@ -260,7 +260,7 @@ menu_t wavdesign_menu_layout = { {"WAV:", 0, 6, 6, 41, NULL_PAGE, 0, 74}, {"TRANSFER", 0, 0, 0, 0, NULL_PAGE, 22, 0}, }, - 23, NULL_PAGE + 23 }; menu_t perf_menu_layout = { @@ -272,6 +272,6 @@ menu_t perf_menu_layout = { {"RENAME", 0, 0, 0, 0, NULL_PAGE, 30, 0}, // {"PARAM:", 0, 17, 1, 58, NULL_PAGE, 0, 116}, }, - 0, NULL_PAGE + 0 }; From 1ca1ef02e1624904ff6f7167b56eaf4133a78d9f Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 18 Jul 2023 20:46:58 +1000 Subject: [PATCH 276/413] On screen notes to be no less than 2 pixels, regardless of zoom --- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index 72a203de2..5cc6a207a 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -396,7 +396,9 @@ void SeqExtStepPage::draw_pianoroll() { } else { note_fov_end = (float)(note_end - fov_offset) * fov_pixels_per_tick; } - + //On screen notes to be no less than 2 pixels, regardless of zoom + if (note_fov_end - note_fov_start < 2) { note_fov_end = note_fov_start + 2; } + //if (note_fov_end <= note_fov_start) { note_fov_end = note_fov_start + 1; } uint8_t note_fov_y = fov_h - ((note_val - fov_y) * (fov_h / fov_notes)); // Draw vertical projection uint8_t proj_y = 255; From 585f62cc331f18a495fb6dfe959048486ab1754e Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 18 Jul 2023 20:47:36 +1000 Subject: [PATCH 277/413] Fix LoadPage regression --- avr/cores/megacommand/MCL/GridLoadPage.cpp | 6 +++++- avr/cores/megacommand/MCL/GridLoadPage.h | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/GridLoadPage.cpp b/avr/cores/megacommand/MCL/GridLoadPage.cpp index 55639568a..1b9105b60 100644 --- a/avr/cores/megacommand/MCL/GridLoadPage.cpp +++ b/avr/cores/megacommand/MCL/GridLoadPage.cpp @@ -64,7 +64,7 @@ void GridLoadPage::display_load() { oled_display.textbox(str1, str2); } -void GridLoadPage::get_modestr(char *modestr) { +void GridLoadPage::loop() { if (encoders[0]->hasChanged()) { mcl_cfg.load_mode = encoders[0]->cur; draw_popup_title(); @@ -81,6 +81,10 @@ void GridLoadPage::get_modestr(char *modestr) { mcl_cfg.chain_load_quant = encoders[3]->cur; } + +} + +void GridLoadPage::get_modestr(char *modestr) { switch (encoders[0]->cur) { case LOAD_MANUAL: { strcpy(modestr, "MAN"); diff --git a/avr/cores/megacommand/MCL/GridLoadPage.h b/avr/cores/megacommand/MCL/GridLoadPage.h index 369d13fbb..a402c29f9 100644 --- a/avr/cores/megacommand/MCL/GridLoadPage.h +++ b/avr/cores/megacommand/MCL/GridLoadPage.h @@ -21,6 +21,7 @@ class GridLoadPage : public GridIOPage { void display_load(); void draw_popup(); void draw_popup_title(); + void loop(); void display(); void action() { load(); } void init(); From 16ea83d4957c1ca2c6b5578895ffe0f8caccc8e2 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 18 Jul 2023 20:48:12 +1000 Subject: [PATCH 278/413] resource checkin --- avr/cores/megacommand/resources/R.h | 122 +- .../megacommand/resources/R_menu_layouts.cpp | 1099 ++++++++--------- 2 files changed, 602 insertions(+), 619 deletions(-) diff --git a/avr/cores/megacommand/resources/R.h b/avr/cores/megacommand/resources/R.h index a83df44a9..314f27490 100644 --- a/avr/cores/megacommand/resources/R.h +++ b/avr/cores/megacommand/resources/R.h @@ -346,125 +346,125 @@ extern const unsigned char __R_menu_layouts[] PROGMEM; struct __T_menu_layouts { union { menu_t perf_menu_layout[0]; - char zz__perf_menu_layout[54]; + char zz__perf_menu_layout[53]; }; - static constexpr size_t countof_perf_menu_layout = 54 / sizeof(menu_t); - static constexpr size_t sizeofof_perf_menu_layout = 54; + static constexpr size_t countof_perf_menu_layout = 53 / sizeof(menu_t); + static constexpr size_t sizeofof_perf_menu_layout = 53; union { menu_t wavdesign_menu_layout[0]; - char zz__wavdesign_menu_layout[75]; + char zz__wavdesign_menu_layout[74]; }; - static constexpr size_t countof_wavdesign_menu_layout = 75 / sizeof(menu_t); - static constexpr size_t sizeofof_wavdesign_menu_layout = 75; + static constexpr size_t countof_wavdesign_menu_layout = 74 / sizeof(menu_t); + static constexpr size_t sizeofof_wavdesign_menu_layout = 74; union { menu_t slot_menu_layout[0]; - char zz__slot_menu_layout[222]; + char zz__slot_menu_layout[221]; }; - static constexpr size_t countof_slot_menu_layout = 222 / sizeof(menu_t); - static constexpr size_t sizeofof_slot_menu_layout = 222; + static constexpr size_t countof_slot_menu_layout = 221 / sizeof(menu_t); + static constexpr size_t sizeofof_slot_menu_layout = 221; union { menu_t step_menu_layout[0]; - char zz__step_menu_layout[96]; + char zz__step_menu_layout[95]; }; - static constexpr size_t countof_step_menu_layout = 96 / sizeof(menu_t); - static constexpr size_t sizeofof_step_menu_layout = 96; + static constexpr size_t countof_step_menu_layout = 95 / sizeof(menu_t); + static constexpr size_t sizeofof_step_menu_layout = 95; union { menu_t seq_menu_layout[0]; - char zz__seq_menu_layout[495]; + char zz__seq_menu_layout[494]; }; - static constexpr size_t countof_seq_menu_layout = 495 / sizeof(menu_t); - static constexpr size_t sizeofof_seq_menu_layout = 495; + static constexpr size_t countof_seq_menu_layout = 494 / sizeof(menu_t); + static constexpr size_t sizeofof_seq_menu_layout = 494; union { menu_t file_menu_layout[0]; - char zz__file_menu_layout[159]; + char zz__file_menu_layout[158]; }; - static constexpr size_t countof_file_menu_layout = 159 / sizeof(menu_t); - static constexpr size_t sizeofof_file_menu_layout = 159; + static constexpr size_t countof_file_menu_layout = 158 / sizeof(menu_t); + static constexpr size_t sizeofof_file_menu_layout = 158; union { menu_t mclconfig_menu_layout[0]; - char zz__mclconfig_menu_layout[33]; + char zz__mclconfig_menu_layout[32]; }; - static constexpr size_t countof_mclconfig_menu_layout = 33 / sizeof(menu_t); - static constexpr size_t sizeofof_mclconfig_menu_layout = 33; + static constexpr size_t countof_mclconfig_menu_layout = 32 / sizeof(menu_t); + static constexpr size_t sizeofof_mclconfig_menu_layout = 32; union { menu_t mdimport_menu_layout[0]; - char zz__mdimport_menu_layout[96]; + char zz__mdimport_menu_layout[95]; }; - static constexpr size_t countof_mdimport_menu_layout = 96 / sizeof(menu_t); - static constexpr size_t sizeofof_mdimport_menu_layout = 96; + static constexpr size_t countof_mdimport_menu_layout = 95 / sizeof(menu_t); + static constexpr size_t sizeofof_mdimport_menu_layout = 95; union { menu_t mdconfig_menu_layout[0]; - char zz__mdconfig_menu_layout[75]; + char zz__mdconfig_menu_layout[74]; }; - static constexpr size_t countof_mdconfig_menu_layout = 75 / sizeof(menu_t); - static constexpr size_t sizeofof_mdconfig_menu_layout = 75; + static constexpr size_t countof_mdconfig_menu_layout = 74 / sizeof(menu_t); + static constexpr size_t sizeofof_mdconfig_menu_layout = 74; union { menu_t midimachinedrum_menu_layout[0]; - char zz__midimachinedrum_menu_layout[75]; + char zz__midimachinedrum_menu_layout[74]; }; - static constexpr size_t countof_midimachinedrum_menu_layout = 75 / sizeof(menu_t); - static constexpr size_t sizeofof_midimachinedrum_menu_layout = 75; + static constexpr size_t countof_midimachinedrum_menu_layout = 74 / sizeof(menu_t); + static constexpr size_t sizeofof_midimachinedrum_menu_layout = 74; union { menu_t midiroute_menu_layout[0]; - char zz__midiroute_menu_layout[96]; + char zz__midiroute_menu_layout[95]; }; - static constexpr size_t countof_midiroute_menu_layout = 96 / sizeof(menu_t); - static constexpr size_t sizeofof_midiroute_menu_layout = 96; + static constexpr size_t countof_midiroute_menu_layout = 95 / sizeof(menu_t); + static constexpr size_t sizeofof_midiroute_menu_layout = 95; union { menu_t midiclock_menu_layout[0]; - char zz__midiclock_menu_layout[96]; + char zz__midiclock_menu_layout[95]; }; - static constexpr size_t countof_midiclock_menu_layout = 96 / sizeof(menu_t); - static constexpr size_t sizeofof_midiclock_menu_layout = 96; + static constexpr size_t countof_midiclock_menu_layout = 95 / sizeof(menu_t); + static constexpr size_t sizeofof_midiclock_menu_layout = 95; union { menu_t midiprogram_menu_layout[0]; - char zz__midiprogram_menu_layout[75]; + char zz__midiprogram_menu_layout[74]; }; - static constexpr size_t countof_midiprogram_menu_layout = 75 / sizeof(menu_t); - static constexpr size_t sizeofof_midiprogram_menu_layout = 75; + static constexpr size_t countof_midiprogram_menu_layout = 74 / sizeof(menu_t); + static constexpr size_t sizeofof_midiprogram_menu_layout = 74; union { menu_t midiport_menu_layout[0]; - char zz__midiport_menu_layout[117]; + char zz__midiport_menu_layout[116]; }; - static constexpr size_t countof_midiport_menu_layout = 117 / sizeof(menu_t); - static constexpr size_t sizeofof_midiport_menu_layout = 117; + static constexpr size_t countof_midiport_menu_layout = 116 / sizeof(menu_t); + static constexpr size_t sizeofof_midiport_menu_layout = 116; union { menu_t midiconfig_menu_layout[0]; - char zz__midiconfig_menu_layout[117]; + char zz__midiconfig_menu_layout[116]; }; - static constexpr size_t countof_midiconfig_menu_layout = 117 / sizeof(menu_t); - static constexpr size_t sizeofof_midiconfig_menu_layout = 117; + static constexpr size_t countof_midiconfig_menu_layout = 116 / sizeof(menu_t); + static constexpr size_t sizeofof_midiconfig_menu_layout = 116; union { menu_t rampage1_menu_layout[0]; - char zz__rampage1_menu_layout[33]; + char zz__rampage1_menu_layout[32]; }; - static constexpr size_t countof_rampage1_menu_layout = 33 / sizeof(menu_t); - static constexpr size_t sizeofof_rampage1_menu_layout = 33; + static constexpr size_t countof_rampage1_menu_layout = 32 / sizeof(menu_t); + static constexpr size_t sizeofof_rampage1_menu_layout = 32; union { menu_t auxconfig_menu_layout[0]; - char zz__auxconfig_menu_layout[33]; + char zz__auxconfig_menu_layout[32]; }; - static constexpr size_t countof_auxconfig_menu_layout = 33 / sizeof(menu_t); - static constexpr size_t sizeofof_auxconfig_menu_layout = 33; + static constexpr size_t countof_auxconfig_menu_layout = 32 / sizeof(menu_t); + static constexpr size_t sizeofof_auxconfig_menu_layout = 32; union { menu_t system_menu_layout[0]; - char zz__system_menu_layout[138]; + char zz__system_menu_layout[137]; }; - static constexpr size_t countof_system_menu_layout = 138 / sizeof(menu_t); - static constexpr size_t sizeofof_system_menu_layout = 138; + static constexpr size_t countof_system_menu_layout = 137 / sizeof(menu_t); + static constexpr size_t sizeofof_system_menu_layout = 137; union { menu_t start_menu_layout[0]; - char zz__start_menu_layout[54]; + char zz__start_menu_layout[53]; }; - static constexpr size_t countof_start_menu_layout = 54 / sizeof(menu_t); - static constexpr size_t sizeofof_start_menu_layout = 54; + static constexpr size_t countof_start_menu_layout = 53 / sizeof(menu_t); + static constexpr size_t sizeofof_start_menu_layout = 53; union { menu_t boot_menu_layout[0]; - char zz__boot_menu_layout[96]; + char zz__boot_menu_layout[95]; }; - static constexpr size_t countof_boot_menu_layout = 96 / sizeof(menu_t); - static constexpr size_t sizeofof_boot_menu_layout = 96; - static constexpr size_t __total_size = 2235; + static constexpr size_t countof_boot_menu_layout = 95 / sizeof(menu_t); + static constexpr size_t sizeofof_boot_menu_layout = 95; + static constexpr size_t __total_size = 2215; }; extern const unsigned char __R_menu_options[] PROGMEM; diff --git a/avr/cores/megacommand/resources/R_menu_layouts.cpp b/avr/cores/megacommand/resources/R_menu_layouts.cpp index ae0de47a2..c3ca53ee8 100644 --- a/avr/cores/megacommand/resources/R_menu_layouts.cpp +++ b/avr/cores/megacommand/resources/R_menu_layouts.cpp @@ -35,506 +35,502 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 0, 3, 255, - 185, + 176, 30, - 3, - 151, - 14, + 13, + 63, 69, - 236, 68, 73, 84, - 49, - 216, - 53, - 54, + 102, + 48, + 193, + 52, + 151, 40, - 28, - 253, 80, 87, + 236, 65, 86, 58, - 128, - 50, - 246, + 35, + 7, 6, 6, + 182, 41, 20, - 219, 74, - 94, + 223, + 93, 65, - 251, 78, 83, 70, + 216, 69, 82, - 74, - 1, - 255, + 73, + 15, 22, 0, 23, - 255, + 246, 83, 108, 111, 116, - 103, - 14, + 13, + 127, 71, - 251, 82, 73, 68, 58, + 178, 32, - 29, - 39, + 28, + 123, 2, 2, - 183, 31, - 53, + 52, + 126, 52, 77, - 236, 79, 68, 69, - 75, - 191, + 203, + 74, + 246, 1, 4, 3, 32, - 110, 20, + 237, 20, 76, - 214, - 149, + 147, + 107, 40, - 181, 0, - 135, + 88, 20, + 126, 65, - 220, 0, 39, - 145, - 200, + 255, + 214, + 6, 20, - 100, + 67, 129, - 251, + 39, 79, + 216, 79, 80, 83, - 1, - 238, + 15, 64, 0, 33, + 119, 20, - 228, 74, 85, 77, - 15, + 32, + 126, 128, 128, - 219, 34, 255, + 219, 4, 67, - 111, 63, + 123, 65, 82, 58, - 96, 125, - 59, + 1, + 219, 36, 255, 44, - 109, 67, + 109, 61, - 185, 89, + 204, 84, - 151, 20, + 185, 37, - 55, + 190, 80, 65, 83, - 216, 84, 69, + 192, 41, - 29, + 238, 38, - 193, 20, - 40, - 0, - 125, + 8, + 38, + 3, 20, + 219, 0, 21, - 255, - 176, - 41, + 40, 80, - 130, + 8, + 91, + 44, 94, - 202, - 95, - 124, + 167, 30, 255, + 207, 15, 30, - 247, 32, - 77, - 89, + 117, + 76, 80, - 53, - 123, + 151, + 52, 16, + 177, 0, - 95, - 22, + 94, + 97, 21, - 19, + 63, 255, - 246, 17, 0, 77, 85, + 107, 19, - 178, 41, - 30, + 33, + 225, 18, 0, 19, - 221, - 95, - 69, + 171, + 108, 81, - 130, - 14, - 27, - 94, + 13, + 16, + 216, + 91, 67, 75, - 9, - 191, - 54, + 73, + 187, + 183, 1, - 49, - 248, + 48, 14, 255, + 194, 3, 0, - 94, - 59, + 57, + 246, 86, 73, 67, - 201, - 171, - 247, + 169, + 79, 1, 3, 2, + 184, 50, - 233, - 4, - 178, - 167, + 231, + 37, + 175, + 62, 15, 255, - 217, 4, 48, + 200, 20, - 15, + 123, 9, 1, 16, - 111, 41, + 125, 54, 67, 67, - 176, 58, - 209, - 62, + 129, + 207, + 246, 133, 5, 17, - 222, 20, + 240, 55, 83, 76, - 21, - 166, - 132, - 254, - 219, + 172, + 164, + 252, + 38, 18, + 219, 20, 25, - 111, - 218, + 217, + 127, 80, 69, 71, - 248, 71, 73, 65, + 194, 84, 79, - 67, - 223, - 13, - 52, + 220, + 24, + 110, + 50, 75, - 216, 69, 89, + 192, 63, - 31, + 251, 12, 12, 19, - 110, 41, + 113, 104, 86, - 49, - 97, - 9, - 124, - 97, - 205, - 67, - 145, - 5, - 7, - 194, + 136, + 93, + 75, + 122, + 10, + 203, + 24, + 143, + 46, + 6, 78, 68, - 229, - 3, + 16, + 227, + 30, 15, - 219, 15, 21, + 221, 20, 60, - 182, 83, + 182, 82, 69, - 192, 21, - 127, + 3, 7, + 248, 7, 22, 255, 5, 41, - 13, - 229, + 111, + 227, 71, - 217, 84, 72, - 209, - 49, - 65, - 219, - 65, + 58, + 9, + 248, + 126, + 23, + 255, 6, 0, + 194, 20, - 11, - 200, + 242, 2, 129, - 227, + 56, 67, 72, - 111, + 219, 108, 78, 108, - 144, - 222, + 36, + 55, 16, 24, 255, 7, + 132, 0, - 18, - 208, - 31, + 206, + 135, 3, 3, + 240, 25, 255, - 194, 8, 27, - 154, - 22, - 238, + 133, + 153, + 187, 20, 26, 255, + 144, 9, - 64, - 60, + 15, 10, 30, - 33, - 250, - 110, + 8, + 248, + 91, 20, - 255, + 191, 27, 255, 11, 27, 83, 72, + 194, 73, 70, - 8, 59, - 15, + 3, 5, + 248, 5, 28, - 227, 255, 12, 35, - 15, - 91, + 214, + 13, 232, + 237, 82, - 181, 83, 43, - 147, + 100, 41, - 29, 255, + 29, 255, 13, 27, 80, 79, 76, + 237, 89, 80, - 182, 72, 235, + 178, 89, - 201, 44, - 183, + 109, 11, 2, + 219, 81, 85, - 108, 167, 84, - 32, + 8, 79, - 115, + 28, 42, - 112, + 220, 83, 79, 85, - 161, + 40, 17, + 64, 123, - 3, - 27, - 205, - 0, - 13, - 209, + 198, + 203, + 183, + 2, + 14, 70, 180, 73, - 149, + 148, 96, - 78, + 76, 182, - 52, + 51, 67, 209, - 220, + 219, 132, - 111, + 108, 181, 2, 184, - 238, + 237, 87, 32, 93, - 199, + 198, 82, 46, 129, 20, 142, - 3, + 2, 107, 51, - 180, + 179, 89, 41, 8, 202, - 174, + 171, 221, 20, 79, 117, - 178, + 177, 87, 43, - 132, + 129, 44, 88, 41, @@ -548,541 +544,528 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 76, 37, 173, - 216, - 157, + 215, + 156, 100, 20, 110, - 3, - 195, - 83, + 21, + 134, 89, - 30, - 94, - 77, - 14, - 208, - 133, - 184, + 28, 189, + 77, + 13, + 161, + 132, + 187, + 112, 76, 65, - 86, - 254, - 212, - 77, + 172, + 252, + 210, + 155, 13, - 190, - 32, + 31, + 123, 23, 1, - 255, 77, - 201, - 211, - 233, + 208, + 39, 83, 82, + 166, 67, - 130, - 146, - 131, - 3, + 125, + 72, + 126, + 12, 43, - 28, + 115, + 150, + 168, + 90, + 62, + 144, + 147, 153, - 214, - 170, - 63, - 164, - 152, - 38, 44, - 112, - 161, - 10, - 31, - 1, - 141, + 194, + 7, + 132, + 28, + 6, 1, - 48, - 189, + 54, 45, - 149, - 161, + 45, + 246, + 147, 19, - 29, - 152, - 191, - 77, + 134, + 26, + 97, + 189, + 54, 25, - 172, 3, - 95, - 6, + 178, + 94, + 233, 73, - 148, - 226, - 109, - 138, + 220, + 70, + 134, + 216, 84, - 129, - 32, - 195, - 33, 31, - 54, + 28, + 33, + 51, + 28, 18, + 109, 77, - 220, - 181, + 178, + 194, 73, 90, - 43, - 150, - 149, - 6, + 146, + 176, + 147, + 109, 8, - 216, - 74, + 73, + 135, 16, - 120, - 148, + 144, + 142, 32, - 224, - 128, - 176, - 91, + 124, + 11, + 88, 71, - 146, - 148, - 199, - 74, + 9, + 144, + 110, + 73, + 237, 32, 77, - 180, 73, - 198, - 63, - 106, + 195, + 15, + 102, 72, + 227, 82, 79, - 143, 32, - 77, - 103, - 53, + 72, + 217, + 52, + 251, 18, - 237, 2, 9, 255, 4, - 123, - 53, + 94, + 52, + 194, 20, - 9, - 150, + 101, 46, + 165, 88, - 149, - 131, - 172, - 67, + 126, + 107, + 66, 20, - 38, + 9, + 187, 57, - 225, 41, - 182, - 118, + 24, 82, - 193, - 132, - 83, - 23, - 81, - 252, + 104, + 190, + 65, + 78, + 127, + 80, 32, 49, 32, + 198, 70, 87, - 106, - 215, - 78, - 122, + 209, + 164, + 116, + 237, 7, - 219, - 32, + 31, + 177, 10, 20, - 25, + 144, 50, - 1, - 151, + 25, 51, + 125, 92, 85, - 216, 83, 66, + 130, 17, - 41, - 164, - 6, + 144, + 158, + 109, 52, - 218, 20, + 165, 96, - 90, - 143, + 137, + 175, 32, - 240, - 208, - 151, - 85, + 200, + 9, + 81, + 118, 11, - 110, 20, + 225, 86, 24, - 24, - 118, - 106, - 11, - 195, - 100, - 174, + 113, + 70, + 5, + 172, + 92, + 58, 79, - 4, - 15, - 178, + 96, + 253, + 241, + 172, 58, - 25, - 117, - 219, + 157, + 110, 5, - 32, + 176, + 31, 7, - 2, - 120, - 44, + 34, + 110, + 192, 20, - 14, + 230, 53, 102, 41, - 97, - 199, - 152, - 116, - 118, + 25, + 193, + 135, + 115, 6, - 242, - 216, + 11, + 61, 100, + 98, 41, - 176, + 192, 20, - 59, + 237, 54, 41, - 109, + 237, 100, - 95, - 182, + 24, 80, - 192, + 190, + 180, 71, - 208, - 25, - 237, - 215, + 24, + 59, + 209, 9, - 104, - 223, - 18, - 145, - 221, - 128, + 90, + 220, + 4, + 135, + 183, + 126, + 91, 49, - 109, - 32, + 31, 90, - 246, + 125, 20, 73, + 139, + 239, 242, - 44, - 245, - 24, + 6, 47, - 103, - 10, + 25, + 7, + 238, 20, - 185, - 246, - 135, + 244, + 97, 21, + 247, 17, - 220, 2, 48, 20, - 224, - 74, - 213, - 148, + 67, + 24, + 143, + 214, 83, - 159, - 175, + 166, + 126, 85, 82, 66, - 133, 79, - 11, - 101, - 224, - 237, + 21, + 8, + 151, + 221, 2, + 181, 255, - 79, - 103, + 78, + 156, 20, 50, - 37, - 201, + 151, 3, - 33, - 16, - 172, + 36, + 134, + 13, + 176, 58, 20, - 25, + 102, 55, - 161, + 133, 68, - 106, - 71, - 173, - 53, + 102, + 28, + 165, + 214, 42, - 147, - 137, + 136, + 77, 4, - 108, - 191, + 176, + 189, 84, - 24, - 194, - 188, 98, - 9, - 3, - 182, + 181, + 245, + 98, + 155, + 250, 41, + 111, 56, - 196, - 191, - 32, - 199, - 185, - 191, - 225, - 27, - 235, - 11, - 142, + 189, + 8, + 194, + 46, + 189, + 120, + 26, + 66, + 229, + 227, 34, - 138, + 173, + 131, + 59, 12, - 62, - 48, - 75, - 184, + 68, + 46, 36, - 231, - 96, - 188, - 54, - 212, + 57, + 89, + 205, + 186, + 210, + 176, 71, - 192, 20, - 109, + 27, 37, - 254, - 8, - 8, - 44, - 20, + 252, + 66, 6, - 35, + 11, 20, - 211, - 96, - 40, - 176, + 1, + 140, + 35, + 35, + 150, 20, - 24, + 3, 38, - 247, - 63, - 39, - 55, - 138, + 115, + 3, + 38, + 155, + 136, 65, + 134, 71, - 13, - 247, + 242, + 182, 76, - 109, - 71, + 70, 75, - 101, - 242, - 186, - 170, + 178, + 231, + 221, + 168, 1, - 145, - 44, - 236, + 79, + 34, 65, + 216, 85, 88, - 32, - 66, - 14, - 177, - 42, - 236, + 31, + 217, + 83, + 41, + 246, 97, 103, 101, - 35, - 187, + 34, + 92, 31, - 32, - 217, - 167, - 97, - 171, - 109, + 51, + 198, + 164, + 44, + 45, + 165, 65, - 100, - 116, - 124, + 174, + 97, + 121, + 133, 74, - 40, - 195, - 193, - 210, - 164, + 189, + 24, + 201, + 52, 25, - 236, - 88, + 139, + 224, 19, - 75, - 49, - 163, + 11, + 108, + 252, 2, - 96, - 22, - 203, - 23, + 98, + 89, + 194, + 200, + 238, 26, - 116, - 161, + 158, + 141, 65, - 107, - 147, - 131, - 64, - 169, - 75, - 52, - 88, - 186, - 118, + 139, + 104, + 129, + 21, + 62, + 43, + 42, + 183, + 14, 27, - 2, - 178, - 126, + 192, + 125, 89, 41, - 48, + 52, 29, - 169, - 10, + 134, + 181, 192, - 54, 62, - 7, - 30, - 123, - 87, - 102, - 5, - 132, - 137, - 27, - 3, - 163, - 66, - 170, - 88, - 15, + 196, + 236, + 220, + 101, + 22, + 136, + 17, 56, + 0, + 66, + 214, + 161, + 14, + 14, 79, 83, - 88, - 190, + 22, + 184, 80, - 97, - 57, - 169, - 56, - 173, - 37, - 188, - 129, + 24, + 52, + 106, + 49, + 73, + 161, + 111, + 127, 68, 70, 85, - 98, - 75, - 144, - 194, - 22, - 171, - 143, - 246, - 93, - 59, + 24, + 68, + 164, + 182, + 5, + 163, + 169, + 237, + 215, + 46, + 88, 75, - 96, 20, - 49, + 12, 28, - 109, - 99, + 91, + 81, 88, - 106, - 147, - 72, - 236, - 110, - 29, - 3, + 90, + 133, + 146, + 224, + 23, + 169, 0, 0, 0, 0, 0, - 4, - 255, + 2, + 127, 255, }; From f6f2ef8dd482c36eca21303b3ab8f2561b6e7a14 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 18 Jul 2023 22:08:46 +1000 Subject: [PATCH 279/413] Fix mixer page mute for ext tracks --- avr/cores/megacommand/MCL/MixerPage.cpp | 33 +++++++++++-------------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 8d85b7357..1558df8c9 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -12,6 +12,7 @@ void MixerPage::set_display_mode(uint8_t param) { } void MixerPage::oled_draw_mutes() { + if (draw_encoders) { return; } bool is_md_device = (midi_device == &MD); uint8_t len = is_md_device ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; @@ -394,23 +395,19 @@ void MixerPage::switch_mute_set(uint8_t state) { }; for (uint8_t dev = 0; dev < 2; dev++) { - uint8_t len = (dev == 0) ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; + bool is_md_device = dev == 0; + uint8_t len = (is_md_device) ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; for (uint8_t n = 0; n < len; n++) { - SeqTrack *seq_track = (dev == 0) ? (SeqTrack *)&mcl_seq.md_tracks[n] + SeqTrack *seq_track = (is_md_device) ? (SeqTrack *)&mcl_seq.md_tracks[n] : (SeqTrack *)&mcl_seq.ext_tracks[n]; + bool mute_state = IS_BIT_CLEAR16(mute_sets[dev].mutes[state], n); - if (IS_BIT_CLEAR16(mute_sets[dev].mutes[state], n)) { - if (seq_track->mute_state == SEQ_MUTE_OFF) { - seq_track->toggle_mute(); - devs[dev]->muteTrack(n, SEQ_MUTE_ON); - } - } else { - if (seq_track->mute_state == SEQ_MUTE_ON) { - seq_track->toggle_mute(); - devs[dev]->muteTrack(n, SEQ_MUTE_OFF); - } - } + if (mute_state != seq_track->mute_state) { + devs[dev]->muteTrack(n, mute_state); + if (is_md_device) { mcl_seq.md_tracks[n].toggle_mute(); } + else { mcl_seq.ext_tracks[n].toggle_mute(); } + } } } current_mute_set = state; @@ -558,11 +555,11 @@ bool MixerPage::handleEvent(gui_event_t *event) { : mcl_seq.num_ext_tracks; for (int i = 0; i < len; i++) { if (note_interface.is_note_on(i)) { - SeqTrack *seq_track = - is_md_device ? (SeqTrack *)&mcl_seq.md_tracks[i] - : (SeqTrack *)&mcl_seq.ext_tracks[i]; - seq_track->toggle_mute(); - midi_device->muteTrack(i, seq_track->mute_state); + bool mute_state = false; + if (is_md_device) { mcl_seq.md_tracks[i].toggle_mute(); mute_state = mcl_seq.md_tracks[i].mute_state; } + else { mcl_seq.ext_tracks[i].toggle_mute(); mute_state = mcl_seq.ext_tracks[i].mute_state; } + + midi_device->muteTrack(i, mute_state); if (current_mute_set == 255) { break; } From d9ac9b129a9e351c698412be19f4c66e26868905 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 18 Jul 2023 22:24:29 +1000 Subject: [PATCH 280/413] Fix performance of PerfEncoders when controlled externally --- avr/cores/megacommand/MCL/GridTask.cpp | 1 + avr/cores/megacommand/MCL/PerfPage.cpp | 10 +++++++++- avr/cores/megacommand/MCL/PerfPage.h | 2 ++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/GridTask.cpp b/avr/cores/megacommand/MCL/GridTask.cpp index 40b44d91d..fdb42ad67 100644 --- a/avr/cores/megacommand/MCL/GridTask.cpp +++ b/avr/cores/megacommand/MCL/GridTask.cpp @@ -32,6 +32,7 @@ void GridTask::run() { // ExtTrack *ext_track = (ExtTrack *)&temp_track; // MD GUI update. + perf_page.encoder_check(); trig_interface.check_key_throttle(); if (stop_hard_callback) { diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 6d47581ae..65613b6d3 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -294,6 +294,14 @@ void PerfPage::display() { oled_display.display(); } + +void PerfPage::encoder_check() { + if (GUI.currentPage() == this) return; + for (uint8_t i = 0; i < 4; i++) { + if (perf_encoders[i]->hasChanged()) { perf_encoders[i]->send(); } + } +} + void PerfPage::learn_param(uint8_t dest, uint8_t param, uint8_t value) { // Intercept controller param. @@ -308,7 +316,7 @@ void PerfPage::learn_param(uint8_t dest, uint8_t param, uint8_t value) { int16_t range = max - min; uint8_t val = (cur * (int16_t)127) / range; perf_encoders[i]->cur = val; - perf_encoders[i]->send(); + //perf_encoders[i]->send(); if (mcl.currentPage() == PERF_PAGE_0) { update_params(); } diff --git a/avr/cores/megacommand/MCL/PerfPage.h b/avr/cores/megacommand/MCL/PerfPage.h index 82696108b..ec9d66d82 100644 --- a/avr/cores/megacommand/MCL/PerfPage.h +++ b/avr/cores/megacommand/MCL/PerfPage.h @@ -55,6 +55,8 @@ class PerfPage : public LightPage, PerfPageParent { void config_encoder_range(uint8_t i); + void encoder_check(); + void onControlChangeCallback_Midi(uint8_t *msg); void onControlChangeCallback_Midi2(uint8_t *msg); }; From c8944f62c00a049de6495737930986c3df0224d2 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 18 Jul 2023 22:39:05 +1000 Subject: [PATCH 281/413] update fx pages, when FX param is changed --- avr/cores/megacommand/MD/MDSysex.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/avr/cores/megacommand/MD/MDSysex.cpp b/avr/cores/megacommand/MD/MDSysex.cpp index 91bca0223..1ffd471ca 100644 --- a/avr/cores/megacommand/MD/MDSysex.cpp +++ b/avr/cores/megacommand/MD/MDSysex.cpp @@ -80,6 +80,8 @@ void MDSysexListenerClass::end() { perf_page.learn_param(fx_type + 16, param, value); lfo_page.learn_param(fx_type + 16, param, value); + if (GUI.currentPage() == &fx_page_a) { fx_page_a.update_encoders(); } + if (GUI.currentPage() == &fx_page_b) { fx_page_b.update_encoders(); } break; From 1c112d28f54b26d234f049d3fd41ed7e10a70681 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 18 Jul 2023 22:52:54 +1000 Subject: [PATCH 282/413] fx page params updating was broken --- avr/cores/megacommand/MCL/FXPage.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/FXPage.cpp b/avr/cores/megacommand/MCL/FXPage.cpp index c75d396a5..42c3ea379 100644 --- a/avr/cores/megacommand/MCL/FXPage.cpp +++ b/avr/cores/megacommand/MCL/FXPage.cpp @@ -26,7 +26,7 @@ void FXPage::update_encoders() { for (uint8_t n = 0; n < GUI_NUM_ENCODERS; n++) { ((MCLEncoder *)encoders[n])->max = 127; - uint8_t a = ((uint8_t)!page_mode * GUI_NUM_ENCODERS) + n; + uint8_t a = ((uint8_t)page_mode * GUI_NUM_ENCODERS) + n; uint8_t fx_param = params[a].param; switch (params[a].type) { @@ -58,7 +58,7 @@ void FXPage::cleanup() { void FXPage::loop() { for (uint8_t i = 0; i < GUI_NUM_ENCODERS; i++) { - uint8_t n = i + ((page_mode ? 1 : 0) * GUI_NUM_ENCODERS); + uint8_t n = i + (page_mode * GUI_NUM_ENCODERS); if (encoders[i]->hasChanged()) { uint8_t fx_param = params[n].param; From c3d18f830e5c802ebc078d0578a0497c60975fc6 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 19 Jul 2023 09:51:15 +1000 Subject: [PATCH 283/413] minor --- avr/cores/megacommand/MD/MD.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/avr/cores/megacommand/MD/MD.cpp b/avr/cores/megacommand/MD/MD.cpp index a8a3ff1c0..cb3bd0cca 100644 --- a/avr/cores/megacommand/MD/MD.cpp +++ b/avr/cores/megacommand/MD/MD.cpp @@ -683,7 +683,6 @@ uint8_t MDClass::assignMachineBulk(uint8_t track, MDMachine *machine, } i++; - bool set_level = false; if (mode == 0) { goto end; } @@ -707,7 +706,6 @@ uint8_t MDClass::assignMachineBulk(uint8_t track, MDMachine *machine, data[i++] = machine->muteGroup; if (level != 255) { data[i++] = level; - set_level = true; } end: From 8d92fe53a892d8b001a6a736fb7ece642b484302 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 19 Jul 2023 11:23:12 +1000 Subject: [PATCH 284/413] Reduce metronome frames to 8 --- avr/cores/megacommand/resources/R.h | 8 +- .../megacommand/resources/R_icons_logo.cpp | 345 ++++++++---------- resource/icons_logo.cpp | 6 +- 3 files changed, 164 insertions(+), 195 deletions(-) diff --git a/avr/cores/megacommand/resources/R.h b/avr/cores/megacommand/resources/R.h index 314f27490..e3a290d3c 100644 --- a/avr/cores/megacommand/resources/R.h +++ b/avr/cores/megacommand/resources/R.h @@ -111,10 +111,10 @@ extern const unsigned char __R_icons_logo[] PROGMEM; struct __T_icons_logo { union { unsigned char metronome_gif_data[0]; - char zz__metronome_gif_data[450]; + char zz__metronome_gif_data[360]; }; - static constexpr size_t countof_metronome_gif_data = 450 / sizeof(unsigned char); - static constexpr size_t sizeofof_metronome_gif_data = 450; + static constexpr size_t countof_metronome_gif_data = 360 / sizeof(unsigned char); + static constexpr size_t sizeofof_metronome_gif_data = 360; union { unsigned char monomachine_gif_data[0]; char zz__monomachine_gif_data[270]; @@ -193,7 +193,7 @@ struct __T_icons_logo { }; static constexpr size_t countof_metronome_gif = 13 / sizeof(MCLGIF); static constexpr size_t sizeofof_metronome_gif = 13; - static constexpr size_t __total_size = 1721; + static constexpr size_t __total_size = 1631; }; extern const unsigned char __R_icons_page[] PROGMEM; diff --git a/avr/cores/megacommand/resources/R_icons_logo.cpp b/avr/cores/megacommand/resources/R_icons_logo.cpp index 0abd4e307..766e29957 100644 --- a/avr/cores/megacommand/resources/R_icons_logo.cpp +++ b/avr/cores/megacommand/resources/R_icons_logo.cpp @@ -165,96 +165,62 @@ const unsigned char __R_icons_logo[] PROGMEM = { 21, 25, 8, - 96, - 224, - 11, - 0, - 173, - 32, - 2, - 182, - 35, - 44, - 27, - 89, - 30, - 14, - 14, - 119, - 2, - 4, - 103, - 1, - 117, - 0, - 131, - 178, - 44, - 67, - 237, - 54, - 32, - 2, - 99, - 44, - 12, + 100, 44, - 26, - 148, - 239, + 123, 252, 252, 2, - 200, + 242, 204, 204, - 79, + 19, 207, + 204, 207, 192, - 51, + 200, 26, - 33, - 177, + 108, 12, 2, - 181, + 109, 15, 23, - 214, + 117, 2, 60, + 173, 23, - 181, 2, - 131, + 96, 17, + 216, 12, - 97, 26, - 118, + 93, 0, + 175, 23, - 190, 2, + 149, 204, - 86, + 133, 26, - 20, - 176, + 44, 2, - 155, + 38, 3, + 219, 23, - 108, 3, 26, - 174, + 43, + 185, 12, - 224, 2, 139, - 26, + 192, 2, 179, 60, @@ -271,7 +237,7 @@ const unsigned char __R_icons_logo[] PROGMEM = { 26, 172, 96, - 166, + 76, 47, 2, 100, @@ -298,8 +264,8 @@ const unsigned char __R_icons_logo[] PROGMEM = { 124, 26, 66, - 58, - 77, + 26, + 243, 188, 219, 14, @@ -348,399 +314,400 @@ const unsigned char __R_icons_logo[] PROGMEM = { 216, 64, 134, - 190, + 191, 56, 15, - 54, - 10, + 131, + 219, + 192, 31, - 223, 2, 63, + 229, 135, 128, 127, - 47, + 242, 255, 143, 0, - 151, 119, + 227, 39, 190, - 26, - 156, - 235, + 66, + 93, 2, 188, + 110, 26, - 114, 130, 0, - 200, + 89, 0, - 22, - 233, + 2, + 221, 53, 129, - 109, + 45, 128, + 163, 26, - 27, 48, + 118, 255, - 176, 142, 26, - 156, + 19, 14, + 150, 3, - 182, 3, + 198, 80, - 54, 131, - 53, 219, + 53, 129, 26, + 101, 136, - 44, + 144, 188, - 131, - 8, 109, + 8, 53, + 183, 28, - 185, 26, 62, 7, - 108, + 45, 7, + 141, 80, - 109, 135, - 26, 182, + 26, 162, 23, + 219, 176, - 217, 2, 184, - 91, + 43, 26, - 3, 109, + 3, 2, - 49, 182, + 49, 53, 120, + 223, 2, - 253, 252, 15, 0, 118, - 15, 182, + 15, 26, 30, - 20, 219, + 20, 142, 2, + 108, 132, - 96, 161, - 219, + 27, 31, 23, - 15, 109, + 15, 2, - 199, 182, + 199, 53, 99, + 221, 2, - 237, 49, 190, + 173, 189, - 110, 2, + 216, 4, 60, - 194, 188, - 109, + 77, 63, + 187, 23, - 218, 23, 143, 104, - 198, + 88, 134, + 221, 3, - 234, 161, 252, - 91, - 68, + 27, + 234, 66, + 111, 68, - 125, 33, 0, 47, + 176, 161, - 130, 2, - 231, + 92, 11, + 237, 17, - 109, 15, 156, + 182, 32, - 183, 248, 137, + 251, 36, 0, - 219, 19, 146, 47, + 108, 210, - 96, 2, - 185, + 23, 11, - 216, + 59, 17, 7, 216, - 90, + 11, 48, 240, - 219, - 132, + 91, + 42, 8, + 111, 89, - 125, 228, 0, 5, + 176, 244, - 130, 2, - 231, + 92, 11, + 231, 17, - 59, 23, + 109, 0, 224, - 109, 5, - 16, 182, + 16, 11, 72, + 217, 2, - 200, 232, - 119, + 14, 72, + 231, 17, - 57, 23, - 99, - 52, + 36, + 218, + 111, 160, - 126, 11, + 216, 1, 80, - 195, 2, - 185, + 119, 16, 17, - 115, - 79, + 38, + 245, + 97, 2, - 14, + 200, 224, - 66, - 88, + 75, 20, - 55, + 6, 0, + 230, 32, - 48, 2, - 5, - 223, + 0, + 187, 0, 30, 60, + 255, 60, 120, 48, - 251, 96, 253, 248, 120, 240, + 106, 5, - 87, - 188, - 119, + 238, + 98, 96, 72, 144, + 239, 7, - 127, 60, 30, 120, 60, + 255, 96, 49, 248, - 251, 252, 240, 120, 96, 48, + 100, 19, - 39, + 255, 0, 120, - 255, 30, 96, 61, 248, 48, + 243, 240, 252, 96, - 155, 120, + 111, 120, 144, - 123, 47, - 41, - 3, 96, + 41, + 108, 19, - 178, + 22, 83, - 23, + 66, + 251, 3, - 219, 1, 135, + 127, 34, - 255, 17, 192, 68, 9, 128, + 255, 132, 9, 64, - 255, 132, 40, 64, 164, 72, + 253, 64, 98, 16, - 239, 128, 225, 225, + 236, 42, - 101, 26, - 200, + 185, 41, - 201, + 25, 8, - 76, + 41, + 145, 73, - 140, + 144, 8, - 128, - 119, + 14, 201, + 230, 80, - 48, 26, - 135, + 16, + 242, 137, 128, - 144, 133, - 142, + 17, + 207, 9, - 121, 133, - 8, - 100, + 33, + 12, 132, - 228, + 156, 136, - 191, + 151, 27, + 224, 8, 18, 9, - 3, - 126, - 217, + 123, + 36, 0, 12, - 92, + 43, + 150, 10, - 178, 1, - 76, + 73, + 144, 7, - 128, - 251, + 31, 20, 5, 14, 10, + 96, 25, - 2, - 253, + 95, 45, - 10, + 8, 17, + 178, 15, - 146, 12, + 64, 0, 0, 0, 0, - 0, - 9, + 1, + 63, 255, }; diff --git a/resource/icons_logo.cpp b/resource/icons_logo.cpp index 3a5bd589d..6f7132228 100644 --- a/resource/icons_logo.cpp +++ b/resource/icons_logo.cpp @@ -40,7 +40,7 @@ unsigned char icon_md_logo_medium [] = { */ -MCLGIF metronome_gif = {45, 10, 17, 15, DIR_FWDBACK, 1}; +MCLGIF metronome_gif = {45, 8, 17, 15, DIR_FWDBACK, 1}; MCLGIF perf_gif = {27, 7, 18, 9, DIR_FWDBACK, 1}; MCLGIF route_gif = {20, 5, 14, 10, DIR_FWDBACK, 1}; @@ -235,6 +235,8 @@ unsigned char metronome_gif_data [] = { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x0f, 0x40, 0x00, 0x06, 0x20, 0x00, 0x06, 0xa0, 0x00, 0x0e, 0x90, 0x00, 0x0d, 0x10, 0x00, 0x19, 0x08, 0x00, 0x18, 0x88, 0x00, 0x30, 0x84, 0x00, 0x30, 0x04, 0x00, 0x3f, 0xf8, 0x00, 0x0f, 0xf0, 0x00, +}; +/* // 'pixil-frame-8', 17x15px 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x23, 0xc0, 0x00, 0x1b, 0x40, 0x00, 0x1e, 0x20, 0x00, 0x06, 0xa0, 0x00, 0x0e, 0x90, 0x00, 0x0e, 0x10, 0x00, 0x19, 0x08, 0x00, 0x19, 0x08, @@ -244,5 +246,5 @@ unsigned char metronome_gif_data [] = { 0x20, 0x00, 0x36, 0xa0, 0x00, 0x0e, 0x90, 0x00, 0x0c, 0x10, 0x00, 0x1a, 0x08, 0x00, 0x19, 0x08, 0x00, 0x30, 0x84, 0x00, 0x30, 0x04, 0x00, 0x3f, 0xf8, 0x00, 0x0f, 0xf0, 0x00, }; - +*/ From a947e8f32d23c26c0be9f229c6c75572d75a9a52 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 19 Jul 2023 12:29:06 +1000 Subject: [PATCH 285/413] Cursor width would be shorter than entered notes at certain pixels_per_tick --- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index 5cc6a207a..31a54b6b5 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -324,7 +324,6 @@ void SeqExtStepPage::draw_lockeditor() { } // Draw interactive cursor int16_t fov_cur_x = (float)(cur_x - fov_offset) * fov_pixels_per_tick; - uint8_t fov_cur_w = (float)(cur_w)*fov_pixels_per_tick; uint8_t fov_cur_y = fov_h - ((float)lock_cur_y / 128.0 * (float)fov_h); oled_display.drawPixel(draw_x + fov_cur_x - 1, draw_y + fov_cur_y - 2, WHITE); @@ -456,7 +455,7 @@ void SeqExtStepPage::draw_pianoroll() { // Draw interactive cursor uint8_t fov_cur_y = fov_h - ((cur_y - fov_y) * ((fov_h) / fov_notes)); int16_t fov_cur_x = (float)(cur_x - fov_offset) * fov_pixels_per_tick; - uint8_t fov_cur_w = (float)(cur_w)*fov_pixels_per_tick; + uint8_t fov_cur_w = ceil((float)(cur_w)*fov_pixels_per_tick); if (fov_cur_x < 0) { fov_cur_x = 0; } From b2bf33484d7cd50bb26c597b79d1a34d667a0f34 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 19 Jul 2023 13:29:35 +1000 Subject: [PATCH 286/413] cancel slide when loading new track --- avr/cores/megacommand/MCL/ExtSeqTrack.h | 2 +- avr/cores/megacommand/MCL/MDSeqTrack.h | 2 +- avr/cores/megacommand/MCL/SeqTrack.h | 8 ++++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.h b/avr/cores/megacommand/MCL/ExtSeqTrack.h index e30158995..f30ef82f1 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.h +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.h @@ -161,7 +161,7 @@ class ExtSeqTrack : public ExtSeqTrackData, public SeqSlideTrack { ExtSeqTrack() : SeqSlideTrack() { active = EXT_TRACK_TYPE; } ALWAYS_INLINE() void reset() { - SeqTrack::reset(); + SeqSlideTrack::reset(); memset(oneshot_mask,0,sizeof(oneshot_mask)); memset(ignore_notes,0, sizeof(ignore_notes)); pgm_oneshot = 0; diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.h b/avr/cores/megacommand/MCL/MDSeqTrack.h index f20365be1..cd8f21791 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.h +++ b/avr/cores/megacommand/MCL/MDSeqTrack.h @@ -27,7 +27,7 @@ class MDSeqTrack : public MDSeqTrackData, public SeqSlideTrack { MDSeqTrack() : SeqSlideTrack() { active = MD_TRACK_TYPE; } ALWAYS_INLINE() void reset() { - SeqTrack::reset(); + SeqSlideTrack::reset(); oneshot_mask = 0; record_mutes = false; } diff --git a/avr/cores/megacommand/MCL/SeqTrack.h b/avr/cores/megacommand/MCL/SeqTrack.h index 3f521737d..a48de22c9 100644 --- a/avr/cores/megacommand/MCL/SeqTrack.h +++ b/avr/cores/megacommand/MCL/SeqTrack.h @@ -299,6 +299,14 @@ class SeqSlideTrack : public SeqTrack { uint8_t locks_slides_recalc = 255; uint16_t locks_slides_idx = 0; + ALWAYS_INLINE() void reset() { + for (uint8_t n = 0; n < NUM_LOCKS; n++) { + locks_slide_data[n].init(); + } + SeqTrack::reset(); + } + + void prepare_slide(uint8_t lock_idx, int16_t x0, int16_t x1, int8_t y0, int8_t y1); void send_slides(volatile uint8_t *locks_params, uint8_t channel = 0); From 0517fd70a69562c157f85317438ea2ee30dcda8e Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 19 Jul 2023 13:29:53 +1000 Subject: [PATCH 287/413] Fix sample browser size regression --- avr/cores/megacommand/MCL/SampleBrowserPage.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/SampleBrowserPage.cpp b/avr/cores/megacommand/MCL/SampleBrowserPage.cpp index e25ce321b..7ac7e9d2f 100644 --- a/avr/cores/megacommand/MCL/SampleBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/SampleBrowserPage.cpp @@ -29,6 +29,7 @@ void SampleBrowserPage::display() { if (clock_diff(FileBrowserPage::selection_change_clock, slowclock) < 200) { goto end; } + FileBrowserPage::selection_change = false; char temp_entry[FILE_ENTRY_SIZE]; get_entry(encoders[1]->getValue(), temp_entry); @@ -79,6 +80,7 @@ void SampleBrowserPage::display() { size = tmp_file.size(); tmp_file.close(); } + else { goto end; } oled_display.setCursor(0, 30); if (size < 1024) { oled_display.print(size); @@ -90,8 +92,8 @@ void SampleBrowserPage::display() { } } } -end: FileBrowserPage::selection_change = false; +end: draw_filebrowser(); oled_display.display(); } From 3d0ce9ced9eb88ff7484a9608034d27f1fb41af3 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 19 Jul 2023 14:17:09 +1000 Subject: [PATCH 288/413] Save popup glitch? --- avr/cores/megacommand/MCL/GridSavePage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/GridSavePage.cpp b/avr/cores/megacommand/MCL/GridSavePage.cpp index d5fc843ac..c5313fcc4 100644 --- a/avr/cores/megacommand/MCL/GridSavePage.cpp +++ b/avr/cores/megacommand/MCL/GridSavePage.cpp @@ -157,7 +157,7 @@ bool GridSavePage::handleEvent(gui_event_t *event) { track_select_array_from_type_select(track_select_array); oled_display.textbox("SAVE GROUPS", ""); - oled_display.display(); + //oled_display.display(); uint8_t save_mode = SAVE_SEQ; From 32ecc22054ea6fe8ecfa20390cd1778064bb6890 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 19 Jul 2023 14:58:26 +1000 Subject: [PATCH 289/413] boost trig interface throttle to 30ms --- avr/cores/megacommand/MCL/TrigInterface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/TrigInterface.cpp b/avr/cores/megacommand/MCL/TrigInterface.cpp index 1a7cf77a8..85c3a0887 100644 --- a/avr/cores/megacommand/MCL/TrigInterface.cpp +++ b/avr/cores/megacommand/MCL/TrigInterface.cpp @@ -85,7 +85,7 @@ bool TrigInterface::off() { } bool TrigInterface::check_key_throttle() { - if (clock_diff(last_clock, slowclock) < 10) { + if (clock_diff(last_clock, slowclock) < 30) { return true; } else { throttle = false; From a23becadd238a83e1240f05915532767fd9b5f67 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 19 Jul 2023 22:38:54 +1000 Subject: [PATCH 290/413] fw caps --- avr/cores/megacommand/Elektron/Elektron.h | 1 + avr/cores/megacommand/MD/MD.cpp | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/avr/cores/megacommand/Elektron/Elektron.h b/avr/cores/megacommand/Elektron/Elektron.h index dbe2f253b..aa6c4d076 100644 --- a/avr/cores/megacommand/Elektron/Elektron.h +++ b/avr/cores/megacommand/Elektron/Elektron.h @@ -314,6 +314,7 @@ class ElektronSysexObject { #define FW_CAP_ENHANCED_GUI FW_CAP_HIGH(2) #define FW_CAP_ENHANCED_MIDI FW_CAP_HIGH(3) #define FW_CAP_MACHINE_CACHE FW_CAP_HIGH(4) +#define FW_CAP_UNDO_CACHE FW_CAP_HIGH(5) /// Base class for Elektron MidiDevice class ElektronDevice : public MidiDevice { diff --git a/avr/cores/megacommand/MD/MD.cpp b/avr/cores/megacommand/MD/MD.cpp index cb3bd0cca..89f6fbe63 100644 --- a/avr/cores/megacommand/MD/MD.cpp +++ b/avr/cores/megacommand/MD/MD.cpp @@ -202,7 +202,8 @@ bool MDClass::probe() { uint16_t fw_caps_mask = ((uint16_t)FW_CAP_MASTER_FX | (uint16_t)FW_CAP_TRIG_LEDS | (uint16_t)FW_CAP_UNDOKIT_SYNC | (uint16_t)FW_CAP_TONAL | - (uint16_t)FW_CAP_ENHANCED_GUI | (uint16_t)FW_CAP_ENHANCED_MIDI) | (uint16_t)FW_CAP_MACHINE_CACHE; + (uint16_t)FW_CAP_ENHANCED_GUI | (uint16_t)FW_CAP_ENHANCED_MIDI) | + (uint16_t)FW_CAP_MACHINE_CACHE | (uint16_t)FW_CAP_UNDO_CACHE; while ((!get_fw_caps() || ((fw_caps & fw_caps_mask) != fw_caps_mask)) && count) { From 8a24fa54d41b1d4c8186e7957f97fed7cc98f4df Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 20 Jul 2023 00:05:40 +1000 Subject: [PATCH 291/413] Mixer page trig down + yes regression --- avr/cores/megacommand/MCL/MixerPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 1558df8c9..c4932e908 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -561,7 +561,7 @@ bool MixerPage::handleEvent(gui_event_t *event) { midi_device->muteTrack(i, mute_state); if (current_mute_set == 255) { - break; + continue; } uint8_t state = IS_BIT_SET16( mute_sets[!is_md_device].mutes[current_mute_set], i); From 4ffcbd16fd744a19ea40526684e5d0517c2bd4f8 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 20 Jul 2023 00:10:11 +1000 Subject: [PATCH 292/413] Don't re-setup perfpage on first open --- avr/cores/megacommand/MCL/PerfPage.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 65613b6d3..814c8f669 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -17,6 +17,7 @@ void PerfPage::setup() { perf_encoders[1] = &perf_param2; perf_encoders[2] = &perf_param3; perf_encoders[3] = &perf_param4; + isSetup = true; } void PerfPage::init() { From 008ffa57d38a19ec561006bee45ca7fd3b952fd9 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 21 Jul 2023 00:10:32 +1000 Subject: [PATCH 293/413] Bad --- avr/cores/megacommand/MCL/SeqPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index cdc65251c..b7e1f9347 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -414,7 +414,7 @@ bool SeqPage::handleEvent(gui_event_t *event) { if (show_seq_menu) { row_func = seq_menu_page.menu.get_row_function(seq_menu_page.encoders[1]->cur); - uint8_t old_dev = midi_device; + MidiDevice* old_dev = midi_device; midi_device = midi_active_peering.get_device(mcl_cfg.seq_dev); if (old_dev == midi_device) { opt_speed_handler(); From 369610e10bbdf058f94f45409c7700133d8f89ed Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 21 Jul 2023 00:10:54 +1000 Subject: [PATCH 294/413] Add mute state perf locks --- avr/cores/megacommand/MCL/MCL.h | 2 +- avr/cores/megacommand/MCL/MCLGUI.cpp | 6 +- avr/cores/megacommand/MCL/MCLGUI.h | 2 +- avr/cores/megacommand/MCL/MCLMemory.h | 2 +- avr/cores/megacommand/MCL/MDTempoTrack.cpp | 2 +- avr/cores/megacommand/MCL/MixerPage.cpp | 666 ++++++++++++--------- avr/cores/megacommand/MCL/MixerPage.h | 7 + avr/cores/megacommand/MCL/PerfEncoder.cpp | 3 - avr/cores/megacommand/MCL/PerfPage.cpp | 15 +- avr/cores/megacommand/MCL/PerfPage.h | 1 + avr/cores/megacommand/MCL/PerfTrack.cpp | 2 + avr/cores/megacommand/MCL/PerfTrack.h | 1 + 12 files changed, 405 insertions(+), 304 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCL.h b/avr/cores/megacommand/MCL/MCL.h index d40364a8f..bebbe4b06 100644 --- a/avr/cores/megacommand/MCL/MCL.h +++ b/avr/cores/megacommand/MCL/MCL.h @@ -17,7 +17,7 @@ #include "Fonts/TomThumb.h" #define VERSION 4050 -#define VERSION_STR "LL4.50" +#define VERSION_STR "PP4.50" #define CALLBACK_TIMEOUT 500 #define GUI_NAME_TIMEOUT 800 diff --git a/avr/cores/megacommand/MCL/MCLGUI.cpp b/avr/cores/megacommand/MCL/MCLGUI.cpp index 877f3d2d4..54de0a443 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.cpp +++ b/avr/cores/megacommand/MCL/MCLGUI.cpp @@ -273,7 +273,7 @@ void MCLGUI::draw_infobox(const char *line1, const char *line2, oled_display.setFont(oldfont); } -void MCLGUI::draw_encoder(uint8_t x, uint8_t y, uint8_t value) { +void MCLGUI::draw_encoder(uint8_t x, uint8_t y, uint8_t value, bool highlight) { bool vert_flip = false; bool horiz_flip = false; uint8_t image_w = 11; @@ -324,6 +324,8 @@ void MCLGUI::draw_encoder(uint8_t x, uint8_t y, uint8_t value) { oled_display.drawBitmap(x, y, icon, image_w, image_h, WHITE, vert_flip, horiz_flip); + + if (highlight) { oled_display.fillRect(x, y,11,11,INVERT); } } void MCLGUI::draw_encoder(uint8_t x, uint8_t y, Encoder *encoder) { @@ -448,8 +450,8 @@ void MCLGUI::draw_light_encoder(uint8_t x, uint8_t y, uint8_t value, y += 2; draw_encoder(x, y, value); + if (highlight) { oled_display.fillRect(x - 2, 0, 15,20,INVERT); } - if (highlight) { oled_display.fillRect(x - 2,0,15,20,INVERT); } oled_display.setFont(oldfont); } diff --git a/avr/cores/megacommand/MCL/MCLGUI.h b/avr/cores/megacommand/MCL/MCLGUI.h index efeb74f57..310be7c42 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.h +++ b/avr/cores/megacommand/MCL/MCLGUI.h @@ -65,7 +65,7 @@ class MCLGUI { void clear_leftpane(); void clear_rightpane(); - void draw_encoder(uint8_t x, uint8_t y, uint8_t value); + void draw_encoder(uint8_t x, uint8_t y, uint8_t value, bool highlight = false); void draw_encoder(uint8_t x, uint8_t y, Encoder *encoder); bool show_encoder_value(Encoder *encoder, int timeout = SHOW_VALUE_TIMEOUT); diff --git a/avr/cores/megacommand/MCL/MCLMemory.h b/avr/cores/megacommand/MCL/MCLMemory.h index 3caa00732..847d142d0 100644 --- a/avr/cores/megacommand/MCL/MCLMemory.h +++ b/avr/cores/megacommand/MCL/MCLMemory.h @@ -74,7 +74,7 @@ constexpr size_t MDLFO_TRACK_LEN = 226; constexpr size_t MDROUTE_TRACK_LEN = 25; constexpr size_t MDFX_TRACK_LEN = 43; constexpr size_t MDTEMPO_TRACK_LEN = 11; -constexpr size_t PERF_TRACK_LEN = 475; +constexpr size_t PERF_TRACK_LEN = 491; constexpr size_t GRIDCHAIN_TRACK_LEN = 551; //Use these to produce compiler errors that probes the sizes! diff --git a/avr/cores/megacommand/MCL/MDTempoTrack.cpp b/avr/cores/megacommand/MCL/MDTempoTrack.cpp index cd14a438d..040a355cb 100644 --- a/avr/cores/megacommand/MCL/MDTempoTrack.cpp +++ b/avr/cores/megacommand/MCL/MDTempoTrack.cpp @@ -23,7 +23,7 @@ void MDTempoTrack::get_tempo() { if (MidiClock.uart_clock_recv == &MidiUart) { uint16_t tp; if (MD.get_tempo(tp)) { - tempo = (float)tp / 24.0; + tempo = (float)tp * 0.0416667; return; } } diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index c4932e908..5ed5673d5 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -2,7 +2,7 @@ #include "ResourceManager.h" #define FADER_LEN 18 -#define FADE_RATE 0.0625 +#define FADE_RATE 16 void MixerPage::set_display_mode(uint8_t param) { if (display_mode != param) { @@ -12,7 +12,6 @@ void MixerPage::set_display_mode(uint8_t param) { } void MixerPage::oled_draw_mutes() { - if (draw_encoders) { return; } bool is_md_device = (midi_device == &MD); uint8_t len = is_md_device ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; @@ -69,6 +68,7 @@ void MixerPage::init() { first_track = 255; redraw_mask = -1; show_mixer_menu = 0; + memset(perf_locks_temp, 255, sizeof(perf_locks_temp)); // populate_mute_set(); draw_encoders = false; redraw_mutes = true; @@ -91,31 +91,55 @@ void MixerPage::set_level(int curtrack, int value) { // in_sysex = 0; } +void MixerPage::load_perf_locks(uint8_t state) { + for (uint8_t n = 0; n < GUI_NUM_ENCODERS; n++) { + uint8_t val = perf_locks[state][n]; + if (val < 128) { + encoders[n]->cur = val; + } + } +} + void MixerPage::loop() { constexpr int timeout = 1500; perf_page.func_enc_check(); bool old_draw_encoders = draw_encoders; + + if (preview_mute_set != 255 && note_interface.notes_on == 0) { + for (uint8_t n = 0; n < GUI_NUM_ENCODERS; n++) { + if (encoders[n]->hasChanged()) { + if (BUTTON_DOWN(Buttons.ENCODER1 + n)) { + GUI.ignoreNextEvent(Buttons.ENCODER1 + n); + } + perf_locks[preview_mute_set][n] = encoders[n]->cur; + encoders[n]->old = encoders[n]->cur; + } + } + } + perf_page.encoder_send(); + if (draw_encoders && trig_interface.is_key_down(MDX_KEY_FUNC)) { draw_encoders = true; } else { draw_encoders = false; for (uint8_t n = 0; n < 4; n++) { - uint64_t mask = ((uint64_t)1 << MDX_KEY_LEFT) | ((uint64_t)1 << MDX_KEY_UP) | - ((uint64_t)1 << MDX_KEY_RIGHT) | ((uint64_t)1 << MDX_KEY_DOWN) | - ((uint64_t)1 << MDX_KEY_YES); - bool check = (trig_interface.cmd_key_state & mask); - - if (note_interface.notes_on || check) { - encoders_used_clock[n] = slowclock + timeout + 1; } - if (mcl_gui.show_encoder_value(encoders[n],timeout)) { - draw_encoders = true; } + uint64_t mask = + ((uint64_t)1 << MDX_KEY_LEFT) | ((uint64_t)1 << MDX_KEY_UP) | + ((uint64_t)1 << MDX_KEY_RIGHT) | ((uint64_t)1 << MDX_KEY_DOWN) | + ((uint64_t)1 << MDX_KEY_YES); + bool check = (trig_interface.cmd_key_state & mask); + + if (note_interface.notes_on || check) { + encoders_used_clock[n] = slowclock + timeout + 1; + } + if (mcl_gui.show_encoder_value(encoders[n], timeout)) { + draw_encoders = true; + } } } if (draw_encoders != old_draw_encoders) { if (!draw_encoders) { - redraw_mask = -1; - oled_display.clearDisplay(); - oled_draw_mutes(); + redraw(); } } @@ -139,9 +163,9 @@ void encoder_level_handle(EncoderParent *enc) { for (int i = 0; i < 16; i++) { if (note_interface.is_note_on(i)) { - track_newval = min(max(MD.kit.levels[i] + dir, 0), 127); - mixer_page.set_level(i, track_newval); - SET_BIT16(mixer_page.redraw_mask, i); + track_newval = min(max(MD.kit.levels[i] + dir, 0), 127); + mixer_page.set_level(i, track_newval); + SET_BIT16(mixer_page.redraw_mask, i); } } enc->cur = 64 + dir; @@ -210,9 +234,9 @@ void MixerPage::adjust_param(EncoderParent *enc, uint8_t param) { for (int i = 0; i < 16; i++) { if (note_interface.is_note_on(i)) { - newval = min(max(MD.kit.params[i][param] + dir, 0), 127); - MD.setTrackParam(i, param, newval, nullptr, true); - SET_BIT16(redraw_mask, i); + newval = min(max(MD.kit.params[i][param] + dir, 0), 127); + MD.setTrackParam(i, param, newval, nullptr, true); + SET_BIT16(redraw_mask, i); } } enc->cur = 64 + dir; @@ -228,39 +252,21 @@ void MixerPage::display() { redraw_mask = -1; } - else if (draw_encoders) { - // oled_display.clearDisplay(); - oled_display.fillRect(0, 0, 128, 12, BLACK); - for (uint8_t n = 0; n < 4; n++) { - char str1[] = "A"; - str1[0] = 'A' + n; - uint8_t pos = n * 24; - mcl_gui.draw_encoder(24 + pos, 0, encoders[n]->cur); - oled_display.setCursor(16 + pos, 2); - oled_display.print(str1); - } - } else if (redraw_mutes) { + if (redraw_mutes) { oled_draw_mutes(); redraw_mutes = false; } - uint8_t fader_level; - uint8_t meter_level; - uint8_t fader_x = 0; - constexpr uint8_t fader_y = 11; bool is_md_device = (midi_device == &MD); - - uint8_t len = is_md_device ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; - uint8_t *levels = is_md_device ? disp_levels : ext_disp_levels; - + constexpr uint8_t fader_y = 11; if (preview_mute_set != 255) { if (mute_sets[!is_md_device].mutes[preview_mute_set] != seq_step_page.mute_mask) { - seq_step_page.mute_mask = - mute_sets[!is_md_device].mutes[preview_mute_set]; - MD.set_trigleds(mute_sets[!is_md_device].mutes[preview_mute_set], - TRIGLED_EXCLUSIVE); - oled_draw_mutes(); + seq_step_page.mute_mask = + mute_sets[!is_md_device].mutes[preview_mute_set]; + MD.set_trigleds(mute_sets[!is_md_device].mutes[preview_mute_set], + TRIGLED_EXCLUSIVE); + oled_draw_mutes(); } } else if (show_mixer_menu && seq_step_page.display_mute_mask(midi_device)) { oled_draw_mutes(); @@ -271,49 +277,75 @@ void MixerPage::display() { oled_draw_mutes(); } - uint8_t dec = MidiClock.get_tempo() * FADE_RATE; - - for (int i = 0; i < len; i++) { - - if (is_md_device) { - if (display_mode == MODEL_LEVEL) { - fader_level = MD.kit.levels[i]; - } else { - fader_level = MD.kit.params[i][display_mode]; - } - } else { - fader_level = 127; + if (draw_encoders || preview_mute_set != 255) { + // oled_display.clearDisplay(); + oled_display.fillRect(0, fader_y, 128, 21, BLACK); + for (uint8_t n = 0; n < 4; n++) { + char str1[] = "A"; + str1[0] = 'A' + n; + uint8_t pos = n * 24; + bool highlight = + (preview_mute_set != 255) && (perf_locks[preview_mute_set][n] != 255); + uint8_t val = + highlight ? perf_locks[preview_mute_set][n] : encoders[n]->cur; + mcl_gui.draw_encoder(24 + pos, fader_y + 4, val, highlight); + oled_display.setCursor(16 + pos, fader_y + 6); + oled_display.print(str1); } + oled_display.display(); + } else { - fader_level = ((fader_level * 0.00787) * FADER_LEN) + 0; - meter_level = ((levels[i] * 0.00787) * FADER_LEN) + 0; - meter_level = min(fader_level, meter_level); + uint8_t fader_level; + uint8_t meter_level; + uint8_t fader_x = 0; - if (IS_BIT_SET16(redraw_mask, i)) { - oled_display.fillRect(fader_x, fader_y - 1, 6, FADER_LEN + 1, BLACK); - oled_display.drawRect(fader_x, fader_y + (FADER_LEN - fader_level), 6, - fader_level + 2, WHITE); - } - if (note_interface.is_note_on(i)) { - oled_display.fillRect(fader_x, fader_y + 1 + (FADER_LEN - fader_level), - 6, fader_level, WHITE); - } else { + uint8_t len = is_md_device ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; + uint8_t *levels = is_md_device ? disp_levels : ext_disp_levels; - oled_display.fillRect(fader_x + 1, - fader_y + 1 + (FADER_LEN - fader_level), 4, - FADER_LEN - meter_level - 1, BLACK); - oled_display.fillRect(fader_x + 1, - fader_y + 1 + (FADER_LEN - meter_level), 4, - meter_level + 1, WHITE); - } - fader_x += 8; + uint8_t dec = (uint16_t)MidiClock.get_tempo() / FADE_RATE; - CLEAR_BIT16(redraw_mask, i); + for (int i = 0; i < len; i++) { - if (levels[i] < dec) { - levels[i] = 0; - } else { - levels[i] -= dec; + if (is_md_device) { + if (display_mode == MODEL_LEVEL) { + fader_level = MD.kit.levels[i]; + } else { + fader_level = MD.kit.params[i][display_mode]; + } + } else { + fader_level = 127; + } + + fader_level = ((fader_level * 0.00787) * FADER_LEN) + 0; + meter_level = ((levels[i] * 0.00787) * FADER_LEN) + 0; + meter_level = min(fader_level, meter_level); + + if (IS_BIT_SET16(redraw_mask, i)) { + oled_display.fillRect(fader_x, fader_y - 1, 6, FADER_LEN + 1, BLACK); + oled_display.drawRect(fader_x, fader_y + (FADER_LEN - fader_level), 6, + fader_level + 2, WHITE); + } + if (note_interface.is_note_on(i)) { + oled_display.fillRect(fader_x, fader_y + 1 + (FADER_LEN - fader_level), + 6, fader_level, WHITE); + } else { + + oled_display.fillRect(fader_x + 1, + fader_y + 1 + (FADER_LEN - fader_level), 4, + FADER_LEN - meter_level - 1, BLACK); + oled_display.fillRect(fader_x + 1, + fader_y + 1 + (FADER_LEN - meter_level), 4, + meter_level + 1, WHITE); + } + fader_x += 8; + + CLEAR_BIT16(redraw_mask, i); + + if (levels[i] < dec) { + levels[i] = 0; + } else { + levels[i] -= dec; + } } } @@ -339,20 +371,20 @@ void MixerPage::disable_record_mutes() { for (uint8_t n = 0; n < mcl_seq.num_md_tracks; n++) { if (n < mcl_seq.num_ext_tracks) { - if (mcl_seq.ext_tracks[n].record_mutes) { - mcl_seq.ext_tracks[n].record_mutes = false; - if (mcl_seq.ext_tracks[n].mute_state == SEQ_MUTE_ON) { - mcl_seq.ext_tracks[n].toggle_mute(); - devs[1]->muteTrack(n, SEQ_MUTE_OFF); - } - } + if (mcl_seq.ext_tracks[n].record_mutes) { + mcl_seq.ext_tracks[n].record_mutes = false; + if (mcl_seq.ext_tracks[n].mute_state == SEQ_MUTE_ON) { + mcl_seq.ext_tracks[n].toggle_mute(); + devs[1]->muteTrack(n, SEQ_MUTE_OFF); + } + } } if (mcl_seq.md_tracks[n].record_mutes) { - mcl_seq.md_tracks[n].record_mutes = false; - if (mcl_seq.md_tracks[n].mute_state == SEQ_MUTE_ON) { - mcl_seq.md_tracks[n].toggle_mute(); - devs[0]->muteTrack(n, SEQ_MUTE_OFF); - } + mcl_seq.md_tracks[n].record_mutes = false; + if (mcl_seq.md_tracks[n].mute_state == SEQ_MUTE_ON) { + mcl_seq.md_tracks[n].toggle_mute(); + devs[0]->muteTrack(n, SEQ_MUTE_OFF); + } } } if (!seq_step_page.recording) { @@ -369,18 +401,20 @@ void MixerPage::populate_mute_set() { uint8_t len = (dev == 0) ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; for (uint8_t n = 0; n < len; n++) { - SeqTrack *seq_track = (dev == 0) ? (SeqTrack *)&mcl_seq.md_tracks[n] - : (SeqTrack *)&mcl_seq.ext_tracks[n]; - if (seq_track->mute_state == SEQ_MUTE_ON) { - CLEAR_BIT16(mute_sets[dev].mutes[current_mute_set], n); - } else { - SET_BIT16(mute_sets[dev].mutes[current_mute_set], n); - } + SeqTrack *seq_track = (dev == 0) ? (SeqTrack *)&mcl_seq.md_tracks[n] + : (SeqTrack *)&mcl_seq.ext_tracks[n]; + if (seq_track->mute_state == SEQ_MUTE_ON) { + CLEAR_BIT16(mute_sets[dev].mutes[current_mute_set], n); + } else { + SET_BIT16(mute_sets[dev].mutes[current_mute_set], n); + } } } } void MixerPage::switch_mute_set(uint8_t state) { + load_perf_locks(state); + if (current_mute_set == state) { return; } @@ -396,21 +430,29 @@ void MixerPage::switch_mute_set(uint8_t state) { for (uint8_t dev = 0; dev < 2; dev++) { bool is_md_device = dev == 0; - uint8_t len = (is_md_device) ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; + uint8_t len = + (is_md_device) ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; for (uint8_t n = 0; n < len; n++) { - SeqTrack *seq_track = (is_md_device) ? (SeqTrack *)&mcl_seq.md_tracks[n] - : (SeqTrack *)&mcl_seq.ext_tracks[n]; - bool mute_state = IS_BIT_CLEAR16(mute_sets[dev].mutes[state], n); - - if (mute_state != seq_track->mute_state) { - devs[dev]->muteTrack(n, mute_state); - if (is_md_device) { mcl_seq.md_tracks[n].toggle_mute(); } - else { mcl_seq.ext_tracks[n].toggle_mute(); } + SeqTrack *seq_track = (is_md_device) ? (SeqTrack *)&mcl_seq.md_tracks[n] + : (SeqTrack *)&mcl_seq.ext_tracks[n]; + bool mute_state = state < 4 + ? IS_BIT_CLEAR16(mute_sets[dev].mutes[state], n) + : !seq_track->mute_state; + + if (mute_state != seq_track->mute_state) { + devs[dev]->muteTrack(n, mute_state); + if (is_md_device) { + mcl_seq.md_tracks[n].toggle_mute(); + } else { + mcl_seq.ext_tracks[n].toggle_mute(); } + } } } - current_mute_set = state; + if (state < 4) { + current_mute_set = state; + } oled_draw_mutes(); } uint8_t MixerPage::get_mute_set(uint8_t key) { @@ -424,6 +466,13 @@ uint8_t MixerPage::get_mute_set(uint8_t key) { } return 0; } + +void MixerPage::redraw() { + redraw_mask = -1; + oled_display.clearDisplay(); + oled_draw_mutes(); +} + bool MixerPage::handleEvent(gui_event_t *event) { if (note_interface.is_event(event)) { uint8_t mask = event->mask; @@ -437,68 +486,67 @@ bool MixerPage::handleEvent(gui_event_t *event) { uint8_t len = is_md_device ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; if (track > 16) { - return false; + return false; } if (!show_mixer_menu && preview_mute_set == 255) { - trig_interface.send_md_leds(TRIGLED_OVERLAY); + trig_interface.send_md_leds(TRIGLED_OVERLAY); } if (event->mask == EVENT_BUTTON_PRESSED && track <= len) { - if (note_interface.is_note(track)) { - if (show_mixer_menu || preview_mute_set != 255) { - - SeqTrack *seq_track = is_md_device - ? (SeqTrack *)&mcl_seq.md_tracks[track] - : (SeqTrack *)&mcl_seq.ext_tracks[track]; - - uint8_t mute_set = current_mute_set; - uint8_t state = 0; - - if (preview_mute_set == 255 || - preview_mute_set == current_mute_set) { - seq_track->toggle_mute(); - midi_device->muteTrack(track, seq_track->mute_state); - state = seq_track->mute_state; - if (preview_mute_set == current_mute_set) { - goto update_mute_set; - } - } else { - update_mute_set: - mute_set = preview_mute_set; - state = IS_BIT_SET16(mute_sets[!is_md_device].mutes[mute_set], - track); - } - - if (mute_set == 255) { - return; - } - - if (state == SEQ_MUTE_ON) { - CLEAR_BIT16(mute_sets[!is_md_device].mutes[mute_set], track); - } else { - SET_BIT16(mute_sets[!is_md_device].mutes[mute_set], track); - } - - if (trig_interface.is_key_down(MDX_KEY_PATSONG)) { - seq_track->record_mutes = true; - } - // oled_draw_mutes(); - } else if (first_track == 255) { - first_track = track; - MD.setStatus(0x22, track); - } - } - return true; + if (note_interface.is_note(track)) { + if (show_mixer_menu || preview_mute_set != 255) { + + SeqTrack *seq_track = is_md_device + ? (SeqTrack *)&mcl_seq.md_tracks[track] + : (SeqTrack *)&mcl_seq.ext_tracks[track]; + + uint8_t mute_set = current_mute_set; + uint8_t state = 0; + + if (preview_mute_set == 255 || preview_mute_set == current_mute_set) { + seq_track->toggle_mute(); + midi_device->muteTrack(track, seq_track->mute_state); + state = seq_track->mute_state; + if (preview_mute_set == current_mute_set) { + goto update_mute_set; + } + } else { + update_mute_set: + mute_set = preview_mute_set; + state = + IS_BIT_SET16(mute_sets[!is_md_device].mutes[mute_set], track); + } + + if (mute_set == 255) { + return; + } + + if (state == SEQ_MUTE_ON) { + CLEAR_BIT16(mute_sets[!is_md_device].mutes[mute_set], track); + } else { + SET_BIT16(mute_sets[!is_md_device].mutes[mute_set], track); + } + + if (trig_interface.is_key_down(MDX_KEY_PATSONG)) { + seq_track->record_mutes = true; + } + // oled_draw_mutes(); + } else if (first_track == 255) { + first_track = track; + MD.setStatus(0x22, track); + } + } + return true; } if (event->mask == EVENT_BUTTON_RELEASED) { - SET_BIT16(redraw_mask, track); - if (note_interface.notes_count_on() == 0) { - first_track = 255; - note_interface.init_notes(); - oled_draw_mutes(); - } - return true; + SET_BIT16(redraw_mask, track); + if (note_interface.notes_count_on() == 0) { + first_track = 255; + note_interface.init_notes(); + oled_draw_mutes(); + } + return true; } } /* @@ -514,119 +562,140 @@ bool MixerPage::handleEvent(gui_event_t *event) { if (EVENT_CMD(event)) { uint8_t key = event->source - 64; if (event->mask == EVENT_BUTTON_PRESSED) { - switch (key) { - case MDX_KEY_NO: { - if (note_interface.notes_count_on() == 0) { - disable_record_mutes(); - mcl.setPage(fx_page_a.last_page); - return true; - } - if (midi_device == &MD) { - for (uint8_t i = 0; i < 16; i++) { - if (note_interface.is_note_on(i)) { - for (uint8_t c = 0; c < 24; c++) { - MD.restore_kit_param(i, c); - } - } - } - } - break; - } - case MDX_KEY_YES: { - if (trig_interface.is_key_down(MDX_KEY_LEFT)) { - switch_mute_set(1); - break; - } else if (trig_interface.is_key_down(MDX_KEY_UP)) { - switch_mute_set(2); - break; - } else if (trig_interface.is_key_down(MDX_KEY_RIGHT)) { - switch_mute_set(3); - break; - } else if (trig_interface.is_key_down(MDX_KEY_DOWN)) { - switch_mute_set(0); - break; - } else { - if (!note_interface.notes_on) { - seq_step_page.mute_mask = 0; - show_mixer_menu = true; - } else { - uint8_t is_md_device = (midi_device == &MD); - uint8_t len = is_md_device ? mcl_seq.num_md_tracks - : mcl_seq.num_ext_tracks; - for (int i = 0; i < len; i++) { - if (note_interface.is_note_on(i)) { - bool mute_state = false; - if (is_md_device) { mcl_seq.md_tracks[i].toggle_mute(); mute_state = mcl_seq.md_tracks[i].mute_state; } - else { mcl_seq.ext_tracks[i].toggle_mute(); mute_state = mcl_seq.ext_tracks[i].mute_state; } - - midi_device->muteTrack(i, mute_state); - if (current_mute_set == 255) { - continue; - } - uint8_t state = IS_BIT_SET16( - mute_sets[!is_md_device].mutes[current_mute_set], i); - if (state == SEQ_MUTE_ON) { - CLEAR_BIT16( - mute_sets[!is_md_device].mutes[current_mute_set], i); - } else { - SET_BIT16(mute_sets[!is_md_device].mutes[current_mute_set], - i); - } - } - } - } - } - break; - } - - case MDX_KEY_LEFT: - case MDX_KEY_UP: - case MDX_KEY_RIGHT: - case MDX_KEY_DOWN: { - uint8_t set = get_mute_set(key); - if (trig_interface.is_key_down(MDX_KEY_YES)) { - switch_mute_set(set); - } else { - preview_mute_set = set; - // force redraw in display() - seq_step_page.mute_mask++; - } - break; - } - case MDX_KEY_SCALE: { - if (midi_device != &MD) { - midi_device = &MD; - } else { - midi_device = midi_active_peering.get_device(UART2_PORT); - } - redraw_mask = -1; - oled_display.clearDisplay(); - oled_draw_mutes(); - break; - } - } + switch (key) { + case MDX_KEY_NO: { + if (note_interface.notes_count_on() == 0) { + disable_record_mutes(); + mcl.setPage(fx_page_a.last_page); + return true; + } + if (midi_device == &MD) { + for (uint8_t i = 0; i < 16; i++) { + if (note_interface.is_note_on(i)) { + for (uint8_t c = 0; c < 24; c++) { + MD.restore_kit_param(i, c); + } + } + } + } + break; + } + case MDX_KEY_YES: { + if (trig_interface.is_key_down(MDX_KEY_FUNC)) { + switch_mute_set(4); //---> Flip mutes + break; + } + if (trig_interface.is_key_down(MDX_KEY_LEFT)) { + switch_mute_set(1); + break; + } else if (trig_interface.is_key_down(MDX_KEY_UP)) { + switch_mute_set(2); + break; + } else if (trig_interface.is_key_down(MDX_KEY_RIGHT)) { + switch_mute_set(3); + break; + } else if (trig_interface.is_key_down(MDX_KEY_DOWN)) { + switch_mute_set(0); + break; + } else { + if (!note_interface.notes_on) { + seq_step_page.mute_mask = 0; + show_mixer_menu = true; + } else { + uint8_t is_md_device = (midi_device == &MD); + uint8_t len = + is_md_device ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; + for (int i = 0; i < len; i++) { + if (note_interface.is_note_on(i)) { + bool mute_state = false; + if (is_md_device) { + mcl_seq.md_tracks[i].toggle_mute(); + mute_state = mcl_seq.md_tracks[i].mute_state; + } else { + mcl_seq.ext_tracks[i].toggle_mute(); + mute_state = mcl_seq.ext_tracks[i].mute_state; + } + + midi_device->muteTrack(i, mute_state); + if (current_mute_set == 255) { + continue; + } + uint8_t state = IS_BIT_SET16( + mute_sets[!is_md_device].mutes[current_mute_set], i); + if (state == SEQ_MUTE_ON) { + CLEAR_BIT16(mute_sets[!is_md_device].mutes[current_mute_set], + i); + } else { + SET_BIT16(mute_sets[!is_md_device].mutes[current_mute_set], + i); + } + } + } + } + } + break; + } + + case MDX_KEY_LEFT: + case MDX_KEY_UP: + case MDX_KEY_RIGHT: + case MDX_KEY_DOWN: { + uint8_t set = get_mute_set(key); + if (trig_interface.is_key_down(MDX_KEY_YES)) { + switch_mute_set(set); + } else { + preview_mute_set = set; + for (uint8_t n = 0; n < 4; n++) { + if (perf_locks_temp[n] == 255) { + perf_locks_temp[n] = encoders[n]->cur; + encoders[n]->old = encoders[n]->cur; + } + } + // force redraw in display() + seq_step_page.mute_mask++; + } + break; + } + case MDX_KEY_SCALE: { + if (midi_device != &MD) { + midi_device = &MD; + } else { + midi_device = midi_active_peering.get_device(UART2_PORT); + } + redraw(); + break; + } + } } if (event->mask == EVENT_BUTTON_RELEASED) { - switch (key) { - case MDX_KEY_GLOBAL: - case MDX_KEY_YES: { - goto global_release; - } - case MDX_KEY_LEFT: - case MDX_KEY_UP: - case MDX_KEY_RIGHT: - case MDX_KEY_DOWN: { - uint64_t mask = ((uint64_t)1 << MDX_KEY_LEFT) | ((uint64_t)1 << MDX_KEY_UP) | - ((uint64_t)1 << MDX_KEY_RIGHT) | ((uint64_t)1 << MDX_KEY_DOWN) | - ((uint64_t)1 << MDX_KEY_YES); - if ((trig_interface.cmd_key_state & mask) == 0) { - trig_interface.send_md_leds(TRIGLED_OVERLAY); - preview_mute_set = 255; - oled_draw_mutes(); - } - break; - } - } + switch (key) { + case MDX_KEY_GLOBAL: + case MDX_KEY_YES: { + goto global_release; + } + case MDX_KEY_LEFT: + case MDX_KEY_UP: + case MDX_KEY_RIGHT: + case MDX_KEY_DOWN: { + uint64_t mask = + ((uint64_t)1 << MDX_KEY_LEFT) | ((uint64_t)1 << MDX_KEY_UP) | + ((uint64_t)1 << MDX_KEY_RIGHT) | ((uint64_t)1 << MDX_KEY_DOWN) | + ((uint64_t)1 << MDX_KEY_YES); + if ((trig_interface.cmd_key_state & mask) == 0) { + trig_interface.send_md_leds(TRIGLED_OVERLAY); + preview_mute_set = 255; + redraw(); + for (uint8_t n = 0; n < 4; n++) { + if (perf_locks_temp[n] != 255) { + encoders[n]->cur = perf_locks_temp[n]; + encoders[n]->old = encoders[n]->cur; + } + perf_locks_temp[n] = 255; + } + } + break; + } + } } } if (EVENT_PRESSED(event, Buttons.BUTTON3) && !BUTTON_DOWN(Buttons.BUTTON4)) { @@ -639,10 +708,12 @@ bool MixerPage::handleEvent(gui_event_t *event) { if (EVENT_RELEASED(event, Buttons.BUTTON3)) { global_release: - show_mixer_menu = false; - disable_record_mutes(); - MD.set_trigleds(0, TRIGLED_OVERLAY); - oled_draw_mutes(); + if (preview_mute_set == 255) { + show_mixer_menu = false; + disable_record_mutes(); + MD.set_trigleds(0, TRIGLED_OVERLAY); + oled_draw_mutes(); + } return true; } @@ -651,18 +722,25 @@ bool MixerPage::handleEvent(gui_event_t *event) { return true; } - /* - if (EVENT_PRESSED(event, Buttons.ENCODER1) || - EVENT_PRESSED(event, Buttons.ENCODER2) || - EVENT_PRESSED(event, Buttons.ENCODER3) || - EVENT_PRESSED(event, Buttons.ENCODER4)) { - // if (note_interface.notes_count() == 0) { - // route_page.update_globals(); - // mcl.setPage(GRID_PAGE); - // } - return true; + if (preview_mute_set != 255) { + if (EVENT_RELEASED(event, Buttons.ENCODER1)) { + perf_locks[preview_mute_set][0] = 255; + return true; + } + if (EVENT_RELEASED(event, Buttons.ENCODER2)) { + perf_locks[preview_mute_set][1] = 255; + return true; + } + if (EVENT_RELEASED(event, Buttons.ENCODER3)) { + perf_locks[preview_mute_set][2] = 255; + return true; + } + if (EVENT_RELEASED(event, Buttons.ENCODER4)) { + perf_locks[preview_mute_set][3] = 255; + return true; + } } - */ + return false; } @@ -725,8 +803,8 @@ void MixerPage::onControlChangeCallback_Midi(uint8_t track, uint8_t track_param, SET_BIT16(mixer_page.redraw_mask, track); for (int i = 0; i < 16; i++) { if (note_interface.is_note_on(i) && (i != track)) { - MD.setTrackParam(i, track_param, value, nullptr, true); - SET_BIT16(mixer_page.redraw_mask, i); + MD.setTrackParam(i, track_param, value, nullptr, true); + SET_BIT16(mixer_page.redraw_mask, i); } } mixer_page.set_display_mode(track_param); @@ -736,7 +814,7 @@ uint8_t MixerPage::note_to_trig(uint8_t note_num) { uint8_t trig_num = 0; for (uint8_t i = 0; i < sizeof(MD.global.drumMapping); i++) { if (note_num == MD.global.drumMapping[i]) { - trig_num = i; + trig_num = i; } } return trig_num; diff --git a/avr/cores/megacommand/MCL/MixerPage.h b/avr/cores/megacommand/MCL/MixerPage.h index 9b6802641..a70f6ce6a 100644 --- a/avr/cores/megacommand/MCL/MixerPage.h +++ b/avr/cores/megacommand/MCL/MixerPage.h @@ -51,6 +51,9 @@ class MixerPage : public LightPage { void send_fx(uint8_t param, Encoder *enc, uint8_t type); MuteSet mute_sets[2]; + uint8_t perf_locks[4][4]; + + uint8_t perf_locks_temp[4]; uint8_t get_mute_set(uint8_t key); @@ -59,10 +62,12 @@ class MixerPage : public LightPage { : LightPage(e1, e2, e3, e4) { midi_device = &MD; memset(mute_sets,0xFF,sizeof(mute_sets)); + memset(perf_locks,0xFF,sizeof(perf_locks)); } void adjust_param(EncoderParent *enc, uint8_t param); void draw_levels(); + void redraw(); void set_level(int curtrack, int value); void set_display_mode(uint8_t param); void disable_record_mutes(); @@ -70,6 +75,8 @@ class MixerPage : public LightPage { void switch_mute_set(uint8_t state); void populate_mute_set(); + void load_perf_locks(uint8_t state); + //Handled in MCLSeq void onNoteOnCallback_Midi(uint8_t *msg); void onControlChangeCallback_Midi(uint8_t track, uint8_t track_param, uint8_t value); diff --git a/avr/cores/megacommand/MCL/PerfEncoder.cpp b/avr/cores/megacommand/MCL/PerfEncoder.cpp index 626b9689b..e972570a6 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.cpp +++ b/avr/cores/megacommand/MCL/PerfEncoder.cpp @@ -58,9 +58,6 @@ void PerfEncoder::send() { int PerfEncoder::update(encoder_t *enc) { MCLEncoder::update(enc); // Update all params - if (hasChanged()) { - send(); - } return cur; } diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 814c8f669..1477e4207 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -17,6 +17,14 @@ void PerfPage::setup() { perf_encoders[1] = &perf_param2; perf_encoders[2] = &perf_param3; perf_encoders[3] = &perf_param4; + + perf_param2.active_scene_a = 2; + perf_param2.active_scene_b = 3; + perf_param3.active_scene_a = 4; + perf_param3.active_scene_b = 5; + perf_param4.active_scene_a = 6; + perf_param4.active_scene_b = 7; + isSetup = true; } @@ -199,6 +207,7 @@ void PerfPage::loop() { return; } func_enc_check(); + encoder_send(); update_params(); } @@ -297,7 +306,11 @@ void PerfPage::display() { void PerfPage::encoder_check() { - if (GUI.currentPage() == this) return; + if (GUI.currentPage() == this || mcl.currentPage() == MIXER_PAGE) return; + encoder_send(); +} + +void PerfPage::encoder_send() { for (uint8_t i = 0; i < 4; i++) { if (perf_encoders[i]->hasChanged()) { perf_encoders[i]->send(); } } diff --git a/avr/cores/megacommand/MCL/PerfPage.h b/avr/cores/megacommand/MCL/PerfPage.h index ec9d66d82..cb1c6a3cf 100644 --- a/avr/cores/megacommand/MCL/PerfPage.h +++ b/avr/cores/megacommand/MCL/PerfPage.h @@ -56,6 +56,7 @@ class PerfPage : public LightPage, PerfPageParent { void config_encoder_range(uint8_t i); void encoder_check(); + void encoder_send(); void onControlChangeCallback_Midi(uint8_t *msg); void onControlChangeCallback_Midi2(uint8_t *msg); diff --git a/avr/cores/megacommand/MCL/PerfTrack.cpp b/avr/cores/megacommand/MCL/PerfTrack.cpp index 5bfd08458..d8a53b905 100644 --- a/avr/cores/megacommand/MCL/PerfTrack.cpp +++ b/avr/cores/megacommand/MCL/PerfTrack.cpp @@ -25,6 +25,7 @@ void PerfTrack::get_perf() { DEBUG_PRINTLN(sizeof(scenes)); memcpy(scenes, PerfData::scenes, sizeof(PerfScene) * NUM_SCENES); memcpy(mute_sets,mixer_page.mute_sets, sizeof(mute_sets)); + memcpy(perf_locks,mixer_page.perf_locks, sizeof(perf_locks)); } @@ -44,6 +45,7 @@ void PerfTrack::load_perf() { } memcpy(PerfData::scenes, scenes, sizeof(PerfScene) * NUM_SCENES); memcpy(mixer_page.mute_sets, mute_sets, sizeof(mute_sets)); + memcpy(mixer_page.perf_locks, perf_locks, sizeof(perf_locks)); } void PerfTrack::load_immediate(uint8_t tracknumber, SeqTrack *seq_track) { diff --git a/avr/cores/megacommand/MCL/PerfTrack.h b/avr/cores/megacommand/MCL/PerfTrack.h index 06e1c88d7..75deb6408 100644 --- a/avr/cores/megacommand/MCL/PerfTrack.h +++ b/avr/cores/megacommand/MCL/PerfTrack.h @@ -28,6 +28,7 @@ class PerfTrackData { PerfTrackEncoderData encs[4]; PerfScene scenes[NUM_SCENES]; MuteSet mute_sets[2]; + uint8_t perf_locks[4][4]; }; class PerfTrack : public AUXTrack, public PerfTrackData { From 39507766482cb44405c9a2f5fb7c074aa9ea4cac Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 21 Jul 2023 00:27:07 +1000 Subject: [PATCH 295/413] optimise --- avr/cores/megacommand/MCL/ExtSeqTrack.h | 31 ++++++------------------- 1 file changed, 7 insertions(+), 24 deletions(-) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.h b/avr/cores/megacommand/MCL/ExtSeqTrack.h index f30ef82f1..e73d69cf5 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.h +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.h @@ -276,31 +276,14 @@ class ExtSeqTrack : public ExtSeqTrackData, public SeqSlideTrack { } } void buffer_notesoff8(uint8_t *buf, uint8_t offset) { - if (IS_BIT_SET(*buf, 0)) { - uart->sendNoteOff(channel, offset, 0); - } - if (IS_BIT_SET(*buf, 1)) { - uart->sendNoteOff(channel, offset + 1, 0); - } - if (IS_BIT_SET(*buf, 2)) { - uart->sendNoteOff(channel, offset + 2, 0); - } - if (IS_BIT_SET(*buf, 3)) { - uart->sendNoteOff(channel, offset + 3, 0); - } - if (IS_BIT_SET(*buf, 4)) { - uart->sendNoteOff(channel, offset + 4, 0); - } - if (IS_BIT_SET(*buf, 5)) { - uart->sendNoteOff(channel, offset + 5, 0); - } - if (IS_BIT_SET(*buf, 6)) { - uart->sendNoteOff(channel, offset + 6, 0); - } - if (IS_BIT_SET(*buf, 7)) { - uart->sendNoteOff(channel, offset + 7, 0); + uint8_t count = 0; + while (*buf) { + if (*buf & 1) { + uart->sendNoteOff(channel, offset + count, 0); + } + count++; + *buf >>= 1; } - *buf = 0; } void rotate_left() { modify_track(DIR_LEFT); } From c760560a7c9f357ba26dcad3cf16b687973de791 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 21 Jul 2023 11:28:10 +1000 Subject: [PATCH 296/413] Remove clock callbacks. MCLSeq called directly --- avr/cores/megacommand/MCL/MCL.h | 5 ----- avr/cores/megacommand/MCL/MCLSeq.cpp | 15 +-------------- avr/cores/megacommand/MCL/MCLSeq.h | 19 ++++++++++++------- avr/cores/megacommand/MCL/MDSeqTrack.h | 3 ++- avr/cores/megacommand/MCL/SeqTrack.h | 5 +++++ avr/cores/megacommand/Midi/MidiClock.h | 11 ++++++----- avr/cores/megacommand/MidiUart.cpp | 11 ++++++++++- avr/cores/megacommand/main.cpp | 12 +++++++++++- 8 files changed, 47 insertions(+), 34 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCL.h b/avr/cores/megacommand/MCL/MCL.h index bebbe4b06..c5a2020ce 100644 --- a/avr/cores/megacommand/MCL/MCL.h +++ b/avr/cores/megacommand/MCL/MCL.h @@ -24,11 +24,6 @@ #define MD_KITBUF_POS 63 -// Sequencer editing constants -#define DIR_LEFT 0 -#define DIR_RIGHT 1 -#define DIR_REVERSE 2 - extern void mcl_setup(); enum PageIndex { diff --git a/avr/cores/megacommand/MCL/MCLSeq.cpp b/avr/cores/megacommand/MCL/MCLSeq.cpp index 50262fd5b..a1abed7ce 100644 --- a/avr/cores/megacommand/MCL/MCLSeq.cpp +++ b/avr/cores/megacommand/MCL/MCLSeq.cpp @@ -53,20 +53,6 @@ void MCLSeq::setup() { midi_events.setup_callbacks(); }; -void MCLSeq::enable() { - if (state) { - return; - } - MidiClock.addOn192Callback(this, (midi_clock_callback_ptr_t)&MCLSeq::seq); - state = true; -} -void MCLSeq::disable() { - if (!state) { - return; - } - MidiClock.removeOn192Callback(this, (midi_clock_callback_ptr_t)&MCLSeq::seq); - state = false; -} // restore kit params void MCLSeq::update_kit_params() { #ifdef LFO_TRACKS @@ -170,6 +156,7 @@ void MCLSeq::onMidiStopCallback() { } void MCLSeq::seq() { + if (!state) { return; } MidiUartParent *uart; MidiUartParent *uart2; diff --git a/avr/cores/megacommand/MCL/MCLSeq.h b/avr/cores/megacommand/MCL/MCLSeq.h index 8f770e9a1..869441711 100644 --- a/avr/cores/megacommand/MCL/MCLSeq.h +++ b/avr/cores/megacommand/MCL/MCLSeq.h @@ -2,12 +2,16 @@ #pragma once -#include "LFOSeqTrack.h" +#include "MCLMemory.h" +#include "MidiClock.h" +#include "Midi.h" + #include "MDSeqTrack.h" -#include "ExtSeqTrack.h" +#include "LFOSeqTrack.h" #include "ArpSeqTrack.h" -#include "MDFXSeqTrack.h" -//#include "MDTrack.h" +#include "ExtSeqTrack.h" +#include "MDFXseqTrack.h" + #define SEQ_MUTE_ON 1 #define SEQ_MUTE_OFF 0 @@ -61,11 +65,13 @@ class MCLSeq : public ClockCallback { MDFXSeqTrack mdfx_track; MCLSeqMidiEvents midi_events; + bool state = false; + void enable() { state = true; } + void disable() { state = false; } + void setup(); - void enable(); - void disable(); uint8_t find_ext_track(uint8_t channel); @@ -79,4 +85,3 @@ class MCLSeq : public ClockCallback { }; extern MCLSeq mcl_seq; - diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.h b/avr/cores/megacommand/MCL/MDSeqTrack.h index cd8f21791..f0d0ed1df 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.h +++ b/avr/cores/megacommand/MCL/MDSeqTrack.h @@ -4,8 +4,9 @@ #define MDSEQTRACK_H__ #include "MD.h" -#include "MDSeqTrackData.h" #include "SeqTrack.h" +#include "MDSeqTrackData.h" +#include "DeviceTrack.h" #define UART1_PORT 1 diff --git a/avr/cores/megacommand/MCL/SeqTrack.h b/avr/cores/megacommand/MCL/SeqTrack.h index a48de22c9..375119720 100644 --- a/avr/cores/megacommand/MCL/SeqTrack.h +++ b/avr/cores/megacommand/MCL/SeqTrack.h @@ -36,6 +36,11 @@ #define UART1_PORT 1 +// Sequencer editing constants +#define DIR_LEFT 0 +#define DIR_RIGHT 1 +#define DIR_REVERSE 2 + class SeqTrack_270 {}; class SlideData { diff --git a/avr/cores/megacommand/Midi/MidiClock.h b/avr/cores/megacommand/Midi/MidiClock.h index 22c85f744..c03a2deac 100644 --- a/avr/cores/megacommand/Midi/MidiClock.h +++ b/avr/cores/megacommand/Midi/MidiClock.h @@ -9,7 +9,6 @@ #include "WProgram.h" #include "midi-common.h" #include - /** * \addtogroup Midi * @@ -126,10 +125,12 @@ class MidiClockClass { CallbackVector1 onMidiStopCallbacks; CallbackVector1 onMidiContinueCallbacks; + /* CallbackVector1 on192Callbacks; CallbackVector1 on96Callbacks; CallbackVector1 on32Callbacks; CallbackVector1 on16Callbacks; + */ void addOnMidiStartImmediateCallback(ClockCallback *obj, midi_clock_callback_ptr_t func) { @@ -176,6 +177,7 @@ class MidiClockClass { void removeOnMidiContinueCallback(ClockCallback *obj) { onMidiContinueCallbacks.remove(obj); } +/* void addOn192Callback(ClockCallback *obj, midi_clock_callback_ptr_t func) { on192Callbacks.add(obj, func); } @@ -207,11 +209,12 @@ class MidiClockClass { on16Callbacks.remove(obj, func); } void removeOn16Callback(ClockCallback *obj) { on16Callbacks.remove(obj); } - +*/ ALWAYS_INLINE() void init(); volatile bool inCallback = false; + /* ALWAYS_INLINE() void callCallbacks(bool isMidiEvent = false) { if (state != STARTED) return; @@ -229,7 +232,6 @@ class MidiClockClass { MidiUartParent::handle_midi_lock = 1; sei(); - on192Callbacks.call(div192th_counter); if (isMidiEvent) { @@ -243,11 +245,10 @@ class MidiClockClass { on32Callbacks.call(div32th_counter); } } - inCallback = false; SREG = _irqlock_tmp; MidiUartParent::handle_midi_lock = _midi_lock_tmp; - } + }*/ ALWAYS_INLINE() void handleImmediateClock() { // if (clock > clock_last_time) { diff --git a/avr/cores/megacommand/MidiUart.cpp b/avr/cores/megacommand/MidiUart.cpp index e863c53cb..bb11aa07c 100644 --- a/avr/cores/megacommand/MidiUart.cpp +++ b/avr/cores/megacommand/MidiUart.cpp @@ -13,6 +13,8 @@ #include #include +#include "MCLSeq.h" + MidiUartClass::MidiUartClass(volatile uint8_t *udr_, volatile uint8_t *rx_buf, uint16_t rx_buf_size, volatile uint8_t *tx_buf, uint16_t tx_buf_size) @@ -87,7 +89,14 @@ void MidiUartClass::realtime_isr(uint8_t c) { if (c == MIDI_CLOCK) { if (MidiClock.uart_clock_recv == this) { MidiClock.handleClock(); - MidiClock.callCallbacks(true); + if (MidiClock.state != 2 || MidiClock.inCallback) { return; } + MidiClock.inCallback = true; + uint8_t _midi_lock_tmp = MidiUartParent::handle_midi_lock; + MidiUartParent::handle_midi_lock = 1; + sei(); + mcl_seq.seq(); + MidiUartParent::handle_midi_lock = _midi_lock_tmp; + MidiClock.inCallback = false; } } else if (MidiClock.uart_transport_recv1 == this || MidiClock.uart_transport_recv2 == this) { diff --git a/avr/cores/megacommand/main.cpp b/avr/cores/megacommand/main.cpp index cc0a0e98a..d5821e772 100644 --- a/avr/cores/megacommand/main.cpp +++ b/avr/cores/megacommand/main.cpp @@ -13,6 +13,8 @@ extern "C" { #include } +#include "MCLSeq.h" + #define OLED_CLK 52 #define OLED_MOSI 51 @@ -177,7 +179,15 @@ ISR(TIMER1_COMPA_vect) { MidiClock.increment192Counter(); MidiClock.div192th_countdown = 0; MidiClock.div192th_counter_last = MidiClock.div192th_counter; - MidiClock.callCallbacks(); + if (MidiClock.inCallback) { return; } + MidiClock.inCallback = true; + uint8_t _midi_lock_tmp = MidiUartParent::handle_midi_lock; + MidiUartParent::handle_midi_lock = 1; + sei(); + mcl_seq.seq(); + MidiUartParent::handle_midi_lock = _midi_lock_tmp; + MidiClock.inCallback = false; + //MidiClock.callCallbacks(); } } } From 6fc802744708961055e6c844e0e0929e257becac Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 21 Jul 2023 11:33:38 +1000 Subject: [PATCH 297/413] FXPage cleanup --- avr/cores/megacommand/MCL/FXPage.cpp | 37 ---------------------------- avr/cores/megacommand/MCL/FXPage.h | 6 +---- avr/cores/megacommand/main.cpp | 1 - 3 files changed, 1 insertion(+), 43 deletions(-) diff --git a/avr/cores/megacommand/MCL/FXPage.cpp b/avr/cores/megacommand/MCL/FXPage.cpp index 42c3ea379..b75a46c6e 100644 --- a/avr/cores/megacommand/MCL/FXPage.cpp +++ b/avr/cores/megacommand/MCL/FXPage.cpp @@ -123,43 +123,6 @@ void FXPage::display() { oled_display.setFont(oldfont); } -void FXPage::onControlChangeCallback_Midi(uint8_t *msg) { - uint8_t channel = MIDI_VOICE_CHANNEL(msg[0]); - uint8_t param = msg[1]; - uint8_t value = msg[2]; - uint8_t track; - uint8_t track_param; - // If external keyboard controlling MD pitch, send parameter updates - // to all polyphonic tracks - uint8_t param_true = 0; - - MD.parseCC(channel, param, &track, &track_param); - if (track > 15) { - return; - } -} - -void FXPage::setup_callbacks() { - if (midi_state) { - return; - } - Midi.addOnControlChangeCallback( - this, (midi_callback_ptr_t)&FXPage::onControlChangeCallback_Midi); - - midi_state = true; -} - -void FXPage::remove_callbacks() { - if (!midi_state) { - return; - } - - Midi.removeOnControlChangeCallback( - this, (midi_callback_ptr_t)&FXPage::onControlChangeCallback_Midi); - - midi_state = false; -} - bool FXPage::handleEvent(gui_event_t *event) { if (note_interface.is_event(event)) { uint8_t track = event->source - 128; diff --git a/avr/cores/megacommand/MCL/FXPage.h b/avr/cores/megacommand/MCL/FXPage.h index ff0445547..556af3db9 100644 --- a/avr/cores/megacommand/MCL/FXPage.h +++ b/avr/cores/megacommand/MCL/FXPage.h @@ -14,7 +14,7 @@ typedef struct fx_param_t { //params_ 2 dimensional array, consisting of [MD_FX_TYPE][MD_FX_PARAM_NUMBER] // -class FXPage : public LightPage, MidiCallback { +class FXPage : public LightPage { public: FXPage(Encoder *e1 = NULL, Encoder *e2 = NULL, Encoder *e3 = NULL, Encoder *e4 = NULL, fx_param_t *params_ = NULL, uint8_t num_of_params_ = 0, const char* title = NULL, uint8_t page_id_ = 0) @@ -47,10 +47,6 @@ class FXPage : public LightPage, MidiCallback { void update_encoders(); - void setup_callbacks(); - void remove_callbacks(); - - void onControlChangeCallback_Midi(uint8_t *msg); }; extern MCLEncoder fx_page_param1; diff --git a/avr/cores/megacommand/main.cpp b/avr/cores/megacommand/main.cpp index d5821e772..29493c375 100644 --- a/avr/cores/megacommand/main.cpp +++ b/avr/cores/megacommand/main.cpp @@ -187,7 +187,6 @@ ISR(TIMER1_COMPA_vect) { mcl_seq.seq(); MidiUartParent::handle_midi_lock = _midi_lock_tmp; MidiClock.inCallback = false; - //MidiClock.callCallbacks(); } } } From e89e13921e6cfcb1f8a4e06f7140b212c3e5b71c Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 21 Jul 2023 11:54:53 +1000 Subject: [PATCH 298/413] SeqStepPage optimise --- avr/cores/megacommand/MCL/SeqStepPage.cpp | 59 ++++++++++------------- 1 file changed, 25 insertions(+), 34 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqStepPage.cpp b/avr/cores/megacommand/MCL/SeqStepPage.cpp index dee184861..cdcff783c 100644 --- a/avr/cores/megacommand/MCL/SeqStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqStepPage.cpp @@ -36,7 +36,9 @@ void SeqStepPage::config() { } void SeqStepPage::config_encoders() { - if (show_seq_menu || show_step_menu) { return; } + if (show_seq_menu || show_step_menu) { + return; + } uint8_t timing_mid = mcl_seq.md_tracks[last_md_track].get_timing_mid(); seq_param3.cur = mcl_seq.md_tracks[last_md_track].length; seq_param3.old = seq_param3.cur; @@ -536,15 +538,6 @@ bool SeqStepPage::handleEvent(gui_event_t *event) { } break; } - case MDX_KEY_YES: { - if (step == 255) { - return true; - } - active_track.send_parameter_locks(step, true); - reset_on_release = true; - MD.triggerTrack(last_md_track, 127); - break; - } case MDX_KEY_NO: { if (mask_type != MASK_PATTERN) { mask_type = MASK_PATTERN; @@ -586,35 +579,33 @@ bool SeqStepPage::handleEvent(gui_event_t *event) { } break; } - case MDX_KEY_UP: { - if (step == 255) { - return; - } - seq_param1.cur += 1; - return true; } - case MDX_KEY_DOWN: { - if (step == 255) { - return; + if (step != 255) { + switch (key) { + case MDX_KEY_YES: { + active_track.send_parameter_locks(step, true); + reset_on_release = true; + MD.triggerTrack(last_md_track, 127); + break; } - seq_param1.cur -= 1; - return; - } - case MDX_KEY_LEFT: { - if (step == 255) { - return; + case MDX_KEY_UP: { + seq_param1.cur += 1; + break; + } + case MDX_KEY_DOWN: { + seq_param1.cur -= 1; + break; + } + case MDX_KEY_LEFT: { + seq_param2.cur -= 1; + break; + } + case MDX_KEY_RIGHT: { + seq_param2.cur += 1; + break; } - seq_param2.cur -= 1; - return true; - } - case MDX_KEY_RIGHT: { - if (step == 255) { - return; } - seq_param2.cur += 1; - return true; - } } return true; } From d1dc11732828be5b2f70aacc919a37f694f5d5a7 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 21 Jul 2023 12:09:38 +1000 Subject: [PATCH 299/413] git rm --- .../megacommand/MCL/TrackInfoEncoder.cpp | 32 ---------- avr/cores/megacommand/MCL/TrackInfoEncoder.h | 62 ------------------- 2 files changed, 94 deletions(-) delete mode 100644 avr/cores/megacommand/MCL/TrackInfoEncoder.cpp delete mode 100644 avr/cores/megacommand/MCL/TrackInfoEncoder.h diff --git a/avr/cores/megacommand/MCL/TrackInfoEncoder.cpp b/avr/cores/megacommand/MCL/TrackInfoEncoder.cpp deleted file mode 100644 index c57a0bb1c..000000000 --- a/avr/cores/megacommand/MCL/TrackInfoEncoder.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include "TrackInfoEncoder.h" - -int TrackInfoEncoder::update(encoder_t *enc) { - uint8_t amount = abs(enc->normal); - int inc = 0; - - while (amount > 0) { - if (enc->normal > 0) { - rot_counter_up += 1; - if (rot_counter_up > rot_res) { - rot_counter_up = 0; - inc += 1; - } - rot_counter_down = 0; - } - if (enc->normal < 0) { - rot_counter_down += 1; - if (rot_counter_down > rot_res) { - rot_counter_down = 0; - inc -= 1; - } - - rot_counter_up = 0; - } - amount--; - } - - inc = inc + enc->normal; - cur = limit_value(cur, inc, min, max); - - return cur; -} diff --git a/avr/cores/megacommand/MCL/TrackInfoEncoder.h b/avr/cores/megacommand/MCL/TrackInfoEncoder.h deleted file mode 100644 index f66c7cfdb..000000000 --- a/avr/cores/megacommand/MCL/TrackInfoEncoder.h +++ /dev/null @@ -1,62 +0,0 @@ -/* Copyright 2018, Justin Mammarella jmamma@gmail.com */ - -#ifndef TRACKINFOENCODER_H__ -#define TRACKINFOENCODER_H__ -#include "mcl.h" - -class TrackInfoEncoder : public Encoder { - /** - \addtogroup gui_rangeencoder_class - @{ - **/ - - public: - /** Minimum value of the encoder. **/ - int8_t min; - /** Maximum value of the encoder. **/ - int8_t max; - - /** - Create a new range-limited encoder with max and min value, short - name, initial value, and handling function. The initRangeEncoder - will be called with the constructor arguments. - **/ - TrackInfoEncoder(int _max = 127, int _min = 0, int res = 1) : Encoder() { - initTrackInfoEncoder(_max, _min, (int) 0, res, (encoder_handle_t) NULL); - } - - - /** - Initialize the encoder with the same argument as the constructor. - - The initRangeEncoder functions automatically determines which of - min and max is the minimum value. As of now this can't be used to - have an "inverted" encoder. - - The initial value is called without calling the handling function. - **/ - void initTrackInfoEncoder(int _max = 128, int _min = 0, int init = 0, int res = 1, encoder_handle_t _handler = NULL) { - rot_res = res; - // setName(_name); - handler = _handler; - if (_min > _max) { - min = _max; - max = _min; - } else { - min = _min; - max = _max; - } - setValue(init); - } - - /** - Update the value of the encoder according to pressmode and - fastmode, and limit the resulting value using limit_value(). - **/ - virtual int update(encoder_t *enc); - // virtual void displayAt(int i); - - /* @} */ -}; - -#endif /* TRACKINFOENCODER_H__ */ From 7d0bfb8e54136f300b42ea7c0cd2562f8a892298 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 21 Jul 2023 12:09:59 +1000 Subject: [PATCH 300/413] Optimise minor --- avr/cores/megacommand/MCL/OscPage.cpp | 1 - avr/cores/megacommand/MCL/PageSelectPage.cpp | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/avr/cores/megacommand/MCL/OscPage.cpp b/avr/cores/megacommand/MCL/OscPage.cpp index a42bf677e..d6dd14747 100644 --- a/avr/cores/megacommand/MCL/OscPage.cpp +++ b/avr/cores/megacommand/MCL/OscPage.cpp @@ -281,7 +281,6 @@ void OscPage::draw_usr() { void OscPage::draw_levels() { uint8_t scaled_level; - char str[17] = " "; uint8_t x = 64; uint8_t w = 128 - x; UsrOsc usr_osc(w); diff --git a/avr/cores/megacommand/MCL/PageSelectPage.cpp b/avr/cores/megacommand/MCL/PageSelectPage.cpp index 1e22c2f17..cfd40973a 100644 --- a/avr/cores/megacommand/MCL/PageSelectPage.cpp +++ b/avr/cores/megacommand/MCL/PageSelectPage.cpp @@ -29,7 +29,7 @@ static PageIndex get_page(uint8_t pageidx, char *str) { return R.page_entries->Entries[pageidx].Page; } else { if (str) { - strncpy(str, "----", 5); + strcpy(str, "----"); } return 255; } @@ -69,7 +69,7 @@ static void get_category_name(uint8_t page_number, char *str) { get_category_name_fail: if (str) { - strncpy(str, "----", 5); + strcpy(str, "----"); } return; } From 1120d639818610bcc77fe52e55bf80913f28f932 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 21 Jul 2023 13:00:16 +1000 Subject: [PATCH 301/413] space optim --- avr/cores/megacommand/MCL/LFOPage.cpp | 16 ---------------- avr/cores/megacommand/MCL/PolyPage.cpp | 11 ++++++----- 2 files changed, 6 insertions(+), 21 deletions(-) diff --git a/avr/cores/megacommand/MCL/LFOPage.cpp b/avr/cores/megacommand/MCL/LFOPage.cpp index 60eab8f76..96c169e1f 100644 --- a/avr/cores/megacommand/MCL/LFOPage.cpp +++ b/avr/cores/megacommand/MCL/LFOPage.cpp @@ -97,33 +97,17 @@ void LFOPage::loop() { config_encoder_range(2); if (encoders[0]->hasChanged()) { - USE_LOCK(); - SET_LOCK(); lfo_track->params[0].dest = encoders[0]->cur; - CLEAR_LOCK(); } if (encoders[1]->hasChanged()) { - USE_LOCK(); - SET_LOCK(); lfo_track->params[0].param = encoders[1]->cur; - // lfo_track->params[0].offset = lfo_track->params[0].get_param_offset( - // encoders[0]->cur, encoders[1]->cur); - CLEAR_LOCK(); } if (encoders[2]->hasChanged()) { - USE_LOCK(); - SET_LOCK(); lfo_track->params[1].dest = encoders[2]->cur; - CLEAR_LOCK(); } if (encoders[3]->hasChanged()) { - USE_LOCK(); - SET_LOCK(); lfo_track->params[1].param = encoders[3]->cur; - // lfo_track->params[1].offset = lfo_track->params[1].get_param_offset( - // encoders[2]->cur, encoders[3]->cur); - CLEAR_LOCK(); } } // wav_tables need to be recalculated when depth or waveform changes. diff --git a/avr/cores/megacommand/MCL/PolyPage.cpp b/avr/cores/megacommand/MCL/PolyPage.cpp index 8244685f0..cfecf71d6 100644 --- a/avr/cores/megacommand/MCL/PolyPage.cpp +++ b/avr/cores/megacommand/MCL/PolyPage.cpp @@ -22,22 +22,23 @@ void PolyPage::cleanup() { void PolyPage::draw_mask() { for (int i = 0; i < 16; i++) { + uint8_t x = i * 8; if (note_interface.is_note(i)) { - oled_display.fillRect(0 + i * 8, 2, 6, 6, WHITE); + oled_display.fillRect(x, 2, 6, 6, WHITE); } else if (IS_BIT_SET16(*poly_mask, i)) { - oled_display.fillRect(0 + i * 8, 2, 6, 6, BLACK); - oled_display.drawRect(0 + i * 8, 2, 6, 6, WHITE); + oled_display.fillRect(x, 2, 6, 6, BLACK); + oled_display.drawRect(x, 2, 6, 6, WHITE); } else { - oled_display.fillRect(0 + i * 8, 2, 6, 6, BLACK); - oled_display.drawLine(+i * 8, 5, 5 + (i * 8), 5, WHITE); + oled_display.fillRect(x, 2, 6, 6, BLACK); + oled_display.drawLine(x, 5, 5 + x, 5, WHITE); } } } From 478a39f7e7ab663ad1c2f6e9fc0ee02c703d1686 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 21 Jul 2023 23:10:24 +1000 Subject: [PATCH 302/413] Fix toggle_solo_mute. Key binding change --- avr/cores/megacommand/MCL/MixerPage.cpp | 140 ++++++++++++++-------- avr/cores/megacommand/MCL/MixerPage.h | 2 +- avr/cores/megacommand/MCL/TrigInterface.h | 1 + 3 files changed, 91 insertions(+), 52 deletions(-) diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 5ed5673d5..58f091a95 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -436,11 +436,26 @@ void MixerPage::switch_mute_set(uint8_t state) { for (uint8_t n = 0; n < len; n++) { SeqTrack *seq_track = (is_md_device) ? (SeqTrack *)&mcl_seq.md_tracks[n] : (SeqTrack *)&mcl_seq.ext_tracks[n]; - bool mute_state = state < 4 - ? IS_BIT_CLEAR16(mute_sets[dev].mutes[state], n) - : !seq_track->mute_state; - if (mute_state != seq_track->mute_state) { + uint8_t mute_set = state; + bool mute_state = IS_BIT_CLEAR16(mute_sets[dev].mutes[state], n); + if (state == 4) { + if (preview_mute_set != 255) { + mute_set = preview_mute_set; + mute_state = IS_BIT_CLEAR16(mute_sets[dev].mutes[mute_set], n); + } else { + mute_state = !seq_track->mute_state; + } + if (mute_set != 255) { + if (mute_state != SEQ_MUTE_ON) { + CLEAR_BIT16(mute_sets[!is_md_device].mutes[mute_set], n); + } else { + SET_BIT16(mute_sets[!is_md_device].mutes[mute_set], n); + } + } + } + if (mute_state != seq_track->mute_state && + !(mute_state == 4 && mute_set != preview_mute_set)) { devs[dev]->muteTrack(n, mute_state); if (is_md_device) { mcl_seq.md_tracks[n].toggle_mute(); @@ -473,6 +488,56 @@ void MixerPage::redraw() { oled_draw_mutes(); } +void MixerPage::toggle_or_solo(bool solo) { + uint8_t is_md_device = (midi_device == &MD); + uint8_t len = is_md_device ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; + for (int i = 0; i < len; i++) { + bool note_on = note_interface.is_note_on(i); + bool mute_state = false; + if (solo) { + if (is_md_device) { + if (mcl_seq.md_tracks[i].mute_state == note_on) { + mcl_seq.md_tracks[i].toggle_mute(); + mute_state = mcl_seq.md_tracks[i].mute_state; + } + } else { + if (mcl_seq.ext_tracks[i].mute_state == note_on) { + mcl_seq.ext_tracks[i].toggle_mute(); + mute_state = mcl_seq.ext_tracks[i].mute_state; + } + } + midi_device->muteTrack(i, !note_on); + if (note_on == SEQ_MUTE_OFF) { + CLEAR_BIT16(mute_sets[!is_md_device].mutes[current_mute_set], i); + } else { + SET_BIT16(mute_sets[!is_md_device].mutes[current_mute_set], i); + } + } else if (note_on) { + // TOGGLE + if (is_md_device) { + mcl_seq.md_tracks[i].toggle_mute(); + mute_state = mcl_seq.md_tracks[i].mute_state; + } else { + mcl_seq.ext_tracks[i].toggle_mute(); + mute_state = mcl_seq.ext_tracks[i].mute_state; + } + midi_device->muteTrack(i, mute_state); + + if (current_mute_set == 255) { + continue; + } + uint8_t state = + IS_BIT_SET16(mute_sets[!is_md_device].mutes[current_mute_set], i); + if (state == SEQ_MUTE_ON) { + CLEAR_BIT16(mute_sets[!is_md_device].mutes[current_mute_set], i); + } else { + SET_BIT16(mute_sets[!is_md_device].mutes[current_mute_set], i); + } + } + } + oled_draw_mutes(); +} + bool MixerPage::handleEvent(gui_event_t *event) { if (note_interface.is_event(event)) { uint8_t mask = event->mask; @@ -503,7 +568,7 @@ bool MixerPage::handleEvent(gui_event_t *event) { uint8_t mute_set = current_mute_set; uint8_t state = 0; - if (preview_mute_set == 255 || preview_mute_set == current_mute_set) { + if (preview_mute_set == 255) { seq_track->toggle_mute(); midi_device->muteTrack(track, seq_track->mute_state); state = seq_track->mute_state; @@ -563,7 +628,7 @@ bool MixerPage::handleEvent(gui_event_t *event) { uint8_t key = event->source - 64; if (event->mask == EVENT_BUTTON_PRESSED) { switch (key) { - case MDX_KEY_NO: { + case MDX_KEY_EXTENDED: { if (note_interface.notes_count_on() == 0) { disable_record_mutes(); mcl.setPage(fx_page_a.last_page); @@ -580,8 +645,15 @@ bool MixerPage::handleEvent(gui_event_t *event) { } break; } + case MDX_KEY_NO: { + if (note_interface.notes_on) { + toggle_or_solo(true); + } + break; + } case MDX_KEY_YES: { - if (trig_interface.is_key_down(MDX_KEY_FUNC)) { + if (trig_interface.is_key_down(MDX_KEY_FUNC) && + note_interface.notes_on == 0) { switch_mute_set(4); //---> Flip mutes break; } @@ -602,35 +674,7 @@ bool MixerPage::handleEvent(gui_event_t *event) { seq_step_page.mute_mask = 0; show_mixer_menu = true; } else { - uint8_t is_md_device = (midi_device == &MD); - uint8_t len = - is_md_device ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; - for (int i = 0; i < len; i++) { - if (note_interface.is_note_on(i)) { - bool mute_state = false; - if (is_md_device) { - mcl_seq.md_tracks[i].toggle_mute(); - mute_state = mcl_seq.md_tracks[i].mute_state; - } else { - mcl_seq.ext_tracks[i].toggle_mute(); - mute_state = mcl_seq.ext_tracks[i].mute_state; - } - - midi_device->muteTrack(i, mute_state); - if (current_mute_set == 255) { - continue; - } - uint8_t state = IS_BIT_SET16( - mute_sets[!is_md_device].mutes[current_mute_set], i); - if (state == SEQ_MUTE_ON) { - CLEAR_BIT16(mute_sets[!is_md_device].mutes[current_mute_set], - i); - } else { - SET_BIT16(mute_sets[!is_md_device].mutes[current_mute_set], - i); - } - } - } + toggle_or_solo(); } } break; @@ -723,23 +767,17 @@ bool MixerPage::handleEvent(gui_event_t *event) { } if (preview_mute_set != 255) { - if (EVENT_RELEASED(event, Buttons.ENCODER1)) { - perf_locks[preview_mute_set][0] = 255; - return true; - } - if (EVENT_RELEASED(event, Buttons.ENCODER2)) { - perf_locks[preview_mute_set][1] = 255; - return true; - } - if (EVENT_RELEASED(event, Buttons.ENCODER3)) { - perf_locks[preview_mute_set][2] = 255; - return true; - } - if (EVENT_RELEASED(event, Buttons.ENCODER4)) { - perf_locks[preview_mute_set][3] = 255; + if (event->source >= Buttons.ENCODER1 && event->source <= Buttons.ENCODER4) { + uint8_t set = event->source - Buttons.ENCODER1; + if ((event)->mask & EVENT_BUTTON_RELEASED) { + perf_locks[preview_mute_set][set] = 255; + } + if ((event)->mask & EVENT_BUTTON_PRESSED) { + perf_locks[preview_mute_set][set] = encoders[set]->cur; + } return true; } - } + } return false; } diff --git a/avr/cores/megacommand/MCL/MixerPage.h b/avr/cores/megacommand/MCL/MixerPage.h index a70f6ce6a..c98799b73 100644 --- a/avr/cores/megacommand/MCL/MixerPage.h +++ b/avr/cores/megacommand/MCL/MixerPage.h @@ -76,7 +76,7 @@ class MixerPage : public LightPage { void populate_mute_set(); void load_perf_locks(uint8_t state); - + void toggle_or_solo(bool solo = false); //Handled in MCLSeq void onNoteOnCallback_Midi(uint8_t *msg); void onControlChangeCallback_Midi(uint8_t track, uint8_t track_param, uint8_t value); diff --git a/avr/cores/megacommand/MCL/TrigInterface.h b/avr/cores/megacommand/MCL/TrigInterface.h index 37d94c1f6..38dfb4b3d 100644 --- a/avr/cores/megacommand/MCL/TrigInterface.h +++ b/avr/cores/megacommand/MCL/TrigInterface.h @@ -23,6 +23,7 @@ #define MDX_KEY_SCALE 0x2A #define MDX_KEY_MUTE 0x2B #define MDX_KEY_SONG 0x2C +#define MDX_KEY_EXTENDED 0x2D #define MDX_KEY_UP 0x30 #define MDX_KEY_DOWN 0x31 #define MDX_KEY_STOP 0x32 From fc6a7c7f01016999217a165bff0178ab8810b16a Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 21 Jul 2023 23:10:53 +1000 Subject: [PATCH 303/413] light weight random --- avr/cores/megacommand/MCL/ArpSeqTrack.cpp | 2 +- avr/cores/megacommand/MCL/OscPage.cpp | 2 +- avr/cores/megacommand/MCL/RAMPage.cpp | 2 +- avr/cores/megacommand/memory.h | 2 ++ 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/avr/cores/megacommand/MCL/ArpSeqTrack.cpp b/avr/cores/megacommand/MCL/ArpSeqTrack.cpp index ddd1f0227..a516ff999 100644 --- a/avr/cores/megacommand/MCL/ArpSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ArpSeqTrack.cpp @@ -126,7 +126,7 @@ void ArpSeqTrack::render(uint8_t mode_, uint8_t oct_, uint8_t fine_tune_, uint8_ for (uint8_t i = 0; i < num_of_notes; i++) { switch (mode) { case ARP_RND: - note = sort_up[random(0, num_of_notes)] + 12 * random(0,range); + note = sort_up[get_random(num_of_notes)] + 12 * random(range); break; case ARP_UP2: case ARP_UPP: diff --git a/avr/cores/megacommand/MCL/OscPage.cpp b/avr/cores/megacommand/MCL/OscPage.cpp index d6dd14747..3da53f88d 100644 --- a/avr/cores/megacommand/MCL/OscPage.cpp +++ b/avr/cores/megacommand/MCL/OscPage.cpp @@ -8,7 +8,7 @@ uint32_t OscPage::exploit_delay_clock = 0; void OscPage::setup() { for (uint8_t i = 0; i < 16; i++) { - usr_values[i] = random(127); + usr_values[i] = get_random(127); } } diff --git a/avr/cores/megacommand/MCL/RAMPage.cpp b/avr/cores/megacommand/MCL/RAMPage.cpp index b651af8bd..556eb0254 100644 --- a/avr/cores/megacommand/MCL/RAMPage.cpp +++ b/avr/cores/megacommand/MCL/RAMPage.cpp @@ -235,7 +235,7 @@ bool RAMPage::slice(uint8_t track, uint8_t linked_track) { } case 6: { uint8_t t; - t = random(0, slices); + t = get_random(slices); trk.set_track_locks_i(n, 0, sample_inc * (t) + 0); uint8_t val = (sample_inc) * (t + 1) + 0; trk.set_track_locks_i(n, 1, val); diff --git a/avr/cores/megacommand/memory.h b/avr/cores/megacommand/memory.h index 71197d5d1..475d45052 100644 --- a/avr/cores/megacommand/memory.h +++ b/avr/cores/megacommand/memory.h @@ -179,6 +179,8 @@ FORCED_INLINE() extern inline uint8_t get_random_byte() { return (pgm_read_byte(rand_ptr++) ^ get_byte_bank1(rand_ptr) ^ slowclock) & 0x7F; } +extern inline uint8_t get_random(uint8_t range) { return get_random_byte() % range; } + #endif// __cplusplus #endif /* MEMORY_H__ */ From 716d55b99666b89ae4b13150d8f44162428012c1 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 21 Jul 2023 23:11:13 +1000 Subject: [PATCH 304/413] optimise --- avr/cores/megacommand/MCL/MCLGUI.cpp | 35 ++++++++++++++-------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCLGUI.cpp b/avr/cores/megacommand/MCL/MCLGUI.cpp index 54de0a443..884b1f79d 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.cpp +++ b/avr/cores/megacommand/MCL/MCLGUI.cpp @@ -462,27 +462,28 @@ void MCLGUI::draw_microtiming(uint8_t speed, uint8_t timing) { oled_display.setTextColor(WHITE); SeqTrack seq_track; uint8_t timing_mid = seq_track.get_timing_mid(speed); - uint8_t heights_len; uint8_t degrees = timing_mid * 2; uint8_t heights[16]; // Triplets + + uint8_t heights_lowres[6] = {11, 4, 6, 10, 4, 8}; + uint8_t heights_triplets[16] = {11, 2, 4, 8, 6, 10, 6, 2, + 10, 2, 6, 8, 10, 4, 6, 2}; + uint8_t heights_triplets2[8] = {11, 4, 8, 10, 2, 8, 4, 2}; + uint8_t heights_highres[12] = {11, 2, 4, 8, 6, 2, 10, 2, 6, 8, 4, 2}; + + uint8_t *h = heights_highres; + uint8_t heights_len = 12; + if (speed == SEQ_SPEED_2X) { - uint8_t heights_lowres[6] = {11, 4, 6, 10, 4, 8}; - memcpy(&heights, &heights_lowres, 6); + h = heights_lowres; heights_len = 6; } else if (speed == SEQ_SPEED_3_4X) { - uint8_t heights_triplets[16] = {11, 2, 4, 8, 6, 10, 6, 2, - 10, 2, 6, 8, 10, 4, 6, 2}; - memcpy(&heights, &heights_triplets, 16); + h = heights_triplets; heights_len = 16; } else if (speed == SEQ_SPEED_3_2X) { - uint8_t heights_triplets2[8] = {11, 4, 8, 10, 2, 8, 4, 2}; - memcpy(&heights, &heights_triplets2, 8); + h = heights_triplets2; heights_len = 8; - } else { - uint8_t heights_highres[12] = {11, 2, 4, 8, 6, 2, 10, 2, 6, 8, 4, 2}; - memcpy(&heights, &heights_highres, 12); - heights_len = 12; } uint8_t y_pos = 11; uint8_t a = 0; @@ -512,16 +513,16 @@ void MCLGUI::draw_microtiming(uint8_t speed, uint8_t timing) { oled_display.setCursor(x_pos + 34, 10); oled_display.print(F("uTIMING: ")); oled_display.print(K); - oled_display.drawLine(x, y_pos + heights[0], x + w, y_pos + heights[0], + oled_display.drawLine(x, y_pos + h[0], x + w, y_pos + h[0], WHITE); for (uint8_t n = 0; n <= degrees; n++) { - oled_display.drawLine(x, y_pos + heights[0], x, - y_pos + heights[0] - heights[a], WHITE); + oled_display.drawLine(x, y_pos + h[0], x, + y_pos + h[0] - h[a], WHITE); a++; if (n == timing) { - oled_display.fillRect(x - 1, y_pos + heights[0] + 3, 3, 3, WHITE); - oled_display.drawPixel(x, y_pos + heights[0] + 2, WHITE); + oled_display.fillRect(x - 1, y_pos + h[0] + 3, 3, 3, WHITE); + oled_display.drawPixel(x, y_pos + h[0] + 2, WHITE); } if (a == heights_len) { From 993fd330a407d310cf9a4913fac75e2b68c3cac1 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 21 Jul 2023 23:12:28 +1000 Subject: [PATCH 305/413] remove unused icon --- avr/cores/megacommand/resources/R.h | 8 +- .../megacommand/resources/R_icons_page.cpp | 101 ++++++------------ resource/icons_page.cpp | 10 -- 3 files changed, 34 insertions(+), 85 deletions(-) diff --git a/avr/cores/megacommand/resources/R.h b/avr/cores/megacommand/resources/R.h index e3a290d3c..88a9b842b 100644 --- a/avr/cores/megacommand/resources/R.h +++ b/avr/cores/megacommand/resources/R.h @@ -270,12 +270,6 @@ struct __T_icons_page { }; static constexpr size_t countof_icon_wavd = 57 / sizeof(unsigned char); static constexpr size_t sizeofof_icon_wavd = 57; - union { - unsigned char icon_loudness[0]; - char zz__icon_loudness[48]; - }; - static constexpr size_t countof_icon_loudness = 48 / sizeof(unsigned char); - static constexpr size_t sizeofof_icon_loudness = 48; union { unsigned char icon_lfo[0]; char zz__icon_lfo[72]; @@ -288,7 +282,7 @@ struct __T_icons_page { }; static constexpr size_t countof_icon_grid = 45 / sizeof(unsigned char); static constexpr size_t sizeofof_icon_grid = 45; - static constexpr size_t __total_size = 954; + static constexpr size_t __total_size = 906; }; extern const unsigned char __R_machine_names_long[] PROGMEM; diff --git a/avr/cores/megacommand/resources/R_icons_page.cpp b/avr/cores/megacommand/resources/R_icons_page.cpp index b3d375888..b59f74460 100644 --- a/avr/cores/megacommand/resources/R_icons_page.cpp +++ b/avr/cores/megacommand/resources/R_icons_page.cpp @@ -520,117 +520,82 @@ const unsigned char __R_icons_page[] PROGMEM = { 16, 68, 35, - 70, + 82, 187, - 218, - 6, - 23, - 34, - 17, - 255, + 12, + 22, + 222, + 237, 255, - 136, - 37, - 195, - 164, - 41, - 153, - 148, - 41, - 183, - 165, - 2, - 181, - 148, - 115, - 8, - 14, - 157, - 20, - 1, - 75, - 17, - 1, - 189, - 231, - 2, - 205, - 8, - 38, - 101, - 49, - 219, - 224, - 15, 16, - 165, 30, - 41, - 181, + 54, + 249, 96, + 214, 2, - 183, - 22, + 77, + 220, 9, - 116, - 54, + 68, + 219, 0, 12, - 214, 5, + 89, 2, - 115, + 204, 8, - 49, + 199, 35, - 225, 192, 62, + 133, 28, - 116, - 125, + 68, + 247, 62, 192, 96, 99, - 225, 2, - 111, - 109, + 133, + 63, + 182, 224, 2, - 183, 112, + 223, 8, 62, 96, - 247, 62, 14, + 220, 96, 28, 29, - 6, - 185, - 119, - 184, + 25, + 137, + 221, + 136, 54, 219, 108, - 117, + 214, 2, 0, - 144, 8, - 116, + 65, + 211, 1, - 192, - 122, + 74, 0, 0, 0, 0, 0, - 159, + 2, + 127, 255, }; diff --git a/resource/icons_page.cpp b/resource/icons_page.cpp index 243f80139..6979c9961 100644 --- a/resource/icons_page.cpp +++ b/resource/icons_page.cpp @@ -14,16 +14,6 @@ unsigned char icon_lfo[] = { 0xc0, 0x60, 0x63, 0xc0, 0x60, 0x63, 0xc0, 0x7c, 0x63, 0xe0, 0x7c, 0x63, 0x70, 0x60, 0x63, 0x3e, 0x60, 0x3e, 0x0e, 0x60, 0x1c, 0x00, 0x00, 0x00}; -// 'loudness', 24x16px -unsigned char icon_loudness[] = { - 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x11, 0xff, 0x88, 0x25, - 0xc3, 0xa4, 0x29, 0x99, 0x94, 0x29, 0xa5, 0x94, 0x29, 0xb5, - 0x94, 0x29, 0x99, 0x94, 0x25, 0xc3, 0xa4, 0x11, 0xff, 0x88, - 0x01, 0xff, 0x80, 0x01, 0xe7, 0x80, 0x01, 0xe7, 0x80, 0x01, - 0xff, 0x80, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00 - -}; - // 'wavd', 24x19px unsigned char icon_wavd[] = { 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0xcc, 0x00, 0x00, 0xaa, 0x70, 0x00, From b1bd42d978d15fba126e56d3b693bdde78c2fb7d Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 22 Jul 2023 00:02:43 +1000 Subject: [PATCH 306/413] Perf locks weren't working --- avr/cores/megacommand/MCL/MixerPage.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 58f091a95..f17e38f3c 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -96,6 +96,8 @@ void MixerPage::load_perf_locks(uint8_t state) { uint8_t val = perf_locks[state][n]; if (val < 128) { encoders[n]->cur = val; + ((PerfEncoder*)encoders[n])->send(); + encoders[n]->old = encoders[n]->cur; } } } @@ -105,6 +107,7 @@ void MixerPage::loop() { perf_page.func_enc_check(); bool old_draw_encoders = draw_encoders; + if (preview_mute_set != 255 && note_interface.notes_on == 0) { for (uint8_t n = 0; n < GUI_NUM_ENCODERS; n++) { if (encoders[n]->hasChanged()) { @@ -116,6 +119,7 @@ void MixerPage::loop() { } } } + perf_page.encoder_send(); if (draw_encoders && trig_interface.is_key_down(MDX_KEY_FUNC)) { @@ -413,7 +417,7 @@ void MixerPage::populate_mute_set() { } void MixerPage::switch_mute_set(uint8_t state) { - load_perf_locks(state); + if (state < 4) { load_perf_locks(state); } if (current_mute_set == state) { return; @@ -768,12 +772,15 @@ bool MixerPage::handleEvent(gui_event_t *event) { if (preview_mute_set != 255) { if (event->source >= Buttons.ENCODER1 && event->source <= Buttons.ENCODER4) { - uint8_t set = event->source - Buttons.ENCODER1; + uint8_t b = event->source - Buttons.ENCODER1; if ((event)->mask & EVENT_BUTTON_RELEASED) { - perf_locks[preview_mute_set][set] = 255; + perf_locks[preview_mute_set][b] = 255; } if ((event)->mask & EVENT_BUTTON_PRESSED) { - perf_locks[preview_mute_set][set] = encoders[set]->cur; + if (perf_locks[preview_mute_set][b] == 255) { + GUI.ignoreNextEvent(event->source); + perf_locks[preview_mute_set][b] = encoders[b]->cur; + } } return true; } From 16553bc12a7bbc64b886b8673234aff23b43cf56 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 22 Jul 2023 00:06:50 +1000 Subject: [PATCH 307/413] Space optimise again --- avr/cores/megacommand/MCL/MCL.h | 2 +- avr/cores/megacommand/MCL/MixerPage.h | 2 ++ avr/cores/megacommand/MCL/PerfTrack.cpp | 6 ++---- avr/cores/megacommand/MCL/PerfTrack.h | 2 ++ 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCL.h b/avr/cores/megacommand/MCL/MCL.h index c5a2020ce..ecbc3d2f1 100644 --- a/avr/cores/megacommand/MCL/MCL.h +++ b/avr/cores/megacommand/MCL/MCL.h @@ -17,7 +17,7 @@ #include "Fonts/TomThumb.h" #define VERSION 4050 -#define VERSION_STR "PP4.50" +#define VERSION_STR "SS4.50" #define CALLBACK_TIMEOUT 500 #define GUI_NAME_TIMEOUT 800 diff --git a/avr/cores/megacommand/MCL/MixerPage.h b/avr/cores/megacommand/MCL/MixerPage.h index c98799b73..a53d1dad3 100644 --- a/avr/cores/megacommand/MCL/MixerPage.h +++ b/avr/cores/megacommand/MCL/MixerPage.h @@ -50,8 +50,10 @@ class MixerPage : public LightPage { uint8_t preview_mute_set = 255; void send_fx(uint8_t param, Encoder *enc, uint8_t type); + //Don't change order MuteSet mute_sets[2]; uint8_t perf_locks[4][4]; + // uint8_t perf_locks_temp[4]; diff --git a/avr/cores/megacommand/MCL/PerfTrack.cpp b/avr/cores/megacommand/MCL/PerfTrack.cpp index d8a53b905..d91d864b4 100644 --- a/avr/cores/megacommand/MCL/PerfTrack.cpp +++ b/avr/cores/megacommand/MCL/PerfTrack.cpp @@ -24,8 +24,7 @@ void PerfTrack::get_perf() { DEBUG_PRINTLN("get perf"); DEBUG_PRINTLN(sizeof(scenes)); memcpy(scenes, PerfData::scenes, sizeof(PerfScene) * NUM_SCENES); - memcpy(mute_sets,mixer_page.mute_sets, sizeof(mute_sets)); - memcpy(perf_locks,mixer_page.perf_locks, sizeof(perf_locks)); + memcpy(mute_sets,mixer_page.mute_sets, sizeof(mute_sets) + sizeof(perf_locks)); } @@ -44,8 +43,7 @@ void PerfTrack::load_perf() { memcpy(e->name,encs[n].name, PERF_NAME_LENGTH); } memcpy(PerfData::scenes, scenes, sizeof(PerfScene) * NUM_SCENES); - memcpy(mixer_page.mute_sets, mute_sets, sizeof(mute_sets)); - memcpy(mixer_page.perf_locks, perf_locks, sizeof(perf_locks)); + memcpy(mixer_page.mute_sets, mute_sets, sizeof(mute_sets) + sizeof(perf_locks)); } void PerfTrack::load_immediate(uint8_t tracknumber, SeqTrack *seq_track) { diff --git a/avr/cores/megacommand/MCL/PerfTrack.h b/avr/cores/megacommand/MCL/PerfTrack.h index 75deb6408..a1311bbcf 100644 --- a/avr/cores/megacommand/MCL/PerfTrack.h +++ b/avr/cores/megacommand/MCL/PerfTrack.h @@ -27,8 +27,10 @@ class PerfTrackData { public: PerfTrackEncoderData encs[4]; PerfScene scenes[NUM_SCENES]; + //Don't change order MuteSet mute_sets[2]; uint8_t perf_locks[4][4]; + // }; class PerfTrack : public AUXTrack, public PerfTrackData { From 0bcd6164428c6607320770489022efe458221230 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 22 Jul 2023 12:42:49 +1000 Subject: [PATCH 308/413] checkpoint --- avr/cores/megacommand/MCL/MixerPage.cpp | 63 ++++++++++--------------- 1 file changed, 24 insertions(+), 39 deletions(-) diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index f17e38f3c..bb2d13905 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -96,7 +96,7 @@ void MixerPage::load_perf_locks(uint8_t state) { uint8_t val = perf_locks[state][n]; if (val < 128) { encoders[n]->cur = val; - ((PerfEncoder*)encoders[n])->send(); + ((PerfEncoder *)encoders[n])->send(); encoders[n]->old = encoders[n]->cur; } } @@ -107,7 +107,6 @@ void MixerPage::loop() { perf_page.func_enc_check(); bool old_draw_encoders = draw_encoders; - if (preview_mute_set != 255 && note_interface.notes_on == 0) { for (uint8_t n = 0; n < GUI_NUM_ENCODERS; n++) { if (encoders[n]->hasChanged()) { @@ -417,11 +416,10 @@ void MixerPage::populate_mute_set() { } void MixerPage::switch_mute_set(uint8_t state) { - if (state < 4) { load_perf_locks(state); } - - if (current_mute_set == state) { - return; + if (state < 4) { + load_perf_locks(state); } + MidiDevice *devs[2] = { midi_active_peering.get_device(UART1_PORT), midi_active_peering.get_device(UART2_PORT), @@ -498,6 +496,9 @@ void MixerPage::toggle_or_solo(bool solo) { for (int i = 0; i < len; i++) { bool note_on = note_interface.is_note_on(i); bool mute_state = false; + bool state = + IS_BIT_SET16(mute_sets[!is_md_device].mutes[current_mute_set], i); + if (solo) { if (is_md_device) { if (mcl_seq.md_tracks[i].mute_state == note_on) { @@ -511,11 +512,7 @@ void MixerPage::toggle_or_solo(bool solo) { } } midi_device->muteTrack(i, !note_on); - if (note_on == SEQ_MUTE_OFF) { - CLEAR_BIT16(mute_sets[!is_md_device].mutes[current_mute_set], i); - } else { - SET_BIT16(mute_sets[!is_md_device].mutes[current_mute_set], i); - } + state = note_on; } else if (note_on) { // TOGGLE if (is_md_device) { @@ -526,18 +523,17 @@ void MixerPage::toggle_or_solo(bool solo) { mute_state = mcl_seq.ext_tracks[i].mute_state; } midi_device->muteTrack(i, mute_state); - - if (current_mute_set == 255) { - continue; - } - uint8_t state = - IS_BIT_SET16(mute_sets[!is_md_device].mutes[current_mute_set], i); - if (state == SEQ_MUTE_ON) { - CLEAR_BIT16(mute_sets[!is_md_device].mutes[current_mute_set], i); - } else { - SET_BIT16(mute_sets[!is_md_device].mutes[current_mute_set], i); - } } + /* + if (current_mute_set == 255) { + continue; + } + if (state == SEQ_MUTE_ON) { + CLEAR_BIT16(mute_sets[!is_md_device].mutes[current_mute_set], i); + } else { + SET_BIT16(mute_sets[!is_md_device].mutes[current_mute_set], i); + } + */ } oled_draw_mutes(); } @@ -569,27 +565,15 @@ bool MixerPage::handleEvent(gui_event_t *event) { ? (SeqTrack *)&mcl_seq.md_tracks[track] : (SeqTrack *)&mcl_seq.ext_tracks[track]; - uint8_t mute_set = current_mute_set; - uint8_t state = 0; + uint8_t mute_set = preview_mute_set; - if (preview_mute_set == 255) { + if (mute_set == 255) { seq_track->toggle_mute(); midi_device->muteTrack(track, seq_track->mute_state); - state = seq_track->mute_state; - if (preview_mute_set == current_mute_set) { - goto update_mute_set; - } - } else { - update_mute_set: - mute_set = preview_mute_set; - state = - IS_BIT_SET16(mute_sets[!is_md_device].mutes[mute_set], track); - } - - if (mute_set == 255) { return; } + bool state = IS_BIT_SET16(mute_sets[!is_md_device].mutes[mute_set], track); if (state == SEQ_MUTE_ON) { CLEAR_BIT16(mute_sets[!is_md_device].mutes[mute_set], track); } else { @@ -771,7 +755,8 @@ bool MixerPage::handleEvent(gui_event_t *event) { } if (preview_mute_set != 255) { - if (event->source >= Buttons.ENCODER1 && event->source <= Buttons.ENCODER4) { + if (event->source >= Buttons.ENCODER1 && + event->source <= Buttons.ENCODER4) { uint8_t b = event->source - Buttons.ENCODER1; if ((event)->mask & EVENT_BUTTON_RELEASED) { perf_locks[preview_mute_set][b] = 255; @@ -784,7 +769,7 @@ bool MixerPage::handleEvent(gui_event_t *event) { } return true; } - } + } return false; } From d858eed99b333a40e29a1914a9d6bb185f9ff828 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 22 Jul 2023 19:25:20 +1000 Subject: [PATCH 309/413] MixerPage key bindings, punch-in record mute mode. --- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 20 ++- avr/cores/megacommand/MCL/ExtSeqTrack.h | 3 + avr/cores/megacommand/MCL/MDSeqTrack.cpp | 28 ++-- avr/cores/megacommand/MCL/MDSeqTrack.h | 2 + avr/cores/megacommand/MCL/MixerPage.cpp | 150 ++++++++-------------- avr/cores/megacommand/MCL/MixerPage.h | 4 +- avr/cores/megacommand/MCL/SeqPage.cpp | 14 +- avr/cores/megacommand/MCL/SeqStepPage.cpp | 2 +- avr/cores/megacommand/MCL/TrigInterface.h | 1 + avr/cores/megacommand/MD/MD.cpp | 2 +- 10 files changed, 110 insertions(+), 116 deletions(-) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index b3bf13caa..4be4c4285 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -664,8 +664,7 @@ void ExtSeqTrack::seq(MidiUartParent *uart_) { uint8_t u = 0; uint8_t q = 0; uint8_t s = get_quantized_step(u,q); - if (mute_state == SEQ_MUTE_ON) { SET_BIT128_P(oneshot_mask, s); } - else { CLEAR_BIT128_P(oneshot_mask, s); } + SET_BIT128_P(mute_mask, s); } if ((is_generic_midi || (!is_generic_midi && count_down == 0)) && (mute_state == SEQ_MUTE_OFF)) { @@ -732,7 +731,7 @@ void ExtSeqTrack::note_off(uint8_t note, uint8_t velocity, void ExtSeqTrack::noteon_conditional(uint8_t condition, uint8_t note, uint8_t velocity) { - if (IS_BIT_SET128_P(oneshot_mask, step_count)) { + if (IS_BIT_SET128_P(oneshot_mask, step_count) || IS_BIT_SET128_P(mute_mask, step_count)) { return; } if (condition > 64) { @@ -916,9 +915,17 @@ bool ExtSeqTrack::del_track_locks(int16_t cur_x, uint8_t lock_idx, return ret; } +void ExtSeqTrack::clear_track_locks() { + for (uint8_t n = 0; n < NUM_LOCKS; n++) { + clear_track_locks(n); + } + pgm_oneshot = 0; +} + void ExtSeqTrack::clear_track_locks(uint8_t idx) { for (uint8_t n = 0; n < length; n++) { clear_track_locks_idx(n, idx, 255); + locks_slide_data[n].init(); } } @@ -1096,11 +1103,18 @@ void ExtSeqTrack::record_track_noteon(uint8_t note_num, uint8_t velocity) { add_notes_on(step * timing_mid + utiming - timing_mid, note_num, velocity); } +void ExtSeqTrack::clear_mutes() { + memset(oneshot_mask,0,sizeof(oneshot_mask)); + memset(mute_mask,0,sizeof(mute_mask)); +} + void ExtSeqTrack::clear_ext_conditional() { for (uint16_t x = 0; x < NUM_EXT_EVENTS; x++) { events[x].cond_id = 0; events[x].micro_timing = 0; // XXX zero or mid? } + clear_mutes(); + memset(ignore_notes,0, sizeof(ignore_notes)); } void ExtSeqTrack::clear_ext_notes() { diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.h b/avr/cores/megacommand/MCL/ExtSeqTrack.h index e73d69cf5..1facfe7f2 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.h +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.h @@ -150,6 +150,7 @@ class ExtSeqTrack : public ExtSeqTrackData, public SeqSlideTrack { uint64_t note_buffer[2] = { 0}; // 2 x 64 bit masks to store state of 128 notes. uint64_t oneshot_mask[2]; + uint64_t mute_mask[2]; uint64_t ignore_notes[2]; bool pgm_oneshot; @@ -206,6 +207,8 @@ class ExtSeqTrack : public ExtSeqTrackData, public SeqSlideTrack { // clear_track_locks: if value != 255, delete specific lock event of value. // otherwise delete all locks matching track_param of any value bool del_track_locks(int16_t cur_x, uint8_t lock_idx, uint8_t value); + void clear_mutes(); + void clear_track_locks(); void clear_track_locks(uint8_t idx); bool clear_track_locks(uint8_t step, uint8_t track_param, uint8_t value = 255); diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.cpp b/avr/cores/megacommand/MCL/MDSeqTrack.cpp index a59f05838..259e1086a 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/MDSeqTrack.cpp @@ -45,6 +45,13 @@ void MDSeqTrack::set_length(uint8_t len, bool expand) { } } +void MDSeqTrack::store_mute_state() { + for (uint8_t n = 0; n < NUM_MD_STEPS; n++) { + if (IS_BIT_SET64(mute_mask, n)) { set_step(n,MASK_PATTERN, 0); set_step(n,MASK_LOCK, 0); } + } + clear_mutes(); +} + void MDSeqTrack::set_speed(uint8_t new_speed, uint8_t old_speed, bool timing_adjust) { if (old_speed == 255) { @@ -123,8 +130,7 @@ void MDSeqTrack::seq(MidiUartParent *uart_) { uint8_t u = 0; uint8_t q = 0; uint8_t s = get_quantized_step(u, q); - if (mute_state == SEQ_MUTE_ON) { SET_BIT64(oneshot_mask, s); } - else { CLEAR_BIT64(oneshot_mask, s); } + SET_BIT64(mute_mask, s); } if ((mute_state == SEQ_MUTE_OFF) && @@ -305,7 +311,7 @@ void MDSeqTrack::get_mask(uint64_t *_pmask, uint8_t mask_type) const { } break; case MASK_MUTE: - if (IS_BIT_SET64(oneshot_mask, i)) { + if (IS_BIT_SET64(mute_mask, i)) { set_bit = true; } break; @@ -323,7 +329,7 @@ bool MDSeqTrack::get_step(uint8_t step, uint8_t mask_type) const { case MASK_LOCK: return steps[step].locks_enabled; case MASK_MUTE: - return IS_BIT_SET64(oneshot_mask, step); + return IS_BIT_SET64(mute_mask, step); case MASK_SLIDE: return steps[step].slide; default: @@ -341,9 +347,9 @@ void MDSeqTrack::set_step(uint8_t step, uint8_t mask_type, bool val) { break; case MASK_MUTE: if (val) { - SET_BIT64(oneshot_mask, step); + SET_BIT64(mute_mask, step); } else { - CLEAR_BIT64(oneshot_mask, step); + CLEAR_BIT64(mute_mask, step); } break; case MASK_SLIDE: @@ -420,7 +426,7 @@ void MDSeqTrack::send_trig_inline() { uint8_t MDSeqTrack::trig_conditional(uint8_t condition) { bool send_trig = TRIG_FALSE; - if (IS_BIT_SET64(oneshot_mask, step_count)) { + if (IS_BIT_SET64(oneshot_mask, step_count) || IS_BIT_SET64(mute_mask, step_count)) { return TRIG_ONESHOT; } switch (condition) { @@ -728,13 +734,19 @@ uint8_t MDSeqTrack::get_step_locks(uint8_t step) { return steps[step].locks_enabled ? steps[step].locks : 0; } +void MDSeqTrack::clear_mutes() { + oneshot_mask = 0; + mute_mask = 0; +} + void MDSeqTrack::clear_conditional() { for (uint8_t c = 0; c < NUM_MD_STEPS; c++) { steps[c].cond_id = 0; steps[c].cond_plock = 0; timing[c] = 0; } - oneshot_mask = 0; + clear_mutes(); + ignore_step = 255; } void MDSeqTrack::clear_locks() { diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.h b/avr/cores/megacommand/MCL/MDSeqTrack.h index f0d0ed1df..318a3857d 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.h +++ b/avr/cores/megacommand/MCL/MDSeqTrack.h @@ -21,6 +21,7 @@ class MDSeqTrack : public MDSeqTrackData, public SeqSlideTrack { public: uint64_t oneshot_mask; + uint64_t mute_mask; static uint16_t gui_update; static uint16_t md_trig_mask; @@ -67,6 +68,7 @@ class MDSeqTrack : public MDSeqTrackData, public SeqSlideTrack { void record_track(uint8_t velocity); void record_track_locks(uint8_t track_param, uint8_t value); void record_track_pitch(uint8_t pitch); + void clear_mutes(); void clear_slide_data(); void clear_step_locks(uint8_t step); // disable the step locks, but not remove them. so later can be re-activated. diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index bb2d13905..ae0fa990f 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -262,24 +262,18 @@ void MixerPage::display() { bool is_md_device = (midi_device == &MD); constexpr uint8_t fader_y = 11; - if (preview_mute_set != 255) { - if (mute_sets[!is_md_device].mutes[preview_mute_set] != - seq_step_page.mute_mask) { - seq_step_page.mute_mask = - mute_sets[!is_md_device].mutes[preview_mute_set]; - MD.set_trigleds(mute_sets[!is_md_device].mutes[preview_mute_set], - TRIGLED_EXCLUSIVE); - oled_draw_mutes(); - } - } else if (show_mixer_menu && seq_step_page.display_mute_mask(midi_device)) { + + uint8_t mute_set = preview_mute_set; + + if (show_mixer_menu && seq_step_page.display_mute_mask(midi_device)) { oled_draw_mutes(); - } else if (current_mute_set != 255 && - mute_sets[!is_md_device].mutes[current_mute_set] != - seq_step_page.mute_mask) { - seq_step_page.mute_mask = mute_sets[!is_md_device].mutes[current_mute_set]; + } + else if (mute_set != 255 && mute_sets[!is_md_device].mutes[mute_set] != seq_step_page.mute_mask) { + MD.set_trigleds(mute_sets[!is_md_device].mutes[mute_set], + TRIGLED_EXCLUSIVE); + seq_step_page.mute_mask = mute_sets[!is_md_device].mutes[mute_set]; oled_draw_mutes(); } - if (draw_encoders || preview_mute_set != 255) { // oled_display.clearDisplay(); oled_display.fillRect(0, fader_y, 128, 21, BLACK); @@ -360,35 +354,24 @@ void MixerPage::display() { oled_display.setFont(oldfont); } -void MixerPage::disable_record_mutes() { - - MidiDevice *devs[2] = { - midi_active_peering.get_device(UART1_PORT), - midi_active_peering.get_device(UART2_PORT), - }; - - ElektronDevice *elektron_devs[2] = { - devs[0]->asElektronDevice(), - devs[1]->asElektronDevice(), - }; +void MixerPage::record_mutes_set(bool state) { + bool is_md_device = (midi_device == &MD); + for (uint8_t i = 0; i < 16; i++) { + if (note_interface.is_note_on(i)) { + if (is_md_device) { mcl_seq.md_tracks[i].record_mutes = state; if (!state) mcl_seq.md_tracks[i].clear_mutes(); } + else if (i < mcl_seq.num_ext_tracks) { mcl_seq.ext_tracks[i].record_mutes = state; if (!state) mcl_seq.ext_tracks[i].clear_mutes(); } + } + } +} +void MixerPage::disable_record_mutes(bool clear) { for (uint8_t n = 0; n < mcl_seq.num_md_tracks; n++) { if (n < mcl_seq.num_ext_tracks) { - if (mcl_seq.ext_tracks[n].record_mutes) { - mcl_seq.ext_tracks[n].record_mutes = false; - if (mcl_seq.ext_tracks[n].mute_state == SEQ_MUTE_ON) { - mcl_seq.ext_tracks[n].toggle_mute(); - devs[1]->muteTrack(n, SEQ_MUTE_OFF); - } - } - } - if (mcl_seq.md_tracks[n].record_mutes) { - mcl_seq.md_tracks[n].record_mutes = false; - if (mcl_seq.md_tracks[n].mute_state == SEQ_MUTE_ON) { - mcl_seq.md_tracks[n].toggle_mute(); - devs[0]->muteTrack(n, SEQ_MUTE_OFF); - } - } + mcl_seq.ext_tracks[n].record_mutes = false; + if (clear) { mcl_seq.ext_tracks[n].clear_mutes(); } + } + mcl_seq.md_tracks[n].record_mutes = false; + if (clear) { mcl_seq.md_tracks[n].clear_mutes(); } } if (!seq_step_page.recording) { clearLed2(); @@ -416,19 +399,12 @@ void MixerPage::populate_mute_set() { } void MixerPage::switch_mute_set(uint8_t state) { - if (state < 4) { - load_perf_locks(state); - } MidiDevice *devs[2] = { midi_active_peering.get_device(UART1_PORT), midi_active_peering.get_device(UART2_PORT), }; - ElektronDevice *elektron_devs[2] = { - devs[0]->asElektronDevice(), - devs[1]->asElektronDevice(), - }; for (uint8_t dev = 0; dev < 2; dev++) { bool is_md_device = dev == 0; @@ -441,23 +417,12 @@ void MixerPage::switch_mute_set(uint8_t state) { uint8_t mute_set = state; bool mute_state = IS_BIT_CLEAR16(mute_sets[dev].mutes[state], n); - if (state == 4) { - if (preview_mute_set != 255) { - mute_set = preview_mute_set; - mute_state = IS_BIT_CLEAR16(mute_sets[dev].mutes[mute_set], n); - } else { - mute_state = !seq_track->mute_state; - } - if (mute_set != 255) { - if (mute_state != SEQ_MUTE_ON) { - CLEAR_BIT16(mute_sets[!is_md_device].mutes[mute_set], n); - } else { - SET_BIT16(mute_sets[!is_md_device].mutes[mute_set], n); - } - } + //Flip + if (state == 4 && devs[dev] == midi_device) { + mute_state = !seq_track->mute_state; } - if (mute_state != seq_track->mute_state && - !(mute_state == 4 && mute_set != preview_mute_set)) { + //Switch + if (mute_state != seq_track->mute_state) { devs[dev]->muteTrack(n, mute_state); if (is_md_device) { mcl_seq.md_tracks[n].toggle_mute(); @@ -468,10 +433,11 @@ void MixerPage::switch_mute_set(uint8_t state) { } } if (state < 4) { - current_mute_set = state; + load_perf_locks(state); } oled_draw_mutes(); } + uint8_t MixerPage::get_mute_set(uint8_t key) { switch (key) { case MDX_KEY_LEFT: @@ -496,8 +462,6 @@ void MixerPage::toggle_or_solo(bool solo) { for (int i = 0; i < len; i++) { bool note_on = note_interface.is_note_on(i); bool mute_state = false; - bool state = - IS_BIT_SET16(mute_sets[!is_md_device].mutes[current_mute_set], i); if (solo) { if (is_md_device) { @@ -512,7 +476,6 @@ void MixerPage::toggle_or_solo(bool solo) { } } midi_device->muteTrack(i, !note_on); - state = note_on; } else if (note_on) { // TOGGLE if (is_md_device) { @@ -524,21 +487,13 @@ void MixerPage::toggle_or_solo(bool solo) { } midi_device->muteTrack(i, mute_state); } - /* - if (current_mute_set == 255) { - continue; - } - if (state == SEQ_MUTE_ON) { - CLEAR_BIT16(mute_sets[!is_md_device].mutes[current_mute_set], i); - } else { - SET_BIT16(mute_sets[!is_md_device].mutes[current_mute_set], i); - } - */ } oled_draw_mutes(); } bool MixerPage::handleEvent(gui_event_t *event) { + + if (note_interface.is_event(event)) { uint8_t mask = event->mask; uint8_t port = event->port; @@ -546,9 +501,8 @@ bool MixerPage::handleEvent(gui_event_t *event) { uint8_t track = event->source - 128; - uint8_t is_md_device = (midi_device == &MD); - uint8_t len = is_md_device ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; + uint8_t is_md_device = (midi_device == &MD); if (track > 16) { return false; @@ -557,6 +511,7 @@ bool MixerPage::handleEvent(gui_event_t *event) { trig_interface.send_md_leds(TRIGLED_OVERLAY); } + uint8_t len = is_md_device ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; if (event->mask == EVENT_BUTTON_PRESSED && track <= len) { if (note_interface.is_note(track)) { if (show_mixer_menu || preview_mute_set != 255) { @@ -567,12 +522,14 @@ bool MixerPage::handleEvent(gui_event_t *event) { uint8_t mute_set = preview_mute_set; + //Toggle active mutes if (mute_set == 255) { seq_track->toggle_mute(); midi_device->muteTrack(track, seq_track->mute_state); return; } + //Toggle preview mutes bool state = IS_BIT_SET16(mute_sets[!is_md_device].mutes[mute_set], track); if (state == SEQ_MUTE_ON) { CLEAR_BIT16(mute_sets[!is_md_device].mutes[mute_set], track); @@ -580,10 +537,7 @@ bool MixerPage::handleEvent(gui_event_t *event) { SET_BIT16(mute_sets[!is_md_device].mutes[mute_set], track); } - if (trig_interface.is_key_down(MDX_KEY_PATSONG)) { - seq_track->record_mutes = true; - } - // oled_draw_mutes(); + // oled_draw_mutes(); } else if (first_track == 255) { first_track = track; MD.setStatus(0x22, track); @@ -616,12 +570,18 @@ bool MixerPage::handleEvent(gui_event_t *event) { uint8_t key = event->source - 64; if (event->mask == EVENT_BUTTON_PRESSED) { switch (key) { + case MDX_KEY_KIT: { + record_mutes_set(false); + // trig_interface.ignore_next_event(GLOBAL); + break; + } + case MDX_KEY_PATSONGKIT: { + bool clear = true; + disable_record_mutes(true); + // trig_interface.ignore_next_event(GLOBAL); + break; + } case MDX_KEY_EXTENDED: { - if (note_interface.notes_count_on() == 0) { - disable_record_mutes(); - mcl.setPage(fx_page_a.last_page); - return true; - } if (midi_device == &MD) { for (uint8_t i = 0; i < 16; i++) { if (note_interface.is_note_on(i)) { @@ -634,13 +594,15 @@ bool MixerPage::handleEvent(gui_event_t *event) { break; } case MDX_KEY_NO: { - if (note_interface.notes_on) { - toggle_or_solo(true); + if (note_interface.notes_count_on() == 0) { + mcl.setPage(fx_page_a.last_page); + return true; } + toggle_or_solo(true); break; } case MDX_KEY_YES: { - if (trig_interface.is_key_down(MDX_KEY_FUNC) && + if (preview_mute_set == 255 && trig_interface.is_key_down(MDX_KEY_FUNC) && note_interface.notes_on == 0) { switch_mute_set(4); //---> Flip mutes break; @@ -732,9 +694,9 @@ bool MixerPage::handleEvent(gui_event_t *event) { } if (EVENT_PRESSED(event, Buttons.BUTTON3) && !BUTTON_DOWN(Buttons.BUTTON4)) { seq_step_page.mute_mask = 0; - show_mixer_menu = true; + //show_mixer_menu = true; setLed2(); - + record_mutes_set(true); return true; } diff --git a/avr/cores/megacommand/MCL/MixerPage.h b/avr/cores/megacommand/MCL/MixerPage.h index a53d1dad3..5f8613f24 100644 --- a/avr/cores/megacommand/MCL/MixerPage.h +++ b/avr/cores/megacommand/MCL/MixerPage.h @@ -72,7 +72,9 @@ class MixerPage : public LightPage { void redraw(); void set_level(int curtrack, int value); void set_display_mode(uint8_t param); - void disable_record_mutes(); + + void record_mutes_set(bool state); + void disable_record_mutes(bool clear = false); void oled_draw_mutes(); void switch_mute_set(uint8_t state); void populate_mute_set(); diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index b7e1f9347..cd5be45f1 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -486,7 +486,7 @@ void SeqPage::draw_mask(uint8_t offset, uint8_t device, if (device == DEVICE_MD) { auto &active_track = mcl_seq.md_tracks[last_md_track]; - uint64_t mask, lock_mask, oneshot_mask = 0, slide_mask = 0; + uint64_t mask, lock_mask, mute_mask = 0, slide_mask = 0; active_track.get_mask(&mask, MASK_PATTERN); uint64_t led_mask = 0; @@ -500,8 +500,8 @@ void SeqPage::draw_mask(uint8_t offset, uint8_t device, mask = lock_mask; break; case MASK_MUTE: - oneshot_mask = active_track.oneshot_mask; - led_mask = oneshot_mask; + mute_mask = active_track.mute_mask; + led_mask = mute_mask; break; case MASK_SLIDE: active_track.get_mask(&slide_mask, MASK_SLIDE); @@ -510,7 +510,7 @@ void SeqPage::draw_mask(uint8_t offset, uint8_t device, } shed_mask(led_mask, active_track.length, offset); draw_mask(offset, mask, active_track.step_count, active_track.length, - oneshot_mask, slide_mask, show_current_step); + mute_mask, slide_mask, show_current_step); if (recording) return; @@ -807,9 +807,7 @@ void opt_clear_locks_handler() { auto &active_track = mcl_seq.ext_tracks[last_ext_track]; if (opt_clear == 2) { oled_display.textbox("CLEAR ", "LOCKS"); - for (uint8_t n = 0; n < NUM_LOCKS; n++) { - active_track.clear_track_locks(n); - } + active_track.clear_track_locks(); } if (opt_clear == 1) { oled_display.textbox("CLEAR ", "LOCK"); @@ -1091,7 +1089,7 @@ void opt_paste_step_handler() { void opt_mute_step_handler() { for (uint8_t n = 0; n < NUM_MD_TRACKS; n++) { if (note_interface.is_note_on(n)) { - TOGGLE_BIT64(mcl_seq.md_tracks[last_md_track].oneshot_mask, + TOGGLE_BIT64(mcl_seq.md_tracks[last_md_track].mute_mask, n + SeqPage::page_select * 16); } } diff --git a/avr/cores/megacommand/MCL/SeqStepPage.cpp b/avr/cores/megacommand/MCL/SeqStepPage.cpp index cdcff783c..c1ea6d241 100644 --- a/avr/cores/megacommand/MCL/SeqStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqStepPage.cpp @@ -400,7 +400,7 @@ bool SeqStepPage::handleEvent(gui_event_t *event) { translate_to_step_conditional(condition, &cond_plock); active_track.steps[step].cond_plock = cond_plock; active_track.timing[step] = utiming; - CLEAR_BIT64(active_track.oneshot_mask, step); + CLEAR_BIT64(active_track.mute_mask, step); active_track.set_step(step, mask_type, true); SET_BIT16(ignore_release, track); } diff --git a/avr/cores/megacommand/MCL/TrigInterface.h b/avr/cores/megacommand/MCL/TrigInterface.h index 38dfb4b3d..97e15ce46 100644 --- a/avr/cores/megacommand/MCL/TrigInterface.h +++ b/avr/cores/megacommand/MCL/TrigInterface.h @@ -15,6 +15,7 @@ #define MDX_KEY_REC 0x20 #define MDX_KEY_GLOBAL 0x21 #define MDX_KEY_PATSONGKIT 0x22 +#define MDX_KEY_KIT 0x23 #define MDX_KEY_FUNC 0x25 #define MDX_KEY_LEFT 0x26 #define MDX_KEY_RIGHT 0x27 diff --git a/avr/cores/megacommand/MD/MD.cpp b/avr/cores/megacommand/MD/MD.cpp index 89f6fbe63..2e8b4aab8 100644 --- a/avr/cores/megacommand/MD/MD.cpp +++ b/avr/cores/megacommand/MD/MD.cpp @@ -795,7 +795,7 @@ void MDClass::muteTrack(uint8_t track, bool mute, MidiUartParent *uart_) { uint8_t channel = track >> 2; uint8_t b = track & 3; uint8_t cc = 12 + b; - uart_->sendCC(channel + global.baseChannel, cc, mute ? 1 : 0); + uart_->sendCC(channel + global.baseChannel, cc, (uint8_t) mute); } void MDClass::setGlobal(uint8_t id) { From a379940c867b0a8782406feb524ed1464d40a17c Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 22 Jul 2023 22:35:12 +1000 Subject: [PATCH 310/413] Reset mute states on load_seq_data. Store mute state for MD --- avr/cores/megacommand/MCL/ExtTrack.cpp | 2 ++ avr/cores/megacommand/MCL/MDSeqTrack.h | 2 ++ avr/cores/megacommand/MCL/MDTrack.cpp | 3 ++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/ExtTrack.cpp b/avr/cores/megacommand/MCL/ExtTrack.cpp index 285300b9e..2aa94ec88 100644 --- a/avr/cores/megacommand/MCL/ExtTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtTrack.cpp @@ -36,6 +36,8 @@ void ExtTrack::load_seq_data(SeqTrack *seq_track) { memcpy(ext_track->data(), &seq_data, sizeof(seq_data)); load_link_data(seq_track); + ext_track->clear_mutes(); + ext_track->pgm_oneshot = 0; ext_track->set_length(seq_track->length); seq_track->mute_state = old_mute; #endif diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.h b/avr/cores/megacommand/MCL/MDSeqTrack.h index 318a3857d..bafc82166 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.h +++ b/avr/cores/megacommand/MCL/MDSeqTrack.h @@ -96,6 +96,8 @@ class MDSeqTrack : public MDSeqTrackData, public SeqSlideTrack { void set_speed(uint8_t new_speed, uint8_t old_speed = 255, bool timing_adjust = true); + void store_mute_state(); + void copy_step(uint8_t n, MDSeqStep *step); void paste_step(uint8_t n, MDSeqStep *step); void load_cache(); diff --git a/avr/cores/megacommand/MCL/MDTrack.cpp b/avr/cores/megacommand/MCL/MDTrack.cpp index fef7dbca2..558e41ebb 100644 --- a/avr/cores/megacommand/MCL/MDTrack.cpp +++ b/avr/cores/megacommand/MCL/MDTrack.cpp @@ -113,7 +113,7 @@ void MDTrack::load_seq_data(SeqTrack *seq_track) { memcpy(md_seq_track->data(), seq_data.data(), sizeof(seq_data)); load_link_data(seq_track); - md_seq_track->oneshot_mask = 0; + md_seq_track->clear_mutes(); md_seq_track->set_length(md_seq_track->length); } @@ -157,6 +157,7 @@ bool MDTrack::store_in_grid(uint8_t column, uint16_t row, SeqTrack *seq_track, uint32_t len; MDSeqTrack *md_seq_track = (MDSeqTrack *)seq_track; + md_seq_track->store_mute_state(); if (column != 255 && online == true) { get_machine_from_kit(column); From 5f37e0238c4060d6b47744a29c4b0668c830ed3f Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 22 Jul 2023 22:57:49 +1000 Subject: [PATCH 311/413] Empty PerfTrack perf_locks not init on load --- avr/cores/megacommand/MCL/PerfTrack.h | 1 + 1 file changed, 1 insertion(+) diff --git a/avr/cores/megacommand/MCL/PerfTrack.h b/avr/cores/megacommand/MCL/PerfTrack.h index a1311bbcf..7b3dc93b4 100644 --- a/avr/cores/megacommand/MCL/PerfTrack.h +++ b/avr/cores/megacommand/MCL/PerfTrack.h @@ -49,6 +49,7 @@ class PerfTrack : public AUXTrack, public PerfTrackData { scenes[n].init(); } memset(mute_sets, 0, sizeof(mute_sets)); + memset(perf_locks, 255, sizeof(perf_locks)); } void load_perf(); From bfc68e77678f71a691ffbbac5988adfeccd28a70 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 23 Jul 2023 00:49:03 +1000 Subject: [PATCH 312/413] ToggleMute fix --- avr/cores/megacommand/MCL/MixerPage.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index ae0fa990f..0f0101052 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -512,7 +512,7 @@ bool MixerPage::handleEvent(gui_event_t *event) { } uint8_t len = is_md_device ? mcl_seq.num_md_tracks : mcl_seq.num_ext_tracks; - if (event->mask == EVENT_BUTTON_PRESSED && track <= len) { + if (event->mask == EVENT_BUTTON_PRESSED && track < len) { if (note_interface.is_note(track)) { if (show_mixer_menu || preview_mute_set != 255) { @@ -524,7 +524,8 @@ bool MixerPage::handleEvent(gui_event_t *event) { //Toggle active mutes if (mute_set == 255) { - seq_track->toggle_mute(); + if (is_md_device) { mcl_seq.md_tracks[track].toggle_mute(); } + else { mcl_seq.ext_tracks[track].toggle_mute(); } midi_device->muteTrack(track, seq_track->mute_state); return; } From f129b7266ebc842b95b42b2acfbd04dbe8f5492b Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 23 Jul 2023 00:54:04 +1000 Subject: [PATCH 313/413] LED change only when notes on --- avr/cores/megacommand/MCL/MixerPage.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 0f0101052..b4529460c 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -694,10 +694,11 @@ bool MixerPage::handleEvent(gui_event_t *event) { } } if (EVENT_PRESSED(event, Buttons.BUTTON3) && !BUTTON_DOWN(Buttons.BUTTON4)) { - seq_step_page.mute_mask = 0; //show_mixer_menu = true; - setLed2(); - record_mutes_set(true); + if (note_interface.notes_on) { + setLed2(); + record_mutes_set(true); + } return true; } From d716245b11f31ebaf8efd5987033ea5bb0812318 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 23 Jul 2023 01:17:17 +1000 Subject: [PATCH 314/413] store mute states for ext_tracks, uses too much progmem --- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 17 +++++++++++++++++ avr/cores/megacommand/MCL/ExtSeqTrack.h | 1 + avr/cores/megacommand/MCL/ExtTrack.cpp | 2 +- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index 4be4c4285..9999fd7a8 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -1054,6 +1054,23 @@ bool ExtSeqTrack::set_track_step(uint8_t &step, uint8_t utiming, return true; } +void ExtSeqTrack::store_mute_state() { + uint8_t timing_mid = get_timing_mid(); + for (uint8_t n = 0; n < NUM_EXT_STEPS; n++) { + if (IS_BIT_SET128_P(mute_mask, n)) { + uint16_t ev_idx, ev_end; + loc: + locate(n, ev_idx, ev_end); + for (uint8_t m = ev_idx; m < ev_end; m++) { + if (!events[m].is_lock && events[m].event_on) { + if (del_note(n * timing_mid + events[m].micro_timing - timing_mid, timing_mid, events[m].event_value)) { goto loc; } + } + } + } + } + clear_mutes(); +} + void ExtSeqTrack::record_track_noteoff(uint8_t note_num) { uint8_t condition = 0; diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.h b/avr/cores/megacommand/MCL/ExtSeqTrack.h index 1facfe7f2..127d8183b 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.h +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.h @@ -214,6 +214,7 @@ class ExtSeqTrack : public ExtSeqTrackData, public SeqSlideTrack { uint8_t value = 255); bool clear_track_locks_idx(uint8_t step, uint8_t lock_idx, uint8_t value = 255); void clear_track(); + void store_mute_state(); void set_length(uint8_t len, bool expand = false); void re_sync(); void reset_params(); diff --git a/avr/cores/megacommand/MCL/ExtTrack.cpp b/avr/cores/megacommand/MCL/ExtTrack.cpp index 2aa94ec88..7892b83d2 100644 --- a/avr/cores/megacommand/MCL/ExtTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtTrack.cpp @@ -54,7 +54,7 @@ bool ExtTrack::store_in_grid(uint8_t column, uint16_t row, SeqTrack *seq_track, if (grid == nullptr) { DEBUG_PRINTLN("grid is nullptr"); } ExtSeqTrack *ext_track = (ExtSeqTrack *) seq_track; - + //ext_track->store_mute_state(); #ifdef EXT_TRACKS if (online) { get_track_from_sysex(column); From 98f0238ed71d65f610e5e6876968115b0fd48ab9 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 23 Jul 2023 01:24:14 +1000 Subject: [PATCH 315/413] clear mute, not oneshot --- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 4 ++++ avr/cores/megacommand/MCL/ExtSeqTrack.h | 1 + avr/cores/megacommand/MCL/MDSeqTrack.cpp | 4 ++++ avr/cores/megacommand/MCL/MDSeqTrack.h | 1 + avr/cores/megacommand/MCL/MixerPage.cpp | 8 ++++---- 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index 9999fd7a8..80845369a 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -1120,6 +1120,10 @@ void ExtSeqTrack::record_track_noteon(uint8_t note_num, uint8_t velocity) { add_notes_on(step * timing_mid + utiming - timing_mid, note_num, velocity); } +void ExtSeqTrack::clear_mute() { + memset(mute_mask,0,sizeof(mute_mask)); +} + void ExtSeqTrack::clear_mutes() { memset(oneshot_mask,0,sizeof(oneshot_mask)); memset(mute_mask,0,sizeof(mute_mask)); diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.h b/avr/cores/megacommand/MCL/ExtSeqTrack.h index 127d8183b..71cdd01cf 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.h +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.h @@ -207,6 +207,7 @@ class ExtSeqTrack : public ExtSeqTrackData, public SeqSlideTrack { // clear_track_locks: if value != 255, delete specific lock event of value. // otherwise delete all locks matching track_param of any value bool del_track_locks(int16_t cur_x, uint8_t lock_idx, uint8_t value); + void clear_mute(); void clear_mutes(); void clear_track_locks(); void clear_track_locks(uint8_t idx); diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.cpp b/avr/cores/megacommand/MCL/MDSeqTrack.cpp index 259e1086a..f116790ba 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/MDSeqTrack.cpp @@ -734,6 +734,10 @@ uint8_t MDSeqTrack::get_step_locks(uint8_t step) { return steps[step].locks_enabled ? steps[step].locks : 0; } +void MDSeqTrack::clear_mute() { + mute_mask = 0; +} + void MDSeqTrack::clear_mutes() { oneshot_mask = 0; mute_mask = 0; diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.h b/avr/cores/megacommand/MCL/MDSeqTrack.h index bafc82166..236b2d411 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.h +++ b/avr/cores/megacommand/MCL/MDSeqTrack.h @@ -68,6 +68,7 @@ class MDSeqTrack : public MDSeqTrackData, public SeqSlideTrack { void record_track(uint8_t velocity); void record_track_locks(uint8_t track_param, uint8_t value); void record_track_pitch(uint8_t pitch); + void clear_mute(); void clear_mutes(); void clear_slide_data(); void clear_step_locks(uint8_t step); diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index b4529460c..09f440067 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -358,8 +358,8 @@ void MixerPage::record_mutes_set(bool state) { bool is_md_device = (midi_device == &MD); for (uint8_t i = 0; i < 16; i++) { if (note_interface.is_note_on(i)) { - if (is_md_device) { mcl_seq.md_tracks[i].record_mutes = state; if (!state) mcl_seq.md_tracks[i].clear_mutes(); } - else if (i < mcl_seq.num_ext_tracks) { mcl_seq.ext_tracks[i].record_mutes = state; if (!state) mcl_seq.ext_tracks[i].clear_mutes(); } + if (is_md_device) { mcl_seq.md_tracks[i].record_mutes = state; if (!state) mcl_seq.md_tracks[i].clear_mute(); } + else if (i < mcl_seq.num_ext_tracks) { mcl_seq.ext_tracks[i].record_mutes = state; if (!state) mcl_seq.ext_tracks[i].clear_mute(); } } } } @@ -368,10 +368,10 @@ void MixerPage::disable_record_mutes(bool clear) { for (uint8_t n = 0; n < mcl_seq.num_md_tracks; n++) { if (n < mcl_seq.num_ext_tracks) { mcl_seq.ext_tracks[n].record_mutes = false; - if (clear) { mcl_seq.ext_tracks[n].clear_mutes(); } + ` if (clear) { mcl_seq.ext_tracks[n].clear_mute(); } } mcl_seq.md_tracks[n].record_mutes = false; - if (clear) { mcl_seq.md_tracks[n].clear_mutes(); } + if (clear) { mcl_seq.md_tracks[n].clear_mute(); } } if (!seq_step_page.recording) { clearLed2(); From d85ba2818e00567de3f378a33a05e06484babf2e Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 23 Jul 2023 12:33:56 +1000 Subject: [PATCH 316/413] Fix leds when device toggling mixer page --- avr/cores/megacommand/MCL/MixerPage.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 09f440067..b2f88fccd 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -269,9 +269,10 @@ void MixerPage::display() { oled_draw_mutes(); } else if (mute_set != 255 && mute_sets[!is_md_device].mutes[mute_set] != seq_step_page.mute_mask) { - MD.set_trigleds(mute_sets[!is_md_device].mutes[mute_set], - TRIGLED_EXCLUSIVE); - seq_step_page.mute_mask = mute_sets[!is_md_device].mutes[mute_set]; + uint16_t mask = mute_sets[!is_md_device].mutes[mute_set]; + if (!is_md_device) { mask &= 0b111111; } + MD.set_trigleds(mask, TRIGLED_EXCLUSIVE); + seq_step_page.mute_mask = mask; oled_draw_mutes(); } if (draw_encoders || preview_mute_set != 255) { @@ -368,7 +369,7 @@ void MixerPage::disable_record_mutes(bool clear) { for (uint8_t n = 0; n < mcl_seq.num_md_tracks; n++) { if (n < mcl_seq.num_ext_tracks) { mcl_seq.ext_tracks[n].record_mutes = false; - ` if (clear) { mcl_seq.ext_tracks[n].clear_mute(); } + if (clear) { mcl_seq.ext_tracks[n].clear_mute(); } } mcl_seq.md_tracks[n].record_mutes = false; if (clear) { mcl_seq.md_tracks[n].clear_mute(); } @@ -452,6 +453,7 @@ uint8_t MixerPage::get_mute_set(uint8_t key) { void MixerPage::redraw() { redraw_mask = -1; + seq_step_page.mute_mask++; oled_display.clearDisplay(); oled_draw_mutes(); } From 061793eba8c39b362c81132a95a4c33ed87ed392 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 23 Jul 2023 15:30:01 +1000 Subject: [PATCH 317/413] Abort draw if event_count changes due to live record --- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 23 +++++++++++++++----- avr/cores/megacommand/MCL/SeqExtStepPage.h | 4 ++-- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index 31a54b6b5..e55cc052c 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -180,7 +180,7 @@ void SeqExtStepPage::draw_thick_line(uint8_t x1, uint8_t y1, uint8_t x2, oled_display.drawLine(x1, y1 + 1, x2, y2 + 1, color); } -void SeqExtStepPage::draw_lockeditor() { +bool SeqExtStepPage::draw_lockeditor() { auto &active_track = mcl_seq.ext_tracks[last_ext_track]; uint8_t timing_mid = active_track.get_timing_mid(); @@ -195,6 +195,8 @@ void SeqExtStepPage::draw_lockeditor() { uint16_t ev_idx = 0, ev_end = 0, ev_j_end; uint8_t j = 0; + uint16_t event_count = active_track.event_count; + for (uint8_t i = 0; i < active_track.length; i++) { // Update bucket index range /* if (j > i) { @@ -206,6 +208,7 @@ void SeqExtStepPage::draw_lockeditor() { }*/ ev_end += active_track.timing_buckets.get(i); for (; ev_idx != ev_end; ++ev_idx) { + if (active_track.event_count != event_count) { return false; } auto &ev = active_track.events[ev_idx]; if (!ev.is_lock || (ev.lock_idx != pianoroll_mode - 1)) { @@ -330,6 +333,7 @@ void SeqExtStepPage::draw_lockeditor() { oled_display.drawPixel(draw_x + fov_cur_x + 1, draw_y + fov_cur_y - 2, WHITE); oled_display.drawPixel(draw_x + fov_cur_x, draw_y + fov_cur_y - 1 - 2, WHITE); oled_display.drawPixel(draw_x + fov_cur_x, draw_y + fov_cur_y + 1 - 2, WHITE); + return true; } void SeqExtStepPage::draw_note(uint8_t x, uint8_t y, uint8_t w) { @@ -337,7 +341,7 @@ void SeqExtStepPage::draw_note(uint8_t x, uint8_t y, uint8_t w) { oled_display.fillRect(x + 1, y + 1, w - 2, fov_h / fov_notes - 2, BLACK); } -void SeqExtStepPage::draw_pianoroll() { +bool SeqExtStepPage::draw_pianoroll() { auto &active_track = mcl_seq.ext_tracks[last_ext_track]; uint8_t timing_mid = active_track.get_timing_mid(); @@ -353,11 +357,16 @@ void SeqExtStepPage::draw_pianoroll() { uint16_t ev_idx = 0, ev_end = 0; uint8_t h = fov_h / fov_notes; + + uint16_t event_count = active_track.event_count; + // MidiUartParent::handle_midi_lock = 1; for (int i = 0; i < active_track.length; i++) { // Update bucket index range - ev_end += active_track.timing_buckets.get(i); + uint8_t buckets = active_track.timing_buckets.get(i); + ev_end += buckets; for (; ev_idx != ev_end; ++ev_idx) { + if (active_track.event_count != event_count) { return false; } auto &ev = active_track.events[ev_idx]; int note_val = ev.event_value; // Check if note is note_on and is visible within fov vertical @@ -452,6 +461,8 @@ void SeqExtStepPage::draw_pianoroll() { } } } + + // MidiUartParent::handle_midi_lock = 0; // Draw interactive cursor uint8_t fov_cur_y = fov_h - ((cur_y - fov_y) * ((fov_h) / fov_notes)); int16_t fov_cur_x = (float)(cur_x - fov_offset) * fov_pixels_per_tick; @@ -466,6 +477,7 @@ void SeqExtStepPage::draw_pianoroll() { oled_display.fillRect(draw_x + fov_cur_x, draw_y + fov_cur_y, fov_cur_w, (fov_h / fov_notes), WHITE); } + return true; } void SeqExtStepPage::draw_viewport_minimap() { @@ -745,6 +757,7 @@ void SeqExtStepPage::loop() { void SeqExtStepPage::display() { #ifdef EXT_TRACKS + again: oled_display.clearDisplay(); auto &active_track = mcl_seq.ext_tracks[last_ext_track]; uint8_t timing_mid = active_track.get_timing_mid(); @@ -763,12 +776,12 @@ void SeqExtStepPage::display() { str[4] = 0; strcat(info1, str); strcpy(info2, "NOTE"); - draw_pianoroll(); + if (!draw_pianoroll()) { goto again; } } else { strcpy(info2, "LOCK "); mcl_gui.put_value_at(pianoroll_mode, info2 + 5); mcl_gui.put_value_at(lock_cur_y, info1); - draw_lockeditor(); + if (!draw_lockeditor()) { goto again; } } draw_seq_pos(); diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.h b/avr/cores/megacommand/MCL/SeqExtStepPage.h index 72bed3785..7706198d5 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.h +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.h @@ -63,8 +63,8 @@ class SeqExtStepPage : public SeqPage { void draw_thick_line(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t color = WHITE); void draw_note(uint8_t x, uint8_t y, uint8_t w); - void draw_pianoroll(); - void draw_lockeditor(); + bool draw_pianoroll(); + bool draw_lockeditor(); void draw_viewport_minimap(); void draw_seq_pos(); void draw_grid(); From c6cbe3084e7a4b1cf0aa7e3da2fe6dcb86822b76 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 23 Jul 2023 15:33:09 +1000 Subject: [PATCH 318/413] Revert "Abort draw if event_count changes due to live record" This reverts commit 061793eba8c39b362c81132a95a4c33ed87ed392. --- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 23 +++++--------------- avr/cores/megacommand/MCL/SeqExtStepPage.h | 4 ++-- 2 files changed, 7 insertions(+), 20 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index e55cc052c..31a54b6b5 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -180,7 +180,7 @@ void SeqExtStepPage::draw_thick_line(uint8_t x1, uint8_t y1, uint8_t x2, oled_display.drawLine(x1, y1 + 1, x2, y2 + 1, color); } -bool SeqExtStepPage::draw_lockeditor() { +void SeqExtStepPage::draw_lockeditor() { auto &active_track = mcl_seq.ext_tracks[last_ext_track]; uint8_t timing_mid = active_track.get_timing_mid(); @@ -195,8 +195,6 @@ bool SeqExtStepPage::draw_lockeditor() { uint16_t ev_idx = 0, ev_end = 0, ev_j_end; uint8_t j = 0; - uint16_t event_count = active_track.event_count; - for (uint8_t i = 0; i < active_track.length; i++) { // Update bucket index range /* if (j > i) { @@ -208,7 +206,6 @@ bool SeqExtStepPage::draw_lockeditor() { }*/ ev_end += active_track.timing_buckets.get(i); for (; ev_idx != ev_end; ++ev_idx) { - if (active_track.event_count != event_count) { return false; } auto &ev = active_track.events[ev_idx]; if (!ev.is_lock || (ev.lock_idx != pianoroll_mode - 1)) { @@ -333,7 +330,6 @@ bool SeqExtStepPage::draw_lockeditor() { oled_display.drawPixel(draw_x + fov_cur_x + 1, draw_y + fov_cur_y - 2, WHITE); oled_display.drawPixel(draw_x + fov_cur_x, draw_y + fov_cur_y - 1 - 2, WHITE); oled_display.drawPixel(draw_x + fov_cur_x, draw_y + fov_cur_y + 1 - 2, WHITE); - return true; } void SeqExtStepPage::draw_note(uint8_t x, uint8_t y, uint8_t w) { @@ -341,7 +337,7 @@ void SeqExtStepPage::draw_note(uint8_t x, uint8_t y, uint8_t w) { oled_display.fillRect(x + 1, y + 1, w - 2, fov_h / fov_notes - 2, BLACK); } -bool SeqExtStepPage::draw_pianoroll() { +void SeqExtStepPage::draw_pianoroll() { auto &active_track = mcl_seq.ext_tracks[last_ext_track]; uint8_t timing_mid = active_track.get_timing_mid(); @@ -357,16 +353,11 @@ bool SeqExtStepPage::draw_pianoroll() { uint16_t ev_idx = 0, ev_end = 0; uint8_t h = fov_h / fov_notes; - - uint16_t event_count = active_track.event_count; - // MidiUartParent::handle_midi_lock = 1; for (int i = 0; i < active_track.length; i++) { // Update bucket index range - uint8_t buckets = active_track.timing_buckets.get(i); - ev_end += buckets; + ev_end += active_track.timing_buckets.get(i); for (; ev_idx != ev_end; ++ev_idx) { - if (active_track.event_count != event_count) { return false; } auto &ev = active_track.events[ev_idx]; int note_val = ev.event_value; // Check if note is note_on and is visible within fov vertical @@ -461,8 +452,6 @@ bool SeqExtStepPage::draw_pianoroll() { } } } - - // MidiUartParent::handle_midi_lock = 0; // Draw interactive cursor uint8_t fov_cur_y = fov_h - ((cur_y - fov_y) * ((fov_h) / fov_notes)); int16_t fov_cur_x = (float)(cur_x - fov_offset) * fov_pixels_per_tick; @@ -477,7 +466,6 @@ bool SeqExtStepPage::draw_pianoroll() { oled_display.fillRect(draw_x + fov_cur_x, draw_y + fov_cur_y, fov_cur_w, (fov_h / fov_notes), WHITE); } - return true; } void SeqExtStepPage::draw_viewport_minimap() { @@ -757,7 +745,6 @@ void SeqExtStepPage::loop() { void SeqExtStepPage::display() { #ifdef EXT_TRACKS - again: oled_display.clearDisplay(); auto &active_track = mcl_seq.ext_tracks[last_ext_track]; uint8_t timing_mid = active_track.get_timing_mid(); @@ -776,12 +763,12 @@ void SeqExtStepPage::display() { str[4] = 0; strcat(info1, str); strcpy(info2, "NOTE"); - if (!draw_pianoroll()) { goto again; } + draw_pianoroll(); } else { strcpy(info2, "LOCK "); mcl_gui.put_value_at(pianoroll_mode, info2 + 5); mcl_gui.put_value_at(lock_cur_y, info1); - if (!draw_lockeditor()) { goto again; } + draw_lockeditor(); } draw_seq_pos(); diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.h b/avr/cores/megacommand/MCL/SeqExtStepPage.h index 7706198d5..72bed3785 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.h +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.h @@ -63,8 +63,8 @@ class SeqExtStepPage : public SeqPage { void draw_thick_line(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t color = WHITE); void draw_note(uint8_t x, uint8_t y, uint8_t w); - bool draw_pianoroll(); - bool draw_lockeditor(); + void draw_pianoroll(); + void draw_lockeditor(); void draw_viewport_minimap(); void draw_seq_pos(); void draw_grid(); From 056dc676c73f35654e386fca14f2b0f4f3581036 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 23 Jul 2023 16:05:51 +1000 Subject: [PATCH 319/413] mute mask rotate --- avr/cores/megacommand/MCL/MDSeqTrack.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.cpp b/avr/cores/megacommand/MCL/MDSeqTrack.cpp index f116790ba..0b3691f1b 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/MDSeqTrack.cpp @@ -858,6 +858,7 @@ void MDSeqTrack::modify_track(uint8_t dir) { memmove(timing, timing + 1, length - 1); steps[length - 1] = step_buf; timing[length - 1] = timing_buf; + ROTATE_LEFT(mute_mask, 1); break; } case DIR_RIGHT: { @@ -874,12 +875,14 @@ void MDSeqTrack::modify_track(uint8_t dir) { memmove(timing + 1, timing, length - 1); steps[0] = step_buf; timing[0] = timing_buf; + ROTATE_RIGHT(mute_mask,1); break; } case DIR_REVERSE: { uint8_t rev_locks[NUM_MD_LOCK_SLOTS]; memcpy(rev_locks, locks, sizeof(locks)); uint16_t l = 0, r = 0; + mute_mask = 0; //unimplemented // reverse steps & locks for (int i = 0; i <= length / 2; ++i) { int j = length - i - 1; @@ -898,6 +901,14 @@ void MDSeqTrack::modify_track(uint8_t dir) { timing_buf = timing[i]; timing[i] = timing[j]; timing[j] = timing_buf; + /* + bool a = IS_BIT_SET64(mute_mask, i); + bool b = IS_BIT_SET64(mute_mask, j); + if (a) { SET_BIT64(mute_mask, j); } + else { CLEAR_BIT64(mute_mask,j); } + if (b) { SET_BIT64(mute_mask, i); } + else { CLEAR_BIT64(mute_mask,i); } + */ } break; } From 925ff1f884cc8ce3181d931b3973c2d3c24b4a82 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 23 Jul 2023 22:04:24 +1000 Subject: [PATCH 320/413] let's disable this edge case for now --- avr/cores/megacommand/MCL/SeqTrack.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqTrack.cpp b/avr/cores/megacommand/MCL/SeqTrack.cpp index edb78b783..7ab30f411 100644 --- a/avr/cores/megacommand/MCL/SeqTrack.cpp +++ b/avr/cores/megacommand/MCL/SeqTrack.cpp @@ -135,13 +135,14 @@ uint8_t SeqTrackBase::get_quantized_step(uint8_t &utiming, uint8_t quant) { int8_t mod12 = mod12_counter - 1; - uint8_t step = step_count; + uint8_t step = step_count; +/* if ((step == 0) && (mod12 < 0)) { mod12 += timing_mid; step = length - 1; } - +*/ utiming = mod12 + timing_mid; if (quant) { From 4c5809d07ea931d52139e0707f1ac02c48f4e81a Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 23 Jul 2023 22:04:42 +1000 Subject: [PATCH 321/413] fix display regression wrap around notes --- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index 31a54b6b5..fc3e2f79c 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -396,7 +396,7 @@ void SeqExtStepPage::draw_pianoroll() { note_fov_end = (float)(note_end - fov_offset) * fov_pixels_per_tick; } //On screen notes to be no less than 2 pixels, regardless of zoom - if (note_fov_end - note_fov_start < 2) { note_fov_end = note_fov_start + 2; } + if (i < j && note_fov_end - note_fov_start < 2) { note_fov_end = note_fov_start + 2; } //if (note_fov_end <= note_fov_start) { note_fov_end = note_fov_start + 1; } uint8_t note_fov_y = fov_h - ((note_val - fov_y) * (fov_h / fov_notes)); // Draw vertical projection From d5c943b8760067a3a9b23eb1fe5f90800c330118 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 23 Jul 2023 22:04:59 +1000 Subject: [PATCH 322/413] fix bad quantization of end notes --- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index 80845369a..26df09928 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -449,14 +449,14 @@ void ExtSeqTrack::add_note(uint16_t cur_x, uint16_t cur_w, uint8_t cur_y, uint8_t end_step = ((cur_x + cur_w) / timing_mid); again: uint8_t end_utiming = timing_mid + (cur_x + cur_w) - (end_step * timing_mid); - DEBUG_DUMP(end_step); DEBUG_DUMP(end_utiming); if (end_step == step) { DEBUG_PRINTLN(F("ALERT start == end")); end_step = end_step + 1; - goto again; + if (mcl_cfg.rec_quant) { end_utiming = timing_mid; } + else { goto again; } } if (end_step >= length) { From cc1717b1937b6cae124ea1a72666526630476ac7 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 23 Jul 2023 22:21:24 +1000 Subject: [PATCH 323/413] Add epoch, for recording and comparing with renderer --- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 3 +++ avr/cores/megacommand/MCL/ExtSeqTrack.h | 1 + avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 5 ++++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index 26df09928..bcf9c080f 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -1,4 +1,5 @@ #include "MCL_impl.h" +static uint8_t ExtSeqTrack::epoch = 0; void ExtSeqTrack::set_speed(uint8_t _speed) { uint8_t old_speed = speed; @@ -85,6 +86,7 @@ void ExtSeqTrack::remove_event(uint16_t index) { if (step < step_count) { cur_event_idx--; } + epoch++; --event_count; } @@ -111,6 +113,7 @@ uint16_t ExtSeqTrack::add_event(uint8_t step, ext_event_t *e) { cur_event_idx++; } ++event_count; + epoch++; return idx; } diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.h b/avr/cores/megacommand/MCL/ExtSeqTrack.h index 71cdd01cf..8d2eb5517 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.h +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.h @@ -154,6 +154,7 @@ class ExtSeqTrack : public ExtSeqTrackData, public SeqSlideTrack { uint64_t ignore_notes[2]; bool pgm_oneshot; + static uint8_t epoch; NoteVector notes_on[NUM_NOTES_ON]; uint8_t notes_on_count; diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index fc3e2f79c..df07c7910 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -745,14 +745,16 @@ void SeqExtStepPage::loop() { void SeqExtStepPage::display() { #ifdef EXT_TRACKS - oled_display.clearDisplay(); auto &active_track = mcl_seq.ext_tracks[last_ext_track]; uint8_t timing_mid = active_track.get_timing_mid(); + begin: + oled_display.clearDisplay(); draw_viewport_minimap(); draw_grid(); mcl_gui.put_value_at(cur_x/timing_mid + 1,info1); + uint8_t epoch = active_track.epoch; if (pianoroll_mode == 0) { MusicalNotes number_to_note; uint8_t oct = cur_y / 12; @@ -770,6 +772,7 @@ void SeqExtStepPage::display() { mcl_gui.put_value_at(lock_cur_y, info1); draw_lockeditor(); } + if (epoch != active_track.epoch) { goto begin; } draw_seq_pos(); SeqPage::display(); From 498291254f2305f151c0864edcff19ccbe4dc341 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 23 Jul 2023 22:24:29 +1000 Subject: [PATCH 324/413] minor --- avr/cores/megacommand/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/main.cpp b/avr/cores/megacommand/main.cpp index 29493c375..83b7fb13c 100644 --- a/avr/cores/megacommand/main.cpp +++ b/avr/cores/megacommand/main.cpp @@ -211,10 +211,10 @@ ALWAYS_INLINE() void gui_poll() { static bool inGui = false; if (inGui) { return; - } else { - inGui = true; } + inGui = true; + uint16_t sr = SR165.read16(); if (sr != oldsr) { Buttons.clear(); From fb3d4e1149780e8c0d1878f8ef2d4a9968fec1cc Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 23 Jul 2023 22:32:33 +1000 Subject: [PATCH 325/413] Epoch make static --- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 2 +- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index bcf9c080f..21728e538 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -1,5 +1,5 @@ #include "MCL_impl.h" -static uint8_t ExtSeqTrack::epoch = 0; +uint8_t ExtSeqTrack::epoch = 0; void ExtSeqTrack::set_speed(uint8_t _speed) { uint8_t old_speed = speed; diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index df07c7910..72bd421d4 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -747,14 +747,13 @@ void SeqExtStepPage::display() { #ifdef EXT_TRACKS auto &active_track = mcl_seq.ext_tracks[last_ext_track]; uint8_t timing_mid = active_track.get_timing_mid(); - - begin: + uint8_t epoch = 0; + do { oled_display.clearDisplay(); draw_viewport_minimap(); draw_grid(); - mcl_gui.put_value_at(cur_x/timing_mid + 1,info1); - uint8_t epoch = active_track.epoch; + epoch = active_track.epoch; if (pianoroll_mode == 0) { MusicalNotes number_to_note; uint8_t oct = cur_y / 12; @@ -772,7 +771,7 @@ void SeqExtStepPage::display() { mcl_gui.put_value_at(lock_cur_y, info1); draw_lockeditor(); } - if (epoch != active_track.epoch) { goto begin; } + } while (epoch != ExtSeqTrack::epoch); draw_seq_pos(); SeqPage::display(); From 8f84220674e130fcaf2be7319092feee33fd0910 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 23 Jul 2023 22:50:31 +1000 Subject: [PATCH 326/413] space --- avr/cores/megacommand/MCL/MCLGUI.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCLGUI.cpp b/avr/cores/megacommand/MCL/MCLGUI.cpp index 884b1f79d..c63589ad3 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.cpp +++ b/avr/cores/megacommand/MCL/MCLGUI.cpp @@ -104,8 +104,13 @@ void MCLGUI::draw_vertical_separator(uint8_t x) { void MCLGUI::draw_vertical_scrollbar(uint8_t x, uint8_t n_items, uint8_t n_window, uint8_t n_current) { - uint8_t length = round(((float)(n_window - 1) / (float)(n_items - 1)) * 32); - uint8_t y = round(((float)(n_current) / (float)(n_items - 1)) * 32); + //uint8_t length = round(((float)(n_window - 1) / (float)(n_items - 1)) * 32); + //uint8_t y = round(((float)(n_current) / (float)(n_items - 1)) * 32); + + uint8_t length = 1 + ((uint16_t) (n_window - 1) * 32) / (n_items - 1); + uint8_t y = (((uint16_t) n_current * 32) / (n_items - 1)); + if (y + length > 32) { length--; } + mcl_gui.draw_vertical_separator(x + 1); oled_display.fillRect(x + 1, y + 1, 3, length - 2, BLACK); oled_display.drawRect(x, y, 5, length, WHITE); From 5259774f9281715576d05696082e57c58f369ea5 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 23 Jul 2023 22:57:14 +1000 Subject: [PATCH 327/413] minor --- avr/cores/megacommand/MCL/MCLActions.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCLActions.cpp b/avr/cores/megacommand/MCL/MCLActions.cpp index 7c6bd85ae..df85ee5dc 100644 --- a/avr/cores/megacommand/MCL/MCLActions.cpp +++ b/avr/cores/megacommand/MCL/MCLActions.cpp @@ -692,7 +692,7 @@ void MCLActions::cache_next_tracks(uint8_t *slot_select_array, // float div192th_time = 1.25 / tempo; // diff * div19th_time > 80ms equivalent to diff > (0.08/1.25) * tempo - float ms = (0.80 / 1.25) * tempo; + //float ms = (0.08 * 0.80) * tempo == 0.064 * tempo; for (uint8_t n = 0; n < NUM_SLOTS; n++) { @@ -712,7 +712,7 @@ void MCLActions::cache_next_tracks(uint8_t *slot_select_array, while ((gdt->seq_track->count_down && (MidiClock.state == 2))) { proj.select_grid(old_grid); handleIncomingMidi(); - if (((float)diff > 0.08 * 0.8 * tempo) && gui_update) { + if (((float)diff > 0.064 * tempo) && gui_update) { GUI.loop(); } } From 9b30f0216682df482045ef7bb4c595c18d3f19c3 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 23 Jul 2023 23:16:52 +1000 Subject: [PATCH 328/413] Space optim, trig condition consolidate --- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 72 ++--------------------- avr/cores/megacommand/MCL/MDSeqTrack.cpp | 72 ++--------------------- avr/cores/megacommand/MCL/SeqTrack.cpp | 72 +++++++++++++++++++++++ avr/cores/megacommand/MCL/SeqTrack.h | 1 + 4 files changed, 84 insertions(+), 133 deletions(-) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index 21728e538..1621121d4 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -740,78 +740,18 @@ void ExtSeqTrack::noteon_conditional(uint8_t condition, uint8_t note, if (condition > 64) { condition -= 64; } - bool send_note = false; - switch (condition) { - case 0: - case 1: - send_note = true; - break; - case 2: - if (!IS_BIT_SET(iterations_8, 0)) { - send_note = true; - } - break; - case 3: - if ((iterations_6 == 3) || (iterations_6 == 6)) { - send_note = true; - } - break; - case 6: - if (iterations_6 == 6) { - send_note = true; - } - break; - case 4: - if ((iterations_8 == 4) || (iterations_8 == 8)) { - send_note = true; - } - break; - case 8: - if (iterations_8 == 8) { - send_note = true; - } - case 5: - if (iterations_5 == 5) { - send_note = true; - } - break; - case 7: - if (iterations_7 == 7) { - send_note = true; - } - break; - case 9: - if (get_random_byte() <= 13) { - send_note = true; - } - break; - case 10: - if (get_random_byte() <= 32) { - send_note = true; - } - break; - case 11: - if (get_random_byte() <= 64) { - send_note = true; - } - break; - case 12: - if (get_random_byte() <= 96) { - send_note = true; - } - break; - case 13: - if (get_random_byte() <= 115) { - send_note = true; - } - break; - case 14: + bool send_note = false; + if (condition == 14) { if (!IS_BIT_SET128_P(oneshot_mask, step_count)) { SET_BIT128_P(oneshot_mask, step_count); send_note = true; } } + else { + send_note = SeqTrack::conditional(condition); + } + if (send_note) { note_on(note, velocity); } } diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.cpp b/avr/cores/megacommand/MCL/MDSeqTrack.cpp index 0b3691f1b..57124d14e 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/MDSeqTrack.cpp @@ -429,78 +429,16 @@ uint8_t MDSeqTrack::trig_conditional(uint8_t condition) { if (IS_BIT_SET64(oneshot_mask, step_count) || IS_BIT_SET64(mute_mask, step_count)) { return TRIG_ONESHOT; } - switch (condition) { - case 0: - case 1: - send_trig = TRIG_TRUE; - break; - case 2: - if (!IS_BIT_SET(iterations_8, 0)) { - send_trig = TRIG_TRUE; - } - break; - case 3: - if ((iterations_6 == 3) || (iterations_6 == 6)) { - send_trig = TRIG_TRUE; - } - break; - case 6: - if (iterations_6 == 6) { - send_trig = TRIG_TRUE; - } - break; - case 4: - if ((iterations_8 == 4) || (iterations_8 == 8)) { - send_trig = TRIG_TRUE; - } - break; - case 8: - if ((iterations_8 == 8)) { - send_trig = TRIG_TRUE; - } - break; - case 5: - if (iterations_5 == 5) { - send_trig = TRIG_TRUE; - } - break; - case 7: - if (iterations_7 == 7) { - send_trig = TRIG_TRUE; - } - break; - case 9: - if (get_random_byte() <= 13) { - send_trig = TRIG_TRUE; - } - break; - case 10: - if (get_random_byte() <= 32) { - send_trig = TRIG_TRUE; - } - break; - case 11: - if (get_random_byte() <= 64) { - send_trig = TRIG_TRUE; - } - break; - case 12: - if (get_random_byte() <= 96) { - send_trig = TRIG_TRUE; - } - break; - case 13: - if (get_random_byte() <= 115) { - send_trig = TRIG_TRUE; - } - break; - case 14: + if (condition == 14) { if (!IS_BIT_SET64(oneshot_mask, step_count)) { SET_BIT64(oneshot_mask, step_count); send_trig = TRIG_TRUE; } } - return send_trig; + else { + send_trig = SeqTrack::conditional(condition); + } + return send_trig; } uint8_t MDSeqTrack::get_track_lock_implicit(uint8_t step, uint8_t param) { diff --git a/avr/cores/megacommand/MCL/SeqTrack.cpp b/avr/cores/megacommand/MCL/SeqTrack.cpp index 7ab30f411..a18ab2c79 100644 --- a/avr/cores/megacommand/MCL/SeqTrack.cpp +++ b/avr/cores/megacommand/MCL/SeqTrack.cpp @@ -157,3 +157,75 @@ uint8_t SeqTrackBase::get_quantized_step(uint8_t &utiming, uint8_t quant) { return step; } +bool SeqTrack::conditional(uint8_t condition) { + bool send_note = false; + uint8_t random_byte = 0; + if (condition >= 9) { random_byte = get_random(100); } + + switch (condition) { + case 0: + case 1: + send_note = true; + break; + case 2: + if (!IS_BIT_SET(iterations_8, 0)) { + send_note = true; + } + break; + case 3: + if ((iterations_6 == 3) || (iterations_6 == 6)) { + send_note = true; + } + break; + case 6: + if (iterations_6 == 6) { + send_note = true; + } + break; + case 4: + if ((iterations_8 == 4) || (iterations_8 == 8)) { + send_note = true; + } + break; + case 8: + if (iterations_8 == 8) { + send_note = true; + } + case 5: + if (iterations_5 == 5) { + send_note = true; + } + break; + case 7: + if (iterations_7 == 7) { + send_note = true; + } + break; + case 9: + if (random_byte <= 10) { + send_note = true; + } + break; + case 10: + if (random_byte <= 25) { + send_note = true; + } + break; + case 11: + if (random_byte <= 50) { + send_note = true; + } + break; + case 12: + if (random_byte <= 75) { + send_note = true; + } + break; + case 13: + if (random_byte <= 90) { + send_note = true; + } + break; + } + return send_note; +} diff --git a/avr/cores/megacommand/MCL/SeqTrack.h b/avr/cores/megacommand/MCL/SeqTrack.h index 375119720..b86d589f4 100644 --- a/avr/cores/megacommand/MCL/SeqTrack.h +++ b/avr/cores/megacommand/MCL/SeqTrack.h @@ -294,6 +294,7 @@ class SeqTrack : public SeqTrackBase { step_count++; } } + bool conditional(uint8_t condition); }; class SeqSlideTrack : public SeqTrack { From e41fd052ec4675b3fa432f207331f2197d5274e6 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 24 Jul 2023 10:48:49 +1000 Subject: [PATCH 329/413] Performance regression in conditional code --- avr/cores/megacommand/MCL/SeqTrack.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqTrack.cpp b/avr/cores/megacommand/MCL/SeqTrack.cpp index a18ab2c79..2ac30a0be 100644 --- a/avr/cores/megacommand/MCL/SeqTrack.cpp +++ b/avr/cores/megacommand/MCL/SeqTrack.cpp @@ -160,7 +160,7 @@ uint8_t SeqTrackBase::get_quantized_step(uint8_t &utiming, uint8_t quant) { bool SeqTrack::conditional(uint8_t condition) { bool send_note = false; uint8_t random_byte = 0; - if (condition >= 9) { random_byte = get_random(100); } + if (condition >= 9) { random_byte = get_random_byte(); } switch (condition) { case 0: @@ -202,27 +202,27 @@ bool SeqTrack::conditional(uint8_t condition) { } break; case 9: - if (random_byte <= 10) { + if (random_byte <= 13) { send_note = true; } break; case 10: - if (random_byte <= 25) { + if (random_byte <= 32) { send_note = true; } break; case 11: - if (random_byte <= 50) { + if (random_byte <= 64) { send_note = true; } break; case 12: - if (random_byte <= 75) { + if (random_byte <= 96) { send_note = true; } break; case 13: - if (random_byte <= 90) { + if (random_byte <= 115) { send_note = true; } break; From 63321ca5af655cfe0fdbcb8728c4dc078c771315 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 24 Jul 2023 10:52:19 +1000 Subject: [PATCH 330/413] Fix regression in manual note editing being quanitzed --- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 6 +++--- avr/cores/megacommand/MCL/ExtSeqTrack.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index 1621121d4..5a01bac8f 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -439,7 +439,7 @@ void ExtSeqTrack::remove_notes_on(uint8_t value) { } void ExtSeqTrack::add_note(uint16_t cur_x, uint16_t cur_w, uint8_t cur_y, - uint8_t velocity, uint8_t cond) { + uint8_t velocity, uint8_t cond, uint8_t quant) { uint8_t timing_mid = get_timing_mid(); @@ -458,7 +458,7 @@ void ExtSeqTrack::add_note(uint16_t cur_x, uint16_t cur_w, uint8_t cur_y, if (end_step == step) { DEBUG_PRINTLN(F("ALERT start == end")); end_step = end_step + 1; - if (mcl_cfg.rec_quant) { end_utiming = timing_mid; } + if (quant) { end_utiming = timing_mid; } else { goto again; } } @@ -1042,7 +1042,7 @@ void ExtSeqTrack::record_track_noteoff(uint8_t note_num) { uint16_t w = end_x - start_x; del_note(start_x, w, note_num); - add_note(start_x, w, note_num, notes_on[n].velocity); + add_note(start_x, w, note_num, notes_on[n].velocity, mcl_cfg.rec_quant); } notes_on[n].value = 255; diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.h b/avr/cores/megacommand/MCL/ExtSeqTrack.h index 8d2eb5517..85efd681e 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.h +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.h @@ -231,7 +231,7 @@ class ExtSeqTrack : public ExtSeqTrackData, public SeqSlideTrack { bool del_note(uint16_t cur_x, uint16_t cur_w = 0, uint8_t cur_y = 0); void add_note(uint16_t cur_x, uint16_t cur_w, uint8_t cur_y, uint8_t velocity, - uint8_t cond = 0); + uint8_t cond = 0, uint8_t quant = 0); // find midi note within the given step. // returns: note index & step start index. From 311c324642acd0099ebe6ef2e42fb7c403e5ff53 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 24 Jul 2023 11:22:16 +1000 Subject: [PATCH 331/413] Record automation option --- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 2 +- avr/cores/megacommand/MCL/MCLMenus.cpp | 4 +++- avr/cores/megacommand/MCL/MCLMenus.h | 2 +- avr/cores/megacommand/MCL/MCLSysConfig.cpp | 2 +- avr/cores/megacommand/MCL/MCLSysConfig.h | 2 +- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 1 + avr/cores/megacommand/MCL/SeqPage.cpp | 1 + avr/cores/megacommand/MCL/SeqPages.h | 3 ++- resource/menu_layouts.cpp | 1 + 9 files changed, 12 insertions(+), 6 deletions(-) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index 5a01bac8f..66270b39b 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -810,7 +810,7 @@ uint8_t ExtSeqTrack::find_lock_idx(uint8_t param_id) { void ExtSeqTrack::record_track_locks(uint8_t track_param, uint8_t value, bool slide) { - if (step_count >= length) { + if (!mcl_cfg.rec_automation || step_count >= length) { return; } diff --git a/avr/cores/megacommand/MCL/MCLMenus.cpp b/avr/cores/megacommand/MCL/MCLMenus.cpp index 5a69d9e2f..f998738a0 100644 --- a/avr/cores/megacommand/MCL/MCLMenus.cpp +++ b/avr/cores/megacommand/MCL/MCLMenus.cpp @@ -98,7 +98,9 @@ const uint8_t *const menu_target_param[] PROGMEM = { // 58 &perf_page.page_mode, // 59 - &perf_page.perf_id + &perf_page.perf_id, + // 60 + &mcl_cfg.rec_automation, }; const menu_function_t menu_target_functions[] PROGMEM = { diff --git a/avr/cores/megacommand/MCL/MCLMenus.h b/avr/cores/megacommand/MCL/MCLMenus.h index 27d28a031..116e029eb 100644 --- a/avr/cores/megacommand/MCL/MCLMenus.h +++ b/avr/cores/megacommand/MCL/MCLMenus.h @@ -91,7 +91,7 @@ extern MenuPage file_menu_page; extern MCLEncoder seq_menu_value_encoder; extern MCLEncoder seq_menu_entry_encoder; -constexpr size_t seq_menu_page_N = 23; +constexpr size_t seq_menu_page_N = 24; extern MenuPage seq_menu_page; extern MCLEncoder step_menu_value_encoder; diff --git a/avr/cores/megacommand/MCL/MCLSysConfig.cpp b/avr/cores/megacommand/MCL/MCLSysConfig.cpp index 873c01e6c..e915906fa 100644 --- a/avr/cores/megacommand/MCL/MCLSysConfig.cpp +++ b/avr/cores/megacommand/MCL/MCLSysConfig.cpp @@ -134,7 +134,7 @@ bool MCLSysConfig::cfg_init() { midi_forward_2 = 0; midi_forward_usb = 0; - auto_save = 1; + rec_automation = 1; auto_normalize = 1; load_mode = LOAD_MANUAL; chain_queue_length = 1; diff --git a/avr/cores/megacommand/MCL/MCLSysConfig.h b/avr/cores/megacommand/MCL/MCLSysConfig.h index cf7d18b13..3c785099f 100644 --- a/avr/cores/megacommand/MCL/MCLSysConfig.h +++ b/avr/cores/megacommand/MCL/MCLSysConfig.h @@ -48,7 +48,7 @@ class MCLSysConfigData { uint8_t midi_forward_2; uint8_t midi_forward_usb; - uint8_t auto_save; + uint8_t rec_automation; uint8_t load_mode; uint8_t chain_queue_length; uint8_t chain_load_quant; diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index 72bd421d4..f4471fb0d 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -620,6 +620,7 @@ void SeqExtStepPage::config_menu_entries() { seq_menu_page.menu.enable_entry(SEQ_MENU_TRACK, true); seq_menu_page.menu.enable_entry(SEQ_MENU_CHANNEL, true); seq_menu_page.menu.enable_entry(SEQ_MENU_LENGTH_EXT, true); + seq_menu_page.menu.enable_entry(SEQ_MENU_AUTOMATION, true); if (pianoroll_mode == 0) { seq_menu_page.menu.enable_entry(SEQ_MENU_ARP, true); diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index cd5be45f1..1f2f45277 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -121,6 +121,7 @@ void SeqPage::init() { seq_menu_page.menu.enable_entry(SEQ_MENU_SLIDE, false); seq_menu_page.menu.enable_entry(SEQ_MENU_POLY, false); seq_menu_page.menu.enable_entry(SEQ_MENU_SOUND, false); + seq_menu_page.menu.enable_entry(SEQ_MENU_AUTOMATION, false); seq_menu_page.menu.enable_entry(SEQ_MENU_LENGTH_MD, false); seq_menu_page.menu.enable_entry(SEQ_MENU_LENGTH_EXT, false); diff --git a/avr/cores/megacommand/MCL/SeqPages.h b/avr/cores/megacommand/MCL/SeqPages.h index e33477cfc..35f5e5e1d 100644 --- a/avr/cores/megacommand/MCL/SeqPages.h +++ b/avr/cores/megacommand/MCL/SeqPages.h @@ -35,7 +35,8 @@ #define SEQ_MENU_REVERSE 19 #define SEQ_MENU_POLY 20 #define SEQ_MENU_QUANT 21 -#define SEQ_MENU_SOUND 22 +#define SEQ_MENU_AUTOMATION 22 +#define SEQ_MENU_SOUND 23 extern MCLEncoder seq_param1; extern MCLEncoder seq_param2; diff --git a/resource/menu_layouts.cpp b/resource/menu_layouts.cpp index b4ba42b2b..7bf482f8c 100644 --- a/resource/menu_layouts.cpp +++ b/resource/menu_layouts.cpp @@ -211,6 +211,7 @@ menu_t seq_menu_layout = { {"REVERSE:", 0, 3, 3, 29, NULL_PAGE, 13, 27}, {"POLYPHONY", 0, 0, 0, 0, POLY_PAGE, 0, 0}, {"QUANT:", 0, 2, 2, 42, NULL_PAGE, 0, 25}, + {"CC REC:", 0, 2, 2, 60, NULL_PAGE, 0, 25}, {"SOUND", 0, 0, 0, 0, SOUND_BROWSER, 0, 0}, }, 14 From 782d141a83caae6568f59f5246614a7e90726790 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 24 Jul 2023 12:03:22 +1000 Subject: [PATCH 332/413] Remove step menu --- avr/cores/megacommand/MCL/MCLMenus.cpp | 18 +- avr/cores/megacommand/MCL/MCLMenus.h | 6 - avr/cores/megacommand/MCL/SeqPage.cpp | 37 +- avr/cores/megacommand/MCL/SeqPage.h | 2 - avr/cores/megacommand/MCL/SeqStepPage.cpp | 6 +- avr/cores/megacommand/ResourceManager.cpp | 1 - avr/cores/megacommand/resources/R.h | 14 +- .../megacommand/resources/R_menu_layouts.cpp | 600 +++++++++--------- resource/menu_layouts.cpp | 14 +- 9 files changed, 302 insertions(+), 396 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCLMenus.cpp b/avr/cores/megacommand/MCL/MCLMenus.cpp index f998738a0..442cf6b83 100644 --- a/avr/cores/megacommand/MCL/MCLMenus.cpp +++ b/avr/cores/megacommand/MCL/MCLMenus.cpp @@ -54,7 +54,7 @@ const uint8_t *const menu_target_param[] PROGMEM = { &opt_copy, &opt_clear, &opt_paste, &opt_shift, &opt_reverse, // 30 - &opt_clear_step, + &mcl_cfg.rec_automation, // 31 &grid_page.grid_select_apply, &mcl_cfg.load_mode, &slot.link.loops, @@ -99,8 +99,6 @@ const uint8_t *const menu_target_param[] PROGMEM = { &perf_page.page_mode, // 59 &perf_page.perf_id, - // 60 - &mcl_cfg.rec_automation, }; const menu_function_t menu_target_functions[] PROGMEM = { @@ -124,12 +122,12 @@ const menu_function_t menu_target_functions[] PROGMEM = { // 14 seq_menu_handler, // 15 - opt_clear_step_locks_handler, - opt_copy_step_handler_cb, - opt_paste_step_handler, - opt_mute_step_handler, + nullptr, + nullptr, + nullptr, + nullptr, // 19 - step_menu_handler, + nullptr, // 20 rename_row, // 21 @@ -192,10 +190,6 @@ MCLEncoder seq_menu_entry_encoder(0, 9, ENCODER_RES_PAT); MenuPage seq_menu_page(&seq_menu_value_encoder, &seq_menu_entry_encoder); MenuPage perf_menu_page(&seq_menu_value_encoder, &seq_menu_entry_encoder); -MCLEncoder step_menu_value_encoder(0, 16, ENCODER_RES_PAT); -MCLEncoder step_menu_entry_encoder(0, 9, ENCODER_RES_PAT); -MenuPage step_menu_page(&step_menu_value_encoder, &step_menu_entry_encoder); - MCLEncoder grid_slot_param1(0, 7, ENCODER_RES_PAT); MCLEncoder grid_slot_param2(0, 16, ENCODER_RES_PAT); MenuPage grid_slot_page(&grid_slot_param1, &grid_slot_param2); diff --git a/avr/cores/megacommand/MCL/MCLMenus.h b/avr/cores/megacommand/MCL/MCLMenus.h index 116e029eb..4bbbdb0cf 100644 --- a/avr/cores/megacommand/MCL/MCLMenus.h +++ b/avr/cores/megacommand/MCL/MCLMenus.h @@ -94,12 +94,6 @@ extern MCLEncoder seq_menu_entry_encoder; constexpr size_t seq_menu_page_N = 24; extern MenuPage seq_menu_page; -extern MCLEncoder step_menu_value_encoder; -extern MCLEncoder step_menu_entry_encoder; - -constexpr size_t step_menu_page_N = 4; -extern MenuPage step_menu_page; - extern MCLEncoder grid_slot_param1; extern MCLEncoder grid_slot_param2; diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index 1f2f45277..8432bd3c1 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -23,7 +23,6 @@ uint8_t SeqPage::slide = true; uint8_t SeqPage::md_micro = false; bool SeqPage::show_seq_menu = false; -bool SeqPage::show_step_menu = false; bool SeqPage::toggle_device = true; uint16_t SeqPage::mute_mask = 0; @@ -365,23 +364,7 @@ bool SeqPage::handleEvent(gui_event_t *event) { if (EVENT_PRESSED(event, Buttons.BUTTON3)) { // If MD trig is held and BUTTON3 is pressed, launch note menu - if ((note_interface.notes_count_on() != 0) && (!show_step_menu) && - (mcl.currentPage() != SEQ_PTC_PAGE)) { - uint8_t note = 255; - note = note_interface.get_first_md_note(); - if (note == 255) { - return false; - } - step_select = note; - - opt_param1_capture = (MCLEncoder *)encoders[0]; - opt_param2_capture = (MCLEncoder *)encoders[1]; - encoders[0] = &step_menu_value_encoder; - encoders[1] = &step_menu_entry_encoder; - step_menu_page.init(); - show_step_menu = true; - return true; - } else if (!show_seq_menu) { + if (!show_seq_menu) { show_seq_menu = true; if (midi_device == &MD) { @@ -422,14 +405,10 @@ bool SeqPage::handleEvent(gui_event_t *event) { opt_length_handler(); opt_channel_handler(); } - } else if (show_step_menu) { - row_func = - step_menu_page.menu.get_row_function(step_menu_page.encoders[1]->cur); } if (row_func != NULL) { row_func(); show_seq_menu = false; - show_step_menu = false; init(); return true; } @@ -437,13 +416,8 @@ bool SeqPage::handleEvent(gui_event_t *event) { show_seq_menu = false; return true; } - if (show_step_menu && step_menu_page.enter()) { - show_step_menu = false; - return true; - } show_seq_menu = false; - show_step_menu = false; init_encoders_used_clock(); init(); return true; @@ -1204,8 +1178,6 @@ void opt_reverse_track_handler() { void seq_menu_handler() { } -void step_menu_handler() { -} void SeqPage::config_as_trackedit() { @@ -1246,8 +1218,6 @@ void SeqPage::loop() { seq_menu_value_encoder.cur = opt_trackid; } return; - } else if (show_step_menu) { - step_menu_page.loop(); } } @@ -1329,13 +1299,10 @@ void SeqPage::display() { // draw info lines mcl_gui.draw_panel_labels(info1, info2); - if (show_seq_menu || show_step_menu) { + if (show_seq_menu) { constexpr uint8_t width = 52; oled_display.setFont(&TomThumb); oled_display.fillRect(128 - width - 2, 0, width + 2, 32, BLACK); - if (show_step_menu) { - step_menu_page.draw_menu(128 - width, 8, width); - } if (show_seq_menu) { seq_menu_page.draw_menu(128 - width, 8, width); } diff --git a/avr/cores/megacommand/MCL/SeqPage.h b/avr/cores/megacommand/MCL/SeqPage.h index fad5896e7..423dcf87b 100644 --- a/avr/cores/megacommand/MCL/SeqPage.h +++ b/avr/cores/megacommand/MCL/SeqPage.h @@ -63,7 +63,6 @@ extern void opt_paste_page_handler(); extern void opt_clear_step_handler(); extern void seq_menu_handler(); -extern void step_menu_handler(); class MidiDevice; @@ -91,7 +90,6 @@ class SeqPage : public LightPage { static MidiDevice* midi_device; static bool show_seq_menu; - static bool show_step_menu; static bool toggle_device; static uint8_t last_midi_state; diff --git a/avr/cores/megacommand/MCL/SeqStepPage.cpp b/avr/cores/megacommand/MCL/SeqStepPage.cpp index c1ea6d241..a9d7525cf 100644 --- a/avr/cores/megacommand/MCL/SeqStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqStepPage.cpp @@ -36,7 +36,7 @@ void SeqStepPage::config() { } void SeqStepPage::config_encoders() { - if (show_seq_menu || show_step_menu) { + if (show_seq_menu) { return; } uint8_t timing_mid = mcl_seq.md_tracks[last_md_track].get_timing_mid(); @@ -152,7 +152,7 @@ void SeqStepPage::display() { if (mcl_gui.show_encoder_value(&seq_param4) && (seq_param4.cur > 0) && (note_interface.notes_count_on() > 0) && (!show_seq_menu) && - (!show_step_menu) && (tuning != NULL) && !(recording)) { + (tuning != NULL) && !(recording)) { uint64_t note_mask[2] = {}; uint8_t note = seq_param4.cur; // + tuning->base; SET_BIT64(note_mask, note); @@ -172,7 +172,7 @@ void SeqStepPage::display() { SeqPage::display(); if (mcl_gui.show_encoder_value(&seq_param2) && (note_interface.notes_count_on() > 0) && (!show_seq_menu) && - (!show_step_menu) && (!recording)) { + (!recording)) { mcl_gui.draw_microtiming(mcl_seq.md_tracks[last_md_track].speed, seq_param2.cur); diff --git a/avr/cores/megacommand/ResourceManager.cpp b/avr/cores/megacommand/ResourceManager.cpp index d60a5bc67..cb7c1ad08 100644 --- a/avr/cores/megacommand/ResourceManager.cpp +++ b/avr/cores/megacommand/ResourceManager.cpp @@ -94,7 +94,6 @@ void ResourceManager::restore_menu_layout_deps() { ram_config_page.set_layout(R.menu_layouts->rampage1_menu_layout); file_menu_page.set_layout(R.menu_layouts->file_menu_layout); seq_menu_page.set_layout(R.menu_layouts->seq_menu_layout); - step_menu_page.set_layout(R.menu_layouts->step_menu_layout); grid_slot_page.set_layout(R.menu_layouts->slot_menu_layout); wavdesign_menu_page.set_layout(R.menu_layouts->wavdesign_menu_layout); md_import_page.set_layout(R.menu_layouts->mdimport_menu_layout); diff --git a/avr/cores/megacommand/resources/R.h b/avr/cores/megacommand/resources/R.h index 88a9b842b..7499c5869 100644 --- a/avr/cores/megacommand/resources/R.h +++ b/avr/cores/megacommand/resources/R.h @@ -356,18 +356,12 @@ struct __T_menu_layouts { }; static constexpr size_t countof_slot_menu_layout = 221 / sizeof(menu_t); static constexpr size_t sizeofof_slot_menu_layout = 221; - union { - menu_t step_menu_layout[0]; - char zz__step_menu_layout[95]; - }; - static constexpr size_t countof_step_menu_layout = 95 / sizeof(menu_t); - static constexpr size_t sizeofof_step_menu_layout = 95; union { menu_t seq_menu_layout[0]; - char zz__seq_menu_layout[494]; + char zz__seq_menu_layout[515]; }; - static constexpr size_t countof_seq_menu_layout = 494 / sizeof(menu_t); - static constexpr size_t sizeofof_seq_menu_layout = 494; + static constexpr size_t countof_seq_menu_layout = 515 / sizeof(menu_t); + static constexpr size_t sizeofof_seq_menu_layout = 515; union { menu_t file_menu_layout[0]; char zz__file_menu_layout[158]; @@ -458,7 +452,7 @@ struct __T_menu_layouts { }; static constexpr size_t countof_boot_menu_layout = 95 / sizeof(menu_t); static constexpr size_t sizeofof_boot_menu_layout = 95; - static constexpr size_t __total_size = 2215; + static constexpr size_t __total_size = 2141; }; extern const unsigned char __R_menu_options[] PROGMEM; diff --git a/avr/cores/megacommand/resources/R_menu_layouts.cpp b/avr/cores/megacommand/resources/R_menu_layouts.cpp index c3ca53ee8..11c21d72f 100644 --- a/avr/cores/megacommand/resources/R_menu_layouts.cpp +++ b/avr/cores/megacommand/resources/R_menu_layouts.cpp @@ -189,81 +189,43 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 38, 3, 20, - 219, + 194, 0, 21, - 40, - 80, - 8, - 91, - 44, - 94, - 167, - 30, - 255, - 207, - 15, - 30, - 32, - 117, 76, - 80, - 151, - 52, - 16, - 177, - 0, - 94, - 97, - 21, - 63, - 255, - 17, - 0, - 77, - 85, - 107, - 19, - 41, - 33, - 225, - 18, - 0, - 19, - 171, - 108, + 216, 81, 13, - 16, - 216, - 91, + 46, + 252, + 194, 67, 75, - 73, - 187, - 183, + 92, + 79, 1, - 48, + 17, + 0, + 246, 14, 255, - 194, 3, 0, - 57, + 218, 246, 86, 73, 67, - 169, + 74, 79, 1, 3, 2, 184, 50, - 231, + 136, 37, - 175, + 80, 62, 15, 255, @@ -282,7 +244,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 67, 58, 129, - 207, + 112, 246, 133, 5, @@ -293,8 +255,8 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 83, 76, 172, - 164, - 252, + 69, + 157, 38, 18, 219, @@ -311,569 +273,579 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 194, 84, 79, - 220, - 24, - 110, - 50, + 125, + 27, + 211, + 187, 75, 69, 89, - 192, 63, - 251, + 3, + 237, 12, 12, 19, 41, - 113, + 194, 104, 86, - 136, - 93, - 75, - 122, - 10, - 203, - 24, - 143, - 46, + 254, + 33, + 27, + 44, + 40, + 108, + 96, + 48, + 184, 6, 78, 68, - 16, - 227, - 30, + 64, + 132, + 123, 15, 15, 21, - 221, 20, + 118, 60, 83, - 182, 82, + 216, 69, 21, - 3, + 15, 7, - 248, 7, 22, + 225, 255, 5, 41, - 111, - 227, + 132, + 188, 71, 84, 72, 58, - 9, - 248, - 126, + 37, + 153, + 251, 23, 255, 6, 0, - 194, 20, - 242, + 11, + 200, 2, 129, - 56, + 227, 67, 72, - 219, + 13, 108, 78, 108, - 36, - 55, + 144, + 222, 16, 24, 255, 7, - 132, 0, - 206, - 135, + 18, + 111, + 31, 3, 3, - 240, 25, 255, + 194, 8, 27, - 133, 153, - 187, + 22, + 238, 20, 26, 255, - 144, 9, - 15, + 64, + 60, 10, 30, - 8, - 248, - 91, + 33, + 153, + 110, 20, - 191, + 255, 27, 255, 11, 27, 83, 72, - 194, 73, 70, + 8, 59, - 3, + 15, 5, - 248, 5, 28, + 225, 255, 12, 35, - 214, - 13, + 174, + 91, 232, - 237, 82, + 181, 83, 43, - 100, + 147, 41, - 255, 29, 255, + 255, 13, 27, 80, 79, 76, - 237, 89, 80, + 182, 72, 235, - 178, 89, + 201, 44, - 109, + 183, 11, 2, - 219, 81, 85, + 108, 167, 84, - 8, + 32, 79, - 28, + 115, 42, - 220, + 5, + 121, + 180, + 32, + 65, + 43, + 125, + 20, + 46, + 30, + 110, 83, 79, 85, - 40, - 17, - 64, - 123, - 198, - 203, - 183, + 20, + 38, + 32, + 144, + 99, + 129, + 91, 2, 14, + 218, 70, - 180, 73, - 148, - 96, - 76, - 182, - 51, + 169, + 144, + 94, + 91, + 72, 67, - 209, - 219, - 132, - 108, - 181, + 104, + 240, + 194, + 34, + 90, + 2, + 23, 2, - 184, - 237, 87, 32, - 93, - 198, + 11, + 219, 82, + 176, 46, - 129, 20, - 142, - 2, - 107, + 49, + 205, + 23, 51, - 179, - 89, + 107, + 200, 41, - 8, - 202, - 171, - 221, + 33, + 25, + 97, + 91, 20, + 174, 79, - 117, - 177, + 198, + 165, 87, - 43, - 129, + 55, + 107, 44, - 88, 41, - 95, + 11, + 252, 67, 86, 32, - 228, 65, 76, 76, - 37, - 173, - 215, + 132, + 181, + 236, + 172, 156, - 100, 20, - 110, + 141, + 208, 21, - 134, 89, - 28, - 189, + 215, + 49, 77, 13, - 161, + 180, 132, - 187, - 112, + 46, + 208, 76, 65, - 172, - 252, + 53, + 17, + 147, 210, - 155, 13, + 111, 31, - 123, 23, 1, 77, + 100, 208, - 39, + 244, 83, 82, - 166, 67, - 125, - 72, - 126, - 12, + 201, + 51, + 52, + 1, + 142, 43, - 115, - 150, + 171, + 107, 168, - 90, 62, - 144, - 147, - 153, + 82, + 73, + 19, 44, - 194, + 56, + 80, 7, - 132, - 28, - 6, + 128, + 49, + 198, 1, - 54, - 45, + 66, + 222, 45, - 246, 147, + 208, 19, - 134, + 204, 26, - 97, 189, - 54, + 38, 25, + 214, 3, - 178, 94, - 233, + 93, 73, - 220, - 70, - 134, - 216, + 40, + 146, + 219, + 155, 84, 31, - 28, + 3, + 134, 33, - 51, 28, - 18, 109, + 18, 77, + 184, 178, - 194, 73, 90, - 146, - 176, + 86, + 167, 147, - 109, + 13, 8, + 176, 73, - 135, 16, - 144, - 142, + 241, + 165, 32, - 124, - 11, + 193, + 145, 88, + 97, 71, - 9, - 144, - 110, + 165, + 45, + 221, 73, - 237, 32, 77, 73, + 161, 195, - 15, 102, + 252, 72, - 227, 82, 79, 32, - 72, - 217, + 123, + 93, 52, - 251, + 63, 18, 2, 9, 255, + 107, 4, - 94, 52, - 194, + 216, 20, - 101, + 76, 46, - 165, + 180, 88, - 126, - 107, + 173, + 147, 66, + 97, 20, - 9, - 187, + 55, 57, 41, + 109, 24, 82, - 104, 190, - 65, + 8, 78, - 127, + 47, 80, + 248, 32, 49, 32, - 198, 70, 87, - 209, - 164, - 116, - 237, + 212, + 230, + 157, + 137, 7, + 182, 31, - 177, 10, 20, - 144, 50, - 25, + 50, + 3, 51, - 125, + 47, 92, 85, 83, + 176, 66, - 130, 17, - 144, - 158, - 109, + 82, + 179, + 13, 52, + 177, 20, - 165, 96, - 137, - 175, - 32, - 200, - 9, + 203, + 36, + 126, + 194, 81, - 118, + 93, 11, + 184, 20, - 225, 86, 24, + 81, 113, - 70, + 163, 5, + 15, + 5, + 171, + 29, + 18, + 131, 172, - 92, - 58, - 79, - 96, - 253, - 241, - 172, + 198, 58, - 157, - 110, + 131, + 118, 5, - 176, 31, - 7, - 34, - 110, 192, + 7, + 139, + 36, 20, - 230, + 3, + 153, 53, - 102, + 152, 41, - 25, + 102, 193, - 135, 115, + 28, 6, - 11, + 45, 61, 100, - 98, + 139, 41, - 192, 20, - 237, + 3, + 183, 54, 41, - 237, 100, 24, + 182, 80, 190, - 180, 71, + 208, 24, - 59, + 237, 209, 9, - 90, + 104, 220, - 4, - 135, - 183, + 18, + 61, + 221, 126, - 91, 49, + 109, 31, 90, - 125, + 246, 20, 73, - 139, 239, + 44, 242, - 6, + 24, 47, - 25, + 103, 7, - 238, 20, + 185, 244, - 97, + 135, 21, - 247, 17, + 221, 2, 48, 20, - 67, 24, + 15, 143, - 214, 83, - 166, - 126, + 89, + 187, + 248, 85, 82, 66, 79, - 21, + 86, 8, - 151, 221, + 94, 2, - 181, 255, + 214, 78, - 156, 20, + 114, 50, - 151, + 92, 3, - 36, - 134, + 146, + 26, 13, - 176, 58, + 193, 20, - 102, + 154, 55, - 133, 68, + 20, 102, - 28, + 115, 165, - 214, 42, + 89, 136, - 77, + 54, 4, - 176, 189, + 193, 84, + 139, + 107, 98, - 181, - 245, - 98, + 192, 155, - 250, + 15, 41, 111, 56, @@ -932,7 +904,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 70, 75, 178, - 231, + 252, 221, 168, 1, @@ -990,7 +962,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 104, 129, 21, - 62, + 83, 43, 42, 183, @@ -1008,7 +980,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 62, 196, 236, - 220, + 146, 101, 22, 136, @@ -1052,7 +1024,7 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 12, 28, 91, - 81, + 7, 88, 90, 133, diff --git a/resource/menu_layouts.cpp b/resource/menu_layouts.cpp index 7bf482f8c..f659a13b6 100644 --- a/resource/menu_layouts.cpp +++ b/resource/menu_layouts.cpp @@ -211,24 +211,12 @@ menu_t seq_menu_layout = { {"REVERSE:", 0, 3, 3, 29, NULL_PAGE, 13, 27}, {"POLYPHONY", 0, 0, 0, 0, POLY_PAGE, 0, 0}, {"QUANT:", 0, 2, 2, 42, NULL_PAGE, 0, 25}, - {"CC REC:", 0, 2, 2, 60, NULL_PAGE, 0, 25}, + {"CC REC:", 0, 2, 2, 30, NULL_PAGE, 0, 25}, {"SOUND", 0, 0, 0, 0, SOUND_BROWSER, 0, 0}, }, 14 }; -menu_t step_menu_layout = { - "STP", - { - // m r n d p f o - {"CLEAR:", 0, 2, 2, 30, NULL_PAGE, 15, 30}, - {"COPY STEP", 0, 0, 0, 0, NULL_PAGE, 16, 0}, - {"PASTE STEP", 0, 0, 0, 0, NULL_PAGE, 17, 0}, - {"MUTE STEP", 0, 0, 0, 0, NULL_PAGE, 18, 0}, - }, - 19 -}; - menu_t slot_menu_layout = { "Slot", { From 794c74de1c6cc2eaca86c2538889b33ecd970a44 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 24 Jul 2023 12:21:47 +1000 Subject: [PATCH 333/413] Draw mute mask on step edit, allow mute toggling by holding trig + press NO --- avr/cores/megacommand/MCL/SeqPage.cpp | 1 + avr/cores/megacommand/MCL/SeqStepPage.cpp | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index 8432bd3c1..764674031 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -468,6 +468,7 @@ void SeqPage::draw_mask(uint8_t offset, uint8_t device, switch (mask_type) { case MASK_PATTERN: led_mask = mask; + mute_mask = active_track.mute_mask; break; case MASK_LOCK: active_track.get_mask(&lock_mask, MASK_LOCK); diff --git a/avr/cores/megacommand/MCL/SeqStepPage.cpp b/avr/cores/megacommand/MCL/SeqStepPage.cpp index a9d7525cf..b51c24107 100644 --- a/avr/cores/megacommand/MCL/SeqStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqStepPage.cpp @@ -543,6 +543,14 @@ bool SeqStepPage::handleEvent(gui_event_t *event) { mask_type = MASK_PATTERN; config_mask_info(false); } + else { + for (uint8_t n = 0; n < NUM_MD_TRACKS; n++) { + if (note_interface.is_note_on(n)) { + uint8_t s = n + (page_select * 16); + TOGGLE_BIT64(active_track.mute_mask,s); + } + } + } break; } case MDX_KEY_BANKB: { From 12f4896718aa8b5b34dfed0c16130edf922db992 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 24 Jul 2023 12:26:03 +1000 Subject: [PATCH 334/413] fix mute rotate --- avr/cores/megacommand/MCL/MDSeqTrack.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.cpp b/avr/cores/megacommand/MCL/MDSeqTrack.cpp index 57124d14e..e9ad49ee8 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/MDSeqTrack.cpp @@ -796,7 +796,7 @@ void MDSeqTrack::modify_track(uint8_t dir) { memmove(timing, timing + 1, length - 1); steps[length - 1] = step_buf; timing[length - 1] = timing_buf; - ROTATE_LEFT(mute_mask, 1); + ROTATE_LEFT(mute_mask, length); break; } case DIR_RIGHT: { @@ -813,7 +813,7 @@ void MDSeqTrack::modify_track(uint8_t dir) { memmove(timing + 1, timing, length - 1); steps[0] = step_buf; timing[0] = timing_buf; - ROTATE_RIGHT(mute_mask,1); + ROTATE_RIGHT(mute_mask,length); break; } case DIR_REVERSE: { From 84b446edf5a78b3077d25048752a9c8114e30ee8 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 24 Jul 2023 12:37:15 +1000 Subject: [PATCH 335/413] reverse mute mask --- avr/cores/megacommand/MCL/MDSeqTrack.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.cpp b/avr/cores/megacommand/MCL/MDSeqTrack.cpp index e9ad49ee8..6e64c2d77 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/MDSeqTrack.cpp @@ -820,7 +820,7 @@ void MDSeqTrack::modify_track(uint8_t dir) { uint8_t rev_locks[NUM_MD_LOCK_SLOTS]; memcpy(rev_locks, locks, sizeof(locks)); uint16_t l = 0, r = 0; - mute_mask = 0; //unimplemented + //mute_mask = 0; //unimplemented // reverse steps & locks for (int i = 0; i <= length / 2; ++i) { int j = length - i - 1; @@ -839,14 +839,12 @@ void MDSeqTrack::modify_track(uint8_t dir) { timing_buf = timing[i]; timing[i] = timing[j]; timing[j] = timing_buf; - /* bool a = IS_BIT_SET64(mute_mask, i); bool b = IS_BIT_SET64(mute_mask, j); if (a) { SET_BIT64(mute_mask, j); } else { CLEAR_BIT64(mute_mask,j); } if (b) { SET_BIT64(mute_mask, i); } else { CLEAR_BIT64(mute_mask,i); } - */ } break; } From 9bf4341e4b68f42023ba9fca0426a42f0ee82673 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 24 Jul 2023 13:51:57 +1000 Subject: [PATCH 336/413] jmamma --- avr/cores/megacommand/MCL/GridPage.cpp | 2 +- avr/cores/megacommand/MCL/MCLGfx.cpp | 4 +- avr/cores/megacommand/resources/R.h | 8 +- .../megacommand/resources/R_icons_boot.cpp | 318 ++++++++---------- resource/icons_boot.cpp | 30 +- 5 files changed, 164 insertions(+), 198 deletions(-) diff --git a/avr/cores/megacommand/MCL/GridPage.cpp b/avr/cores/megacommand/MCL/GridPage.cpp index 154dc3521..06656c7b1 100644 --- a/avr/cores/megacommand/MCL/GridPage.cpp +++ b/avr/cores/megacommand/MCL/GridPage.cpp @@ -899,7 +899,7 @@ bool GridPage::handleEvent(gui_event_t *event) { if (event->mask == EVENT_BUTTON_PRESSED) { uint8_t inc = 1; if (trig_interface.is_key_down(MDX_KEY_FUNC)) { - inc = 16; + inc = 4; } if (show_slot_menu) { switch (key) { diff --git a/avr/cores/megacommand/MCL/MCLGfx.cpp b/avr/cores/megacommand/MCL/MCLGfx.cpp index 3e757efe0..572733182 100644 --- a/avr/cores/megacommand/MCL/MCLGfx.cpp +++ b/avr/cores/megacommand/MCL/MCLGfx.cpp @@ -28,10 +28,10 @@ void MCLGfx::draw_evil(unsigned char* evil) { oled_display.setCursor(x - 60, 20); oled_display.println("MACHINE IS O.K."); - oled_display.drawBitmap(x, 0, evil, 45, 32, BLACK); + oled_display.drawBitmap(x, 1, evil, 33, 31, BLACK); oled_display.display(); } - delay(1000); + delay(2000); oled_display.setTextColor(WHITE, BLACK); oled_display.setFont(oldfont); } diff --git a/avr/cores/megacommand/resources/R.h b/avr/cores/megacommand/resources/R.h index 7499c5869..335c762c2 100644 --- a/avr/cores/megacommand/resources/R.h +++ b/avr/cores/megacommand/resources/R.h @@ -6,17 +6,17 @@ extern const unsigned char __R_icons_boot[] PROGMEM; struct __T_icons_boot { union { unsigned char evilknievel_bitmap[0]; - char zz__evilknievel_bitmap[192]; + char zz__evilknievel_bitmap[155]; }; - static constexpr size_t countof_evilknievel_bitmap = 192 / sizeof(unsigned char); - static constexpr size_t sizeofof_evilknievel_bitmap = 192; + static constexpr size_t countof_evilknievel_bitmap = 155 / sizeof(unsigned char); + static constexpr size_t sizeofof_evilknievel_bitmap = 155; union { unsigned char mcl_logo_bitmap[0]; char zz__mcl_logo_bitmap[152]; }; static constexpr size_t countof_mcl_logo_bitmap = 152 / sizeof(unsigned char); static constexpr size_t sizeofof_mcl_logo_bitmap = 152; - static constexpr size_t __total_size = 344; + static constexpr size_t __total_size = 307; }; extern const unsigned char __R_icons_device[] PROGMEM; diff --git a/avr/cores/megacommand/resources/R_icons_boot.cpp b/avr/cores/megacommand/resources/R_icons_boot.cpp index 7c6546fba..66d3887f1 100644 --- a/avr/cores/megacommand/resources/R_icons_boot.cpp +++ b/avr/cores/megacommand/resources/R_icons_boot.cpp @@ -1,233 +1,205 @@ #include "R.h" const unsigned char __R_icons_boot[] PROGMEM = { - 229, + 242, 0, - 127, - 255, - 186, + 15, + 224, 0, - 5, - 213, - 111, - 111, - 232, - 42, - 255, + 238, + 127, + 248, + 4, + 219, + 223, 252, + 3, + 1, + 221, + 193, + 238, + 4, 128, + 155, + 246, 0, - 119, - 128, - 5, - 127, - 189, - 98, - 0, + 123, + 47, 2, - 217, - 11, - 112, 0, + 31, + 154, + 128, + 15, 91, - 23, - 96, - 109, - 11, - 191, - 189, - 5, - 32, - 0, + 6, 1, - 155, - 11, - 41, - 172, - 40, - 11, - 125, + 110, + 192, + 4, + 203, + 7, + 224, + 7, + 219, + 227, + 224, + 7, + 207, + 219, 63, - 135, - 242, - 254, - 221, - 59, - 215, - 253, - 126, + 224, + 22, + 127, + 187, 219, - 5, + 4, + 175, + 243, + 151, + 32, 239, - 254, - 11, - 251, + 242, + 55, 199, - 255, - 252, - 5, - 247, - 254, - 236, - 29, - 118, + 226, + 160, + 47, 195, - 253, - 212, - 5, - 247, - 30, - 128, - 250, - 11, - 91, - 21, - 71, - 84, - 111, - 5, - 26, - 128, - 2, - 151, - 168, + 130, + 96, + 110, 29, - 192, - 203, - 5, - 120, - 10, - 238, - 226, - 10, - 252, - 11, - 109, - 23, - 92, - 190, - 5, - 11, - 192, - 10, - 190, - 95, - 61, - 192, - 21, - 95, - 255, 128, - 7, - 254, - 232, - 10, - 191, + 3, + 235, + 39, + 64, + 44, + 251, + 48, + 15, 240, + 4, + 115, + 126, 31, - 255, - 255, - 208, - 23, - 95, - 248, + 109, + 131, 63, - 255, - 232, - 205, - 15, - 191, - 0, - 246, - 31, - 127, - 248, - 127, - 140, + 100, 238, - 62, - 191, - 5, - 218, - 192, - 125, - 11, - 222, - 176, - 250, - 250, + 3, + 51, 255, - 237, - 5, - 127, - 245, - 189, - 11, + 4, + 229, 1, + 252, + 188, + 237, + 131, + 249, + 222, + 99, + 238, + 255, + 227, + 108, + 4, + 219, + 198, + 100, + 49, + 255, + 255, + 12, + 119, + 0, + 29, + 126, + 48, + 89, + 128, 255, + 123, + 32, + 96, + 142, + 0, + 242, + 96, + 129, + 219, + 135, + 128, + 24, 243, - 174, + 110, 1, - 120, - 176, - 3, + 254, + 0, + 214, + 42, 7, - 100, + 12, 7, - 25, + 131, 15, - 6, + 32, + 200, 31, - 65, - 147, + 50, 63, - 119, - 232, - 243, + 13, + 127, + 187, + 5, 248, 3, - 116, 7, + 164, 255, - 129, - 176, + 13, + 128, 23, - 29, + 239, 63, 223, - 254, 7, + 242, 127, 192, 31, 159, - 79, + 121, 15, 31, - 39, + 61, 6, - 188, 31, + 246, 63, - 51, - 23, + 127, + 227, + 179, 7, - 57, + 147, 0, - 57, + 144, 126, - 6, + 100, 124, - 65, - 144, + 25, 120, - 66, - 54, - 128, + 7, + 112, 0, 0, 0, 0, - 2, - 127, + 0, + 0, + 4, + 255, 255, }; diff --git a/resource/icons_boot.cpp b/resource/icons_boot.cpp index 77432cdbf..064cb040e 100644 --- a/resource/icons_boot.cpp +++ b/resource/icons_boot.cpp @@ -13,23 +13,17 @@ unsigned char mcl_logo_bitmap[] = { 0xf3, 0xfe, 0x7c, 0x00, 0x00, 0x1f, 0xf3, 0xff, 0xf3, 0xfe, 0x78, 0x00, 0x00, 0x1f, 0xf3, 0xff, 0xf3, 0xfe, 0x70, 0x00}; -// 'evilknievel', 45x32px +// 'evilknievel', 33x31px unsigned char evilknievel_bitmap[] = { - 0x00, 0x7f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x7f, 0xff, 0xd5, 0xff, 0x00, - 0x00, 0x6f, 0xe8, 0x2a, 0xff, 0x80, 0x00, 0x77, 0x80, 0x05, 0x7f, 0x80, - 0x00, 0x62, 0x00, 0x02, 0xff, 0x80, 0x00, 0x70, 0x00, 0x05, 0x7f, 0x00, - 0x00, 0x60, 0x00, 0x02, 0xbf, 0x00, 0x00, 0x20, 0x00, 0x01, 0x7f, 0x00, - 0x00, 0x60, 0x00, 0x02, 0xff, 0x00, 0x00, 0x28, 0x00, 0x01, 0x7f, 0x00, - 0x00, 0x3f, 0x87, 0xf2, 0xfe, 0x00, 0x00, 0x7f, 0xd7, 0xfd, 0x7e, 0x00, - 0x00, 0x7f, 0xef, 0xfe, 0xfe, 0x00, 0x00, 0x7f, 0xc7, 0xff, 0xfc, 0x00, - 0x00, 0x7f, 0xc7, 0xfe, 0xec, 0x00, 0x00, 0x3f, 0xc3, 0xfd, 0xd4, 0x00, - 0x00, 0x1e, 0x80, 0xfa, 0xec, 0x00, 0x00, 0x15, 0x00, 0x05, 0x54, 0x00, - 0x00, 0x1a, 0x80, 0x02, 0xa8, 0x00, 0x00, 0x1d, 0xc0, 0x05, 0x78, 0x00, - 0x00, 0x0a, 0xe2, 0x0a, 0xfc, 0x00, 0x00, 0x1d, 0x00, 0x05, 0x5c, 0x00, - 0x00, 0x0b, 0xc0, 0x0a, 0xbe, 0x00, 0x00, 0x3d, 0xc0, 0x15, 0x5f, 0x80, - 0x07, 0xfe, 0xe8, 0x0a, 0xbf, 0xf0, 0x1f, 0xff, 0xd0, 0x17, 0x5f, 0xf8, - 0x3f, 0xff, 0xe8, 0x0f, 0xbf, 0xf8, 0x3f, 0xff, 0x00, 0x1f, 0x7f, 0xf8, - 0x7f, 0xff, 0x80, 0x3e, 0xbf, 0xf8, 0x7f, 0xff, 0xc0, 0x7d, 0x7f, 0xf8, - 0xff, 0xff, 0xfa, 0xfa, 0xff, 0xf8, 0xff, 0xff, 0x7f, 0xf5, 0x7f, 0xf8}; -// oled_display.drawBitmap(128-45, 0, evilknievel_bitmap, 45, 32); + 0x00, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x7f, 0xf8, 0x00, 0x00, 0x00, 0xdf, 0xfc, 0x00, 0x00, 0x01, + 0xc1, 0xee, 0x00, 0x00, 0x01, 0x80, 0xf6, 0x00, 0x00, 0x01, 0x00, 0x7b, 0x00, 0x00, 0x02, 0x00, + 0x1f, 0x80, 0x00, 0x02, 0x00, 0x0f, 0x80, 0x00, 0x06, 0x00, 0x06, 0xc0, 0x00, 0x06, 0x00, 0x07, + 0xe0, 0x00, 0x06, 0x07, 0xe3, 0xe0, 0x00, 0x07, 0xcf, 0x3f, 0xe0, 0x00, 0x0f, 0x7f, 0xdb, 0xe0, + 0x00, 0x0f, 0xaf, 0xf3, 0x20, 0x00, 0x0f, 0xef, 0xf2, 0x20, 0x00, 0x0f, 0xc7, 0xe2, 0xa0, 0x00, + 0x0f, 0xc3, 0x82, 0x60, 0x00, 0x07, 0x80, 0x03, 0xe0, 0x00, 0x06, 0x40, 0x07, 0xe0, 0x00, 0x06, + 0x30, 0x0f, 0xf0, 0x00, 0x06, 0x7e, 0x1f, 0xf0, 0x00, 0x06, 0x83, 0x3f, 0xf8, 0x00, 0x03, 0x33, + 0xff, 0xf8, 0x00, 0x03, 0x01, 0xfc, 0xbc, 0x00, 0x03, 0x83, 0xf9, 0xde, 0x00, 0x01, 0xff, 0xe3, + 0x6c, 0x00, 0x01, 0xff, 0xc6, 0x64, 0x00, 0x07, 0xff, 0x0c, 0x77, 0x00, 0x1d, 0x7e, 0x30, 0x59, + 0x80, 0x7b, 0x20, 0x60, 0x8e, 0x00, 0xf2, 0x60, 0x81, 0x87, 0x80 +}; From 12e5c77ebcf00223aa4ee20f79b74373131f32e1 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 24 Jul 2023 15:34:40 +1000 Subject: [PATCH 337/413] Changelog 4.50 --- Changelog | 189 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 189 insertions(+) diff --git a/Changelog b/Changelog index df362bab3..85ace0e13 100644 --- a/Changelog +++ b/Changelog @@ -1,3 +1,192 @@ +MCL 4.50 24/07/2023 + +Please install Machinedrum OS X.09 & Monomachine OS X.01 before using MCL 4.50. + +- Performance Page + Performance Controllers + A new Performance Page has been added featuring 8 Scenes (1->8) that are shared + by 4 user programmable Performance Controllers (A,B,C,D). + + Each Contoller can be assigned two scenes. Press either [LEFT] or + [RIGHT] and then a corresponding Scene Trig to assign the left-most and + right-most Scenes to the Controller. + + Rotating a Perormance Controller will morph between values across the assigned scenes. + [ Func ] + Rotate for Controller hard pan. + + Each scene can have up to 16 "Scene Locks". A Scene lock can be any MD + paramater, or any external MIDI CC paramater. To assign a lock to a scene, + hold the corresponding Scene Trig and rotate the desired parameter on the + MD or external MIDI. + + Controllers A,B,C,D can be controlled externally by any MD parameter, or any + MIDI CC. + + A parameter "LEARN" feature can be enable by setting Dest to "--" and Param + to "LEARN". + + Performance Controller Names can be customized from the Performance Page's "Shift" menu. + + A new slot "PF", has been addded to the Grid Y, slot 12. + Performance Controllers and their shared Scene data can be saved or loaded + to this slot. + Mixer Page, Mute Sets and Performance Controller Locks are also stored in + the PF. + +- Mixer Page: + + The [Scale] button can be used to toggle between the MD or Ext MIDI tracks. + + [Trig] + [Classic/Extended] is now Track Parameter Reset. + + [Trig] + [YES] or [YES] + [Trig] to toggle mutes. + + [Trig] + [NO] to solo tracks. + + [Func] + [YES] to flip mutes. + + [Trig] + [Global] record sequencer mutes. + [Trig] + [Kit] clear track's sequencer mutes. + [Global + Kit] clear all track's sequencer mutes. + + The 4 Encoders of the Mixer Page are now Performance Controllers (A,B,C,D). + + The Mixer Page now features 4 "Mute Sets" assigned to the MD's Arrow Keys. + + To load a Mute Set, hold down an Arroy Key and press [YES] + To edit a Mute Set, hold down an Arrow Key and toggle Trig Keys. + + Each Mute Set also includes Performance Controller Locks. + + To set a Performance Controller lock, hold down an Arrow Key and rotate the + respective encoder. + +- Chromatic Page: + + [Scale] button can be used to toggle between devices. + + When the MIDI device is active, the MD's [Trig] keys can now be used to play External MIDI. + + Sequencer menu option, TRANSPOSE renamed to KEY. Now show's note A,A#,B,B#,C etc.. + + Oct and Fine Tune values are now device indepenent. + + +- Sequencer: + + The MD's kit parameters are no longer updated when parameter locks or + LFO data is sent from MCL. + + Improved track expansion. When a Track's length is increased, the existing + pattern will be copied and filled across the new length. + + Step menu has been deprecated. + + Step mutes are now shown when editting the Pattern Mask. + + [ Trig ] + [ No ] to toggle step mutes + + Exiting Step Edit by pressing [ Record ] will now take you back to the last + MCL Page you were using. + +- Piano Roll + + A number of bug fixes related to missing notes, or unpredictable note + length. + + Quantization record could lead to incorrect note length. + + Zoom is now cursor relative. + + Added "CC REC" option to enable/disable recording of automation data. + + The MD's scale menu can be used to set the speed and length of Ext MIDI tracks (up to + 64 steps). + + Program Change automation is now oneshot, and only a single change is + permitted per parameter. + + Various GUI improvements. + +- Arpeggiator + + Improved ARP Latch mode, Latch is reset upon next note when all keys are + released. + + More ARP Speeds are available. + + Arpeggiator can play on beat, or freely depending on "QUANT" Sequencer Menu + option. + +- LFO + + The LFO performance has been improved. + The assignable Destinations now include External MIDI CCs. + Parameter Learn is supported: set Dest to "--" and Param to "LEARN". + + An additional LFO sub page has been added to modify the LFO Offset for MIDI + CC parameters. + +- Grid Page + + [ Scale ] button to toggle between Grids X and Y. + + Slots selection can now extend across both Grids allowing Clear/Copy/Paste + commands to apply to both Grids simultaneously. This also includes slot + parameter updates. + + Insert Rows option has been deprecated. + + Added a throttle to the [YES] key to prevent accidental double fire. + +- Sound Browser + + The functionality to Save and Load MD Sounds is now separated from Sample + Management. + + The dedicated Sound Browser is accessible from the Sequencer Track Menu. + +- Sample Browser + + GUI has been improved significantly to allow ease of navigation. + .WAV and .SYX formats are detected automatically. + + File names increased to 32 characters. 256 files can be listed per directory. + +- Save: + + Sequencer mutes are stored with MD tracks. Saving MD track will cause the + mute state to be applied to the active sequence and stored. where a mute is + present, the trig and lock mask will be removed/ + +- Group Select + + The Group Select menu has been updated. + + Accessible by entering Load/Save page and holding [YES] + + The Selectable Groups are now: + - MD, MIDI, PERFORMANCE, ROUTE, TEMPO. + + The MD FX slot is now always loaded with MD group. + + LFO and Performance Slots (PF) are loaded with the PERFORMANCE group. + +- Transitions + Slot Loading: + + MDFX data is now cached ahead of time and loaded immediately on transtion. + +- Func + Ext + + The MD's undokit is now synced per track. Previously all tracks were synced + to the undokit leading to unexpected behaviour when performing [ Func + Ext + ]. + + The MD's LEV values are no longer reset by [ Func + Ext ] + +- Page Select + + Page Select layout has changed to accomodate the Performance Page. + MCL 4.43 13/04/2023 - Fixes From 0eaedbe359d4a0f785d7ff2f5021126c227112f2 Mon Sep 17 00:00:00 2001 From: jmamma Date: Mon, 24 Jul 2023 15:43:35 +1000 Subject: [PATCH 338/413] Update Changelog --- Changelog | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/Changelog b/Changelog index 85ace0e13..e33fd1ceb 100644 --- a/Changelog +++ b/Changelog @@ -6,15 +6,15 @@ Please install Machinedrum OS X.09 & Monomachine OS X.01 before using MCL 4.50. A new Performance Page has been added featuring 8 Scenes (1->8) that are shared by 4 user programmable Performance Controllers (A,B,C,D). - Each Contoller can be assigned two scenes. Press either [LEFT] or + Each Controller can be assigned two scenes. Press either [LEFT] or [RIGHT] and then a corresponding Scene Trig to assign the left-most and right-most Scenes to the Controller. - Rotating a Perormance Controller will morph between values across the assigned scenes. + Rotating a Performance Controller will morph between values across the assigned scenes. [ Func ] + Rotate for Controller hard pan. Each scene can have up to 16 "Scene Locks". A Scene lock can be any MD - paramater, or any external MIDI CC paramater. To assign a lock to a scene, + parameter, or any external MIDI CC parameter. To assign a lock to a scene, hold the corresponding Scene Trig and rotate the desired parameter on the MD or external MIDI. @@ -26,7 +26,7 @@ Please install Machinedrum OS X.09 & Monomachine OS X.01 before using MCL 4.50. Performance Controller Names can be customized from the Performance Page's "Shift" menu. - A new slot "PF", has been addded to the Grid Y, slot 12. + A new slot "PF", has been added to the Grid Y, slot 12. Performance Controllers and their shared Scene data can be saved or loaded to this slot. Mixer Page, Mute Sets and Performance Controller Locks are also stored in @@ -52,7 +52,7 @@ Please install Machinedrum OS X.09 & Monomachine OS X.01 before using MCL 4.50. The Mixer Page now features 4 "Mute Sets" assigned to the MD's Arrow Keys. - To load a Mute Set, hold down an Arroy Key and press [YES] + To load a Mute Set, hold down an Arrow Key and press [YES] To edit a Mute Set, hold down an Arrow Key and toggle Trig Keys. Each Mute Set also includes Performance Controller Locks. @@ -68,7 +68,7 @@ Please install Machinedrum OS X.09 & Monomachine OS X.01 before using MCL 4.50. Sequencer menu option, TRANSPOSE renamed to KEY. Now show's note A,A#,B,B#,C etc.. - Oct and Fine Tune values are now device indepenent. + Oct and Fine Tune values are now device independent. - Sequencer: @@ -81,7 +81,7 @@ Please install Machinedrum OS X.09 & Monomachine OS X.01 before using MCL 4.50. Step menu has been deprecated. - Step mutes are now shown when editting the Pattern Mask. + Step mutes are now shown when editing the Pattern Mask. [ Trig ] + [ No ] to toggle step mutes @@ -173,7 +173,7 @@ Please install Machinedrum OS X.09 & Monomachine OS X.01 before using MCL 4.50. - Transitions + Slot Loading: - MDFX data is now cached ahead of time and loaded immediately on transtion. + MDFX data is now cached ahead of time and loaded immediately on transition. - Func + Ext @@ -185,7 +185,7 @@ Please install Machinedrum OS X.09 & Monomachine OS X.01 before using MCL 4.50. - Page Select - Page Select layout has changed to accomodate the Performance Page. + Page Select layout has changed to accommodate the Performance Page. MCL 4.43 13/04/2023 @@ -241,7 +241,7 @@ Perform the USB DFU firmware procedure to upgrade the USB microcontroller for cl - Fixes - Grid Page: Allow length adustment across multiple slots when slot speeds are the + Grid Page: Allow length adjustment across multiple slots when slot speeds are the same. Program Change Advanced mode did not work over USB MIDI @@ -260,7 +260,7 @@ Perform the USB DFU firmware procedure to upgrade the USB microcontroller for cl GUI input from MD's trig keys would sometimes be unreliable. - Changes: - Improved overall framerate and responsiveness of MCL particulary on the Grid Page. + Improved overall framerate and responsiveness of MCL particularly on the Grid Page. Overhauled the method in which MD tracks are loaded such that there are no dropped notes during transitions. @@ -299,7 +299,7 @@ Perform the USB DFU firmware procedure to upgrade the USB microcontroller for cl Loop points are now stored in saved .wav file(s) when receiving looped SDS samples. - MCL Sequencer now supports triggering and recording from a dedicated MIDI channel via an external drump pad. See MD MIDI -> TRIG CHAN. + MCL Sequencer now supports triggering and recording from a dedicated MIDI channel via an external drum pad. See MD MIDI -> TRIG CHAN. - USB MIDI: @@ -354,7 +354,7 @@ Please install Machinedrum OS X.06 before using MCL 4.11 Project rename was broken in 4.10 - Kit and sequencer params weren't updated during a paramater change on linked/poly tracks. + Kit and sequencer params weren't updated during a parameter change on linked/poly tracks. This could cause incorrect value reset on sequencer stop. Piano Roll track menu would incorrectly show "clear track message" in certain circumstances. @@ -515,13 +515,13 @@ MCL 4.00 21/08/2021 MCL 4.00 is an significant achieviement. It builds upon the foundations of the 3.XX firmware, whilst improving stability, performance and workflow across several key areas. The Machinedrum and MCL integration is now closer than ever. -In short, MCL 4.0 achieves the original vision of the project, a seemless +In short, MCL 4.0 achieves the original vision of the project, a seamless enhancement of the Elektron Machinedrum. It is recommended that you read the updated user documentation in which many of the changes listed below, are explained in greater detail. -- Enhanced GUI / Machinedrum GUI convergance. +- Enhanced GUI / Machinedrum GUI convergence. Version X.05 of the MD firmware introduces a third editing mode beyond Classic and Extended entitled Enhanced Mode. @@ -533,12 +533,12 @@ many of the changes listed below, are explained in greater detail. Enhanced mode enables the Machinedrum's GUI to be fully integrated in to the MCL workflow All MD sequencer editing commands now apply to the MCL sequencer. - See the MCL 4.0 user documenation for a summary of commands. + See the MCL 4.0 user documentation for a summary of commands. - Changes: Chain Mode renamed to Load Mode. - Grids A/B are now relabelled to X/Y. - Grid rows are no longer labelled numerically and instead represented by the corresponding + Grids A/B are now relabeled to X/Y. + Grid rows are no longer labeled numerically and instead represented by the corresponding Bank + Pattern. @@ -991,7 +991,7 @@ MCL 3.00 20/12/2020 on the MC the MD's LEDs will illuminate according to the pattern sequence on the MC. The MD's cursor (indicating current sequence position) will also be - illimunated during playblack. The cursor is synced to the MD's current pattern speed + length. + illuminated during playback. The cursor is synced to the MD's current pattern speed + length. When using the Trig Interface to select tracks, the LEDs will illuminate appropriately. @@ -1335,7 +1335,7 @@ General: - Fix: SeqExtPage bad character glitch - Fix: SeqParam page showing param values offset by 1. - Fix: SeqParam page not allowing selection of all 24 params -- Fix: reolution bug causing glitched track length for A4/Ext tracks +- Fix: resolution bug causing glitched track length for A4/Ext tracks - Fix: Grid copy + paste was broken. Would not copy sequencer data correctly. - Diversion track for MDExploit no longer fixed to track 16, will be calculated dynamically From ab247132ed17c9a8a2a719225ce91b28b451aa5c Mon Sep 17 00:00:00 2001 From: jmamma Date: Mon, 24 Jul 2023 15:44:34 +1000 Subject: [PATCH 339/413] Update Changelog --- Changelog | 1 - 1 file changed, 1 deletion(-) diff --git a/Changelog b/Changelog index e33fd1ceb..9e11504fe 100644 --- a/Changelog +++ b/Changelog @@ -70,7 +70,6 @@ Please install Machinedrum OS X.09 & Monomachine OS X.01 before using MCL 4.50. Oct and Fine Tune values are now device independent. - - Sequencer: The MD's kit parameters are no longer updated when parameter locks or From 83f8b7ba451fdb9e78207633761d49f1080d0bfc Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 24 Jul 2023 15:51:17 +1000 Subject: [PATCH 340/413] Formatting --- Changelog | 66 +++++++++++++++++++++++++------------------------------ 1 file changed, 30 insertions(+), 36 deletions(-) diff --git a/Changelog b/Changelog index 9e11504fe..0e8b2a96e 100644 --- a/Changelog +++ b/Changelog @@ -4,33 +4,32 @@ Please install Machinedrum OS X.09 & Monomachine OS X.01 before using MCL 4.50. - Performance Page + Performance Controllers A new Performance Page has been added featuring 8 Scenes (1->8) that are shared - by 4 user programmable Performance Controllers (A,B,C,D). + between 4 user programmable Performance Controllers (A,B,C,D). - Each Controller can be assigned two scenes. Press either [LEFT] or - [RIGHT] and then a corresponding Scene Trig to assign the left-most and - right-most Scenes to the Controller. + Each Controller can be assigned two scenes. Press either [LEFT] or [RIGHT] and then + a corresponding Scene Trig to assign the left-most and right-most Scenes to the Controller. Rotating a Performance Controller will morph between values across the assigned scenes. [ Func ] + Rotate for Controller hard pan. - Each scene can have up to 16 "Scene Locks". A Scene lock can be any MD - parameter, or any external MIDI CC parameter. To assign a lock to a scene, - hold the corresponding Scene Trig and rotate the desired parameter on the - MD or external MIDI. + Each scene can have up to 16 "Scene Locks". - Controllers A,B,C,D can be controlled externally by any MD parameter, or any - MIDI CC. + A Scene lock can be any MD parameter, or any external MIDI CC parameter. - A parameter "LEARN" feature can be enable by setting Dest to "--" and Param - to "LEARN". + To assign a lock to a scene, hold the corresponding Scene Trig and rotate the desired + parameter on the MD or external MIDI. + + Controllers A,B,C,D can be controlled externally by any MD parameter, or any MIDI CC. + + A parameter "LEARN" feature can be enable by setting Dest to "--" and Param to "LEARN". Performance Controller Names can be customized from the Performance Page's "Shift" menu. A new slot "PF", has been added to the Grid Y, slot 12. - Performance Controllers and their shared Scene data can be saved or loaded - to this slot. - Mixer Page, Mute Sets and Performance Controller Locks are also stored in - the PF. + + Performance Controllers and their shared Scene data can be saved or loaded to this slot. + + Mixer Page, Mute Sets and Performance Controller Locks are also stored in the PF. - Mixer Page: @@ -84,8 +83,7 @@ Please install Machinedrum OS X.09 & Monomachine OS X.01 before using MCL 4.50. [ Trig ] + [ No ] to toggle step mutes - Exiting Step Edit by pressing [ Record ] will now take you back to the last - MCL Page you were using. + Exiting Step Edit by pressing [ Record ] will now take you back to the last MCL Page. - Piano Roll @@ -98,11 +96,9 @@ Please install Machinedrum OS X.09 & Monomachine OS X.01 before using MCL 4.50. Added "CC REC" option to enable/disable recording of automation data. - The MD's scale menu can be used to set the speed and length of Ext MIDI tracks (up to - 64 steps). + The MD's scale menu can be used to set the speed and length of Ext MIDI tracks (up to 64 steps). - Program Change automation is now oneshot, and only a single change is - permitted per parameter. + Program Change automation is now oneshot, and only a single change is permitted per parameter. Various GUI improvements. @@ -113,29 +109,28 @@ Please install Machinedrum OS X.09 & Monomachine OS X.01 before using MCL 4.50. More ARP Speeds are available. - Arpeggiator can play on beat, or freely depending on "QUANT" Sequencer Menu - option. + Arpeggiator can play on beat, or freely depending on "QUANT" Sequencer Menu option. - LFO The LFO performance has been improved. + The assignable Destinations now include External MIDI CCs. + Parameter Learn is supported: set Dest to "--" and Param to "LEARN". - An additional LFO sub page has been added to modify the LFO Offset for MIDI - CC parameters. + An additional LFO sub page has been added to modify the LFO Offset for MIDI CC parameters. - Grid Page [ Scale ] button to toggle between Grids X and Y. - Slots selection can now extend across both Grids allowing Clear/Copy/Paste - commands to apply to both Grids simultaneously. This also includes slot - parameter updates. + Slots selection can now extend across both Grids allowing Clear/Copy/Paste commands to apply to + both Grids simultaneously. This also includes slot parameter updates. Insert Rows option has been deprecated. - Added a throttle to the [YES] key to prevent accidental double fire. + Added a throttle to the [YES] key to prevent accidental double tap. - Sound Browser @@ -147,15 +142,15 @@ Please install Machinedrum OS X.09 & Monomachine OS X.01 before using MCL 4.50. - Sample Browser GUI has been improved significantly to allow ease of navigation. + .WAV and .SYX formats are detected automatically. File names increased to 32 characters. 256 files can be listed per directory. - Save: - Sequencer mutes are stored with MD tracks. Saving MD track will cause the - mute state to be applied to the active sequence and stored. where a mute is - present, the trig and lock mask will be removed/ + Sequencer mutes are stored with MD tracks. Saving MD track will cause the mute state to be applied + to the active sequence and stored. where a mute is present, the trig and lock mask will be removed. - Group Select @@ -176,9 +171,8 @@ Please install Machinedrum OS X.09 & Monomachine OS X.01 before using MCL 4.50. - Func + Ext - The MD's undokit is now synced per track. Previously all tracks were synced - to the undokit leading to unexpected behaviour when performing [ Func + Ext - ]. + The MD's undokit is now synced per track. Previously all tracks were synced to the undokit + leading to unexpected behaviour when performing [ Func + Ext ]. The MD's LEV values are no longer reset by [ Func + Ext ] From 5b612b98607e638386be61abf3e904d31b4a5dc2 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 24 Jul 2023 21:43:00 +1000 Subject: [PATCH 341/413] Remove PolyConfig from MD Menu --- avr/cores/megacommand/MCL/MCLMenus.h | 2 +- resource/menu_layouts.cpp | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCLMenus.h b/avr/cores/megacommand/MCL/MCLMenus.h index 4bbbdb0cf..583b01f92 100644 --- a/avr/cores/megacommand/MCL/MCLMenus.h +++ b/avr/cores/megacommand/MCL/MCLMenus.h @@ -45,7 +45,7 @@ extern MenuPage system_page; constexpr size_t midi_config_page_N = 5; extern MenuPage midi_config_page; -constexpr size_t md_config_page_N = 3; +constexpr size_t md_config_page_N = 2; extern MenuPage md_config_page; constexpr size_t mcl_config_page_N = 1; diff --git a/resource/menu_layouts.cpp b/resource/menu_layouts.cpp index f659a13b6..540a52943 100644 --- a/resource/menu_layouts.cpp +++ b/resource/menu_layouts.cpp @@ -144,7 +144,6 @@ menu_t mdconfig_menu_layout = { // m r n d p f o {"IMPORT", 0, 0, 0, 0, MD_IMPORT_PAGE, 0, 0}, {"NORMALIZE:", 0, 2, 2, 8, NULL_PAGE, 0, 16}, - {"POLY CONFIG", 0, 0, 0, 0, POLY_PAGE, 0, 0}, }, 0 }; From 2ea1c51e8bcbd156a59d07eb006f1f4859d95939 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 24 Jul 2023 22:45:50 +1000 Subject: [PATCH 342/413] LEARN -> LER --- Changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Changelog b/Changelog index 0e8b2a96e..841621cee 100644 --- a/Changelog +++ b/Changelog @@ -21,7 +21,7 @@ Please install Machinedrum OS X.09 & Monomachine OS X.01 before using MCL 4.50. Controllers A,B,C,D can be controlled externally by any MD parameter, or any MIDI CC. - A parameter "LEARN" feature can be enable by setting Dest to "--" and Param to "LEARN". + A parameter "LEARN" feature can be enable by setting Dest to "--" and Para to "LER". Performance Controller Names can be customized from the Performance Page's "Shift" menu. From 8dcd8e1158606dc91ef0aba953e7fcd9ce0bcf08 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Tue, 25 Jul 2023 21:07:02 +1000 Subject: [PATCH 343/413] LFO Offset was not updating for param 2 --- avr/cores/megacommand/MCL/LFOPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/LFOPage.cpp b/avr/cores/megacommand/MCL/LFOPage.cpp index 96c169e1f..17f0e02db 100644 --- a/avr/cores/megacommand/MCL/LFOPage.cpp +++ b/avr/cores/megacommand/MCL/LFOPage.cpp @@ -262,7 +262,7 @@ void LFOPage::learn_param(uint8_t track, uint8_t param, uint8_t value) { lfo_track->params[0].offset = value; reconfig = true; } - if (lfo_track->params[1].dest - 1 == track && lfo_track->params[0].param == param) { + if (lfo_track->params[1].dest - 1 == track && lfo_track->params[1].param == param) { lfo_track->params[1].offset = value; reconfig = true; } From 5086968fd49eca17790b3376b5599aaa5504c2db Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 26 Jul 2023 09:31:06 +1000 Subject: [PATCH 344/413] checkin --- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index f4471fb0d..db5a6ab32 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -711,13 +711,20 @@ void SeqExtStepPage::loop() { if (cur_w > roll_length) { cur_w = roll_length / 2; } - int z = (float)active_track.length * active_track.get_speed_multiplier(); - if (seq_extparam4.cur > z) { - seq_extparam4.cur = z; - } - + int fov_length_new = active_track.length * timing_mid * fov_pixels_per_tick; + if (fov_length_new < fov_w) { + seq_extparam4.cur = active_track.length * active_track.get_speed_multiplier(); + if (seq_extparam4.cur > zoom_max) { + seq_extparam4.cur = zoom_max; + } + fov_length = fov_w; + goto change; +// fov_offset = 0; +// cur_x = 0; + } if (seq_extparam4.hasChanged()) { + change: uint8_t fov_zoom = seq_extparam4.cur; fov_length = fov_zoom * timing_mid; // how many ticks to display on screen. From a5d2fbdfcaba6421d8352beaf2d6d3bd338277ee Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 26 Jul 2023 10:36:06 +1000 Subject: [PATCH 345/413] random byte as byte --- avr/cores/megacommand/MCL/SeqTrack.cpp | 10 +++++----- avr/cores/megacommand/memory.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqTrack.cpp b/avr/cores/megacommand/MCL/SeqTrack.cpp index 2ac30a0be..3771e307a 100644 --- a/avr/cores/megacommand/MCL/SeqTrack.cpp +++ b/avr/cores/megacommand/MCL/SeqTrack.cpp @@ -202,27 +202,27 @@ bool SeqTrack::conditional(uint8_t condition) { } break; case 9: - if (random_byte <= 13) { + if (random_byte <= 26) { send_note = true; } break; case 10: - if (random_byte <= 32) { + if (random_byte <= 64) { send_note = true; } break; case 11: - if (random_byte <= 64) { + if (random_byte <= 128) { send_note = true; } break; case 12: - if (random_byte <= 96) { + if (random_byte <= 192) { send_note = true; } break; case 13: - if (random_byte <= 115) { + if (random_byte <= 230) { send_note = true; } break; diff --git a/avr/cores/megacommand/memory.h b/avr/cores/megacommand/memory.h index 475d45052..ee121551a 100644 --- a/avr/cores/megacommand/memory.h +++ b/avr/cores/megacommand/memory.h @@ -176,7 +176,7 @@ FORCED_INLINE() extern inline void put_bank3(volatile void *dst, volatile const extern volatile uint8_t *rand_ptr; FORCED_INLINE() extern inline uint8_t get_random_byte() { - return (pgm_read_byte(rand_ptr++) ^ get_byte_bank1(rand_ptr) ^ slowclock) & 0x7F; + return (pgm_read_byte(rand_ptr++) ^ get_byte_bank1(rand_ptr) ^ slowclock); } extern inline uint8_t get_random(uint8_t range) { return get_random_byte() % range; } From e3e00ebe86a46edefb693809517d0e27cf8340db Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 26 Jul 2023 11:24:35 +1000 Subject: [PATCH 346/413] Load project page rename could be broken --- avr/cores/megacommand/MCL/FileBrowserPage.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/avr/cores/megacommand/MCL/FileBrowserPage.cpp b/avr/cores/megacommand/MCL/FileBrowserPage.cpp index 7e85b6f50..c75245d9a 100644 --- a/avr/cores/megacommand/MCL/FileBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/FileBrowserPage.cpp @@ -94,6 +94,7 @@ void FileBrowserPage::query_filesystem() { file_menu_encoder.max = file_menu_page.menu.get_number_of_items() - 1; DEBUG_PRINTLN("query"); + DEBUG_PRINTLN(lwd); DEBUG_PRINTLN(file_menu_encoder.max); // reset directory pointer @@ -159,6 +160,7 @@ void FileBrowserPage::init() { draw_dirs = false; strcpy(focus_match, ""); file_types.reset(); + SD.chdir(lwd); } void FileBrowserPage::draw_menu() { @@ -525,6 +527,7 @@ bool FileBrowserPage::handleEvent(gui_event_t *event) { } if (EVENT_PRESSED(event, Buttons.BUTTON4)) { + GUI.ignoreNextEvent(event->source); YES: int i_save; _calcindices(i_save); @@ -538,31 +541,32 @@ bool FileBrowserPage::handleEvent(gui_event_t *event) { if (encoders[1]->getValue() == i_save) { on_new(); - return true; + goto fin; } // chdir to parent if ((temp_entry[0] == '.') && (temp_entry[1] == '.')) { _cd_up(); - return true; + goto fin; } // } // chdir to child if (!select_dirs && file.isDirectory()) { _cd(temp_entry); - return true; + goto fin; } } - // if (!dir_only) { GUI.ignoreNextEvent(event->source); on_select(temp_entry); - // } + fin: + //file.close(); return true; } // cancel if (EVENT_PRESSED(event, Buttons.BUTTON1)) { + GUI.ignoreNextEvent(event->source); NO: on_cancel(); return true; From ebaa0f50620f60aa2b7849f229c3fb753f458a3d Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 26 Jul 2023 11:41:19 +1000 Subject: [PATCH 347/413] Regression, file menu would get stuck --- avr/cores/megacommand/MCL/FileBrowserPage.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/avr/cores/megacommand/MCL/FileBrowserPage.cpp b/avr/cores/megacommand/MCL/FileBrowserPage.cpp index c75245d9a..d301d425f 100644 --- a/avr/cores/megacommand/MCL/FileBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/FileBrowserPage.cpp @@ -85,7 +85,7 @@ void FileBrowserPage::query_filesystem() { file_menu_page.menu.enable_entry(FM_NEW_FOLDER, show_new_folder); file_menu_page.menu.enable_entry(FM_DELETE, true); // delete file_menu_page.menu.enable_entry(FM_RENAME, true); // rename - file_menu_page.menu.enable_entry(FM_OVERWRITE, show_overwrite); + file_menu_page.menu.enable_entry(FM_OVERWRITE, false); //show_overwrite); file_menu_page.menu.enable_entry(FM_CANCEL, true); // cancel file_menu_page.menu.enable_entry(FM_RECVALL, false); file_menu_page.menu.enable_entry(FM_SENDALL, false); @@ -516,13 +516,12 @@ bool FileBrowserPage::handleEvent(gui_event_t *event) { encoders[0] = param1; encoders[1] = param2; + filemenu_active = false; if (_handle_filemenu()) { init(); return true; } - filemenu_active = false; selection_change = true; - display(); return true; } From e27279b592f7f1c5ebaac4fdf68113d970d60d90 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 26 Jul 2023 11:58:25 +1000 Subject: [PATCH 348/413] prevent bad page/func callback --- avr/cores/megacommand/MCL/Menu.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/avr/cores/megacommand/MCL/Menu.cpp b/avr/cores/megacommand/MCL/Menu.cpp index 965df5fb3..79731ff6b 100644 --- a/avr/cores/megacommand/MCL/Menu.cpp +++ b/avr/cores/megacommand/MCL/Menu.cpp @@ -20,6 +20,7 @@ bool MenuBase::is_entry_enable(uint8_t entry_index) { menu_function_t MenuBase::get_row_function(uint8_t item_n) { const menu_item_t *item = get_item(item_n); + if (item == nullptr) { return nullptr; } return (menu_function_t)pgm_read_word(menu_target_functions + item->row_function_id); } @@ -62,6 +63,7 @@ PageIndex MenuBase::get_page_callback(uint8_t item_n) { DEBUG_PRINTLN("get page callback"); auto *item = get_item(item_n); DEBUG_PRINTLN(item->page_callback_id); + if (item == nullptr) { return NULL_PAGE; } return (PageIndex) item->page_callback_id; } From 178831513f9fcc7f2503938f5e84829b02604fa6 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 26 Jul 2023 17:17:37 +1000 Subject: [PATCH 349/413] position cursor at MIDI_C3 --- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index db5a6ab32..2cebfce66 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -52,7 +52,7 @@ void SeqExtStepPage::config_encoders() { seq_extparam3.cur = 64; fov_offset = 0; cur_x = 0; - fov_y = 64; + fov_y = MIDI_NOTE_C3 - 1; cur_y = fov_y + 1; cur_w = timing_mid; From 5a6b8929bc041d00ae46fc4303af5e7224fc1272 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 26 Jul 2023 17:43:41 +1000 Subject: [PATCH 350/413] Drop MODE option from Slot Menu, due to confusion --- avr/cores/megacommand/MCL/GridPage.cpp | 15 +- avr/cores/megacommand/resources/R.h | 14 +- .../megacommand/resources/R_menu_layouts.cpp | 745 +++++++++--------- resource/menu_layouts.cpp | 1 - 4 files changed, 383 insertions(+), 392 deletions(-) diff --git a/avr/cores/megacommand/MCL/GridPage.cpp b/avr/cores/megacommand/MCL/GridPage.cpp index 06656c7b1..d872c9e71 100644 --- a/avr/cores/megacommand/MCL/GridPage.cpp +++ b/avr/cores/megacommand/MCL/GridPage.cpp @@ -885,11 +885,16 @@ bool GridPage::handleEvent(gui_event_t *event) { case MDX_KEY_BANKB: case MDX_KEY_BANKC: { mcl_cfg.load_mode = key - MDX_KEY_BANKA + 1; + grid_load_page.display_load(); return true; } case MDX_KEY_NO: { goto next; } + case MDX_KEY_PATSONGKIT: { + set_active_row(grid_task.last_active_row); + return true; + } } } return grid_slot_page.handleEvent(event); @@ -968,7 +973,7 @@ bool GridPage::handleEvent(gui_event_t *event) { return true; } } - } + } } switch (key) { case MDX_KEY_SCALE: { @@ -1081,11 +1086,11 @@ bool GridPage::handleEvent(gui_event_t *event) { slot_apply = 0; old_col = 255; if (!slot.is_ext_track()) { - grid_slot_page.menu.enable_entry(2, true); - grid_slot_page.menu.enable_entry(3, false); - } else { + grid_slot_page.menu.enable_entry(1, true); grid_slot_page.menu.enable_entry(2, false); - grid_slot_page.menu.enable_entry(3, true); + } else { + grid_slot_page.menu.enable_entry(1, false); + grid_slot_page.menu.enable_entry(2, true); } show_slot_menu = true; grid_slot_page.init(); diff --git a/avr/cores/megacommand/resources/R.h b/avr/cores/megacommand/resources/R.h index 335c762c2..821477b57 100644 --- a/avr/cores/megacommand/resources/R.h +++ b/avr/cores/megacommand/resources/R.h @@ -352,10 +352,10 @@ struct __T_menu_layouts { static constexpr size_t sizeofof_wavdesign_menu_layout = 74; union { menu_t slot_menu_layout[0]; - char zz__slot_menu_layout[221]; + char zz__slot_menu_layout[200]; }; - static constexpr size_t countof_slot_menu_layout = 221 / sizeof(menu_t); - static constexpr size_t sizeofof_slot_menu_layout = 221; + static constexpr size_t countof_slot_menu_layout = 200 / sizeof(menu_t); + static constexpr size_t sizeofof_slot_menu_layout = 200; union { menu_t seq_menu_layout[0]; char zz__seq_menu_layout[515]; @@ -382,10 +382,10 @@ struct __T_menu_layouts { static constexpr size_t sizeofof_mdimport_menu_layout = 95; union { menu_t mdconfig_menu_layout[0]; - char zz__mdconfig_menu_layout[74]; + char zz__mdconfig_menu_layout[53]; }; - static constexpr size_t countof_mdconfig_menu_layout = 74 / sizeof(menu_t); - static constexpr size_t sizeofof_mdconfig_menu_layout = 74; + static constexpr size_t countof_mdconfig_menu_layout = 53 / sizeof(menu_t); + static constexpr size_t sizeofof_mdconfig_menu_layout = 53; union { menu_t midimachinedrum_menu_layout[0]; char zz__midimachinedrum_menu_layout[74]; @@ -452,7 +452,7 @@ struct __T_menu_layouts { }; static constexpr size_t countof_boot_menu_layout = 95 / sizeof(menu_t); static constexpr size_t sizeofof_boot_menu_layout = 95; - static constexpr size_t __total_size = 2141; + static constexpr size_t __total_size = 2099; }; extern const unsigned char __R_menu_options[] PROGMEM; diff --git a/avr/cores/megacommand/resources/R_menu_layouts.cpp b/avr/cores/megacommand/resources/R_menu_layouts.cpp index 11c21d72f..79fb8b58d 100644 --- a/avr/cores/megacommand/resources/R_menu_layouts.cpp +++ b/avr/cores/megacommand/resources/R_menu_layouts.cpp @@ -97,564 +97,543 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 2, 31, 52, - 126, + 118, 52, - 77, - 79, - 68, - 69, - 203, - 74, - 246, - 1, - 4, - 3, - 32, - 20, - 237, - 20, 76, - 147, - 107, - 40, - 0, - 88, - 20, 126, + 182, + 19, + 32, + 195, + 21, + 251, + 1, 65, 0, 39, 255, - 214, 6, + 89, 20, - 67, + 12, 129, - 39, + 159, 79, - 216, 79, 80, - 83, - 15, + 96, + 62, + 61, 64, 0, 33, - 119, + 220, 20, 74, 85, 77, - 32, - 126, + 129, + 251, 128, 128, 34, 255, - 219, 4, + 109, 67, 63, - 123, + 236, 65, 82, 58, - 125, - 1, - 219, + 104, + 7, 36, 255, + 109, 44, 67, - 109, + 183, 61, 89, - 204, 84, + 50, 20, - 185, + 230, 37, - 190, + 251, 80, 65, 83, 84, 69, - 192, 41, - 238, + 3, + 184, 38, 20, - 8, - 38, - 3, + 32, + 17, + 15, 20, - 194, 0, 21, - 76, - 216, + 11, + 55, 81, + 96, 13, - 46, - 252, - 194, + 187, + 231, 67, 75, - 92, - 79, + 9, + 71, + 63, 1, 17, 0, - 246, 14, 255, + 254, 3, 0, - 218, - 246, + 68, + 69, 86, 73, 67, + 201, 74, - 79, + 247, 1, 3, 2, - 184, 50, 136, - 37, - 80, - 62, + 4, + 59, + 167, 15, 255, + 217, 4, 48, - 200, 20, - 123, + 15, 9, 1, 16, + 111, 41, - 125, 54, 67, 67, + 176, 58, - 129, 112, - 246, + 62, 133, 5, 17, + 222, 20, - 240, 55, 83, 76, - 172, - 69, + 21, + 48, + 132, 157, - 38, - 18, 219, + 18, 20, 25, + 111, 217, - 127, 80, 69, 71, + 248, 71, 73, 65, - 194, 84, 79, - 125, - 27, + 67, + 104, + 119, 211, - 187, 75, 69, 89, + 96, 63, - 3, - 237, + 125, 12, 12, 19, + 184, 41, - 194, 104, 86, - 254, - 33, + 68, + 233, + 37, 27, - 44, - 40, - 108, - 96, + 225, + 0, + 20, 48, - 184, + 130, 6, + 236, 78, 68, - 64, - 132, - 123, + 21, + 191, + 1, 15, 15, 21, + 110, 20, - 118, 60, 83, + 219, 82, - 216, 69, 21, - 15, + 1, + 252, 7, 7, 22, - 225, 255, 5, 41, + 55, 132, - 188, 71, 84, 72, + 132, 58, - 37, 153, - 251, + 191, 23, 255, 6, 0, + 97, 20, - 11, - 200, + 121, 2, 129, - 227, + 28, 67, 72, - 13, - 108, + 45, + 248, 78, + 146, 108, - 144, - 222, + 27, 16, 24, 255, + 194, 7, 0, - 18, 111, - 31, + 67, 3, + 248, 3, 25, 255, - 194, 8, 27, + 66, 153, - 22, - 238, + 221, 20, 26, + 200, 255, 9, - 64, - 60, + 7, 10, + 132, 30, - 33, 153, - 110, + 45, + 223, 20, - 255, 27, 255, 11, 27, 83, + 225, 72, 73, 70, - 8, 59, - 15, + 1, + 252, 5, 5, 28, - 225, 255, 12, 35, + 43, 174, - 91, 232, + 118, 82, - 181, 83, 43, - 147, + 178, 41, + 127, 29, 255, - 255, 13, 27, 80, 79, + 246, 76, 89, 80, - 182, 72, 235, + 217, 89, - 201, 44, - 183, + 54, 11, 2, + 237, 81, 85, - 108, 167, + 132, 84, - 32, 79, - 115, + 14, 42, - 5, + 96, + 182, 121, - 180, 32, 65, - 43, + 133, 125, + 101, 20, - 46, + 205, 30, - 110, 83, + 194, 79, 85, - 20, 38, - 32, + 132, 144, - 99, + 12, + 107, 129, - 91, 2, + 123, 14, - 218, 70, 73, 169, - 144, - 94, - 91, + 82, + 73, + 11, 72, + 109, 67, - 104, 240, - 194, + 24, 34, - 90, + 75, 2, - 23, + 66, 2, + 225, 87, 32, - 11, 219, + 118, 82, - 176, 46, 20, - 49, - 205, + 6, + 57, 23, + 173, 51, - 107, 200, + 100, 41, - 33, - 25, + 35, 97, - 91, + 43, + 117, 20, - 174, 79, + 212, 198, - 165, 87, - 55, - 107, + 173, + 34, 44, + 97, 41, - 11, - 252, + 127, 67, 86, 32, 65, 76, + 144, 76, - 132, - 181, + 150, 236, - 172, + 181, 156, + 145, 20, - 141, - 208, + 186, 21, 89, - 215, + 26, 49, 77, + 246, 13, - 180, 132, - 46, + 133, 208, + 198, 76, 65, - 53, 17, - 147, + 178, 210, + 109, 13, - 111, 31, + 236, 23, 1, 77, - 100, 208, - 244, + 158, 83, 82, 67, - 201, + 153, 51, + 32, 52, - 1, - 142, + 49, 43, + 205, 171, - 107, 168, + 106, 62, - 82, + 66, 73, - 19, + 103, 44, - 56, - 80, + 10, 7, - 128, + 16, 49, - 198, + 24, 1, + 219, 66, - 222, 45, 147, - 208, + 218, 19, - 204, + 25, 26, + 132, 189, - 38, + 218, 25, - 214, 3, + 203, 94, - 93, + 165, 73, - 40, 146, - 219, + 27, 155, 84, + 96, 31, - 3, - 134, + 112, 33, + 205, 28, - 109, 18, + 183, 77, - 184, 178, 73, 90, - 86, + 10, 167, + 193, 147, - 13, + 182, 8, - 176, 73, 16, - 241, - 165, - 32, - 193, - 145, - 88, - 97, - 71, - 165, - 45, - 221, - 73, + 238, + 52, 32, 77, 73, - 161, - 195, - 102, - 252, + 208, + 174, + 254, + 81, 72, 82, 79, 32, - 123, - 93, - 52, - 63, + 61, + 72, + 159, + 31, 18, 2, 9, + 180, 255, - 107, 4, - 52, - 216, + 59, + 197, 20, - 76, + 9, + 151, 46, - 180, 88, - 173, - 147, - 66, + 84, + 11, + 35, + 71, 97, 20, 55, @@ -663,9 +642,9 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 109, 24, 82, - 190, + 169, 8, - 78, + 57, 47, 80, 248, @@ -675,9 +654,9 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 70, 87, 212, - 230, + 209, 157, - 137, + 116, 7, 182, 31, @@ -695,180 +674,187 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 66, 17, 82, - 179, + 158, 13, 52, 177, 20, 96, 203, - 36, - 126, + 15, + 105, 194, - 81, + 60, 93, 11, 184, 20, 86, 24, - 81, - 113, - 163, - 5, - 15, + 80, + 92, + 161, + 240, + 250, 5, - 171, + 169, 29, - 18, + 253, 131, - 172, + 151, 198, 58, - 131, + 110, 118, 5, 31, - 192, + 214, 7, - 139, - 36, + 250, + 44, 20, - 3, - 153, + 14, 53, - 152, - 41, 102, - 193, + 41, + 97, + 172, + 152, 115, - 28, + 112, 6, - 45, - 61, + 182, + 40, 100, - 139, 41, + 44, 20, - 3, - 183, + 14, 54, + 222, 41, 100, 24, - 182, 80, + 219, 190, 71, - 208, 24, - 237, - 209, + 67, + 188, + 181, 9, - 104, + 186, 220, - 18, - 61, - 221, + 77, + 79, + 102, + 246, 126, + 29, 49, - 109, + 183, 31, 90, - 246, 20, + 216, 73, 239, - 44, + 176, 242, - 24, + 97, 47, - 103, 7, + 158, 20, - 185, + 230, 244, - 135, 21, + 31, 17, - 221, 2, 48, + 116, 20, 24, - 15, - 143, + 61, + 122, 83, - 89, - 187, - 248, + 103, + 166, 85, + 225, 82, 66, 79, - 86, 8, + 89, 221, - 94, + 123, 2, 255, - 214, 78, + 89, 20, - 114, + 201, 50, - 92, + 114, 3, - 146, - 26, + 72, + 107, 13, 58, - 193, 20, - 154, + 6, 55, + 104, 68, - 20, + 81, 102, - 115, - 165, + 205, + 144, 42, - 89, + 100, 136, - 54, + 219, 4, 189, - 193, 84, - 139, - 107, + 6, + 65, + 47, 98, - 192, - 155, - 15, + 89, + 250, + 182, 41, - 111, 56, + 240, 189, - 8, + 130, 194, - 46, + 231, 189, - 120, 26, + 215, + 32, + 98, 66, - 229, - 227, + 70, + 162, + 176, + 97, + 99, 34, - 173, + 152, 131, 59, 12, - 68, + 47, 46, 36, 57, - 89, + 68, 205, 186, 210, @@ -883,161 +869,162 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 11, 20, 1, - 140, + 198, 35, + 0, 35, - 150, + 27, 20, - 3, + 1, + 185, 38, - 115, 3, + 205, 38, - 155, 136, + 195, 65, - 134, 71, 242, - 182, + 91, 76, 70, 75, - 178, - 252, - 221, + 89, + 231, + 110, 168, + 167, 1, - 79, - 34, + 13, + 236, 65, - 216, 85, 88, 31, - 217, + 108, 83, 41, - 246, + 251, 97, 103, 101, 34, - 92, + 46, 31, - 51, + 25, 198, + 150, 164, - 44, - 45, + 22, 165, 65, - 174, + 215, 97, 121, - 133, + 66, 74, 189, - 24, - 201, - 52, + 140, + 180, + 26, 25, - 139, - 224, + 69, + 203, + 133, 19, - 11, - 108, + 182, 252, 2, - 98, + 49, 89, - 194, + 97, 200, - 238, + 119, 26, 158, - 141, + 70, 65, 139, - 104, + 180, 129, + 10, + 62, + 149, 21, - 83, - 43, - 42, + 135, 183, - 14, 27, - 192, + 96, 125, - 89, + 44, 41, - 52, + 154, 29, - 134, - 181, - 192, + 67, + 160, + 96, 62, - 196, - 236, - 146, + 98, + 118, + 104, 101, - 22, + 11, 136, - 17, - 56, + 8, + 156, 0, 66, - 214, + 107, 161, 14, - 14, + 7, 79, 83, - 22, + 11, 184, 80, - 24, + 12, 52, - 106, + 53, 49, - 73, - 161, - 111, + 36, + 140, + 183, 127, 68, 70, + 140, 85, - 24, 68, - 164, - 182, - 5, - 163, + 82, + 161, + 2, + 209, 169, + 235, 237, - 215, - 46, - 88, + 25, + 172, 75, 20, - 12, + 6, 28, - 91, - 7, + 37, + 221, + 173, 88, - 90, - 133, - 146, - 224, - 23, + 112, + 73, + 203, + 11, 169, + 128, 0, 0, 0, 0, - 0, - 2, - 127, + 1, + 63, 255, }; diff --git a/resource/menu_layouts.cpp b/resource/menu_layouts.cpp index 540a52943..5c0da1f78 100644 --- a/resource/menu_layouts.cpp +++ b/resource/menu_layouts.cpp @@ -221,7 +221,6 @@ menu_t slot_menu_layout = { { // m r n d p f o {"GRID: ", 0, 2, 2, 31, NULL_PAGE, 0, 52}, - {"MODE:", 1, 4, 3, 32, NULL_PAGE, 0, 20}, // for non-ext tracks {"LEN: ", 1, 65, 0, 39, NULL_PAGE, 0, 0}, // for ext tracks From a67cbb1a6ee34e1beea979685e8ad89dca5694b3 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 26 Jul 2023 18:27:16 +1000 Subject: [PATCH 351/413] Display load mode on MD when toggling from slot menu --- avr/cores/megacommand/MCL/GridLoadPage.cpp | 15 ++++++++------- avr/cores/megacommand/MCL/GridLoadPage.h | 4 ++-- avr/cores/megacommand/MCL/MCLMenus.h | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/avr/cores/megacommand/MCL/GridLoadPage.cpp b/avr/cores/megacommand/MCL/GridLoadPage.cpp index 1b9105b60..714f72768 100644 --- a/avr/cores/megacommand/MCL/GridLoadPage.cpp +++ b/avr/cores/megacommand/MCL/GridLoadPage.cpp @@ -7,17 +7,18 @@ void GridLoadPage::init() { note_interface.init_notes(); trig_interface.send_md_leds(TRIGLED_OVERLAY); trig_interface.on(); - draw_popup_title(); // GUI.display(); encoders[0]->cur = mcl_cfg.load_mode; encoders[1]->cur = mcl_cfg.chain_queue_length; encoders[3]->cur = mcl_cfg.chain_load_quant; + + draw_popup_title(mcl_cfg.load_mode); } void GridLoadPage::setup() {} -void GridLoadPage::get_mode_str(char *str) { - switch (encoders[0]->cur) { +void GridLoadPage::get_mode_str(char *str, uint8_t mode) { + switch (mode) { case LOAD_MANUAL: { strcpy(str, "MANUAL"); break; @@ -34,10 +35,10 @@ void GridLoadPage::get_mode_str(char *str) { } } } -void GridLoadPage::draw_popup_title() { +void GridLoadPage::draw_popup_title(uint8_t mode, bool persistent) { char modestr[16] = "LOAD "; - get_mode_str(modestr + 5); - MD.popup_text(modestr, true); + get_mode_str(modestr + 5, mode); + MD.popup_text(modestr, persistent); } void GridLoadPage::draw_popup() { @@ -67,7 +68,7 @@ void GridLoadPage::display_load() { void GridLoadPage::loop() { if (encoders[0]->hasChanged()) { mcl_cfg.load_mode = encoders[0]->cur; - draw_popup_title(); + draw_popup_title(mcl_cfg.load_mode); } if (encoders[1]->hasChanged()) { if (encoders[0]->cur == LOAD_QUEUE) { diff --git a/avr/cores/megacommand/MCL/GridLoadPage.h b/avr/cores/megacommand/MCL/GridLoadPage.h index a402c29f9..f0c88e574 100644 --- a/avr/cores/megacommand/MCL/GridLoadPage.h +++ b/avr/cores/megacommand/MCL/GridLoadPage.h @@ -17,10 +17,10 @@ class GridLoadPage : public GridIOPage { void group_select(); void group_load(uint8_t row, bool silent = false); bool handleEvent(gui_event_t *event); - void get_mode_str(char *str); + void get_mode_str(char *str, uint8_t mode); void display_load(); void draw_popup(); - void draw_popup_title(); + void draw_popup_title(uint8_t mode, bool persistent = true); void loop(); void display(); void action() { load(); } diff --git a/avr/cores/megacommand/MCL/MCLMenus.h b/avr/cores/megacommand/MCL/MCLMenus.h index 583b01f92..fc25de8cb 100644 --- a/avr/cores/megacommand/MCL/MCLMenus.h +++ b/avr/cores/megacommand/MCL/MCLMenus.h @@ -97,7 +97,7 @@ extern MenuPage seq_menu_page; extern MCLEncoder grid_slot_param1; extern MCLEncoder grid_slot_param2; -constexpr size_t grid_slot_page_N = 10; +constexpr size_t grid_slot_page_N = 9; extern MenuPage grid_slot_page; extern MCLEncoder wavdesign_menu_value_encoder; From 2b08ac41e482cd14bbf40cdad4d4b989082f15e5 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 26 Jul 2023 18:27:36 +1000 Subject: [PATCH 352/413] PERFORMANCE --- .../megacommand/resources/R_page_entries.cpp | 115 +++++++++--------- resource/page_entries.cpp | 2 +- 2 files changed, 61 insertions(+), 56 deletions(-) diff --git a/avr/cores/megacommand/resources/R_page_entries.cpp b/avr/cores/megacommand/resources/R_page_entries.cpp index 6a8bad035..ac0d81835 100644 --- a/avr/cores/megacommand/resources/R_page_entries.cpp +++ b/avr/cores/megacommand/resources/R_page_entries.cpp @@ -30,177 +30,182 @@ const unsigned char __R_page_entries[] PROGMEM = { 80, 20, 70, - 96, - 42, - 123, + 254, + 79, + 82, + 77, + 65, + 78, + 67, + 69, + 199, + 22, 40, 2, - 22, - 109, + 45, 18, + 191, 6, - 251, 82, 79, 85, 84, 69, - 22, - 1, - 203, + 96, + 45, + 59, 21, 3, - 14, + 22, 109, + 14, 6, + 183, 83, - 191, 20, 80, 32, + 246, 69, 68, 73, - 176, 84, 22, - 126, + 15, 7, 4, 1, + 219, 24, 21, - 222, 6, 76, - 70, - 79, - 194, + 107, + 66, 111, - 118, + 9, + 219, 22, 5, 22, - 221, 24, + 117, 91, 73, - 246, - 65, - 78, + 187, + 86, 79, 32, 74, - 236, + 118, 76, 76, 22, - 242, + 121, 8, 6, - 219, + 109, 25, 6, + 218, 67, - 183, 72, 18, - 77, - 65, - 236, + 222, + 112, 84, 73, 67, + 193, 45, - 29, + 216, 9, 7, - 143, 22, + 255, 83, 65, 77, - 251, 80, 76, 69, 32, - 77, - 51, - 119, + 118, + 138, 65, 71, + 254, 169, - 247, 12, 8, 2, - 22, 255, + 22, 87, 65, 86, 32, + 253, 68, 69, 83, - 236, 73, 71, 78, + 158, 190, - 246, 18, 9, + 219, 22, - 218, 19, 6, - 222, + 91, 18, 76, + 216, 65, 89, - 192, 114, - 123, + 15, 16, 12, 3, + 127, 45, - 251, 82, 69, 86, + 109, 38, - 108, 66, + 151, 22, - 188, 17, + 147, 13, - 155, + 110, 91, - 118, 45, 49, + 192, 45, - 3, + 118, 23, - 178, 14, 22, - 97, + 76, 50, + 33, 39, - 9, - 98, + 44, 22, + 64, 0, 0, 0, 0, - 0, - 9, + 1, + 63, 255, }; diff --git a/resource/page_entries.cpp b/resource/page_entries.cpp index f504d3fdb..967575d87 100644 --- a/resource/page_entries.cpp +++ b/resource/page_entries.cpp @@ -4,7 +4,7 @@ PageSelectEntry Entries[] = { {"GRID", GRID_PAGE, 0, 0, 24, 15, nullptr}, {"MIXER", MIXER_PAGE, 1, 0, 24, 16, nullptr}, - {"PERF", PERF_PAGE_0, 2, 0, 24, 18, nullptr}, + {"PERFORMANCE", PERF_PAGE_0, 2, 0, 24, 18, nullptr}, {"ROUTE", ROUTE_PAGE, 3, 0, 24, 14, nullptr}, {"STEP EDIT", SEQ_STEP_PAGE, 4, 1, 24, 21, nullptr}, From 3d52d649ce510b3ec3ef4fea0f5091dc6cc0815d Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 26 Jul 2023 18:30:42 +1000 Subject: [PATCH 353/413] Back to PERF --- .../megacommand/resources/R_page_entries.cpp | 115 +++++++++--------- resource/page_entries.cpp | 2 +- 2 files changed, 56 insertions(+), 61 deletions(-) diff --git a/avr/cores/megacommand/resources/R_page_entries.cpp b/avr/cores/megacommand/resources/R_page_entries.cpp index ac0d81835..6a8bad035 100644 --- a/avr/cores/megacommand/resources/R_page_entries.cpp +++ b/avr/cores/megacommand/resources/R_page_entries.cpp @@ -30,182 +30,177 @@ const unsigned char __R_page_entries[] PROGMEM = { 80, 20, 70, - 254, - 79, - 82, - 77, - 65, - 78, - 67, - 69, - 199, - 22, + 96, + 42, + 123, 40, 2, - 45, + 22, + 109, 18, - 191, 6, + 251, 82, 79, 85, 84, 69, - 96, - 45, - 59, + 22, + 1, + 203, 21, 3, - 22, - 109, 14, + 109, 6, - 183, 83, + 191, 20, 80, 32, - 246, 69, 68, 73, + 176, 84, 22, - 15, + 126, 7, 4, 1, - 219, 24, 21, + 222, 6, 76, - 107, - 66, + 70, + 79, + 194, 111, - 9, - 219, + 118, 22, 5, 22, + 221, 24, - 117, 91, 73, - 187, - 86, + 246, + 65, + 78, 79, 32, 74, - 118, + 236, 76, 76, 22, - 121, + 242, 8, 6, - 109, + 219, 25, 6, - 218, 67, + 183, 72, 18, - 222, - 112, + 77, + 65, + 236, 84, 73, 67, - 193, 45, - 216, + 29, 9, 7, + 143, 22, - 255, 83, 65, 77, + 251, 80, 76, 69, 32, - 118, - 138, + 77, + 51, + 119, 65, 71, - 254, 169, + 247, 12, 8, 2, - 255, 22, + 255, 87, 65, 86, 32, - 253, 68, 69, 83, + 236, 73, 71, 78, - 158, 190, + 246, 18, 9, - 219, 22, + 218, 19, 6, - 91, + 222, 18, 76, - 216, 65, 89, + 192, 114, - 15, + 123, 16, 12, 3, - 127, 45, + 251, 82, 69, 86, - 109, 38, + 108, 66, - 151, 22, + 188, 17, - 147, 13, - 110, + 155, 91, + 118, 45, 49, - 192, 45, - 118, + 3, 23, + 178, 14, 22, - 76, + 97, 50, - 33, 39, - 44, + 9, + 98, 22, - 64, 0, 0, 0, 0, - 1, - 63, + 0, + 9, 255, }; diff --git a/resource/page_entries.cpp b/resource/page_entries.cpp index 967575d87..f504d3fdb 100644 --- a/resource/page_entries.cpp +++ b/resource/page_entries.cpp @@ -4,7 +4,7 @@ PageSelectEntry Entries[] = { {"GRID", GRID_PAGE, 0, 0, 24, 15, nullptr}, {"MIXER", MIXER_PAGE, 1, 0, 24, 16, nullptr}, - {"PERFORMANCE", PERF_PAGE_0, 2, 0, 24, 18, nullptr}, + {"PERF", PERF_PAGE_0, 2, 0, 24, 18, nullptr}, {"ROUTE", ROUTE_PAGE, 3, 0, 24, 14, nullptr}, {"STEP EDIT", SEQ_STEP_PAGE, 4, 1, 24, 21, nullptr}, From ed350d3c5e9b35f4615cf536359e2b40fbee29e1 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 26 Jul 2023 18:30:59 +1000 Subject: [PATCH 354/413] make not persistent --- avr/cores/megacommand/MCL/GridPage.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/GridPage.cpp b/avr/cores/megacommand/MCL/GridPage.cpp index d872c9e71..9ad661bd9 100644 --- a/avr/cores/megacommand/MCL/GridPage.cpp +++ b/avr/cores/megacommand/MCL/GridPage.cpp @@ -885,7 +885,8 @@ bool GridPage::handleEvent(gui_event_t *event) { case MDX_KEY_BANKB: case MDX_KEY_BANKC: { mcl_cfg.load_mode = key - MDX_KEY_BANKA + 1; - grid_load_page.display_load(); + bool persistent = false; + grid_load_page.draw_popup_title(mcl_cfg.load_mode, persistent); return true; } case MDX_KEY_NO: { From 0c053358077e2da4e5ffd86cf7ca5d5d66807946 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 26 Jul 2023 18:57:46 +1000 Subject: [PATCH 355/413] LFO YES NO --- avr/cores/megacommand/MCL/LFOPage.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/avr/cores/megacommand/MCL/LFOPage.cpp b/avr/cores/megacommand/MCL/LFOPage.cpp index 17f0e02db..75bc3ad5b 100644 --- a/avr/cores/megacommand/MCL/LFOPage.cpp +++ b/avr/cores/megacommand/MCL/LFOPage.cpp @@ -302,6 +302,14 @@ bool LFOPage::handleEvent(gui_event_t *event) { uint8_t key = event->source - 64; if (event->mask == EVENT_BUTTON_PRESSED) { switch (key) { + case MDX_KEY_YES: { + lfo_track->enable = true; + break; + } + case MDX_KEY_NO: { + lfo_track->enable = false; + break; + } case MDX_KEY_UP: { if (page_mode < LFO_OFFSET) { page_mode++; From 6e3ccd1dd1fb9a6f1e486403a64d3b6381a524b0 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 26 Jul 2023 19:00:05 +1000 Subject: [PATCH 356/413] making loading silent --- avr/cores/megacommand/MCL/GridLoadPage.cpp | 10 +++++----- avr/cores/megacommand/MCL/GridLoadPage.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/avr/cores/megacommand/MCL/GridLoadPage.cpp b/avr/cores/megacommand/MCL/GridLoadPage.cpp index 714f72768..ad30cfa8d 100644 --- a/avr/cores/megacommand/MCL/GridLoadPage.cpp +++ b/avr/cores/megacommand/MCL/GridLoadPage.cpp @@ -183,7 +183,7 @@ void GridLoadPage::display() { oled_display.setFont(oldfont); } void GridLoadPage::load() { - display_load(); + //display_load(); // oled_display.display(); /// !Note, note_off_event has reentry issues, so we have to first set /// the page to avoid driving this code path again. @@ -214,15 +214,15 @@ void GridLoadPage::group_select() { MD.set_trigleds(mcl_cfg.track_type_select, TRIGLED_EXCLUSIVE); } -void GridLoadPage::group_load(uint8_t row, bool silent) { +void GridLoadPage::group_load(uint8_t row) { if (row >= GRID_LENGTH) { return; } uint8_t track_select_array[NUM_SLOTS] = {0}; track_select_array_from_type_select(track_select_array); // load_tracks_to_md(-1); - if (!silent) { - oled_display.textbox("LOAD GROUPS", ""); - } + // if (!silent) { + // oled_display.textbox("LOAD GROUPS", ""); + // } //oled_display.display(); mcl_actions.write_original = 1; diff --git a/avr/cores/megacommand/MCL/GridLoadPage.h b/avr/cores/megacommand/MCL/GridLoadPage.h index f0c88e574..5f9f6c10f 100644 --- a/avr/cores/megacommand/MCL/GridLoadPage.h +++ b/avr/cores/megacommand/MCL/GridLoadPage.h @@ -15,7 +15,7 @@ class GridLoadPage : public GridIOPage { void get_modestr(char *modestr); void load(); void group_select(); - void group_load(uint8_t row, bool silent = false); + void group_load(uint8_t row); bool handleEvent(gui_event_t *event); void get_mode_str(char *str, uint8_t mode); void display_load(); From 9abee9c816079a129fe920e51c3f9600f5569f56 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 26 Jul 2023 21:42:29 +1000 Subject: [PATCH 357/413] wav designer keys --- avr/cores/megacommand/MCL/OscPage.cpp | 11 +++++++++++ avr/cores/megacommand/MCL/WavDesignerPage.cpp | 10 ++-------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/avr/cores/megacommand/MCL/OscPage.cpp b/avr/cores/megacommand/MCL/OscPage.cpp index 3da53f88d..3f5259424 100644 --- a/avr/cores/megacommand/MCL/OscPage.cpp +++ b/avr/cores/megacommand/MCL/OscPage.cpp @@ -45,6 +45,17 @@ bool OscPage::handleEvent(gui_event_t *event) { } trig_interface.send_md_leds(TRIGLED_OVERLAY); } + if (EVENT_CMD(event)) { + uint8_t key = event->source - 64; + if (event->mask == EVENT_BUTTON_PRESSED) { + switch (key) { + case MDX_KEY_NO: + // trig_interface.ignoreNextEvent(MDX_KEY_NO); + show_freq = !show_freq; + return true; + } + } + } if (EVENT_PRESSED(event, Buttons.BUTTON1)) { show_freq = !show_freq; } diff --git a/avr/cores/megacommand/MCL/WavDesignerPage.cpp b/avr/cores/megacommand/MCL/WavDesignerPage.cpp index 4afbaf1b8..0479369c0 100644 --- a/avr/cores/megacommand/MCL/WavDesignerPage.cpp +++ b/avr/cores/megacommand/MCL/WavDesignerPage.cpp @@ -49,16 +49,10 @@ bool WavDesignerPage::handleEvent(gui_event_t *event) { uint8_t inc = 1; // if (show_menu) { switch (key) { - case MDX_KEY_YES: - // trig_interface.ignoreNextEvent(MDX_KEY_YES); - return true; - case MDX_KEY_NO: - // trig_interface.ignoreNextEvent(MDX_KEY_NO); - return true; - case MDX_KEY_UP: + case MDX_KEY_DOWN: encoders[1]->cur -= inc; break; - case MDX_KEY_DOWN: + case MDX_KEY_UP: encoders[1]->cur += inc; break; case MDX_KEY_LEFT: From b707042a96507cb7ee0385abd9051d515fccdd32 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Wed, 26 Jul 2023 22:38:21 +1000 Subject: [PATCH 358/413] track type select default MD + MIDI --- avr/cores/megacommand/MCL/MCLSysConfig.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/MCLSysConfig.cpp b/avr/cores/megacommand/MCL/MCLSysConfig.cpp index e915906fa..0564bbd4c 100644 --- a/avr/cores/megacommand/MCL/MCLSysConfig.cpp +++ b/avr/cores/megacommand/MCL/MCLSysConfig.cpp @@ -141,7 +141,7 @@ bool MCLSysConfig::cfg_init() { chain_load_quant = 16; ram_page_mode = 0; track_select = 1; - track_type_select = 0b00000101; + track_type_select = 0b00000011; uart2_device = 0; uart_cc_loopback = 0; uart2_prg_mode = 0; From f46546b131c0bc011804c215430dccba20a390fe Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 27 Jul 2023 20:01:09 +1000 Subject: [PATCH 359/413] ExtSeqTrack set_speed to behave as MDTrack.set_speed --- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 16 ++++++++++------ avr/cores/megacommand/MCL/ExtSeqTrack.h | 2 +- avr/cores/megacommand/MCL/MDTrackSelect.cpp | 4 ++-- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index 66270b39b..73ab2e0cd 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -1,13 +1,17 @@ #include "MCL_impl.h" uint8_t ExtSeqTrack::epoch = 0; -void ExtSeqTrack::set_speed(uint8_t _speed) { - uint8_t old_speed = speed; - float mult = get_speed_multiplier(_speed) / get_speed_multiplier(old_speed); - for (uint16_t i = 0; i < event_count; i++) { - events[i].micro_timing = round(mult * (float)events[i].micro_timing); +void ExtSeqTrack::set_speed(uint8_t new_speed, uint8_t old_speed, bool timing_adjust) { + if (old_speed == 255) { + old_speed = speed; + } + if (timing_adjust) { + float mult = get_speed_multiplier(new_speed) / get_speed_multiplier(old_speed); + for (uint16_t i = 0; i < event_count; i++) { + events[i].micro_timing = round(mult * (float)events[i].micro_timing); + } } - speed = _speed; + speed = new_speed; uint8_t timing_mid = get_timing_mid(); if (mod12_counter > timing_mid) { mod12_counter = mod12_counter - (mod12_counter / timing_mid) * timing_mid; diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.h b/avr/cores/megacommand/MCL/ExtSeqTrack.h index 85efd681e..8aacaa725 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.h +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.h @@ -298,7 +298,7 @@ class ExtSeqTrack : public ExtSeqTrackData, public SeqSlideTrack { void modify_track(uint8_t dir); - void set_speed(uint8_t _speed); + void set_speed(uint8_t new_speed, uint8_t old_speed = 255, bool timing_adjust = true); }; #endif /* EXTSEQTRACK_H__ */ diff --git a/avr/cores/megacommand/MCL/MDTrackSelect.cpp b/avr/cores/megacommand/MCL/MDTrackSelect.cpp index 161b2bf60..c5cec1935 100644 --- a/avr/cores/megacommand/MCL/MDTrackSelect.cpp +++ b/avr/cores/megacommand/MCL/MDTrackSelect.cpp @@ -98,7 +98,7 @@ void MDTrackSelect::end() { mcl_seq.md_tracks[n].set_speed(new_speed, 255, false); } else { - mcl_seq.ext_tracks[n].set_speed(new_speed); + mcl_seq.ext_tracks[n].set_speed(new_speed, 255, false); if (last_ext_track == n) { seq_extparam4.cur = length; } } seq_track->mute_state = SEQ_MUTE_ON; @@ -112,7 +112,7 @@ void MDTrackSelect::end() { mcl_seq.md_tracks[n].set_speed(new_speed, old_speeds[n], true); } else { - mcl_seq.ext_tracks[n].set_speed(new_speed); + mcl_seq.ext_tracks[n].set_speed(new_speed, old_speeds[n], true); } seq_track->mute_state = old_mutes[n]; } From 4be1b795fd084912973dc2772e14284de3e82dbc Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 27 Jul 2023 20:01:44 +1000 Subject: [PATCH 360/413] get_speed_multiplier uint8_t version, experimental --- avr/cores/megacommand/MCL/SeqTrack.h | 40 ++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/avr/cores/megacommand/MCL/SeqTrack.h b/avr/cores/megacommand/MCL/SeqTrack.h index b86d589f4..0c997e1eb 100644 --- a/avr/cores/megacommand/MCL/SeqTrack.h +++ b/avr/cores/megacommand/MCL/SeqTrack.h @@ -186,6 +186,46 @@ class SeqTrackBase { float get_speed_multiplier() { return get_speed_multiplier(speed); } + void get_speed_multiplier(uint8_t speed_, uint8_t &n, uint8_t &d) { + n = 1; + d = 1; + switch (speed_) { + default: + case SEQ_SPEED_1X: + //n = 1; + //d = 1; + break; + case SEQ_SPEED_2X: + //n = 1; + d = 2; + break; + case SEQ_SPEED_4X: + //n = 1; + d = 4; + break; + case SEQ_SPEED_3_4X: + n = 4; + d = 3; + break; + case SEQ_SPEED_3_2X: + n = 2; + d = 3; + break; + case SEQ_SPEED_1_2X: + n = 2; + //d = 1; + break; + case SEQ_SPEED_1_4X: + n = 4; + //d = 1; + break; + case SEQ_SPEED_1_8X: + n = 8; + //d = 1; + break; + } + } + float get_speed_multiplier(uint8_t speed_) { float multi; switch (speed_) { From 4ac0e4cdba86cf1286faf0122f27278bea1dcb9c Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 27 Jul 2023 20:13:43 +1000 Subject: [PATCH 361/413] If not on PianoRoll or Chromatic Pages then clear should apply to MD only --- avr/cores/megacommand/MCL/SeqPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index 764674031..00c784a13 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -706,7 +706,7 @@ void opt_clear_track_handler() { COPY: copy = true; } - if (SeqPage::midi_device == &MD) { + if (SeqPage::midi_device == &MD || !(mcl.currentPage() == SEQ_PTC_PAGE || mcl.currentPage() == SEQ_EXTSTEP_PAGE)) { if (opt_clear == 2) { MD.popup_text(2); From 1d8fe4f37b225e1a0876779077e18a74a5982d1b Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 27 Jul 2023 20:24:48 +1000 Subject: [PATCH 362/413] Consolidate length handling routines in to one --- avr/cores/megacommand/MCL/SeqPage.cpp | 48 ++++++++++++--------------- avr/cores/megacommand/MCL/SeqPage.h | 1 + 2 files changed, 22 insertions(+), 27 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index 00c784a13..3b3baaebb 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -580,60 +580,54 @@ void SeqPage::draw_knob_timing(uint8_t timing, uint8_t timing_mid) { draw_knob(1, "UTIM", K); } -void pattern_len_handler(EncoderParent *enc) { - MCLEncoder *enc_ = (MCLEncoder *)enc; - if (!enc_->hasChanged()) { - return; - } +void SeqPage::length_handler(uint8_t length, bool multi) { bool is_poly = IS_BIT_SET16(mcl_cfg.poly_mask, last_md_track); if (SeqPage::midi_device == &MD) { - if (BUTTON_DOWN(Buttons.BUTTON4)) { + if (multi) { for (uint8_t c = 0; c < 16; c++) { - mcl_seq.md_tracks[c].set_length(enc_->cur); + mcl_seq.md_tracks[c].set_length(length); } - GUI.ignoreNextEvent(Buttons.BUTTON4); } else { if ((mcl_cfg.poly_mask) && (is_poly)) { for (uint8_t c = 0; c < 16; c++) { if (IS_BIT_SET16(mcl_cfg.poly_mask, c)) { - mcl_seq.md_tracks[c].set_length(enc_->cur); + mcl_seq.md_tracks[c].set_length(length); } } } else { - mcl_seq.md_tracks[last_md_track].set_length(enc_->cur); + mcl_seq.md_tracks[last_md_track].set_length(length); } } auto &active_track = mcl_seq.md_tracks[last_md_track]; MD.sync_seqtrack(active_track.length, active_track.speed, active_track.step_count); } else { - if (BUTTON_DOWN(Buttons.BUTTON4)) { + if (multi) { for (uint8_t c = 0; c < NUM_EXT_TRACKS; c++) { - mcl_seq.ext_tracks[c].set_length(enc_->cur); - if (last_ext_track == c) { seq_extparam4.cur = enc_->cur; } + mcl_seq.ext_tracks[c].set_length(length); + if (last_ext_track == c) { seq_extparam4.cur = length; } } - GUI.ignoreNextEvent(Buttons.BUTTON4); } else { mcl_seq.ext_tracks[last_ext_track].buffer_notesoff(); - mcl_seq.ext_tracks[last_ext_track].set_length(enc_->cur); - seq_extparam4.cur = enc_->cur; + mcl_seq.ext_tracks[last_ext_track].set_length(length); + seq_extparam4.cur = length; } } } -void opt_length_handler() { - if (SeqPage::midi_device == &MD) { - auto &active_track = mcl_seq.md_tracks[last_md_track]; - active_track.set_length(opt_length); - MD.sync_seqtrack(active_track.length, active_track.speed, - active_track.step_count); - } else { - opt_length = max(opt_length, 2); - mcl_seq.ext_tracks[last_ext_track].buffer_notesoff(); - mcl_seq.ext_tracks[last_ext_track].set_length(opt_length); - seq_extparam4.cur = opt_length; + +void pattern_len_handler(EncoderParent *enc) { + MCLEncoder *enc_ = (MCLEncoder *)enc; + if (!enc_->hasChanged()) { + return; } + seq_step_page.length_handler(enc_->cur, BUTTON_DOWN(Buttons.BUTTON4)); + GUI.ignoreNextEvent(Buttons.BUTTON4); +} + +void opt_length_handler() { + seq_step_page.length_handler(opt_length); } void opt_channel_handler() { diff --git a/avr/cores/megacommand/MCL/SeqPage.h b/avr/cores/megacommand/MCL/SeqPage.h index 423dcf87b..8be0863ff 100644 --- a/avr/cores/megacommand/MCL/SeqPage.h +++ b/avr/cores/megacommand/MCL/SeqPage.h @@ -146,6 +146,7 @@ class SeqPage : public LightPage { void toggle_ext_mask(uint8_t track); void params_reset(); + void length_handler(uint8_t length, bool multi = false); bool display_mute_mask(MidiDevice *device, uint8_t offset = 0); From 1ba869e2d7aaf39e71a3612c2fe30ea562eb1367 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 27 Jul 2023 20:31:42 +1000 Subject: [PATCH 363/413] notes off when shrinking length of ext tracks --- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index 73ab2e0cd..71faf66c2 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -62,6 +62,9 @@ void ExtSeqTrack::set_length(uint8_t len, bool expand) { if (a == old_length) { a = 0; } } } + else if (length < old_length) { + buffer_notesoff(); + } } From 4e52946d8885fbd365420e12637bda797f8476cb Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 27 Jul 2023 23:21:53 +1000 Subject: [PATCH 364/413] init perftrack data on transition --- avr/cores/megacommand/MCL/PerfTrack.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/avr/cores/megacommand/MCL/PerfTrack.h b/avr/cores/megacommand/MCL/PerfTrack.h index 7b3dc93b4..4eb5160b8 100644 --- a/avr/cores/megacommand/MCL/PerfTrack.h +++ b/avr/cores/megacommand/MCL/PerfTrack.h @@ -41,6 +41,10 @@ class PerfTrack : public AUXTrack, public PerfTrackData { static_assert(sizeof(PerfTrack) <= PERF_TRACK_LEN); } + virtual void init(uint8_t tracknumber, SeqTrack *seq_track) { + init(); + } + void init() { for (uint8_t n = 0; n < NUM_SCENES; n++) { if (n < 4) { From c4f2ea8bc70201a979ab3e903bef9b1b34074e57 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 27 Jul 2023 23:42:39 +1000 Subject: [PATCH 365/413] load_immediate_cleared for MDTrack and MNMTrack on load with sequencer stop, load up empty data for auxillary tracks. --- avr/cores/megacommand/MCL/GridTrack.h | 3 +++ avr/cores/megacommand/MCL/MCLActions.cpp | 9 +++++---- avr/cores/megacommand/MCL/MDTrack.cpp | 5 +++++ avr/cores/megacommand/MCL/MDTrack.h | 3 +++ avr/cores/megacommand/MCL/MNMTrack.cpp | 5 +++++ avr/cores/megacommand/MCL/MNMTrack.h | 1 + avr/cores/megacommand/MCL/SeqPage.cpp | 1 - 7 files changed, 22 insertions(+), 5 deletions(-) diff --git a/avr/cores/megacommand/MCL/GridTrack.h b/avr/cores/megacommand/MCL/GridTrack.h index cec77929c..a9b4fe1a5 100644 --- a/avr/cores/megacommand/MCL/GridTrack.h +++ b/avr/cores/megacommand/MCL/GridTrack.h @@ -86,7 +86,10 @@ class GridTrack { void load_link_data(SeqTrack *seq_track); virtual void init(uint8_t tracknumber, SeqTrack *seq_track) {} + virtual void load_immediate(uint8_t tracknumber, SeqTrack *seq_track) {} + virtual void load_immediate_cleared(uint8_t tracknumber, SeqTrack *seq_track) { load_immediate(tracknumber, seq_track); } + virtual bool transition_cache(uint8_t tracknumber, uint8_t slotnumber) { return false; } virtual void transition_send(uint8_t tracknumber, uint8_t slotnumber) {} virtual void transition_load(uint8_t tracknumber, SeqTrack* seq_track, uint8_t slotnumber); diff --git a/avr/cores/megacommand/MCL/MCLActions.cpp b/avr/cores/megacommand/MCL/MCLActions.cpp index df85ee5dc..197964bf2 100644 --- a/avr/cores/megacommand/MCL/MCLActions.cpp +++ b/avr/cores/megacommand/MCL/MCLActions.cpp @@ -510,16 +510,17 @@ bool MCLActions::load_track(uint8_t track_idx, uint8_t row, uint8_t pos, DEBUG_PRINTLN(pos); ptrack->init_track_type(gdt->track_type); ptrack->init(track_idx, gdt->seq_track); - ptrack->load_seq_data(gdt->seq_track); } else { if (ptrack->get_parent_model() == gdt->track_type && ptrack->allow_cast_to_parent()) { ptrack->init_track_type(ptrack->get_parent_model()); } - DEBUG_PRINTLN("load immediate track"); - ptrack->load_immediate(track_idx, gdt->seq_track); - ptrack->store_in_mem(gdt->mem_slot_idx); send_masks[pos] = 1; } + if (ptrack != nullptr) { + ptrack->load_immediate_cleared(track_idx, gdt->seq_track); + ptrack->store_in_mem(gdt->mem_slot_idx); + } + return true; } diff --git a/avr/cores/megacommand/MCL/MDTrack.cpp b/avr/cores/megacommand/MCL/MDTrack.cpp index 558e41ebb..7004dde62 100644 --- a/avr/cores/megacommand/MCL/MDTrack.cpp +++ b/avr/cores/megacommand/MCL/MDTrack.cpp @@ -78,6 +78,11 @@ void MDTrack::load_immediate(uint8_t tracknumber, SeqTrack *seq_track) { load_seq_data(seq_track); } +void MDTrack::load_immediate_cleared(uint8_t tracknumber, SeqTrack *seq_track) { + DEBUG_PRINTLN("load immediate"); + load_seq_data(seq_track); +} + void MDTrack::get_machine_from_kit(uint8_t tracknumber) { // trackName[0] = '\0'; memcpy(machine.params, MD.kit.params[tracknumber], 24); diff --git a/avr/cores/megacommand/MCL/MDTrack.h b/avr/cores/megacommand/MCL/MDTrack.h index 4bb1c880b..b7ea5ab3a 100644 --- a/avr/cores/megacommand/MCL/MDTrack.h +++ b/avr/cores/megacommand/MCL/MDTrack.h @@ -91,6 +91,9 @@ class MDTrack : public DeviceTrack { SeqTrack *seq_track = nullptr, uint8_t merge = 0, bool online = false, Grid *grid = nullptr); void load_immediate(uint8_t tracknumber, SeqTrack *seq_track); + + void load_immediate_cleared(uint8_t tracknumber, SeqTrack *seq_track); + void paste_track(uint8_t src_track, uint8_t dest_track, SeqTrack *seq_track); // scale machine track vol by percentage void scale_vol(float scale); diff --git a/avr/cores/megacommand/MCL/MNMTrack.cpp b/avr/cores/megacommand/MCL/MNMTrack.cpp index d51d7e8d2..0300a91c5 100644 --- a/avr/cores/megacommand/MCL/MNMTrack.cpp +++ b/avr/cores/megacommand/MCL/MNMTrack.cpp @@ -32,6 +32,11 @@ void MNMTrack::load_immediate(uint8_t tracknumber, SeqTrack *seq_track) { load_seq_data(seq_track); } +void MNMTrack::load_immediate_cleared(uint8_t tracknumber, SeqTrack *seq_track) { + DEBUG_PRINT_FN(); + load_seq_data(seq_track); +} + void MNMTrack::get_machine_from_kit(uint8_t tracknumber) { DEBUG_PRINT_FN(); memcpy(machine.params, MNM.kit.parameters[tracknumber], 72); diff --git a/avr/cores/megacommand/MCL/MNMTrack.h b/avr/cores/megacommand/MCL/MNMTrack.h index be536653c..bef05cb30 100644 --- a/avr/cores/megacommand/MCL/MNMTrack.h +++ b/avr/cores/megacommand/MCL/MNMTrack.h @@ -21,6 +21,7 @@ class MNMTrack : public ExtTrack { bool transition_cache(uint8_t tracknumber, uint8_t slotnumber) { return false; } virtual void load_immediate(uint8_t tracknumber, SeqTrack *seq_track); + virtual void load_immediate_cleared(uint8_t tracknumber, SeqTrack *seq_track); void get_machine_from_kit(uint8_t tracknumber); virtual bool store_in_grid(uint8_t column, uint16_t row, SeqTrack *seq_track = nullptr, uint8_t merge = 0, diff --git a/avr/cores/megacommand/MCL/SeqPage.cpp b/avr/cores/megacommand/MCL/SeqPage.cpp index 3b3baaebb..19eb9021a 100644 --- a/avr/cores/megacommand/MCL/SeqPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPage.cpp @@ -609,7 +609,6 @@ void SeqPage::length_handler(uint8_t length, bool multi) { if (last_ext_track == c) { seq_extparam4.cur = length; } } } else { - mcl_seq.ext_tracks[last_ext_track].buffer_notesoff(); mcl_seq.ext_tracks[last_ext_track].set_length(length); seq_extparam4.cur = length; } From cef585f94cf0e277ba171228130c6b3e88d75572 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Thu, 27 Jul 2023 23:47:57 +1000 Subject: [PATCH 366/413] lfo page YES/NO -> YES toggle --- avr/cores/megacommand/MCL/LFOPage.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/avr/cores/megacommand/MCL/LFOPage.cpp b/avr/cores/megacommand/MCL/LFOPage.cpp index 75bc3ad5b..c4ebfd5ce 100644 --- a/avr/cores/megacommand/MCL/LFOPage.cpp +++ b/avr/cores/megacommand/MCL/LFOPage.cpp @@ -303,11 +303,7 @@ bool LFOPage::handleEvent(gui_event_t *event) { if (event->mask == EVENT_BUTTON_PRESSED) { switch (key) { case MDX_KEY_YES: { - lfo_track->enable = true; - break; - } - case MDX_KEY_NO: { - lfo_track->enable = false; + lfo_track->enable = !(lfo_track->enable); break; } case MDX_KEY_UP: { From 59b4ca6e4e4779cb222a702c259e4b4b209959eb Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 28 Jul 2023 00:00:56 +1000 Subject: [PATCH 367/413] fixes related to load_immediate_cleared --- avr/cores/megacommand/MCL/MCLActions.cpp | 7 +++++-- avr/cores/megacommand/MCL/MDTempoTrack.cpp | 4 ++++ avr/cores/megacommand/MCL/MDTempoTrack.h | 1 + 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCLActions.cpp b/avr/cores/megacommand/MCL/MCLActions.cpp index 197964bf2..9401d216e 100644 --- a/avr/cores/megacommand/MCL/MCLActions.cpp +++ b/avr/cores/megacommand/MCL/MCLActions.cpp @@ -510,14 +510,17 @@ bool MCLActions::load_track(uint8_t track_idx, uint8_t row, uint8_t pos, DEBUG_PRINTLN(pos); ptrack->init_track_type(gdt->track_type); ptrack->init(track_idx, gdt->seq_track); + ptrack->load_immediate_cleared(track_idx, gdt->seq_track); } else { if (ptrack->get_parent_model() == gdt->track_type && ptrack->allow_cast_to_parent()) { ptrack->init_track_type(ptrack->get_parent_model()); } - send_masks[pos] = 1; + if (ptrack != nullptr) { + send_masks[pos] = 1; + ptrack->load_immediate(track_idx, gdt->seq_track); + } } if (ptrack != nullptr) { - ptrack->load_immediate_cleared(track_idx, gdt->seq_track); ptrack->store_in_mem(gdt->mem_slot_idx); } diff --git a/avr/cores/megacommand/MCL/MDTempoTrack.cpp b/avr/cores/megacommand/MCL/MDTempoTrack.cpp index 040a355cb..d007e79cd 100644 --- a/avr/cores/megacommand/MCL/MDTempoTrack.cpp +++ b/avr/cores/megacommand/MCL/MDTempoTrack.cpp @@ -13,6 +13,10 @@ uint16_t MDTempoTrack::send_tempo(bool send) { return MD.setTempo(tempo, send); } +void MDTempoTrack::load_immediate_cleared(uint8_t tracknumber, SeqTrack *seq_track) { + load_link_data(seq_track); +} + void MDTempoTrack::load_immediate(uint8_t tracknumber, SeqTrack *seq_track) { load_link_data(seq_track); send_tempo(); diff --git a/avr/cores/megacommand/MCL/MDTempoTrack.h b/avr/cores/megacommand/MCL/MDTempoTrack.h index e3ca27912..cdcbbdb72 100644 --- a/avr/cores/megacommand/MCL/MDTempoTrack.h +++ b/avr/cores/megacommand/MCL/MDTempoTrack.h @@ -27,6 +27,7 @@ class MDTempoTrack : public AUXTrack, public TempoData { bool online = false, Grid *grid = nullptr); void load_immediate(uint8_t tracknumber, SeqTrack *seq_track); + void load_immediate_cleared(uint8_t tracknumber, SeqTrack *seq_track); virtual uint16_t get_track_size() { return sizeof(MDTempoTrack); } virtual uint16_t get_region() { return BANK1_MDTEMPO_TRACK_START; } From fdc0257bfffc06414a034a2f4459a5c75929bccb Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 28 Jul 2023 00:04:15 +1000 Subject: [PATCH 368/413] here too --- avr/cores/megacommand/MCL/MDFXTrack.cpp | 4 ++++ avr/cores/megacommand/MCL/MDFXTrack.h | 2 ++ 2 files changed, 6 insertions(+) diff --git a/avr/cores/megacommand/MCL/MDFXTrack.cpp b/avr/cores/megacommand/MCL/MDFXTrack.cpp index 74d1b3af2..a2fed0350 100644 --- a/avr/cores/megacommand/MCL/MDFXTrack.cpp +++ b/avr/cores/megacommand/MCL/MDFXTrack.cpp @@ -53,6 +53,10 @@ void MDFXTrack::load_immediate(uint8_t tracknumber, SeqTrack *seq_track) { place_fx_in_kit(); } +void MDFXTrack::load_immediate_cleared(uint8_t tracknumber, SeqTrack *seq_track) { + load_link_data(seq_track); +} + void MDFXTrack::place_fx_in_kit() { DEBUG_PRINTLN("place"); memcpy(MD.kit.reverb, reverb, sizeof(reverb) * 4); diff --git a/avr/cores/megacommand/MCL/MDFXTrack.h b/avr/cores/megacommand/MCL/MDFXTrack.h index bfb6b47eb..7dbe03752 100644 --- a/avr/cores/megacommand/MCL/MDFXTrack.h +++ b/avr/cores/megacommand/MCL/MDFXTrack.h @@ -47,7 +47,9 @@ class MDFXTrack : public AUXTrack, public MDFXData { void transition_load(uint8_t tracknumber, SeqTrack *seq_track, uint8_t slotnumber); bool transition_cache(uint8_t tracknumber, uint8_t slotnumber); + void load_immediate(uint8_t tracknumber, SeqTrack *seq_track); + void load_immediate_cleared(uint8_t tracknumber, SeqTrack *seq_track); virtual uint16_t get_track_size() { return sizeof(MDFXTrack); } virtual uint16_t get_region() { return BANK1_MDFX_TRACK_START; } From 6108c6a96638810ba725adb34656133f58725e57 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 28 Jul 2023 00:34:49 +1000 Subject: [PATCH 369/413] text input page reverse up/down --- avr/cores/megacommand/MCL/TextInputPage.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/TextInputPage.cpp b/avr/cores/megacommand/MCL/TextInputPage.cpp index bb4e77d4b..2c9e452c5 100644 --- a/avr/cores/megacommand/MCL/TextInputPage.cpp +++ b/avr/cores/megacommand/MCL/TextInputPage.cpp @@ -211,10 +211,10 @@ bool TextInputPage::handleEvent(gui_event_t *event) { // trig_interface.ignoreNextEvent(MDX_KEY_NO); goto NO; case MDX_KEY_UP: - encoders[1]->cur -= inc; + encoders[1]->cur += normal_mode ? inc : -1 * inc; break; case MDX_KEY_DOWN: - encoders[1]->cur += inc; + encoders[1]->cur += normal_mode ? -1 * inc : inc; break; case MDX_KEY_LEFT: encoders[0]->cur -= inc; From e3b78c823eb4ac62ab63ed2da4a2b0c920cc56c2 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 28 Jul 2023 10:58:46 +1000 Subject: [PATCH 370/413] bug, stacatto notes --- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index 71faf66c2..5fcff1501 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -1049,7 +1049,7 @@ void ExtSeqTrack::record_track_noteoff(uint8_t note_num) { uint16_t w = end_x - start_x; del_note(start_x, w, note_num); - add_note(start_x, w, note_num, notes_on[n].velocity, mcl_cfg.rec_quant); + add_note(start_x, w, note_num, notes_on[n].velocity, 0, mcl_cfg.rec_quant); } notes_on[n].value = 255; From f6d9f33fe51c1703085686e61e11d9e2bdf3609a Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 28 Jul 2023 11:19:58 +1000 Subject: [PATCH 371/413] Grid prototypes and code structure --- avr/cores/megacommand/MCL/Grid.cpp | 35 ++++++++++++------------------ avr/cores/megacommand/MCL/Grid.h | 22 +++++++++---------- 2 files changed, 25 insertions(+), 32 deletions(-) diff --git a/avr/cores/megacommand/MCL/Grid.cpp b/avr/cores/megacommand/MCL/Grid.cpp index c41bb31e5..a051b291f 100644 --- a/avr/cores/megacommand/MCL/Grid.cpp +++ b/avr/cores/megacommand/MCL/Grid.cpp @@ -64,12 +64,15 @@ bool Grid::new_file(const char *gridname) { bool Grid::new_grid(const char *gridname) { - bool ret; + bool ret = false; DEBUG_PRINT_FN(); DEBUG_PRINTLN(F("Creating new grid")); if (!new_file(gridname)) { - return false; + goto end; + } + if (!write_header()) { + goto end; } DEBUG_PRINTLN(F("Initializing grid.. please wait")); @@ -78,7 +81,7 @@ bool Grid::new_grid(const char *gridname) { #endif // Initialise the project file by filling the grid with blank data. uint8_t ledstatus; - for (int32_t i = 0; i < GRID_LENGTH; i++) { + for (uint16_t i = 0; i < GRID_LENGTH; i++) { #ifdef OLED_DISPLAY mcl_gui.draw_progress("INITIALIZING", i, GRID_LENGTH); @@ -96,26 +99,17 @@ bool Grid::new_grid(const char *gridname) { ret = clear_row(i); if (!ret) { DEBUG_PRINTLN(F("coud not clear row")); - return false; + goto end; } } + ret = true; + end: clearLed2(); - ret = file.seekSet(0); - - if (!ret) { - DEBUG_PRINTLN(F("Could not seek")); - return false; - } - - if (!write_header()) { - return false; - } - file.close(); - return true; + return ret; } -bool Grid::copy_slot(int16_t s_col, int16_t s_row, int16_t d_col, int16_t d_row, +bool Grid::copy_slot(uint8_t s_col, uint16_t s_row, uint8_t d_col, uint16_t d_row, bool destination_same) { DEBUG_PRINT_FN(); DEBUG_PRINT(s_col); @@ -138,14 +132,13 @@ bool Grid::copy_slot(int16_t s_col, int16_t s_row, int16_t d_col, int16_t d_row, track->store_in_grid(d_col, d_row); } -uint8_t Grid::get_slot_model(int column, int row, bool load) { +uint8_t Grid::get_slot_model(uint8_t column, uint16_t row, bool load) { GridTrack temp_track; temp_track.load_from_grid(column, row); - // XXX why active, not the actual model? return temp_track.active; } -bool Grid::clear_slot(int16_t column, int16_t row, bool update_header) { +bool Grid::clear_slot(uint8_t column, uint16_t row, bool update_header) { bool ret; int b; @@ -183,7 +176,7 @@ bool Grid::clear_slot(int16_t column, int16_t row, bool update_header) { return true; } -__attribute__((noinline)) bool Grid::clear_row(int16_t row) { +bool Grid::clear_row(uint16_t row) { GridRowHeader row_header; row_header.init(); for (int x = 0; x < GRID_WIDTH; x++) { diff --git a/avr/cores/megacommand/MCL/Grid.h b/avr/cores/megacommand/MCL/Grid.h index 1d314ae69..f752321e4 100644 --- a/avr/cores/megacommand/MCL/Grid.h +++ b/avr/cores/megacommand/MCL/Grid.h @@ -40,19 +40,19 @@ class Grid : public GridHeader { bool close_file() { return file.close(); } - uint8_t get_slot_model(int column, int row, bool load); + uint8_t get_slot_model(uint8_t column, uint16_t row, bool load); - uint32_t get_slot_offset(int16_t column, int16_t row) { - uint32_t offset = (int32_t)(GRID_SLOT_BYTES * GRID_WIDTH) + - (int32_t)((column + 1) + (row * (GRID_WIDTH + 1))) * - (int32_t)GRID_SLOT_BYTES; + uint32_t get_slot_offset(uint8_t column, int16_t row) { + uint32_t offset = (uint32_t)(GRID_SLOT_BYTES * GRID_WIDTH) + + (uint32_t)((column + 1) + (row * (GRID_WIDTH + 1))) * + (uint32_t)GRID_SLOT_BYTES; return offset; } uint32_t get_row_header_offset(int16_t row) { uint32_t offset = - (int32_t)(GRID_SLOT_BYTES * GRID_WIDTH) + - (int32_t)(0 + (row * (GRID_WIDTH + 1))) * (int32_t)GRID_SLOT_BYTES; + (uint32_t)(GRID_SLOT_BYTES * GRID_WIDTH) + + (uint32_t)(0 + (row * (GRID_WIDTH + 1))) * (uint32_t)GRID_SLOT_BYTES; return offset; } @@ -64,11 +64,11 @@ class Grid : public GridHeader { return mcl_sd.seek(get_row_header_offset(row), &file); } - bool copy_slot(int16_t s_col, int16_t s_row, int16_t d_col, int16_t d_row, + bool copy_slot(uint8_t s_col, uint16_t s_row, uint8_t d_col, uint16_t d_row, bool destination_same); - bool clear_slot(int16_t column, int16_t row, bool update_header = true); - bool clear_row(int16_t row); - bool clear_model(int16_t column, uint16_t row); + bool clear_slot(uint8_t column, uint16_t row, bool update_header = true); + bool clear_row(uint16_t row); + bool clear_model(uint8_t column, uint16_t row); bool read(void *data, size_t len) { return mcl_sd.read_data((uint8_t *)(data), len, &file); From b0dd27abc7596a59e929784d7c2ee44eb9429006 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 28 Jul 2023 11:48:10 +1000 Subject: [PATCH 372/413] optimise --- avr/cores/megacommand/MCL/GridRowHeader.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/avr/cores/megacommand/MCL/GridRowHeader.cpp b/avr/cores/megacommand/MCL/GridRowHeader.cpp index ae6935ec1..868e3087e 100644 --- a/avr/cores/megacommand/MCL/GridRowHeader.cpp +++ b/avr/cores/megacommand/MCL/GridRowHeader.cpp @@ -18,10 +18,13 @@ bool GridRowHeader::is_empty() { } void GridRowHeader::init() { + memset(this, 0, sizeof(GridRowHeader)); + /* active = false; for (uint8_t x = 0; x < GRID_WIDTH; x++) { track_type[x] = EMPTY_TRACK_TYPE; model[x] = 0; } + */ } From ef92d75100e01327a55d176d70b63bd4114fc23b Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 28 Jul 2023 12:40:43 +1000 Subject: [PATCH 373/413] improvements to TextInputPage --- avr/cores/megacommand/MCL/TextInputPage.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/TextInputPage.cpp b/avr/cores/megacommand/MCL/TextInputPage.cpp index 2c9e452c5..d75ecfc45 100644 --- a/avr/cores/megacommand/MCL/TextInputPage.cpp +++ b/avr/cores/megacommand/MCL/TextInputPage.cpp @@ -7,7 +7,7 @@ inline char _getchar(uint8_t i) { if (i >= sz_allowedchar) i = sz_allowedchar - 1; return i - ["abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_&@-=! "]; + ["abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_&@-=!"]; } // chr -> idx @@ -28,6 +28,7 @@ void TextInputPage::setup() {} void TextInputPage::init() { oled_display.setTextColor(WHITE, BLACK); + mcl_gui.draw_popup(title,false,24); } void TextInputPage::init_text(char *text_, const char *title_, uint8_t len) { @@ -36,6 +37,11 @@ void TextInputPage::init_text(char *text_, const char *title_, uint8_t len) { length = len; max_length = len; strncpy(text, text_, len); + //Replace null characeters with space, it will be added back in upon exit. + for (uint8_t n = 0; n < len; n++) { + if (text[n] == '\0') { text[n] = ' '; } + } + text[sizeof(text) - 1] = '\0'; cursor_position = 0; config_normal(); } @@ -60,7 +66,6 @@ void TextInputPage::config_normal() { update_char(); #ifdef OLED_DISPLAY // redraw popup body - mcl_gui.draw_popup(title,false,24); #endif // update clock last_clock = slowclock; @@ -250,6 +255,7 @@ bool TextInputPage::handleEvent(gui_event_t *event) { cursor_position = length - 1; } // then, config normal input line + init(); config_normal(); return true; } From 7fe62eecdb1605942e4f8b7d3f7666b422314d11 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 28 Jul 2023 13:06:06 +1000 Subject: [PATCH 374/413] LFOTrack not loading with groups --- avr/cores/megacommand/MCL/MCLMemory.h | 2 +- avr/cores/megacommand/MD/MD.cpp | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCLMemory.h b/avr/cores/megacommand/MCL/MCLMemory.h index 847d142d0..e29b2c644 100644 --- a/avr/cores/megacommand/MCL/MCLMemory.h +++ b/avr/cores/megacommand/MCL/MCLMemory.h @@ -35,7 +35,7 @@ constexpr size_t NUM_EXT_TRACKS = 0; constexpr size_t NUM_INSTRUMENT_TRACKS = (NUM_MD_TRACKS + NUM_EXT_TRACKS); -constexpr size_t NUM_AUX_TRACKS = 4; +constexpr size_t NUM_AUX_TRACKS = 3; constexpr size_t GRIDCHAIN_TRACK_NUM = 10; constexpr size_t PERF_TRACK_NUM = 11; diff --git a/avr/cores/megacommand/MD/MD.cpp b/avr/cores/megacommand/MD/MD.cpp index 2e8b4aab8..405dbce47 100644 --- a/avr/cores/megacommand/MD/MD.cpp +++ b/avr/cores/megacommand/MD/MD.cpp @@ -156,16 +156,16 @@ void MDClass::init_grid_devices(uint8_t device_idx) { gdt.init(MDFX_TRACK_TYPE, GROUP_DEV, device_idx, (SeqTrack*) &(mcl_seq.mdfx_track), 0); add_track_to_grid(grid_idx, MDFX_TRACK_NUM, &gdt); + gdt.init(MDLFO_TRACK_TYPE, GROUP_DEV, device_idx, (SeqTrack*) &(mcl_seq.lfo_tracks[0]), 0); + add_track_to_grid(grid_idx, MDFX_TRACK_NUM + 2, &gdt); + gdt.init(MDROUTE_TRACK_TYPE, GROUP_AUX, device_idx, (SeqTrack*) &(mcl_seq.aux_tracks[0]), 0); add_track_to_grid(grid_idx, MDFX_TRACK_NUM + 1, &gdt); - gdt.init(MDLFO_TRACK_TYPE, GROUP_DEV, device_idx, (SeqTrack*) &(mcl_seq.aux_tracks[1]), 0); - add_track_to_grid(grid_idx, MDFX_TRACK_NUM + 2, &gdt); - - gdt.init(MDTEMPO_TRACK_TYPE, GROUP_TEMPO, device_idx, (SeqTrack*) &(mcl_seq.aux_tracks[2]), 0); + gdt.init(MDTEMPO_TRACK_TYPE, GROUP_TEMPO, device_idx, (SeqTrack*) &(mcl_seq.aux_tracks[1]), 0); add_track_to_grid(grid_idx, MDFX_TRACK_NUM + 3, &gdt); - gdt.init(PERF_TRACK_TYPE, GROUP_PERF, device_idx, (SeqTrack*) &(mcl_seq.aux_tracks[3]), 0); + gdt.init(PERF_TRACK_TYPE, GROUP_PERF, device_idx, (SeqTrack*) &(mcl_seq.aux_tracks[2]), 0); add_track_to_grid(grid_idx, PERF_TRACK_NUM, &gdt); } From 9ba2d5db337fd09386bbfe85dea9d87b95f5008a Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 28 Jul 2023 13:22:53 +1000 Subject: [PATCH 375/413] LFO Track to PERF group --- avr/cores/megacommand/MD/MD.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/avr/cores/megacommand/MD/MD.cpp b/avr/cores/megacommand/MD/MD.cpp index 405dbce47..1235d9c61 100644 --- a/avr/cores/megacommand/MD/MD.cpp +++ b/avr/cores/megacommand/MD/MD.cpp @@ -156,14 +156,14 @@ void MDClass::init_grid_devices(uint8_t device_idx) { gdt.init(MDFX_TRACK_TYPE, GROUP_DEV, device_idx, (SeqTrack*) &(mcl_seq.mdfx_track), 0); add_track_to_grid(grid_idx, MDFX_TRACK_NUM, &gdt); - gdt.init(MDLFO_TRACK_TYPE, GROUP_DEV, device_idx, (SeqTrack*) &(mcl_seq.lfo_tracks[0]), 0); - add_track_to_grid(grid_idx, MDFX_TRACK_NUM + 2, &gdt); + gdt.init(MDLFO_TRACK_TYPE, GROUP_PERF, device_idx, (SeqTrack*) &(mcl_seq.lfo_tracks[0]), 0); + add_track_to_grid(grid_idx, MDLFO_TRACK_NUM, &gdt); gdt.init(MDROUTE_TRACK_TYPE, GROUP_AUX, device_idx, (SeqTrack*) &(mcl_seq.aux_tracks[0]), 0); - add_track_to_grid(grid_idx, MDFX_TRACK_NUM + 1, &gdt); + add_track_to_grid(grid_idx, MDROUTE_TRACK_NUM, &gdt); gdt.init(MDTEMPO_TRACK_TYPE, GROUP_TEMPO, device_idx, (SeqTrack*) &(mcl_seq.aux_tracks[1]), 0); - add_track_to_grid(grid_idx, MDFX_TRACK_NUM + 3, &gdt); + add_track_to_grid(grid_idx, MDTEMPO_TRACK_NUM, &gdt); gdt.init(PERF_TRACK_TYPE, GROUP_PERF, device_idx, (SeqTrack*) &(mcl_seq.aux_tracks[2]), 0); add_track_to_grid(grid_idx, PERF_TRACK_NUM, &gdt); From fe8b9250c8ccfbf9d7efd20273d0688ff4ae7565 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 28 Jul 2023 15:33:50 +1000 Subject: [PATCH 376/413] LFO SeqTrack is not a true sequencer track. To be changed when refactor'd in 5.0 --- avr/cores/megacommand/MCL/EmptyTrack.cpp | 1 + avr/cores/megacommand/MCL/GridTrack.cpp | 4 ++-- avr/cores/megacommand/MCL/GridTrack.h | 3 ++- avr/cores/megacommand/MCL/MCLMemory.h | 2 +- avr/cores/megacommand/MD/MD.cpp | 8 ++++---- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/avr/cores/megacommand/MCL/EmptyTrack.cpp b/avr/cores/megacommand/MCL/EmptyTrack.cpp index 08176d9d6..b21d2b7e3 100644 --- a/avr/cores/megacommand/MCL/EmptyTrack.cpp +++ b/avr/cores/megacommand/MCL/EmptyTrack.cpp @@ -2,5 +2,6 @@ void EmptyTrack::clear() { memset(this->data, 0, EMPTY_TRACK_LEN); + init(); } diff --git a/avr/cores/megacommand/MCL/GridTrack.cpp b/avr/cores/megacommand/MCL/GridTrack.cpp index 5247f3c28..c00ffce17 100644 --- a/avr/cores/megacommand/MCL/GridTrack.cpp +++ b/avr/cores/megacommand/MCL/GridTrack.cpp @@ -43,7 +43,7 @@ bool GridTrack::load_from_grid_512(uint8_t column, uint16_t row, Grid *grid) { ::new (this) GridTrack; this->active = tmp; - if ((active == EMPTY_TRACK_TYPE) || (active == 255)) { + if ((active == 255)) { init(); } @@ -61,7 +61,7 @@ bool GridTrack::load_from_grid(uint8_t column, uint16_t row) { ::new (this) GridTrack; this->active = tmp; - if ((active == EMPTY_TRACK_TYPE) || (active == 255)) { + if ((active == 255)) { init(); } diff --git a/avr/cores/megacommand/MCL/GridTrack.h b/avr/cores/megacommand/MCL/GridTrack.h index a9b4fe1a5..a37515258 100644 --- a/avr/cores/megacommand/MCL/GridTrack.h +++ b/avr/cores/megacommand/MCL/GridTrack.h @@ -80,7 +80,8 @@ class GridTrack { void init() { link.length = 16; link.speed = SEQ_SPEED_1X; - } + link.loops = 0; + } /* Load track from Grid in to sequencer, place in payload to be transmitted to device*/ void load_link_data(SeqTrack *seq_track); diff --git a/avr/cores/megacommand/MCL/MCLMemory.h b/avr/cores/megacommand/MCL/MCLMemory.h index e29b2c644..847d142d0 100644 --- a/avr/cores/megacommand/MCL/MCLMemory.h +++ b/avr/cores/megacommand/MCL/MCLMemory.h @@ -35,7 +35,7 @@ constexpr size_t NUM_EXT_TRACKS = 0; constexpr size_t NUM_INSTRUMENT_TRACKS = (NUM_MD_TRACKS + NUM_EXT_TRACKS); -constexpr size_t NUM_AUX_TRACKS = 3; +constexpr size_t NUM_AUX_TRACKS = 4; constexpr size_t GRIDCHAIN_TRACK_NUM = 10; constexpr size_t PERF_TRACK_NUM = 11; diff --git a/avr/cores/megacommand/MD/MD.cpp b/avr/cores/megacommand/MD/MD.cpp index 1235d9c61..e78159017 100644 --- a/avr/cores/megacommand/MD/MD.cpp +++ b/avr/cores/megacommand/MD/MD.cpp @@ -156,16 +156,16 @@ void MDClass::init_grid_devices(uint8_t device_idx) { gdt.init(MDFX_TRACK_TYPE, GROUP_DEV, device_idx, (SeqTrack*) &(mcl_seq.mdfx_track), 0); add_track_to_grid(grid_idx, MDFX_TRACK_NUM, &gdt); - gdt.init(MDLFO_TRACK_TYPE, GROUP_PERF, device_idx, (SeqTrack*) &(mcl_seq.lfo_tracks[0]), 0); + gdt.init(MDLFO_TRACK_TYPE, GROUP_PERF, device_idx, (SeqTrack*) &(mcl_seq.aux_tracks[0]), 0); add_track_to_grid(grid_idx, MDLFO_TRACK_NUM, &gdt); - gdt.init(MDROUTE_TRACK_TYPE, GROUP_AUX, device_idx, (SeqTrack*) &(mcl_seq.aux_tracks[0]), 0); + gdt.init(MDROUTE_TRACK_TYPE, GROUP_AUX, device_idx, (SeqTrack*) &(mcl_seq.aux_tracks[1]), 0); add_track_to_grid(grid_idx, MDROUTE_TRACK_NUM, &gdt); - gdt.init(MDTEMPO_TRACK_TYPE, GROUP_TEMPO, device_idx, (SeqTrack*) &(mcl_seq.aux_tracks[1]), 0); + gdt.init(MDTEMPO_TRACK_TYPE, GROUP_TEMPO, device_idx, (SeqTrack*) &(mcl_seq.aux_tracks[2]), 0); add_track_to_grid(grid_idx, MDTEMPO_TRACK_NUM, &gdt); - gdt.init(PERF_TRACK_TYPE, GROUP_PERF, device_idx, (SeqTrack*) &(mcl_seq.aux_tracks[2]), 0); + gdt.init(PERF_TRACK_TYPE, GROUP_PERF, device_idx, (SeqTrack*) &(mcl_seq.aux_tracks[3]), 0); add_track_to_grid(grid_idx, PERF_TRACK_NUM, &gdt); } From db58e60534be1e54db5362ce01e9d5c4064c44a4 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 28 Jul 2023 15:59:03 +1000 Subject: [PATCH 377/413] send kit as upper characters --- avr/cores/megacommand/MCL/GridTask.cpp | 1 + avr/cores/megacommand/MCL/MCLActions.cpp | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/GridTask.cpp b/avr/cores/megacommand/MCL/GridTask.cpp index fdb42ad67..481516265 100644 --- a/avr/cores/megacommand/MCL/GridTask.cpp +++ b/avr/cores/megacommand/MCL/GridTask.cpp @@ -85,6 +85,7 @@ void GridTask::update_transition_details() { if (row_header.active) { memcpy(kit_names[dev_idx], row_header.name, len); + m_toupper(kit_names[dev_idx]); kit_names[dev_idx][len - 1] = '\0'; } else { strcpy(kit_names[dev_idx], "NEW_KIT"); diff --git a/avr/cores/megacommand/MCL/MCLActions.cpp b/avr/cores/megacommand/MCL/MCLActions.cpp index 9401d216e..d8430b1cf 100644 --- a/avr/cores/megacommand/MCL/MCLActions.cpp +++ b/avr/cores/megacommand/MCL/MCLActions.cpp @@ -607,7 +607,8 @@ void MCLActions::send_tracks_to_devices(uint8_t *slot_select_array, if (dst != nullptr) { if (row_header.active) { uint8_t len = elektron_dev->sysex_protocol.kitname_length; - memcpy(dst, row_header.name, len); + strncpy(dst, row_header.name, len); + m_toupper(dst); dst[len - 1] = '\0'; } else { strcpy(dst, "NEW KIT"); From 4c168e795acfbb85b7b85446285809515e29be97 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 28 Jul 2023 21:42:40 +1000 Subject: [PATCH 378/413] Missing --- avr/cores/megacommand/MCL/EmptyTrack.cpp | 1 - avr/cores/megacommand/MCL/MCLActions.cpp | 5 +++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/avr/cores/megacommand/MCL/EmptyTrack.cpp b/avr/cores/megacommand/MCL/EmptyTrack.cpp index b21d2b7e3..08176d9d6 100644 --- a/avr/cores/megacommand/MCL/EmptyTrack.cpp +++ b/avr/cores/megacommand/MCL/EmptyTrack.cpp @@ -2,6 +2,5 @@ void EmptyTrack::clear() { memset(this->data, 0, EMPTY_TRACK_LEN); - init(); } diff --git a/avr/cores/megacommand/MCL/MCLActions.cpp b/avr/cores/megacommand/MCL/MCLActions.cpp index d8430b1cf..e2fa5d292 100644 --- a/avr/cores/megacommand/MCL/MCLActions.cpp +++ b/avr/cores/megacommand/MCL/MCLActions.cpp @@ -354,6 +354,7 @@ void MCLActions::collect_tracks(uint8_t *slot_select_array, if (device_track == nullptr || device_track->active != gdt->track_type && device_track->get_parent_model() != gdt->track_type) { empty_track.clear(); + if (device_track->active != EMPTY_TRACK_TYPE) { empty_track.init(); } device_track = device_track->init_track_type(gdt->track_type); if (device_track) { device_track->init(track_idx, gdt->seq_track); @@ -506,8 +507,7 @@ bool MCLActions::load_track(uint8_t track_idx, uint8_t row, uint8_t pos, if (ptrack->active != gdt->track_type && ptrack->get_parent_model() != gdt->track_type) { empty_track.clear(); - DEBUG_PRINTLN("Clearing track"); - DEBUG_PRINTLN(pos); + if (ptrack->active != EMPTY_TRACK_TYPE) { empty_track.init(); } ptrack->init_track_type(gdt->track_type); ptrack->init(track_idx, gdt->seq_track); ptrack->load_immediate_cleared(track_idx, gdt->seq_track); @@ -755,6 +755,7 @@ void MCLActions::cache_next_tracks(uint8_t *slot_select_array, // EMPTY_TRACK_TYPE ////DEBUG_PRINTLN(F("clear track")); empty_track.clear(); + if (ptrack->active != EMPTY_TRACK_TYPE) { empty_track.init(); } ptrack = empty_track.init_track_type(gdt->track_type); ptrack->init(track_idx, gdt->seq_track); } else { From 6f75e4d779ec2080522a23a6a240b9da97cecfbe Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 28 Jul 2023 21:46:10 +1000 Subject: [PATCH 379/413] to match MCLActions.cpp --- avr/cores/megacommand/MCL/GridTask.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/GridTask.cpp b/avr/cores/megacommand/MCL/GridTask.cpp index 481516265..28f364986 100644 --- a/avr/cores/megacommand/MCL/GridTask.cpp +++ b/avr/cores/megacommand/MCL/GridTask.cpp @@ -281,7 +281,8 @@ bool GridTask::link_load(uint8_t n, uint8_t track_idx, uint8_t *slots_changed, } slots_changed[n] = mcl_actions.links[n].row; track_select_array[n] = 1; - memcpy(&mcl_actions.links[n], &pmem_track->link, sizeof(GridLink)); + + pmem_track->link.store_in_mem(n, &(mcl_actions.links[0])); if (pmem_track->active) { return true; } From 4978db7d21eda15e0c41f65845228f03d3576dd4 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 28 Jul 2023 22:09:18 +1000 Subject: [PATCH 380/413] fix lfo params --- avr/cores/megacommand/MCL/LFOSeqTrack.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/avr/cores/megacommand/MCL/LFOSeqTrack.cpp b/avr/cores/megacommand/MCL/LFOSeqTrack.cpp index f61ce95cb..2ac0d4594 100644 --- a/avr/cores/megacommand/MCL/LFOSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/LFOSeqTrack.cpp @@ -60,7 +60,7 @@ int16_t LFOSeqTrack::get_sample(uint8_t n) { } uint8_t LFOSeqTrack::get_wav_value(uint8_t sample_count, uint8_t dest, uint8_t param) { - int8_t offset = get_param_offset(dest, param); + int8_t offset = get_param_offset(dest, params[param].param); int16_t depth = params[param].depth; int16_t sample = ((get_sample(sample_count) * depth) / 128) + offset; @@ -160,8 +160,9 @@ uint8_t LFOSeqTrack::get_param_offset(uint8_t dest, uint8_t param) { break; } } - else if (param < 2) { - return params[param].offset; + else { + //MIDI + return param; } return 255; } From 01e303222c3470c253675011c433c054412f09ed Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 28 Jul 2023 22:20:22 +1000 Subject: [PATCH 381/413] don't allow device change on PianoRoll --- avr/cores/megacommand/MCL/SeqPtcPage.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.cpp b/avr/cores/megacommand/MCL/SeqPtcPage.cpp index 5ad962866..29fef89b8 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPtcPage.cpp @@ -706,7 +706,9 @@ void SeqPtcMidiEvents::onNoteOnCallback_Midi2(uint8_t *msg) { uint8_t channel_event = seq_ptc_page.is_md_midi(channel); if (channel_event) { - SeqPage::midi_device = midi_active_peering.get_device(UART1_PORT); + if (mcl.currentPage() != SEQ_EXTSTEP_PAGE) { + SeqPage::midi_device = midi_active_peering.get_device(UART1_PORT); + } } else { auto active_device = midi_active_peering.get_device(UART2_PORT); uint8_t n = mcl_seq.find_ext_track(channel); @@ -833,7 +835,6 @@ void SeqPtcMidiEvents::note_off(uint8_t *msg, uint8_t channel_event) { } #ifdef EXT_TRACKS - SeqPage::midi_device = midi_active_peering.get_device(UART2_PORT); pitch = seq_ptc_page.process_ext_event(note_num, false, channel); seq_ptc_page.config_encoders(); From bf639cd72042bcdd4939a66534b4051ab3a4dd22 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Fri, 28 Jul 2023 22:40:46 +1000 Subject: [PATCH 382/413] Disable OMNI Mode for MD MIDI channels OMNI mode could block MIDI on the Piano Roll to all tracks. --- avr/cores/megacommand/MCL/SeqPtcPage.cpp | 8 +- .../megacommand/resources/R_menu_layouts.cpp | 228 +++++++++--------- resource/menu_layouts.cpp | 6 +- 3 files changed, 119 insertions(+), 123 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.cpp b/avr/cores/megacommand/MCL/SeqPtcPage.cpp index 29fef89b8..3ba8db189 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPtcPage.cpp @@ -681,14 +681,10 @@ uint8_t SeqPtcPage::process_ext_event(uint8_t note_num, bool note_type, } uint8_t SeqPtcPage::is_md_midi(uint8_t channel) { - if ((mcl_cfg.uart2_poly_chan - 1 == channel) || - (mcl_cfg.uart2_poly_chan == MIDI_OMNI_MODE)) { + if (mcl_cfg.uart2_poly_chan - 1 == channel) { return POLY_EVENT; } - - if (((mcl_cfg.uart2_ctrl_chan - 1 == channel) || - (mcl_cfg.uart2_ctrl_chan == MIDI_OMNI_MODE)) && - (mcl.currentPage() != SEQ_EXTSTEP_PAGE)) { + if (mcl_cfg.uart2_ctrl_chan - 1 == channel) { return CTRL_EVENT; } if (mcl_cfg.md_trig_channel - 1 == channel) { diff --git a/avr/cores/megacommand/resources/R_menu_layouts.cpp b/avr/cores/megacommand/resources/R_menu_layouts.cpp index 79fb8b58d..7a568ff98 100644 --- a/avr/cores/megacommand/resources/R_menu_layouts.cpp +++ b/avr/cores/megacommand/resources/R_menu_layouts.cpp @@ -617,12 +617,11 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 72, 159, 31, - 18, + 17, 2, 9, - 180, - 255, - 4, + 44, + 18, 59, 197, 20, @@ -757,274 +756,275 @@ const unsigned char __R_menu_layouts[] PROGMEM = { 31, 90, 20, - 216, + 225, 73, - 239, - 176, - 242, - 97, + 78, + 135, + 39, + 18, + 2, + 134, 47, 7, - 158, + 123, 20, - 230, 244, + 156, 21, - 31, - 17, - 2, + 16, + 7, + 110, 48, - 116, 20, + 135, 24, - 61, 122, + 172, 83, - 103, 166, + 252, 85, - 225, 82, 66, 79, + 43, 8, - 89, 221, - 123, + 47, 2, 255, + 107, 78, - 89, 20, - 201, + 57, 50, - 114, + 46, 3, - 72, - 107, + 73, + 13, 13, 58, + 96, 20, - 6, + 205, 55, - 104, 68, - 81, + 10, 102, - 205, + 57, 144, + 172, 42, - 100, 136, - 219, + 155, 4, 189, + 96, 84, - 6, + 197, 65, - 47, + 235, 98, - 89, 250, - 182, + 54, 41, + 222, 56, - 240, 189, - 130, + 16, 194, - 231, + 92, 189, + 250, 26, - 215, 32, + 232, 98, - 66, 70, + 86, 162, - 176, 97, - 99, + 12, 34, + 112, 152, - 131, + 97, 59, - 12, + 133, 47, - 46, + 199, 36, - 57, 68, - 205, + 57, 186, + 182, 210, - 176, 71, 20, - 27, + 3, 37, + 104, 252, - 66, + 65, 6, - 11, + 96, 20, - 1, - 198, + 56, 35, 0, + 195, 35, - 27, + 96, 20, - 1, - 185, + 55, 38, 3, - 205, + 57, 38, + 184, 136, - 195, 65, 71, + 107, 242, - 91, 76, 70, + 107, 75, - 89, 231, - 110, + 45, + 212, 168, - 167, 1, + 253, 13, - 236, 65, 85, 88, + 141, 31, - 108, 83, + 159, 41, - 251, 97, 103, 101, + 101, 34, - 46, + 195, 31, - 25, 198, - 150, + 50, 164, - 22, + 194, 165, + 218, 65, - 215, 97, + 232, 121, - 66, 74, + 81, 189, - 140, + 131, 180, - 26, 25, - 69, + 72, 203, - 133, + 176, 19, 182, 252, + 198, 2, - 49, 89, - 97, + 44, 200, - 119, + 46, 26, + 232, 158, - 70, 65, + 214, 139, - 180, 129, - 10, + 129, 62, - 149, + 82, 21, - 135, + 176, 183, + 236, 27, - 96, 125, - 44, + 5, + 147, 41, - 154, 29, - 67, + 72, 160, - 96, + 108, 62, - 98, - 118, + 12, + 78, 104, + 193, 101, - 11, + 97, 136, - 8, - 156, + 19, 0, + 141, 66, - 107, 161, + 96, 14, - 7, + 225, 79, 83, - 11, 184, + 97, 80, - 12, 52, - 53, + 134, 49, - 36, + 164, 140, - 183, + 150, 127, + 241, 68, 70, - 140, 85, + 138, 68, - 82, + 64, 161, - 2, - 209, + 90, 169, - 235, + 61, 237, + 117, 25, - 172, 75, + 128, 20, - 6, + 196, 28, - 37, + 181, 221, - 173, 88, + 169, 112, - 73, 203, - 11, + 33, + 112, 169, - 128, 0, 0, 0, 0, - 1, - 63, + 0, + 39, 255, }; diff --git a/resource/menu_layouts.cpp b/resource/menu_layouts.cpp index 5c0da1f78..a8f332451 100644 --- a/resource/menu_layouts.cpp +++ b/resource/menu_layouts.cpp @@ -131,9 +131,9 @@ menu_t midimachinedrum_menu_layout = { "MD MIDI", { // m r n d p f o - {"CHRO CHAN:", 0, 18, 2, 9, NULL_PAGE, 0, 18}, - {"POLY CHAN:", 0, 18, 2, 46, NULL_PAGE, 0, 88}, - {"TRIG CHAN:", 0, 18, 2, 57, NULL_PAGE, 0, 18}, + {"CHRO CHAN:", 0, 17, 2, 9, NULL_PAGE, 0, 18}, + {"POLY CHAN:", 0, 17, 2, 46, NULL_PAGE, 0, 88}, + {"TRIG CHAN:", 0, 17, 2, 57, NULL_PAGE, 0, 18}, }, 24 }; From 8f7edd88d28459f2977617c128669be592f43ab2 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 29 Jul 2023 01:34:04 +1000 Subject: [PATCH 383/413] Retain note width when quantizing --- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 149 +++++++++++++--------- avr/cores/megacommand/MCL/ExtSeqTrack.h | 5 +- 2 files changed, 90 insertions(+), 64 deletions(-) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index 5fcff1501..77629134c 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -1,12 +1,14 @@ #include "MCL_impl.h" uint8_t ExtSeqTrack::epoch = 0; -void ExtSeqTrack::set_speed(uint8_t new_speed, uint8_t old_speed, bool timing_adjust) { +void ExtSeqTrack::set_speed(uint8_t new_speed, uint8_t old_speed, + bool timing_adjust) { if (old_speed == 255) { old_speed = speed; } if (timing_adjust) { - float mult = get_speed_multiplier(new_speed) / get_speed_multiplier(old_speed); + float mult = + get_speed_multiplier(new_speed) / get_speed_multiplier(old_speed); for (uint16_t i = 0; i < event_count; i++) { events[i].micro_timing = round(mult * (float)events[i].micro_timing); } @@ -48,24 +50,24 @@ void ExtSeqTrack::set_length(uint8_t len, bool expand) { return; } } - ext_event_t empty_events[8]; - uint8_t a = 0; - for (uint8_t n = old_length; n < 128; n++) { - uint16_t ev_idx, ev_end; - locate(a, ev_idx, ev_end); - memcpy(empty_events, &events[ev_idx], sizeof(empty_events)); - for (uint8_t m = 0; m < (ev_end - ev_idx); m++) { - add_event(n, &empty_events[m]); - } - velocities[n] = velocities[a]; - a++; - if (a == old_length) { a = 0; } + ext_event_t empty_events[8]; + uint8_t a = 0; + for (uint8_t n = old_length; n < 128; n++) { + uint16_t ev_idx, ev_end; + locate(a, ev_idx, ev_end); + memcpy(empty_events, &events[ev_idx], sizeof(empty_events)); + for (uint8_t m = 0; m < (ev_end - ev_idx); m++) { + add_event(n, &empty_events[m]); } - } - else if (length < old_length) { + velocities[n] = velocities[a]; + a++; + if (a == old_length) { + a = 0; + } + } + } else if (length < old_length) { buffer_notesoff(); } - } void ExtSeqTrack::re_sync() { @@ -393,7 +395,7 @@ void ExtSeqTrack::init_notes_on() { } } -void ExtSeqTrack::add_notes_on(uint16_t x, uint8_t value, uint8_t velocity) { +void ExtSeqTrack::add_notes_on(uint8_t step, uint8_t utiming, uint8_t value, uint8_t velocity) { if (notes_on_count >= NUM_NOTES_ON) { return; } @@ -420,7 +422,8 @@ void ExtSeqTrack::add_notes_on(uint16_t x, uint8_t value, uint8_t velocity) { notes_on_count++; } notes_on[slot].value = value; - notes_on[slot].x = x; + notes_on[slot].step = step; + notes_on[slot].utiming = utiming; notes_on[slot].velocity = velocity; return; @@ -457,7 +460,7 @@ void ExtSeqTrack::add_note(uint16_t cur_x, uint16_t cur_w, uint8_t cur_y, DEBUG_DUMP(start_utiming); uint8_t end_step = ((cur_x + cur_w) / timing_mid); - again: +again: uint8_t end_utiming = timing_mid + (cur_x + cur_w) - (end_step * timing_mid); DEBUG_DUMP(end_step); DEBUG_DUMP(end_utiming); @@ -465,8 +468,7 @@ void ExtSeqTrack::add_note(uint16_t cur_x, uint16_t cur_w, uint8_t cur_y, if (end_step == step) { DEBUG_PRINTLN(F("ALERT start == end")); end_step = end_step + 1; - if (quant) { end_utiming = timing_mid; } - else { goto again; } + goto again; } if (end_step >= length) { @@ -631,7 +633,6 @@ void ExtSeqTrack::load_cache() { } t.load_link_from_mem(track_number); t.load_link_data((SeqTrack *)this); - } void ExtSeqTrack::seq(MidiUartParent *uart_) { @@ -673,11 +674,12 @@ void ExtSeqTrack::seq(MidiUartParent *uart_) { if (record_mutes) { uint8_t u = 0; uint8_t q = 0; - uint8_t s = get_quantized_step(u,q); + uint8_t s = get_quantized_step(u, q); SET_BIT128_P(mute_mask, s); } - if ((is_generic_midi || (!is_generic_midi && count_down == 0)) && (mute_state == SEQ_MUTE_OFF)) { + if ((is_generic_midi || (!is_generic_midi && count_down == 0)) && + (mute_state == SEQ_MUTE_OFF)) { // SEQ_MUTE_OFF)) { // the range we're interested in: // [current timing bucket, micro >= timing_mid ... next timing bucket, micro @@ -741,7 +743,8 @@ void ExtSeqTrack::note_off(uint8_t note, uint8_t velocity, void ExtSeqTrack::noteon_conditional(uint8_t condition, uint8_t note, uint8_t velocity) { - if (IS_BIT_SET128_P(oneshot_mask, step_count) || IS_BIT_SET128_P(mute_mask, step_count)) { + if (IS_BIT_SET128_P(oneshot_mask, step_count) || + IS_BIT_SET128_P(mute_mask, step_count)) { return; } if (condition > 64) { @@ -754,12 +757,13 @@ void ExtSeqTrack::noteon_conditional(uint8_t condition, uint8_t note, SET_BIT128_P(oneshot_mask, step_count); send_note = true; } - } - else { + } else { send_note = SeqTrack::conditional(condition); } - if (send_note) { note_on(note, velocity); } + if (send_note) { + note_on(note, velocity); + } } void ExtSeqTrack::pitch_bend(uint16_t value, MidiUartParent *uart_) { @@ -850,13 +854,15 @@ bool ExtSeqTrack::del_track_locks(int16_t cur_x, uint8_t lock_idx, DEBUG_DUMP(start_idx); uint8_t i = start_idx; if (!events[i].is_lock || events[i].lock_idx != lock_idx) - //|| (events[i].event_value > value + r || - //events[i].event_value < min(0, value - r))) + //|| (events[i].event_value > value + r || + // events[i].event_value < min(0, value - r))) continue; int16_t event_x = n * timing_mid + events[i].micro_timing - timing_mid; if (event_x == cur_x || (event_x <= cur_x + r && event_x >= cur_x - r)) { uint8_t param = locks_params[lock_idx] - 1; - if (param == PARAM_PRG) { pgm_oneshot = 0; } + if (param == PARAM_PRG) { + pgm_oneshot = 0; + } remove_event(i); ret = true; } @@ -963,7 +969,6 @@ bool ExtSeqTrack::set_track_locks(uint8_t step, uint8_t utiming, DEBUG_DUMP(F("adding lock")); DEBUG_DUMP(lock_idx); - constexpr uint8_t oneshot = 14; e->is_lock = true; @@ -994,7 +999,9 @@ bool ExtSeqTrack::set_track_step(uint8_t &step, uint8_t utiming, e.micro_timing = utiming; DEBUG_PRINTLN("adding step"); - DEBUG_DUMP(event_on); DEBUG_DUMP(step); DEBUG_DUMP(utiming); + DEBUG_DUMP(event_on); + DEBUG_DUMP(step); + DEBUG_DUMP(utiming); if (add_event(step, &e) == 0xFFFF) { return false; } @@ -1009,11 +1016,14 @@ void ExtSeqTrack::store_mute_state() { for (uint8_t n = 0; n < NUM_EXT_STEPS; n++) { if (IS_BIT_SET128_P(mute_mask, n)) { uint16_t ev_idx, ev_end; - loc: + loc: locate(n, ev_idx, ev_end); for (uint8_t m = ev_idx; m < ev_end; m++) { if (!events[m].is_lock && events[m].event_on) { - if (del_note(n * timing_mid + events[m].micro_timing - timing_mid, timing_mid, events[m].event_value)) { goto loc; } + if (del_note(n * timing_mid + events[m].micro_timing - timing_mid, + timing_mid, events[m].event_value)) { + goto loc; + } } } } @@ -1025,31 +1035,48 @@ void ExtSeqTrack::record_track_noteoff(uint8_t note_num) { uint8_t condition = 0; uint8_t timing_mid = get_timing_mid(); - uint8_t utiming = 0; - uint8_t step = get_quantized_step(utiming); - uint16_t ev_idx; uint8_t n = find_notes_on(note_num); if (n == 255) return; - ignore_step = step; - SET_BIT128_P(ignore_notes, note_num); + int16_t w = 0; + if (MidiClock.state == 2 && SeqPage::recording) { - uint16_t start_x = notes_on[n].x; - uint16_t end_x = step * timing_mid + utiming - timing_mid; + int8_t utiming = mod12_counter - 1; + uint8_t step = step_count; - if (MidiClock.state == 2 && SeqPage::recording) { + int16_t start_x = notes_on[n].step * timing_mid + notes_on[n].utiming; + int16_t end_x = step * timing_mid + utiming; - if (end_x < start_x) { - del_note(0, end_x, note_num); - end_x += length * timing_mid; - } - uint16_t w = end_x - start_x; + if (mcl_cfg.rec_quant) { + if (end_x < start_x) { + end_x += length * timing_mid; + } + w = max(1,end_x - start_x); + + if (notes_on[n].utiming > timing_mid / 2) { + notes_on[n].step++; + if (notes_on[n].step == length) { + notes_on[n].step = 0; + } + } + notes_on[n].utiming = 0; + start_x = notes_on[n].step * timing_mid + notes_on[n].utiming; + end_x = start_x + w; + } + ignore_step = step; + SET_BIT128_P(ignore_notes, note_num); + + if (end_x < start_x) { + del_note(0, end_x, note_num); + end_x += length * timing_mid; + } + w = end_x - start_x; del_note(start_x, w, note_num); - add_note(start_x, w, note_num, notes_on[n].velocity, 0, mcl_cfg.rec_quant); + add_note(start_x, w, note_num, notes_on[n].velocity, 0); } notes_on[n].value = 255; @@ -1061,22 +1088,20 @@ void ExtSeqTrack::record_track_noteon(uint8_t note_num, uint8_t velocity) { uint8_t condition = 0; uint8_t timing_mid = get_timing_mid(); - uint8_t utiming = 0; - uint8_t step = get_quantized_step(utiming); + uint8_t utiming = mod12_counter - 1; + uint8_t step = step_count; ignore_step = step; SET_BIT128_P(ignore_notes, note_num); - add_notes_on(step * timing_mid + utiming - timing_mid, note_num, velocity); + add_notes_on(step, utiming, note_num, velocity); } -void ExtSeqTrack::clear_mute() { - memset(mute_mask,0,sizeof(mute_mask)); -} +void ExtSeqTrack::clear_mute() { memset(mute_mask, 0, sizeof(mute_mask)); } void ExtSeqTrack::clear_mutes() { - memset(oneshot_mask,0,sizeof(oneshot_mask)); - memset(mute_mask,0,sizeof(mute_mask)); + memset(oneshot_mask, 0, sizeof(oneshot_mask)); + memset(mute_mask, 0, sizeof(mute_mask)); } void ExtSeqTrack::clear_ext_conditional() { @@ -1085,7 +1110,7 @@ void ExtSeqTrack::clear_ext_conditional() { events[x].micro_timing = 0; // XXX zero or mid? } clear_mutes(); - memset(ignore_notes,0, sizeof(ignore_notes)); + memset(ignore_notes, 0, sizeof(ignore_notes)); } void ExtSeqTrack::clear_ext_notes() { @@ -1180,11 +1205,11 @@ void ExtSeqTrack::modify_track(uint8_t dir) { void ExtSeqTrack::toggle_mute() { if (mute_state == SEQ_MUTE_ON) { mute_state = SEQ_MUTE_OFF; - } - else { + } else { mute_state = SEQ_MUTE_ON; uint8_t mod12_counter_ = MidiClock.mod12_counter; - while (MidiClock.state == 2 && mod12_counter_ == MidiClock.mod12_counter) {}; + while (MidiClock.state == 2 && mod12_counter_ == MidiClock.mod12_counter) { + }; buffer_notesoff(); } } diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.h b/avr/cores/megacommand/MCL/ExtSeqTrack.h index 8aacaa725..e0b507169 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.h +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.h @@ -94,7 +94,8 @@ struct ext_event_t { class NoteVector { public: - uint16_t x; + uint8_t step; + uint8_t utiming; uint8_t value; uint8_t velocity; }; @@ -225,7 +226,7 @@ class ExtSeqTrack : public ExtSeqTrackData, public SeqSlideTrack { uint16_t add_event(uint8_t step, ext_event_t *e); void init_notes_on(); - void add_notes_on(uint16_t x, uint8_t value, uint8_t velocity); + void add_notes_on(uint8_t step, uint8_t utiming, uint8_t value, uint8_t velocity); uint8_t find_notes_on(uint8_t value); void remove_notes_on(uint8_t value); From 8e9a03793f96d3ee04a211f832e9649c53309708 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 29 Jul 2023 13:59:40 +1000 Subject: [PATCH 384/413] Fixes for note width retain --- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 36 +++++++++++++---------- avr/cores/megacommand/MCL/ExtSeqTrack.h | 6 ++-- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index 77629134c..c55d89c72 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -395,7 +395,8 @@ void ExtSeqTrack::init_notes_on() { } } -void ExtSeqTrack::add_notes_on(uint8_t step, uint8_t utiming, uint8_t value, uint8_t velocity) { +void ExtSeqTrack::add_notes_on(uint8_t step, int8_t utiming, uint8_t value, + uint8_t velocity) { if (notes_on_count >= NUM_NOTES_ON) { return; } @@ -449,7 +450,7 @@ void ExtSeqTrack::remove_notes_on(uint8_t value) { } void ExtSeqTrack::add_note(uint16_t cur_x, uint16_t cur_w, uint8_t cur_y, - uint8_t velocity, uint8_t cond, uint8_t quant) { + uint8_t velocity, uint8_t cond) { uint8_t timing_mid = get_timing_mid(); @@ -1041,20 +1042,27 @@ void ExtSeqTrack::record_track_noteoff(uint8_t note_num) { if (n == 255) return; - int16_t w = 0; if (MidiClock.state == 2 && SeqPage::recording) { int8_t utiming = mod12_counter - 1; uint8_t step = step_count; + ignore_step = step; + SET_BIT128_P(ignore_notes, note_num); + + uint16_t w = 0; + int16_t start_x = notes_on[n].step * timing_mid + notes_on[n].utiming; int16_t end_x = step * timing_mid + utiming; + int16_t roll_length = length * timing_mid; + bool wrap = false; if (mcl_cfg.rec_quant) { if (end_x < start_x) { - end_x += length * timing_mid; + end_x += roll_length; + wrap = true; } - w = max(1,end_x - start_x); + w = max(1, end_x - start_x); if (notes_on[n].utiming > timing_mid / 2) { notes_on[n].step++; @@ -1065,16 +1073,14 @@ void ExtSeqTrack::record_track_noteoff(uint8_t note_num) { notes_on[n].utiming = 0; start_x = notes_on[n].step * timing_mid + notes_on[n].utiming; end_x = start_x + w; + if (end_x > roll_length) { del_note(0, end_x - roll_length, note_num); } + } else { + if (end_x < start_x) { + del_note(0, end_x, note_num); + end_x += roll_length; + } + w = end_x - start_x; } - - ignore_step = step; - SET_BIT128_P(ignore_notes, note_num); - - if (end_x < start_x) { - del_note(0, end_x, note_num); - end_x += length * timing_mid; - } - w = end_x - start_x; del_note(start_x, w, note_num); add_note(start_x, w, note_num, notes_on[n].velocity, 0); } @@ -1088,7 +1094,7 @@ void ExtSeqTrack::record_track_noteon(uint8_t note_num, uint8_t velocity) { uint8_t condition = 0; uint8_t timing_mid = get_timing_mid(); - uint8_t utiming = mod12_counter - 1; + int8_t utiming = mod12_counter - 1; uint8_t step = step_count; ignore_step = step; diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.h b/avr/cores/megacommand/MCL/ExtSeqTrack.h index e0b507169..584f151ab 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.h +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.h @@ -95,7 +95,7 @@ struct ext_event_t { class NoteVector { public: uint8_t step; - uint8_t utiming; + int8_t utiming; uint8_t value; uint8_t velocity; }; @@ -226,13 +226,13 @@ class ExtSeqTrack : public ExtSeqTrackData, public SeqSlideTrack { uint16_t add_event(uint8_t step, ext_event_t *e); void init_notes_on(); - void add_notes_on(uint8_t step, uint8_t utiming, uint8_t value, uint8_t velocity); + void add_notes_on(uint8_t step, int8_t utiming, uint8_t value, uint8_t velocity); uint8_t find_notes_on(uint8_t value); void remove_notes_on(uint8_t value); bool del_note(uint16_t cur_x, uint16_t cur_w = 0, uint8_t cur_y = 0); void add_note(uint16_t cur_x, uint16_t cur_w, uint8_t cur_y, uint8_t velocity, - uint8_t cond = 0, uint8_t quant = 0); + uint8_t cond = 0); // find midi note within the given step. // returns: note index & step start index. From b101f1bd822c7bb2609ace608285ae996f6dec29 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 29 Jul 2023 14:09:37 +1000 Subject: [PATCH 385/413] Clear lock when Func + Clear from automation lane Piano Roll --- avr/cores/megacommand/MCL/MCL.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/avr/cores/megacommand/MCL/MCL.cpp b/avr/cores/megacommand/MCL/MCL.cpp index 594fabb94..da502f799 100644 --- a/avr/cores/megacommand/MCL/MCL.cpp +++ b/avr/cores/megacommand/MCL/MCL.cpp @@ -321,13 +321,10 @@ bool mcl_handleEvent(gui_event_t *event) { break; opt_clear = 2; // MidiDevice *dev = midi_active_peering.get_device(UART2_PORT); - if (mcl.currentPage() == SEQ_PTC_PAGE || - mcl.currentPage() == SEQ_EXTSTEP_PAGE) { - // if (SeqPage::midi_device == dev) { + if (mcl.currentPage() == SEQ_PTC_PAGE) { opt_clear = 1; } + if (mcl.currentPage() == SEQ_EXTSTEP_PAGE) { opt_clear = 1; - // } else { - // opt_clear = SeqPage::recording ? 2 : 1; - // } + if (seq_extstep_page.pianoroll_mode > 0) { opt_clear_locks_handler(); break; } } opt_clear_track_handler(); break; From 48cc99efa6be43d6e5f298432e3d0215451b10bb Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 29 Jul 2023 14:18:45 +1000 Subject: [PATCH 386/413] minor --- avr/cores/megacommand/MCL/PerfData.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/PerfData.h b/avr/cores/megacommand/MCL/PerfData.h index 145730ea3..e3cfe4c32 100644 --- a/avr/cores/megacommand/MCL/PerfData.h +++ b/avr/cores/megacommand/MCL/PerfData.h @@ -79,7 +79,7 @@ class PerfScene { for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { // Find first empty if (params[a].dest == 0) { - empty = min(a, empty); + if (empty == 255) { empty = a; } } if (params[a].dest == dest + 1 && params[a].param == param) { // Update existing, if matches From e9a2220054433865cef633700be8bb80af368bb7 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 29 Jul 2023 14:58:20 +1000 Subject: [PATCH 387/413] When manually editing Scene Locks, the Lock count was incorrectly maintained --- avr/cores/megacommand/MCL/PerfData.h | 1 + avr/cores/megacommand/MCL/PerfPage.cpp | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/avr/cores/megacommand/MCL/PerfData.h b/avr/cores/megacommand/MCL/PerfData.h index e3cfe4c32..12455ba5c 100644 --- a/avr/cores/megacommand/MCL/PerfData.h +++ b/avr/cores/megacommand/MCL/PerfData.h @@ -103,6 +103,7 @@ class PerfScene { } void clear_param(uint8_t dest, uint8_t param) { + if (count == 0) { return; } bool ret = false; for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { // Find match diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 1477e4207..809285be3 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -184,6 +184,7 @@ void PerfPage::update_params() { p->param = encoders[2]->cur; if (encoders[3]->hasChanged() && BUTTON_DOWN(Buttons.ENCODER4)) { GUI.ignoreNextEvent(Buttons.ENCODER4); } if (encoders[3]->cur > 0) { + if (p->val == 255) { perf_encoders[perf_id]->perf_data.scenes[scene].count++; } p->val = encoders[3]->cur - 1; } } @@ -256,7 +257,7 @@ void PerfPage::display() { str1 = "OFF"; // Show the "non-lock" value uint8_t c = page_mode - 1; - v = perf_encoders[perf_id]->perf_data.scenes[scene].params[c].val; + v = 0; //perf_encoders[perf_id]->perf_data.scenes[scene].params[c].val; } else { v -= 1; } @@ -585,8 +586,10 @@ bool PerfPage::handleEvent(gui_event_t *event) { if (learn) { PerfData *d = &perf_encoders[perf_id]->perf_data; uint8_t scene = learn - 1; - d->clear_param_scene(encoders[1]->cur - 1 , encoders[2]->cur, scene); - config_encoders(); + if (encoders[1]->cur != 0 && encoders[2]->cur != 255) { + d->clear_param_scene(encoders[1]->cur - 1 , encoders[2]->cur, scene); + config_encoders(); + } } } From cb1fb9830078e9a7273b0c19112f573f7b8876c5 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 29 Jul 2023 19:55:56 +1000 Subject: [PATCH 388/413] draw non-slide as lines --- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 24 ++++++++------------ 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index 2cebfce66..bb62bc4e0 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -214,20 +214,17 @@ void SeqExtStepPage::draw_lockeditor() { uint16_t next_lock_ev = ev_idx; ev_j_end = ev_end; - if (ev.event_on) { j = active_track.search_lock_idx(pianoroll_mode - 1, i, next_lock_ev, ev_j_end); if (next_lock_ev == 0xFFFF) { next_lock_ev = ev_idx; } - } else { - j = i; - } auto &ev_j = active_track.events[next_lock_ev]; int16_t start_x = i * timing_mid + ev.micro_timing - timing_mid; int16_t end_x = j * timing_mid + ev_j.micro_timing - timing_mid; + if (start_x == end_x) { end_x = start_x - 1; } if (is_within_fov(start_x, end_x)) { uint8_t start_fov_x, end_fov_x; @@ -244,7 +241,7 @@ void SeqExtStepPage::draw_lockeditor() { end_x_tmp += roll_length; } float gradient; - if (start_x == end_x) { + if (start_x == end_x || !ev.event_on) { gradient = 0; } else { gradient = @@ -278,10 +275,10 @@ void SeqExtStepPage::draw_lockeditor() { fov_h - (((float)start_y_tmp / 128.0) * (float)fov_h); uint8_t end_fov_y = fov_h - (((float)end_y_tmp / 128.0) * (float)fov_h); - if (!ev.event_on) { + // if (!ev.event_on) { // Draw single lock. - oled_display.fillRect(start_fov_x + draw_x, start_fov_y, 2, 2, WHITE); - } else { + // oled_display.fillRect(start_fov_x + draw_x, start_fov_y, 2, 2, WHITE); + // } else { // Draw Slide if (end_x < start_x) { // Wrap around note @@ -294,8 +291,7 @@ void SeqExtStepPage::draw_lockeditor() { start_y; uint8_t tmp_end_fov_y = fov_h - (((float)end_y_tmp / 128.0) * (float)fov_h); - draw_thick_line(start_fov_x + draw_x, start_fov_y, fov_w + draw_x, - tmp_end_fov_y); + draw_thick_line(start_fov_x + draw_x, start_fov_y, fov_w + draw_x, tmp_end_fov_y); } if (end_x > fov_offset) { @@ -306,18 +302,18 @@ void SeqExtStepPage::draw_lockeditor() { uint8_t tmp_end_fov_y = fov_h - (((float)end_y_tmp / 128.0) * (float)fov_h); - draw_thick_line(draw_x, tmp_end_fov_y, end_fov_x + draw_x, - end_fov_y); + draw_thick_line(draw_x, !ev.event_on ? start_fov_y : tmp_end_fov_y, end_fov_x + draw_x, + !ev.event_on ? start_fov_y : end_fov_y); } } else { // Standard note. draw_thick_line(start_fov_x + draw_x, start_fov_y, - draw_x + end_fov_x, end_fov_y); + draw_x + end_fov_x, !ev.event_on ? start_fov_y : end_fov_y); } } } - } + // } /*if (j < i) { break; }*/ From 65aee6034a227fc6e029bb69cc6303800d87f14b Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 29 Jul 2023 20:23:16 +1000 Subject: [PATCH 389/413] menu page regression --- avr/cores/megacommand/MCL/MenuPage.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/MenuPage.cpp b/avr/cores/megacommand/MCL/MenuPage.cpp index a2ad9442c..fc49906fc 100644 --- a/avr/cores/megacommand/MCL/MenuPage.cpp +++ b/avr/cores/megacommand/MCL/MenuPage.cpp @@ -191,8 +191,9 @@ bool MenuPageBase::enter() { if (row_func != NULL) { DEBUG_PRINTLN(F("calling callback func")); (*row_func)(); - return false; + return true; } + return false; } bool MenuPageBase::exit() { From 30ebf032761109a53b78c99fcf1a40c42c09c27b Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 29 Jul 2023 20:23:34 +1000 Subject: [PATCH 390/413] twice? --- avr/cores/megacommand/MCL/SeqPtcPage.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/SeqPtcPage.cpp b/avr/cores/megacommand/MCL/SeqPtcPage.cpp index 3ba8db189..876e8ef9a 100644 --- a/avr/cores/megacommand/MCL/SeqPtcPage.cpp +++ b/avr/cores/megacommand/MCL/SeqPtcPage.cpp @@ -105,7 +105,6 @@ void SeqPtcPage::init() { DEBUG_PRINTLN(mcl_cfg.uart2_ctrl_chan); trig_interface.on(); trig_interface.send_md_leds(TRIGLED_EXCLUSIVE); - trig_interface.on(); config(); re_init = false; } From d4d7e4c0ebe7e4b081f6b9f49d5491596ba63e69 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 29 Jul 2023 20:27:00 +1000 Subject: [PATCH 391/413] small optimise --- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index c55d89c72..4c5b7c91c 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -1064,16 +1064,18 @@ void ExtSeqTrack::record_track_noteoff(uint8_t note_num) { } w = max(1, end_x - start_x); - if (notes_on[n].utiming > timing_mid / 2) { - notes_on[n].step++; - if (notes_on[n].step == length) { - notes_on[n].step = 0; + int8_t u = notes_on[n].utiming; + uint8_t s = notes_on[n].step; + if (u > timing_mid / 2) { + s++; + if (s == length) { + s = 0; } } - notes_on[n].utiming = 0; - start_x = notes_on[n].step * timing_mid + notes_on[n].utiming; + u = 0; + start_x = s * timing_mid + u; end_x = start_x + w; - if (end_x > roll_length) { del_note(0, end_x - roll_length, note_num); } + if (end_x > roll_length) { del_note(0, end_x - roll_length, note_num); } } else { if (end_x < start_x) { del_note(0, end_x, note_num); From b23d1cffc3bb211549eaf99345959ad21da803a5 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 29 Jul 2023 20:30:46 +1000 Subject: [PATCH 392/413] signed -> unsigned --- avr/cores/megacommand/Elektron/ElektronHelper.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/avr/cores/megacommand/Elektron/ElektronHelper.cpp b/avr/cores/megacommand/Elektron/ElektronHelper.cpp index 5c45e8e20..57b330f8a 100644 --- a/avr/cores/megacommand/Elektron/ElektronHelper.cpp +++ b/avr/cores/megacommand/Elektron/ElektronHelper.cpp @@ -114,7 +114,7 @@ void ElektronHelper::from64Bit(uint64_t num, uint8_t *b) { bool ElektronHelper::checkSysexChecksumAnalog(uint8_t *data, uint16_t len) { uint16_t cksum = 0; - for (int i = 0; i < len - 4; i++) { + for (uint16_t i = 0; i < len - 4; i++) { cksum += data[i]; } cksum &= 0x3FFF; @@ -133,7 +133,7 @@ bool ElektronHelper::checkSysexChecksumAnalog(uint8_t *data, uint16_t len) { bool ElektronHelper::checkSysexChecksumAnalog(MidiClass *midi, uint16_t offset, uint16_t len) { uint16_t cksum = 0; - for (int i = 0; i < len - 4; i++) { + for (uint16_t i = 0; i < len - 4; i++) { cksum += midi->midiSysex.getByte(i + offset); } cksum &= 0x3FFF; @@ -151,7 +151,7 @@ bool ElektronHelper::checkSysexChecksumAnalog(MidiClass *midi, uint16_t offset, void ElektronHelper::calculateSysexChecksumAnalog(uint8_t *data, uint16_t len) { data[0] = 0xF0; uint16_t checksum = 0; - for (int i = 9; i < len; i++) + for (uint16_t i = 9; i < len; i++) checksum += data[i]; data[len] = (uint8_t)((checksum >> 7) & 0x7F); data[len + 1] = (uint8_t)(checksum & 0x7F); @@ -165,7 +165,7 @@ void ElektronHelper::calculateSysexChecksumAnalog(uint8_t *data, uint16_t len) { /* check sysex */ bool ElektronHelper::checkSysexChecksum(uint8_t *data, uint16_t len) { uint16_t cksum = 0; - for (int i = 9 - 6; i < len - 4; i++) { + for (uint16_t i = 9 - 6; i < len - 4; i++) { cksum += data[i]; } cksum &= 0x3FFF; @@ -186,7 +186,7 @@ bool ElektronHelper::checkSysexChecksum(uint8_t *data, uint16_t len) { bool ElektronHelper::checkSysexChecksum(MidiClass *midi, uint16_t offset, uint16_t len) { uint16_t cksum = 0; - for (int i = 9 - 6; i < len - 4; i++) { + for (uint16_t i = 9 - 6; i < len - 4; i++) { cksum += midi->midiSysex.getByte(i + offset); } cksum &= 0x3FFF; @@ -207,7 +207,7 @@ bool ElektronHelper::checkSysexChecksum(MidiClass *midi, uint16_t offset, uint16 void ElektronHelper::calculateSysexChecksum(uint8_t *data, uint16_t len) { data[0] = 0xF0; uint16_t checksum = 0; - for (int i = 9; i < len; i++) + for (uint16_t i = 9; i < len; i++) checksum += data[i]; data[len] = (uint8_t)((checksum >> 7) & 0x7F); data[len + 1] = (uint8_t)(checksum & 0x7F); From 02c7e1a9f2fe6143ca9324a38b6e7661b2e6530d Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 29 Jul 2023 21:05:00 +1000 Subject: [PATCH 393/413] compliler warnings --- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 2 +- avr/cores/megacommand/MCL/ExtSeqTrack.h | 2 +- avr/cores/megacommand/MCL/LFOPage.cpp | 2 +- avr/cores/megacommand/MCL/MCL.h | 4 ++-- avr/cores/megacommand/MCL/PerfData.h | 7 ------- avr/cores/megacommand/MCL/SeqTrack.h | 2 +- avr/cores/megacommand/MNM/MNMMessages.h | 2 +- avr/cores/megacommand/Midi/MidiSysex.h | 5 ++--- avr/cores/megacommand/Midi/MidiUartParent.h | 6 +++--- avr/cores/megacommand/MidiUart.h | 2 +- 10 files changed, 13 insertions(+), 21 deletions(-) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index 4c5b7c91c..639fc4314 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -738,7 +738,7 @@ void ExtSeqTrack::note_off(uint8_t note, uint8_t velocity, if (uart_ == nullptr) { uart_ = uart; } - uart_->sendNoteOff(channel, note, velocity); + uart_->sendNoteOff(channel, note); CLEAR_BIT128_P(note_buffer, note); } diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.h b/avr/cores/megacommand/MCL/ExtSeqTrack.h index 584f151ab..3975859f1 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.h +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.h @@ -286,7 +286,7 @@ class ExtSeqTrack : public ExtSeqTrackData, public SeqSlideTrack { uint8_t count = 0; while (*buf) { if (*buf & 1) { - uart->sendNoteOff(channel, offset + count, 0); + uart->sendNoteOff(channel, offset + count); } count++; *buf >>= 1; diff --git a/avr/cores/megacommand/MCL/LFOPage.cpp b/avr/cores/megacommand/MCL/LFOPage.cpp index c4ebfd5ce..0e39ec9f1 100644 --- a/avr/cores/megacommand/MCL/LFOPage.cpp +++ b/avr/cores/megacommand/MCL/LFOPage.cpp @@ -203,7 +203,7 @@ void LFOPage::display() { draw_knob(3, encoders[3], "DEP2"); info2 = "LFO>MOD"; } - else if (page_mode == LFO_OFFSET) { + else { //if (page_mode == LFO_OFFSET) { draw_knob(2, encoders[2], "OFS1"); draw_knob(3, encoders[3], "OFS2"); info2 = "LFO>OFS"; diff --git a/avr/cores/megacommand/MCL/MCL.h b/avr/cores/megacommand/MCL/MCL.h index ecbc3d2f1..19a44bfa6 100644 --- a/avr/cores/megacommand/MCL/MCL.h +++ b/avr/cores/megacommand/MCL/MCL.h @@ -17,7 +17,7 @@ #include "Fonts/TomThumb.h" #define VERSION 4050 -#define VERSION_STR "SS4.50" +#define VERSION_STR "RF4.50" #define CALLBACK_TIMEOUT 500 #define GUI_NAME_TIMEOUT 800 @@ -107,7 +107,7 @@ class MCL { void popPage() { GUI.popPage(); for (uint8_t n = 0; n < NUM_PAGES; n++) { - if (GUI.currentPage() == getPage(n)) { + if (GUI.currentPage() == getPage((PageIndex) n)) { current_page = (PageIndex) n; return; } diff --git a/avr/cores/megacommand/MCL/PerfData.h b/avr/cores/megacommand/MCL/PerfData.h index 12455ba5c..2d274f9ea 100644 --- a/avr/cores/megacommand/MCL/PerfData.h +++ b/avr/cores/megacommand/MCL/PerfData.h @@ -104,7 +104,6 @@ class PerfScene { void clear_param(uint8_t dest, uint8_t param) { if (count == 0) { return; } - bool ret = false; for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { // Find match if (params[a].dest == dest + 1 && params[a].param == param) { @@ -117,9 +116,6 @@ class PerfScene { } uint8_t find_empty() { - uint8_t match = 255; - uint8_t empty = 255; - for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { // Find first empty if (params[a].dest == 0) { @@ -197,9 +193,6 @@ class PerfData { void clear_scene(uint8_t scene) { PerfScene *s = &scenes[scene]; - for (uint8_t a = 0; a < NUM_PERF_PARAMS; a++) { - uint8_t t = s->params[a].dest - 1; - } s->init(); } diff --git a/avr/cores/megacommand/MCL/SeqTrack.h b/avr/cores/megacommand/MCL/SeqTrack.h index 0c997e1eb..44109a442 100644 --- a/avr/cores/megacommand/MCL/SeqTrack.h +++ b/avr/cores/megacommand/MCL/SeqTrack.h @@ -260,7 +260,7 @@ class SeqTrackBase { uint8_t get_quantized_step() { uint8_t u = 0; - get_quantized_step(u); + return get_quantized_step(u); } uint8_t get_quantized_step(uint8_t &utiming, uint8_t quant = 255); }; diff --git a/avr/cores/megacommand/MNM/MNMMessages.h b/avr/cores/megacommand/MNM/MNMMessages.h index 73eac1f3e..37a4a50dd 100644 --- a/avr/cores/megacommand/MNM/MNMMessages.h +++ b/avr/cores/megacommand/MNM/MNMMessages.h @@ -96,7 +96,7 @@ class MNMTrackModifier { bool LPKeyTrack; bool HPKeyTrack; void init() { - memset(this, 0, sizeof(this)); + memset(this, 0, sizeof(MNMTrackModifier)); } }; diff --git a/avr/cores/megacommand/Midi/MidiSysex.h b/avr/cores/megacommand/Midi/MidiSysex.h index 0fd281a76..7bce09c0c 100644 --- a/avr/cores/megacommand/Midi/MidiSysex.h +++ b/avr/cores/megacommand/Midi/MidiSysex.h @@ -62,7 +62,7 @@ class MidiSysexLedger { public: uint8_t state : 2; uint16_t recordLen : 14; // 16383 max record length - uint8_t *ptr; + volatile unsigned char *ptr; }; #define SYSEX_STATE_NULL 0 @@ -128,7 +128,6 @@ class MidiSysexClass { } void get_next_msg() { - uint8_t n = msg_rd; msg_rd++; if (msg_rd == NUM_SYSEX_MSGS) { msg_rd = 0; @@ -176,7 +175,7 @@ class MidiSysexClass { return get_bank1(src); } - ALWAYS_INLINE() bool recordByte(uint8_t c) { + ALWAYS_INLINE() void recordByte(uint8_t c) { putByte(c); ledger[msg_wr].recordLen++; } diff --git a/avr/cores/megacommand/Midi/MidiUartParent.h b/avr/cores/megacommand/Midi/MidiUartParent.h index 40932902d..d6848e821 100644 --- a/avr/cores/megacommand/Midi/MidiUartParent.h +++ b/avr/cores/megacommand/Midi/MidiUartParent.h @@ -79,7 +79,7 @@ class MidiUartParent { } virtual void initSerial() { } - virtual uint8_t m_getc() {} + virtual uint8_t m_getc() = 0; virtual void m_putc(uint8_t *src, uint16_t size) = 0; virtual void m_putc(uint8_t c) = 0; virtual void m_putc_immediate(uint8_t c) { m_putc(c); } @@ -171,9 +171,9 @@ class MidiUartParent { } ALWAYS_INLINE() - void sendNoteOff(uint8_t channel, uint8_t note, uint8_t velocity) { + void sendNoteOff(uint8_t channel, uint8_t note) { #ifdef MIDI_VALIDATE - if ((channel >= 16) || (note >= 128) || (velocity >= 128)) + if ((channel >= 16) || (note >= 128)) return; #endif diff --git a/avr/cores/megacommand/MidiUart.h b/avr/cores/megacommand/MidiUart.h index 4dffcb801..15c8928d9 100644 --- a/avr/cores/megacommand/MidiUart.h +++ b/avr/cores/megacommand/MidiUart.h @@ -220,8 +220,8 @@ class MidiUartClass : public MidiUartParent { ALWAYS_INLINE() void tx_isr() { #ifdef RUNNING_STATUS_OUT bool rs = 1; -#endif again: +#endif if ((txRb_sidechannel != nullptr) && (in_message_tx == 0)) { // sidechannel mounted, and no active messages in normal channel // ==> flush the sidechannel now From 6a6d684de1a04cea9094e88283f7c7d0e8d0715c Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 29 Jul 2023 21:05:10 +1000 Subject: [PATCH 394/413] increase depth to 12 --- avr/cores/megacommand/MCL/FileBrowserPage.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/FileBrowserPage.h b/avr/cores/megacommand/MCL/FileBrowserPage.h index a3c973b9a..8ecf6d494 100644 --- a/avr/cores/megacommand/MCL/FileBrowserPage.h +++ b/avr/cores/megacommand/MCL/FileBrowserPage.h @@ -57,7 +57,7 @@ class FileBrowserFileTypes { }; class FileSystemPosition { - constexpr static uint8_t size = 8; + constexpr static uint8_t size = 12; uint16_t last_pos[8]; uint8_t last_cur_row[8]; uint8_t depth; @@ -77,7 +77,7 @@ class FileSystemPosition { } pos = last_pos[depth]; row = last_cur_row[depth]; - return true; + return; } end: pos = 1; From 728b5a2b9a7b691368efa2e6dd2370fd6f05c335 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 29 Jul 2023 21:22:38 +1000 Subject: [PATCH 395/413] Mute sets should not init to 0 --- avr/cores/megacommand/MCL/PerfTrack.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/PerfTrack.h b/avr/cores/megacommand/MCL/PerfTrack.h index 4eb5160b8..5e35204b3 100644 --- a/avr/cores/megacommand/MCL/PerfTrack.h +++ b/avr/cores/megacommand/MCL/PerfTrack.h @@ -52,7 +52,7 @@ class PerfTrack : public AUXTrack, public PerfTrackData { } scenes[n].init(); } - memset(mute_sets, 0, sizeof(mute_sets)); + memset(mute_sets, 0xFF, sizeof(mute_sets)); memset(perf_locks, 255, sizeof(perf_locks)); } From e613cb28041bb3ee7c282363c87dea6901e75611 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sat, 29 Jul 2023 21:53:56 +1000 Subject: [PATCH 396/413] Don't change MD track when device is EXT --- avr/cores/megacommand/MCL/MixerPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index b2f88fccd..5d8d5eb19 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -541,7 +541,7 @@ bool MixerPage::handleEvent(gui_event_t *event) { } // oled_draw_mutes(); - } else if (first_track == 255) { + } else if (first_track == 255 && midi_device == &MD) { first_track = track; MD.setStatus(0x22, track); } From 921cf185fc7155950ea9e33d9d7e72bfbee5c220 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 30 Jul 2023 00:27:21 +1000 Subject: [PATCH 397/413] Grid Page selection bugs --- avr/cores/megacommand/MCL/GridPage.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/GridPage.cpp b/avr/cores/megacommand/MCL/GridPage.cpp index 9ad661bd9..a57db2067 100644 --- a/avr/cores/megacommand/MCL/GridPage.cpp +++ b/avr/cores/megacommand/MCL/GridPage.cpp @@ -105,7 +105,7 @@ void GridPage::loop() { int8_t diff, new_val; if (show_slot_menu) { if (encoders[2]->hasChanged()) { - if ((proj.get_grid() == 0) && (encoders[2]->cur + cur_col > GRID_WIDTH)) { + if ((proj.get_grid() == 0) && (getCol() + encoders[2]->cur > GRID_WIDTH)) { old_col = getCol(); cur_col = 0; param1.cur = 0; @@ -722,7 +722,7 @@ void GridPage::apply_slot_changes(bool ignore_undo, bool ignore_func) { bool activate_header = false; - uint8_t track_select_array[GRID_LENGTH] = {0}; + uint8_t track_select_array[NUM_SLOTS] = {0}; GridRowHeader header; SeqTrack seq_track; From 70602ac7ac7894044eb0064ad924a147fc755767 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 30 Jul 2023 01:05:25 +1000 Subject: [PATCH 398/413] fully utilise ring buffer --- avr/cores/megacommand/MCL/GridTask.h | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/GridTask.h b/avr/cores/megacommand/MCL/GridTask.h index 74c21ea97..d28d9858c 100644 --- a/avr/cores/megacommand/MCL/GridTask.h +++ b/avr/cores/megacommand/MCL/GridTask.h @@ -12,22 +12,30 @@ class LoadQueue { uint8_t modes[NUM_LINKS]; uint8_t rd; uint8_t wr; + bool full; void init() { rd = 0; wr = 0; + bool full = false; } void put(uint8_t mode, uint8_t *row_select) { + if (full) { return; } memcpy(row_selects[wr],row_select,NUM_SLOTS); modes[wr++] = mode; if (wr == NUM_LINKS) { wr = 0; } + if (wr == rd) { + full = true; + } } void put(uint8_t mode, uint8_t row, uint8_t *track_select_array) { + if (full) { return; } + for (uint8_t n = 0; n < NUM_SLOTS; n++) { row_selects[wr][n] = 255; if (track_select_array[n]) { row_selects[wr][n] = row; } @@ -36,6 +44,9 @@ class LoadQueue { if (wr == NUM_LINKS) { wr = 0; } + if (wr == rd) { + full = true; + } } void get(uint8_t *mode, uint8_t *row_select) { @@ -44,11 +55,11 @@ class LoadQueue { if (rd == NUM_LINKS) { rd = 0; } + full = false; } bool is_empty() { - bool ret = (rd == wr); - return ret; + return !full && (rd == wr); } }; From 2049c831a0537c265cc1f7a195e3dd0dcaab3f20 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 30 Jul 2023 01:06:10 +1000 Subject: [PATCH 399/413] incorrect slots when traversing bothg grids --- avr/cores/megacommand/MCL/GridPage.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/avr/cores/megacommand/MCL/GridPage.cpp b/avr/cores/megacommand/MCL/GridPage.cpp index a57db2067..68bfa2f21 100644 --- a/avr/cores/megacommand/MCL/GridPage.cpp +++ b/avr/cores/megacommand/MCL/GridPage.cpp @@ -774,6 +774,7 @@ void GridPage::apply_slot_changes(bool ignore_undo, bool ignore_func) { } } if (slot_load == 1) { + DEBUG_PRINTLN("slot load put"); grid_task.load_queue.put(mcl_cfg.load_mode,ypos, track_select_array); } // If all slots are deleted then clear the row name @@ -794,6 +795,7 @@ void GridPage::apply_slot_changes(bool ignore_undo, bool ignore_func) { if (proj.get_grid() == 0) { proj.select_grid(1); width = encoders[2]->cur; + _col = 0; goto again; } load_old_col(); From 05723f3a7012ae16930b8c7f2404eca131f67b6f Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 30 Jul 2023 01:09:30 +1000 Subject: [PATCH 400/413] PerfTrack name init --- avr/cores/megacommand/MCL/PerfTrack.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/avr/cores/megacommand/MCL/PerfTrack.h b/avr/cores/megacommand/MCL/PerfTrack.h index 5e35204b3..72a9846eb 100644 --- a/avr/cores/megacommand/MCL/PerfTrack.h +++ b/avr/cores/megacommand/MCL/PerfTrack.h @@ -19,6 +19,8 @@ class PerfTrackEncoderData { src = param = min = 0; active_scene_a = 0; active_scene_b = 1; + const char *str = "CONTROL"; + strcpy(name, str); } }; From f6b1e3d4fce37e56bc9bbcc153d146aa808d9600 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 30 Jul 2023 01:11:16 +1000 Subject: [PATCH 401/413] Reset undo when entering/clearing trigs --- avr/cores/megacommand/MCL/SeqStepPage.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/avr/cores/megacommand/MCL/SeqStepPage.cpp b/avr/cores/megacommand/MCL/SeqStepPage.cpp index b51c24107..4045eca0e 100644 --- a/avr/cores/megacommand/MCL/SeqStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqStepPage.cpp @@ -395,6 +395,7 @@ bool SeqStepPage::handleEvent(gui_event_t *event) { seq_param2.cur = utiming; seq_param2.old = utiming; if (!active_track.get_step(step, mask_type)) { + reset_undo(); bool cond_plock; active_track.steps[step].cond_id = translate_to_step_conditional(condition, &cond_plock); @@ -422,6 +423,7 @@ bool SeqStepPage::handleEvent(gui_event_t *event) { if (clock_diff(note_interface.note_hold[port], slowclock) < TRIG_HOLD_TIME) { + reset_undo(); active_track.set_step(step, mask_type, false); if (mask_type == MASK_PATTERN) { active_track.steps[step].cond_id = 0; From fdf4ae37b0538046f4261a7e0487617b990df764 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 30 Jul 2023 01:20:07 +1000 Subject: [PATCH 402/413] transition load for PerfTrack, not send --- avr/cores/megacommand/MCL/PerfTrack.cpp | 7 +++++++ avr/cores/megacommand/MCL/PerfTrack.h | 1 + 2 files changed, 8 insertions(+) diff --git a/avr/cores/megacommand/MCL/PerfTrack.cpp b/avr/cores/megacommand/MCL/PerfTrack.cpp index d91d864b4..43631ca76 100644 --- a/avr/cores/megacommand/MCL/PerfTrack.cpp +++ b/avr/cores/megacommand/MCL/PerfTrack.cpp @@ -2,12 +2,19 @@ void PerfTrack::transition_send(uint8_t tracknumber, uint8_t slotnumber) { DEBUG_PRINTLN("transition send"); +} + +void PerfTrack::transition_load(uint8_t tracknumber, SeqTrack *seq_track, + uint8_t slotnumber) { + DEBUG_PRINTLN("transition send"); + GridTrack::transition_load(tracknumber, seq_track, slotnumber); load_perf(); } uint16_t PerfTrack::calc_latency(uint8_t tracknumber) { return 0; } + void PerfTrack::get_perf() { for (uint8_t n = 0; n < 4; n++) { diff --git a/avr/cores/megacommand/MCL/PerfTrack.h b/avr/cores/megacommand/MCL/PerfTrack.h index 72a9846eb..cc37412b0 100644 --- a/avr/cores/megacommand/MCL/PerfTrack.h +++ b/avr/cores/megacommand/MCL/PerfTrack.h @@ -64,6 +64,7 @@ class PerfTrack : public AUXTrack, public PerfTrackData { uint16_t calc_latency(uint8_t tracknumber); void transition_send(uint8_t tracknumber, uint8_t slotnumber); + void transition_load(uint8_t tracknumber, SeqTrack *seq_track, uint8_t slotnumber); bool store_in_grid(uint8_t column, uint16_t row, SeqTrack *seq_track = nullptr, uint8_t merge = 0, bool online = false, Grid *grid = nullptr); From d1a8e45e60b0d5b590c0adfc9e0894bae3bee9bf Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 30 Jul 2023 20:09:35 +1000 Subject: [PATCH 403/413] Only increment count if adding new --- avr/cores/megacommand/MCL/PerfData.h | 4 +++- avr/cores/megacommand/MCL/PerfEncoder.cpp | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/avr/cores/megacommand/MCL/PerfData.h b/avr/cores/megacommand/MCL/PerfData.h index 2d274f9ea..95a1eda0a 100644 --- a/avr/cores/megacommand/MCL/PerfData.h +++ b/avr/cores/megacommand/MCL/PerfData.h @@ -98,7 +98,9 @@ class PerfScene { params[b].dest = dest + 1; params[b].param = param; params[b].val = value; - count++; + if (match == 255) { + count++; + } return b; } diff --git a/avr/cores/megacommand/MCL/PerfEncoder.cpp b/avr/cores/megacommand/MCL/PerfEncoder.cpp index e972570a6..cea092d71 100644 --- a/avr/cores/megacommand/MCL/PerfEncoder.cpp +++ b/avr/cores/megacommand/MCL/PerfEncoder.cpp @@ -5,7 +5,7 @@ #define DIV_1_127 (1.00f / 127.0f) -static PerfScene PerfData::scenes[NUM_SCENES]; +PerfScene PerfData::scenes[NUM_SCENES]; void PerfEncoder::send_param(uint8_t dest, uint8_t param, uint8_t val) { if (dest >= NUM_MD_TRACKS + 4) { From f4acee63904e030e1138b3299083ee0c54bc47f7 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 30 Jul 2023 21:55:02 +1000 Subject: [PATCH 404/413] mute preview persistent bug --- avr/cores/megacommand/MCL/AuxPages.cpp | 8 ++++---- avr/cores/megacommand/MCL/MixerPage.cpp | 14 +++++++------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/avr/cores/megacommand/MCL/AuxPages.cpp b/avr/cores/megacommand/MCL/AuxPages.cpp index c7f84316c..c1758bd43 100644 --- a/avr/cores/megacommand/MCL/AuxPages.cpp +++ b/avr/cores/megacommand/MCL/AuxPages.cpp @@ -8,10 +8,10 @@ MCLEncoder mixer_param4; MCLEncoder route_param1(2, 5); MCLExpEncoder route_param2(1, 64); -MCLEncoder fx_param1; -MCLEncoder fx_param2; -MCLEncoder fx_param3; -MCLEncoder fx_param4; +MCLEncoder fx_param1(0, 127); +MCLEncoder fx_param2(0, 127); +MCLEncoder fx_param3(0, 127); +MCLEncoder fx_param4(0, 127); PerfEncoder perf_param1(0,127); PerfEncoder perf_param2(0,127); diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 5d8d5eb19..065d35bf5 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -96,8 +96,8 @@ void MixerPage::load_perf_locks(uint8_t state) { uint8_t val = perf_locks[state][n]; if (val < 128) { encoders[n]->cur = val; + encoders[n]->old = val; ((PerfEncoder *)encoders[n])->send(); - encoders[n]->old = encoders[n]->cur; } } } @@ -676,14 +676,14 @@ bool MixerPage::handleEvent(gui_event_t *event) { case MDX_KEY_DOWN: { uint64_t mask = ((uint64_t)1 << MDX_KEY_LEFT) | ((uint64_t)1 << MDX_KEY_UP) | - ((uint64_t)1 << MDX_KEY_RIGHT) | ((uint64_t)1 << MDX_KEY_DOWN) | - ((uint64_t)1 << MDX_KEY_YES); + ((uint64_t)1 << MDX_KEY_RIGHT) | ((uint64_t)1 << MDX_KEY_DOWN) | ((uint64_t)1 << MDX_KEY_YES); if ((trig_interface.cmd_key_state & mask) == 0) { trig_interface.send_md_leds(TRIGLED_OVERLAY); preview_mute_set = 255; redraw(); for (uint8_t n = 0; n < 4; n++) { if (perf_locks_temp[n] != 255) { + setLed2(); encoders[n]->cur = perf_locks_temp[n]; encoders[n]->old = encoders[n]->cur; } @@ -705,13 +705,13 @@ bool MixerPage::handleEvent(gui_event_t *event) { } if (EVENT_RELEASED(event, Buttons.BUTTON3)) { - global_release: - if (preview_mute_set == 255) { + + global_release: + preview_mute_set = 255; show_mixer_menu = false; disable_record_mutes(); MD.set_trigleds(0, TRIGLED_OVERLAY); - oled_draw_mutes(); - } + redraw(); return true; } From 6e3423d31328c6caecd61f5e2ebc92243a5ce1fe Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 30 Jul 2023 20:27:25 +1000 Subject: [PATCH 405/413] disable perf locks when sequencer is running. experminental --- avr/cores/megacommand/MCL/AuxPages.cpp | 8 +- avr/cores/megacommand/MCL/MixerPage.cpp | 99 +++++++++++++++---------- 2 files changed, 64 insertions(+), 43 deletions(-) diff --git a/avr/cores/megacommand/MCL/AuxPages.cpp b/avr/cores/megacommand/MCL/AuxPages.cpp index c1758bd43..c7f84316c 100644 --- a/avr/cores/megacommand/MCL/AuxPages.cpp +++ b/avr/cores/megacommand/MCL/AuxPages.cpp @@ -8,10 +8,10 @@ MCLEncoder mixer_param4; MCLEncoder route_param1(2, 5); MCLExpEncoder route_param2(1, 64); -MCLEncoder fx_param1(0, 127); -MCLEncoder fx_param2(0, 127); -MCLEncoder fx_param3(0, 127); -MCLEncoder fx_param4(0, 127); +MCLEncoder fx_param1; +MCLEncoder fx_param2; +MCLEncoder fx_param3; +MCLEncoder fx_param4; PerfEncoder perf_param1(0,127); PerfEncoder perf_param2(0,127); diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 065d35bf5..ce7fec15d 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -107,7 +107,8 @@ void MixerPage::loop() { perf_page.func_enc_check(); bool old_draw_encoders = draw_encoders; - if (preview_mute_set != 255 && note_interface.notes_on == 0) { + if ((MidiClock.state != 2 || trig_interface.is_key_down(MDX_KEY_NO))&& preview_mute_set != 255 && + note_interface.notes_on == 0) { for (uint8_t n = 0; n < GUI_NUM_ENCODERS; n++) { if (encoders[n]->hasChanged()) { if (BUTTON_DOWN(Buttons.ENCODER1 + n)) { @@ -267,10 +268,12 @@ void MixerPage::display() { if (show_mixer_menu && seq_step_page.display_mute_mask(midi_device)) { oled_draw_mutes(); - } - else if (mute_set != 255 && mute_sets[!is_md_device].mutes[mute_set] != seq_step_page.mute_mask) { + } else if (mute_set != 255 && mute_sets[!is_md_device].mutes[mute_set] != + seq_step_page.mute_mask) { uint16_t mask = mute_sets[!is_md_device].mutes[mute_set]; - if (!is_md_device) { mask &= 0b111111; } + if (!is_md_device) { + mask &= 0b111111; + } MD.set_trigleds(mask, TRIGLED_EXCLUSIVE); seq_step_page.mute_mask = mask; oled_draw_mutes(); @@ -283,7 +286,7 @@ void MixerPage::display() { str1[0] = 'A' + n; uint8_t pos = n * 24; bool highlight = - (preview_mute_set != 255) && (perf_locks[preview_mute_set][n] != 255); + (preview_mute_set != 255) && (perf_locks[preview_mute_set][n] != 255); // && (MidiClock.state != 2 || trig_interface.is_key_down(MDX_KEY_NO)); uint8_t val = highlight ? perf_locks[preview_mute_set][n] : encoders[n]->cur; mcl_gui.draw_encoder(24 + pos, fader_y + 4, val, highlight); @@ -356,23 +359,34 @@ void MixerPage::display() { } void MixerPage::record_mutes_set(bool state) { - bool is_md_device = (midi_device == &MD); - for (uint8_t i = 0; i < 16; i++) { - if (note_interface.is_note_on(i)) { - if (is_md_device) { mcl_seq.md_tracks[i].record_mutes = state; if (!state) mcl_seq.md_tracks[i].clear_mute(); } - else if (i < mcl_seq.num_ext_tracks) { mcl_seq.ext_tracks[i].record_mutes = state; if (!state) mcl_seq.ext_tracks[i].clear_mute(); } - } + bool is_md_device = (midi_device == &MD); + for (uint8_t i = 0; i < 16; i++) { + if (note_interface.is_note_on(i)) { + if (is_md_device) { + mcl_seq.md_tracks[i].record_mutes = state; + if (!state) + mcl_seq.md_tracks[i].clear_mute(); + } else if (i < mcl_seq.num_ext_tracks) { + mcl_seq.ext_tracks[i].record_mutes = state; + if (!state) + mcl_seq.ext_tracks[i].clear_mute(); + } } + } } void MixerPage::disable_record_mutes(bool clear) { for (uint8_t n = 0; n < mcl_seq.num_md_tracks; n++) { if (n < mcl_seq.num_ext_tracks) { mcl_seq.ext_tracks[n].record_mutes = false; - if (clear) { mcl_seq.ext_tracks[n].clear_mute(); } - } + if (clear) { + mcl_seq.ext_tracks[n].clear_mute(); + } + } mcl_seq.md_tracks[n].record_mutes = false; - if (clear) { mcl_seq.md_tracks[n].clear_mute(); } + if (clear) { + mcl_seq.md_tracks[n].clear_mute(); + } } if (!seq_step_page.recording) { clearLed2(); @@ -418,11 +432,11 @@ void MixerPage::switch_mute_set(uint8_t state) { uint8_t mute_set = state; bool mute_state = IS_BIT_CLEAR16(mute_sets[dev].mutes[state], n); - //Flip + // Flip if (state == 4 && devs[dev] == midi_device) { mute_state = !seq_track->mute_state; } - //Switch + // Switch if (mute_state != seq_track->mute_state) { devs[dev]->muteTrack(n, mute_state); if (is_md_device) { @@ -495,7 +509,6 @@ void MixerPage::toggle_or_solo(bool solo) { bool MixerPage::handleEvent(gui_event_t *event) { - if (note_interface.is_event(event)) { uint8_t mask = event->mask; uint8_t port = event->port; @@ -503,7 +516,6 @@ bool MixerPage::handleEvent(gui_event_t *event) { uint8_t track = event->source - 128; - uint8_t is_md_device = (midi_device == &MD); if (track > 16) { @@ -524,23 +536,27 @@ bool MixerPage::handleEvent(gui_event_t *event) { uint8_t mute_set = preview_mute_set; - //Toggle active mutes + // Toggle active mutes if (mute_set == 255) { - if (is_md_device) { mcl_seq.md_tracks[track].toggle_mute(); } - else { mcl_seq.ext_tracks[track].toggle_mute(); } + if (is_md_device) { + mcl_seq.md_tracks[track].toggle_mute(); + } else { + mcl_seq.ext_tracks[track].toggle_mute(); + } midi_device->muteTrack(track, seq_track->mute_state); return; } - //Toggle preview mutes - bool state = IS_BIT_SET16(mute_sets[!is_md_device].mutes[mute_set], track); + // Toggle preview mutes + bool state = + IS_BIT_SET16(mute_sets[!is_md_device].mutes[mute_set], track); if (state == SEQ_MUTE_ON) { CLEAR_BIT16(mute_sets[!is_md_device].mutes[mute_set], track); } else { SET_BIT16(mute_sets[!is_md_device].mutes[mute_set], track); } - // oled_draw_mutes(); + // oled_draw_mutes(); } else if (first_track == 255 && midi_device == &MD) { first_track = track; MD.setStatus(0x22, track); @@ -575,14 +591,14 @@ bool MixerPage::handleEvent(gui_event_t *event) { switch (key) { case MDX_KEY_KIT: { record_mutes_set(false); - // trig_interface.ignore_next_event(GLOBAL); - break; + // trig_interface.ignore_next_event(GLOBAL); + break; } - case MDX_KEY_PATSONGKIT: { + case MDX_KEY_PATSONGKIT: { bool clear = true; disable_record_mutes(true); - // trig_interface.ignore_next_event(GLOBAL); - break; + // trig_interface.ignore_next_event(GLOBAL); + break; } case MDX_KEY_EXTENDED: { if (midi_device == &MD) { @@ -597,15 +613,21 @@ bool MixerPage::handleEvent(gui_event_t *event) { break; } case MDX_KEY_NO: { - if (note_interface.notes_count_on() == 0) { - mcl.setPage(fx_page_a.last_page); - return true; - } + uint64_t mask = + ((uint64_t)1 << MDX_KEY_LEFT) | ((uint64_t)1 << MDX_KEY_UP) | + ((uint64_t)1 << MDX_KEY_RIGHT) | ((uint64_t)1 << MDX_KEY_DOWN); + if (((trig_interface.cmd_key_state & mask) == 0)) { + if (note_interface.notes_count_on() == 0) { + mcl.setPage(fx_page_a.last_page); + return true; + } toggle_or_solo(true); + } break; } case MDX_KEY_YES: { - if (preview_mute_set == 255 && trig_interface.is_key_down(MDX_KEY_FUNC) && + if (preview_mute_set == 255 && + trig_interface.is_key_down(MDX_KEY_FUNC) && note_interface.notes_on == 0) { switch_mute_set(4); //---> Flip mutes break; @@ -643,7 +665,7 @@ bool MixerPage::handleEvent(gui_event_t *event) { } else { preview_mute_set = set; for (uint8_t n = 0; n < 4; n++) { - if (perf_locks_temp[n] == 255) { + if (perf_locks_temp[n] == 255 && (MidiClock.state != 2 || trig_interface.is_key_down(MDX_KEY_NO))) { perf_locks_temp[n] = encoders[n]->cur; encoders[n]->old = encoders[n]->cur; } @@ -682,8 +704,7 @@ bool MixerPage::handleEvent(gui_event_t *event) { preview_mute_set = 255; redraw(); for (uint8_t n = 0; n < 4; n++) { - if (perf_locks_temp[n] != 255) { - setLed2(); + if (perf_locks_temp[n] != 255 && (MidiClock.state != 2 || trig_interface.is_key_down(MDX_KEY_NO))) { encoders[n]->cur = perf_locks_temp[n]; encoders[n]->old = encoders[n]->cur; } @@ -696,7 +717,7 @@ bool MixerPage::handleEvent(gui_event_t *event) { } } if (EVENT_PRESSED(event, Buttons.BUTTON3) && !BUTTON_DOWN(Buttons.BUTTON4)) { - //show_mixer_menu = true; + // show_mixer_menu = true; if (note_interface.notes_on) { setLed2(); record_mutes_set(true); @@ -720,7 +741,7 @@ bool MixerPage::handleEvent(gui_event_t *event) { return true; } - if (preview_mute_set != 255) { + if (preview_mute_set != 255 && (MidiClock.state != 2 || trig_interface.is_key_down(MDX_KEY_NO))) { if (event->source >= Buttons.ENCODER1 && event->source <= Buttons.ENCODER4) { uint8_t b = event->source - Buttons.ENCODER1; From 724301a3e05ba9255f414dab20967ff19e3b0b58 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 30 Jul 2023 23:22:38 +1000 Subject: [PATCH 406/413] Remove depenedncy on clock --- avr/cores/megacommand/MCL/MixerPage.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index ce7fec15d..64522638e 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -107,7 +107,7 @@ void MixerPage::loop() { perf_page.func_enc_check(); bool old_draw_encoders = draw_encoders; - if ((MidiClock.state != 2 || trig_interface.is_key_down(MDX_KEY_NO))&& preview_mute_set != 255 && + if ((trig_interface.is_key_down(MDX_KEY_NO))&& preview_mute_set != 255 && note_interface.notes_on == 0) { for (uint8_t n = 0; n < GUI_NUM_ENCODERS; n++) { if (encoders[n]->hasChanged()) { @@ -286,7 +286,7 @@ void MixerPage::display() { str1[0] = 'A' + n; uint8_t pos = n * 24; bool highlight = - (preview_mute_set != 255) && (perf_locks[preview_mute_set][n] != 255); // && (MidiClock.state != 2 || trig_interface.is_key_down(MDX_KEY_NO)); + (preview_mute_set != 255) && (perf_locks[preview_mute_set][n] != 255); // && (trig_interface.is_key_down(MDX_KEY_NO)); uint8_t val = highlight ? perf_locks[preview_mute_set][n] : encoders[n]->cur; mcl_gui.draw_encoder(24 + pos, fader_y + 4, val, highlight); @@ -665,7 +665,7 @@ bool MixerPage::handleEvent(gui_event_t *event) { } else { preview_mute_set = set; for (uint8_t n = 0; n < 4; n++) { - if (perf_locks_temp[n] == 255 && (MidiClock.state != 2 || trig_interface.is_key_down(MDX_KEY_NO))) { + if (perf_locks_temp[n] == 255 && (trig_interface.is_key_down(MDX_KEY_NO))) { perf_locks_temp[n] = encoders[n]->cur; encoders[n]->old = encoders[n]->cur; } @@ -704,7 +704,7 @@ bool MixerPage::handleEvent(gui_event_t *event) { preview_mute_set = 255; redraw(); for (uint8_t n = 0; n < 4; n++) { - if (perf_locks_temp[n] != 255 && (MidiClock.state != 2 || trig_interface.is_key_down(MDX_KEY_NO))) { + if (perf_locks_temp[n] != 255 && (trig_interface.is_key_down(MDX_KEY_NO))) { encoders[n]->cur = perf_locks_temp[n]; encoders[n]->old = encoders[n]->cur; } @@ -741,7 +741,7 @@ bool MixerPage::handleEvent(gui_event_t *event) { return true; } - if (preview_mute_set != 255 && (MidiClock.state != 2 || trig_interface.is_key_down(MDX_KEY_NO))) { + if (preview_mute_set != 255 && (trig_interface.is_key_down(MDX_KEY_NO))) { if (event->source >= Buttons.ENCODER1 && event->source <= Buttons.ENCODER4) { uint8_t b = event->source - Buttons.ENCODER1; From 1738b9088655d4e06b235f84777af24d0e5fc843 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 30 Jul 2023 23:27:29 +1000 Subject: [PATCH 407/413] Don't apply perf encoder change on load --- avr/cores/megacommand/MCL/PerfTrack.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/avr/cores/megacommand/MCL/PerfTrack.cpp b/avr/cores/megacommand/MCL/PerfTrack.cpp index 43631ca76..29cb24622 100644 --- a/avr/cores/megacommand/MCL/PerfTrack.cpp +++ b/avr/cores/megacommand/MCL/PerfTrack.cpp @@ -47,6 +47,7 @@ void PerfTrack::load_perf() { e->active_scene_a = encs[n].active_scene_a; e->active_scene_b = encs[n].active_scene_b; e->cur = encs[n].cur; + e->old = encs[n].cur; memcpy(e->name,encs[n].name, PERF_NAME_LENGTH); } memcpy(PerfData::scenes, scenes, sizeof(PerfScene) * NUM_SCENES); From 471cc2c745329e9b14de308b84d16e720ca774ab Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 30 Jul 2023 23:44:10 +1000 Subject: [PATCH 408/413] int to uint8_t where appropriate --- avr/cores/megacommand/MCL/ExtSeqTrack.cpp | 2 +- avr/cores/megacommand/MCL/Grid.cpp | 2 +- avr/cores/megacommand/MCL/MCLGUI.cpp | 6 +++--- avr/cores/megacommand/MCL/MDSeqTrack.cpp | 8 ++++---- avr/cores/megacommand/MCL/MidiActivePeering.cpp | 2 +- avr/cores/megacommand/MCL/MixerPage.cpp | 2 +- avr/cores/megacommand/MCL/MixerPage.h | 1 - avr/cores/megacommand/MCL/OscMixerPage.cpp | 2 +- avr/cores/megacommand/MCL/OscPage.cpp | 2 +- avr/cores/megacommand/MCL/PolyPage.cpp | 2 +- avr/cores/megacommand/MCL/RoutePage.cpp | 2 +- avr/cores/megacommand/MCL/SampleBrowserPage.cpp | 4 ++-- avr/cores/megacommand/MCL/SeqExtStepPage.cpp | 2 +- avr/cores/megacommand/MCL/SeqStepPage.cpp | 2 +- 14 files changed, 19 insertions(+), 20 deletions(-) diff --git a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp index 639fc4314..6ba663195 100644 --- a/avr/cores/megacommand/MCL/ExtSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/ExtSeqTrack.cpp @@ -510,7 +510,7 @@ bool ExtSeqTrack::del_note(uint16_t cur_x, uint16_t cur_w, uint8_t cur_y) { int16_t note_start, note_end; bool ret = false; - for (int i = 0; i < length; i++) { + for (uint8_t i = 0; i < length; i++) { again: note_idx_on = find_midi_note(i, cur_y, ev_idx, /*event_on*/ true); diff --git a/avr/cores/megacommand/MCL/Grid.cpp b/avr/cores/megacommand/MCL/Grid.cpp index a051b291f..7945abed2 100644 --- a/avr/cores/megacommand/MCL/Grid.cpp +++ b/avr/cores/megacommand/MCL/Grid.cpp @@ -179,7 +179,7 @@ bool Grid::clear_slot(uint8_t column, uint16_t row, bool update_header) { bool Grid::clear_row(uint16_t row) { GridRowHeader row_header; row_header.init(); - for (int x = 0; x < GRID_WIDTH; x++) { + for (uint8_t x = 0; x < GRID_WIDTH; x++) { clear_slot(x, row, false); } return write_row_header(&row_header, row); diff --git a/avr/cores/megacommand/MCL/MCLGUI.cpp b/avr/cores/megacommand/MCL/MCLGUI.cpp index c63589ad3..449e28a5d 100644 --- a/avr/cores/megacommand/MCL/MCLGUI.cpp +++ b/avr/cores/megacommand/MCL/MCLGUI.cpp @@ -609,7 +609,7 @@ void MCLGUI::draw_keyboard(uint8_t x, uint8_t y, uint8_t note_width, } void MCLGUI::draw_trigs(uint8_t x, uint8_t y, const uint16_t &trig_selection) { - for (int i = 0; i < 16; i++) { + for (uint8_t i = 0; i < 16; i++) { if (IS_BIT_SET16(trig_selection,i)) { oled_display.fillRect(x, y, seq_w, trig_h, WHITE); } @@ -625,7 +625,7 @@ void MCLGUI::draw_trigs(uint8_t x, uint8_t y, uint8_t offset, const uint64_t &pattern_mask, uint8_t step_count, uint8_t length, const uint64_t &mute_mask, const uint64_t &slide_mask) { - for (int i = 0; i < 16; i++) { + for (uint8_t i = 0; i < 16; i++) { uint8_t idx = i + offset; bool in_range = idx < length; @@ -741,7 +741,7 @@ void MCLGUI::draw_track_type_select(uint8_t track_type_select) { void MCLGUI::draw_leds(uint8_t x, uint8_t y, uint8_t offset, const uint64_t &lock_mask, uint8_t step_count, uint8_t length, bool show_current_step) { - for (int i = 0; i < 16; i++) { + for (uint8_t i = 0; i < 16; i++) { uint8_t idx = i + offset; bool in_range = idx < length; diff --git a/avr/cores/megacommand/MCL/MDSeqTrack.cpp b/avr/cores/megacommand/MCL/MDSeqTrack.cpp index 6e64c2d77..c673d4d21 100644 --- a/avr/cores/megacommand/MCL/MDSeqTrack.cpp +++ b/avr/cores/megacommand/MCL/MDSeqTrack.cpp @@ -287,7 +287,7 @@ void MDSeqTrack::find_next_locks(uint8_t curidx, uint8_t step, uint8_t mask) { void MDSeqTrack::get_mask(uint64_t *_pmask, uint8_t mask_type) const { *_pmask = 0; - for (int i = 0; i < NUM_MD_STEPS; i++) { + for (uint8_t i = 0; i < NUM_MD_STEPS; i++) { bool set_bit = false; switch (mask_type) { case MASK_PATTERN: @@ -714,7 +714,7 @@ void MDSeqTrack::clear_track(bool locks) { void MDSeqTrack::merge_from_md(uint8_t track_number, MDPattern *pattern) { DEBUG_PRINT_FN(); - for (int i = 0; i < 24; i++) { + for (uint8_t i = 0; i < 24; i++) { if (!IS_BIT_SET32(pattern->lockPatterns[track_number], i)) { continue; } @@ -722,7 +722,7 @@ void MDSeqTrack::merge_from_md(uint8_t track_number, MDPattern *pattern) { if (idx < 0) { continue; } - for (int s = 0; s < 64; s++) { + for (uint8_t s = 0; s < 64; s++) { int8_t lockval = pattern->locks[idx][s]; if (lockval >= 0 && IS_BIT_SET64(pattern->trigPatterns[track_number], s)) { @@ -822,7 +822,7 @@ void MDSeqTrack::modify_track(uint8_t dir) { uint16_t l = 0, r = 0; //mute_mask = 0; //unimplemented // reverse steps & locks - for (int i = 0; i <= length / 2; ++i) { + for (uint8_t i = 0; i <= length / 2; ++i) { int j = length - i - 1; if (j < i) { break; diff --git a/avr/cores/megacommand/MCL/MidiActivePeering.cpp b/avr/cores/megacommand/MCL/MidiActivePeering.cpp index a1aa005a7..8432312ee 100644 --- a/avr/cores/megacommand/MCL/MidiActivePeering.cpp +++ b/avr/cores/megacommand/MCL/MidiActivePeering.cpp @@ -143,7 +143,7 @@ static void probePort(uint8_t port, MidiDevice *drivers[], size_t nr_drivers, oled_display.drawBitmap(14, 8, icon, 34, 42, WHITE); } mcl_gui.delay_progress(0); - for (int probe_retry = 0; probe_retry < 6 && !probe_success; + for (uint8_t probe_retry = 0; probe_retry < 6 && !probe_success; ++probe_retry) { DEBUG_PRINTLN("probing..."); probe_success = drivers[i]->probe(); diff --git a/avr/cores/megacommand/MCL/MixerPage.cpp b/avr/cores/megacommand/MCL/MixerPage.cpp index 64522638e..2816a9c98 100644 --- a/avr/cores/megacommand/MCL/MixerPage.cpp +++ b/avr/cores/megacommand/MCL/MixerPage.cpp @@ -165,7 +165,7 @@ void encoder_level_handle(EncoderParent *enc) { int dir = enc->getValue() - enc->old; int track_newval; - for (int i = 0; i < 16; i++) { + for (uint8_t i = 0; i < 16; i++) { if (note_interface.is_note_on(i)) { track_newval = min(max(MD.kit.levels[i] + dir, 0), 127); mixer_page.set_level(i, track_newval); diff --git a/avr/cores/megacommand/MCL/MixerPage.h b/avr/cores/megacommand/MCL/MixerPage.h index 5f8613f24..77c939310 100644 --- a/avr/cores/megacommand/MCL/MixerPage.h +++ b/avr/cores/megacommand/MCL/MixerPage.h @@ -67,7 +67,6 @@ class MixerPage : public LightPage { memset(perf_locks,0xFF,sizeof(perf_locks)); } void adjust_param(EncoderParent *enc, uint8_t param); - void draw_levels(); void redraw(); void set_level(int curtrack, int value); diff --git a/avr/cores/megacommand/MCL/OscMixerPage.cpp b/avr/cores/megacommand/MCL/OscMixerPage.cpp index b72306673..1c45a913f 100644 --- a/avr/cores/megacommand/MCL/OscMixerPage.cpp +++ b/avr/cores/megacommand/MCL/OscMixerPage.cpp @@ -167,7 +167,7 @@ void OscMixerPage::draw_wav() { void OscMixerPage::draw_levels() { uint8_t scaled_level; char str[17] = " "; - for (int i = 0; i < 3; i++) { + for (uint8_t i = 0; i < 3; i++) { scaled_level = (uint8_t)(((float)encoders[i]->cur / (float)127) * 15); oled_display.fillRect(0 + i * 6, 12 + (15 - scaled_level), 4, diff --git a/avr/cores/megacommand/MCL/OscPage.cpp b/avr/cores/megacommand/MCL/OscPage.cpp index 3f5259424..0a786b17f 100644 --- a/avr/cores/megacommand/MCL/OscPage.cpp +++ b/avr/cores/megacommand/MCL/OscPage.cpp @@ -86,7 +86,7 @@ void OscPage::loop() { int dir = 0; int16_t newval; int8_t diff = enc_->cur - enc_->old; - for (int i = 0; i < 16; i++) { + for (uint8_t i = 0; i < 16; i++) { if (note_interface.is_note_on(i)) { if (osc_waveform == SIN_OSC) { newval = sine_levels[i] + diff; diff --git a/avr/cores/megacommand/MCL/PolyPage.cpp b/avr/cores/megacommand/MCL/PolyPage.cpp index cfecf71d6..b3edfab33 100644 --- a/avr/cores/megacommand/MCL/PolyPage.cpp +++ b/avr/cores/megacommand/MCL/PolyPage.cpp @@ -20,7 +20,7 @@ void PolyPage::cleanup() { } void PolyPage::draw_mask() { - for (int i = 0; i < 16; i++) { + for (uint8_t i = 0; i < 16; i++) { uint8_t x = i * 8; if (note_interface.is_note(i)) { diff --git a/avr/cores/megacommand/MCL/RoutePage.cpp b/avr/cores/megacommand/MCL/RoutePage.cpp index 8006581bc..adc59edb5 100644 --- a/avr/cores/megacommand/MCL/RoutePage.cpp +++ b/avr/cores/megacommand/MCL/RoutePage.cpp @@ -27,7 +27,7 @@ void RoutePage::draw_routes() { /*Display 16 track routes on screen, For 16 tracks check to see if there is a route*/ - for (int i = 0; i < 16; i++) { + for (uint8_t i = 0; i < 16; i++) { if (mcl_cfg.routing[i] != 6) { cur = (char)'A' + mcl_cfg.routing[i]; diff --git a/avr/cores/megacommand/MCL/SampleBrowserPage.cpp b/avr/cores/megacommand/MCL/SampleBrowserPage.cpp index 7ac7e9d2f..946ee47d2 100644 --- a/avr/cores/megacommand/MCL/SampleBrowserPage.cpp +++ b/avr/cores/megacommand/MCL/SampleBrowserPage.cpp @@ -391,8 +391,8 @@ void SampleBrowserPage::end() { char s_tmpbuf[5]; char temp_entry[FILE_ENTRY_SIZE]; - for (int i = 0, j = 7; i < nr_samplecount; ++i) { - for (int k = 0; k < 5; ++k) { + for (uint8_t i = 0, j = 7; i < nr_samplecount; ++i) { + for (uint8_t k = 0; k < 5; ++k) { s_tmpbuf[k] = sysex->getByte(++j); } bool slot_occupied = s_tmpbuf[4]; diff --git a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp index bb62bc4e0..45ae2e8a7 100644 --- a/avr/cores/megacommand/MCL/SeqExtStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqExtStepPage.cpp @@ -349,7 +349,7 @@ void SeqExtStepPage::draw_pianoroll() { uint16_t ev_idx = 0, ev_end = 0; uint8_t h = fov_h / fov_notes; - for (int i = 0; i < active_track.length; i++) { + for (uint8_t i = 0; i < active_track.length; i++) { // Update bucket index range ev_end += active_track.timing_buckets.get(i); diff --git a/avr/cores/megacommand/MCL/SeqStepPage.cpp b/avr/cores/megacommand/MCL/SeqStepPage.cpp index 4045eca0e..0222ececb 100644 --- a/avr/cores/megacommand/MCL/SeqStepPage.cpp +++ b/avr/cores/megacommand/MCL/SeqStepPage.cpp @@ -700,7 +700,7 @@ void SeqStepMidiEvents::onControlChangeCallback_Midi(uint8_t *msg) { } uint8_t store_lock = 255; - for (int i = 0; i < 16; i++) { + for (uint8_t i = 0; i < 16; i++) { if ((note_interface.is_note_on(i))) { step = i + (SeqPage::page_select * 16); if (step < active_track.length) { From 2adcdd9241e6797c82fe8f5a4fe5e69e6e50e023 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 30 Jul 2023 23:52:10 +1000 Subject: [PATCH 409/413] -- for null channel MIDI --- resource/menu_options.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resource/menu_options.cpp b/resource/menu_options.cpp index e8021c94b..cb7842204 100644 --- a/resource/menu_options.cpp +++ b/resource/menu_options.cpp @@ -15,7 +15,7 @@ menu_option_t MENU_OPTIONS[] = { // 16: MD NORMALIZE {0, "OFF"},{1, "AUTO"}, // 18: MD CTRL CHAN - {0, "INT"},{17, "OMNI"}, + {0, "--"},{17, "OMNI"}, // 20: MD CHAIN/Slot CHAIN {1, "AUT"},{2,"MAN"},{3,"QUE"}, // 23: SYSTEM DISPLAY From 178a27ca42fde758efb65401aba198b416533a31 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Sun, 30 Jul 2023 23:53:21 +1000 Subject: [PATCH 410/413] menu update --- .../megacommand/resources/R_menu_options.cpp | 298 +++++++++--------- 1 file changed, 148 insertions(+), 150 deletions(-) diff --git a/avr/cores/megacommand/resources/R_menu_options.cpp b/avr/cores/megacommand/resources/R_menu_options.cpp index c49020e7e..b4379ad48 100644 --- a/avr/cores/megacommand/resources/R_menu_options.cpp +++ b/avr/cores/megacommand/resources/R_menu_options.cpp @@ -78,403 +78,401 @@ const unsigned char __R_menu_options[] PROGMEM = { 53, 217, 17, - 15, - 73, - 78, - 84, - 99, - 7, + 14, + 45, + 45, + 207, + 62, 17, - 246, 79, + 236, 77, 78, 73, 26, - 27, - 80, 54, + 80, + 108, 62, - 31, + 63, 3, 81, 85, - 216, 69, - 0, - 44, - 77, - 1, - 222, + 103, + 36, + 73, + 217, + 78, + 84, + 62, + 187, 8, 43, 69, + 216, 88, 84, - 192, 80, - 90, - 232, - 193, - 135, - 216, - 45, - 45, - 179, - 61, + 13, + 79, + 204, + 43, + 80, + 39, + 1, 84, + 217, 82, 75, - 159, 71, + 246, 65, 76, 76, - 100, 26, - 62, + 67, 76, + 228, 67, 75, 83, - 66, - 30, + 33, + 236, 89, 69, 83, - 200, 44, - 216, + 141, + 135, 224, - 118, 82, + 96, 8, - 15, + 246, 3, 76, 62, - 103, 55, + 125, 4, - 216, 82, 62, + 131, 64, - 54, 32, + 98, 26, - 33, + 16, 94, - 0, - 251, + 15, 3, 51, + 179, 47, 10, - 59, + 180, 2, 8, - 66, + 39, 105, - 123, 4, + 176, 49, 17, - 7, + 114, 5, 49, - 32, - 218, + 13, 6, + 161, 8, - 16, 123, - 91, + 5, + 187, 179, 73, - 177, 71, 44, - 251, + 31, 83, 76, 73, 68, + 177, 69, 125, - 27, + 181, 79, 171, - 88, + 140, 71, - 194, 77, + 40, 22, - 132, + 79, 5, - 246, 88, 0, + 97, 170, - 27, + 176, 116, - 12, - 43, + 194, 227, + 179, 26, - 63, + 246, 128, 80, 82, 71, - 99, 16, + 56, 129, - 132, 80, + 65, 165, - 31, + 246, 130, 67, 72, 80, - 99, 8, + 48, 131, - 8, + 135, 40, - 127, 132, + 251, 76, 69, 65, 82, - 177, 78, 89, - 176, + 27, 49, 215, - 114, + 7, 76, 50, - 28, + 33, + 198, 51, - 96, 0, - 236, + 14, 76, 52, + 207, 8, - 249, 5, 76, + 147, 53, - 62, + 228, 6, 76, 54, - 79, + 249, 7, 76, - 147, 55, - 228, + 62, 8, 76, 56, - 246, + 79, 9, 80, + 96, 71, - 14, + 228, 10, 80, - 65, - 216, + 29, 11, 80, + 131, 53, - 59, 12, + 176, 80, 44, - 7, + 123, 13, 80, - 179, 57, 8, - 225, + 62, 14, 49, 83, + 18, 166, - 35, - 133, + 56, 83, + 86, 203, - 102, 134, - 230, + 110, 251, + 103, 134, - 124, 80, + 198, 85, 76, - 96, 135, - 236, + 14, 65, 87, + 204, 134, - 198, + 108, 77, - 198, 82, + 96, 117, - 14, + 236, 83, 67, - 198, 109, + 110, 1, - 235, 8, + 177, 50, 53, - 23, + 116, 8, - 66, 51, + 39, 31, - 125, 73, + 216, 88, 69, - 143, 37, + 246, 71, 69, 78, - 99, 8, + 59, 1, - 183, 69, 234, + 113, 75, 84, - 24, + 133, 171, - 95, + 241, 45, 62, 50, - 97, - 125, - 140, + 129, 117, - 47, + 125, 0, 66, - 182, 65, + 177, 136, 67, - 49, + 142, 126, - 198, 68, 86, + 50, 225, - 67, + 25, 49, - 37, - 50, + 41, + 147, 49, - 108, + 96, 35, - 3, - 76, + 26, + 102, 14, - 203, 35, - 164, + 93, 50, + 32, 41, - 8, - 225, + 71, 65, + 8, 211, - 15, + 123, 65, 35, - 96, 35, - 216, + 6, 66, + 195, 71, - 109, + 104, 148, - 8, + 65, 148, - 54, + 176, 67, 26, - 14, + 118, 5, 68, - 193, 17, - 200, + 14, 6, 68, - 52, + 65, + 165, 7, - 161, 30, + 8, 148, - 5, - 161, + 45, 105, + 8, 148, - 6, + 54, 70, - 193, 26, - 141, + 12, 10, + 104, 16, - 8, + 65, 148, - 59, + 216, 71, 35, 9, - 6, + 48, 67, - 20, + 161, 104, - 59, 95, + 216, 116, - 1, - 176, + 13, 66, + 135, 152, - 236, 67, + 97, 116, - 54, + 176, 98, - 24, - 0, + 192, 0, 0, 0, 0, - 39, + 1, + 63, 255, }; From d2dda19c32a1fa5384c08ec98c607933f302dcf6 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 31 Jul 2023 16:07:10 +1000 Subject: [PATCH 411/413] Fix rare crash when closing PerfMenu after returning from step edit. --- avr/cores/megacommand/MCL/PerfPage.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/avr/cores/megacommand/MCL/PerfPage.cpp b/avr/cores/megacommand/MCL/PerfPage.cpp index 809285be3..94dfec52a 100644 --- a/avr/cores/megacommand/MCL/PerfPage.cpp +++ b/avr/cores/megacommand/MCL/PerfPage.cpp @@ -611,6 +611,7 @@ bool PerfPage::handleEvent(gui_event_t *event) { return true; } if (EVENT_RELEASED(event, Buttons.BUTTON3)) { + if (show_menu) { void (*row_func)() = perf_menu_page.menu.get_row_function(perf_menu_page.encoders[1]->cur); if (row_func != NULL) { @@ -618,6 +619,7 @@ bool PerfPage::handleEvent(gui_event_t *event) { (*row_func)(); } init(); + } return true; } From 8efaf075c8c21ba62c3125f278ee70a50413c837 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 31 Jul 2023 16:10:58 +1000 Subject: [PATCH 412/413] Changelog --- Changelog | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Changelog b/Changelog index 841621cee..52538da78 100644 --- a/Changelog +++ b/Changelog @@ -56,8 +56,8 @@ Please install Machinedrum OS X.09 & Monomachine OS X.01 before using MCL 4.50. Each Mute Set also includes Performance Controller Locks. - To set a Performance Controller lock, hold down an Arrow Key and rotate the - respective encoder. + To set a Performance Controller lock, hold down an [Arrow] key followed by [Exit/No] and + rotate the respective encoder. - Chromatic Page: @@ -132,12 +132,14 @@ Please install Machinedrum OS X.09 & Monomachine OS X.01 before using MCL 4.50. Added a throttle to the [YES] key to prevent accidental double tap. + Empty tracks can now have customizable Length and Loop values adjustable via slot menu. + - Sound Browser The functionality to Save and Load MD Sounds is now separated from Sample Management. - The dedicated Sound Browser is accessible from the Sequencer Track Menu. + The dedicated Sound Browser is accessible from the Step Sequencer Track Menu. - Sample Browser From 1969ffeac6ee0a33379a56a84e234706b6c5baf9 Mon Sep 17 00:00:00 2001 From: Justin Mammarella Date: Mon, 31 Jul 2023 21:24:47 +1000 Subject: [PATCH 413/413] 4.50 --- avr/cores/megacommand/MCL/MCL.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/megacommand/MCL/MCL.h b/avr/cores/megacommand/MCL/MCL.h index 19a44bfa6..aa374a552 100644 --- a/avr/cores/megacommand/MCL/MCL.h +++ b/avr/cores/megacommand/MCL/MCL.h @@ -17,7 +17,7 @@ #include "Fonts/TomThumb.h" #define VERSION 4050 -#define VERSION_STR "RF4.50" +#define VERSION_STR "4.50" #define CALLBACK_TIMEOUT 500 #define GUI_NAME_TIMEOUT 800