|
|
@ -837,104 +837,7 @@ bool load_sd_seq_drumsettings_json(uint8_t number) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
AudioInterrupts(); |
|
|
|
|
|
|
|
return (false); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool load_sd_seq_voicesettings_json(uint8_t number) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
uint8_t bank[MAX_DEXED]; |
|
|
|
|
|
|
|
uint8_t voice[MAX_DEXED]; |
|
|
|
|
|
|
|
if (number < 0) |
|
|
|
|
|
|
|
return (false); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
number = constrain(number, 0, 99); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (sd_card > 0) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
File json; |
|
|
|
|
|
|
|
char filename[FILENAME_LEN]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sprintf(filename, "/%s/%s%d-v.json", SEQ_CONFIG_PATH, SEQ_CONFIG_NAME, 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 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (uint8_t i = 0; i < MAX_DEXED; i++) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
bank[i] = data_json["bank"][i]; |
|
|
|
|
|
|
|
voice[i] = data_json["voice"][i]; |
|
|
|
|
|
|
|
configuration.fx.reverb_send[i] = data_json["rev_send"][i]; |
|
|
|
|
|
|
|
configuration.dexed[i].midi_channel = data_json["midi_ch"][i]; |
|
|
|
|
|
|
|
configuration.dexed[i].sound_intensity = data_json["vol"][i]; |
|
|
|
|
|
|
|
configuration.dexed[i].transpose = data_json["v_trans"][i]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
configuration.fx.reverb_roomsize = data_json["rev_roomsize"]; |
|
|
|
|
|
|
|
configuration.fx.reverb_damping = data_json["rev_damping"]; |
|
|
|
|
|
|
|
configuration.fx.reverb_lowpass = data_json["rev_lowpass"]; |
|
|
|
|
|
|
|
configuration.fx.reverb_lodamp = data_json["rev_lodamp"]; |
|
|
|
|
|
|
|
configuration.fx.reverb_hidamp = data_json["rev_hidamp"]; |
|
|
|
|
|
|
|
configuration.fx.reverb_diffusion = data_json["rev_diffusion"]; |
|
|
|
|
|
|
|
configuration.fx.reverb_level = data_json["rev_level"]; |
|
|
|
|
|
|
|
configuration.fx.eq_bass = data_json["eq_bass"]; |
|
|
|
|
|
|
|
configuration.fx.eq_treble = data_json["eq_treble"]; */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (uint8_t i = 0; i < NUM_DEXED; i++) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
load_sd_voice(bank[i], voice[i], i); |
|
|
|
|
|
|
|
MicroDexed[i]->doRefreshVoice(); |
|
|
|
|
|
|
|
MicroDexed[i]->panic(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
seq_tempo_ms = 60000000 / seq_bpm / 4; |
|
|
|
|
|
|
|
timer1.begin(sequencer, seq_tempo_ms / 2, false); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//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); |
|
|
|
return (false); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -980,74 +883,7 @@ bool save_sd_seq_drumsettings_json(uint8_t number) |
|
|
|
return (true); |
|
|
|
return (true); |
|
|
|
} |
|
|
|
} |
|
|
|
json.close(); |
|
|
|
json.close(); |
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
#ifdef DEBUG |
|
|
|
|
|
|
|
Serial.print(F("E : Cannot open ")); |
|
|
|
|
|
|
|
Serial.print(filename); |
|
|
|
|
|
|
|
Serial.println(F(" on SD.")); |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
AudioInterrupts(); |
|
|
|
|
|
|
|
return (false); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool save_sd_seq_voicesettings_json(uint8_t number) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
char filename[FILENAME_LEN]; |
|
|
|
|
|
|
|
number = constrain(number, 0, 99); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (sd_card > 0) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
File json; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sprintf(filename, "/%s/%s%d-v.json", SEQ_CONFIG_PATH, SEQ_CONFIG_NAME, number); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef DEBUG |
|
|
|
|
|
|
|
Serial.print(F("Saving sequencer voice config ")); |
|
|
|
|
|
|
|
Serial.print(number); |
|
|
|
|
|
|
|
Serial.print(F(" to ")); |
|
|
|
|
|
|
|
Serial.println(filename); |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AudioNoInterrupts(); |
|
|
|
|
|
|
|
json = SD.open(filename, FILE_WRITE); |
|
|
|
|
|
|
|
if (json) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (uint8_t i = 0; i < MAX_DEXED; i++) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
data_json["bank"][i] = configuration.performance.bank[i]; |
|
|
|
|
|
|
|
data_json["voice"][i] = configuration.performance.voice[i]; |
|
|
|
|
|
|
|
data_json["rev_send"][i] = configuration.fx.reverb_send[i]; |
|
|
|
|
|
|
|
data_json["midi_ch"][i] = configuration.dexed[i].midi_channel; |
|
|
|
|
|
|
|
data_json["vol"][i] = configuration.dexed[i].sound_intensity; |
|
|
|
|
|
|
|
data_json["v_trans"][i] = configuration.dexed[i].transpose; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
data_json["rev_roomsize"] = configuration.fx.reverb_roomsize; |
|
|
|
|
|
|
|
data_json["rev_damping"] = configuration.fx.reverb_damping; |
|
|
|
|
|
|
|
data_json["rev_lowpass"] = configuration.fx.reverb_lowpass; |
|
|
|
|
|
|
|
data_json["rev_lodamp"] = configuration.fx.reverb_lodamp; |
|
|
|
|
|
|
|
data_json["rev_hidamp"] = configuration.fx.reverb_hidamp; |
|
|
|
|
|
|
|
data_json["rev_diffusion"] = configuration.fx.reverb_diffusion; |
|
|
|
|
|
|
|
data_json["rev_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(); |
|
|
|
AudioInterrupts(); |
|
|
|
return (true); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
json.close(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
{ |
|
|
|
{ |
|
|
@ -1057,7 +893,6 @@ bool save_sd_seq_voicesettings_json(uint8_t number) |
|
|
|
Serial.println(F(" on SD.")); |
|
|
|
Serial.println(F(" on SD.")); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
|
AudioInterrupts(); |
|
|
|
|
|
|
|
return (false); |
|
|
|
return (false); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -1067,23 +902,8 @@ bool save_sd_seq_json(uint8_t seq_number) |
|
|
|
int count = 0; |
|
|
|
int count = 0; |
|
|
|
seq_number = constrain(seq_number, 0, 99); |
|
|
|
seq_number = constrain(seq_number, 0, 99); |
|
|
|
|
|
|
|
|
|
|
|
save_sd_seq_drumsettings_json(seq_number); |
|
|
|
|
|
|
|
save_sd_seq_voicesettings_json(seq_number); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (sd_card > 0) |
|
|
|
if (sd_card > 0) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
sprintf(filename, "/%s/%s%d.json", SEQ_CONFIG_PATH, SEQ_CONFIG_NAME, seq_number); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AudioNoInterrupts(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (SD.exists(filename)) { |
|
|
|
|
|
|
|
Serial.println("Remove"); |
|
|
|
|
|
|
|
Serial.print(filename); |
|
|
|
|
|
|
|
SD.remove(filename); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AudioInterrupts(); |
|
|
|
|
|
|
|
File json; |
|
|
|
File json; |
|
|
|
|
|
|
|
|
|
|
|
sprintf(filename, "/%s/%s%d.json", SEQ_CONFIG_PATH, SEQ_CONFIG_NAME, seq_number); |
|
|
|
sprintf(filename, "/%s/%s%d.json", SEQ_CONFIG_PATH, SEQ_CONFIG_NAME, seq_number); |
|
|
@ -1175,11 +995,11 @@ bool save_sd_seq_json(uint8_t seq_number) |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
serializeJsonPretty(data_json, json); |
|
|
|
serializeJsonPretty(data_json, json); |
|
|
|
json.close(); |
|
|
|
json.close(); |
|
|
|
|
|
|
|
AudioInterrupts(); |
|
|
|
return (true); |
|
|
|
return (true); |
|
|
|
} |
|
|
|
} |
|
|
|
json.close(); |
|
|
|
json.close(); |
|
|
|
AudioInterrupts(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
{ |
|
|
|
{ |
|
|
@ -1189,7 +1009,6 @@ bool save_sd_seq_json(uint8_t seq_number) |
|
|
|
Serial.println(F(" on SD.")); |
|
|
|
Serial.println(F(" on SD.")); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
|
AudioInterrupts(); |
|
|
|
|
|
|
|
return (false); |
|
|
|
return (false); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -1201,9 +1020,6 @@ bool load_sd_seq_json(uint8_t seq_number) |
|
|
|
|
|
|
|
|
|
|
|
seq_number = constrain(seq_number, 0, 99); |
|
|
|
seq_number = constrain(seq_number, 0, 99); |
|
|
|
|
|
|
|
|
|
|
|
load_sd_seq_drumsettings_json(seq_number); |
|
|
|
|
|
|
|
load_sd_seq_voicesettings_json(seq_number); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (sd_card > 0) |
|
|
|
if (sd_card > 0) |
|
|
|
{ |
|
|
|
{ |
|
|
|
File json; |
|
|
|
File json; |
|
|
@ -1227,9 +1043,7 @@ bool load_sd_seq_json(uint8_t seq_number) |
|
|
|
deserializeJson(data_json, json); |
|
|
|
deserializeJson(data_json, json); |
|
|
|
|
|
|
|
|
|
|
|
json.close(); |
|
|
|
json.close(); |
|
|
|
AudioInterrupts(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//check_configuration_fx();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef DEBUG |
|
|
|
#ifdef DEBUG |
|
|
|
Serial.println(F("Read JSON data:")); |
|
|
|
Serial.println(F("Read JSON data:")); |
|
|
@ -1292,9 +1106,9 @@ bool load_sd_seq_json(uint8_t seq_number) |
|
|
|
seq_oct_shift = data_json["seq_oct_shift"]; |
|
|
|
seq_oct_shift = data_json["seq_oct_shift"]; |
|
|
|
seq_element_shift = data_json["seq_element_shift"]; |
|
|
|
seq_element_shift = data_json["seq_element_shift"]; |
|
|
|
|
|
|
|
|
|
|
|
//set_fx_params();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return (true); |
|
|
|
return (true); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
#ifdef DEBUG |
|
|
|
#ifdef DEBUG |
|
|
|
else |
|
|
|
else |
|
|
@ -1312,8 +1126,6 @@ bool load_sd_seq_json(uint8_t seq_number) |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
AudioInterrupts(); |
|
|
|
|
|
|
|
return (false); |
|
|
|
return (false); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|