From 8e820cde131c72d7966fb5dd528ba0ed2c1cd577 Mon Sep 17 00:00:00 2001 From: jakobkg Date: Thu, 25 Mar 2021 12:51:57 +0100 Subject: [PATCH] Fix handling multiples of the same MIDI note (fixes bug brought up in issue #10199) (#11639) * Fix handling multiples of the same MIDI note * Extend MIDI note status to fix note releases --- quantum/process_keycode/process_midi.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c index 8e2fb955e7..9632d2b757 100644 --- a/quantum/process_keycode/process_midi.c +++ b/quantum/process_keycode/process_midi.c @@ -34,7 +34,7 @@ void process_midi_all_notes_off(void) { midi_send_cc(&midi_device, 0, 0x7B, 0); # include "timer.h" -static uint8_t tone_status[MIDI_TONE_COUNT]; +static uint8_t tone_status[2][MIDI_TONE_COUNT]; static uint8_t midi_modulation; static int8_t midi_modulation_step; @@ -51,7 +51,8 @@ void midi_init(void) { midi_config.modulation_interval = 8; for (uint8_t i = 0; i < MIDI_TONE_COUNT; i++) { - tone_status[i] = MIDI_INVALID_NOTE; + tone_status[0][i] = MIDI_INVALID_NOTE; + tone_status[1][i] = 0; } midi_modulation = 0; @@ -68,19 +69,21 @@ bool process_midi(uint16_t keycode, keyrecord_t *record) { uint8_t tone = keycode - MIDI_TONE_MIN; uint8_t velocity = midi_config.velocity; if (record->event.pressed) { - if (tone_status[tone] == MIDI_INVALID_NOTE) { - uint8_t note = midi_compute_note(keycode); - midi_send_noteon(&midi_device, channel, note, velocity); - dprintf("midi noteon channel:%d note:%d velocity:%d\n", channel, note, velocity); - tone_status[tone] = note; + uint8_t note = midi_compute_note(keycode); + midi_send_noteon(&midi_device, channel, note, velocity); + dprintf("midi noteon channel:%d note:%d velocity:%d\n", channel, note, velocity); + tone_status[1][tone] += 1; + if (tone_status[0][tone] == MIDI_INVALID_NOTE) { + tone_status[0][tone] = note; } } else { - uint8_t note = tone_status[tone]; - if (note != MIDI_INVALID_NOTE) { + uint8_t note = tone_status[0][tone]; + tone_status[1][tone] -= 1; + if (tone_status[1][tone] == 0) { midi_send_noteoff(&midi_device, channel, note, velocity); dprintf("midi noteoff channel:%d note:%d velocity:%d\n", channel, note, velocity); + tone_status[0][tone] = MIDI_INVALID_NOTE; } - tone_status[tone] = MIDI_INVALID_NOTE; } return false; }