ref: 25443ba5a152a721bbd959dfaae6ddf6866c38cd
parent: 4daf31da153118e4a5fb7b7465ece6bf1402a4ed
author: laamaa <jonne.kokkonen@gmail.com>
date: Mon Aug 25 15:54:16 EDT 2025
encode rtmidi messages properly
--- a/src/backends/m8_rtmidi.c
+++ b/src/backends/m8_rtmidi.c
@@ -200,7 +200,6 @@
}
int m8_initialize(const int verbose, const char *preferred_device) {-
int m8_midi_port_number = 0;
SDL_LogDebug(SDL_LOG_CATEGORY_SYSTEM, "Initialize M8 via RTMIDI called");
@@ -257,26 +256,23 @@
}
int m8_send_msg_controller(const unsigned char input) {- SDL_LogError(SDL_LOG_CATEGORY_SYSTEM, "MIDI key inputs not implemented yet");
- return 0;
-#if 0
SDL_LogDebug(SDL_LOG_CATEGORY_SYSTEM, "Sending controller input 0x%02X", input);
- // Encode a 8bit byte to two 7-bit bytes
- //const unsigned char sysex_encoded_input[2] = {input & 0x7F, (input >> 7) & 0x01};- const unsigned char input_sysex[10] = {0xF0, 0x00, 0x02, 0x61, 0x00, 0x00, 'C', sysex_encoded_input[0], sysex_encoded_input[1], 0xF7};- const int result = rtmidi_out_send_message(midi_out, &input_sysex[0], sizeof(input_sysex));
+
+ // Get MSB from input
+ const uint8_t msb = 0 | (input & 0x80 ? 1u << 2 : 0);
+ const unsigned char controller_sysex[10] = {+ 0xF0, 0x00, 0x02, 0x61, 0x00, msb, 0x00, (uint8_t)('C' & 0x7F), (uint8_t)(input & 0x7F),+ 0xF7};
+
+ const int result = rtmidi_out_send_message(midi_out, controller_sysex, sizeof(controller_sysex));
if (result != 0) {SDL_LogError(SDL_LOG_CATEGORY_SYSTEM, "Failed to send key input message");
return 0;
}
return 1;
-#endif
}
int m8_send_msg_keyjazz(const unsigned char note, unsigned char velocity) {- SDL_LogError(SDL_LOG_CATEGORY_SYSTEM, "MIDI keyjazz not implemented yet");
- return 0;
-#if 0
if (velocity > 0x7F) {velocity = 0x7F;
}
@@ -283,9 +279,15 @@
// Special case for note off
if (note == 0xFF && velocity == 0x00) {- const unsigned char all_notes_off_sysex[9] = {0xF0, 0x00, 0x02, 0x61, 0x00, 0x00, 'K', 0xFF, 0xF7};- const int result =
- rtmidi_out_send_message(midi_out, &all_notes_off_sysex[0], sizeof(all_notes_off_sysex));
+
+ const uint8_t msb = 0 | 1u << 2;
+ const unsigned char keyjazz_sysex[10] = {+ 0xF0, 0x00, 0x02, 0x61, 0x00,
+ msb, 0x00, (uint8_t)('K' & 0x7F), (uint8_t)(0xFF & 0x7F),+ 0xF7
+ };
+
+ const int result = rtmidi_out_send_message(midi_out, &keyjazz_sysex[0], sizeof(keyjazz_sysex));
if (result != 0) {SDL_LogError(SDL_LOG_CATEGORY_SYSTEM, "Failed to send all notes off");
return 0;
@@ -293,8 +295,14 @@
return 1;
}
- const unsigned char keyjazz_sysex[10] = {0xF0, 0x00, 0x02, 0x61, 0x00,- 0x00, 'K', note, velocity, 0xF7};
+ // Get MSB from input
+ const uint8_t msb = 0 | (note & 0x80 ? 1u << 2 : 0) | (velocity & 0x80 ? 1u << 3 : 0);
+ const unsigned char keyjazz_sysex[11] = {+ 0xF0, 0x00, 0x02, 0x61, 0x00,
+ msb, 0x00, (uint8_t)('K' & 0x7F), (uint8_t)(note & 0x7F), (uint8_t)(velocity & 0x7F),+ 0xF7
+ };
+
const int result = rtmidi_out_send_message(midi_out, &keyjazz_sysex[0], sizeof(keyjazz_sysex));
if (result != 0) {SDL_LogError(SDL_LOG_CATEGORY_SYSTEM, "Failed to send keyjazz input message");
@@ -301,11 +309,9 @@
return 0;
}
return 1;
-#endif
}
int m8_process_data(const config_params_s *conf) {-
static unsigned int empty_cycles = 0;
if (queue_size(&queue) > 0) {--- a/src/config.c
+++ b/src/config.c
@@ -90,78 +90,78 @@
SDL_Log("Writing config file to %s", config_path);- const unsigned int INI_LINE_COUNT = 50;
- const unsigned int LINELEN = 50;
+ #define INI_LINE_COUNT 50
+ #define INI_LINE_LENGTH 50
// Entries for the config file
- char ini_values[INI_LINE_COUNT][LINELEN];
+ char ini_values[INI_LINE_COUNT][INI_LINE_LENGTH];
int initPointer = 0;
- snprintf(ini_values[initPointer++], LINELEN, "[graphics]\n");
- snprintf(ini_values[initPointer++], LINELEN, "fullscreen=%s\n",
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "[graphics]\n");
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "fullscreen=%s\n",
conf->init_fullscreen ? "true" : "false");
- snprintf(ini_values[initPointer++], LINELEN, "idle_ms=%d\n", conf->idle_ms);
- snprintf(ini_values[initPointer++], LINELEN, "wait_for_device=%s\n",
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "idle_ms=%d\n", conf->idle_ms);
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "wait_for_device=%s\n",
conf->wait_for_device ? "true" : "false");
- snprintf(ini_values[initPointer++], LINELEN, "wait_packets=%d\n", conf->wait_packets);
- snprintf(ini_values[initPointer++], LINELEN, "integer_scaling=%s\n",
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "wait_packets=%d\n", conf->wait_packets);
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "integer_scaling=%s\n",
conf->integer_scaling ? "true" : "false");
- snprintf(ini_values[initPointer++], LINELEN, "[audio]\n");
- snprintf(ini_values[initPointer++], LINELEN, "audio_enabled=%s\n",
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "[audio]\n");
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "audio_enabled=%s\n",
conf->audio_enabled ? "true" : "false");
- snprintf(ini_values[initPointer++], LINELEN, "audio_buffer_size=%d\n", conf->audio_buffer_size);
- snprintf(ini_values[initPointer++], LINELEN, "audio_device_name=%s\n",
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "audio_buffer_size=%d\n", conf->audio_buffer_size);
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "audio_device_name=%s\n",
conf->audio_device_name ? conf->audio_device_name : "Default");
- snprintf(ini_values[initPointer++], LINELEN, "[keyboard]\n");
- snprintf(ini_values[initPointer++], LINELEN, ";Ref: https://wiki.libsdl.org/SDL2/SDL_Scancode\n");
- snprintf(ini_values[initPointer++], LINELEN, "key_up=%d\n", conf->key_up);
- snprintf(ini_values[initPointer++], LINELEN, "key_left=%d\n", conf->key_left);
- snprintf(ini_values[initPointer++], LINELEN, "key_down=%d\n", conf->key_down);
- snprintf(ini_values[initPointer++], LINELEN, "key_right=%d\n", conf->key_right);
- snprintf(ini_values[initPointer++], LINELEN, "key_select=%d\n", conf->key_select);
- snprintf(ini_values[initPointer++], LINELEN, "key_select_alt=%d\n", conf->key_select_alt);
- snprintf(ini_values[initPointer++], LINELEN, "key_start=%d\n", conf->key_start);
- snprintf(ini_values[initPointer++], LINELEN, "key_start_alt=%d\n", conf->key_start_alt);
- snprintf(ini_values[initPointer++], LINELEN, "key_opt=%d\n", conf->key_opt);
- snprintf(ini_values[initPointer++], LINELEN, "key_opt_alt=%d\n", conf->key_opt_alt);
- snprintf(ini_values[initPointer++], LINELEN, "key_edit=%d\n", conf->key_edit);
- snprintf(ini_values[initPointer++], LINELEN, "key_edit_alt=%d\n", conf->key_edit_alt);
- snprintf(ini_values[initPointer++], LINELEN, "key_delete=%d\n", conf->key_delete);
- snprintf(ini_values[initPointer++], LINELEN, "key_reset=%d\n", conf->key_reset);
- snprintf(ini_values[initPointer++], LINELEN, "key_jazz_inc_octave=%d\n",
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "[keyboard]\n");
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, ";Ref: https://wiki.libsdl.org/SDL2/SDL_Scancode\n");
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "key_up=%d\n", conf->key_up);
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "key_left=%d\n", conf->key_left);
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "key_down=%d\n", conf->key_down);
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "key_right=%d\n", conf->key_right);
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "key_select=%d\n", conf->key_select);
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "key_select_alt=%d\n", conf->key_select_alt);
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "key_start=%d\n", conf->key_start);
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "key_start_alt=%d\n", conf->key_start_alt);
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "key_opt=%d\n", conf->key_opt);
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "key_opt_alt=%d\n", conf->key_opt_alt);
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "key_edit=%d\n", conf->key_edit);
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "key_edit_alt=%d\n", conf->key_edit_alt);
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "key_delete=%d\n", conf->key_delete);
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "key_reset=%d\n", conf->key_reset);
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "key_jazz_inc_octave=%d\n",
conf->key_jazz_inc_octave);
- snprintf(ini_values[initPointer++], LINELEN, "key_jazz_dec_octave=%d\n",
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "key_jazz_dec_octave=%d\n",
conf->key_jazz_dec_octave);
- snprintf(ini_values[initPointer++], LINELEN, "key_jazz_inc_velocity=%d\n",
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "key_jazz_inc_velocity=%d\n",
conf->key_jazz_inc_velocity);
- snprintf(ini_values[initPointer++], LINELEN, "key_jazz_dec_velocity=%d\n",
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "key_jazz_dec_velocity=%d\n",
conf->key_jazz_dec_velocity);
- snprintf(ini_values[initPointer++], LINELEN, "key_toggle_audio=%d\n", conf->key_toggle_audio);
- snprintf(ini_values[initPointer++], LINELEN, "[gamepad]\n");
- snprintf(ini_values[initPointer++], LINELEN, "gamepad_up=%d\n", conf->gamepad_up);
- snprintf(ini_values[initPointer++], LINELEN, "gamepad_left=%d\n", conf->gamepad_left);
- snprintf(ini_values[initPointer++], LINELEN, "gamepad_down=%d\n", conf->gamepad_down);
- snprintf(ini_values[initPointer++], LINELEN, "gamepad_right=%d\n", conf->gamepad_right);
- snprintf(ini_values[initPointer++], LINELEN, "gamepad_select=%d\n", conf->gamepad_select);
- snprintf(ini_values[initPointer++], LINELEN, "gamepad_start=%d\n", conf->gamepad_start);
- snprintf(ini_values[initPointer++], LINELEN, "gamepad_opt=%d\n", conf->gamepad_opt);
- snprintf(ini_values[initPointer++], LINELEN, "gamepad_edit=%d\n", conf->gamepad_edit);
- snprintf(ini_values[initPointer++], LINELEN, "gamepad_quit=%d\n", conf->gamepad_quit);
- snprintf(ini_values[initPointer++], LINELEN, "gamepad_reset=%d\n", conf->gamepad_reset);
- snprintf(ini_values[initPointer++], LINELEN, "gamepad_analog_threshold=%d\n",
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "key_toggle_audio=%d\n", conf->key_toggle_audio);
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "[gamepad]\n");
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "gamepad_up=%d\n", conf->gamepad_up);
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "gamepad_left=%d\n", conf->gamepad_left);
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "gamepad_down=%d\n", conf->gamepad_down);
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "gamepad_right=%d\n", conf->gamepad_right);
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "gamepad_select=%d\n", conf->gamepad_select);
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "gamepad_start=%d\n", conf->gamepad_start);
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "gamepad_opt=%d\n", conf->gamepad_opt);
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "gamepad_edit=%d\n", conf->gamepad_edit);
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "gamepad_quit=%d\n", conf->gamepad_quit);
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "gamepad_reset=%d\n", conf->gamepad_reset);
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "gamepad_analog_threshold=%d\n",
conf->gamepad_analog_threshold);
- snprintf(ini_values[initPointer++], LINELEN, "gamepad_analog_invert=%s\n",
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "gamepad_analog_invert=%s\n",
conf->gamepad_analog_invert ? "true" : "false");
- snprintf(ini_values[initPointer++], LINELEN, "gamepad_analog_axis_updown=%d\n",
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "gamepad_analog_axis_updown=%d\n",
conf->gamepad_analog_axis_updown);
- snprintf(ini_values[initPointer++], LINELEN, "gamepad_analog_axis_leftright=%d\n",
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "gamepad_analog_axis_leftright=%d\n",
conf->gamepad_analog_axis_leftright);
- snprintf(ini_values[initPointer++], LINELEN, "gamepad_analog_axis_select=%d\n",
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "gamepad_analog_axis_select=%d\n",
conf->gamepad_analog_axis_select);
- snprintf(ini_values[initPointer++], LINELEN, "gamepad_analog_axis_start=%d\n",
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "gamepad_analog_axis_start=%d\n",
conf->gamepad_analog_axis_start);
- snprintf(ini_values[initPointer++], LINELEN, "gamepad_analog_axis_opt=%d\n",
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "gamepad_analog_axis_opt=%d\n",
conf->gamepad_analog_axis_opt);
- snprintf(ini_values[initPointer++], LINELEN, "gamepad_analog_axis_edit=%d\n",
+ snprintf(ini_values[initPointer++], INI_LINE_LENGTH, "gamepad_analog_axis_edit=%d\n",
conf->gamepad_analog_axis_edit);
// Ensure we aren't writing off the end of the array
--
⑨