From 05f3c922d703666e0539f27f6cebfbf67d8cea53 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Wed, 28 Jun 2023 13:51:53 +0200 Subject: Fix bug with channel selection and add poly to kbd --- src/app.c | 56 +++++++++++++++++++++++++++----------------------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/src/app.c b/src/app.c index b1009da..06f43a9 100644 --- a/src/app.c +++ b/src/app.c @@ -507,13 +507,9 @@ app_surface_event(u8 type, u8 index, u8 value) { } if (value) { - hal_send_midi(USBSTANDALONE, NOTEON | channel, note, value); - hal_send_midi(USBMIDI, NOTEON | channel, note, value); - hal_send_midi(DINMIDI, NOTEON | channel, note, value); + app_midi_event(USBSTANDALONE, NOTEON | channel, note, value); } else { - hal_send_midi(USBSTANDALONE, NOTEOFF | channel, note, value); - hal_send_midi(USBMIDI, NOTEOFF | channel, note, value); - hal_send_midi(DINMIDI, NOTEOFF | channel, note, value); + app_midi_event(USBSTANDALONE, NOTEOFF | channel, note, value); } } break; } @@ -539,16 +535,21 @@ app_surface_event(u8 type, u8 index, u8 value) { void app_midi_event(u8 port, u8 status, u8 d1, u8 d2) { if (!state.active) { - hal_send_midi(port, status, d1, d2); + hal_send_midi(USBSTANDALONE, status, d1, d2); + hal_send_midi(USBMIDI, status, d1, d2); + hal_send_midi(DINMIDI, status, d1, d2); return; } u8 channel = status & 0x0F; - u8 max_voices = (state.ch_max - state.ch_min + 1); // If the channel isn't set to listen, just passthrough the message. if (!state.ch_listen[channel]) { - hal_send_midi(port, status, d1, d2); + hal_send_midi(USBSTANDALONE, status, d1, d2); + hal_send_midi(USBMIDI, status, d1, d2); + hal_send_midi(DINMIDI, status, d1, d2); return; } + + u8 max_voices = (state.ch_max - state.ch_min + 1); if ((status & 0xF0) == NOTEON) { if (n_voices == max_voices) { u8 selected = 0; @@ -590,10 +591,9 @@ app_midi_event(u8 port, u8 status, u8 d1, u8 d2) { Voice *voice = &voices[selected]; voice->active = 0; - hal_send_midi(voice->port, - NOTEOFF | voice->channel, - voice->d1, - voice->d2); + hal_send_midi(USBSTANDALONE, NOTEOFF | voice->channel, voice->d1, voice->d2); + hal_send_midi(USBMIDI, NOTEOFF | voice->channel, voice->d1, voice->d2); + hal_send_midi(DINMIDI, NOTEOFF | voice->channel, voice->d1, voice->d2); n_voices--; } @@ -603,28 +603,26 @@ app_midi_event(u8 port, u8 status, u8 d1, u8 d2) { // Stop voice if needed. if (voice->active && voice->d1 == d1) { voice->active = 0; - hal_send_midi(voice->port, - NOTEOFF | voice->channel, - voice->d1, - voice->d2); + hal_send_midi(USBSTANDALONE, NOTEOFF | voice->channel, voice->d1, voice->d2); + hal_send_midi(USBMIDI, NOTEOFF | voice->channel, voice->d1, voice->d2); + hal_send_midi(DINMIDI, NOTEOFF | voice->channel, voice->d1, voice->d2); break; } } // Find next free voice slot. for (u8 i = state.ch_min; i <= state.ch_max; i++, next_voice++) { - Voice *voice = &voices[(next_voice % max_voices)]; + Voice *voice = &voices[state.ch_min + (next_voice % max_voices)]; // Register voice. if (!voice->active) { voice->active = 1; voice->port = port; - voice->channel = (next_voice % max_voices); + voice->channel = state.ch_min + (next_voice % max_voices); voice->d1 = d1; voice->d2 = d2; - hal_send_midi(voice->port, - NOTEON | voice->channel, - voice->d1, - voice->d2); + hal_send_midi(USBSTANDALONE, NOTEON | voice->channel, voice->d1, voice->d2); + hal_send_midi(USBMIDI, NOTEON | voice->channel, voice->d1, voice->d2); + hal_send_midi(DINMIDI, NOTEON | voice->channel, voice->d1, voice->d2); voice->age = note_counter++; next_voice++; break; @@ -636,16 +634,17 @@ app_midi_event(u8 port, u8 status, u8 d1, u8 d2) { Voice *voice = &voices[i]; if (voice->active && voice->d1 == d1) { voice->active = 0; - hal_send_midi(voice->port, - NOTEOFF | voice->channel, - voice->d1, - voice->d2); + hal_send_midi(USBSTANDALONE, NOTEOFF | voice->channel, voice->d1, voice->d2); + hal_send_midi(USBMIDI, NOTEOFF | voice->channel, voice->d1, voice->d2); + hal_send_midi(DINMIDI, NOTEOFF | voice->channel, voice->d1, voice->d2); n_voices--; break; } } } else { - hal_send_midi(port, status, d1, d2); + hal_send_midi(USBSTANDALONE, status, d1, d2); + hal_send_midi(USBMIDI, status, d1, d2); + hal_send_midi(DINMIDI, status, d1, d2); } } @@ -898,7 +897,6 @@ app_timer_event() { void app_init(const u16 *adc_raw) { - // example - load button states from flash hal_read_flash(0, (u8*)&state, sizeof(State)); if (state.magic != 0xbadd10de) { state = (State){ -- cgit v1.2.1