Adding a reverb-send value for each drum.

pull/54/head
Holger Wirtz 3 years ago
parent 26a4af2f7d
commit 9654859fea
  1. 24
      MicroDexed.ino
  2. 45
      dexed_sd.cpp
  3. 18
      drums.h

@ -91,6 +91,10 @@ AudioAmplifier* drum_volume[NUM_DRUMS];
AudioEffectMonoStereo* drum_mono2stereo[NUM_DRUMS]; AudioEffectMonoStereo* drum_mono2stereo[NUM_DRUMS];
AudioMixer4 drum_mixer_r; AudioMixer4 drum_mixer_r;
AudioMixer4 drum_mixer_l; AudioMixer4 drum_mixer_l;
#ifdef USE_FX
AudioMixer4 drum_reverb_send_mixer_r;
AudioMixer4 drum_reverb_send_mixer_l;
#endif
#endif #endif
// Audio chain tail // Audio chain tail
@ -164,8 +168,8 @@ AudioConnection patchCord20(audio_thru_mixer_l, 0, i2s1, 1);
#if NUM_DRUMS > 0 #if NUM_DRUMS > 0
#ifdef USE_FX #ifdef USE_FX
AudioConnection patchCord21(drum_mixer_r, 0, reverb_mixer_r, 2); AudioConnection patchCord21(drum_reverb_send_mixer_r, 0, reverb_mixer_r, 2);
AudioConnection patchCord22(drum_mixer_l, 0, reverb_mixer_l, 2); AudioConnection patchCord22(drum_reverb_send_mixer_l, 0, reverb_mixer_l, 2);
AudioConnection patchCord23(drum_mixer_r, 0, master_mixer_r, 2); AudioConnection patchCord23(drum_mixer_r, 0, master_mixer_r, 2);
AudioConnection patchCord24(drum_mixer_l, 0, master_mixer_l, 2); AudioConnection patchCord24(drum_mixer_l, 0, master_mixer_l, 2);
#else #else
@ -179,9 +183,9 @@ AudioConnection patchCord22(drum_mixer_l, 0, master_mixer_l, 2);
// //
uint8_t nDynamic = 0; uint8_t nDynamic = 0;
#if defined(USE_FX) && MOD_FILTER_OUTPUT != MOD_NO_FILTER_OUTPUT #if defined(USE_FX) && MOD_FILTER_OUTPUT != MOD_NO_FILTER_OUTPUT
AudioConnection* dynamicConnections[NUM_DEXED * 16 + NUM_DRUMS * 4 ]; AudioConnection* dynamicConnections[NUM_DEXED * 16 + NUM_DRUMS * 6 ];
#elif defined(USE_FX) && MOD_FILTER_OUTPUT == MOD_NO_FILTER_OUTPUT #elif defined(USE_FX) && MOD_FILTER_OUTPUT == MOD_NO_FILTER_OUTPUT
AudioConnection* dynamicConnections[NUM_DEXED * 15 + NUM_DRUMS * 4]; AudioConnection* dynamicConnections[NUM_DEXED * 15 + NUM_DRUMS * 6];
#else #else
AudioConnection* dynamicConnections[NUM_DEXED * 4 + NUM_DRUMS * 4]; AudioConnection* dynamicConnections[NUM_DEXED * 4 + NUM_DRUMS * 4];
#endif #endif
@ -248,6 +252,10 @@ void create_audio_drum_chain(uint8_t instance_id)
dynamicConnections[nDynamic++] = new AudioConnection(*drum_volume[instance_id], 0, *drum_mono2stereo[instance_id], 0); dynamicConnections[nDynamic++] = new AudioConnection(*drum_volume[instance_id], 0, *drum_mono2stereo[instance_id], 0);
dynamicConnections[nDynamic++] = new AudioConnection(*drum_mono2stereo[instance_id], 0, drum_mixer_r, instance_id); dynamicConnections[nDynamic++] = new AudioConnection(*drum_mono2stereo[instance_id], 0, drum_mixer_r, instance_id);
dynamicConnections[nDynamic++] = new AudioConnection(*drum_mono2stereo[instance_id], 1, drum_mixer_l, instance_id); dynamicConnections[nDynamic++] = new AudioConnection(*drum_mono2stereo[instance_id], 1, drum_mixer_l, instance_id);
#ifdef USE_FX
dynamicConnections[nDynamic++] = new AudioConnection(*drum_mono2stereo[instance_id], 0, drum_reverb_send_mixer_r, instance_id);
dynamicConnections[nDynamic++] = new AudioConnection(*drum_mono2stereo[instance_id], 1, drum_reverb_send_mixer_l, instance_id);
#endif
#ifdef DEBUG #ifdef DEBUG
Serial.print(F("Drum-Instance: ")); Serial.print(F("Drum-Instance: "));
@ -621,9 +629,9 @@ void loop()
//write to sequencer if in sequencer menu (step recording and live recording) //write to sequencer if in sequencer menu (step recording and live recording)
if (seq_note_in>0 && seq_recording == true){ if (seq_note_in > 0 && seq_recording == true) {
seqdata[active_seq_track][seqsteptimer]=seq_note_in; seqdata[active_seq_track][seqsteptimer] = seq_note_in;
seq_note_in=0; seq_note_in = 0;
} }
lcd.setCursor(seqsteptimer, 1); lcd.setCursor(seqsteptimer, 1);
lcd.print("X"); lcd.print("X");
@ -802,6 +810,8 @@ void handleNoteOn(byte inChannel, byte inNumber, byte inVelocity)
uint8_t slot = drum_get_slot(drum_config[d].type); uint8_t slot = drum_get_slot(drum_config[d].type);
drum_volume[slot]->gain(pseudo_log_curve(mapfloat(inVelocity, 0, 127, drum_config[d].vol_min, drum_config[d].vol_max))); drum_volume[slot]->gain(pseudo_log_curve(mapfloat(inVelocity, 0, 127, drum_config[d].vol_min, drum_config[d].vol_max)));
drum_mono2stereo[slot]->panorama(drum_config[d].pan); drum_mono2stereo[slot]->panorama(drum_config[d].pan);
drum_reverb_send_mixer_r.gain(slot, pseudo_log_curve(mapfloat(inVelocity, 0, 127, drum_config[d].vol_min, drum_config[d].vol_max)));
drum_reverb_send_mixer_l.gain(slot, pseudo_log_curve(mapfloat(inVelocity, 0, 127, drum_config[d].vol_min, drum_config[d].vol_max)));
Drum[slot]->play(drum_config[d].filename); Drum[slot]->play(drum_config[d].filename);
break; break;
} }

@ -51,7 +51,9 @@ bool load_sd_voice(uint8_t b, uint8_t v, uint8_t instance_id)
get_bank_name(b, bank_name, sizeof(bank_name)); get_bank_name(b, bank_name, sizeof(bank_name));
sprintf(filename, "/%d/%s.syx", b, bank_name); sprintf(filename, "/%d/%s.syx", b, bank_name);
AudioNoInterrupts();
sysex = SD.open(filename); sysex = SD.open(filename);
AudioInterrupts();
if (!sysex) if (!sysex)
{ {
#ifdef DEBUG #ifdef DEBUG
@ -81,8 +83,9 @@ bool load_sd_voice(uint8_t b, uint8_t v, uint8_t instance_id)
#endif #endif
configuration.dexed[instance_id].transpose = MicroDexed[instance_id]->getTranspose(); configuration.dexed[instance_id].transpose = MicroDexed[instance_id]->getTranspose();
AudioNoInterrupts();
sysex.close(); sysex.close();
AudioInterrupts();
uint8_t data_copy[155]; uint8_t data_copy[155];
MicroDexed[instance_id]->getVoiceData(data_copy); MicroDexed[instance_id]->getVoiceData(data_copy);
@ -94,7 +97,9 @@ bool load_sd_voice(uint8_t b, uint8_t v, uint8_t instance_id)
else else
Serial.println(F("E : Cannot load voice data")); Serial.println(F("E : Cannot load voice data"));
#endif #endif
AudioNoInterrupts();
sysex.close(); sysex.close();
AudioInterrupts();
} }
return (false); return (false);
@ -115,7 +120,9 @@ bool save_sd_voice(uint8_t b, uint8_t v, uint8_t instance_id)
get_bank_name(b, bank_name, sizeof(bank_name)); get_bank_name(b, bank_name, sizeof(bank_name));
sprintf(filename, "/%d/%s.syx", b, bank_name); sprintf(filename, "/%d/%s.syx", b, bank_name);
AudioNoInterrupts();
sysex = SD.open(filename, FILE_WRITE); sysex = SD.open(filename, FILE_WRITE);
AudioInterrupts();
if (!sysex) if (!sysex)
{ {
#ifdef DEBUG #ifdef DEBUG
@ -140,7 +147,9 @@ bool save_sd_voice(uint8_t b, uint8_t v, uint8_t instance_id)
Serial.print(voice_name); Serial.print(voice_name);
Serial.println(F("]")); Serial.println(F("]"));
#endif #endif
AudioNoInterrupts();
sysex.close(); sysex.close();
AudioInterrupts();
return (true); return (true);
} }
@ -148,7 +157,9 @@ bool save_sd_voice(uint8_t b, uint8_t v, uint8_t instance_id)
else else
Serial.println(F("E : Cannot load voice data")); Serial.println(F("E : Cannot load voice data"));
#endif #endif
AudioNoInterrupts();
sysex.close(); sysex.close();
AudioInterrupts();
} }
return (false); return (false);
@ -160,6 +171,7 @@ bool get_sd_voice(File sysex, uint8_t voice_number, uint8_t* data)
int32_t bulk_checksum_calc = 0; int32_t bulk_checksum_calc = 0;
int8_t bulk_checksum; int8_t bulk_checksum;
AudioNoInterrupts();
if (sysex.size() != 4104) // check sysex size if (sysex.size() != 4104) // check sysex size
{ {
#ifdef DEBUG #ifdef DEBUG
@ -209,6 +221,7 @@ bool get_sd_voice(File sysex, uint8_t voice_number, uint8_t* data)
bulk_checksum_calc -= d; bulk_checksum_calc -= d;
} }
bulk_checksum_calc &= 0x7f; bulk_checksum_calc &= 0x7f;
AudioInterrupts();
#ifdef DEBUG #ifdef DEBUG
Serial.print(F("Bulk checksum : 0x")); Serial.print(F("Bulk checksum : 0x"));
@ -240,6 +253,7 @@ bool put_sd_voice(File sysex, uint8_t voice_number, uint8_t* data)
uint16_t n; uint16_t n;
int32_t bulk_checksum_calc = 0; int32_t bulk_checksum_calc = 0;
AudioNoInterrupts();
sysex.seek(0); sysex.seek(0);
if (sysex.size() != 4104) // check sysex size if (sysex.size() != 4104) // check sysex size
@ -292,6 +306,7 @@ bool put_sd_voice(File sysex, uint8_t voice_number, uint8_t* data)
} }
sysex.seek(4102); // Bulk checksum sysex.seek(4102); // Bulk checksum
sysex.write(bulk_checksum_calc & 0x7f); sysex.write(bulk_checksum_calc & 0x7f);
AudioInterrupts();
#ifdef DEBUG #ifdef DEBUG
Serial.print(F("Bulk checksum : 0x")); Serial.print(F("Bulk checksum : 0x"));
@ -319,6 +334,7 @@ bool save_sd_bank(const char* bank_filename, uint8_t* data)
// first remove old bank // first remove old bank
sscanf(bank_filename, "/%d/%s", &bank_number, tmp); sscanf(bank_filename, "/%d/%s", &bank_number, tmp);
sprintf(tmp, "/%d", bank_number); sprintf(tmp, "/%d", bank_number);
AudioNoInterrupts();
root = SD.open(tmp); root = SD.open(tmp);
while (42 == 42) while (42 == 42)
{ {
@ -365,6 +381,7 @@ bool save_sd_bank(const char* bank_filename, uint8_t* data)
root = SD.open(bank_filename, FILE_WRITE); root = SD.open(bank_filename, FILE_WRITE);
root.write(data, 4104); root.write(data, 4104);
root.close(); root.close();
AudioInterrupts();
#ifdef DEBUG #ifdef DEBUG
Serial.println(F(" done.")); Serial.println(F(" done."));
#endif #endif
@ -393,6 +410,7 @@ bool load_sd_voiceconfig(int8_t vc, uint8_t instance_id)
sprintf(filename, "/%s/%s%d.syx", VOICE_CONFIG_PATH, VOICE_CONFIG_NAME, vc); sprintf(filename, "/%s/%s%d.syx", VOICE_CONFIG_PATH, VOICE_CONFIG_NAME, vc);
// first check if file exists... // first check if file exists...
AudioNoInterrupts();
if (SD.exists(filename)) if (SD.exists(filename))
{ {
// ... and if: load // ... and if: load
@ -407,12 +425,14 @@ bool load_sd_voiceconfig(int8_t vc, uint8_t instance_id)
get_sd_data(sysex, 0x42, (uint8_t*)&configuration.dexed[instance_id]); get_sd_data(sysex, 0x42, (uint8_t*)&configuration.dexed[instance_id]);
set_voiceconfig_params(instance_id); set_voiceconfig_params(instance_id);
sysex.close(); sysex.close();
AudioInterrupts();
return (true); return (true);
} }
#ifdef DEBUG #ifdef DEBUG
else else
{ {
AudioInterrupts();
Serial.print(F("E : Cannot open ")); Serial.print(F("E : Cannot open "));
Serial.print(filename); Serial.print(filename);
Serial.println(F(" on SD.")); Serial.println(F(" on SD."));
@ -452,15 +472,18 @@ bool save_sd_voiceconfig(uint8_t vc, uint8_t instance_id)
Serial.println(filename); Serial.println(filename);
#endif #endif
AudioNoInterrupts();
sysex = SD.open(filename, FILE_WRITE); sysex = SD.open(filename, FILE_WRITE);
if (sysex) if (sysex)
{ {
if (write_sd_data(sysex, 0x42, (uint8_t*)&configuration.dexed[instance_id], sizeof(configuration.dexed[instance_id]))) if (write_sd_data(sysex, 0x42, (uint8_t*)&configuration.dexed[instance_id], sizeof(configuration.dexed[instance_id])))
{ {
sysex.close(); sysex.close();
AudioInterrupts();
return (true); return (true);
} }
sysex.close(); sysex.close();
AudioInterrupts();
} }
else else
{ {
@ -493,6 +516,7 @@ bool load_sd_fx(int8_t fx)
sprintf(filename, "/%s/%s%d.syx", FX_CONFIG_PATH, FX_CONFIG_NAME, fx); sprintf(filename, "/%s/%s%d.syx", FX_CONFIG_PATH, FX_CONFIG_NAME, fx);
// first check if file exists... // first check if file exists...
AudioNoInterrupts();
if (SD.exists(filename)) if (SD.exists(filename))
{ {
// ... and if: load // ... and if: load
@ -507,12 +531,14 @@ bool load_sd_fx(int8_t fx)
get_sd_data(sysex, 0x43, (uint8_t*)&configuration.fx); get_sd_data(sysex, 0x43, (uint8_t*)&configuration.fx);
set_fx_params(); set_fx_params();
sysex.close(); sysex.close();
AudioInterrupts();
return (true); return (true);
} }
#ifdef DEBUG #ifdef DEBUG
else else
{ {
AudioInterrupts();
Serial.print(F("E : Cannot open ")); Serial.print(F("E : Cannot open "));
Serial.print(filename); Serial.print(filename);
Serial.println(F(" on SD.")); Serial.println(F(" on SD."));
@ -550,15 +576,18 @@ bool save_sd_fx(uint8_t fx)
Serial.println(filename); Serial.println(filename);
#endif #endif
AudioNoInterrupts();
sysex = SD.open(filename, FILE_WRITE); sysex = SD.open(filename, FILE_WRITE);
if (sysex) if (sysex)
{ {
if (write_sd_data(sysex, 0x43, (uint8_t*)&configuration.fx, sizeof(configuration.fx))) if (write_sd_data(sysex, 0x43, (uint8_t*)&configuration.fx, sizeof(configuration.fx)))
{ {
sysex.close(); sysex.close();
AudioInterrupts();
return (true); return (true);
} }
sysex.close(); sysex.close();
AudioInterrupts();
} }
else else
{ {
@ -592,6 +621,7 @@ bool load_sd_performance(int8_t p)
sprintf(filename, "/%s/%s%d.syx", PERFORMANCE_CONFIG_PATH, PERFORMANCE_CONFIG_NAME, p); sprintf(filename, "/%s/%s%d.syx", PERFORMANCE_CONFIG_PATH, PERFORMANCE_CONFIG_NAME, p);
// first check if file exists... // first check if file exists...
AudioNoInterrupts();
if (SD.exists(filename)) if (SD.exists(filename))
{ {
// ... and if: load // ... and if: load
@ -605,6 +635,7 @@ bool load_sd_performance(int8_t p)
{ {
get_sd_data(sysex, 0x44, (uint8_t*)&configuration.performance); get_sd_data(sysex, 0x44, (uint8_t*)&configuration.performance);
sysex.close(); sysex.close();
AudioInterrupts();
for (uint8_t instance_id = 0; instance_id < NUM_DEXED; instance_id++) for (uint8_t instance_id = 0; instance_id < NUM_DEXED; instance_id++)
{ {
@ -657,15 +688,18 @@ bool save_sd_performance(uint8_t p)
Serial.println(filename); Serial.println(filename);
#endif #endif
AudioNoInterrupts();
sysex = SD.open(filename, FILE_WRITE); sysex = SD.open(filename, FILE_WRITE);
if (sysex) if (sysex)
{ {
if (write_sd_data(sysex, 0x44, (uint8_t*)&configuration.performance, sizeof(configuration.performance))) if (write_sd_data(sysex, 0x44, (uint8_t*)&configuration.performance, sizeof(configuration.performance)))
{ {
sysex.close(); sysex.close();
AudioInterrupts();
return (true); return (true);
} }
sysex.close(); sysex.close();
AudioInterrupts();
} }
else else
{ {
@ -695,6 +729,7 @@ bool get_sd_data(File sysex, uint8_t format, uint8_t* conf)
Serial.println(F(" bytes.")); Serial.println(F(" bytes."));
#endif #endif
AudioNoInterrupts();
if (sysex.read() != 0xf0) // check sysex start-byte if (sysex.read() != 0xf0) // check sysex start-byte
{ {
#ifdef DEBUG #ifdef DEBUG
@ -767,6 +802,7 @@ bool get_sd_data(File sysex, uint8_t format, uint8_t* conf)
uint8_t d = sysex.read(); uint8_t d = sysex.read();
*(conf++) = d; *(conf++) = d;
} }
AudioInterrupts();
#ifdef DEBUG #ifdef DEBUG
Serial.println(F("SD data loaded.")); Serial.println(F("SD data loaded."));
@ -786,6 +822,7 @@ bool write_sd_data(File sysex, uint8_t format, uint8_t* data, uint16_t len)
#endif #endif
// write sysex start // write sysex start
AudioNoInterrupts();
sysex.write(0xf0); sysex.write(0xf0);
#ifdef DEBUG #ifdef DEBUG
Serial.println(F("Write SYSEX start: 0xf0")); Serial.println(F("Write SYSEX start: 0xf0"));
@ -820,6 +857,8 @@ bool write_sd_data(File sysex, uint8_t format, uint8_t* data, uint16_t len)
#endif #endif
// write sysex end // write sysex end
sysex.write(0xf7); sysex.write(0xf7);
AudioInterrupts();
#ifdef DEBUG #ifdef DEBUG
Serial.println(F("Write SYSEX end: 0xf7")); Serial.println(F("Write SYSEX end: 0xf7"));
#endif #endif
@ -922,6 +961,7 @@ bool get_voice_name(uint8_t b, uint8_t v, char* name, uint8_t len)
#endif #endif
// try to open directory // try to open directory
AudioNoInterrupts();
sysex = SD.open(filename); sysex = SD.open(filename);
if (!sysex) if (!sysex)
return (false); return (false);
@ -941,6 +981,7 @@ bool get_voice_name(uint8_t b, uint8_t v, char* name, uint8_t len)
#endif #endif
sysex.close(); sysex.close();
AudioInterrupts();
return (true); return (true);
} }
@ -964,6 +1005,7 @@ bool get_voice_by_bank_name(uint8_t b, const char* bank_name, uint8_t v, char* v
#endif #endif
// try to open directory // try to open directory
AudioNoInterrupts();
sysex = SD.open(filename); sysex = SD.open(filename);
if (!sysex) if (!sysex)
return (false); return (false);
@ -985,6 +1027,7 @@ bool get_voice_by_bank_name(uint8_t b, const char* bank_name, uint8_t v, char* v
#endif #endif
sysex.close(); sysex.close();
AudioInterrupts();
return (true); return (true);
} }

@ -36,6 +36,7 @@ typedef struct drum_config_s {
float32_t pan; // Panorama (-1.0 - +1.0) float32_t pan; // Panorama (-1.0 - +1.0)
float32_t vol_max; // max. Volume (0.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 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; } drum_config_t;
#define NUM_DRUMCONFIG 15 #define NUM_DRUMCONFIG 15
@ -47,6 +48,7 @@ drum_config_t drum_config[NUM_DRUMCONFIG] = {
"B", "B",
0.0, 0.0,
0.8, 0.8,
0.0,
0.0 0.0
}, },
{ {
@ -56,6 +58,7 @@ drum_config_t drum_config[NUM_DRUMCONFIG] = {
"C", "C",
-0.4, -0.4,
0.6, 0.6,
0.0,
0.0 0.0
}, },
{ {
@ -65,7 +68,8 @@ drum_config_t drum_config[NUM_DRUMCONFIG] = {
"S", "S",
0.2, 0.2,
0.6, 0.6,
0.2 0.2,
0.0
}, },
{ {
DRUM_HIHAT, DRUM_HIHAT,
@ -74,6 +78,7 @@ drum_config_t drum_config[NUM_DRUMCONFIG] = {
"h", "h",
0.8, 0.8,
0.2, 0.2,
0.0,
0.0 0.0
}, },
{ {
@ -83,6 +88,7 @@ drum_config_t drum_config[NUM_DRUMCONFIG] = {
"h", "h",
0.8, 0.8,
0.2, 0.2,
0.0,
0.0 0.0
}, },
{ {
@ -92,6 +98,7 @@ drum_config_t drum_config[NUM_DRUMCONFIG] = {
"H", "H",
0.8, 0.8,
0.2, 0.2,
0.0,
0.0 0.0
}, },
{ {
@ -101,6 +108,7 @@ drum_config_t drum_config[NUM_DRUMCONFIG] = {
"T", "T",
-0.7, -0.7,
0.8, 0.8,
0.0,
0.0 0.0
}, },
{ {
@ -110,6 +118,7 @@ drum_config_t drum_config[NUM_DRUMCONFIG] = {
"T", "T",
-0.5, -0.5,
0.8, 0.8,
0.0,
0.0 0.0
}, },
{ {
@ -119,6 +128,7 @@ drum_config_t drum_config[NUM_DRUMCONFIG] = {
"R", "R",
-0.6, -0.6,
0.3, 0.3,
0.0,
0.0 0.0
}, },
{ {
@ -128,6 +138,7 @@ drum_config_t drum_config[NUM_DRUMCONFIG] = {
"R", "R",
-0.6, -0.6,
0.3, 0.3,
0.0,
0.0 0.0
}, },
{ {
@ -137,6 +148,7 @@ drum_config_t drum_config[NUM_DRUMCONFIG] = {
"B", "B",
0.0, 0.0,
0.9, 0.9,
0.0,
0.0 0.0
}, },
{ {
@ -146,6 +158,7 @@ drum_config_t drum_config[NUM_DRUMCONFIG] = {
"C", "C",
0.0, 0.0,
0.9, 0.9,
0.0,
0.0 0.0
}, },
{ {
@ -155,6 +168,7 @@ drum_config_t drum_config[NUM_DRUMCONFIG] = {
"R", "R",
-0.3, -0.3,
0.5, 0.5,
0.0,
0.0 0.0
}, },
{ {
@ -164,6 +178,7 @@ drum_config_t drum_config[NUM_DRUMCONFIG] = {
"H", "H",
0.4, 0.4,
0.6, 0.6,
0.0,
0.0 0.0
}, },
{ {
@ -173,6 +188,7 @@ drum_config_t drum_config[NUM_DRUMCONFIG] = {
"-", "-",
0.0, 0.0,
0.0, 0.0,
0.0,
0.0 0.0
} }
}; };

Loading…
Cancel
Save