diff --git a/extern/ESFMu/esfm.c b/extern/ESFMu/esfm.c index f1979f8e6..f0043fba6 100644 --- a/extern/ESFMu/esfm.c +++ b/extern/ESFMu/esfm.c @@ -373,6 +373,8 @@ ESFM_envelope_calc(esfm_slot *slot) int16 eg_inc; bool reset = 0; bool key_on; + bool key_on_signal; + uint16 delay_counter_compare; key_on = *slot->in.key_on; if (!slot->chip->native_mode) @@ -408,26 +410,46 @@ ESFM_envelope_calc(esfm_slot *slot) } slot->in.eg_output += tremolo; } + + if (slot->in.eg_delay_run && slot->in.eg_delay_counter < 32768) + { + slot->in.eg_delay_counter++; + } + + // triggers on key-on edge + if (key_on && !slot->in.key_on_gate) + { + slot->in.eg_delay_run = 1; + slot->in.eg_delay_counter = 0; + } + else if (!key_on) + { + slot->in.eg_delay_run = 0; + } + + delay_counter_compare = 0; + if (slot->env_delay > 0) + { + delay_counter_compare = 256 << slot->env_delay; + } + + if (key_on && ((slot->in.eg_delay_counter >= delay_counter_compare) || !slot->chip->native_mode)) + { + key_on_signal = 1; + } else { + key_on_signal = 0; + } + if (key_on && slot->in.eg_state == EG_RELEASE) { - if (!slot->in.eg_delay_run && slot->chip->native_mode) - { - slot->in.eg_delay_run = 1; - slot->in.eg_delay_counter = slot->env_delay ? 0x100 : 0; - } - if (slot->in.eg_delay_counter == 0 || !slot->chip->native_mode) + if ((slot->in.eg_delay_counter >= delay_counter_compare) || !slot->chip->native_mode) { - slot->in.eg_delay_run = 0; reset = 1; reg_rate = slot->attack_rate; } else { - if ((slot->chip->global_timer & ((1 << slot->env_delay) - 1)) == 0) - { - slot->in.eg_delay_counter--; - } reg_rate = slot->release_rate; } } @@ -452,6 +474,7 @@ ESFM_envelope_calc(esfm_slot *slot) break; } } + slot->in.key_on_gate = key_on; slot->in.phase_reset = reset; ks = slot->in.keyscale >> ((!slot->ksr) << 1); nonzero = (reg_rate != 0); @@ -524,7 +547,7 @@ ESFM_envelope_calc(esfm_slot *slot) { slot->in.eg_state = EG_DECAY; } - else if (key_on && shift > 0 && rate_hi != 0x0f) + else if (key_on_signal && shift > 0 && rate_hi != 0x0f) { eg_inc = ~slot->in.eg_position >> (4 - shift); } @@ -553,10 +576,9 @@ ESFM_envelope_calc(esfm_slot *slot) { slot->in.eg_state = EG_ATTACK; } - if (!key_on) + if (!key_on_signal) { slot->in.eg_state = EG_RELEASE; - slot->in.eg_delay_run = 0; } } diff --git a/extern/ESFMu/esfm.h b/extern/ESFMu/esfm.h index a37300ca0..d5c734b49 100644 --- a/extern/ESFMu/esfm.h +++ b/extern/ESFMu/esfm.h @@ -67,7 +67,6 @@ uint8_t ESFM_readback_reg (esfm_chip *chip, uint16_t address); uint8_t ESFM_read_port (esfm_chip *chip, uint8_t offset); void ESFM_generate(esfm_chip *chip, int16_t *buf); void ESFM_generate_stream(esfm_chip *chip, int16_t *sndptr, uint32_t num_samples); -// Modification by Kagamiin~: int16_t ESFM_get_channel_output_native(esfm_chip *chip, int channel_idx); @@ -171,10 +170,11 @@ typedef struct _esfm_slot_internal uint10 phase_out; flag phase_reset; flag *key_on; + flag key_on_gate; uint2 eg_state; flag eg_delay_run; - uint9 eg_delay_counter; + uint16 eg_delay_counter; } esfm_slot_internal; diff --git a/src/gui/insEdit.cpp b/src/gui/insEdit.cpp index 14648e33c..874d3e4f4 100644 --- a/src/gui/insEdit.cpp +++ b/src/gui/insEdit.cpp @@ -5268,7 +5268,7 @@ void FurnaceGUI::drawInsEdit() { } if (ImGui::BeginTabItem(label)) { ImGui::PushID(i); - int ordi=(opCount==4)?orderedOps[i]:i; + int ordi=(opCount==4 && ins->type!=DIV_INS_ESFM)?orderedOps[i]:i; int maxTl=127; if (ins->type==DIV_INS_OPLL) { if (i==1) {