// SPI flash handling
inline uint8_t fs_spi_1b (const uint8_t data); // send & receive single byte
-void fs_spi( // execute single command
+ void fs_spi( // execute single command
const uint8_t opcode,
const uint16_t address_bytes,
const uint16_t dummy_bytes,
inline void fs_spi_reset (void);
inline uint32_t fs_spi_read_id (void);
-inline void fs_wait_ready (const uint16_t timeout);
+inline void fs_wait_ready (const uint16_t timeout);
// support for filesystem operations
inline uint32_t fs_expand_address (
const uint8_t sector,
const uint8_t id
);
-uint16_t fs_get_file_type (
+ uint16_t fs_get_file_type (
const uint8_t sector,
const uint8_t id
);
inline void fs_index_next_file (void);
// filesystem operations, low level
-uint8_t fs_create_file (
+ uint8_t fs_create_file (
const uint8_t sector,
const uint8_t id,
const uint8_t type
);
-uint8_t fs_delete_file (
+ uint8_t fs_delete_file (
const uint8_t sector,
const uint8_t id
);
-uint8_t fs_duplicate_file (
+ uint8_t fs_duplicate_file (
const uint8_t src_sector,
const uint8_t src_id,
const uint8_t dst_sector,
const uint8_t dst_id
);
-inline void fs_erase_sector (const uint8_t sector);
-void fs_format (void);
-uint8_t fs_read_record (
+inline void fs_erase_sector (const uint8_t sector);
+ void fs_format (void);
+ uint8_t fs_read_record (
const uint8_t index,
const uint8_t block,
const uint8_t record,
uint8_t * const sector,
uint8_t * const fileid
);
-void fs_write_record (
+ void fs_write_record (
const uint8_t index,
const uint8_t block,
const uint8_t record,
const uint8_t sector,
const uint8_t fileid
);
-void fs_delete_record (
+ void fs_delete_record (
uint8_t index,
uint8_t block,
uint8_t record
);
// filesystem operations, high level
-void fs_get_file_name(
+ void fs_get_file_name(
const uint8_t sector,
const uint8_t id,
uint8_t * const name
);
-void fs_load_page (const uint8_t new_page);
-void fs_store_voice (
+ void fs_load_page (const uint8_t new_page);
+ void fs_store_voice (
const uint8_t id,
const uint8_t * const name,
const uint32_t A,
const uint32_t R,
const uint8_t * const wave
);
-uint8_t fs_load_voice (
+ uint8_t fs_load_voice (
const uint8_t id,
uint32_t * const A,
uint32_t * const D,
uint32_t * const R,
uint8_t * const wave
);
-void fs_optimise_sector (const uint8_t opt_sector);
-void fs_optimise_index (void);
+ void fs_delete_voice (const uint8_t id);
+inline uint8_t fs_is_voice_stored (const uint8_t id);
+ void fs_optimise_sector (const uint8_t opt_sector);
+ void fs_optimise_index (void);
// general
inline void setup_fs (void);
inline void init_fs (void);
-void debug_file (
+ void debug_file (
const uint8_t sector,
const uint8_t id
);
-void debug_sector (const uint8_t sector);
+ void debug_sector (const uint8_t sector);
volatile uint8_t button = 0;
volatile uint8_t button_old = 0;
volatile uint8_t button_new = 0;
+volatile uint8_t button_valid = 0;
volatile uint8_t button_hold = 0;
+volatile uint8_t button_long = 0;
volatile uint16_t button_count = 0;
volatile uint16_t button_hold_count = 0;
volatile uint16_t button_y_count = 0;
inline void reject_gui_events (void)
{
+ button_valid = 0; // reject any already pressed buttons
+ button_hold_count = 0; // to not get a long hold in new state
gui_event_r = gui_event_w;
}
{
button_hold_count = button_count;
press = button_new & (~button);
+ button_valid |= press;
release = button & (~button_new);
button = button_new;
+ release &= button_valid;
+ button_hold &= button_valid;
+ button_long &= button_valid;
+ button_valid &= button;
if (press)
add_gui_event(EVENT_PRESS | press);
if (release)
{
- if (button_hold & release)
+ if (button_long & release)
+ {
+ add_gui_event(EVENT_RELEASE | EVENT_WAS_HOLD | EVENT_LONG | release);
+ button_long &= (~release);
+ button_hold &= (~release);
+ }
+ else if (button_hold & release)
{
add_gui_event(EVENT_RELEASE | EVENT_WAS_HOLD | release);
button_hold &= (~release);
button_count = 0;
// do button debouncing for long hold
- if (button_hold_count < BUTTON_HOLD)
+ if (button_hold_count < (BUTTON_HOLD + BUTTON_LONG))
{
++button_hold_count;
if (button_hold_count == BUTTON_HOLD)
{
- if(button)
+ if (button & button_valid)
+ {
+ button_hold = button & button_valid;
+ add_gui_event(EVENT_HOLD | button_hold);
+ }
+ }
+ else if (button_hold_count == (BUTTON_HOLD + BUTTON_LONG))
+ {
+ if (button & button_valid)
{
- button_hold = button;
- add_gui_event(EVENT_HOLD | button);
+ button_long = button & button_valid;
+ add_gui_event(EVENT_HOLD | EVENT_LONG | button_long);
}
}
}
inline void gui_event_wave (const uint16_t event)
{
- if((event & EVENT_BITS) == EVENT_RELEASE)
+ switch (event & EVENT_BITS)
{
+ case EVENT_HOLD: // no need to check long hold
+ if (event & BUTTON_Y)
+ gui_gotostate_name(1);
+ break;
+ case EVENT_RELEASE:
if (event & BUTTON_X)
{
gui_gotostate_options();
gui_lock_adsr();
}
}
- }
- else if((event & EVENT_BITS) == EVENT_HOLD)
- {
- if (event & BUTTON_Y)
- gui_gotostate_name(1);
+ break;
}
}
inline void gui_event_select (const uint16_t event)
{
- // uint8_t wave, adsr;
uint8_t id;
+ int16_t new_page;
- if((event & EVENT_BITS) == EVENT_RELEASE)
+ if (event & BUTTON_A)
+ id = 0;
+ else if (event & BUTTON_B)
+ id = 1;
+ else if (event & BUTTON_C)
+ id = 2;
+ else if (event & BUTTON_D)
+ id = 3;
+ else if (event & BUTTON_E)
+ id = 4;
+ else if (event & BUTTON_F)
+ id = 5;
+
+ switch (event & EVENT_BITS)
{
- if (event & (BUTTON_A | BUTTON_B | BUTTON_C | BUTTON_D | BUTTON_E | BUTTON_F))
+ case EVENT_HOLD:
+ if (event & (BUTTON_ABCDEF))
{
- if (event & BUTTON_A)
- id = 0;
- else if (event & BUTTON_B)
- id = 1;
- else if (event & BUTTON_C)
- id = 2;
- else if (event & BUTTON_D)
- id = 3;
- else if (event & BUTTON_E)
- id = 4;
- else
- id = 5;
-
- // adsr = adsr_locked;
- // wave = wave_locked;
-
- gui_lock_adsr();
- gui_lock_wave();
-
- if (fs_load_voice(
- id,
- &adsr_A,
- &adsr_D,
- &adsr_S,
- &adsr_R,
- sample)
- ){
- ctrl_update_wave();
- ctrl_update_adsr();
- gui_update_adsr();
- gui_update_wave();
+ if (fs_is_voice_stored(id))
+ {
+ if (event & EVENT_LONG)
+ {
+ fs_delete_voice(id);
+ lcd_update_button(id, "");
+ reject_gui_events();
+ }
+ else
+ lcd_update_button(id, GUI_BUTTONTEXT_CONFIRM_REMOVE);
+ }
+ }
+ else if (event & BUTTON_Y) // no need to check long hold
+ gui_gotostate_name(1);
+ break;
+ case EVENT_RELEASE:
+ if (event & (BUTTON_ABCDEF))
+ {
+ if (fs_is_voice_stored(id))
+ {
+ if (event & EVENT_WAS_HOLD)
+ lcd_update_button(id, fs_page_names[id]);
+ else
+ {
+ gui_lock_adsr();
+ gui_lock_wave();
+
+ if (fs_load_voice(
+ id,
+ &adsr_A,
+ &adsr_D,
+ &adsr_S,
+ &adsr_R,
+ sample)
+ ){
+ ctrl_update_wave();
+ ctrl_update_adsr();
+ gui_update_adsr();
+ gui_update_wave();
+ }
+ else
+ {
+ gui_unlock_adsr();
+ gui_unlock_wave();
+ }
+ }
}
else
{
- // if(!adsr)
- gui_unlock_adsr();
- // if(!wave)
- gui_unlock_wave();
+ gui_unlock_adsr();
+ gui_unlock_wave();
}
}
else if (event & BUTTON_X)
gui_gotostate_options();
else if (event & BUTTON_Y)
gui_gotostate_wave();
- }
- else if((event & EVENT_BITS) == EVENT_HOLD)
- {
- if (event & BUTTON_Y)
- gui_gotostate_name(1);
- }
- else if((event & EVENT_BITS) == EVENT_JOG)
- {
+ break;
+ case EVENT_JOG:
if ((event & JOG_BITS) == JOG_PLUS)
- {
- if (gui_page < (N_PAGES - 1))
- ++gui_page;
- else
- gui_page = 0;
- }
+ new_page = gui_page + gui_jog_boost((event & JOG_TIME_BITS) << 3);
else
- {
- if (gui_page > 0)
- --gui_page;
- else
- gui_page = N_PAGES - 1;
- }
+ new_page = gui_page - gui_jog_boost((event & JOG_TIME_BITS) << 3);
+ if (new_page < 0)
+ gui_page = new_page + N_PAGES;
+ else if (new_page >= N_PAGES)
+ gui_page = new_page - N_PAGES;
+ else
+ gui_page = new_page;
draw_select();
reject_gui_events();
+ break;
}
}
{
uint8_t oldcursor;
- if((event & EVENT_BITS) == EVENT_RELEASE)
+ switch (event & EVENT_BITS)
{
+ case EVENT_RELEASE:
if (event & BUTTON_X)
{
if (gui_return_state == GUI_SELECT)
gui_gotostate_select_save();
}
}
- }
- else if((event & EVENT_BITS) == EVENT_JOG)
- {
+ break;
+ case EVENT_JOG:
oldcursor = gui_name_cursor;
if ((event & JOG_BITS) == JOG_PLUS)
{
}
lcd_draw_name_cursor(gui_name_cursor);
lcd_erase_name_cursor(oldcursor);
+ break;
}
}
inline void gui_event_select_save (const uint16_t event)
{
- uint8_t id;
+ uint8_t id = 0;
+ int16_t new_page;
- if((event & EVENT_BITS) == EVENT_RELEASE)
+ if (event & BUTTON_A)
+ id = 0;
+ else if (event & BUTTON_B)
+ id = 1;
+ else if (event & BUTTON_C)
+ id = 2;
+ else if (event & BUTTON_D)
+ id = 3;
+ else if (event & BUTTON_E)
+ id = 4;
+ else if (event & BUTTON_F)
+ id = 5;
+
+ switch (event & EVENT_BITS)
{
- if (event & (BUTTON_A | BUTTON_B | BUTTON_C | BUTTON_D | BUTTON_E | BUTTON_F))
+ case EVENT_PRESS:
+ if (event & (BUTTON_ABCDEF))
{
- if (event & BUTTON_A)
- id = 0;
- else if (event & BUTTON_B)
- id = 1;
- else if (event & BUTTON_C)
- id = 2;
- else if (event & BUTTON_D)
- id = 3;
- else if (event & BUTTON_E)
- id = 4;
- else
- id = 5;
-
- fs_store_voice(
- id,
- gui_name,
- adsr_A,
- adsr_D,
- adsr_S,
- adsr_R,
- sample
- );
-
- if (gui_return_state == GUI_SELECT)
- gui_gotostate_select();
- else
- gui_gotostate_wave();
+ if (fs_is_voice_stored(id))
+ lcd_update_button(id, GUI_BUTTONTEXT_CONFIRM_REPLACE);
}
- else if (event & BUTTON_X)
+ break;
+ case EVENT_HOLD:
+ if ((event & (BUTTON_ABCDEF)) && (event & EVENT_LONG))
{
- gui_gotostate_name(0);
+ if (fs_is_voice_stored(id))
+ {
+ fs_store_voice(
+ id,
+ gui_name,
+ adsr_A,
+ adsr_D,
+ adsr_S,
+ adsr_R,
+ sample
+ );
+
+ if (gui_return_state == GUI_SELECT)
+ gui_gotostate_select();
+ else
+ gui_gotostate_wave();
+ }
}
- }
- else if((event & EVENT_BITS) == EVENT_JOG)
- {
- if ((event & JOG_BITS) == JOG_PLUS)
+ break;
+ case EVENT_RELEASE:
+ if (event & (BUTTON_ABCDEF))
{
- if (gui_page < (N_PAGES - 1))
- ++gui_page;
+ if (fs_is_voice_stored(id))
+ lcd_update_button(id, fs_page_names[id]);
else
- gui_page = 0;
+ {
+ fs_store_voice(
+ id,
+ gui_name,
+ adsr_A,
+ adsr_D,
+ adsr_S,
+ adsr_R,
+ sample
+ );
+
+ if (gui_return_state == GUI_SELECT)
+ gui_gotostate_select();
+ else
+ gui_gotostate_wave();
+ }
}
- else
+ else if (event & BUTTON_X)
{
- if (gui_page > 0)
- --gui_page;
- else
- gui_page = N_PAGES - 1;
+ gui_gotostate_name(0);
}
+ break;
+ case EVENT_JOG:
+ if ((event & JOG_BITS) == JOG_PLUS)
+ new_page = gui_page + gui_jog_boost((event & JOG_TIME_BITS) << 3);
+ else
+ new_page = gui_page - gui_jog_boost((event & JOG_TIME_BITS) << 3);
+ if (new_page < 0)
+ gui_page = new_page + N_PAGES;
+ else if (new_page >= N_PAGES)
+ gui_page = new_page - N_PAGES;
+ else
+ gui_page = new_page;
draw_select_save();
reject_gui_events();
+ break;
}
}
inline void gui_event_options (const uint16_t event)
{
- if((event & EVENT_BITS) == EVENT_HOLD)
+ switch (event & EVENT_BITS)
{
+ case EVENT_PRESS:
+ if (event & BUTTON_F)
+ lcd_update_button(5, GUI_BUTTONTEXT_CONFIRM_RESET);
+ break;
+ case EVENT_HOLD:
if (event & BUTTON_A)
{
set_tuning(DEFAULT_TUNING);
make_text_tuning();
lcd_update_button(0, text_tuning);
+ reject_gui_events();
}
else if (event & BUTTON_B)
{
set_transp(0);
make_text_transpose();
lcd_update_button(1, text_transpose);
+ reject_gui_events();
}
else if (event & BUTTON_C)
{
ctrl_update_midi();
make_text_midi_in();
lcd_update_button(2, text_midi_in);
+ reject_gui_events();
}
else if (event & BUTTON_D)
{
ctrl_update_midi();
make_text_midi_out();
lcd_update_button(3, text_midi_out);
+ reject_gui_events();
}
// no long press on button E
else if (event & BUTTON_F)
- gui_gotostate_total_reset();
- }
- else if((event & EVENT_BITS) == EVENT_RELEASE)
- {
+ {
+ if (event & EVENT_LONG)
+ gui_gotostate_total_reset();
+ }
+ break;
+ case EVENT_RELEASE:
if (event & BUTTON_X)
gui_gotostate_wave();
else if (event & BUTTON_Y)
gui_gotostate_select();
else if (event & BUTTON_A)
- {
- if (!(event & EVENT_WAS_HOLD))
- gui_gotostate_tuning();
- }
+ gui_gotostate_tuning();
else if (event & BUTTON_B)
- {
- if (!(event & EVENT_WAS_HOLD))
- gui_gotostate_transpose();
- }
+ gui_gotostate_transpose();
else if (event & BUTTON_C)
- {
- if (!(event & EVENT_WAS_HOLD))
- gui_gotostate_midi_id();
- }
+ gui_gotostate_midi_id();
else if (event & BUTTON_D)
- {
- if (!(event & EVENT_WAS_HOLD))
- gui_gotostate_midi_id_out();
- }
+ gui_gotostate_midi_id_out();
else if (event & BUTTON_E)
{
if (midi_pedal_en)
}
ctrl_update_midi();
}
- // no short press on button F - long press is needed
+ else if (event & BUTTON_F)
+ lcd_update_button(5, GUI_BUTTONTEXT_RESET);
+ break;
}
}
inline void gui_event_tuning (const uint16_t event)
{
- if((event & EVENT_BITS) == EVENT_HOLD)
+ switch (event & EVENT_BITS)
{
+ case EVENT_HOLD:
if (event & BUTTON_A)
{
set_tuning(DEFAULT_TUNING);
make_text_tuning();
lcd_update_button(0, text_tuning);
+ reject_gui_events();
}
- }
- else if((event & EVENT_BITS) == EVENT_RELEASE)
- {
- if (
- (event & (BUTTON_X | BUTTON_Y)) ||
- ((event & BUTTON_A) && !(event & EVENT_WAS_HOLD))
- )
+ break;
+ case EVENT_RELEASE:
+ if (event & (BUTTON_A | BUTTON_X | BUTTON_Y))
gui_gotostate_options();
- }
- else if((event & EVENT_BITS) == EVENT_JOG)
- {
+ break;
+ case EVENT_JOG:
if ((event & JOG_BITS) == JOG_PLUS)
{
set_tuning(tuning + gui_jog_boost(event & JOG_TIME_BITS));
make_text_tuning();
lcd_update_button(0, text_tuning);
+ break;
}
}
inline void gui_event_transpose (const uint16_t event)
{
- if((event & EVENT_BITS) == EVENT_HOLD)
+ switch (event & EVENT_BITS)
{
+ case EVENT_HOLD:
if (event & BUTTON_B)
{
set_transp(0);
make_text_transpose();
- lcd_update_button(1, text_transpose);
+ lcd_update_button(1, text_transpose);
+ reject_gui_events();
}
- }
- else if((event & EVENT_BITS) == EVENT_RELEASE)
- {
- if (
- (event & (BUTTON_X | BUTTON_Y)) ||
- ((event & BUTTON_B) && !(event & EVENT_WAS_HOLD))
- )
+ break;
+ case EVENT_RELEASE:
+ if (event & (BUTTON_B | BUTTON_X | BUTTON_Y))
gui_gotostate_options();
- }
- else if((event & EVENT_BITS) == EVENT_JOG)
- {
+ break;
+ case EVENT_JOG:
if ((event & JOG_BITS) == JOG_PLUS)
{
if (transp<12)
make_text_transpose();
lcd_update_button(1, text_transpose);
+ break;
}
}
inline void gui_event_midi_id (const uint16_t event)
{
- if((event & EVENT_BITS) == EVENT_HOLD)
+ switch (event & EVENT_BITS)
{
+ case EVENT_HOLD:
if (event & BUTTON_C)
{
midi_id = N_MIDI_ID;
ctrl_update_midi();
make_text_midi_in();
lcd_update_button(2, text_midi_in);
+ reject_gui_events();
}
- }
- else if((event & EVENT_BITS) == EVENT_RELEASE)
- {
- if (
- (event & (BUTTON_X | BUTTON_Y)) ||
- ((event & BUTTON_C) && !(event & EVENT_WAS_HOLD))
- )
+ break;
+ case EVENT_RELEASE:
+ if (event & (BUTTON_C | BUTTON_X | BUTTON_Y))
gui_gotostate_options();
- }
- else if((event & EVENT_BITS) == EVENT_JOG)
- {
+ break;
+ case EVENT_JOG:
if ((event & JOG_BITS) == JOG_PLUS)
{
if (midi_id < N_MIDI_ID)
ctrl_update_midi();
make_text_midi_in();
lcd_update_button(2, text_midi_in);
+ break;
}
}
inline void gui_event_midi_id_out (const uint16_t event)
{
- if((event & EVENT_BITS) == EVENT_HOLD)
+ switch (event & EVENT_BITS)
{
+ case EVENT_HOLD:
if (event & BUTTON_D)
{
midi_id_out = 0;
ctrl_update_midi();
make_text_midi_out();
lcd_update_button(3, text_midi_out);
+ reject_gui_events();
}
- }
- else if((event & EVENT_BITS) == EVENT_RELEASE)
- {
- if (
- (event & (BUTTON_X | BUTTON_Y)) ||
- ((event & BUTTON_D) && !(event & EVENT_WAS_HOLD))
- )
+ break;
+ case EVENT_RELEASE:
+ if (event & (BUTTON_D | BUTTON_X | BUTTON_Y))
gui_gotostate_options();
- }
- else if((event & EVENT_BITS) == EVENT_JOG)
- {
+ break;
+ case EVENT_JOG:
if ((event & JOG_BITS) == JOG_PLUS)
{
if (midi_id_out < N_MIDI_ID-1)
ctrl_update_midi();
make_text_midi_out();
lcd_update_button(3, text_midi_out);
+ break;
}
}
inline void gui_event_err_fs (const uint16_t event)
{
- if((event & EVENT_BITS) == EVENT_RELEASE)
+ if ((event & EVENT_BITS) == EVENT_RELEASE)
{
if (event & BUTTON_D)
{
// debug_string(" HOLD", 1);
// if (event & EVENT_WAS_HOLD)
// debug_string(" (WAS HOLD)", 1);
+ // if (event & EVENT_LONG)
+ // debug_string(" (LONG)", 1);
// }
// debug_string("\r\n", 1);
/* GUI */
-/* Encoding of this file is ISO 8859-2 */
/*
-Copyright 2021, 2022, 2024 Balthasar Szczepañski
+Copyright 2021, 2022, 2024 Balthasar Szczepański
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
#define BUTTON_DEBOUNCE 4
#define BUTTON_HOLD 680
+#define BUTTON_LONG 2000
#define BUTTON_A 0b00000001
#define BUTTON_B 0b00000010
#define EVENT_RELEASE 0x4000
#define EVENT_HOLD 0xC000
#define EVENT_JOG 0x2000
+
+#define EVENT_FLAGS 0x1800
#define EVENT_WAS_HOLD 0x1000
+#define EVENT_LONG 0x0800
#define GUI_INIT 0x00
#define GUI_WAVE 0x01
#define GUI_ERRF_ALL (GUI_ERRF_AIX | GUI_ERRF_CTRL | GUI_ERRF_FS)
-#define LIST_ABC "A¡BCÆDEÊFGHIJKL£MNÑOÓPQRS¦TUVWXYZ¬¯"
-#define LIST_abc "a±bcædeêfghijkl³mnñoópqrs¶tuvwxyz¼¿"
+#define LIST_ABC "A""\xa1""BC""\xc6""DE""\xca""FGHIJKL""\xa3""MN""\xd1""O""\xd3""PQRS""\xa6""TUVWXYZ""\xac\xaf" /* AĄBCĆDEĘFGHIJKLŁMNŃOÓPQRSŚTUVWXYZŹŻ */
+#define LIST_abc "a""\xB1""bc""\xE6""de""\xEA""fghijkl""\xB3""mn""\xF1""o""\xF3""pqrs""\xB6""tuvwxyz""\xBC\xBF" /* aąbcćdeęfghijklłmnńoópqrsśtuvwxyzźż */
#define LIST_123 "0123456789.,!?:;+-*/=\\^<>()[]{}#$%&'\"`~_|@"
#define N_ABC 35
#define GUI_TITLE_ERR_FS "File system unformatted or damaged!"
#define GUI_TITLE_RESET "TERAS BENDZIE INNY $WIAT"
-#define GUI_BUTTONTEXT_DEL " <xx"
-#define GUI_BUTTONTEXT_SPACE ""
-#define GUI_BUTTONTEXT_ABC " ABC"
-#define GUI_BUTTONTEXT_abc " abc"
-#define GUI_BUTTONTEXT_123 " 123!?"
-#define GUI_BUTTONTEXT_OK " OK."
-#define GUI_BUTTONTEXT_MIDI_PEDAL "MIDI pedal allowed"
-#define GUI_BUTTONTEXT_MIDI_NOPEDAL "MIDI pedal illegal"
-#define GUI_BUTTONTEXT_RESET " TOTAL RESET"
-#define GUI_BUTTONTEXT_IGNORE "ignore and resume"
-#define GUI_BUTTONTEXT_RECOVER "recover(TODO)"
-#define GUI_BUTTONTEXT_FORMAT "format"
+#define GUI_BUTTONTEXT_DEL " <xx"
+#define GUI_BUTTONTEXT_SPACE ""
+#define GUI_BUTTONTEXT_ABC " ABC"
+#define GUI_BUTTONTEXT_abc " abc"
+#define GUI_BUTTONTEXT_123 " 123!?"
+#define GUI_BUTTONTEXT_OK " OK."
+#define GUI_BUTTONTEXT_MIDI_PEDAL "MIDI pedal allowed"
+#define GUI_BUTTONTEXT_MIDI_NOPEDAL "MIDI pedal illegal"
+#define GUI_BUTTONTEXT_RESET " TOTAL RESET"
+#define GUI_BUTTONTEXT_IGNORE "ignore and resume"
+#define GUI_BUTTONTEXT_RECOVER "recover(TODO)"
+#define GUI_BUTTONTEXT_FORMAT "format"
+#define GUI_BUTTONTEXT_CONFIRM_RESET "\x01\x01\x01\x01\x01\x01\x01HOLD TO RESET \x01\x01\x01\x01\x01\x01\x01"
+#define GUI_BUTTONTEXT_CONFIRM_REMOVE "\x01\x01\x01\x01\x01\x01\x01HOLD TOREMOVE \x01\x01\x01\x01\x01\x01\x01"
+#define GUI_BUTTONTEXT_CONFIRM_REPLACE "\x01\x01\x01\x01\x01\x01\x01HOLD TOREPLACE\x01\x01\x01\x01\x01\x01\x01"
#define GUI_BUTTONTEXT_TUNING "tuning "
#define GUI_BUTTONTEXT_TUNING_N 15