|
|
|
@ -140,6 +140,7 @@ extern uint8_t midi_bpm; |
|
|
|
|
elapsedMillis back_from_volume; |
|
|
|
|
uint8_t instance_num[8][8]; |
|
|
|
|
const char accepted_chars[] = " ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-abcdefghijklmnopqrstuvwxyz"; |
|
|
|
|
const char noteNames[12][3] = { "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B" }; |
|
|
|
|
uint8_t active_perform_page = 1; |
|
|
|
|
uint8_t orig_attack_values[2][7]; |
|
|
|
|
uint8_t orig_release_values[2][7]; |
|
|
|
@ -3838,9 +3839,26 @@ void UI_func_drum_pan(uint8_t param) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const char* seq_find_drum_name_from_note(uint8_t note) |
|
|
|
|
{ |
|
|
|
|
bool found = false; |
|
|
|
|
const char* shortname; |
|
|
|
|
for (uint8_t d = 0; d < num_drums - 1; d++) |
|
|
|
|
{ |
|
|
|
|
if (note == drum_config[d].midinote) |
|
|
|
|
{ shortname = basename(drum_config[d].filename); |
|
|
|
|
found = true; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (found == false) shortname = " "; |
|
|
|
|
|
|
|
|
|
return shortname; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const char* seq_find_shortname(uint8_t sstep) |
|
|
|
|
{ |
|
|
|
|
const char* shortname = " "; |
|
|
|
|
const char* shortname; |
|
|
|
|
bool found = false; |
|
|
|
|
if (seq_content_type[seq_active_track] == 0) //is Drumtrack
|
|
|
|
|
{ |
|
|
|
@ -3858,7 +3876,9 @@ const char* seq_find_shortname(uint8_t sstep) |
|
|
|
|
} else |
|
|
|
|
{ |
|
|
|
|
// if (seq_data[ seq_patternchain[seq_chain_active_step][seq_active_track] ][sstep] > 0) shortname = "*"; else shortname = "-";
|
|
|
|
|
if (seq_data[seq_active_track][sstep] > 0) shortname = "*"; else shortname = "-"; |
|
|
|
|
if (seq_data[seq_active_track][sstep] > 0) |
|
|
|
|
shortname = noteNames[seq_data[seq_active_track][sstep] % 12]; |
|
|
|
|
else shortname = "-"; |
|
|
|
|
} |
|
|
|
|
return shortname; |
|
|
|
|
} |
|
|
|
@ -4093,12 +4113,11 @@ void UI_func_seq_vel_editor(uint8_t param) |
|
|
|
|
// setup function
|
|
|
|
|
lcd.setCursor(0, 0); |
|
|
|
|
lcd.print("Vel:"); |
|
|
|
|
//lcd.show(0, 6, 6, basename(drum_config[activesample].filename));
|
|
|
|
|
sprintf(tmp, "%03d", seq_vel[seq_active_track][seq_menu - 1]); |
|
|
|
|
lcd.setCursor(4, 0); |
|
|
|
|
lcd.print(tmp); |
|
|
|
|
lcd.setCursor(10, 0); |
|
|
|
|
lcd.print("Seq["); |
|
|
|
|
lcd.setCursor(12, 0); |
|
|
|
|
lcd.print("S["); |
|
|
|
|
lcd.setCursor(15, 0); |
|
|
|
|
lcd.print("]"); |
|
|
|
|
|
|
|
|
@ -4159,7 +4178,7 @@ void UI_func_seq_vel_editor(uint8_t param) |
|
|
|
|
|
|
|
|
|
if (seq_menu == 0) { |
|
|
|
|
lcd.setCursor(4, 0); |
|
|
|
|
lcd.print("---"); |
|
|
|
|
lcd.print("--- --- "); |
|
|
|
|
lcd.setCursor(13, 0); |
|
|
|
|
lcd.print("["); |
|
|
|
|
lcd.print(seq_active_track); |
|
|
|
@ -4167,7 +4186,7 @@ void UI_func_seq_vel_editor(uint8_t param) |
|
|
|
|
lcd.setCursor(0, 1); |
|
|
|
|
for (int i = 0; i < 16; i++) { |
|
|
|
|
lcd.setCursor(i, 1); |
|
|
|
|
lcd.print(seq_find_shortname(i) ); |
|
|
|
|
lcd.print(seq_find_shortname(i)[0] ); |
|
|
|
|
} |
|
|
|
|
} else if (seq_menu == 1) { |
|
|
|
|
lcd.setCursor(13, 0); |
|
|
|
@ -4177,7 +4196,7 @@ void UI_func_seq_vel_editor(uint8_t param) |
|
|
|
|
lcd.setCursor(0, 1); |
|
|
|
|
lcd.print("x"); |
|
|
|
|
lcd.setCursor(1, 1); |
|
|
|
|
lcd.print(seq_find_shortname(1) ); |
|
|
|
|
lcd.print(seq_find_shortname(1)[0] ); |
|
|
|
|
sprintf(tmp, "%03d", seq_vel[seq_active_track][seq_menu - 1]); |
|
|
|
|
lcd.setCursor(4, 0); |
|
|
|
|
lcd.print(tmp); |
|
|
|
@ -4185,13 +4204,35 @@ void UI_func_seq_vel_editor(uint8_t param) |
|
|
|
|
lcd.setCursor(seq_menu - 1, 1); |
|
|
|
|
lcd.print("x"); |
|
|
|
|
lcd.setCursor(seq_menu - 2, 1); |
|
|
|
|
lcd.print(seq_find_shortname(seq_menu - 2) ); |
|
|
|
|
lcd.print(seq_find_shortname(seq_menu - 2)[0] ); |
|
|
|
|
lcd.setCursor(seq_menu , 1); |
|
|
|
|
lcd.print(seq_find_shortname(seq_menu ) ); |
|
|
|
|
lcd.print(seq_find_shortname(seq_menu)[0] ); |
|
|
|
|
sprintf(tmp, "%03d", seq_vel[seq_active_track][seq_menu - 1]); |
|
|
|
|
lcd.setCursor(4, 0); |
|
|
|
|
lcd.print(tmp); |
|
|
|
|
} |
|
|
|
|
if (seq_menu > 0) { |
|
|
|
|
lcd.setCursor(8, 0); |
|
|
|
|
if (seq_data[seq_active_track][seq_menu - 1] > 0) { |
|
|
|
|
|
|
|
|
|
if (seq_content_type[seq_active_track] == 0) //is Drumtrack
|
|
|
|
|
{ |
|
|
|
|
//activesample=seq_data[seq_active_track][seq_menu - 1];
|
|
|
|
|
lcd.show(0, 8, 5, seq_find_drum_name_from_note( seq_data[seq_active_track][seq_menu - 1]) ); |
|
|
|
|
// lcd.show(0, 8, 3, basename(drum_config[activesample].filename));
|
|
|
|
|
} else |
|
|
|
|
{ |
|
|
|
|
lcd.print(noteNames[seq_data[seq_active_track][seq_menu - 1] % 12 ][0] ); |
|
|
|
|
if (noteNames[seq_data[seq_active_track][seq_menu - 1] % 12 ][1] != '\0' ) { |
|
|
|
|
lcd.print(noteNames[seq_data[seq_active_track][seq_menu - 1] % 12 ][1] ); |
|
|
|
|
} |
|
|
|
|
lcd.print( (seq_data[seq_active_track][seq_menu - 1] / 12) - 1); |
|
|
|
|
lcd.print(" "); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
lcd.print(" "); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (LCDML.FUNC_close()) // ****** STABLE END *********
|
|
|
|
|
{ |
|
|
|
@ -4203,6 +4244,7 @@ void UI_func_sequencer(uint8_t param) |
|
|
|
|
{ |
|
|
|
|
if (LCDML.FUNC_setup()) // ****** SETUP *********
|
|
|
|
|
{ |
|
|
|
|
temp_int = seq_data[seq_active_track][0]; |
|
|
|
|
encoderDir[ENC_R].reset(); |
|
|
|
|
seq_note_in = 0; |
|
|
|
|
// setup function
|
|
|
|
@ -4226,12 +4268,13 @@ void UI_func_sequencer(uint8_t param) |
|
|
|
|
lcd.print(seq_active_track); |
|
|
|
|
for (int i = 0; i < 16; i++) { |
|
|
|
|
lcd.setCursor(i, 1); |
|
|
|
|
lcd.print(seq_find_shortname(i) ); |
|
|
|
|
lcd.print(seq_find_shortname(i)[0]); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (LCDML.FUNC_loop()) // ****** LOOP *********
|
|
|
|
|
{ |
|
|
|
|
if (seq_active_function == 99) { |
|
|
|
|
if (seq_active_function == 99) |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
if ((LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) || (LCDML.BT_checkUp() && encoderDir[ENC_R].Up())) |
|
|
|
|
{ |
|
|
|
@ -4241,20 +4284,36 @@ void UI_func_sequencer(uint8_t param) |
|
|
|
|
seq_menu = constrain(seq_menu - 1, 0, 18); |
|
|
|
|
} |
|
|
|
|
} else if (seq_active_function == 0 ) { |
|
|
|
|
if ((LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) || (LCDML.BT_checkUp() && encoderDir[ENC_R].Up())) |
|
|
|
|
if (seq_content_type[seq_active_track] == 0) // is in Drumedit mode
|
|
|
|
|
{ |
|
|
|
|
if (LCDML.BT_checkDown()) |
|
|
|
|
activesample = constrain(activesample + 1, 0, num_drums + 2 ); |
|
|
|
|
else if (LCDML.BT_checkUp()) |
|
|
|
|
activesample = constrain(activesample - 1, 0, num_drums + 2 ); |
|
|
|
|
if ((LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) || (LCDML.BT_checkUp() && encoderDir[ENC_R].Up())) |
|
|
|
|
{ |
|
|
|
|
if (LCDML.BT_checkDown()) |
|
|
|
|
activesample = constrain(activesample + 1, 0, num_drums + 1 ); |
|
|
|
|
else if (LCDML.BT_checkUp()) |
|
|
|
|
activesample = constrain(activesample - 1, 0, num_drums + 1 ); |
|
|
|
|
} |
|
|
|
|
} else //is in Instrument Mode
|
|
|
|
|
{ |
|
|
|
|
if ((LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) || (LCDML.BT_checkUp() && encoderDir[ENC_R].Up())) |
|
|
|
|
{ |
|
|
|
|
if (LCDML.BT_checkDown()) |
|
|
|
|
temp_int = constrain(temp_int + 1, 0, 111 ); |
|
|
|
|
else if (LCDML.BT_checkUp()) |
|
|
|
|
temp_int = constrain(temp_int - 1, 0, 111 ); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else if (seq_active_function == 2) { |
|
|
|
|
} else if (seq_active_function == 2) |
|
|
|
|
{ |
|
|
|
|
if ((LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) || (LCDML.BT_checkUp() && encoderDir[ENC_R].Up())) |
|
|
|
|
{ |
|
|
|
|
if (LCDML.BT_checkDown()) |
|
|
|
|
seq_active_track = constrain(seq_active_track + 1, 0, 9); |
|
|
|
|
else if (LCDML.BT_checkUp()) |
|
|
|
|
seq_active_track = constrain(seq_active_track - 1, 0, 9); |
|
|
|
|
|
|
|
|
|
lcd.setCursor(1, 0); |
|
|
|
|
if (seq_content_type[seq_active_track] == 0) lcd.print("Drum "); else lcd.print("Inst "); //else lcd.print("[ ]");
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (LCDML.BT_checkEnter()) //handle button presses during menu >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
|
|
|
@ -4262,24 +4321,24 @@ void UI_func_sequencer(uint8_t param) |
|
|
|
|
if ( seq_menu == 0 && seq_active_function == 99) |
|
|
|
|
{ |
|
|
|
|
seq_active_function = 0; |
|
|
|
|
|
|
|
|
|
} else if ( seq_menu == 0 && seq_active_function == 0) |
|
|
|
|
{ |
|
|
|
|
if (activesample == num_drums + 2) { |
|
|
|
|
if ( (seq_content_type[seq_active_track] == 0 && activesample == num_drums + 1) || (seq_content_type[seq_active_track] == 0 && temp_int == 111) ) { |
|
|
|
|
for (int i = 0; i < 10; i++) { |
|
|
|
|
memset(seq_data[i], 0, sizeof(seq_data[i])); |
|
|
|
|
memset(seq_vel[i], 0, sizeof(seq_vel[i])); |
|
|
|
|
} |
|
|
|
|
for (int i = 0; i < 16; i++) { |
|
|
|
|
lcd.setCursor(i, 1); |
|
|
|
|
lcd.print(seq_find_shortname(i) ); |
|
|
|
|
lcd.print(seq_find_shortname(i)[0]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} else if (activesample == num_drums + 1) { |
|
|
|
|
} else if ( (seq_content_type[seq_active_track] == 0 && activesample == num_drums) || (seq_content_type[seq_active_track] == 0 && temp_int == 110) ) { |
|
|
|
|
memset(seq_data[seq_active_track], 0, sizeof(seq_data[seq_active_track])); |
|
|
|
|
memset(seq_vel[seq_active_track], 0, sizeof(seq_vel[seq_active_track])); |
|
|
|
|
for (int i = 0; i < 16; i++) { |
|
|
|
|
lcd.setCursor(i, 1); |
|
|
|
|
lcd.print(seq_find_shortname(i) ); |
|
|
|
|
lcd.print(seq_find_shortname(i)[0]); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
seq_active_function = 99; |
|
|
|
@ -4287,44 +4346,67 @@ void UI_func_sequencer(uint8_t param) |
|
|
|
|
if ( seq_menu == 1) |
|
|
|
|
{ |
|
|
|
|
lcd.setCursor(9, 0); |
|
|
|
|
|
|
|
|
|
if (seq_running == false && seq_recording == false) |
|
|
|
|
{ |
|
|
|
|
seq_running = true; |
|
|
|
|
lcd.print("REC"); |
|
|
|
|
} else |
|
|
|
|
|
|
|
|
|
if (seq_running == true && seq_recording == false) |
|
|
|
|
{ |
|
|
|
|
seq_running = true; |
|
|
|
|
seq_recording = true; |
|
|
|
|
seq_note_in = 0; |
|
|
|
|
lcd.print("STP"); |
|
|
|
|
} else if (seq_running == true && seq_recording == true) |
|
|
|
|
{ |
|
|
|
|
seq_running = false; |
|
|
|
|
seq_recording = false; |
|
|
|
|
seq_note_in = 0; |
|
|
|
|
seq_step = 0; |
|
|
|
|
seq_chain_active_step = 0; |
|
|
|
|
lcd.print("PLY"); |
|
|
|
|
MicroDexed[0]->panic(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} else if (seq_running == true && seq_recording == false) |
|
|
|
|
{ |
|
|
|
|
seq_running = true; |
|
|
|
|
seq_recording = true; |
|
|
|
|
seq_note_in = 0; |
|
|
|
|
lcd.print("STP"); |
|
|
|
|
} else if (seq_running == true && seq_recording == true) |
|
|
|
|
{ |
|
|
|
|
seq_running = false; |
|
|
|
|
seq_recording = false; |
|
|
|
|
seq_note_in = 0; |
|
|
|
|
seq_step = 0; |
|
|
|
|
seq_chain_active_step = 0; |
|
|
|
|
lcd.print("PLY"); |
|
|
|
|
MicroDexed[0]->panic(); |
|
|
|
|
} |
|
|
|
|
} else if ( seq_menu == 2) |
|
|
|
|
{ |
|
|
|
|
if (seq_active_function != 2) seq_active_function = 2; else seq_active_function = 99; |
|
|
|
|
|
|
|
|
|
if (seq_content_type[seq_active_track] == 0) { |
|
|
|
|
if (activesample < num_drums - 1) |
|
|
|
|
lcd.show(0, 1, 6, basename(drum_config[activesample].filename)); |
|
|
|
|
} else { |
|
|
|
|
if (temp_int < 109) { |
|
|
|
|
lcd.setCursor(3, 0); |
|
|
|
|
lcd.print(" "); |
|
|
|
|
lcd.setCursor(1, 0); |
|
|
|
|
lcd.print(noteNames[temp_int % 12 ]); |
|
|
|
|
lcd.print( (temp_int / 12) - 1); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else if (seq_menu > 2) |
|
|
|
|
{ |
|
|
|
|
if (seq_active_function == 99) { |
|
|
|
|
seq_data[seq_active_track][seq_menu - 3] = drum_config[activesample].midinote; |
|
|
|
|
seq_vel[seq_active_track][seq_menu - 3] = 120; |
|
|
|
|
if (seq_content_type[seq_active_track] == 0) { //Drumtrack
|
|
|
|
|
seq_data[seq_active_track][seq_menu - 3] = drum_config[activesample].midinote; |
|
|
|
|
seq_vel[seq_active_track][seq_menu - 3] = 120; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ //Inst. Track
|
|
|
|
|
if (temp_int == 109) { //clear note
|
|
|
|
|
seq_data[seq_active_track][seq_menu - 3] = 0; |
|
|
|
|
seq_vel[seq_active_track][seq_menu - 3] = 0; |
|
|
|
|
} else |
|
|
|
|
{ |
|
|
|
|
seq_data[seq_active_track][seq_menu - 3] = temp_int; |
|
|
|
|
seq_vel[seq_active_track][seq_menu - 3] = 120; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
seq_active_function = 99; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
//button check end <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
|
|
|
|
|
|
|
|
|
if (seq_menu == 0) { |
|
|
|
|
lcd.setCursor(8, 0); |
|
|
|
|
lcd.print(" "); |
|
|
|
@ -4332,23 +4414,45 @@ void UI_func_sequencer(uint8_t param) |
|
|
|
|
lcd.print(" "); |
|
|
|
|
lcd.setCursor(0, 0); |
|
|
|
|
lcd.print("["); |
|
|
|
|
|
|
|
|
|
if (activesample < num_drums) { |
|
|
|
|
lcd.show(0, 1, 6, basename(drum_config[activesample].filename)); |
|
|
|
|
} else if (activesample == num_drums) { |
|
|
|
|
lcd.setCursor(1, 0); |
|
|
|
|
lcd.print("EMPTY "); |
|
|
|
|
} else if (activesample == num_drums + 1) { |
|
|
|
|
lcd.setCursor(1, 0); |
|
|
|
|
lcd.print("ClrTrk"); |
|
|
|
|
} else if (activesample == num_drums + 2) { |
|
|
|
|
lcd.setCursor(1, 0); |
|
|
|
|
lcd.print("ClrAll"); |
|
|
|
|
if (seq_content_type[seq_active_track] == 0) //Drum Mode
|
|
|
|
|
{ |
|
|
|
|
if (activesample < num_drums - 1) { |
|
|
|
|
lcd.show(0, 1, 6, basename(drum_config[activesample].filename)); |
|
|
|
|
} else if (activesample == num_drums - 1) { |
|
|
|
|
lcd.setCursor(1, 0); |
|
|
|
|
lcd.print("EMPTY "); |
|
|
|
|
} else if (activesample == num_drums ) { |
|
|
|
|
lcd.setCursor(1, 0); |
|
|
|
|
lcd.print("ClrTrk"); |
|
|
|
|
} else if (activesample == num_drums + 1) { |
|
|
|
|
lcd.setCursor(1, 0); |
|
|
|
|
lcd.print("ClrAll"); |
|
|
|
|
} |
|
|
|
|
lcd.setCursor(7, 0); |
|
|
|
|
lcd.print("]"); |
|
|
|
|
} else //Inst. Mode
|
|
|
|
|
{ |
|
|
|
|
if (temp_int < 109) { |
|
|
|
|
lcd.setCursor(3, 0); |
|
|
|
|
lcd.print(" "); |
|
|
|
|
lcd.setCursor(1, 0); |
|
|
|
|
lcd.print(noteNames[temp_int % 12 ]); |
|
|
|
|
lcd.print( (temp_int / 12) - 1); |
|
|
|
|
} else if (temp_int == 109) { |
|
|
|
|
lcd.setCursor(1, 0); |
|
|
|
|
lcd.print("EMPTY "); |
|
|
|
|
} else if (temp_int == 110) { |
|
|
|
|
lcd.setCursor(1, 0); |
|
|
|
|
lcd.print("ClrTrk"); |
|
|
|
|
} else if (temp_int == 111) { |
|
|
|
|
lcd.setCursor(1, 0); |
|
|
|
|
lcd.print("ClrAll"); |
|
|
|
|
} |
|
|
|
|
lcd.setCursor(7, 0); |
|
|
|
|
lcd.print("]"); |
|
|
|
|
} |
|
|
|
|
lcd.setCursor(7, 0); |
|
|
|
|
lcd.print("]"); |
|
|
|
|
} |
|
|
|
|
if (seq_menu == 1) { |
|
|
|
|
else if (seq_menu == 1) { |
|
|
|
|
lcd.setCursor(0, 0); |
|
|
|
|
lcd.print(" "); |
|
|
|
|
lcd.setCursor(7, 0); |
|
|
|
@ -4390,7 +4494,7 @@ void UI_func_sequencer(uint8_t param) |
|
|
|
|
lcd.setCursor(0, 1); |
|
|
|
|
for (int i = 0; i < 16; i++) { |
|
|
|
|
lcd.setCursor(i, 1); |
|
|
|
|
lcd.print(seq_find_shortname(i) ); |
|
|
|
|
lcd.print(seq_find_shortname(i)[0]); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (seq_menu == 3) { |
|
|
|
@ -4401,16 +4505,15 @@ void UI_func_sequencer(uint8_t param) |
|
|
|
|
lcd.setCursor(0, 1); |
|
|
|
|
lcd.print("x"); |
|
|
|
|
lcd.setCursor(1, 1); |
|
|
|
|
lcd.print(seq_find_shortname(1) ); |
|
|
|
|
lcd.print(seq_find_shortname(1)[0]); |
|
|
|
|
} |
|
|
|
|
if (seq_menu > 3) { |
|
|
|
|
lcd.setCursor(seq_menu - 3, 1); |
|
|
|
|
lcd.print("x"); |
|
|
|
|
lcd.setCursor(seq_menu - 4, 1); |
|
|
|
|
lcd.print(seq_find_shortname(seq_menu - 4) ); |
|
|
|
|
lcd.print(seq_find_shortname(seq_menu - 4)[0]); |
|
|
|
|
lcd.setCursor(seq_menu - 2, 1); |
|
|
|
|
lcd.print(seq_find_shortname(seq_menu - 2) ); |
|
|
|
|
|
|
|
|
|
lcd.print(seq_find_shortname(seq_menu - 2)[0]); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (LCDML.FUNC_close()) // ****** STABLE END *********
|
|
|
|
|