|
|
|
@ -97,6 +97,7 @@ extern char receive_bank_filename[FILENAME_LEN]; |
|
|
|
|
GLOBAL |
|
|
|
|
************************************************************************/ |
|
|
|
|
elapsedMillis back_from_volume; |
|
|
|
|
uint8_t instance_num[2][8]; |
|
|
|
|
|
|
|
|
|
#ifdef I2C_DISPLAY |
|
|
|
|
#include <LiquidCrystal_I2C.h> |
|
|
|
@ -139,14 +140,19 @@ const uint8_t meter_bar[5][8] = { |
|
|
|
|
{B00001, B00001, B00001, B00001, B00001, B00001, B00001, B00001} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
const uint8_t inverse_num[4][8] = { |
|
|
|
|
const uint8_t inverse_num[2][8] = { |
|
|
|
|
{B11111, B11011, B10011, B11011, B11011, B11011, B10001, B11111}, |
|
|
|
|
{B11111, B11011, B10101, B11101, B11011, B10111, B10001, B11111} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/* const uint8_t inverse_num[4][8] = {
|
|
|
|
|
{B11111, B11011, B10011, B11011, B11011, B11011, B10001, B11111}, |
|
|
|
|
{B11111, B11011, B10101, B11101, B11011, B10111, B10001, B11111}, |
|
|
|
|
{B00000, B00100, B01100, B00100, B00100, B00100, B01110, B00000}, |
|
|
|
|
{B00000, B00100, B01010, B00010, B00100, B01000, B01110, B00000} |
|
|
|
|
}; |
|
|
|
|
};*/ |
|
|
|
|
|
|
|
|
|
enum { SCROLLBAR, BLOCKBAR, METERBAR, INVERSE_NUM }; |
|
|
|
|
enum { SCROLLBAR, BLOCKBAR, METERBAR }; |
|
|
|
|
enum { ENC_R, ENC_L }; |
|
|
|
|
enum {MENU_VOICE_BANK, MENU_VOICE_SOUND}; |
|
|
|
|
uint8_t menu_voice_select = MENU_VOICE_SOUND; |
|
|
|
@ -231,6 +237,7 @@ void lcd_display_bar_int(const char* title, uint32_t value, float factor, int32_ |
|
|
|
|
void lcd_display_bar_float(const char* title, float value, float factor, int32_t min_value, int32_t max_value, uint8_t size_number, uint8_t size_fraction, bool zeros, bool brackets, bool sign, bool init); |
|
|
|
|
void lcd_display_meter_int(const char* title, uint32_t value, float factor, float offset, int32_t min_value, int32_t max_value, uint8_t size, bool zeros, bool brackets, bool sign, bool init); |
|
|
|
|
void lcd_display_meter_float(const char* title, float value, float factor, float offset, int32_t min_value, int32_t max_value, uint8_t size_number, uint8_t size_fraction, bool zeros, bool brackets, bool sign, bool init); |
|
|
|
|
void lcd_active_instance_number(uint8_t instance_id); |
|
|
|
|
void lcd_special_chars(uint8_t mode); |
|
|
|
|
void eeprom_update_var(uint16_t pos, uint8_t val, const char* val_string); |
|
|
|
|
|
|
|
|
@ -394,9 +401,8 @@ bool menu_init = true; |
|
|
|
|
|
|
|
|
|
#ifdef U8X8_DISPLAY |
|
|
|
|
const uint8_t * flipped_scroll_bar[5]; |
|
|
|
|
const uint8_t * flipped_block_bar[5]; |
|
|
|
|
const uint8_t * flipped_meter_bar[5]; |
|
|
|
|
const uint8_t * flipped_inverse_num[4]; |
|
|
|
|
const uint8_t * flipped_block_bar[7]; |
|
|
|
|
const uint8_t * flipped_meter_bar[7]; |
|
|
|
|
|
|
|
|
|
uint8_t * rotTile(const uint8_t * tile) |
|
|
|
|
{ |
|
|
|
@ -1668,17 +1674,30 @@ void UI_func_highest_note(uint8_t param) |
|
|
|
|
|
|
|
|
|
void UI_func_sound_intensity(uint8_t param) |
|
|
|
|
{ |
|
|
|
|
uint8_t instance_id = 0; |
|
|
|
|
static uint8_t instance_id; |
|
|
|
|
|
|
|
|
|
if (LCDML.FUNC_getID() > MENU_ID_OF_INSTANCE_2) |
|
|
|
|
instance_id = 1; |
|
|
|
|
else |
|
|
|
|
instance_id = 0; |
|
|
|
|
|
|
|
|
|
if (LCDML.FUNC_setup()) // ****** SETUP *********
|
|
|
|
|
{ |
|
|
|
|
encoderDir[ENC_R].reset(); |
|
|
|
|
|
|
|
|
|
lcd_special_chars(BLOCKBAR); |
|
|
|
|
lcd_display_bar_float("Voice Level", float(configuration.dexed[instance_id].sound_intensity), 1.0, SOUND_INTENSITY_MIN, SOUND_INTENSITY_MAX, 3, 0, false, false, false, true); |
|
|
|
|
|
|
|
|
|
lcd_active_instance_number(instance_id); |
|
|
|
|
|
|
|
|
|
lcd_display_bar_int("Voice Level", configuration.dexed[instance_id].sound_intensity, 1.0, SOUND_INTENSITY_MIN, SOUND_INTENSITY_MAX, 3, false, false, false, true); |
|
|
|
|
|
|
|
|
|
#if NUM_DEXED > 1 |
|
|
|
|
lcd_display_bar_int("Voice Level", configuration.dexed[instance_id].sound_intensity, 1.0, SOUND_INTENSITY_MIN, SOUND_INTENSITY_MAX, 3, false, false, false, true); |
|
|
|
|
lcd.setCursor(15, 0); |
|
|
|
|
lcd.write(5); |
|
|
|
|
lcd.setCursor(15, 1); |
|
|
|
|
lcd.write(6); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (LCDML.FUNC_loop()) // ****** LOOP *********
|
|
|
|
@ -1691,7 +1710,7 @@ void UI_func_sound_intensity(uint8_t param) |
|
|
|
|
configuration.dexed[instance_id].sound_intensity = constrain(configuration.dexed[instance_id].sound_intensity - ENCODER[ENC_R].speed(), SOUND_INTENSITY_MIN, SOUND_INTENSITY_MAX); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
lcd_display_bar_float("Voice Level", float(configuration.dexed[instance_id].sound_intensity), 1.0, SOUND_INTENSITY_MIN, SOUND_INTENSITY_MAX, 3, 0, false, false, false, false); |
|
|
|
|
lcd_display_bar_int("Voice Level", configuration.dexed[instance_id].sound_intensity, 1.0, SOUND_INTENSITY_MIN, SOUND_INTENSITY_MAX, 3, false, false, false, false); |
|
|
|
|
dexed_level[instance_id]->gain(mapfloat(configuration.dexed[instance_id].sound_intensity, SOUND_INTENSITY_MIN, SOUND_INTENSITY_MAX, 0.0, SOUND_INTENSITY_AMP_MAX)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -3305,44 +3324,38 @@ void UI_func_eeprom_reset(uint8_t param) |
|
|
|
|
|
|
|
|
|
void UI_func_voice_select(uint8_t param) |
|
|
|
|
{ |
|
|
|
|
static uint8_t voice_select_instance_id; |
|
|
|
|
static uint8_t instance_id; |
|
|
|
|
static uint8_t menu_voice_select = MENU_VOICE_SOUND; |
|
|
|
|
|
|
|
|
|
if (LCDML.FUNC_setup()) // ****** SETUP *********
|
|
|
|
|
{ |
|
|
|
|
lcd_special_chars(INVERSE_NUM); |
|
|
|
|
|
|
|
|
|
encoderDir[ENC_R].reset(); |
|
|
|
|
|
|
|
|
|
if (LCDML.FUNC_getID() > MENU_ID_OF_INSTANCE_2) |
|
|
|
|
voice_select_instance_id = 1; |
|
|
|
|
instance_id = 1; |
|
|
|
|
else |
|
|
|
|
voice_select_instance_id = 0; |
|
|
|
|
instance_id = 0; |
|
|
|
|
|
|
|
|
|
lcd_active_instance_number(instance_id); |
|
|
|
|
|
|
|
|
|
char bank_name[BANK_NAME_LEN]; |
|
|
|
|
char voice_name[VOICE_NAME_LEN]; |
|
|
|
|
|
|
|
|
|
if (!get_bank_name(configuration.performance.bank[voice_select_instance_id], bank_name, sizeof(bank_name))) |
|
|
|
|
if (!get_bank_name(configuration.performance.bank[instance_id], bank_name, sizeof(bank_name))) |
|
|
|
|
strncpy(bank_name, "*ERROR*", sizeof(bank_name)); |
|
|
|
|
if (!get_voice_by_bank_name(configuration.performance.bank[voice_select_instance_id], bank_name, configuration.performance.voice[voice_select_instance_id], voice_name, sizeof(voice_name))) |
|
|
|
|
if (!get_voice_by_bank_name(configuration.performance.bank[instance_id], bank_name, configuration.performance.voice[instance_id], voice_name, sizeof(voice_name))) |
|
|
|
|
strncpy(voice_name, "*ERROR*", sizeof(voice_name)); |
|
|
|
|
|
|
|
|
|
lcd.show(0, 0, 2, configuration.performance.bank[voice_select_instance_id]); |
|
|
|
|
lcd.show(1, 0, 2, configuration.performance.voice[voice_select_instance_id] + 1); |
|
|
|
|
lcd.show(0, 0, 2, configuration.performance.bank[instance_id]); |
|
|
|
|
lcd.show(1, 0, 2, configuration.performance.voice[instance_id] + 1); |
|
|
|
|
lcd.show(0, 4, 10, bank_name); |
|
|
|
|
lcd.show(1, 4, 10, voice_name); |
|
|
|
|
|
|
|
|
|
#if NUM_DEXED > 1 |
|
|
|
|
lcd.setCursor(15, 0); |
|
|
|
|
if (voice_select_instance_id == 0) |
|
|
|
|
lcd.write(voice_select_instance_id); |
|
|
|
|
else |
|
|
|
|
lcd.write(2); |
|
|
|
|
lcd.write(5); |
|
|
|
|
lcd.setCursor(15, 1); |
|
|
|
|
if (voice_select_instance_id == 1) |
|
|
|
|
lcd.write(voice_select_instance_id); |
|
|
|
|
else |
|
|
|
|
lcd.write(3); |
|
|
|
|
lcd.write(6); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
switch (menu_voice_select) |
|
|
|
@ -3377,37 +3390,37 @@ void UI_func_voice_select(uint8_t param) |
|
|
|
|
switch (menu_voice_select) |
|
|
|
|
{ |
|
|
|
|
case MENU_VOICE_BANK: |
|
|
|
|
memset(g_bank_name[voice_select_instance_id], 0, BANK_NAME_LEN); |
|
|
|
|
bank_tmp = constrain(configuration.performance.bank[voice_select_instance_id] - ENCODER[ENC_R].speed(), 0, MAX_BANKS - 1); |
|
|
|
|
configuration.performance.bank[voice_select_instance_id] = bank_tmp; |
|
|
|
|
memset(g_bank_name[instance_id], 0, BANK_NAME_LEN); |
|
|
|
|
bank_tmp = constrain(configuration.performance.bank[instance_id] - ENCODER[ENC_R].speed(), 0, MAX_BANKS - 1); |
|
|
|
|
configuration.performance.bank[instance_id] = bank_tmp; |
|
|
|
|
#ifdef DISPLAY_LCD_SPI |
|
|
|
|
change_disp_sd(false); |
|
|
|
|
#endif |
|
|
|
|
load_sd_voice(configuration.performance.bank[voice_select_instance_id], configuration.performance.voice[voice_select_instance_id], voice_select_instance_id); |
|
|
|
|
load_sd_voice(configuration.performance.bank[instance_id], configuration.performance.voice[instance_id], instance_id); |
|
|
|
|
#ifdef DISPLAY_LCD_SPI |
|
|
|
|
change_disp_sd(true); |
|
|
|
|
#endif |
|
|
|
|
break; |
|
|
|
|
case MENU_VOICE_SOUND: |
|
|
|
|
memset(g_voice_name[voice_select_instance_id], 0, VOICE_NAME_LEN); |
|
|
|
|
voice_tmp = configuration.performance.voice[voice_select_instance_id] - ENCODER[ENC_R].speed(); |
|
|
|
|
if (voice_tmp < 0 && configuration.performance.bank[voice_select_instance_id] - 1 >= 0) |
|
|
|
|
memset(g_voice_name[instance_id], 0, VOICE_NAME_LEN); |
|
|
|
|
voice_tmp = configuration.performance.voice[instance_id] - ENCODER[ENC_R].speed(); |
|
|
|
|
if (voice_tmp < 0 && configuration.performance.bank[instance_id] - 1 >= 0) |
|
|
|
|
{ |
|
|
|
|
configuration.performance.bank[voice_select_instance_id]--; |
|
|
|
|
configuration.performance.bank[voice_select_instance_id] = constrain(configuration.performance.bank[voice_select_instance_id], 0, MAX_BANKS - 1); |
|
|
|
|
configuration.performance.bank[instance_id]--; |
|
|
|
|
configuration.performance.bank[instance_id] = constrain(configuration.performance.bank[instance_id], 0, MAX_BANKS - 1); |
|
|
|
|
} |
|
|
|
|
else if (voice_tmp < 0 && configuration.performance.bank[voice_select_instance_id] - 1 <= 0) |
|
|
|
|
else if (voice_tmp < 0 && configuration.performance.bank[instance_id] - 1 <= 0) |
|
|
|
|
{ |
|
|
|
|
voice_tmp = 0; |
|
|
|
|
} |
|
|
|
|
if (voice_tmp < 0) |
|
|
|
|
voice_tmp = MAX_VOICES + voice_tmp; |
|
|
|
|
configuration.performance.voice[voice_select_instance_id] = constrain(voice_tmp, 0, MAX_VOICES - 1); |
|
|
|
|
configuration.performance.voice[instance_id] = constrain(voice_tmp, 0, MAX_VOICES - 1); |
|
|
|
|
|
|
|
|
|
#ifdef DISPLAY_LCD_SPI |
|
|
|
|
change_disp_sd(false); |
|
|
|
|
#endif |
|
|
|
|
load_sd_voice(configuration.performance.bank[voice_select_instance_id], configuration.performance.voice[voice_select_instance_id], voice_select_instance_id); |
|
|
|
|
load_sd_voice(configuration.performance.bank[instance_id], configuration.performance.voice[instance_id], instance_id); |
|
|
|
|
#ifdef DISPLAY_LCD_SPI |
|
|
|
|
change_disp_sd(true); |
|
|
|
|
#endif |
|
|
|
@ -3419,36 +3432,36 @@ void UI_func_voice_select(uint8_t param) |
|
|
|
|
switch (menu_voice_select) |
|
|
|
|
{ |
|
|
|
|
case MENU_VOICE_BANK: |
|
|
|
|
memset(g_bank_name[voice_select_instance_id], 0, BANK_NAME_LEN); |
|
|
|
|
bank_tmp = constrain(configuration.performance.bank[voice_select_instance_id] + ENCODER[ENC_R].speed(), 0, MAX_BANKS - 1); |
|
|
|
|
configuration.performance.bank[voice_select_instance_id] = bank_tmp; |
|
|
|
|
memset(g_bank_name[instance_id], 0, BANK_NAME_LEN); |
|
|
|
|
bank_tmp = constrain(configuration.performance.bank[instance_id] + ENCODER[ENC_R].speed(), 0, MAX_BANKS - 1); |
|
|
|
|
configuration.performance.bank[instance_id] = bank_tmp; |
|
|
|
|
#ifdef DISPLAY_LCD_SPI |
|
|
|
|
change_disp_sd(false); |
|
|
|
|
#endif |
|
|
|
|
load_sd_voice(configuration.performance.bank[voice_select_instance_id], configuration.performance.voice[voice_select_instance_id], voice_select_instance_id); |
|
|
|
|
load_sd_voice(configuration.performance.bank[instance_id], configuration.performance.voice[instance_id], instance_id); |
|
|
|
|
#ifdef DISPLAY_LCD_SPI |
|
|
|
|
change_disp_sd(true); |
|
|
|
|
#endif |
|
|
|
|
break; |
|
|
|
|
case MENU_VOICE_SOUND: |
|
|
|
|
memset(g_voice_name[voice_select_instance_id], 0, VOICE_NAME_LEN); |
|
|
|
|
voice_tmp = configuration.performance.voice[voice_select_instance_id] + ENCODER[ENC_R].speed(); |
|
|
|
|
if (voice_tmp >= MAX_VOICES && configuration.performance.bank[voice_select_instance_id] + 1 < MAX_BANKS) |
|
|
|
|
memset(g_voice_name[instance_id], 0, VOICE_NAME_LEN); |
|
|
|
|
voice_tmp = configuration.performance.voice[instance_id] + ENCODER[ENC_R].speed(); |
|
|
|
|
if (voice_tmp >= MAX_VOICES && configuration.performance.bank[instance_id] + 1 < MAX_BANKS) |
|
|
|
|
{ |
|
|
|
|
voice_tmp %= MAX_VOICES; |
|
|
|
|
configuration.performance.bank[voice_select_instance_id]++; |
|
|
|
|
configuration.performance.bank[voice_select_instance_id] = constrain(configuration.performance.bank[voice_select_instance_id], 0, MAX_BANKS - 1); |
|
|
|
|
configuration.performance.bank[instance_id]++; |
|
|
|
|
configuration.performance.bank[instance_id] = constrain(configuration.performance.bank[instance_id], 0, MAX_BANKS - 1); |
|
|
|
|
} |
|
|
|
|
else if (voice_tmp >= MAX_VOICES && configuration.performance.bank[voice_select_instance_id] + 1 >= MAX_BANKS) |
|
|
|
|
else if (voice_tmp >= MAX_VOICES && configuration.performance.bank[instance_id] + 1 >= MAX_BANKS) |
|
|
|
|
{ |
|
|
|
|
voice_tmp = MAX_VOICES - 1; |
|
|
|
|
} |
|
|
|
|
configuration.performance.voice[voice_select_instance_id] = constrain(voice_tmp, 0, MAX_VOICES - 1); |
|
|
|
|
configuration.performance.voice[instance_id] = constrain(voice_tmp, 0, MAX_VOICES - 1); |
|
|
|
|
|
|
|
|
|
#ifdef DISPLAY_LCD_SPI |
|
|
|
|
change_disp_sd(false); |
|
|
|
|
#endif |
|
|
|
|
load_sd_voice(configuration.performance.bank[voice_select_instance_id], configuration.performance.voice[voice_select_instance_id], voice_select_instance_id); |
|
|
|
|
load_sd_voice(configuration.performance.bank[instance_id], configuration.performance.voice[instance_id], instance_id); |
|
|
|
|
#ifdef DISPLAY_LCD_SPI |
|
|
|
|
change_disp_sd(true); |
|
|
|
|
#endif |
|
|
|
@ -3469,31 +3482,27 @@ void UI_func_voice_select(uint8_t param) |
|
|
|
|
if (menu_voice_select == MENU_VOICE_BANK) |
|
|
|
|
{ |
|
|
|
|
menu_voice_select = MENU_VOICE_SOUND; |
|
|
|
|
voice_select_instance_id = !voice_select_instance_id; |
|
|
|
|
instance_id = !instance_id; |
|
|
|
|
|
|
|
|
|
lcd_active_instance_number(instance_id); |
|
|
|
|
|
|
|
|
|
char bank_name[BANK_NAME_LEN]; |
|
|
|
|
char voice_name[VOICE_NAME_LEN]; |
|
|
|
|
|
|
|
|
|
if (!get_bank_name(configuration.performance.bank[voice_select_instance_id], bank_name, sizeof(bank_name))) |
|
|
|
|
if (!get_bank_name(configuration.performance.bank[instance_id], bank_name, sizeof(bank_name))) |
|
|
|
|
strncpy(bank_name, "*ERROR*", sizeof(bank_name)); |
|
|
|
|
if (!get_voice_by_bank_name(configuration.performance.bank[voice_select_instance_id], bank_name, configuration.performance.voice[voice_select_instance_id], voice_name, sizeof(voice_name))) |
|
|
|
|
if (!get_voice_by_bank_name(configuration.performance.bank[instance_id], bank_name, configuration.performance.voice[instance_id], voice_name, sizeof(voice_name))) |
|
|
|
|
strncpy(voice_name, "*ERROR*", sizeof(voice_name)); |
|
|
|
|
|
|
|
|
|
lcd.show(0, 0, 2, configuration.performance.bank[voice_select_instance_id]); |
|
|
|
|
lcd.show(1, 0, 2, configuration.performance.voice[voice_select_instance_id] + 1); |
|
|
|
|
lcd.show(0, 0, 2, configuration.performance.bank[instance_id]); |
|
|
|
|
lcd.show(1, 0, 2, configuration.performance.voice[instance_id] + 1); |
|
|
|
|
lcd.show(0, 4, 10, bank_name); |
|
|
|
|
lcd.show(1, 4, 10, voice_name); |
|
|
|
|
|
|
|
|
|
lcd.setCursor(15, 0); |
|
|
|
|
if (voice_select_instance_id == 0) |
|
|
|
|
lcd.write(voice_select_instance_id); |
|
|
|
|
else |
|
|
|
|
lcd.write(2); |
|
|
|
|
lcd.write(5); |
|
|
|
|
lcd.setCursor(15, 1); |
|
|
|
|
if (voice_select_instance_id == 1) |
|
|
|
|
lcd.write(voice_select_instance_id); |
|
|
|
|
else |
|
|
|
|
lcd.write(3); |
|
|
|
|
lcd.write(6); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
menu_voice_select = MENU_VOICE_BANK; |
|
|
|
@ -3501,28 +3510,28 @@ void UI_func_voice_select(uint8_t param) |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (strlen(g_bank_name[voice_select_instance_id]) > 0) |
|
|
|
|
if (strlen(g_bank_name[instance_id]) > 0) |
|
|
|
|
{ |
|
|
|
|
strncpy(bank_name, g_bank_name[voice_select_instance_id], sizeof(bank_name)); |
|
|
|
|
strncpy(bank_name, g_bank_name[instance_id], sizeof(bank_name)); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
if (!get_bank_name(configuration.performance.bank[voice_select_instance_id], bank_name, sizeof(bank_name))) |
|
|
|
|
if (!get_bank_name(configuration.performance.bank[instance_id], bank_name, sizeof(bank_name))) |
|
|
|
|
strncpy(bank_name, "*ERROR*", sizeof(bank_name)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (strlen(g_voice_name[voice_select_instance_id]) > 0) |
|
|
|
|
if (strlen(g_voice_name[instance_id]) > 0) |
|
|
|
|
{ |
|
|
|
|
strncpy(voice_name, g_voice_name[voice_select_instance_id], sizeof(voice_name)); |
|
|
|
|
strncpy(voice_name, g_voice_name[instance_id], sizeof(voice_name)); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
if (!get_voice_by_bank_name(configuration.performance.bank[voice_select_instance_id], bank_name, configuration.performance.voice[voice_select_instance_id], voice_name, sizeof(voice_name))) |
|
|
|
|
if (!get_voice_by_bank_name(configuration.performance.bank[instance_id], bank_name, configuration.performance.voice[instance_id], voice_name, sizeof(voice_name))) |
|
|
|
|
strncpy(voice_name, "*ERROR*", sizeof(voice_name)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
lcd.show(0, 0, 2, configuration.performance.bank[voice_select_instance_id]); |
|
|
|
|
lcd.show(1, 0, 2, configuration.performance.voice[voice_select_instance_id] + 1); |
|
|
|
|
lcd.show(0, 0, 2, configuration.performance.bank[instance_id]); |
|
|
|
|
lcd.show(1, 0, 2, configuration.performance.voice[instance_id] + 1); |
|
|
|
|
lcd.show(0, 4, 10, bank_name); |
|
|
|
|
lcd.show(1, 4, 10, voice_name); |
|
|
|
|
|
|
|
|
@ -3545,10 +3554,8 @@ void UI_func_voice_select(uint8_t param) |
|
|
|
|
|
|
|
|
|
if (LCDML.FUNC_close()) // ****** STABLE END *********
|
|
|
|
|
{ |
|
|
|
|
lcd_special_chars(SCROLLBAR); |
|
|
|
|
|
|
|
|
|
encoderDir[ENC_R].reset(); |
|
|
|
|
if (voice_select_instance_id == 0) |
|
|
|
|
if (instance_id == 0) |
|
|
|
|
{ |
|
|
|
|
//eeprom_update_var(offsetof(configuration_s, performance.voice[0]), configuration.performance.voice[0], "configuration.performance.voice[0]");
|
|
|
|
|
//eeprom_update_var(offsetof(configuration_s, performance.bank[0]), configuration.performance.bank[0], "configuration.performance.bank[0]");
|
|
|
|
@ -4635,7 +4642,12 @@ inline void lcd_display_bar_int(const char* title, uint32_t value, float factor, |
|
|
|
|
void lcd_display_bar_float(const char* title, float value, float factor, int32_t min_value, int32_t max_value, uint8_t size_number, uint8_t size_fraction, bool zeros, bool brackets, bool sign, bool init) |
|
|
|
|
{ |
|
|
|
|
uint8_t size = 0; |
|
|
|
|
float v = float((value - min_value) * LCD_cols) / (max_value - min_value); |
|
|
|
|
#if NUM_DEXED == 1 |
|
|
|
|
uint8_t cols = LCD_cols; |
|
|
|
|
#else |
|
|
|
|
uint8_t cols = LCD_cols - 1; |
|
|
|
|
#endif |
|
|
|
|
float v = float((value - min_value) * cols) / (max_value - min_value); |
|
|
|
|
float _vi = 0.0; |
|
|
|
|
uint8_t vf = uint8_t(modff(v, &_vi) * 10.0 + 0.5); |
|
|
|
|
uint8_t vi = uint8_t(_vi); |
|
|
|
@ -4659,15 +4671,15 @@ void lcd_display_bar_float(const char* title, float value, float factor, int32_t |
|
|
|
|
// Value-Brackets
|
|
|
|
|
if (brackets == true) |
|
|
|
|
{ |
|
|
|
|
lcd.setCursor(LCD_cols - size, 0); |
|
|
|
|
lcd.setCursor(cols - size, 0); |
|
|
|
|
lcd.print(F("[")); |
|
|
|
|
lcd.setCursor(LCD_cols - 1, 0); |
|
|
|
|
lcd.setCursor(cols - 1, 0); |
|
|
|
|
lcd.print(F("]")); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Value
|
|
|
|
|
lcd.setCursor(LCD_cols - size, 0); |
|
|
|
|
lcd.setCursor(cols - size, 0); |
|
|
|
|
lcd_display_float(value * factor, size_number, size_fraction, zeros, brackets, sign); |
|
|
|
|
|
|
|
|
|
// Bar
|
|
|
|
@ -4676,16 +4688,16 @@ void lcd_display_bar_float(const char* title, float value, float factor, int32_t |
|
|
|
|
if (vi == 0) |
|
|
|
|
{ |
|
|
|
|
lcd.write((uint8_t)vf / 2.0 - 0.5); |
|
|
|
|
for (uint8_t i = vi + 1; i < LCD_cols; i++) |
|
|
|
|
for (uint8_t i = vi + 1; i < cols; i++) |
|
|
|
|
lcd.print(F(" ")); // empty block
|
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
for (uint8_t i = 0; i < vi; i++) |
|
|
|
|
lcd.write((uint8_t)4); // full block
|
|
|
|
|
if (vi < LCD_cols) |
|
|
|
|
if (vi < cols) |
|
|
|
|
lcd.write((uint8_t)vf / 2.0 - 0.5); |
|
|
|
|
for (uint8_t i = vi + 1; i < LCD_cols; i++) |
|
|
|
|
for (uint8_t i = vi + 1; i < cols; i++) |
|
|
|
|
lcd.print(F(" ")); // empty block
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -4698,7 +4710,12 @@ inline void lcd_display_meter_int(const char* title, uint32_t value, float facto |
|
|
|
|
void lcd_display_meter_float(const char* title, float value, float factor, float offset, int32_t min_value, int32_t max_value, uint8_t size_number, uint8_t size_fraction, bool zeros, bool brackets, bool sign, bool init) |
|
|
|
|
{ |
|
|
|
|
uint8_t size = 0; |
|
|
|
|
float v = float((value - min_value) * LCD_cols) / (max_value - min_value); |
|
|
|
|
#if NUM_DEXED == 1 |
|
|
|
|
uint8_t cols = LCD_cols; |
|
|
|
|
#else |
|
|
|
|
uint8_t cols = LCD_cols - 1; |
|
|
|
|
#endif |
|
|
|
|
float v = float((value - min_value) * cols) / (max_value - min_value); |
|
|
|
|
float _vi = 0.0; |
|
|
|
|
uint8_t vf = uint8_t(modff(v, &_vi) * 10.0 + 0.5); |
|
|
|
|
uint8_t vi = uint8_t(_vi); |
|
|
|
@ -4722,15 +4739,15 @@ void lcd_display_meter_float(const char* title, float value, float factor, float |
|
|
|
|
// Value-Brackets
|
|
|
|
|
if (brackets == true) |
|
|
|
|
{ |
|
|
|
|
lcd.setCursor(LCD_cols - size, 0); |
|
|
|
|
lcd.setCursor(cols - size, 0); |
|
|
|
|
lcd.print(F("[")); |
|
|
|
|
lcd.setCursor(LCD_cols - 1, 0); |
|
|
|
|
lcd.setCursor(cols - 1, 0); |
|
|
|
|
lcd.print(F("]")); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Value
|
|
|
|
|
lcd.setCursor(LCD_cols - size, 0); |
|
|
|
|
lcd.setCursor(cols - size, 0); |
|
|
|
|
lcd_display_float((value + offset) * factor, size_number, size_fraction, zeros, brackets, sign); |
|
|
|
|
|
|
|
|
|
// Bar
|
|
|
|
@ -4739,26 +4756,46 @@ void lcd_display_meter_float(const char* title, float value, float factor, float |
|
|
|
|
if (vi == 0) |
|
|
|
|
{ |
|
|
|
|
lcd.write((uint8_t)(vf / 2.0 + 0.5)); |
|
|
|
|
for (uint8_t i = 1; i < LCD_cols; i++) |
|
|
|
|
for (uint8_t i = 1; i < cols; i++) |
|
|
|
|
lcd.print(F(" ")); // empty block
|
|
|
|
|
} |
|
|
|
|
else if (vi == LCD_cols) |
|
|
|
|
else if (vi == cols) |
|
|
|
|
{ |
|
|
|
|
for (uint8_t i = 0; i < LCD_cols - 1; i++) |
|
|
|
|
for (uint8_t i = 0; i < cols - 1; i++) |
|
|
|
|
lcd.print(F(" ")); // empty block
|
|
|
|
|
lcd.write(4); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
for (uint8_t i = 0; i < LCD_cols; i++) |
|
|
|
|
for (uint8_t i = 0; i < cols; i++) |
|
|
|
|
lcd.print(F(" ")); // empty block
|
|
|
|
|
lcd.setCursor(vi, 1); |
|
|
|
|
lcd.write((uint8_t)(vf / 2.0 + 0.5)); |
|
|
|
|
for (uint8_t i = vi + 1; i < LCD_cols; i++) |
|
|
|
|
for (uint8_t i = vi + 1; i < cols; i++) |
|
|
|
|
lcd.print(F(" ")); // empty block
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void lcd_active_instance_number(uint8_t instance_id) |
|
|
|
|
{ |
|
|
|
|
for (uint8_t i = 0; i < 8; i++) |
|
|
|
|
{ |
|
|
|
|
if (instance_id == 0) |
|
|
|
|
{ |
|
|
|
|
instance_num[0][i] = inverse_num[0][i]; |
|
|
|
|
instance_num[1][i] = ~inverse_num[1][i]; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
instance_num[0][i] = ~inverse_num[0][i]; |
|
|
|
|
instance_num[1][i] = inverse_num[1][i]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
lcd.createChar(5, (uint8_t*)instance_num[0]); |
|
|
|
|
lcd.createChar(6, (uint8_t*)instance_num[1]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void lcd_special_chars(uint8_t mode) |
|
|
|
|
{ |
|
|
|
|
switch (mode) |
|
|
|
@ -4775,8 +4812,8 @@ void lcd_special_chars(uint8_t mode) |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case BLOCKBAR: |
|
|
|
|
// set special chars for volumebar
|
|
|
|
|
for (uint8_t i = 0; i < 5; i++) |
|
|
|
|
// set special chars for volume-bar
|
|
|
|
|
for (uint8_t i = 0; i < 7; i++) |
|
|
|
|
{ |
|
|
|
|
#ifdef I2C_DISPLAY |
|
|
|
|
lcd.createChar(i, (uint8_t*)block_bar[i]); |
|
|
|
@ -4786,24 +4823,13 @@ void lcd_special_chars(uint8_t mode) |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case METERBAR: |
|
|
|
|
// set special chars for volumebar
|
|
|
|
|
for (uint8_t i = 0; i < 5; i++) |
|
|
|
|
// set special chars for panorama-bar
|
|
|
|
|
for (uint8_t i = 0; i < 7; i++) |
|
|
|
|
{ |
|
|
|
|
#ifdef I2C_DISPLAY |
|
|
|
|
lcd.createChar(i, (uint8_t*)meter_bar[i]); |
|
|
|
|
#else |
|
|
|
|
flipped_meter_bar[i] = rotTile(meter_bar[i]); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case INVERSE_NUM: |
|
|
|
|
// set special chars for volumebar
|
|
|
|
|
for (uint8_t i = 0; i < 4; i++) |
|
|
|
|
{ |
|
|
|
|
#ifdef I2C_DISPLAY |
|
|
|
|
lcd.createChar(i, (uint8_t*)inverse_num[i]); |
|
|
|
|
#else |
|
|
|
|
flipped_inverse_num[i] = rotTile(inverse_num[i]); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|