diff options
| -rw-r--r-- | quantum/process_keycode/process_midi.c | 109 | 
1 files changed, 109 insertions, 0 deletions
diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c index acaae7c30a..4fbb288162 100644 --- a/quantum/process_keycode/process_midi.c +++ b/quantum/process_keycode/process_midi.c @@ -19,6 +19,10 @@ midi_config_t midi_config;  #define MIDI_INVALID_NOTE 0xFF +#define MIDI_USE_NOTE_ON_ARRAY + +#ifdef MIDI_USE_NOTE_ON_ARRAY +  #define MIDI_MAX_NOTES_ON 10  typedef struct { @@ -33,6 +37,15 @@ typedef struct {  static midi_notes_on_array_t notes_on; +#else + +#define MIDI_TONE_COUNT (MIDI_TONE_MAX - MIDI_TONE_MIN + 1) +static uint8_t tone_status[MIDI_TONE_COUNT]; + +#endif + + +  inline uint8_t compute_velocity(uint8_t setting)  {      return (setting + 1) * (128 / (MIDI_VELOCITY_MAX - MIDI_VELOCITY_MIN + 1)); @@ -43,7 +56,14 @@ void midi_init(void)      midi_config.octave = MI_OCT_0 - MIDI_OCTAVE_MIN;      midi_config.velocity = (MIDI_VELOCITY_MAX - MIDI_VELOCITY_MIN);      midi_config.channel = 0; +    #ifdef MIDI_USE_NOTE_ON_ARRAY      notes_on.length = 0; +    #else +    for (uint8_t i = 0; i < MIDI_TONE_COUNT; i++) +    { +        tone_status[i] = MIDI_INVALID_NOTE; +    } +    #endif  }  bool process_midi(uint16_t keycode, keyrecord_t *record) @@ -54,15 +74,31 @@ bool process_midi(uint16_t keycode, keyrecord_t *record)              uint8_t channel = midi_config.channel;              uint8_t tone = keycode - MIDI_TONE_MIN;              uint8_t velocity = compute_velocity(midi_config.velocity); +            #ifdef MIDI_USE_NOTE_ON_ARRAY              if (record->event.pressed && notes_on.length < MIDI_MAX_NOTES_ON) { +            #else +            if (record->event.pressed) { +            #endif                  uint8_t note = 12 * midi_config.octave + tone;                  midi_send_noteon(&midi_device, channel, note, velocity);                  dprintf("midi noteon channel:%d note:%d velocity:%d\n", channel, note, velocity); + +                #ifdef MIDI_USE_NOTE_ON_ARRAY +                                  notes_on.values[notes_on.length].note = note;                  notes_on.values[notes_on.length].tone = tone;                  notes_on.length++; +                 +                #else + +                tone_status[tone] = note; + +                #endif              }              else { +                 +                #ifdef MIDI_USE_NOTE_ON_ARRAY +                  for (uint8_t i = 0; i < notes_on.length; i++) {                      uint8_t note = notes_on.values[i].note;                      if (tone == notes_on.values[i].tone) { @@ -78,6 +114,18 @@ bool process_midi(uint16_t keycode, keyrecord_t *record)                          break;                      }                  } + +                #else + +                uint8_t note = tone_status[tone]; +                if (note != MIDI_INVALID_NOTE) +                { +                    midi_send_noteoff(&midi_device, channel, note, velocity); +                    dprintf("midi noteoff channel:%d note:%d velocity:%d\n", channel, note, velocity); +                } +                tone_status[tone] = MIDI_INVALID_NOTE; + +                #endif              }              return false;          } @@ -122,5 +170,66 @@ bool process_midi(uint16_t keycode, keyrecord_t *record)              return false;      }; +#if 0 +    if (keycode == MI_ON && record->event.pressed) { +      midi_activated = true; +#ifdef AUDIO_ENABLE +      music_scale_user(); +#endif +      return false; +    } + +    if (keycode == MI_OFF && record->event.pressed) { +      midi_activated = false; +      midi_send_cc(&midi_device, 0, 0x7B, 0); +      return false; +    } + +    if (midi_activated) { +      if (record->event.key.col == (MATRIX_COLS - 1) && record->event.key.row == (MATRIX_ROWS - 1)) { +          if (record->event.pressed) { +              midi_starting_note++; // Change key +              midi_send_cc(&midi_device, 0, 0x7B, 0); +          } +          return false; +      } +      if (record->event.key.col == (MATRIX_COLS - 2) && record->event.key.row == (MATRIX_ROWS - 1)) { +          if (record->event.pressed) { +              midi_starting_note--; // Change key +              midi_send_cc(&midi_device, 0, 0x7B, 0); +          } +          return false; +      } +      if (record->event.key.col == (MATRIX_COLS - 3) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) { +          midi_offset++; // Change scale +          midi_send_cc(&midi_device, 0, 0x7B, 0); +          return false; +      } +      if (record->event.key.col == (MATRIX_COLS - 4) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) { +          midi_offset--; // Change scale +          midi_send_cc(&midi_device, 0, 0x7B, 0); +          return false; +      } +      // basic +      // uint8_t note = (midi_starting_note + SCALE[record->event.key.col + midi_offset])+12*(MATRIX_ROWS - record->event.key.row); +      // advanced +      // uint8_t note = (midi_starting_note + record->event.key.col + midi_offset)+12*(MATRIX_ROWS - record->event.key.row); +      // guitar +      uint8_t note = (midi_starting_note + record->event.key.col + midi_offset)+5*(MATRIX_ROWS - record->event.key.row); +      // violin +      // uint8_t note = (midi_starting_note + record->event.key.col + midi_offset)+7*(MATRIX_ROWS - record->event.key.row); + +      if (record->event.pressed) { +        // midi_send_noteon(&midi_device, record->event.key.row, midi_starting_note + SCALE[record->event.key.col], 127); +        midi_send_noteon(&midi_device, 0, note, 127); +      } else { +        // midi_send_noteoff(&midi_device, record->event.key.row, midi_starting_note + SCALE[record->event.key.col], 127); +        midi_send_noteoff(&midi_device, 0, note, 127); +      } + +      if (keycode < 0xFF) // ignores all normal keycodes, but lets RAISE, LOWER, etc through +        return false; +    } +#endif      return true;  }  | 
