|
|
|
@ -3637,9 +3637,9 @@ void UI_func_voice_select(uint8_t param) |
|
|
|
|
char voice_name[VOICE_NAME_LEN]; |
|
|
|
|
|
|
|
|
|
if (!get_bank_name(configuration.performance.bank[selected_instance_id], bank_name, sizeof(bank_name))) |
|
|
|
|
strncpy(bank_name, "*ERROR*", sizeof(bank_name)); |
|
|
|
|
strcpy(bank_name, "*ERROR*"); |
|
|
|
|
if (!get_voice_by_bank_name(configuration.performance.bank[selected_instance_id], bank_name, configuration.performance.voice[selected_instance_id], voice_name, sizeof(voice_name))) |
|
|
|
|
strncpy(voice_name, "*ERROR*", sizeof(voice_name)); |
|
|
|
|
strcpy(voice_name, "*ERROR*"); |
|
|
|
|
|
|
|
|
|
lcd.setCursor(14, 0); |
|
|
|
|
lcd.write(0); |
|
|
|
@ -3756,22 +3756,22 @@ void UI_func_voice_select(uint8_t param) |
|
|
|
|
|
|
|
|
|
if (strlen(g_bank_name[selected_instance_id]) > 0) |
|
|
|
|
{ |
|
|
|
|
strncpy(bank_name, g_bank_name[selected_instance_id], sizeof(bank_name)); |
|
|
|
|
strcpy(bank_name, g_bank_name[selected_instance_id]); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
if (!get_bank_name(configuration.performance.bank[selected_instance_id], bank_name, sizeof(bank_name))) |
|
|
|
|
strncpy(bank_name, "*ERROR*", sizeof(bank_name)); |
|
|
|
|
strcpy(bank_name, "*ERROR*"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (strlen(g_voice_name[selected_instance_id]) > 0) |
|
|
|
|
{ |
|
|
|
|
strncpy(voice_name, g_voice_name[selected_instance_id], sizeof(voice_name)); |
|
|
|
|
strcpy(voice_name, g_voice_name[selected_instance_id]); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
if (!get_voice_by_bank_name(configuration.performance.bank[selected_instance_id], bank_name, configuration.performance.voice[selected_instance_id], voice_name, sizeof(voice_name))) |
|
|
|
|
strncpy(voice_name, "*ERROR*", sizeof(voice_name)); |
|
|
|
|
strcpy(voice_name, "*ERROR*"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
lcd.show(0, 0, 2, configuration.performance.bank[selected_instance_id]); |
|
|
|
@ -4520,7 +4520,7 @@ void UI_func_save_voice(uint8_t param) |
|
|
|
|
char bank_name[BANK_NAME_LEN]; |
|
|
|
|
|
|
|
|
|
if (!get_bank_name(configuration.performance.bank[selected_instance_id], bank_name, sizeof(bank_name))) |
|
|
|
|
strncpy(bank_name, "*ERROR*", sizeof(bank_name)); |
|
|
|
|
strcpy(bank_name, "*ERROR*"); |
|
|
|
|
|
|
|
|
|
lcd.setCursor(0, 0); |
|
|
|
|
lcd.print(F("Save to Bank")); |
|
|
|
@ -4565,7 +4565,7 @@ void UI_func_save_voice(uint8_t param) |
|
|
|
|
configuration.performance.bank[selected_instance_id] = constrain(configuration.performance.bank[selected_instance_id] - ENCODER[ENC_R].speed(), 0, MAX_BANKS - 1); |
|
|
|
|
|
|
|
|
|
if (!get_bank_name(configuration.performance.bank[selected_instance_id], bank_name, sizeof(bank_name))) |
|
|
|
|
strncpy(bank_name, "*ERROR*", sizeof(bank_name)); |
|
|
|
|
strcpy(bank_name, "*ERROR*"); |
|
|
|
|
|
|
|
|
|
lcd.show(1, 0, 2, configuration.performance.bank[selected_instance_id]); |
|
|
|
|
lcd.show(1, 4, 10, bank_name); |
|
|
|
@ -4702,7 +4702,7 @@ void UI_func_sysex_receive_bank(uint8_t param) |
|
|
|
|
lcd.setCursor(0, 1); |
|
|
|
|
lcd.print(F("[ ]")); |
|
|
|
|
if (!get_bank_name(configuration.performance.bank[selected_instance_id], receive_bank_filename, sizeof(receive_bank_filename))) |
|
|
|
|
strncpy(receive_bank_filename, "*ERROR*", 7); |
|
|
|
|
strcpy(receive_bank_filename, "*ERROR*"); |
|
|
|
|
lcd.show(1, 1, 2, bank_number); |
|
|
|
|
lcd.show(1, 5, 10, receive_bank_filename); |
|
|
|
|
} |
|
|
|
@ -4718,7 +4718,7 @@ void UI_func_sysex_receive_bank(uint8_t param) |
|
|
|
|
case 0: |
|
|
|
|
bank_number = constrain(bank_number + ENCODER[ENC_R].speed(), 0, MAX_BANKS - 1); |
|
|
|
|
if (!get_bank_name(bank_number, receive_bank_filename, sizeof(receive_bank_filename))) |
|
|
|
|
strncpy(receive_bank_filename, "*ERROR*", 7); |
|
|
|
|
strcpy(receive_bank_filename, "*ERROR*"); |
|
|
|
|
lcd.show(1, 1, 2, bank_number); |
|
|
|
|
lcd.show(1, 5, 10, receive_bank_filename); |
|
|
|
|
break; |
|
|
|
@ -4741,7 +4741,7 @@ void UI_func_sysex_receive_bank(uint8_t param) |
|
|
|
|
case 0: |
|
|
|
|
bank_number = constrain(bank_number - ENCODER[ENC_R].speed(), 0, MAX_BANKS - 1); |
|
|
|
|
if (!get_bank_name(bank_number, receive_bank_filename, sizeof(receive_bank_filename))) |
|
|
|
|
strncpy(receive_bank_filename, "*ERROR*", sizeof(receive_bank_filename)); |
|
|
|
|
strcpy(receive_bank_filename, "*ERROR*"); |
|
|
|
|
lcd.show(1, 1, 2, bank_number); |
|
|
|
|
lcd.show(1, 5, 10, receive_bank_filename); |
|
|
|
|
break; |
|
|
|
@ -4762,11 +4762,14 @@ void UI_func_sysex_receive_bank(uint8_t param) |
|
|
|
|
{ |
|
|
|
|
if (mode == 0) |
|
|
|
|
{ |
|
|
|
|
if (!strncmp(receive_bank_filename, "*ERROR*", sizeof(receive_bank_filename))) |
|
|
|
|
if (!strcmp(receive_bank_filename, "*ERROR*")) |
|
|
|
|
{ |
|
|
|
|
yesno = true; |
|
|
|
|
strncpy(receive_bank_filename, "NONAME", 6); |
|
|
|
|
mode += 2; |
|
|
|
|
strcpy(receive_bank_filename, "NONAME"); |
|
|
|
|
mode = 2; |
|
|
|
|
lcd.setCursor(0, 1); |
|
|
|
|
lcd.print(F("[ ] ")); |
|
|
|
|
ui_select_name_state = UI_select_name(1, 1, receive_bank_filename, BANK_NAME_LEN - 1, true); |
|
|
|
|
lcd.blink(); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
@ -4781,8 +4784,8 @@ void UI_func_sysex_receive_bank(uint8_t param) |
|
|
|
|
mode = 2; |
|
|
|
|
lcd.setCursor(0, 1); |
|
|
|
|
lcd.print(F("[ ] ")); |
|
|
|
|
lcd.blink(); |
|
|
|
|
ui_select_name_state = UI_select_name(1, 1, receive_bank_filename, BANK_NAME_LEN - 1, true); |
|
|
|
|
lcd.blink(); |
|
|
|
|
} |
|
|
|
|
else if (mode == 2) |
|
|
|
|
{ |
|
|
|
@ -4797,7 +4800,7 @@ void UI_func_sysex_receive_bank(uint8_t param) |
|
|
|
|
Serial.println(F("]")); |
|
|
|
|
#endif |
|
|
|
|
char tmp[FILENAME_LEN]; |
|
|
|
|
strncpy(tmp, receive_bank_filename, strlen(receive_bank_filename)); |
|
|
|
|
strcpy(tmp, receive_bank_filename); |
|
|
|
|
sprintf(receive_bank_filename, "/%d/%s.syx", bank_number, tmp); |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
Serial.print(F("Receiving into bank ")); |
|
|
|
@ -5083,15 +5086,21 @@ bool UI_select_name(uint8_t y, uint8_t x, char* edit_string, uint8_t len, bool i |
|
|
|
|
static int8_t edit_pos; |
|
|
|
|
static bool edit_mode; |
|
|
|
|
static uint8_t edit_value; |
|
|
|
|
static uint8_t last_char_pos; |
|
|
|
|
|
|
|
|
|
if (init == true) |
|
|
|
|
{ |
|
|
|
|
lcd.setCursor(x, y); |
|
|
|
|
lcd.print(edit_string); |
|
|
|
|
edit_mode = false; |
|
|
|
|
edit_pos = 0; |
|
|
|
|
edit_value = search_accepted_char(edit_string[edit_pos]); |
|
|
|
|
last_char_pos = strlen(edit_string); |
|
|
|
|
|
|
|
|
|
string_trim(edit_string); // just to be sure
|
|
|
|
|
|
|
|
|
|
lcd.setCursor(x, y); |
|
|
|
|
lcd.print(edit_string); |
|
|
|
|
lcd.setCursor(x, y); |
|
|
|
|
|
|
|
|
|
return (false); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -5105,6 +5114,9 @@ bool UI_select_name(uint8_t y, uint8_t x, char* edit_string, uint8_t len, bool i |
|
|
|
|
|
|
|
|
|
if (edit_value < sizeof(accepted_chars) - 2) |
|
|
|
|
edit_value++; |
|
|
|
|
if (edit_value == 0 && edit_string[constrain(edit_pos + 1, 0, len)] > 0) |
|
|
|
|
edit_value = 1; |
|
|
|
|
|
|
|
|
|
edit_string[edit_pos] = accepted_chars[edit_value]; |
|
|
|
|
|
|
|
|
|
lcd.setCursor(x + edit_pos, y); |
|
|
|
@ -5112,7 +5124,13 @@ bool UI_select_name(uint8_t y, uint8_t x, char* edit_string, uint8_t len, bool i |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
if (edit_string[edit_pos] != 0 && edit_string[edit_pos] != 32) |
|
|
|
|
edit_pos = constrain(edit_pos + 1, 0, len); |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
if (edit_pos + 1 > last_char_pos) |
|
|
|
|
edit_pos = len; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (edit_pos == len) |
|
|
|
|
{ |
|
|
|
@ -5134,6 +5152,8 @@ bool UI_select_name(uint8_t y, uint8_t x, char* edit_string, uint8_t len, bool i |
|
|
|
|
|
|
|
|
|
if (edit_value >= 1) |
|
|
|
|
edit_value--; |
|
|
|
|
if (edit_value == 0 && edit_string[constrain(edit_pos + 1, 0, len)] > 0) |
|
|
|
|
edit_value = 1; |
|
|
|
|
edit_string[edit_pos] = accepted_chars[edit_value]; |
|
|
|
|
|
|
|
|
|
lcd.setCursor(x + edit_pos, y); |
|
|
|
@ -5141,9 +5161,12 @@ bool UI_select_name(uint8_t y, uint8_t x, char* edit_string, uint8_t len, bool i |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
if (edit_pos - 1 > last_char_pos) |
|
|
|
|
edit_pos = last_char_pos; |
|
|
|
|
else |
|
|
|
|
edit_pos = constrain(edit_pos - 1, 0, len - 1); |
|
|
|
|
|
|
|
|
|
if (edit_pos == len - 1) |
|
|
|
|
if (edit_pos == last_char_pos) |
|
|
|
|
{ |
|
|
|
|
lcd.setCursor(x - 1, y); |
|
|
|
|
lcd.print(F("[")); |
|
|
|
@ -5158,18 +5181,33 @@ bool UI_select_name(uint8_t y, uint8_t x, char* edit_string, uint8_t len, bool i |
|
|
|
|
} |
|
|
|
|
else if (LCDML.BT_checkEnter()) |
|
|
|
|
{ |
|
|
|
|
last_char_pos = strlen(edit_string); |
|
|
|
|
if (edit_pos >= len) |
|
|
|
|
{ |
|
|
|
|
edit_pos = 0; |
|
|
|
|
edit_mode = false; |
|
|
|
|
string_trim(edit_string); |
|
|
|
|
//string_trim(edit_string);
|
|
|
|
|
|
|
|
|
|
return (true); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
last_char_pos = strlen(edit_string); |
|
|
|
|
edit_mode = !edit_mode; |
|
|
|
|
} |
|
|
|
|
if (edit_mode == false && edit_pos < len && edit_string[edit_pos] != 0 && edit_string[edit_pos] != 32) |
|
|
|
|
edit_pos++; |
|
|
|
|
if (edit_mode == true) |
|
|
|
|
{ |
|
|
|
|
lcd.setCursor(x + len + 1, y); |
|
|
|
|
lcd.print(F("*")); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
lcd.setCursor(x + len + 1, y); |
|
|
|
|
lcd.print(F(" ")); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
lcd.setCursor(x + edit_pos, y); |
|
|
|
|
encoderDir[ENC_R].reset(); |
|
|
|
@ -5179,11 +5217,16 @@ bool UI_select_name(uint8_t y, uint8_t x, char* edit_string, uint8_t len, bool i |
|
|
|
|
|
|
|
|
|
uint8_t search_accepted_char(uint8_t c) |
|
|
|
|
{ |
|
|
|
|
if (c == 0) |
|
|
|
|
c = 32; |
|
|
|
|
//if (c == 0)
|
|
|
|
|
// c = 32;
|
|
|
|
|
|
|
|
|
|
for (uint8_t i = 0; i < sizeof(accepted_chars); i++) |
|
|
|
|
for (uint8_t i = 0; i < sizeof(accepted_chars) - 1; i++) |
|
|
|
|
{ |
|
|
|
|
Serial.print(i, DEC); |
|
|
|
|
Serial.print(":"); |
|
|
|
|
Serial.print(c); |
|
|
|
|
Serial.print("=="); |
|
|
|
|
Serial.println(accepted_chars[i], DEC); |
|
|
|
|
if (c == accepted_chars[i]) |
|
|
|
|
return (i); |
|
|
|
|
} |
|
|
|
|