Merge pull request 'big improvments in Sequencer. Minor Menu changes' (#62) from positionhigh/MicroDexed:dev into dev

Reviewed-on: https://codeberg.org/dcoredump/MicroDexed/pulls/62
pull/63/head
Holger Wirtz 3 years ago
commit bf21006eed
  1. 397
      UI.hpp
  2. 256
      dexed_sd.cpp
  3. 3
      dexed_sd.h
  4. 73
      sequencer.cpp
  5. 62
      sequencer.h

397
UI.hpp

@ -64,9 +64,20 @@ extern void eeprom_update_dexed(uint8_t instance_id);
extern float pseudo_log_curve(float value); extern float pseudo_log_curve(float value);
extern uint8_t selected_instance_id; extern uint8_t selected_instance_id;
extern char receive_bank_filename[FILENAME_LEN]; extern char receive_bank_filename[FILENAME_LEN];
extern uint8_t seq_data[4][16];
#if NUM_DRUMS > 0
#include "drums.h"
extern drum_config_t drum_config[DRUM_MAX_INSTRUMENTS + 1];
extern uint8_t num_drums;
extern char drumset_name[26];
extern uint8_t seq_data[10][16];
extern uint8_t seq_vel[10][16];
extern uint8_t seq_patternchain[4][4]; extern uint8_t seq_patternchain[4][4];
extern uint8_t seq_step_timer; extern uint8_t seq_content_type[10];
extern uint8_t seq_track_type[4];
extern uint8_t seq_step;
extern int seq_tempo_ms;
extern uint8_t seq_bpm;
extern uint8_t seq_chain_lenght; extern uint8_t seq_chain_lenght;
extern bool seq_running; extern bool seq_running;
extern bool seq_recording; extern bool seq_recording;
@ -75,16 +86,11 @@ uint8_t activesample;
extern uint8_t seq_active_track; extern uint8_t seq_active_track;
extern elapsedMillis seq_millis_timer; extern elapsedMillis seq_millis_timer;
extern uint8_t seq_menu; extern uint8_t seq_menu;
extern uint8_t seq_chain_select_menu; extern uint8_t seq_temp_select_menu;
extern uint8_t seq_chain_active_menu; extern uint8_t seq_temp_active_menu;
extern uint8_t seq_chain_active_chainstep; //for editor extern uint8_t seq_chain_active_chainstep; //for editor
extern uint8_t seq_chain_active_step; extern uint8_t seq_chain_active_step;
extern int seq_transpose; extern int seq_transpose;
#if NUM_DRUMS > 0
#include "drums.h"
extern drum_config_t drum_config[DRUM_MAX_INSTRUMENTS + 1];
extern uint8_t num_drums;
extern char drumset_name[26];
#endif #endif
#ifdef DISPLAY_LCD_SPI #ifdef DISPLAY_LCD_SPI
@ -263,9 +269,12 @@ void UI_func_portamento_time(uint8_t param);
void UI_handle_OP(uint8_t param); void UI_handle_OP(uint8_t param);
void UI_func_information(uint8_t param); void UI_func_information(uint8_t param);
void UI_func_sequencer(uint8_t param); void UI_func_sequencer(uint8_t param);
void UI_func_seq_vel_editor(uint8_t param);
void UI_func_seq_live_transpose_oct(uint8_t param); void UI_func_seq_live_transpose_oct(uint8_t param);
void UI_func_seq_lenght(uint8_t param); void UI_func_seq_lenght(uint8_t param);
void UI_func_seq_tempo(uint8_t param);
void UI_func_seq_pat_chain(uint8_t param); void UI_func_seq_pat_chain(uint8_t param);
void UI_func_seq_track_setup(uint8_t param);
void UI_func_seq_pattern_load(uint8_t param); void UI_func_seq_pattern_load(uint8_t param);
void UI_func_seq_pattern_save(uint8_t param); void UI_func_seq_pattern_save(uint8_t param);
void UI_func_volume(uint8_t param); void UI_func_volume(uint8_t param);
@ -677,6 +686,14 @@ void lcdml_menu_control(void)
#endif #endif
encoderDir[ENC_R].ButtonLong(true); encoderDir[ENC_R].ButtonLong(true);
if (seq_running) {
seq_running = false;
seq_recording = false;
seq_step = 0;
seq_chain_active_step = 0;
MicroDexed[0]->panic();
}
if (LCDML.FUNC_getID() == LCDML.OTHER_getIDFromFunction(UI_func_voice_select)) if (LCDML.FUNC_getID() == LCDML.OTHER_getIDFromFunction(UI_func_voice_select))
{ {
LCDML.BT_enter(); LCDML.BT_enter();
@ -3616,7 +3633,7 @@ void UI_func_drum_reverb_send(uint8_t param)
lcd.setCursor(1, 1); lcd.setCursor(1, 1);
sprintf(displayname, "%02d", activesample); sprintf(displayname, "%02d", activesample);
lcd.print(displayname); lcd.print(displayname);
lcd.show(4, 1, 6, basename(drum_config[activesample].filename)); lcd.show(4, 5, 6, basename(drum_config[activesample].filename));
sprintf(displayname, "%03d", (int)(drum_config[activesample].reverb_send * 100) ); sprintf(displayname, "%03d", (int)(drum_config[activesample].reverb_send * 100) );
lcd.setCursor(12, 1); lcd.setCursor(12, 1);
lcd.print(displayname); lcd.print(displayname);
@ -3824,10 +3841,12 @@ const char* seq_find_shortname(uint8_t sstep)
{ {
const char* shortname = " "; const char* shortname = " ";
bool found = false; bool found = false;
if (seq_active_track < 3) { if (seq_content_type[seq_active_track] == 0) //is Drumtrack
{
for (uint8_t d = 0; d < num_drums - 1; d++) for (uint8_t d = 0; d < num_drums - 1; d++)
{ {
if (seq_data[ seq_patternchain[seq_chain_active_step][seq_active_track] ][sstep] == drum_config[d].midinote) // if (seq_data[ seq_patternchain[seq_chain_active_step][seq_active_track] ][sstep] == drum_config[d].midinote)
if (seq_data[seq_active_track][sstep] == drum_config[d].midinote)
{ {
shortname = drum_config[d].shortname; shortname = drum_config[d].shortname;
found = true; found = true;
@ -3837,7 +3856,8 @@ const char* seq_find_shortname(uint8_t sstep)
if (found == false) shortname = "-"; if (found == false) shortname = "-";
} else } else
{ {
if (seq_data[ seq_patternchain[seq_chain_active_step][seq_active_track] ][sstep] > 0) shortname = "*"; else shortname = "-"; // 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 = "-";
} }
return shortname; return shortname;
} }
@ -3849,9 +3869,9 @@ const char* seq_find_shortname(uint8_t sstep)
// if (track < 3) { // if (track < 3) {
// for (uint8_t d = 0; d < num_drums - 1; d++) // for (uint8_t d = 0; d < num_drums - 1; d++)
// { // {
// if (seq_data[track][seq_step_timer] == drum_config[d].midinote) // if (seq_data[track][seq_step] == drum_config[d].midinote)
// { // {
// drum_config[d].reverb_send = float(seq_reverb[track][seq_step_timer]) / float(100); // drum_config[d].reverb_send = float(seq_reverb[track][seq_step]) / float(100);
// break; // break;
// } // }
// } // }
@ -3936,6 +3956,162 @@ void UI_func_seq_lenght(uint8_t param)
} }
} }
void UI_func_seq_tempo(uint8_t param)
{
char tmp[5];
if (LCDML.FUNC_setup()) // ****** SETUP *********
{
encoderDir[ENC_R].reset();
lcd.setCursor(0, 0);
lcd.print(" Seq. Tempo ");
lcd.setCursor(5, 1);
lcd.print("BPM");
lcd.setCursor(14, 1);
lcd.print("ms");
}
if (LCDML.FUNC_loop()) // ****** LOOP *********
{
if ((LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) || (LCDML.BT_checkUp() && encoderDir[ENC_R].Up()) || (LCDML.BT_checkEnter() && encoderDir[ENC_R].ButtonShort()))
{
if (LCDML.BT_checkDown())
seq_bpm = constrain(seq_bpm + ENCODER[ENC_R].speed(), 60, 180);
else if (LCDML.BT_checkUp())
seq_bpm = constrain(seq_bpm - ENCODER[ENC_R].speed(), 60, 180);
}
seq_tempo_ms = 60000 / seq_bpm / 4;
sprintf(tmp, "[%3d]", seq_bpm);
lcd.setCursor(0, 1);
lcd.print(tmp);
lcd.setCursor(9, 1);
sprintf(tmp, "[%3d]", seq_tempo_ms);
lcd.print(tmp);
}
if (LCDML.FUNC_close()) // ****** STABLE END *********
{
encoderDir[ENC_R].reset();
}
}
void UI_func_seq_vel_editor(uint8_t param)
{
char tmp[5];
if (LCDML.FUNC_setup()) // ****** SETUP *********
{
encoderDir[ENC_R].reset();
// 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(15, 0);
lcd.print("]");
lcd.setCursor(14, 0);
lcd.print(seq_active_track);
for (int i = 0; i < 16; i++) {
lcd.setCursor(i, 1);
lcd.print(seq_find_shortname(i) );
}
}
if (LCDML.FUNC_loop()) // ****** LOOP *********
{
if (seq_active_function == 99) {
if ((LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) || (LCDML.BT_checkUp() && encoderDir[ENC_R].Up()))
{
if (LCDML.BT_checkDown())
seq_menu = constrain(seq_menu + 1, 0, 16);
else if (LCDML.BT_checkUp())
seq_menu = constrain(seq_menu - 1, 0, 16);
}
}
else if (seq_active_function == 0) {
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);
}
}
else if (seq_active_function == 1) {
if ((LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) || (LCDML.BT_checkUp() && encoderDir[ENC_R].Up()))
{
if (LCDML.BT_checkDown())
seq_vel[seq_active_track][seq_menu - 1] = constrain(seq_vel[seq_active_track][seq_menu - 1] + 1, 0, 127);
else if (LCDML.BT_checkUp())
seq_vel[seq_active_track][seq_menu - 1] = constrain(seq_vel[seq_active_track][seq_menu - 1] - 1, 0, 127);
}
}
if (LCDML.BT_checkEnter()) //handle button presses during menu >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
{
if ( seq_menu == 0 && seq_active_function == 99)
{
seq_active_function = 0;
} else if ( seq_menu == 0 && seq_active_function == 0)
{
seq_active_function = 99;
}
else if (seq_menu > 0 && seq_active_function == 99)
{
seq_active_function = 1;
}
else
seq_active_function = 99;
}
//button check end <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
if (seq_menu == 0) {
lcd.setCursor(4, 0);
lcd.print("---");
lcd.setCursor(13, 0);
lcd.print("[");
lcd.print(seq_active_track);
lcd.print("]");
lcd.setCursor(0, 1);
for (int i = 0; i < 16; i++) {
lcd.setCursor(i, 1);
lcd.print(seq_find_shortname(i) );
}
} else if (seq_menu == 1) {
lcd.setCursor(13, 0);
lcd.print(" ");
lcd.setCursor(15, 0);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("x");
lcd.setCursor(1, 1);
lcd.print(seq_find_shortname(1) );
sprintf(tmp, "%03d", seq_vel[seq_active_track][seq_menu - 1]);
lcd.setCursor(4, 0);
lcd.print(tmp);
} else if (seq_menu > 1) {
lcd.setCursor(seq_menu - 1, 1);
lcd.print("x");
lcd.setCursor(seq_menu - 2, 1);
lcd.print(seq_find_shortname(seq_menu - 2) );
lcd.setCursor(seq_menu , 1);
lcd.print(seq_find_shortname(seq_menu ) );
sprintf(tmp, "%03d", seq_vel[seq_active_track][seq_menu - 1]);
lcd.setCursor(4, 0);
lcd.print(tmp);
}
}
if (LCDML.FUNC_close()) // ****** STABLE END *********
{
encoderDir[ENC_R].reset();
}
}
void UI_func_sequencer(uint8_t param) void UI_func_sequencer(uint8_t param)
{ {
if (LCDML.FUNC_setup()) // ****** SETUP ********* if (LCDML.FUNC_setup()) // ****** SETUP *********
@ -3949,6 +4125,7 @@ void UI_func_sequencer(uint8_t param)
if (seq_running == false && seq_recording == false) if (seq_running == false && seq_recording == false)
{ {
lcd.print("PLY"); lcd.print("PLY");
} else if (seq_running == true && seq_recording == false) } else if (seq_running == true && seq_recording == false)
{ {
seq_note_in = 0; seq_note_in = 0;
@ -3959,7 +4136,7 @@ void UI_func_sequencer(uint8_t param)
lcd.print("STP"); lcd.print("STP");
} }
lcd.setCursor(14, 0); lcd.setCursor(14, 0);
lcd.print(seq_active_track + 1); lcd.print(seq_active_track);
for (int i = 0; i < 16; i++) { for (int i = 0; i < 16; i++) {
lcd.setCursor(i, 1); lcd.setCursor(i, 1);
lcd.print(seq_find_shortname(i) ); lcd.print(seq_find_shortname(i) );
@ -3988,9 +4165,9 @@ void UI_func_sequencer(uint8_t param)
if ((LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) || (LCDML.BT_checkUp() && encoderDir[ENC_R].Up())) if ((LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) || (LCDML.BT_checkUp() && encoderDir[ENC_R].Up()))
{ {
if (LCDML.BT_checkDown()) if (LCDML.BT_checkDown())
seq_active_track = constrain(seq_active_track + 1, 0, 8); seq_active_track = constrain(seq_active_track + 1, 0, 9);
else if (LCDML.BT_checkUp()) else if (LCDML.BT_checkUp())
seq_active_track = constrain(seq_active_track - 1, 0, 8); seq_active_track = constrain(seq_active_track - 1, 0, 9);
} }
} }
if (LCDML.BT_checkEnter()) //handle button presses during menu >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> if (LCDML.BT_checkEnter()) //handle button presses during menu >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
@ -4003,6 +4180,7 @@ void UI_func_sequencer(uint8_t param)
if (activesample == num_drums + 2) { if (activesample == num_drums + 2) {
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
memset(seq_data[i], 0, sizeof(seq_data[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++) { for (int i = 0; i < 16; i++) {
lcd.setCursor(i, 1); lcd.setCursor(i, 1);
@ -4011,6 +4189,7 @@ void UI_func_sequencer(uint8_t param)
} else if (activesample == num_drums + 1) { } else if (activesample == num_drums + 1) {
memset(seq_data[seq_active_track], 0, sizeof(seq_data[seq_active_track])); 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++) { for (int i = 0; i < 16; i++) {
lcd.setCursor(i, 1); lcd.setCursor(i, 1);
lcd.print(seq_find_shortname(i) ); lcd.print(seq_find_shortname(i) );
@ -4039,6 +4218,8 @@ void UI_func_sequencer(uint8_t param)
seq_running = false; seq_running = false;
seq_recording = false; seq_recording = false;
seq_note_in = 0; seq_note_in = 0;
seq_step = 0;
seq_chain_active_step = 0;
lcd.print("PLY"); lcd.print("PLY");
MicroDexed[0]->panic(); MicroDexed[0]->panic();
} }
@ -4050,6 +4231,7 @@ void UI_func_sequencer(uint8_t param)
{ {
if (seq_active_function == 99) { if (seq_active_function == 99) {
seq_data[seq_active_track][seq_menu - 3] = drum_config[activesample].midinote; seq_data[seq_active_track][seq_menu - 3] = drum_config[activesample].midinote;
seq_vel[seq_active_track][seq_menu - 3] = 120;
} }
else else
seq_active_function = 99; seq_active_function = 99;
@ -4115,7 +4297,7 @@ void UI_func_sequencer(uint8_t param)
lcd.setCursor(13, 0); lcd.setCursor(13, 0);
lcd.print("["); lcd.print("[");
lcd.setCursor(14, 0); lcd.setCursor(14, 0);
lcd.print(seq_active_track + 1); lcd.print(seq_active_track);
lcd.setCursor(15, 0); lcd.setCursor(15, 0);
lcd.print("]"); lcd.print("]");
lcd.setCursor(0, 1); lcd.setCursor(0, 1);
@ -4147,10 +4329,13 @@ void UI_func_sequencer(uint8_t param)
if (LCDML.FUNC_close()) // ****** STABLE END ********* if (LCDML.FUNC_close()) // ****** STABLE END *********
{ {
encoderDir[ENC_R].reset(); encoderDir[ENC_R].reset();
seq_running = false;
seq_recording = false; // seq_running = false;
seq_note_in = 0; // seq_recording = false;
MicroDexed[0]->panic(); // seq_note_in = 0;
// seq_step = 0;
// seq_chain_active_step = 0;
// MicroDexed[0]->panic();
} }
} }
@ -4167,38 +4352,39 @@ void UI_func_seq_pat_chain(uint8_t param)
lcd.print("/"); lcd.print("/");
lcd.setCursor( 14, 0); lcd.setCursor( 14, 0);
lcd.print(seq_chain_lenght + 1); lcd.print(seq_chain_lenght + 1);
lcd.setCursor(0 , 0); lcd.setCursor(0 , 0);
lcd.print("D"); if (seq_track_type[0] == 0 ) lcd.print("D"); else lcd.print("I");
lcd.setCursor(2 , 0); lcd.setCursor(2 , 0);
lcd.print( seq_patternchain[seq_chain_active_chainstep][0]); lcd.print( seq_patternchain[seq_chain_active_chainstep][0]);
lcd.setCursor(0 , 1); lcd.setCursor(0 , 1);
lcd.print("D"); if (seq_track_type[1] == 0 )lcd.print("D"); else lcd.print("I");
lcd.setCursor(2 , 1); lcd.setCursor(2 , 1);
lcd.print( seq_patternchain[seq_chain_active_chainstep][1]); lcd.print( seq_patternchain[seq_chain_active_chainstep][1]);
lcd.setCursor(6 , 0); lcd.setCursor(6 , 0);
lcd.print("D"); if (seq_track_type[2] == 0 ) lcd.print("D"); else lcd.print("I");
lcd.setCursor(8 , 0); lcd.setCursor(8 , 0);
lcd.print( seq_patternchain[seq_chain_active_chainstep][2]); lcd.print( seq_patternchain[seq_chain_active_chainstep][2]);
lcd.setCursor(6 , 1); lcd.setCursor(6 , 1);
lcd.print("I"); if (seq_track_type[3] == 0 )lcd.print("D"); else lcd.print("I");
lcd.setCursor(8 , 1); lcd.setCursor(8 , 1);
lcd.print( seq_patternchain[seq_chain_active_chainstep][3]); lcd.print( seq_patternchain[seq_chain_active_chainstep][3]);
} }
if (LCDML.FUNC_loop()) // ****** LOOP ********* if (LCDML.FUNC_loop()) // ****** LOOP *********
{ {
if (seq_chain_active_menu == 99) { if (seq_temp_active_menu == 99) {
if ((LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) || (LCDML.BT_checkUp() && encoderDir[ENC_R].Up())) if ((LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) || (LCDML.BT_checkUp() && encoderDir[ENC_R].Up()))
{ {
if (LCDML.BT_checkDown()) if (LCDML.BT_checkDown())
seq_chain_select_menu = constrain(seq_chain_select_menu + 1, 0, 4); seq_temp_select_menu = constrain(seq_temp_select_menu + 1, 0, 4);
else if (LCDML.BT_checkUp()) else if (LCDML.BT_checkUp())
seq_chain_select_menu = constrain(seq_chain_select_menu - 1, 0, 4); seq_temp_select_menu = constrain(seq_temp_select_menu - 1, 0, 4);
} }
} else if (seq_chain_active_menu == 4) { } else if (seq_temp_active_menu == 4) {
if ((LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) || (LCDML.BT_checkUp() && encoderDir[ENC_R].Up())) if ((LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) || (LCDML.BT_checkUp() && encoderDir[ENC_R].Up()))
{ {
if (LCDML.BT_checkDown()) if (LCDML.BT_checkDown())
@ -4207,16 +4393,16 @@ void UI_func_seq_pat_chain(uint8_t param)
seq_chain_active_chainstep = constrain(seq_chain_active_chainstep - 1, 0, seq_chain_lenght); seq_chain_active_chainstep = constrain(seq_chain_active_chainstep - 1, 0, seq_chain_lenght);
} }
} }
else if (seq_chain_active_menu < 4) { else if (seq_temp_active_menu < 4) {
if ((LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) || (LCDML.BT_checkUp() && encoderDir[ENC_R].Up())) if ((LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) || (LCDML.BT_checkUp() && encoderDir[ENC_R].Up()))
{ {
if (LCDML.BT_checkDown()) if (LCDML.BT_checkDown())
seq_patternchain[seq_chain_active_chainstep][seq_chain_active_menu] = constrain(seq_patternchain[seq_chain_active_chainstep][seq_chain_active_menu] + 1, 0, 9); seq_patternchain[seq_chain_active_chainstep][seq_temp_active_menu] = constrain(seq_patternchain[seq_chain_active_chainstep][seq_temp_active_menu] + 1, 0, 9);
else if (LCDML.BT_checkUp()) else if (LCDML.BT_checkUp())
seq_patternchain[seq_chain_active_chainstep][seq_chain_active_menu] = constrain(seq_patternchain[seq_chain_active_chainstep][seq_chain_active_menu] - 1, 0, 9); seq_patternchain[seq_chain_active_chainstep][seq_temp_active_menu] = constrain(seq_patternchain[seq_chain_active_chainstep][seq_temp_active_menu] - 1, 0, 9);
} }
} }
if (seq_chain_select_menu == 0 && seq_chain_active_menu == 99) // Drum 0 if (seq_temp_select_menu == 0 && seq_temp_active_menu == 99) // Drum 0
{ {
lcd.setCursor(1 , 0); lcd.setCursor(1 , 0);
lcd.print("["); lcd.print("[");
@ -4226,7 +4412,7 @@ void UI_func_seq_pat_chain(uint8_t param)
lcd.print(" "); lcd.print(" ");
lcd.setCursor(3 , 1); lcd.setCursor(3 , 1);
lcd.print(" "); lcd.print(" ");
} else if (seq_chain_select_menu == 1 && seq_chain_active_menu == 99) // Drum 1 } else if (seq_temp_select_menu == 1 && seq_temp_active_menu == 99) // Drum 1
{ {
lcd.setCursor(1 , 0); lcd.setCursor(1 , 0);
lcd.print(" "); lcd.print(" ");
@ -4240,7 +4426,7 @@ void UI_func_seq_pat_chain(uint8_t param)
lcd.print("["); lcd.print("[");
lcd.setCursor(3 , 1); lcd.setCursor(3 , 1);
lcd.print("]"); lcd.print("]");
} else if (seq_chain_select_menu == 2 && seq_chain_active_menu == 99) // Drum 2 } else if (seq_temp_select_menu == 2 && seq_temp_active_menu == 99) // Drum 2
{ {
lcd.setCursor(7 , 0); lcd.setCursor(7 , 0);
lcd.print("["); lcd.print("[");
@ -4254,7 +4440,7 @@ void UI_func_seq_pat_chain(uint8_t param)
lcd.print(" "); lcd.print(" ");
lcd.setCursor(9 , 1); lcd.setCursor(9 , 1);
lcd.print(" "); lcd.print(" ");
} else if (seq_chain_select_menu == 3 && seq_chain_active_menu == 99) // Inst } else if (seq_temp_select_menu == 3 && seq_temp_active_menu == 99) // Inst
{ {
lcd.setCursor(7 , 0); lcd.setCursor(7 , 0);
lcd.print(" "); lcd.print(" ");
@ -4268,7 +4454,7 @@ void UI_func_seq_pat_chain(uint8_t param)
lcd.print(" "); lcd.print(" ");
lcd.setCursor( 15, 0); lcd.setCursor( 15, 0);
lcd.print(" "); lcd.print(" ");
} else if (seq_chain_select_menu == 4 && seq_chain_active_menu == 99) // Chainselect } else if (seq_temp_select_menu == 4 && seq_temp_active_menu == 99) // Chainselect
{ {
lcd.setCursor(7 , 1); lcd.setCursor(7 , 1);
lcd.print(" "); lcd.print(" ");
@ -4285,7 +4471,7 @@ void UI_func_seq_pat_chain(uint8_t param)
lcd.print(seq_chain_lenght + 1); lcd.print(seq_chain_lenght + 1);
lcd.setCursor( 15, 0); lcd.setCursor( 15, 0);
lcd.print("]"); lcd.print("]");
} else if (seq_chain_select_menu == 4 && seq_chain_active_menu == 4) // Chainselect modify } else if (seq_temp_select_menu == 4 && seq_temp_active_menu == 4) // Chainselect modify
{ {
lcd.setCursor( 11, 0); lcd.setCursor( 11, 0);
lcd.print("["); lcd.print("[");
@ -4309,19 +4495,19 @@ void UI_func_seq_pat_chain(uint8_t param)
lcd.setCursor(8 , 1); lcd.setCursor(8 , 1);
lcd.print( seq_patternchain[seq_chain_active_chainstep][3]); lcd.print( seq_patternchain[seq_chain_active_chainstep][3]);
} else if (seq_chain_select_menu == 0 && seq_chain_active_menu == 0) // Drum 0 modify } else if (seq_temp_select_menu == 0 && seq_temp_active_menu == 0) // Drum 0 modify
{ {
lcd.setCursor(2 , 0); lcd.setCursor(2 , 0);
lcd.print( seq_patternchain[seq_chain_active_chainstep][0]); lcd.print( seq_patternchain[seq_chain_active_chainstep][0]);
} else if (seq_chain_select_menu == 1 && seq_chain_active_menu == 1) // Drum 1 modify } else if (seq_temp_select_menu == 1 && seq_temp_active_menu == 1) // Drum 1 modify
{ {
lcd.setCursor(2 , 1); lcd.setCursor(2 , 1);
lcd.print( seq_patternchain[seq_chain_active_chainstep][1]); lcd.print( seq_patternchain[seq_chain_active_chainstep][1]);
} else if (seq_chain_select_menu == 2 && seq_chain_active_menu == 2) // Drum 2 modify } else if (seq_temp_select_menu == 2 && seq_temp_active_menu == 2) // Drum 2 modify
{ {
lcd.setCursor(8 , 0); lcd.setCursor(8 , 0);
lcd.print( seq_patternchain[seq_chain_active_chainstep][2]); lcd.print( seq_patternchain[seq_chain_active_chainstep][2]);
} else if (seq_chain_select_menu == 3 && seq_chain_active_menu == 3) // Inst modify } else if (seq_temp_select_menu == 3 && seq_temp_active_menu == 3) // Inst modify
{ {
lcd.setCursor(8 , 1); lcd.setCursor(8 , 1);
lcd.print( seq_patternchain[seq_chain_active_chainstep][3]); lcd.print( seq_patternchain[seq_chain_active_chainstep][3]);
@ -4329,11 +4515,11 @@ void UI_func_seq_pat_chain(uint8_t param)
if (LCDML.BT_checkEnter()) //handle button presses during menu >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> if (LCDML.BT_checkEnter()) //handle button presses during menu >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
{ {
if (seq_chain_active_menu == seq_chain_select_menu) { if (seq_temp_active_menu == seq_temp_select_menu) {
seq_chain_active_menu = 99; seq_temp_active_menu = 99;
} else } else
{ {
seq_chain_active_menu = seq_chain_select_menu; seq_temp_active_menu = seq_temp_select_menu;
} }
} }
} }
@ -4343,6 +4529,123 @@ void UI_func_seq_pat_chain(uint8_t param)
} }
} }
void UI_func_seq_track_setup(uint8_t param)
{
if (LCDML.FUNC_setup()) // ****** SETUP *********
{
// setup function
seq_temp_active_menu = 99;
lcd.setCursor(0 , 0);
lcd.print("T1");
lcd.setCursor(0 , 1);
lcd.print("T2");
lcd.setCursor(9 , 0);
lcd.print("T3");
lcd.setCursor(9 , 1);
lcd.print("T4");
lcd.setCursor(3 , 0);
if (seq_track_type[0] == 0 ) lcd.print("Drm"); else lcd.print("Ins");
lcd.setCursor(3 , 1);
if (seq_track_type[1] == 0 ) lcd.print("Drm"); else lcd.print("Ins");
lcd.setCursor(12 , 0);
if (seq_track_type[2] == 0 ) lcd.print("Drm"); else lcd.print("Ins");
lcd.setCursor(12 , 1);
if (seq_track_type[3] == 0 ) lcd.print("Drm"); else lcd.print("Ins");
}
if (LCDML.FUNC_loop()) // ****** LOOP *********
{
if (seq_temp_active_menu == 99) {
if ((LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) || (LCDML.BT_checkUp() && encoderDir[ENC_R].Up()))
{
if (LCDML.BT_checkDown())
seq_temp_select_menu = constrain(seq_temp_select_menu + 1, 0, 3);
else if (LCDML.BT_checkUp())
seq_temp_select_menu = constrain(seq_temp_select_menu - 1, 0, 3);
}
} else {
if ((LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) || (LCDML.BT_checkUp() && encoderDir[ENC_R].Up()))
{
if (LCDML.BT_checkDown())
seq_track_type[seq_temp_active_menu] = constrain(seq_track_type[seq_temp_active_menu] + 1, 0, 1);
else if (LCDML.BT_checkUp())
seq_track_type[seq_temp_active_menu] = constrain(seq_track_type[seq_temp_active_menu] - 1, 0, 1);
}
}
if (LCDML.BT_checkEnter()) //handle button presses during menu >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
{
if (seq_temp_active_menu == 99) {
seq_temp_active_menu = seq_temp_select_menu;
} else
{
seq_temp_active_menu = 99;
}
}
if (seq_temp_select_menu == 0)
{
lcd.setCursor(2 , 0);
lcd.print("[");
lcd.setCursor(6 , 0);
lcd.print("]");
lcd.setCursor(2 , 1);
lcd.print(" ");
lcd.setCursor(6 , 1);
lcd.print(" ");
lcd.setCursor(3 , 0);
if (seq_track_type[0] == 0 ) lcd.print("Drm"); else lcd.print("Ins");
} else if (seq_temp_select_menu == 1)
{
lcd.setCursor(2 , 0);
lcd.print(" ");
lcd.setCursor(6 , 0);
lcd.print(" ");
lcd.setCursor(2 , 1);
lcd.print("[");
lcd.setCursor(6 , 1);
lcd.print("]");
lcd.setCursor(11 , 0);
lcd.print(" ");
lcd.setCursor(15 , 0);
lcd.print(" ");
lcd.setCursor(3 , 1);
if (seq_track_type[1] == 0 ) lcd.print("Drm"); else lcd.print("Ins");
} else if (seq_temp_select_menu == 2)
{
lcd.setCursor(2 , 1);
lcd.print(" ");
lcd.setCursor(6 , 1);
lcd.print(" ");
lcd.setCursor(11 , 0);
lcd.print("[");
lcd.setCursor(15 , 0);
lcd.print("]");
lcd.setCursor(11 , 1);
lcd.print(" ");
lcd.setCursor(15 , 1);
lcd.print(" ");
lcd.setCursor(12 , 0);
if (seq_track_type[2] == 0 ) lcd.print("Drm"); else lcd.print("Ins");
} else if (seq_temp_select_menu == 3)
{
lcd.setCursor(11 , 0);
lcd.print(" ");
lcd.setCursor(15 , 0);
lcd.print(" ");
lcd.setCursor(11 , 1);
lcd.print("[");
lcd.setCursor(15 , 1);
lcd.print("]");
lcd.setCursor(12 , 1);
if (seq_track_type[3] == 0 ) lcd.print("Drm"); else lcd.print("Ins");
}
}
if (LCDML.FUNC_close()) // ****** STABLE END *********
{
encoderDir[ENC_R].reset();
}
}
void UI_func_seq_pattern_load(uint8_t param) void UI_func_seq_pattern_load(uint8_t param)
{ {
static uint8_t mode; static uint8_t mode;

@ -36,6 +36,15 @@ extern void check_configuration_dexed(uint8_t instance_id);
extern void check_configuration_performance(void); extern void check_configuration_performance(void);
extern void check_configuration_fx(void); extern void check_configuration_fx(void);
extern StaticJsonDocument<JSON_BUFFER> data_json; extern StaticJsonDocument<JSON_BUFFER> data_json;
extern uint8_t seq_chain_lenght;
extern uint8_t seq_data[10][16];
extern uint8_t seq_vel[10][16];
extern uint8_t seq_patternchain[4][4];
extern uint8_t seq_content_type[10];
extern uint8_t seq_track_type[4];
extern int perform_attack_mod[NUM_DEXED];
extern int perform_release_mod[NUM_DEXED];
extern int seq_transpose;
/****************************************************************************** /******************************************************************************
SD BANK/VOICE LOADING SD BANK/VOICE LOADING
@ -738,6 +747,253 @@ bool save_sd_fx_json(uint8_t fx)
return (false); return (false);
} }
bool save_sd_seq_json(uint8_t seq_number)
{
char filename[FILENAME_LEN];
int count = 0;
seq_number = constrain(seq_number, 0, 99);
if (sd_card > 0)
{
File json;
sprintf(filename, "/%s/%s%d.json", SEQ_CONFIG_PATH, SEQ_CONFIG_NAME, seq_number);
#ifdef DEBUG
Serial.print(F("Saving sequencer config "));
Serial.print(seq_number);
Serial.print(F(" to "));
Serial.println(filename);
#endif
int total = sizeof(seq_data);
int columns = sizeof(seq_data[0]);
int rows = total / columns;
Serial.print(F("Rows: "));
Serial.print(rows);
Serial.print(" Columns: ");
Serial.print(columns);
Serial.print(F(" "));
AudioNoInterrupts();
json = SD.open(filename, FILE_WRITE);
if (json)
{
data_json["seq_chain_lenght"] = seq_chain_lenght;
data_json["seq_transpose"] = seq_transpose;
for (uint8_t i = 0; i < sizeof(seq_track_type); i++) {
data_json["track_type"][i] = seq_track_type[i];
}
for (uint8_t i = 0; i < sizeof(seq_content_type); i++) {
data_json["content_type"][i] = seq_content_type[i];
}
for (uint8_t i = 0; i < rows; i++)
{
for (uint8_t j = 0; j < columns; j++) {
data_json["seq_data"][count] = seq_data[i][j];
count++;
}
}
count = 0;
for (uint8_t i = 0; i < rows; i++)
{
for (uint8_t j = 0; j < columns; j++) {
data_json["seq_velocity"][count] = seq_vel[i][j];
count++;
}
}
total = sizeof(seq_patternchain);
columns = sizeof(seq_patternchain[0]);
rows = total / columns;
Serial.print(F("Chain Rows: "));
Serial.print(rows);
Serial.print(" Chain Columns: ");
Serial.print(columns);
Serial.print(F(" "));
count = 0;
for (uint8_t i = 0; i < rows; i++)
{
for (uint8_t j = 0; j < columns; j++) {
data_json["seq_patternchain"][count] = seq_patternchain[i][j];
count++;
}
}
count = 0;
// following data maybe useful to be included in sequencer store and OPTIONAL to be loaded
for (uint8_t i = 0; i < MAX_DEXED; i++)
{
data_json["reverb_send"][i] = configuration.fx.reverb_send[i];
data_json["perform_attack_mod"][i] = perform_attack_mod[i];
data_json["perform_release_mod"][i] = perform_release_mod[i];
}
data_json["reverb_roomsize"] = configuration.fx.reverb_roomsize;
data_json["reverb_damping"] = configuration.fx.reverb_damping;
data_json["reverb_lowpass"] = configuration.fx.reverb_lowpass;
data_json["reverb_lodamp"] = configuration.fx.reverb_lodamp;
data_json["reverb_hidamp"] = configuration.fx.reverb_hidamp;
data_json["reverb_diffusion"] = configuration.fx.reverb_diffusion;
data_json["reverb_level"] = configuration.fx.reverb_level;
data_json["eq_bass"] = configuration.fx.eq_bass;
data_json["eq_treble"] = configuration.fx.eq_treble;
#ifdef DEBUG
Serial.println(F("Write JSON data:"));
serializeJsonPretty(data_json, Serial);
Serial.println();
#endif
serializeJsonPretty(data_json, json);
json.close();
AudioInterrupts();
return (true);
}
json.close();
}
else
{
#ifdef DEBUG
Serial.print(F("E : Cannot open "));
Serial.print(filename);
Serial.println(F(" on SD."));
#endif
}
AudioInterrupts();
return (false);
}
bool load_sd_seq_json(uint8_t seq_number)
{
if (seq_number < 0)
return (false);
seq_number = constrain(seq_number, 0, 99);
if (sd_card > 0)
{
File json;
char filename[FILENAME_LEN];
sprintf(filename, "/%s/%s%d.json", SEQ_CONFIG_PATH, SEQ_CONFIG_NAME, seq_number);
// first check if file exists...
AudioNoInterrupts();
if (SD.exists(filename))
{
// ... and if: load
#ifdef DEBUG
Serial.print(F("Found Sequencer configuration ["));
Serial.print(filename);
Serial.println(F("]... loading..."));
#endif
json = SD.open(filename);
if (json)
{
deserializeJson(data_json, json);
json.close();
AudioInterrupts();
//check_configuration_fx();
#ifdef DEBUG
Serial.println(F("Read JSON data:"));
serializeJsonPretty(data_json, Serial);
Serial.println();
#endif
int total = sizeof(seq_data);
int columns = sizeof(seq_data[0]);
int rows = total / columns;
int count = 0;
seq_transpose = data_json["seq_transpose"];
seq_chain_lenght = data_json["seq_chain_lenght"];
for (uint8_t i = 0; i < sizeof(seq_track_type); i++) {
seq_track_type[i] = data_json["track_type"][i];
}
for (uint8_t i = 0; i < sizeof(seq_content_type); i++) {
seq_content_type[i] = data_json["content_type"][i];
}
for (uint8_t i = 0; i < rows; i++)
{
for (uint8_t j = 0; j < columns; j++) {
seq_data[i][j] = data_json["seq_data"][count];
count++;
}
}
count = 0;
for (uint8_t i = 0; i < rows; i++)
{
for (uint8_t j = 0; j < columns; j++) {
seq_vel[i][j] = data_json["seq_velocity"][count];
count++;
}
}
total = sizeof(seq_patternchain);
columns = sizeof(seq_patternchain[0]);
rows = total / columns;
count = 0;
for (uint8_t i = 0; i < rows; i++)
{
for (uint8_t j = 0; j < columns; j++) {
seq_patternchain[i][j] = data_json["seq_patternchain"][count];
count++;
}
}
count = 0;
// following data maybe useful to be included in sequencer store and OPTIONAL to be loaded back
for (uint8_t i = 0; i < MAX_DEXED; i++)
{
configuration.fx.reverb_send[i] = data_json["reverb_send"][i];
//perform_attack_mod[i] = data_json["perform_attack_mod"][i];
//perform_release_mod[i] = data_json["perform_release_mod"][i];
}
configuration.fx.reverb_roomsize = data_json["reverb_roomsize"];
configuration.fx.reverb_damping = data_json["reverb_damping"];
configuration.fx.reverb_lowpass = data_json["reverb_lowpass"];
configuration.fx.reverb_lodamp = data_json["reverb_lodamp"];
configuration.fx.reverb_hidamp = data_json["reverb_hidamp"];
configuration.fx.reverb_diffusion = data_json["reverb_diffusion"];
configuration.fx.reverb_level = data_json["reverb_level"];
configuration.fx.eq_bass = data_json["eq_bass"];
configuration.fx.eq_treble = data_json["eq_treble"];
set_fx_params();
return (true);
}
#ifdef DEBUG
else
{
Serial.print(F("E : Cannot open "));
Serial.print(filename);
Serial.println(F(" on SD."));
}
}
else
{
Serial.print(F("No "));
Serial.print(filename);
Serial.println(F(" available."));
#endif
}
}
AudioInterrupts();
return (false);
}
/****************************************************************************** /******************************************************************************
SD PERFORMANCE SD PERFORMANCE
******************************************************************************/ ******************************************************************************/

@ -64,6 +64,9 @@ bool save_sd_fx_json(uint8_t fx);
bool load_sd_performance_json(int8_t p); bool load_sd_performance_json(int8_t p);
bool save_sd_performance_json(uint8_t p); bool save_sd_performance_json(uint8_t p);
bool load_sd_seq_json(uint8_t p);
bool save_sd_seq_json(uint8_t p);
bool get_sd_data(File sysex, uint8_t format, uint8_t* conf); bool get_sd_data(File sysex, uint8_t format, uint8_t* conf);
bool write_sd_data(File sysex, uint8_t format, uint8_t* data, uint16_t len); bool write_sd_data(File sysex, uint8_t format, uint8_t* data, uint16_t len);

@ -14,17 +14,20 @@ extern const char* seq_find_shortname(uint8_t);
void sequencer(void) void sequencer(void)
{ {
bool seq_noteoffsent = false;
if (seq_note_in > 0 && seq_recording == false && seq_active_track == 3 && seq_note_in < 71) {
handleNoteOff(configuration.dexed[0].midi_channel, seq_data[3][seq_step_timer] + seq_transpose , 0);
handleNoteOff(configuration.dexed[0].midi_channel, seq_data[3][seq_step_timer - 1] + seq_transpose , 0);
seq_transpose = seq_note_in - 6 * 12 + 3; if (seq_note_in > 0 && seq_note_in < 62 && seq_recording == false ) {
seq_note_in = 0; // handleNoteOff(configuration.dexed[0].midi_channel, seq_data[3][seq_step] + seq_transpose , 0);
// handleNoteOff(configuration.dexed[0].midi_channel, seq_data[3][seq_step - 1] + seq_transpose , 0);
//if (seq_note_in>65)seq_note_in=seq_note_in-12;
// seq_transpose = seq_note_in % 12 ;
//seq_transpose=seq_transpose-12;
// seq_note_in = 0;
} }
if (seq_millis_timer > seq_timer_previous + 136) if (seq_millis_timer > seq_timer_previous + seq_tempo_ms)
{ {
seq_timer_previous = seq_millis_timer; seq_timer_previous = seq_millis_timer;
@ -34,48 +37,52 @@ void sequencer(void)
//write to sequencer if in sequencer menu //write to sequencer if in sequencer menu
if (seq_note_in > 0 && seq_recording == true) { if (seq_note_in > 0 && seq_recording == true) {
if (seq_active_track == 3) handleNoteOff(configuration.dexed[0].midi_channel, seq_data[3][seq_step_timer] + seq_transpose , 0); // if ( seq_content_type[ seq_patternchain[seq_chain_active_step][active_track] ] == 1) handleNoteOff(configuration.dexed[0].midi_channel, seq_data[active_track][seq_step] + seq_transpose , 0);
seq_data[seq_active_track][seq_step_timer] = seq_note_in; seq_data[seq_active_track][seq_step] = seq_note_in;
seq_vel[seq_active_track][seq_step_timer] = seq_note_in_velocity; seq_vel[seq_active_track][seq_step] = seq_note_in_velocity;
seq_note_in = 0; seq_note_in = 0;
seq_note_in_velocity=0; seq_note_in_velocity=0;
} }
lcd.setCursor(seq_step_timer, 1); lcd.setCursor(seq_step, 1);
lcd.print("X"); lcd.print("X");
if (seq_step_timer == 0) { if (seq_step == 0) {
lcd.setCursor(15, 1); lcd.setCursor(15, 1);
lcd.print(seq_find_shortname(15)); lcd.print(seq_find_shortname(15));
} }
else else
{ {
lcd.setCursor(seq_step_timer - 1, 1); lcd.setCursor(seq_step - 1, 1);
lcd.print(seq_find_shortname(seq_step_timer - 1)); lcd.print(seq_find_shortname(seq_step - 1));
} }
} }
//loop for drum track 0-2
for (uint8_t d = 0; d < 3; d++)
for (uint8_t d = 0; d < 4; d++)
{ {
if (seq_data[ seq_patternchain[seq_chain_active_step][d] ][seq_step_timer] > 0 && seq_vel[ seq_patternchain[seq_chain_active_step][d] ][seq_step_timer] > 0)
if ( seq_content_type[ seq_patternchain[seq_chain_active_step][d] ] == 0){// drum track
if (seq_data[ seq_patternchain[seq_chain_active_step][d] ][seq_step] > 0 && seq_vel[ seq_patternchain[seq_chain_active_step][d] ][seq_step] > 0)
{ {
handleNoteOn(DRUM_MIDI_CHANNEL, seq_data[ seq_patternchain[seq_chain_active_step][d] ][seq_step_timer] , seq_vel[ seq_patternchain[seq_chain_active_step][d] ][seq_step_timer]); handleNoteOn(DRUM_MIDI_CHANNEL, seq_data[ seq_patternchain[seq_chain_active_step][d] ][seq_step] , seq_vel[ seq_patternchain[seq_chain_active_step][d] ][seq_step]);
} }
} }
// instrument track else {
if (seq_data[ seq_patternchain[seq_chain_active_step][3] ][seq_step_timer] > 0) //test instrument sequencer Instance=0 if (seq_data[ seq_patternchain[seq_chain_active_step][d] ][seq_step] > 0 && seq_vel[ seq_patternchain[seq_chain_active_step][d] ][seq_step] > 0) // instrument track
{ {
handleNoteOn(configuration.dexed[0].midi_channel, seq_data[ seq_patternchain[seq_chain_active_step][3] ][seq_step_timer] + seq_transpose , seq_vel[ seq_patternchain[seq_chain_active_step][3] ][seq_step_timer]); handleNoteOn(configuration.dexed[0].midi_channel, seq_data[ seq_patternchain[seq_chain_active_step][d] ][seq_step] + seq_transpose , seq_vel[ seq_patternchain[seq_chain_active_step][d] ][seq_step]);
seq_prev_note=seq_data[ seq_patternchain[seq_chain_active_step][3] ][seq_step_timer] + seq_transpose; seq_prev_note[d]=seq_data[ seq_patternchain[seq_chain_active_step][d] ][seq_step] + seq_transpose;
}
}
seq_noteoffsent[d] = false;
} }
seq_noteoffsent = false; seq_step++;
seq_step_timer++;
if (seq_step_timer > 15) { if (seq_step > 15) {
seq_step_timer = 0; seq_step = 0;
if (seq_chain_lenght>0){ if (seq_chain_lenght>0){
seq_chain_active_step++; seq_chain_active_step++;
if (seq_chain_active_step>seq_chain_lenght) if (seq_chain_active_step>seq_chain_lenght)
@ -86,12 +93,18 @@ void sequencer(void)
} }
} }
if (seq_millis_timer > seq_timer_previous + 80 && seq_noteoffsent == false) if (seq_millis_timer > seq_timer_previous + 80 )
{
for (uint8_t d = 0; d < 4; d++)
{ {
if ( seq_prev_note > 0) //test instrument sequencer Instance=0 if( seq_noteoffsent[d] == false) {
if ( seq_prev_note[d] > 0) //test instrument sequencer Instance=0
{ {
handleNoteOff(configuration.dexed[0].midi_channel, seq_prev_note , 0); handleNoteOff(configuration.dexed[0].midi_channel, seq_prev_note[d] , 0);
}
} }
seq_noteoffsent = true; seq_noteoffsent[d] = true;
}
} }
} }

@ -2,52 +2,54 @@
uint8_t seq_active_track = 0; uint8_t seq_active_track = 0;
uint8_t seq_menu; uint8_t seq_menu;
bool seq_button_r = false; bool seq_button_r = false;
bool seq_noteoffsent = false; bool seq_noteoffsent[4] = {false,false,false,false};
elapsedMillis seq_millis_timer; elapsedMillis seq_millis_timer;
uint8_t seq_step_timer = 0; uint8_t seq_step = 0;
uint32_t seq_timer_previous = 0; uint32_t seq_timer_previous = 0;
bool seq_running = false; bool seq_running = false;
bool seq_recording = false; bool seq_recording = false;
uint8_t seq_note_in; uint8_t seq_note_in;
uint8_t seq_note_in_velocity; uint8_t seq_note_in_velocity;
int seq_transpose; int seq_transpose;
uint8_t seq_chain_select_menu; int seq_tempo_ms=147;
uint8_t seq_chain_active_menu = 99; int seq_bpm=102;
uint8_t seq_temp_select_menu;
uint8_t seq_temp_active_menu = 99;
uint8_t seq_chain_active_chainstep; uint8_t seq_chain_active_chainstep;
uint8_t seq_chain_lenght = 3; // 0=16 steps, 1=32 Steps, 2=46 Steps, 3=64 Steps uint8_t seq_chain_lenght = 3; // 0=16 steps, 1=32 Steps, 2=46 Steps, 3=64 Steps
uint8_t seq_chain_active_step = 0; uint8_t seq_chain_active_step = 0;
uint8_t seq_prev_note; uint8_t seq_prev_note[4]; // note_offs for every (instr.) track
uint8_t seq_data[10][16] = {72, 0, 0, 0, 72, 0, 0, 72, 72, 0, 0, 0, 72, 0, 0, 0, uint8_t seq_data[10][16] = {72 ,0 ,0 ,0 ,72 ,0 ,0 ,0 ,72 ,0 ,0 ,0 ,72 ,0 ,0 ,0 ,
0, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0,
78 ,78 ,78 ,78 ,78 ,78 ,78 ,78 ,78 ,78 ,78 ,78 ,78 ,78 ,78 ,78 , 78 ,78 ,78 ,78 ,78 ,78 ,78 ,78 ,78 ,78 ,78 ,78 ,78 ,78 ,78 ,78 ,
45, 45, 57, 57, 45, 45, 57, 57, 45, 45, 57, 57, 45, 45, 57, 57, 72 ,0 ,0 ,0 ,72 ,0 ,0 ,0 ,72 ,0 ,0 ,75 ,72 ,0 ,0 ,0 ,
41, 41+12, 53, 53, 41+12, 41, 53, 53, 41, 41+12, 53, 53, 41, 41, 53, 53, 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
43+12, 43, 55, 55, 43, 43, 55+12, 55, 43, 43, 55, 55, 43, 43, 55, 55, 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
45, 45, 57, 57, 45, 45, 57, 57, 45, 45, 57, 57, 45, 45, 57, 57, 55 ,0 ,0 ,0 ,0 ,0 ,52 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
72, 72, 72, 72, 72, 0, 0, 72, 72, 0, 0, 0, 72, 0, 0, 0, 57 ,0 ,0 ,0 ,0 ,0 ,53 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
50, 50, 0, 0, 75, 0, 0, 50, 50, 50, 50, 50, 75, 75, 75, 75, 74 ,0 ,0 ,72 ,0 ,0 ,74 ,0 ,0 ,0 ,76 ,0 ,0 ,0 ,0 ,0 ,
72, 0, 0, 0, 72, 0, 0, 72, 72, 0, 0, 0, 72, 0, 0, 0 74 ,0 ,0 ,72 ,0 ,0 ,71 ,0 ,0 ,0 ,67 ,0 ,0 ,0 ,0 ,0 ,
69 ,0 ,0 ,76 ,0 ,0 ,69 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
};
uint8_t seq_vel[10][16] = {120 ,0 ,0 ,0 ,120 ,0 ,0 ,0 ,120 ,0 ,0 ,0 ,120 ,0 ,0 ,0 ,
125 ,101 ,125 ,125 ,126 ,98 ,126 ,99 ,126 ,97 ,126 ,100 ,126 ,99 ,125 ,100 ,
120 ,0 ,0 ,0 ,120 ,0 ,0 ,0 ,120 ,0 ,120 ,120 ,120 ,120 ,0 ,0 ,
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
125 ,0 ,0 ,0 ,0 ,0 ,126 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
78 ,120 ,0 ,0 ,0 ,0 ,84 ,120 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
98 ,120 ,0 ,88 ,120 ,0 ,127 ,120 ,0 ,0 ,125 ,120 ,0 ,0 ,
0 ,0 ,124 ,120 ,0 ,115 ,0 ,0 ,126 ,120 ,0 ,120 ,127 ,120 ,0 ,0 ,
0 ,0 ,123 ,120 ,0 ,110 ,120 ,0 ,90 ,120 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
}; };
uint8_t seq_vel[10][16] = {80, 0, 0, 0, 80, 0, 0, 33, 80, 0, 0, 0, 109, 0, 0, 0,
0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, uint8_t seq_patternchain[4][4] = { 0 ,1 ,6 ,9 ,0 ,1 ,5 ,8 ,0 ,1 ,6 ,9 ,2 ,1 ,5 ,7
78, 58, 88, 48, 78, 38, 78, 78, 68, 48, 68, 48, 88, 48, 78, 48,
55, 45, 87, 27, 2, 6, 5, 37, 7, 45, 33, 37, 5, 35, 2, 27,
55, 45, 77, 27, 12, 6, 15, 37, 7, 45, 43, 27, 15, 35, 2, 17,
55, 75, 87, 27, 2, 16, 5, 37, 7, 45, 33, 37, 5, 35, 2, 27,
65, 75, 87, 27, 2, 16, 5, 37, 7, 45, 33, 37, 5, 35, 2, 27,
44,55,66,55,80,90,90,77,80,90,90,90,80,128,128,128,
55,33,128,55,55,128,11,11,22,33,44,55,55,44,33,22,
80, 0, 0, 0, 80, 0, 0, 33, 80, 0, 0, 0, 80, 0, 0, 0
}; };
uint8_t seq_content_type[10] = { 0, 0, 0, 0 , 1, 1, 1 , 1 , 1 , 1 }; // 0 = track is Drumtrack, 1= Instrumenttrack
uint8_t seq_track_type[4] = { 0, 0, 1, 1 }; // 0 = track is Drumtrack, 1= Instrumenttrack
//uint8_t seq_reverb[4][16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //uint8_t seq_reverb[4][16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, // 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0,
// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
// }; // };
uint8_t seq_patternchain[4][4] = { 0, 1, 2, 3,
0, 1, 2, 6,
0, 1, 2, 4,
7, 8, 2, 5
};

Loading…
Cancel
Save