~ruther/qmk_firmware

fde477a927edc6b4207a6968d44aeed021e8b300 — Jack Humbert 9 years ago bf5c2cc
updates midi functionality (#331)

* implements leader key for planck experimental

* allows override of leader timeout

* adds ability to use the leader key in seq

* fixes leader keycode

* adds chording prototype

* fixes keycode detection

* moves music mode to quantum.c

* disables chording by default

* adds music sequencer functionality

* implements audio/music functions in quantum.c

* splits up process_action to allow independent processing of actions

* moves midi stuff to quantum.c

* adds additional scales for midi
M keyboard/planck/keymaps/experimental/keymap.c => keyboard/planck/keymaps/experimental/keymap.c +5 -1
@@ 162,7 162,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_ADJUST] = {
  {_______, RESET,   _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL},
  {_______, _______, _______, AU_ON,   AU_OFF,  AG_NORM, AG_SWAP, QWERTY,  COLEMAK, DVORAK,  PLOVER,  _______},
  {_______, MUV_DE,  MUV_IN,  MU_ON,   MU_OFF,  _______, _______, _______, _______, _______, _______, _______},
  {_______, MUV_DE,  MUV_IN,  MU_ON,   MU_OFF,  MI_ON,   MI_OFF,  _______, _______, _______, _______, _______},
  {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
}



@@ 227,8 227,10 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
        case _LOWER:
          if (record->event.pressed) {
            layer_on(_LOWER);
            #ifdef BACKLIGHT_ENABLE
                breathing_speed_set(2);
                breathing_pulse();
            #endif
            update_tri_layer(_LOWER, _RAISE, _ADJUST);
          } else {
            layer_off(_LOWER);


@@ 238,8 240,10 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
        case _RAISE:
          if (record->event.pressed) {
            layer_on(_RAISE);
            #ifdef BACKLIGHT_ENABLE
                breathing_speed_set(2);
                breathing_pulse();
            #endif
            update_tri_layer(_LOWER, _RAISE, _ADJUST);
          } else {
            layer_off(_RAISE);

M keyboard/planck/keymaps/experimental/makefile.mk => keyboard/planck/keymaps/experimental/makefile.mk +4 -1
@@ 1,2 1,5 @@
AUDIO_ENABLE = yes
NKRO_ENABLE = yes
\ No newline at end of file
NKRO_ENABLE = yes
MIDI_ENABLE = yes
BACKLIGHT_ENABLE = no
COMMAND_ENABLE = no
\ No newline at end of file

M quantum/keymap_common.c => quantum/keymap_common.c +0 -5
@@ 282,11 282,6 @@ static action_t keycode_to_action(uint16_t keycode)
                action.code = ACTION_MODS_ONESHOT(mod);
            }
            break;
    #ifdef MIDI_ENABLE
        case 0x6000 ... 0x6FFF:
            action.code =  ACTION_FUNCTION_OPT(keycode & 0xFF, (keycode & 0x0F00) >> 8);
            break;
    #endif
        case 0x7000 ... 0x7FFF:
            action.code = ACTION_MODS_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF);
            break;

M quantum/keymap_common.h => quantum/keymap_common.h +5 -0
@@ 195,6 195,7 @@ extern const uint16_t fn_actions[];




// MAGIC keycodes
#define MAGIC_SWAP_CONTROL_CAPSLOCK      0x5002
#define MAGIC_UNSWAP_CONTROL_CAPSLOCK    0x5003


@@ 232,6 233,10 @@ extern const uint16_t fn_actions[];
#define MUV_IN 0x5024
#define MUV_DE 0x5025

// Midi mode on/off
#define MI_ON  0x5026
#define MI_OFF 0x5027

// GOTO layer - 16 layers max
// when:
// ON_PRESS    = 1

M quantum/quantum.c => quantum/quantum.c +83 -5
@@ 19,11 19,15 @@ void leader_end(void) {}

#ifdef AUDIO_ENABLE
  uint8_t starting_note = 0x0C;
  int offset = 0;
  int offset = 7;
  bool music_activated = false;
  float music_scale[][2] = SONG(MUSIC_SCALE_SOUND);
#endif

#ifdef MIDI_ENABLE
  bool midi_activated = false;
#endif

// Leader key stuff
bool leading = false;
uint16_t leader_time = 0;


@@ 98,6 102,82 @@ bool process_record_quantum(keyrecord_t *record) {
    //   return false;
    // }

  #ifdef MIDI_ENABLE
    if (keycode == MI_ON && record->event.pressed) {
      midi_activated = true;
      PLAY_NOTE_ARRAY(music_scale, false, 0);
      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) {
              starting_note++; // Change key
              midi_send_cc(&midi_device, 0, 0x7B, 0);
              // midi_send_cc(&midi_device, 1, 0x7B, 0);
              // midi_send_cc(&midi_device, 2, 0x7B, 0);
              // midi_send_cc(&midi_device, 3, 0x7B, 0);
              // midi_send_cc(&midi_device, 4, 0x7B, 0);
          }
          return false;
      }
      if (record->event.key.col == (MATRIX_COLS - 2) && record->event.key.row == (MATRIX_ROWS - 1)) {
          if (record->event.pressed) {
              starting_note--; // Change key
              midi_send_cc(&midi_device, 0, 0x7B, 0);
              // midi_send_cc(&midi_device, 1, 0x7B, 0);
              // midi_send_cc(&midi_device, 2, 0x7B, 0);
              // midi_send_cc(&midi_device, 3, 0x7B, 0);
              // midi_send_cc(&midi_device, 4, 0x7B, 0);
          }
          return false;
      }
      if (record->event.key.col == (MATRIX_COLS - 3) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) {
          offset++; // Change scale
          midi_send_cc(&midi_device, 0, 0x7B, 0);
          // midi_send_cc(&midi_device, 1, 0x7B, 0);
          // midi_send_cc(&midi_device, 2, 0x7B, 0);
          // midi_send_cc(&midi_device, 3, 0x7B, 0);
          // midi_send_cc(&midi_device, 4, 0x7B, 0);
          return false;
      }
      if (record->event.key.col == (MATRIX_COLS - 4) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) {
          offset--; // Change scale
          midi_send_cc(&midi_device, 0, 0x7B, 0);
          // midi_send_cc(&midi_device, 1, 0x7B, 0);
          // midi_send_cc(&midi_device, 2, 0x7B, 0);
          // midi_send_cc(&midi_device, 3, 0x7B, 0);
          // midi_send_cc(&midi_device, 4, 0x7B, 0);
          return false;
      }
      // basic
      // uint8_t note = (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row);
      // advanced
      // uint8_t note = (starting_note + record->event.key.col + offset)+12*(MATRIX_ROWS - record->event.key.row);
      // guitar
      uint8_t note = (starting_note + record->event.key.col + offset)+5*(MATRIX_ROWS - record->event.key.row);
      // violin
      // uint8_t note = (starting_note + record->event.key.col + offset)+7*(MATRIX_ROWS - record->event.key.row);

      if (record->event.pressed) {
        // midi_send_noteon(&midi_device, record->event.key.row, 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, 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

  #ifdef AUDIO_ENABLE
    if (keycode == AU_ON && record->event.pressed) {
      audio_on();


@@ 169,7 249,7 @@ bool process_record_quantum(keyrecord_t *record) {
        return false;
      }

      float freq = ((float)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row));
      float freq = ((float)220.0)*pow(2.0, -5.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row));
      if (record->event.pressed) {
        play_note(freq, 0xF);
        if (music_sequence_recording) {


@@ 185,8 265,6 @@ bool process_record_quantum(keyrecord_t *record) {
    }
  #endif



#ifndef DISABLE_LEADER
  // Leader key set-up
  if (record->event.pressed) {


@@ 267,6 345,6 @@ void matrix_scan_quantum() {
  }

  #endif
  

  matrix_scan_kb();
}
\ No newline at end of file

M quantum/quantum.h => quantum/quantum.h +2 -1
@@ 13,7 13,8 @@
  #include "audio.h"
#endif
#ifdef MIDI_ENABLE
	#include <keymap_midi.h>
	// #include <keymap_midi.h>
	#include <lufa.h>
#endif
#include "action_layer.h"
#include "eeconfig.h"

M quantum/quantum.mk => quantum/quantum.mk +3 -3
@@ 24,9 24,9 @@ ifndef CUSTOM_MATRIX
	SRC += $(QUANTUM_DIR)/matrix.c
endif

ifeq ($(strip $(MIDI_ENABLE)), yes)
	SRC += $(QUANTUM_DIR)/keymap_midi.c
endif
#ifeq ($(strip $(MIDI_ENABLE)), yes)
#	SRC += $(QUANTUM_DIR)/keymap_midi.c
#endif

ifeq ($(strip $(AUDIO_ENABLE)), yes)
    SRC += $(QUANTUM_DIR)/audio/audio.c

M tmk_core/protocol/lufa/lufa.c => tmk_core/protocol/lufa/lufa.c +1 -1
@@ 883,7 883,7 @@ int main(void)
    midi_register_cc_callback(&midi_device, cc_callback);
    midi_register_sysex_callback(&midi_device, sysex_callback);

    init_notes();
    // init_notes();
    // midi_send_cc(&midi_device, 0, 1, 2);
    // midi_send_cc(&midi_device, 15, 1, 0);
    // midi_send_noteon(&midi_device, 0, 64, 127);