|
|
@ -33,21 +33,6 @@ using namespace TeensyTimerTool; |
|
|
|
#include "synth_dexed.h" |
|
|
|
#include "synth_dexed.h" |
|
|
|
#include "dexed_sd.h" |
|
|
|
#include "dexed_sd.h" |
|
|
|
|
|
|
|
|
|
|
|
// Bad hack!!!
|
|
|
|
|
|
|
|
typedef struct drum_config_s { |
|
|
|
|
|
|
|
uint8_t drum_class; // Type of drum
|
|
|
|
|
|
|
|
uint8_t midinote; // Triggered by note
|
|
|
|
|
|
|
|
char name[DRUM_NAME_LEN]; |
|
|
|
|
|
|
|
const uint8_t* drum_data; |
|
|
|
|
|
|
|
char shortname[2]; // 1 char name for sequencer
|
|
|
|
|
|
|
|
uint32_t len; // number of elements in drum_data
|
|
|
|
|
|
|
|
float32_t pitch; //
|
|
|
|
|
|
|
|
float32_t pan; // Panorama (-1.0 - +1.0)
|
|
|
|
|
|
|
|
float32_t vol_max; // max. Volume (0.0 - 1.0)
|
|
|
|
|
|
|
|
float32_t vol_min; // min. Volume (0.0 - 1.0, should be <= vol_max)
|
|
|
|
|
|
|
|
float32_t reverb_send; // how much signal to send to the reverb (0.0 - 1.0)
|
|
|
|
|
|
|
|
} drum_config_t; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
extern void init_MIDI_send_CC(void); |
|
|
|
extern void init_MIDI_send_CC(void); |
|
|
|
extern void check_configuration_dexed(uint8_t instance_id); |
|
|
|
extern void check_configuration_dexed(uint8_t instance_id); |
|
|
|
extern void check_configuration_performance(void); |
|
|
|
extern void check_configuration_performance(void); |
|
|
@ -75,9 +60,22 @@ extern uint8_t arp_style; |
|
|
|
extern uint8_t seq_chord_velocity; |
|
|
|
extern uint8_t seq_chord_velocity; |
|
|
|
extern uint8_t seq_chord_dexed_inst; |
|
|
|
extern uint8_t seq_chord_dexed_inst; |
|
|
|
extern uint8_t seq_inst_dexed[4]; |
|
|
|
extern uint8_t seq_inst_dexed[4]; |
|
|
|
|
|
|
|
extern char seq_name[FILENAME_LEN]; |
|
|
|
|
|
|
|
extern char seq_name_temp[FILENAME_LEN]; |
|
|
|
extern PeriodicTimer timer1; |
|
|
|
extern PeriodicTimer timer1; |
|
|
|
extern float midi_volume_transform(uint8_t midi_amp); |
|
|
|
extern float midi_volume_transform(uint8_t midi_amp); |
|
|
|
extern drum_config_t drum_config[NUM_DRUMSET_CONFIG]; |
|
|
|
extern void set_sample_pitch(uint8_t sample, float playbackspeed); |
|
|
|
|
|
|
|
extern void set_sample_p_offset(uint8_t sample, float s_offset); |
|
|
|
|
|
|
|
extern void set_sample_pan(uint8_t sample, float s_pan); |
|
|
|
|
|
|
|
extern void set_sample_vol_max(uint8_t sample, float s_max); |
|
|
|
|
|
|
|
extern void set_sample_vol_min(uint8_t sample, float s_min); |
|
|
|
|
|
|
|
extern void set_sample_reverb_send(uint8_t sample, float s_reverb); |
|
|
|
|
|
|
|
extern float get_sample_pitch(uint8_t sample); |
|
|
|
|
|
|
|
extern float get_sample_p_offset(uint8_t sample); |
|
|
|
|
|
|
|
extern float get_sample_pan(uint8_t sample); |
|
|
|
|
|
|
|
extern float get_sample_vol_max(uint8_t sample); |
|
|
|
|
|
|
|
extern float get_sample_vol_min(uint8_t sample); |
|
|
|
|
|
|
|
extern float get_sample_reverb_send(uint8_t sample); |
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
/******************************************************************************
|
|
|
|
SD BANK/VOICE LOADING |
|
|
|
SD BANK/VOICE LOADING |
|
|
@ -484,11 +482,12 @@ bool load_sd_drumsettings_json(uint8_t number, uint8_t target) |
|
|
|
|
|
|
|
|
|
|
|
for (uint8_t i = 0; i < NUM_DRUMSET_CONFIG; i++) |
|
|
|
for (uint8_t i = 0; i < NUM_DRUMSET_CONFIG; i++) |
|
|
|
{ |
|
|
|
{ |
|
|
|
drum_config[i].pitch = data_json["pitch"][i] ; |
|
|
|
set_sample_pitch( i, data_json["pitch"][i] ); |
|
|
|
drum_config[i].pan = data_json["pan"][i] ; |
|
|
|
set_sample_p_offset ( i, data_json["p_offset"][i] ); |
|
|
|
drum_config[i].vol_max = data_json["vol_max"][i] ; |
|
|
|
set_sample_pan( i, data_json["pan"][i]) ; |
|
|
|
drum_config[i].vol_min = data_json["vol_min"][i] ; |
|
|
|
set_sample_vol_max( i, data_json["vol_max"][i]) ; |
|
|
|
drum_config[i].reverb_send = data_json["reverb_send"][i]; |
|
|
|
set_sample_vol_min( i, data_json["vol_min"][i] ); |
|
|
|
|
|
|
|
set_sample_reverb_send( i, data_json["reverb_send"][i]); |
|
|
|
} |
|
|
|
} |
|
|
|
return (true); |
|
|
|
return (true); |
|
|
|
} |
|
|
|
} |
|
|
@ -535,6 +534,7 @@ bool save_sd_drumsettings_json(uint8_t number, uint8_t target) |
|
|
|
|
|
|
|
|
|
|
|
if (SD.exists(filename)) { |
|
|
|
if (SD.exists(filename)) { |
|
|
|
Serial.println("remove old drumsettings file"); |
|
|
|
Serial.println("remove old drumsettings file"); |
|
|
|
|
|
|
|
SD.begin(); |
|
|
|
SD.remove(filename); |
|
|
|
SD.remove(filename); |
|
|
|
} |
|
|
|
} |
|
|
|
json = SD.open(filename, FILE_WRITE); |
|
|
|
json = SD.open(filename, FILE_WRITE); |
|
|
@ -544,11 +544,12 @@ bool save_sd_drumsettings_json(uint8_t number, uint8_t target) |
|
|
|
|
|
|
|
|
|
|
|
for (uint8_t i = 0; i < NUM_DRUMSET_CONFIG; i++) |
|
|
|
for (uint8_t i = 0; i < NUM_DRUMSET_CONFIG; i++) |
|
|
|
{ |
|
|
|
{ |
|
|
|
data_json["pitch"][i] = drum_config[i].pitch; |
|
|
|
data_json["pitch"][i] = get_sample_pitch(i); |
|
|
|
data_json["pan"][i] = drum_config[i].pan; |
|
|
|
data_json["p_offset"][i] = get_sample_p_offset(i); |
|
|
|
data_json["vol_max"][i] = drum_config[i].vol_max; |
|
|
|
data_json["pan"][i] = get_sample_pan(i); |
|
|
|
data_json["vol_min"][i] = drum_config[i].vol_min; |
|
|
|
data_json["vol_max"][i] = get_sample_vol_max(i); |
|
|
|
data_json["reverb_send"][i] = drum_config[i].reverb_send; |
|
|
|
data_json["vol_min"][i] = get_sample_vol_min(i); |
|
|
|
|
|
|
|
data_json["reverb_send"][i] = get_sample_reverb_send(i); |
|
|
|
} |
|
|
|
} |
|
|
|
#ifdef DEBUG |
|
|
|
#ifdef DEBUG |
|
|
|
Serial.println(F("Write JSON data:")); |
|
|
|
Serial.println(F("Write JSON data:")); |
|
|
@ -696,6 +697,8 @@ bool save_sd_voiceconfig_json(uint8_t vc, uint8_t instance_id, uint8_t target) |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
AudioNoInterrupts(); |
|
|
|
AudioNoInterrupts(); |
|
|
|
|
|
|
|
SD.begin(); |
|
|
|
|
|
|
|
SD.remove(filename); |
|
|
|
json = SD.open(filename, FILE_WRITE); |
|
|
|
json = SD.open(filename, FILE_WRITE); |
|
|
|
if (json) |
|
|
|
if (json) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -814,7 +817,9 @@ bool load_sd_fx_json(uint8_t fx, uint8_t target) |
|
|
|
configuration.fx.delay_sync[i] = data_json["delay_sync"][i]; |
|
|
|
configuration.fx.delay_sync[i] = data_json["delay_sync"][i]; |
|
|
|
configuration.fx.reverb_send[i] = data_json["reverb_send"][i]; |
|
|
|
configuration.fx.reverb_send[i] = data_json["reverb_send"][i]; |
|
|
|
if (configuration.fx.delay_sync[i] > 0) |
|
|
|
if (configuration.fx.delay_sync[i] > 0) |
|
|
|
|
|
|
|
{ |
|
|
|
configuration.fx.delay_time[i] = 0; |
|
|
|
configuration.fx.delay_time[i] = 0; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
configuration.fx.reverb_roomsize = data_json["reverb_roomsize"]; |
|
|
|
configuration.fx.reverb_roomsize = data_json["reverb_roomsize"]; |
|
|
|
configuration.fx.reverb_damping = data_json["reverb_damping"]; |
|
|
|
configuration.fx.reverb_damping = data_json["reverb_damping"]; |
|
|
@ -878,6 +883,8 @@ bool save_sd_fx_json(uint8_t fx, uint8_t target) |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
AudioNoInterrupts(); |
|
|
|
AudioNoInterrupts(); |
|
|
|
|
|
|
|
SD.begin(); |
|
|
|
|
|
|
|
SD.remove(filename); |
|
|
|
json = SD.open(filename, FILE_WRITE); |
|
|
|
json = SD.open(filename, FILE_WRITE); |
|
|
|
if (json) |
|
|
|
if (json) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -980,7 +987,8 @@ bool save_sd_seq_json(uint8_t seq_number) |
|
|
|
Serial.print(F(" ")); |
|
|
|
Serial.print(F(" ")); |
|
|
|
|
|
|
|
|
|
|
|
AudioNoInterrupts(); |
|
|
|
AudioNoInterrupts(); |
|
|
|
|
|
|
|
SD.begin(); |
|
|
|
|
|
|
|
SD.remove(filename); |
|
|
|
json = SD.open(filename, FILE_WRITE); |
|
|
|
json = SD.open(filename, FILE_WRITE); |
|
|
|
if (json) |
|
|
|
if (json) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -1046,6 +1054,10 @@ bool save_sd_seq_json(uint8_t seq_number) |
|
|
|
for (uint8_t i = 0; i < sizeof(seq_inst_dexed); i++) { |
|
|
|
for (uint8_t i = 0; i < sizeof(seq_inst_dexed); i++) { |
|
|
|
data_json["seq_inst_dexed"][i] = seq_inst_dexed[i]; |
|
|
|
data_json["seq_inst_dexed"][i] = seq_inst_dexed[i]; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
for (uint8_t i = 0; i < FILENAME_LEN; i++) { |
|
|
|
|
|
|
|
data_json["seq_name"][i] = seq_name[i]; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef DEBUG |
|
|
|
#ifdef DEBUG |
|
|
|
Serial.println(F("Write JSON data:")); |
|
|
|
Serial.println(F("Write JSON data:")); |
|
|
@ -1071,6 +1083,41 @@ bool save_sd_seq_json(uint8_t seq_number) |
|
|
|
return (false); |
|
|
|
return (false); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void get_sd_seq_name_json(uint8_t seq_number) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
seq_number = constrain(seq_number, 0, 99); |
|
|
|
|
|
|
|
memset(seq_name_temp, 0, FILENAME_LEN); |
|
|
|
|
|
|
|
if (sd_card > 0) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
File json; |
|
|
|
|
|
|
|
StaticJsonDocument<JSON_BUFFER_SIZE> data_json; |
|
|
|
|
|
|
|
char filename[FILENAME_LEN]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sprintf(filename, "/%s/%d-S.json", SEQ_CONFIG_PATH, seq_number); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// first check if file exists...
|
|
|
|
|
|
|
|
AudioNoInterrupts(); |
|
|
|
|
|
|
|
if (SD.exists(filename)) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
// ... and if: load
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
json = SD.open(filename); |
|
|
|
|
|
|
|
if (json) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
deserializeJson(data_json, json); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
json.close(); |
|
|
|
|
|
|
|
AudioInterrupts(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (data_json["seq_name"][0] != 0) { |
|
|
|
|
|
|
|
for (uint8_t i = 0; i < FILENAME_LEN; i++) { |
|
|
|
|
|
|
|
seq_name_temp[i] = data_json["seq_name"][i]; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
bool load_sd_seq_json(uint8_t seq_number) |
|
|
|
bool load_sd_seq_json(uint8_t seq_number) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (seq_number < 0) |
|
|
|
if (seq_number < 0) |
|
|
@ -1152,6 +1199,13 @@ bool load_sd_seq_json(uint8_t seq_number) |
|
|
|
for (uint8_t i = 0; i < sizeof(seq_inst_dexed); i++) { |
|
|
|
for (uint8_t i = 0; i < sizeof(seq_inst_dexed); i++) { |
|
|
|
seq_inst_dexed[i] = data_json["seq_inst_dexed"][i]; |
|
|
|
seq_inst_dexed[i] = data_json["seq_inst_dexed"][i]; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (data_json["seq_name"][0] != 0) { |
|
|
|
|
|
|
|
for (uint8_t i = 0; i < FILENAME_LEN; i++) { |
|
|
|
|
|
|
|
seq_name[i] = data_json["seq_name"][i]; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
count = 0; |
|
|
|
count = 0; |
|
|
|
seq_tempo_ms = data_json["seq_tempo_ms"] ; |
|
|
|
seq_tempo_ms = data_json["seq_tempo_ms"] ; |
|
|
|
seq_bpm = data_json["seq_bpm"]; |
|
|
|
seq_bpm = data_json["seq_bpm"]; |
|
|
@ -1167,6 +1221,7 @@ 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"]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (uint8_t instance_id = 0; instance_id < NUM_DEXED; instance_id++) |
|
|
|
for (uint8_t instance_id = 0; instance_id < NUM_DEXED; instance_id++) |
|
|
|
{ |
|
|
|
{ |
|
|
|
configuration.performance.bank[instance_id] = data_json["bank"][instance_id]; |
|
|
|
configuration.performance.bank[instance_id] = data_json["bank"][instance_id]; |
|
|
|