]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
updates midi functionality (#331)
authorJack Humbert <jack.humb@gmail.com>
Sun, 15 May 2016 04:51:06 +0000 (00:51 -0400)
committerJack Humbert <jack.humb@gmail.com>
Sun, 15 May 2016 04:51:06 +0000 (00:51 -0400)
* 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

keyboard/planck/keymaps/experimental/keymap.c
keyboard/planck/keymaps/experimental/makefile.mk
quantum/keymap_common.c
quantum/keymap_common.h
quantum/quantum.c
quantum/quantum.h
quantum/quantum.mk
tmk_core/protocol/lufa/lufa.c

index 8bc7334c9aab2dda1f47e55046dd0a006b245013..2f8a0510a8435f2e1e82f66b1ca4205bb19d8a75 100644 (file)
@@ -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);
index 99fbfbd0bb6994af12ed9a57b8568f0bc77e089a..6c1e05b65a71d744b89c613a2bd7e49772be5f79 100644 (file)
@@ -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
index 0184770c4b8e70dbb0df5856b795ab21af43e82c..2aae13e67908dc0b8710e5f5bcae2ae6267aea7c 100644 (file)
@@ -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;
index 0074ab164d1d782795395263618b00f67a13383d..07020150ae140896f26a66a62f37157ac19bc067 100644 (file)
@@ -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
index dd5d84f826a37562205710ec2105b6f9156e84ae..5a978d33209f724bd0164eb95a8587e67812fd37 100644 (file)
@@ -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
index db726ad425a7a02c4bbd34bae6e547b1d9df98b5..bfecdb2626aeaacc4ae18d026916422a38379d28 100644 (file)
@@ -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"
index b45ad850ab4dbee6c5d902f099e84cd69e7d6ace..e7ccfd659825beb24d0242f7ec8a8299270c366b 100644 (file)
@@ -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
index f03f9a9b929429e1d6b4fbc3aa7783c733f0ecbe..aba94cd597f9dc12955fe5125560cf5b8fe18b22 100644 (file)
@@ -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);