shithub: m8c

Download patch

ref: 78bcd02e1c155026c74ab4dce7b0f1ed3a54dba6
parent: 62586fcbd20e37d362b620e40de29363af5166ad
author: Jonne Kokkonen <jonne.kokkonen@gmail.com>
date: Fri Mar 28 03:14:58 EDT 2025

Refactor keyjazz handling for clarity and efficiency

Streamlined keyjazz logic by introducing note mapping and modularized functions for better readability and maintainability. Replaced hardcoded scancode cases with a mapping-based approach and split setting adjustments into a dedicated function.

--- a/README.md
+++ b/README.md
@@ -21,11 +21,12 @@
 
 Many thanks to:
 
-* Trash80 for the great M8 hardware and the original font (stealth57.ttf) that was converted to a bitmap for use in the
+* Trash80: For the great M8 hardware and the original fonts that were converted to a bitmap for use in the
   progam.
-* driedfruit for a wonderful little routine to blit inline bitmap fonts, https://github.com/driedfruit/SDL_inprint/
-* marcinbor85 for the slip handling routine, https://github.com/marcinbor85/slip
-* turbolent for the great Golang-based g0m8 application, which I used as reference on how the M8 serial protocol works.
+* driedfruit: For a wonderful little routine to blit inline bitmap
+  fonts, [SDL_inprint](https://github.com/driedfruit/SDL_inprint/)
+* marcinbor85: For the slip handling routine, https://github.com/marcinbor85/slip
+* turbolent: For the great Golang-based g0m8 application, which I used as reference on how the M8 serial protocol works.
 * *Everyone who's contributed to m8c!*
 
 Disclaimer: I'm not a coder and hardly understand C, use at your own risk :)
--- a/src/input.c
+++ b/src/input.c
@@ -69,133 +69,88 @@
   return keyjazz_enabled;
 }
 
-static input_msg_s handle_keyjazz(SDL_Event *event, uint8_t keyvalue, config_params_s *conf) {
-  input_msg_s key = {keyjazz, keyvalue, keyjazz_velocity, event->type};
-  switch (event->key.scancode) {
-  case SDL_SCANCODE_Z:
-    key.value = keyjazz_base_octave * 12;
-    break;
-  case SDL_SCANCODE_S:
-    key.value = 1 + keyjazz_base_octave * 12;
-    break;
-  case SDL_SCANCODE_X:
-    key.value = 2 + keyjazz_base_octave * 12;
-    break;
-  case SDL_SCANCODE_D:
-    key.value = 3 + keyjazz_base_octave * 12;
-    break;
-  case SDL_SCANCODE_C:
-    key.value = 4 + keyjazz_base_octave * 12;
-    break;
-  case SDL_SCANCODE_V:
-    key.value = 5 + keyjazz_base_octave * 12;
-    break;
-  case SDL_SCANCODE_G:
-    key.value = 6 + keyjazz_base_octave * 12;
-    break;
-  case SDL_SCANCODE_B:
-    key.value = 7 + keyjazz_base_octave * 12;
-    break;
-  case SDL_SCANCODE_H:
-    key.value = 8 + keyjazz_base_octave * 12;
-    break;
-  case SDL_SCANCODE_N:
-    key.value = 9 + keyjazz_base_octave * 12;
-    break;
-  case SDL_SCANCODE_J:
-    key.value = 10 + keyjazz_base_octave * 12;
-    break;
-  case SDL_SCANCODE_M:
-    key.value = 11 + keyjazz_base_octave * 12;
-    break;
-  case SDL_SCANCODE_Q:
-    key.value = 12 + keyjazz_base_octave * 12;
-    break;
-  case SDL_SCANCODE_2:
-    key.value = 13 + keyjazz_base_octave * 12;
-    break;
-  case SDL_SCANCODE_W:
-    key.value = 14 + keyjazz_base_octave * 12;
-    break;
-  case SDL_SCANCODE_3:
-    key.value = 15 + keyjazz_base_octave * 12;
-    break;
-  case SDL_SCANCODE_E:
-    key.value = 16 + keyjazz_base_octave * 12;
-    break;
-  case SDL_SCANCODE_R:
-    key.value = 17 + keyjazz_base_octave * 12;
-    break;
-  case SDL_SCANCODE_5:
-    key.value = 18 + keyjazz_base_octave * 12;
-    break;
-  case SDL_SCANCODE_T:
-    key.value = 19 + keyjazz_base_octave * 12;
-    break;
-  case SDL_SCANCODE_6:
-    key.value = 20 + keyjazz_base_octave * 12;
-    break;
-  case SDL_SCANCODE_Y:
-    key.value = 21 + keyjazz_base_octave * 12;
-    break;
-  case SDL_SCANCODE_7:
-    key.value = 22 + keyjazz_base_octave * 12;
-    break;
-  case SDL_SCANCODE_U:
-    key.value = 23 + keyjazz_base_octave * 12;
-    break;
-  case SDL_SCANCODE_I:
-    key.value = 24 + keyjazz_base_octave * 12;
-    break;
-  case SDL_SCANCODE_9:
-    key.value = 25 + keyjazz_base_octave * 12;
-    break;
-  case SDL_SCANCODE_O:
-    key.value = 26 + keyjazz_base_octave * 12;
-    break;
-  case SDL_SCANCODE_0:
-    key.value = 27 + keyjazz_base_octave * 12;
-    break;
-  case SDL_SCANCODE_P:
-    key.value = 28 + keyjazz_base_octave * 12;
-    break;
-  default:
-    key.type = normal;
-    if (event->key.repeat > 0 || event->key.type == SDL_EVENT_KEY_UP) {
-      break;
+// Get note value for a scancode, or -1 if not found
+static int get_note_for_scancode(SDL_Scancode scancode) {
+
+  // Map from SDL scancodes to note offsets
+  const struct keyjazz_scancodes_t {
+    SDL_Scancode scancode;
+    uint8_t note_offset;
+  } NOTE_MAP[] = {
+      {SDL_SCANCODE_Z, 0},  {SDL_SCANCODE_S, 1},  {SDL_SCANCODE_X, 2},  {SDL_SCANCODE_D, 3},
+      {SDL_SCANCODE_C, 4},  {SDL_SCANCODE_V, 5},  {SDL_SCANCODE_G, 6},  {SDL_SCANCODE_B, 7},
+      {SDL_SCANCODE_H, 8},  {SDL_SCANCODE_N, 9},  {SDL_SCANCODE_J, 10}, {SDL_SCANCODE_M, 11},
+      {SDL_SCANCODE_Q, 12}, {SDL_SCANCODE_2, 13}, {SDL_SCANCODE_W, 14}, {SDL_SCANCODE_3, 15},
+      {SDL_SCANCODE_E, 16}, {SDL_SCANCODE_R, 17}, {SDL_SCANCODE_5, 18}, {SDL_SCANCODE_T, 19},
+      {SDL_SCANCODE_6, 20}, {SDL_SCANCODE_Y, 21}, {SDL_SCANCODE_7, 22}, {SDL_SCANCODE_U, 23},
+      {SDL_SCANCODE_I, 24}, {SDL_SCANCODE_9, 25}, {SDL_SCANCODE_O, 26}, {SDL_SCANCODE_0, 27},
+      {SDL_SCANCODE_P, 28},
+  };
+
+  const size_t NOTE_MAP_SIZE = (sizeof(NOTE_MAP) / sizeof(NOTE_MAP[0]));
+
+  for (size_t i = 0; i < NOTE_MAP_SIZE; i++) {
+    if (NOTE_MAP[i].scancode == scancode) {
+      return NOTE_MAP[i].note_offset + keyjazz_base_octave * 12;
     }
-    if (event->key.scancode == conf->key_jazz_dec_octave) {
-      if (keyjazz_base_octave > 0) {
-        keyjazz_base_octave--;
-        display_keyjazz_overlay(1, keyjazz_base_octave, keyjazz_velocity);
-      }
-    } else if (event->key.scancode == conf->key_jazz_inc_octave) {
-      if (keyjazz_base_octave < 8) {
-        keyjazz_base_octave++;
-        display_keyjazz_overlay(1, keyjazz_base_octave, keyjazz_velocity);
-      }
-    } else if (event->key.scancode == conf->key_jazz_dec_velocity) {
-      if ((event->key.mod & SDL_KMOD_ALT) > 0) {
-        if (keyjazz_velocity > 1)
-          keyjazz_velocity -= 1;
-      } else {
-        if (keyjazz_velocity > 0x10)
-          keyjazz_velocity -= 0x10;
-      }
+  }
+  return -1; // Not a note key
+}
+
+// Handle octave and velocity changes
+static void handle_keyjazz_settings(const SDL_Event *event, const config_params_s *conf) {
+
+  // Constants for keyjazz limits and adjustments
+  const unsigned char KEYJAZZ_MIN_OCTAVE = 0;
+  const unsigned char KEYJAZZ_MAX_OCTAVE = 8;
+  const unsigned char KEYJAZZ_MIN_VELOCITY = 0;
+  const unsigned char KEYJAZZ_MAX_VELOCITY = 0x7F;
+  const unsigned char KEYJAZZ_FINE_VELOCITY_STEP = 1;
+  const unsigned char KEYJAZZ_COARSE_VELOCITY_STEP = 0x10;
+
+  if (event->key.repeat > 0 || event->key.type == SDL_EVENT_KEY_UP) {
+    return;
+  }
+
+  const SDL_Scancode scancode = event->key.scancode;
+  const bool is_fine_adjustment = (event->key.mod & SDL_KMOD_ALT) > 0;
+
+  if (scancode == conf->key_jazz_dec_octave && keyjazz_base_octave > KEYJAZZ_MIN_OCTAVE) {
+    keyjazz_base_octave--;
+    display_keyjazz_overlay(1, keyjazz_base_octave, keyjazz_velocity);
+  } else if (scancode == conf->key_jazz_inc_octave && keyjazz_base_octave < KEYJAZZ_MAX_OCTAVE) {
+    keyjazz_base_octave++;
+    display_keyjazz_overlay(1, keyjazz_base_octave, keyjazz_velocity);
+  } else if (scancode == conf->key_jazz_dec_velocity) {
+    const int step = is_fine_adjustment ? KEYJAZZ_FINE_VELOCITY_STEP : KEYJAZZ_COARSE_VELOCITY_STEP;
+    if (keyjazz_velocity > (is_fine_adjustment ? KEYJAZZ_MIN_VELOCITY + step : step)) {
+      keyjazz_velocity -= step;
       display_keyjazz_overlay(1, keyjazz_base_octave, keyjazz_velocity);
-    } else if (event->key.scancode == conf->key_jazz_inc_velocity) {
-      if ((event->key.mod & SDL_KMOD_ALT) > 0) {
-        if (keyjazz_velocity < 0x7F)
-          keyjazz_velocity += 1;
-      } else {
-        if (keyjazz_velocity < 0x6F)
-          keyjazz_velocity += 0x10;
-      }
+    }
+  } else if (scancode == conf->key_jazz_inc_velocity) {
+    const int step = is_fine_adjustment ? KEYJAZZ_FINE_VELOCITY_STEP : KEYJAZZ_COARSE_VELOCITY_STEP;
+    const int max = is_fine_adjustment ? KEYJAZZ_MAX_VELOCITY : (KEYJAZZ_MAX_VELOCITY - step);
+    if (keyjazz_velocity < max) {
+      keyjazz_velocity += step;
       display_keyjazz_overlay(1, keyjazz_base_octave, keyjazz_velocity);
     }
-    break;
   }
+}
 
+static input_msg_s handle_keyjazz(SDL_Event *event, uint8_t keyvalue, config_params_s *conf) {
+  input_msg_s key = {keyjazz, keyvalue, keyjazz_velocity, event->type};
+
+  // Check if this is a note key
+  const int note_value = get_note_for_scancode(event->key.scancode);
+  if (note_value >= 0) {
+    key.value = note_value;
+    return key;
+  }
+
+  // Not a note key, handle other settings
+  key.type = normal;
+  handle_keyjazz_settings(event, conf);
+
   return key;
 }
 
@@ -213,14 +168,11 @@
   } else if (event->key.scancode == conf->key_select ||
              event->key.scancode == conf->key_select_alt) {
     key.value = key_select;
-  } else if (event->key.scancode == conf->key_start ||
-             event->key.scancode == conf->key_start_alt) {
+  } else if (event->key.scancode == conf->key_start || event->key.scancode == conf->key_start_alt) {
     key.value = key_start;
-  } else if (event->key.scancode == conf->key_opt ||
-             event->key.scancode == conf->key_opt_alt) {
+  } else if (event->key.scancode == conf->key_opt || event->key.scancode == conf->key_opt_alt) {
     key.value = key_opt;
-  } else if (event->key.scancode == conf->key_edit ||
-             event->key.scancode == conf->key_edit_alt) {
+  } else if (event->key.scancode == conf->key_edit || event->key.scancode == conf->key_edit_alt) {
     key.value = key_edit;
   } else if (event->key.scancode == conf->key_delete) {
     key.value = key_opt | key_edit;
@@ -235,7 +187,7 @@
 }
 
 // Handles SDL input events
-void handle_sdl_events(config_params_s *conf) {
+static void handle_sdl_events(config_params_s *conf) {
 
   static int prev_key_analog = 0;
   static unsigned int ticks_window_resized = 0;
@@ -270,11 +222,11 @@
       break;
 
     case SDL_EVENT_WINDOW_RESIZED:
-        if (SDL_GetTicks() - ticks_window_resized > 500) {
-          SDL_Log("Resizing window...");
-          key = (input_msg_s){special, msg_reset_display, 0, 0};
-          ticks_window_resized = SDL_GetTicks();
-        }
+      if (SDL_GetTicks() - ticks_window_resized > 500) {
+        SDL_Log("Resizing window...");
+        key = (input_msg_s){special, msg_reset_display, 0, 0};
+        ticks_window_resized = SDL_GetTicks();
+      }
       break;
 
     case SDL_EVENT_KEY_DOWN:
--