From eaf77368300dabad43d608a6c50323adbd94a7f1 Mon Sep 17 00:00:00 2001 From: Holger Wirtz Date: Thu, 23 Feb 2023 16:20:26 +0100 Subject: [PATCH] Fixes for drum note mapping. --- MicroDexed.ino | 82 ++++++++++++++++++++++++++------------------------ UI.hpp | 5 ++- 2 files changed, 47 insertions(+), 40 deletions(-) diff --git a/MicroDexed.ino b/MicroDexed.ino index 24456af..e63c2ee 100644 --- a/MicroDexed.ino +++ b/MicroDexed.ino @@ -909,49 +909,53 @@ void handleNoteOn(byte inChannel, byte inNumber, byte inVelocity) { Serial.flush(); #endif + uint8_t use_drum = 0; + for (uint8_t d = 0; d < NUM_DRUMSET_CONFIG; d++) { if (inNumber == configuration.drums.midinote[d]) { - uint8_t slot = drum_get_slot(drum_config[d].drum_class); - float pan = mapfloat(configuration.drums.pan[d], DRUMS_PANORAMA_MIN, DRUMS_PANORAMA_MAX, 0.0, 1.0); - float reverb_send = configuration.drums.reverb_send[d] / 100.0f; - float vol_min = configuration.drums.vol_min[d] / 100.0f; - float vol_max = configuration.drums.vol_max[d] / 100.0f; - - drum_mixer_r.gain(slot, pan * volume_transform(mapfloat(inVelocity, 0, 127, vol_min, vol_max))); - drum_mixer_l.gain(slot, (1.0 - pan) * volume_transform(mapfloat(inVelocity, 0, 127, vol_min, vol_max))); - - drum_reverb_send_mixer_r.gain(slot, pan * volume_transform(reverb_send)); - drum_reverb_send_mixer_l.gain(slot, (1.0 - pan) * volume_transform(reverb_send)); - - if (drum_config[d].drum_data != NULL && drum_config[d].len > 0) { - if (configuration.drums.pitch[d] != 0) { - Drum[slot]->enableInterpolation(true); - Drum[slot]->setPlaybackRate(pow(2, float(configuration.drums.pitch[d]) / 120.0)); - } else { - Drum[slot]->enableInterpolation(false); - Drum[slot]->setPlaybackRate(1.0); - } - Drum[slot]->playRaw((int16_t*)drum_config[d].drum_data, drum_config[d].len, 1); -#ifdef DEBUG - Serial.printf(PSTR("Playing sample [%s][%c%c] on slot [%d] main volume [%d]: drum_data=%p, len=%d\n"), drum_config[d].name, slot, configuration.drums.main_vol, drum_config[d].drum_data, drum_config[d].len); - - Serial.print(F("Drum Slot [")); - Serial.print(slot); - Serial.print(F("]: Velocity=")); - Serial.print(mapfloat(inVelocity, 0, 127, vol_min, vol_max), 2); - Serial.print(F(" Pan=")); - Serial.print(pan, 2); - Serial.print(F(" ReverbSend=")); - Serial.print(reverb_send, 2); - Serial.print(F(" Pitch=")); - Serial.print(configuration.drums.pitch[d] / 10.0f, 1); - Serial.print(F(" Playback speed=")); - Serial.println(pow(2, float(configuration.drums.pitch[d]) / 120.0)); -#endif - break; - } + use_drum = d; + break; } } + + uint8_t slot = drum_get_slot(drum_config[use_drum].drum_class); + float pan = mapfloat(configuration.drums.pan[use_drum], DRUMS_PANORAMA_MIN, DRUMS_PANORAMA_MAX, 0.0, 1.0); + float reverb_send = configuration.drums.reverb_send[use_drum] / 100.0f; + float vol_min = configuration.drums.vol_min[use_drum] / 100.0f; + float vol_max = configuration.drums.vol_max[use_drum] / 100.0f; + + drum_mixer_r.gain(slot, pan * volume_transform(mapfloat(inVelocity, 0, 127, vol_min, vol_max))); + drum_mixer_l.gain(slot, (1.0 - pan) * volume_transform(mapfloat(inVelocity, 0, 127, vol_min, vol_max))); + + drum_reverb_send_mixer_r.gain(slot, pan * volume_transform(reverb_send)); + drum_reverb_send_mixer_l.gain(slot, (1.0 - pan) * volume_transform(reverb_send)); + + if (drum_config[use_drum].drum_data != NULL && drum_config[use_drum].len > 0) { + if (configuration.drums.pitch[use_drum] != 0) { + Drum[slot]->enableInterpolation(true); + Drum[slot]->setPlaybackRate(pow(2, float(configuration.drums.pitch[use_drum]) / 120.0)); + } else { + Drum[slot]->enableInterpolation(false); + Drum[slot]->setPlaybackRate(1.0); + } + Drum[slot]->playRaw((int16_t*)drum_config[use_drum].drum_data, drum_config[use_drum].len, 1); +#ifdef DEBUG + Serial.printf(PSTR("Playing sample [%s][%c%c] on slot [%d] main volume [%d]: drum_data=%p, len=%d\n"), drum_config[use_drum].name, slot, configuration.drums.main_vol, drum_config[use_drum].drum_data, drum_config[use_drum].len); + + Serial.print(F("Drum Slot [")); + Serial.print(slot); + Serial.print(F("]: Velocity=")); + Serial.print(mapfloat(inVelocity, 0, 127, vol_min, vol_max), 2); + Serial.print(F(" Pan=")); + Serial.print(pan, 2); + Serial.print(F(" ReverbSend=")); + Serial.print(reverb_send, 2); + Serial.print(F(" Pitch=")); + Serial.print(configuration.drums.pitch[use_drum] / 10.0f, 1); + Serial.print(F(" Playback speed=")); + Serial.println(pow(2, float(configuration.drums.pitch[use_drum]) / 120.0)); +#endif + } } #endif } diff --git a/UI.hpp b/UI.hpp index e8ffe89..246b802 100644 --- a/UI.hpp +++ b/UI.hpp @@ -4456,8 +4456,10 @@ void UI_func_drum_midi_note(uint8_t param) { if (ask_before_quit == true && ask_before_quit_mode <= 0) { uint8_t num_changes = 0; for (uint8_t i = 0; i < NUM_DRUMSET_CONFIG; i++) { - if (midinote_old[i] != configuration.drums.midinote[i]) + if (midinote_old[i] != configuration.drums.midinote[i]) { num_changes++; + break; + } } if (num_changes > 0) { ask_before_quit_mode = 0; @@ -4557,6 +4559,7 @@ void UI_func_drum_midi_note(uint8_t param) { { encoderDir[ENC_L].reset(); midi_learn_mode = MIDI_LEARN_MODE_OFF; + ask_before_quit = false; } }