From 59bef40aab37f8dd4db61e601f2a0e9b5991e993 Mon Sep 17 00:00:00 2001
From: Zach Nielsen <nielsen.zac@gmail.com>
Date: Thu, 10 Nov 2016 12:14:54 -0800
Subject: Keep unicode's input_mode through a power cycle

---
 quantum/process_keycode/process_unicode.c | 6 ++++++
 1 file changed, 6 insertions(+)

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_unicode.c b/quantum/process_keycode/process_unicode.c
index cd3a610b4..f42f25538 100644
--- a/quantum/process_keycode/process_unicode.c
+++ b/quantum/process_keycode/process_unicode.c
@@ -1,6 +1,7 @@
 #include "process_unicode.h"
 
 static uint8_t input_mode;
+static uint8_t first_flag = 0;
 
 __attribute__((weak))
 uint16_t hex_to_keycode(uint8_t hex)
@@ -17,6 +18,7 @@ uint16_t hex_to_keycode(uint8_t hex)
 void set_unicode_input_mode(uint8_t os_target)
 {
   input_mode = os_target;
+  eeprom_update_byte(EECONFIG_UNICODEMODE, os_target);
 }
 
 uint8_t get_unicode_input_mode(void) {
@@ -75,6 +77,10 @@ void register_hex(uint16_t hex) {
 
 bool process_unicode(uint16_t keycode, keyrecord_t *record) {
   if (keycode > QK_UNICODE && record->event.pressed) {
+    if (first_flag == 0) {
+      set_unicode_input_mode(eeprom_read_byte(EECONFIG_UNICODEMODE));
+      first_flag = 1;
+    }
     uint16_t unicode = keycode & 0x7FFF;
     unicode_input_start();
     register_hex(unicode);
-- 
cgit v1.2.3


From eac8fa799909817bfc7cb4043448f85551154c6b Mon Sep 17 00:00:00 2001
From: Ofer Plesser <plesserofer@gmail.com>
Date: Sat, 10 Dec 2016 00:49:11 +0200
Subject: Implemented basic key combination feature

---
 quantum/process_keycode/process_combo.c | 66 +++++++++++++++++++++++++++++++++
 quantum/process_keycode/process_combo.h | 25 +++++++++++++
 2 files changed, 91 insertions(+)
 create mode 100644 quantum/process_keycode/process_combo.c
 create mode 100644 quantum/process_keycode/process_combo.h

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_combo.c b/quantum/process_keycode/process_combo.c
new file mode 100644
index 000000000..a6cfed11a
--- /dev/null
+++ b/quantum/process_keycode/process_combo.c
@@ -0,0 +1,66 @@
+#include "process_combo.h"
+#include "print.h"
+
+// __attribute__ ((weak))
+// combo_t key_combos[] = {
+
+// };
+
+#define SEND_KEY(key) \
+do { \
+    register_code16(key); \
+    send_keyboard_report(); \
+    unregister_code16(key); \
+} while(0)
+
+
+#define ALL_COMBO_KEYS_ARE_DOWN (((1<<count)-1) == combo->state)
+static bool process_single_combo(combo_t *combo, uint16_t keycode, keyrecord_t *record) 
+{
+    uint8_t count = 0;
+    bool is_combo_key = false;
+    // bool combo_key_released = false;
+
+    // Count the number of combo keys
+    for (const uint16_t *key = combo->keys; COMBO_END != pgm_read_word(key); ++key, ++count);
+
+    for (uint8_t i = 0; i < count; ++i) {
+        uint16_t key = pgm_read_word(&combo->keys[i]);
+
+        if (key == keycode) {
+            is_combo_key = true;
+
+            if (record->event.pressed) {
+                combo->state |= (1<<i);
+            } else { // Combo key released
+                if (!combo->state) {
+                    // The combo was sent, no need to send released key
+                    return true;
+                }
+
+                combo->state &= ~(1<<i);
+                SEND_KEY(key);
+            }
+        }
+    }
+
+    if (ALL_COMBO_KEYS_ARE_DOWN) {
+        SEND_KEY(combo->action);
+        combo->state = 0;    
+    }
+
+    return is_combo_key;
+}
+
+
+bool process_combo(uint16_t keycode, keyrecord_t *record)
+{
+    bool is_combo_key = false;
+
+    for (int i = 0; i < NUM_ELEMS(key_combos); ++i) {
+        combo_t *combo = &key_combos[i];
+        is_combo_key |= process_single_combo(combo, keycode, record);
+    }    
+
+    return !is_combo_key;
+}
\ No newline at end of file
diff --git a/quantum/process_keycode/process_combo.h b/quantum/process_keycode/process_combo.h
new file mode 100644
index 000000000..68786c0f1
--- /dev/null
+++ b/quantum/process_keycode/process_combo.h
@@ -0,0 +1,25 @@
+#ifndef PROCESS_COMBO_H
+#define PROCESS_COMBO_H
+
+#include <stdint.h>
+#include "progmem.h"
+#include "quantum.h"
+
+
+typedef struct
+{
+    const uint16_t *keys;
+    uint16_t action;        
+    uint32_t state;
+} combo_t;
+
+
+#define COMBO_END 0
+#define NUM_ELEMS(a) (sizeof(a)/sizeof 0[a])
+
+
+extern combo_t key_combos[1];
+
+bool process_combo(uint16_t keycode, keyrecord_t *record);
+
+#endif
\ No newline at end of file
-- 
cgit v1.2.3


From b6bf4e0dce062a535685c4e772f613252d401ed3 Mon Sep 17 00:00:00 2001
From: Ofer Plesser <plesserofer@gmail.com>
Date: Sat, 10 Dec 2016 16:11:59 +0200
Subject: Added support for timing out combos if a key as been pressed for
 longer than COMBO_TERM

---
 quantum/process_keycode/process_combo.c | 107 +++++++++++++++++++++++---------
 quantum/process_keycode/process_combo.h |  20 +++++-
 2 files changed, 96 insertions(+), 31 deletions(-)

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_combo.c b/quantum/process_keycode/process_combo.c
index a6cfed11a..ff7e8aba5 100644
--- a/quantum/process_keycode/process_combo.c
+++ b/quantum/process_keycode/process_combo.c
@@ -1,11 +1,6 @@
 #include "process_combo.h"
 #include "print.h"
 
-// __attribute__ ((weak))
-// combo_t key_combos[] = {
-
-// };
-
 #define SEND_KEY(key) \
 do { \
     register_code16(key); \
@@ -13,54 +8,110 @@ do { \
     unregister_code16(key); \
 } while(0)
 
+#define COMBO_TIMER_ELAPSED -1
+
+#if COMBO_TERM
+#define IS_COMBO_KEY_HELD(combo)            (COMBO_TIMER_ELAPSED == combo->timer ? false : true)
+#define RESET_COMBO_TIMER_AND_KEY(combo)    combo->timer = 0; combo->key = 0
+#else
+#define IS_COMBO_KEY_HELD(combo)            (true)
+#define RESET_COMBO_TIMER_AND_KEY(combo)    do {} while (0)
+#endif
+
+
+__attribute__ ((weak))
+combo_t key_combos[COMBO_COUNT] = {
+
+};
+
+static inline void reset_combo(combo_t *combo)
+{
+    combo->state = 0;
+    RESET_COMBO_TIMER_AND_KEY(combo);
+}
 
 #define ALL_COMBO_KEYS_ARE_DOWN (((1<<count)-1) == combo->state)
+#define NO_COMBO_KEYS_ARE_DOWN  (0 == combo->state)
+#define KEY_STATE_DOWN(key)     do{ combo->state |= (1<<key); } while(0)
+#define KEY_STATE_UP(key)       do{ combo->state &= ~(1<<key); } while(0)
 static bool process_single_combo(combo_t *combo, uint16_t keycode, keyrecord_t *record) 
 {
     uint8_t count = 0;
-    bool is_combo_key = false;
-    // bool combo_key_released = false;
+    uint8_t index = -1;
+    /* Find index of keycode and number of combo keys */
+    for (const uint16_t *keys = combo->keys; ;++count) {
+        uint16_t key = pgm_read_word(&keys[count]);
+        if (keycode == key) index = count;
+        if (COMBO_END == key) break;
+    }
 
-    // Count the number of combo keys
-    for (const uint16_t *key = combo->keys; COMBO_END != pgm_read_word(key); ++key, ++count);
+    /* Return if not a combo key */
+    if (-1 == index) return false;
 
-    for (uint8_t i = 0; i < count; ++i) {
-        uint16_t key = pgm_read_word(&combo->keys[i]);
+    bool is_combo_active = IS_COMBO_KEY_HELD(combo);
 
-        if (key == keycode) {
-            is_combo_key = true;
+    if (record->event.pressed) {
+        KEY_STATE_DOWN(index);
+        
+#if COMBO_TERM
+        if (is_combo_active) {
+            combo->timer = timer_read();
+            combo->key = keycode;
+        }
+#endif
 
-            if (record->event.pressed) {
-                combo->state |= (1<<i);
-            } else { // Combo key released
-                if (!combo->state) {
-                    // The combo was sent, no need to send released key
-                    return true;
-                }
+    } else {
+        if (is_combo_active && combo->state) { /* Combo key was tapped */
+            RESET_COMBO_TIMER_AND_KEY(combo);            
+            SEND_KEY(keycode);
+        }
 
-                combo->state &= ~(1<<i);
-                SEND_KEY(key);
-            }
+#if COMBO_TERM
+        if (!is_combo_active && keycode == combo->key) { /* Held combo key was released */
+            unregister_code16(combo->key);
         }
+#endif
+
+        KEY_STATE_UP(index);
     }
 
-    if (ALL_COMBO_KEYS_ARE_DOWN) {
+    if (ALL_COMBO_KEYS_ARE_DOWN && is_combo_active) {
         SEND_KEY(combo->action);
-        combo->state = 0;    
+        reset_combo(combo);
+    } 
+    
+    if(NO_COMBO_KEYS_ARE_DOWN && !is_combo_active) {
+        reset_combo(combo);
     }
 
-    return is_combo_key;
+    return is_combo_active;
 }
 
-
 bool process_combo(uint16_t keycode, keyrecord_t *record)
 {
     bool is_combo_key = false;
 
-    for (int i = 0; i < NUM_ELEMS(key_combos); ++i) {
+    for (int i = 0; i < COMBO_COUNT; ++i) {
         combo_t *combo = &key_combos[i];
         is_combo_key |= process_single_combo(combo, keycode, record);
     }    
 
     return !is_combo_key;
+}
+
+void matrix_scan_combo(void)
+{
+#if COMBO_TERM
+    for (int i = 0; i < COMBO_COUNT; ++i) {
+        combo_t *combo = &key_combos[i];
+        if (combo->timer && 
+            combo->timer != COMBO_TIMER_ELAPSED && 
+            timer_elapsed(combo->timer) > COMBO_TERM) {
+
+            combo->timer = COMBO_TIMER_ELAPSED;
+            unregister_code16(combo->key);
+            register_code16(combo->key);
+        }
+    }
+#endif
 }
\ No newline at end of file
diff --git a/quantum/process_keycode/process_combo.h b/quantum/process_keycode/process_combo.h
index 68786c0f1..c475acd33 100644
--- a/quantum/process_keycode/process_combo.h
+++ b/quantum/process_keycode/process_combo.h
@@ -5,21 +5,35 @@
 #include "progmem.h"
 #include "quantum.h"
 
+#ifndef COMBO_TERM
+#define COMBO_TERM TAPPING_TERM
+#endif
 
 typedef struct
 {
     const uint16_t *keys;
     uint16_t action;        
     uint32_t state;
+#if COMBO_TERM
+    uint16_t timer;
+    uint16_t key;
+#endif
 } combo_t;
 
 
+#if COMBO_TERM
+#define COMBO(ck, ca) {.keys = &(ck)[0], .action = (ca), .state = 0, .timer = 0, .key = 0}
+#else
+#define COMBO(ck, ca) {.keys = &(ck)[0], .action = (ca), .state = 0 }
+#endif
 #define COMBO_END 0
-#define NUM_ELEMS(a) (sizeof(a)/sizeof 0[a])
+#ifndef COMBO_COUNT
+#define COMBO_COUNT 0
+#endif
 
-
-extern combo_t key_combos[1];
+extern combo_t key_combos[COMBO_COUNT];
 
 bool process_combo(uint16_t keycode, keyrecord_t *record);
+void matrix_scan_combo(void);
 
 #endif
\ No newline at end of file
-- 
cgit v1.2.3


From 6e7cfa83b9424061914793b02757fa4ec75b356b Mon Sep 17 00:00:00 2001
From: Ofer Plesser <plesserofer@gmail.com>
Date: Fri, 16 Dec 2016 21:50:28 +0200
Subject: Refactored as well as added support for action keys in combos

---
 quantum/process_keycode/process_combo.c | 123 ++++++++++++++++++--------------
 quantum/process_keycode/process_combo.h |  34 +++++----
 2 files changed, 89 insertions(+), 68 deletions(-)

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_combo.c b/quantum/process_keycode/process_combo.c
index ff7e8aba5..e2189ad98 100644
--- a/quantum/process_keycode/process_combo.c
+++ b/quantum/process_keycode/process_combo.c
@@ -1,39 +1,39 @@
 #include "process_combo.h"
 #include "print.h"
 
-#define SEND_KEY(key) \
-do { \
-    register_code16(key); \
-    send_keyboard_report(); \
-    unregister_code16(key); \
-} while(0)
 
 #define COMBO_TIMER_ELAPSED -1
 
-#if COMBO_TERM
-#define IS_COMBO_KEY_HELD(combo)            (COMBO_TIMER_ELAPSED == combo->timer ? false : true)
-#define RESET_COMBO_TIMER_AND_KEY(combo)    combo->timer = 0; combo->key = 0
-#else
-#define IS_COMBO_KEY_HELD(combo)            (true)
-#define RESET_COMBO_TIMER_AND_KEY(combo)    do {} while (0)
-#endif
-
 
 __attribute__ ((weak))
-combo_t key_combos[COMBO_COUNT] = {
+combo_t key_combos[] = {
 
 };
 
-static inline void reset_combo(combo_t *combo)
+__attribute__ ((weak))
+void process_combo_event(uint8_t combo_index, bool pressed) {
+
+}
+
+static uint8_t current_combo_index = 0;
+
+static inline void send_combo(uint16_t action, bool pressed)
 {
-    combo->state = 0;
-    RESET_COMBO_TIMER_AND_KEY(combo);
+    if (action) {
+        if (pressed) {
+            register_code16(action);
+        } else {
+            unregister_code16(action);
+        }
+    } else {
+        process_combo_event(current_combo_index, pressed);
+    }
 }
 
-#define ALL_COMBO_KEYS_ARE_DOWN (((1<<count)-1) == combo->state)
-#define NO_COMBO_KEYS_ARE_DOWN  (0 == combo->state)
-#define KEY_STATE_DOWN(key)     do{ combo->state |= (1<<key); } while(0)
-#define KEY_STATE_UP(key)       do{ combo->state &= ~(1<<key); } while(0)
+#define ALL_COMBO_KEYS_ARE_DOWN     (((1<<count)-1) == combo->state)
+#define NO_COMBO_KEYS_ARE_DOWN      (0 == combo->state)
+#define KEY_STATE_DOWN(key)         do{ combo->state |= (1<<key); } while(0)
+#define KEY_STATE_UP(key)           do{ combo->state &= ~(1<<key); } while(0)
 static bool process_single_combo(combo_t *combo, uint16_t keycode, keyrecord_t *record) 
 {
     uint8_t count = 0;
@@ -46,42 +46,51 @@ static bool process_single_combo(combo_t *combo, uint16_t keycode, keyrecord_t *
     }
 
     /* Return if not a combo key */
-    if (-1 == index) return false;
+    if (-1 == (int8_t)index) return false;
 
-    bool is_combo_active = IS_COMBO_KEY_HELD(combo);
+    /* The combos timer is used to signal whether the combo is active */
+    bool is_combo_active = COMBO_TIMER_ELAPSED == combo->timer ? false : true;
 
     if (record->event.pressed) {
         KEY_STATE_DOWN(index);
-        
-#if COMBO_TERM
+
         if (is_combo_active) {
-            combo->timer = timer_read();
-            combo->key = keycode;
-        }
+            if (ALL_COMBO_KEYS_ARE_DOWN) { /* Combo was pressed */
+                send_combo(combo->keycode, true);
+                combo->timer = COMBO_TIMER_ELAPSED;
+            } else { /* Combo key was pressed */
+                combo->timer = timer_read();
+#ifdef COMBO_ALLOW_ACTION_KEYS
+                combo->prev_record = *record;
+#else
+                combo->prev_key = keycode;
 #endif
-
+            }
+        }
     } else {
-        if (is_combo_active && combo->state) { /* Combo key was tapped */
-            RESET_COMBO_TIMER_AND_KEY(combo);            
-            SEND_KEY(keycode);
+        if (ALL_COMBO_KEYS_ARE_DOWN) { /* Combo was released */
+            send_combo(combo->keycode, false);
         }
 
-#if COMBO_TERM
-        if (!is_combo_active && keycode == combo->key) { /* Held combo key was released */
-            unregister_code16(combo->key);
-        }
+        if (is_combo_active) { /* Combo key was tapped */
+#ifdef COMBO_ALLOW_ACTION_KEYS
+            record->event.pressed = true;
+            process_action(record, store_or_get_action(record->event.pressed, record->event.key));
+            record->event.pressed = false;
+            process_action(record, store_or_get_action(record->event.pressed, record->event.key));
+#else
+            register_code16(keycode);
+            send_keyboard_report();
+            unregister_code16(keycode);
 #endif
+            combo->timer = 0;            
+        }
 
-        KEY_STATE_UP(index);
+        KEY_STATE_UP(index);        
     }
 
-    if (ALL_COMBO_KEYS_ARE_DOWN && is_combo_active) {
-        SEND_KEY(combo->action);
-        reset_combo(combo);
-    } 
-    
-    if(NO_COMBO_KEYS_ARE_DOWN && !is_combo_active) {
-        reset_combo(combo);
+    if (NO_COMBO_KEYS_ARE_DOWN) {
+        combo->timer = 0;
     }
 
     return is_combo_active;
@@ -91,8 +100,8 @@ bool process_combo(uint16_t keycode, keyrecord_t *record)
 {
     bool is_combo_key = false;
 
-    for (int i = 0; i < COMBO_COUNT; ++i) {
-        combo_t *combo = &key_combos[i];
+    for (current_combo_index = 0; current_combo_index < COMBO_COUNT; ++current_combo_index) {
+        combo_t *combo = &key_combos[current_combo_index];
         is_combo_key |= process_single_combo(combo, keycode, record);
     }    
 
@@ -101,17 +110,25 @@ bool process_combo(uint16_t keycode, keyrecord_t *record)
 
 void matrix_scan_combo(void)
 {
-#if COMBO_TERM
     for (int i = 0; i < COMBO_COUNT; ++i) {
         combo_t *combo = &key_combos[i];
         if (combo->timer && 
             combo->timer != COMBO_TIMER_ELAPSED && 
             timer_elapsed(combo->timer) > COMBO_TERM) {
-
+            
+            /* This disables the combo, meaning key events for this
+             * combo will be handled by the next processors in the chain 
+             */
             combo->timer = COMBO_TIMER_ELAPSED;
-            unregister_code16(combo->key);
-            register_code16(combo->key);
+
+#ifdef COMBO_ALLOW_ACTION_KEYS
+            process_action(&combo->prev_record, 
+                store_or_get_action(combo->prev_record.event.pressed, 
+                                    combo->prev_record.event.key));
+#else
+            unregister_code16(combo->prev_key);
+            register_code16(combo->prev_key);
+#endif
         }
     }
-#endif
-}
\ No newline at end of file
+}
diff --git a/quantum/process_keycode/process_combo.h b/quantum/process_keycode/process_combo.h
index c475acd33..847f2b737 100644
--- a/quantum/process_keycode/process_combo.h
+++ b/quantum/process_keycode/process_combo.h
@@ -5,35 +5,39 @@
 #include "progmem.h"
 #include "quantum.h"
 
-#ifndef COMBO_TERM
-#define COMBO_TERM TAPPING_TERM
-#endif
-
 typedef struct
 {
     const uint16_t *keys;
-    uint16_t action;        
+    uint16_t keycode;        
+#ifdef EXTRA_EXTRA_LONG_COMBOS
     uint32_t state;
-#if COMBO_TERM
+#elif EXTRA_LONG_COMBOS
+    uint16_t state;
+#else
+    uint8_t state;
+#endif
     uint16_t timer;
-    uint16_t key;
+#ifdef COMBO_ALLOW_ACTION_KEYS
+    keyrecord_t prev_record;
+#else
+    uint16_t prev_key;
 #endif
 } combo_t;
 
 
-#if COMBO_TERM
-#define COMBO(ck, ca) {.keys = &(ck)[0], .action = (ca), .state = 0, .timer = 0, .key = 0}
-#else
-#define COMBO(ck, ca) {.keys = &(ck)[0], .action = (ca), .state = 0 }
-#endif
+#define COMBO(ck, ca)       {.keys = &(ck)[0], .keycode = (ca)}
+#define COMBO_ACTION(ck)    {.keys = &(ck)[0]}
+
 #define COMBO_END 0
 #ifndef COMBO_COUNT
 #define COMBO_COUNT 0
 #endif
-
-extern combo_t key_combos[COMBO_COUNT];
+#ifndef COMBO_TERM
+#define COMBO_TERM TAPPING_TERM
+#endif
 
 bool process_combo(uint16_t keycode, keyrecord_t *record);
 void matrix_scan_combo(void);
+void process_combo_event(uint8_t combo_index, bool pressed);
 
-#endif
\ No newline at end of file
+#endif
-- 
cgit v1.2.3


From 0aa413af44b292e4b44d8f8aee1a92f2cb113438 Mon Sep 17 00:00:00 2001
From: Jonas Oberschweiber <jonas.oberschweiber@d-velop.de>
Date: Sat, 31 Dec 2016 19:37:56 +0100
Subject: Add support for supplementary planes for OS X

---
 quantum/process_keycode/process_unicode.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_unicode.c b/quantum/process_keycode/process_unicode.c
index cd3a610b4..2606cf0c8 100644
--- a/quantum/process_keycode/process_unicode.c
+++ b/quantum/process_keycode/process_unicode.c
@@ -116,7 +116,16 @@ bool process_unicode_map(uint16_t keycode, keyrecord_t *record) {
     const uint32_t* map = unicode_map;
     uint16_t index = keycode & 0x7FF;
     uint32_t code = pgm_read_dword_far(&map[index]);
-    if ((code > 0xFFFF && input_mode == UC_OSX) || (code > 0xFFFFF && input_mode == UC_LNX)) {
+    if (code > 0xFFFF && code <= 0x10ffff && input_mode == UC_OSX) {
+      // Convert to UTF-16 surrogate pair
+      code -= 0x10000;
+      uint32_t lo = code & 0x3ff;
+      uint32_t hi = (code & 0xffc00) >> 10;
+      unicode_input_start();
+      register_hex32(hi + 0xd800);
+      register_hex32(lo + 0xdc00);
+      unicode_input_finish();
+    } else if ((code > 0x10ffff && input_mode == UC_OSX) || (code > 0xFFFFF && input_mode == UC_LNX)) {
       // when character is out of range supported by the OS
       unicode_map_input_error();
     } else {
-- 
cgit v1.2.3


From 841d7e6a1d74b1fc45575ed551132ec27353ebf3 Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Mon, 23 Jan 2017 13:55:24 -0500
Subject: turn off rgb_midi in ez

---
 quantum/process_keycode/process_music.c | 1 +
 1 file changed, 1 insertion(+)

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_music.c b/quantum/process_keycode/process_music.c
index ca68bef6c..1e2648bff 100644
--- a/quantum/process_keycode/process_music.c
+++ b/quantum/process_keycode/process_music.c
@@ -114,6 +114,7 @@ bool process_music(uint16_t keycode, keyrecord_t *record) {
             music_sequence_interval+=10;
         return false;
       }
+      #define MUSIC_MODE_GUITAR
 
       #ifdef MUSIC_MODE_CHROMATIC
       float freq = ((float)220.0)*pow(2.0, -5.0)*pow(2.0,(music_starting_note + record->event.key.col + music_offset)/12.0+(MATRIX_ROWS - record->event.key.row));
-- 
cgit v1.2.3


From 5a860b71a1943358d0722ace9d2c13bd5c77c971 Mon Sep 17 00:00:00 2001
From: SjB <steve@sagacity.ca>
Date: Sun, 29 Jan 2017 13:04:43 -0500
Subject: race condition between oneshot_mods and tap_dance

since the keycode for a tap dance process gets process only after the
TAPPING_TERM timeout, you really only have ONESHOT_TIMEOUT -
TAPPING_TERM time to tap or double tap on the key. This fix save the
oneshot_mods into the action.state structure and applies the mods with
the keycode when it's registered. It also unregisters the mod when the
the tap dance process gets reset.
---
 quantum/process_keycode/process_tap_dance.c | 7 ++++++-
 quantum/process_keycode/process_tap_dance.h | 1 +
 2 files changed, 7 insertions(+), 1 deletion(-)

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_tap_dance.c b/quantum/process_keycode/process_tap_dance.c
index 6ae362c4c..403dca538 100644
--- a/quantum/process_keycode/process_tap_dance.c
+++ b/quantum/process_keycode/process_tap_dance.c
@@ -43,12 +43,16 @@ static inline void process_tap_dance_action_on_dance_finished (qk_tap_dance_acti
   if (action->state.finished)
     return;
   action->state.finished = true;
+  add_mods(action->state.oneshot_mods);
+  send_keyboard_report();
   _process_tap_dance_action_fn (&action->state, action->user_data, action->fn.on_dance_finished);
 }
 
 static inline void process_tap_dance_action_on_reset (qk_tap_dance_action_t *action)
 {
   _process_tap_dance_action_fn (&action->state, action->user_data, action->fn.on_reset);
+  del_mods(action->state.oneshot_mods);
+  send_keyboard_report();
 }
 
 bool process_tap_dance(uint16_t keycode, keyrecord_t *record) {
@@ -70,6 +74,7 @@ bool process_tap_dance(uint16_t keycode, keyrecord_t *record) {
       action->state.keycode = keycode;
       action->state.count++;
       action->state.timer = timer_read();
+      action->state.oneshot_mods = get_oneshot_mods();
       process_tap_dance_action_on_each_tap (action);
 
       if (last_td && last_td != keycode) {
@@ -109,7 +114,7 @@ void matrix_scan_tap_dance () {
   if (highest_td == -1)
     return;
 
-  for (int i = 0; i <= highest_td; i++) {
+for (int i = 0; i <= highest_td; i++) {
     qk_tap_dance_action_t *action = &tap_dance_actions[i];
 
     if (action->state.count && timer_elapsed (action->state.timer) > TAPPING_TERM) {
diff --git a/quantum/process_keycode/process_tap_dance.h b/quantum/process_keycode/process_tap_dance.h
index f753cbba6..726752ecc 100644
--- a/quantum/process_keycode/process_tap_dance.h
+++ b/quantum/process_keycode/process_tap_dance.h
@@ -9,6 +9,7 @@
 typedef struct
 {
   uint8_t count;
+  uint8_t oneshot_mods;
   uint16_t keycode;
   uint16_t timer;
   bool interrupted;
-- 
cgit v1.2.3


From 97816df7e7aa8710c8a0837b2abe008e0c765f2a Mon Sep 17 00:00:00 2001
From: Priyadi Iman Nurcahyo <priyadi@priyadi.net>
Date: Fri, 10 Feb 2017 06:06:59 +0700
Subject: Implement tap mod dual role for right side mods.

---
 quantum/process_keycode/process_unicode.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_unicode.c b/quantum/process_keycode/process_unicode.c
index 9995ba9bd..9d01a592d 100644
--- a/quantum/process_keycode/process_unicode.c
+++ b/quantum/process_keycode/process_unicode.c
@@ -139,7 +139,7 @@ void unicode_map_input_error() {}
 bool process_unicode_map(uint16_t keycode, keyrecord_t *record) {
   if ((keycode & QK_UNICODE_MAP) == QK_UNICODE_MAP && record->event.pressed) {
     const uint32_t* map = unicode_map;
-    uint16_t index = keycode & 0x7FF;
+    uint16_t index = keycode - QK_UNICODE_MAP;
     uint32_t code = pgm_read_dword_far(&map[index]);
     if (code > 0xFFFF && code <= 0x10ffff && input_mode == UC_OSX) {
       // Convert to UTF-16 surrogate pair
-- 
cgit v1.2.3


From cbabb4d417ef58f5d484dc256b637f61619efaa8 Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Wed, 15 Feb 2017 16:36:31 -0500
Subject: split up unicode systems into different files

---
 quantum/process_keycode/process_ucis.c       | 133 ++++++++++++++++++
 quantum/process_keycode/process_ucis.h       |  34 +++++
 quantum/process_keycode/process_unicode.c    | 200 ---------------------------
 quantum/process_keycode/process_unicode.h    |  36 -----
 quantum/process_keycode/process_unicodemap.c |  54 ++++++++
 quantum/process_keycode/process_unicodemap.h |   8 ++
 6 files changed, 229 insertions(+), 236 deletions(-)
 create mode 100644 quantum/process_keycode/process_ucis.c
 create mode 100644 quantum/process_keycode/process_ucis.h
 create mode 100644 quantum/process_keycode/process_unicodemap.c
 create mode 100644 quantum/process_keycode/process_unicodemap.h

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_ucis.c b/quantum/process_keycode/process_ucis.c
new file mode 100644
index 000000000..4ad2533b0
--- /dev/null
+++ b/quantum/process_keycode/process_ucis.c
@@ -0,0 +1,133 @@
+#include "process_ucis.h"
+
+qk_ucis_state_t qk_ucis_state;
+
+void qk_ucis_start(void) {
+  qk_ucis_state.count = 0;
+  qk_ucis_state.in_progress = true;
+
+  qk_ucis_start_user();
+}
+
+__attribute__((weak))
+void qk_ucis_start_user(void) {
+  unicode_input_start();
+  register_hex(0x2328);
+  unicode_input_finish();
+}
+
+static bool is_uni_seq(char *seq) {
+  uint8_t i;
+
+  for (i = 0; seq[i]; i++) {
+    uint16_t code;
+    if (('1' <= seq[i]) && (seq[i] <= '0'))
+      code = seq[i] - '1' + KC_1;
+    else
+      code = seq[i] - 'a' + KC_A;
+
+    if (i > qk_ucis_state.count || qk_ucis_state.codes[i] != code)
+      return false;
+  }
+
+  return (qk_ucis_state.codes[i] == KC_ENT ||
+          qk_ucis_state.codes[i] == KC_SPC);
+}
+
+__attribute__((weak))
+void qk_ucis_symbol_fallback (void) {
+  for (uint8_t i = 0; i < qk_ucis_state.count - 1; i++) {
+    uint8_t code = qk_ucis_state.codes[i];
+    register_code(code);
+    unregister_code(code);
+    wait_ms(UNICODE_TYPE_DELAY);
+  }
+}
+
+void register_ucis(const char *hex) {
+  for(int i = 0; hex[i]; i++) {
+    uint8_t kc = 0;
+    char c = hex[i];
+
+    switch (c) {
+    case '0':
+      kc = KC_0;
+      break;
+    case '1' ... '9':
+      kc = c - '1' + KC_1;
+      break;
+    case 'a' ... 'f':
+      kc = c - 'a' + KC_A;
+      break;
+    case 'A' ... 'F':
+      kc = c - 'A' + KC_A;
+      break;
+    }
+
+    if (kc) {
+      register_code (kc);
+      unregister_code (kc);
+      wait_ms (UNICODE_TYPE_DELAY);
+    }
+  }
+}
+
+bool process_ucis (uint16_t keycode, keyrecord_t *record) {
+  uint8_t i;
+
+  if (!qk_ucis_state.in_progress)
+    return true;
+
+  if (qk_ucis_state.count >= UCIS_MAX_SYMBOL_LENGTH &&
+      !(keycode == KC_BSPC || keycode == KC_ESC || keycode == KC_SPC || keycode == KC_ENT)) {
+    return false;
+  }
+
+  if (!record->event.pressed)
+    return true;
+
+  qk_ucis_state.codes[qk_ucis_state.count] = keycode;
+  qk_ucis_state.count++;
+
+  if (keycode == KC_BSPC) {
+    if (qk_ucis_state.count >= 2) {
+      qk_ucis_state.count -= 2;
+      return true;
+    } else {
+      qk_ucis_state.count--;
+      return false;
+    }
+  }
+
+  if (keycode == KC_ENT || keycode == KC_SPC || keycode == KC_ESC) {
+    bool symbol_found = false;
+
+    for (i = qk_ucis_state.count; i > 0; i--) {
+      register_code (KC_BSPC);
+      unregister_code (KC_BSPC);
+      wait_ms(UNICODE_TYPE_DELAY);
+    }
+
+    if (keycode == KC_ESC) {
+      qk_ucis_state.in_progress = false;
+      return false;
+    }
+
+    unicode_input_start();
+    for (i = 0; ucis_symbol_table[i].symbol; i++) {
+      if (is_uni_seq (ucis_symbol_table[i].symbol)) {
+        symbol_found = true;
+        register_ucis(ucis_symbol_table[i].code + 2);
+        break;
+      }
+    }
+    if (!symbol_found) {
+      qk_ucis_symbol_fallback();
+    }
+    unicode_input_finish();
+
+    qk_ucis_state.in_progress = false;
+    return false;
+  }
+  return true;
+}
\ No newline at end of file
diff --git a/quantum/process_keycode/process_ucis.h b/quantum/process_keycode/process_ucis.h
new file mode 100644
index 000000000..520db8042
--- /dev/null
+++ b/quantum/process_keycode/process_ucis.h
@@ -0,0 +1,34 @@
+#ifndef PROCESS_UCIS_H
+#define PROCESS_UCIS_H
+
+#include "quantum.h"
+
+#ifndef UCIS_MAX_SYMBOL_LENGTH
+#define UCIS_MAX_SYMBOL_LENGTH 32
+#endif
+
+typedef struct {
+  char *symbol;
+  char *code;
+} qk_ucis_symbol_t;
+
+typedef struct {
+  uint8_t count;
+  uint16_t codes[UCIS_MAX_SYMBOL_LENGTH];
+  bool in_progress:1;
+} qk_ucis_state_t;
+
+extern qk_ucis_state_t qk_ucis_state;
+
+#define UCIS_TABLE(...) {__VA_ARGS__, {NULL, NULL}}
+#define UCIS_SYM(name, code) {name, #code}
+
+extern const qk_ucis_symbol_t ucis_symbol_table[];
+
+void qk_ucis_start(void);
+void qk_ucis_start_user(void);
+void qk_ucis_symbol_fallback (void);
+void register_ucis(const char *hex);
+bool process_ucis (uint16_t keycode, keyrecord_t *record);
+
+#endif
diff --git a/quantum/process_keycode/process_unicode.c b/quantum/process_keycode/process_unicode.c
index 9d01a592d..898e168a3 100644
--- a/quantum/process_keycode/process_unicode.c
+++ b/quantum/process_keycode/process_unicode.c
@@ -4,18 +4,6 @@
 static uint8_t input_mode;
 uint8_t mods;
 
-__attribute__((weak))
-uint16_t hex_to_keycode(uint8_t hex)
-{
-  if (hex == 0x0) {
-    return KC_0;
-  } else if (hex < 0xA) {
-    return KC_1 + (hex - 0x1);
-  } else {
-    return KC_A + (hex - 0xA);
-  }
-}
-
 void set_unicode_input_mode(uint8_t os_target)
 {
   input_mode = os_target;
@@ -108,191 +96,3 @@ bool process_unicode(uint16_t keycode, keyrecord_t *record) {
   return true;
 }
 
-#ifdef UNICODEMAP_ENABLE
-__attribute__((weak))
-const uint32_t PROGMEM unicode_map[] = {
-};
-
-void register_hex32(uint32_t hex) {
-  uint8_t onzerostart = 1;
-  for(int i = 7; i >= 0; i--) {
-    if (i <= 3) {
-      onzerostart = 0;
-    }
-    uint8_t digit = ((hex >> (i*4)) & 0xF);
-    if (digit == 0) {
-      if (onzerostart == 0) {
-        register_code(hex_to_keycode(digit));
-        unregister_code(hex_to_keycode(digit));
-      }
-    } else {
-      register_code(hex_to_keycode(digit));
-      unregister_code(hex_to_keycode(digit));
-      onzerostart = 0;
-    }
-  }
-}
-
-__attribute__((weak))
-void unicode_map_input_error() {}
-
-bool process_unicode_map(uint16_t keycode, keyrecord_t *record) {
-  if ((keycode & QK_UNICODE_MAP) == QK_UNICODE_MAP && record->event.pressed) {
-    const uint32_t* map = unicode_map;
-    uint16_t index = keycode - QK_UNICODE_MAP;
-    uint32_t code = pgm_read_dword_far(&map[index]);
-    if (code > 0xFFFF && code <= 0x10ffff && input_mode == UC_OSX) {
-      // Convert to UTF-16 surrogate pair
-      code -= 0x10000;
-      uint32_t lo = code & 0x3ff;
-      uint32_t hi = (code & 0xffc00) >> 10;
-      unicode_input_start();
-      register_hex32(hi + 0xd800);
-      register_hex32(lo + 0xdc00);
-      unicode_input_finish();
-    } else if ((code > 0x10ffff && input_mode == UC_OSX) || (code > 0xFFFFF && input_mode == UC_LNX)) {
-      // when character is out of range supported by the OS
-      unicode_map_input_error();
-    } else {
-      unicode_input_start();
-      register_hex32(code);
-      unicode_input_finish();
-    }
-  }
-  return true;
-}
-#endif
-
-#ifdef UCIS_ENABLE
-qk_ucis_state_t qk_ucis_state;
-
-void qk_ucis_start(void) {
-  qk_ucis_state.count = 0;
-  qk_ucis_state.in_progress = true;
-
-  qk_ucis_start_user();
-}
-
-__attribute__((weak))
-void qk_ucis_start_user(void) {
-  unicode_input_start();
-  register_hex(0x2328);
-  unicode_input_finish();
-}
-
-static bool is_uni_seq(char *seq) {
-  uint8_t i;
-
-  for (i = 0; seq[i]; i++) {
-    uint16_t code;
-    if (('1' <= seq[i]) && (seq[i] <= '0'))
-      code = seq[i] - '1' + KC_1;
-    else
-      code = seq[i] - 'a' + KC_A;
-
-    if (i > qk_ucis_state.count || qk_ucis_state.codes[i] != code)
-      return false;
-  }
-
-  return (qk_ucis_state.codes[i] == KC_ENT ||
-          qk_ucis_state.codes[i] == KC_SPC);
-}
-
-__attribute__((weak))
-void qk_ucis_symbol_fallback (void) {
-  for (uint8_t i = 0; i < qk_ucis_state.count - 1; i++) {
-    uint8_t code = qk_ucis_state.codes[i];
-    register_code(code);
-    unregister_code(code);
-    wait_ms(UNICODE_TYPE_DELAY);
-  }
-}
-
-void register_ucis(const char *hex) {
-  for(int i = 0; hex[i]; i++) {
-    uint8_t kc = 0;
-    char c = hex[i];
-
-    switch (c) {
-    case '0':
-      kc = KC_0;
-      break;
-    case '1' ... '9':
-      kc = c - '1' + KC_1;
-      break;
-    case 'a' ... 'f':
-      kc = c - 'a' + KC_A;
-      break;
-    case 'A' ... 'F':
-      kc = c - 'A' + KC_A;
-      break;
-    }
-
-    if (kc) {
-      register_code (kc);
-      unregister_code (kc);
-      wait_ms (UNICODE_TYPE_DELAY);
-    }
-  }
-}
-
-bool process_ucis (uint16_t keycode, keyrecord_t *record) {
-  uint8_t i;
-
-  if (!qk_ucis_state.in_progress)
-    return true;
-
-  if (qk_ucis_state.count >= UCIS_MAX_SYMBOL_LENGTH &&
-      !(keycode == KC_BSPC || keycode == KC_ESC || keycode == KC_SPC || keycode == KC_ENT)) {
-    return false;
-  }
-
-  if (!record->event.pressed)
-    return true;
-
-  qk_ucis_state.codes[qk_ucis_state.count] = keycode;
-  qk_ucis_state.count++;
-
-  if (keycode == KC_BSPC) {
-    if (qk_ucis_state.count >= 2) {
-      qk_ucis_state.count -= 2;
-      return true;
-    } else {
-      qk_ucis_state.count--;
-      return false;
-    }
-  }
-
-  if (keycode == KC_ENT || keycode == KC_SPC || keycode == KC_ESC) {
-    bool symbol_found = false;
-
-    for (i = qk_ucis_state.count; i > 0; i--) {
-      register_code (KC_BSPC);
-      unregister_code (KC_BSPC);
-      wait_ms(UNICODE_TYPE_DELAY);
-    }
-
-    if (keycode == KC_ESC) {
-      qk_ucis_state.in_progress = false;
-      return false;
-    }
-
-    unicode_input_start();
-    for (i = 0; ucis_symbol_table[i].symbol; i++) {
-      if (is_uni_seq (ucis_symbol_table[i].symbol)) {
-        symbol_found = true;
-        register_ucis(ucis_symbol_table[i].code + 2);
-        break;
-      }
-    }
-    if (!symbol_found) {
-      qk_ucis_symbol_fallback();
-    }
-    unicode_input_finish();
-
-    qk_ucis_state.in_progress = false;
-    return false;
-  }
-  return true;
-}
-#endif
diff --git a/quantum/process_keycode/process_unicode.h b/quantum/process_keycode/process_unicode.h
index f17cfa6cf..7ed9e54d5 100644
--- a/quantum/process_keycode/process_unicode.h
+++ b/quantum/process_keycode/process_unicode.h
@@ -21,42 +21,6 @@ void register_hex(uint16_t hex);
 
 bool process_unicode(uint16_t keycode, keyrecord_t *record);
 
-#ifdef UNICODEMAP_ENABLE
-void unicode_map_input_error(void);
-bool process_unicode_map(uint16_t keycode, keyrecord_t *record);
-#endif
-
-#ifdef UCIS_ENABLE
-#ifndef UCIS_MAX_SYMBOL_LENGTH
-#define UCIS_MAX_SYMBOL_LENGTH 32
-#endif
-
-typedef struct {
-  char *symbol;
-  char *code;
-} qk_ucis_symbol_t;
-
-typedef struct {
-  uint8_t count;
-  uint16_t codes[UCIS_MAX_SYMBOL_LENGTH];
-  bool in_progress:1;
-} qk_ucis_state_t;
-
-extern qk_ucis_state_t qk_ucis_state;
-
-#define UCIS_TABLE(...) {__VA_ARGS__, {NULL, NULL}}
-#define UCIS_SYM(name, code) {name, #code}
-
-extern const qk_ucis_symbol_t ucis_symbol_table[];
-
-void qk_ucis_start(void);
-void qk_ucis_start_user(void);
-void qk_ucis_symbol_fallback (void);
-void register_ucis(const char *hex);
-bool process_ucis (uint16_t keycode, keyrecord_t *record);
-
-#endif
-
 #define UC_BSPC	UC(0x0008)
 
 #define UC_SPC	UC(0x0020)
diff --git a/quantum/process_keycode/process_unicodemap.c b/quantum/process_keycode/process_unicodemap.c
new file mode 100644
index 000000000..b8cdeaa97
--- /dev/null
+++ b/quantum/process_keycode/process_unicodemap.c
@@ -0,0 +1,54 @@
+#include "process_unicode_map.h"
+
+__attribute__((weak))
+const uint32_t PROGMEM unicode_map[] = {
+};
+
+void register_hex32(uint32_t hex) {
+  uint8_t onzerostart = 1;
+  for(int i = 7; i >= 0; i--) {
+    if (i <= 3) {
+      onzerostart = 0;
+    }
+    uint8_t digit = ((hex >> (i*4)) & 0xF);
+    if (digit == 0) {
+      if (onzerostart == 0) {
+        register_code(hex_to_keycode(digit));
+        unregister_code(hex_to_keycode(digit));
+      }
+    } else {
+      register_code(hex_to_keycode(digit));
+      unregister_code(hex_to_keycode(digit));
+      onzerostart = 0;
+    }
+  }
+}
+
+__attribute__((weak))
+void unicode_map_input_error() {}
+
+bool process_unicode_map(uint16_t keycode, keyrecord_t *record) {
+  if ((keycode & QK_UNICODE_MAP) == QK_UNICODE_MAP && record->event.pressed) {
+    const uint32_t* map = unicode_map;
+    uint16_t index = keycode - QK_UNICODE_MAP;
+    uint32_t code = pgm_read_dword_far(&map[index]);
+    if (code > 0xFFFF && code <= 0x10ffff && input_mode == UC_OSX) {
+      // Convert to UTF-16 surrogate pair
+      code -= 0x10000;
+      uint32_t lo = code & 0x3ff;
+      uint32_t hi = (code & 0xffc00) >> 10;
+      unicode_input_start();
+      register_hex32(hi + 0xd800);
+      register_hex32(lo + 0xdc00);
+      unicode_input_finish();
+    } else if ((code > 0x10ffff && input_mode == UC_OSX) || (code > 0xFFFFF && input_mode == UC_LNX)) {
+      // when character is out of range supported by the OS
+      unicode_map_input_error();
+    } else {
+      unicode_input_start();
+      register_hex32(code);
+      unicode_input_finish();
+    }
+  }
+  return true;
+}
\ No newline at end of file
diff --git a/quantum/process_keycode/process_unicodemap.h b/quantum/process_keycode/process_unicodemap.h
new file mode 100644
index 000000000..291bd8de0
--- /dev/null
+++ b/quantum/process_keycode/process_unicodemap.h
@@ -0,0 +1,8 @@
+#ifndef PROCESS_UNICODEMAP_H
+#define PROCESS_UNICODEMAP_H
+
+#include "quantum.h"
+
+void unicode_map_input_error(void);
+bool process_unicode_map(uint16_t keycode, keyrecord_t *record);
+#endif
\ No newline at end of file
-- 
cgit v1.2.3


From 09add35e7f0b17f720862bc9b0f8478763937328 Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Wed, 15 Feb 2017 17:09:35 -0500
Subject: add unicode common file, get names right

---
 quantum/process_keycode/process_ucis.h           |   1 +
 quantum/process_keycode/process_unicode.c        |  85 ---------------
 quantum/process_keycode/process_unicode.h        | 124 +--------------------
 quantum/process_keycode/process_unicode_common.h | 130 +++++++++++++++++++++++
 quantum/process_keycode/process_unicodemap.c     |   2 +-
 quantum/process_keycode/process_unicodemap.h     |   1 +
 6 files changed, 134 insertions(+), 209 deletions(-)
 create mode 100644 quantum/process_keycode/process_unicode_common.h

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_ucis.h b/quantum/process_keycode/process_ucis.h
index 520db8042..4332f57b3 100644
--- a/quantum/process_keycode/process_ucis.h
+++ b/quantum/process_keycode/process_ucis.h
@@ -2,6 +2,7 @@
 #define PROCESS_UCIS_H
 
 #include "quantum.h"
+#include "process_unicode_common.h"
 
 #ifndef UCIS_MAX_SYMBOL_LENGTH
 #define UCIS_MAX_SYMBOL_LENGTH 32
diff --git a/quantum/process_keycode/process_unicode.c b/quantum/process_keycode/process_unicode.c
index 898e168a3..ccae6fdca 100644
--- a/quantum/process_keycode/process_unicode.c
+++ b/quantum/process_keycode/process_unicode.c
@@ -1,91 +1,6 @@
 #include "process_unicode.h"
 #include "action_util.h"
 
-static uint8_t input_mode;
-uint8_t mods;
-
-void set_unicode_input_mode(uint8_t os_target)
-{
-  input_mode = os_target;
-}
-
-uint8_t get_unicode_input_mode(void) {
-  return input_mode;
-}
-
-__attribute__((weak))
-void unicode_input_start (void) {
-  // save current mods
-  mods = keyboard_report->mods;
-
-  // unregister all mods to start from clean state
-  if (mods & MOD_BIT(KC_LSFT)) unregister_code(KC_LSFT);
-  if (mods & MOD_BIT(KC_RSFT)) unregister_code(KC_RSFT);
-  if (mods & MOD_BIT(KC_LCTL)) unregister_code(KC_LCTL);
-  if (mods & MOD_BIT(KC_RCTL)) unregister_code(KC_RCTL);
-  if (mods & MOD_BIT(KC_LALT)) unregister_code(KC_LALT);
-  if (mods & MOD_BIT(KC_RALT)) unregister_code(KC_RALT);
-  if (mods & MOD_BIT(KC_LGUI)) unregister_code(KC_LGUI);
-  if (mods & MOD_BIT(KC_RGUI)) unregister_code(KC_RGUI);
-
-  switch(input_mode) {
-  case UC_OSX:
-    register_code(KC_LALT);
-    break;
-  case UC_LNX:
-    register_code(KC_LCTL);
-    register_code(KC_LSFT);
-    register_code(KC_U);
-    unregister_code(KC_U);
-    unregister_code(KC_LSFT);
-    unregister_code(KC_LCTL);
-    break;
-  case UC_WIN:
-    register_code(KC_LALT);
-    register_code(KC_PPLS);
-    unregister_code(KC_PPLS);
-    break;
-  case UC_WINC:
-    register_code(KC_RALT);
-    unregister_code(KC_RALT);
-    register_code(KC_U);
-    unregister_code(KC_U);
-  }
-  wait_ms(UNICODE_TYPE_DELAY);
-}
-
-__attribute__((weak))
-void unicode_input_finish (void) {
-  switch(input_mode) {
-    case UC_OSX:
-    case UC_WIN:
-      unregister_code(KC_LALT);
-      break;
-    case UC_LNX:
-      register_code(KC_SPC);
-      unregister_code(KC_SPC);
-      break;
-  }
-
-  // reregister previously set mods
-  if (mods & MOD_BIT(KC_LSFT)) register_code(KC_LSFT);
-  if (mods & MOD_BIT(KC_RSFT)) register_code(KC_RSFT);
-  if (mods & MOD_BIT(KC_LCTL)) register_code(KC_LCTL);
-  if (mods & MOD_BIT(KC_RCTL)) register_code(KC_RCTL);
-  if (mods & MOD_BIT(KC_LALT)) register_code(KC_LALT);
-  if (mods & MOD_BIT(KC_RALT)) register_code(KC_RALT);
-  if (mods & MOD_BIT(KC_LGUI)) register_code(KC_LGUI);
-  if (mods & MOD_BIT(KC_RGUI)) register_code(KC_RGUI);
-}
-
-void register_hex(uint16_t hex) {
-  for(int i = 3; i >= 0; i--) {
-    uint8_t digit = ((hex >> (i*4)) & 0xF);
-    register_code(hex_to_keycode(digit));
-    unregister_code(hex_to_keycode(digit));
-  }
-}
-
 bool process_unicode(uint16_t keycode, keyrecord_t *record) {
   if (keycode > QK_UNICODE && record->event.pressed) {
     uint16_t unicode = keycode & 0x7FFF;
diff --git a/quantum/process_keycode/process_unicode.h b/quantum/process_keycode/process_unicode.h
index 7ed9e54d5..4c21f11eb 100644
--- a/quantum/process_keycode/process_unicode.h
+++ b/quantum/process_keycode/process_unicode.h
@@ -2,130 +2,8 @@
 #define PROCESS_UNICODE_H
 
 #include "quantum.h"
-
-#define UC_OSX 0  // Mac OS X
-#define UC_LNX 1  // Linux
-#define UC_WIN 2  // Windows 'HexNumpad'
-#define UC_BSD 3  // BSD (not implemented)
-#define UC_WINC 4 // WinCompose https://github.com/samhocevar/wincompose
-
-#ifndef UNICODE_TYPE_DELAY
-#define UNICODE_TYPE_DELAY 10
-#endif
-
-void set_unicode_input_mode(uint8_t os_target);
-uint8_t get_unicode_input_mode(void);
-void unicode_input_start(void);
-void unicode_input_finish(void);
-void register_hex(uint16_t hex);
+#include "process_unicode_common.h"
 
 bool process_unicode(uint16_t keycode, keyrecord_t *record);
 
-#define UC_BSPC	UC(0x0008)
-
-#define UC_SPC	UC(0x0020)
-
-#define UC_EXLM	UC(0x0021)
-#define UC_DQUT	UC(0x0022)
-#define UC_HASH	UC(0x0023)
-#define UC_DLR	UC(0x0024)
-#define UC_PERC	UC(0x0025)
-#define UC_AMPR	UC(0x0026)
-#define UC_QUOT	UC(0x0027)
-#define UC_LPRN	UC(0x0028)
-#define UC_RPRN	UC(0x0029)
-#define UC_ASTR	UC(0x002A)
-#define UC_PLUS	UC(0x002B)
-#define UC_COMM	UC(0x002C)
-#define UC_DASH	UC(0x002D)
-#define UC_DOT	UC(0x002E)
-#define UC_SLSH	UC(0x002F)
-
-#define UC_0	UC(0x0030)
-#define UC_1	UC(0x0031)
-#define UC_2	UC(0x0032)
-#define UC_3	UC(0x0033)
-#define UC_4	UC(0x0034)
-#define UC_5	UC(0x0035)
-#define UC_6	UC(0x0036)
-#define UC_7	UC(0x0037)
-#define UC_8	UC(0x0038)
-#define UC_9	UC(0x0039)
-
-#define UC_COLN UC(0x003A)
-#define UC_SCLN UC(0x003B)
-#define UC_LT	UC(0x003C)
-#define UC_EQL	UC(0x003D)
-#define UC_GT	UC(0x003E)
-#define UC_QUES	UC(0x003F)
-#define UC_AT 	UC(0x0040)
-
-#define UC_A 	UC(0x0041)
-#define UC_B 	UC(0x0042)
-#define UC_C 	UC(0x0043)
-#define UC_D 	UC(0x0044)
-#define UC_E 	UC(0x0045)
-#define UC_F 	UC(0x0046)
-#define UC_G 	UC(0x0047)
-#define UC_H 	UC(0x0048)
-#define UC_I 	UC(0x0049)
-#define UC_J 	UC(0x004A)
-#define UC_K 	UC(0x004B)
-#define UC_L 	UC(0x004C)
-#define UC_M 	UC(0x004D)
-#define UC_N 	UC(0x004E)
-#define UC_O 	UC(0x004F)
-#define UC_P 	UC(0x0050)
-#define UC_Q 	UC(0x0051)
-#define UC_R 	UC(0x0052)
-#define UC_S 	UC(0x0053)
-#define UC_T 	UC(0x0054)
-#define UC_U 	UC(0x0055)
-#define UC_V 	UC(0x0056)
-#define UC_W 	UC(0x0057)
-#define UC_X 	UC(0x0058)
-#define UC_Y 	UC(0x0059)
-#define UC_Z 	UC(0x005A)
-
-#define UC_LBRC	UC(0x005B)
-#define UC_BSLS	UC(0x005C)
-#define UC_RBRC	UC(0x005D)
-#define UC_CIRM	UC(0x005E)
-#define UC_UNDR	UC(0x005F)
-
-#define UC_GRV 	UC(0x0060)
-
-#define UC_a 	UC(0x0061)
-#define UC_b 	UC(0x0062)
-#define UC_c 	UC(0x0063)
-#define UC_d 	UC(0x0064)
-#define UC_e 	UC(0x0065)
-#define UC_f 	UC(0x0066)
-#define UC_g 	UC(0x0067)
-#define UC_h 	UC(0x0068)
-#define UC_i 	UC(0x0069)
-#define UC_j 	UC(0x006A)
-#define UC_k 	UC(0x006B)
-#define UC_l 	UC(0x006C)
-#define UC_m 	UC(0x006D)
-#define UC_n 	UC(0x006E)
-#define UC_o 	UC(0x006F)
-#define UC_p 	UC(0x0070)
-#define UC_q 	UC(0x0071)
-#define UC_r 	UC(0x0072)
-#define UC_s 	UC(0x0073)
-#define UC_t 	UC(0x0074)
-#define UC_u 	UC(0x0075)
-#define UC_v 	UC(0x0076)
-#define UC_w 	UC(0x0077)
-#define UC_x 	UC(0x0078)
-#define UC_y 	UC(0x0079)
-#define UC_z 	UC(0x007A)
-
-#define UC_LCBR	UC(0x007B)
-#define UC_PIPE	UC(0x007C)
-#define UC_RCBR	UC(0x007D)
-#define UC_TILD	UC(0x007E)
-#define UC_DEL	UC(0x007F)
-
 #endif
diff --git a/quantum/process_keycode/process_unicode_common.h b/quantum/process_keycode/process_unicode_common.h
new file mode 100644
index 000000000..171ecbca1
--- /dev/null
+++ b/quantum/process_keycode/process_unicode_common.h
@@ -0,0 +1,130 @@
+#ifndef PROCESS_UNICODE_COMMON_H
+#define PROCESS_UNICODE_COMMON_H
+
+#include "quantum.h"
+
+#ifndef UNICODE_TYPE_DELAY
+#define UNICODE_TYPE_DELAY 10
+#endif
+
+void set_unicode_input_mode(uint8_t os_target);
+uint8_t get_unicode_input_mode(void);
+void unicode_input_start(void);
+void unicode_input_finish(void);
+void register_hex(uint16_t hex);
+
+
+#define UC_OSX 0  // Mac OS X
+#define UC_LNX 1  // Linux
+#define UC_WIN 2  // Windows 'HexNumpad'
+#define UC_BSD 3  // BSD (not implemented)
+#define UC_WINC 4 // WinCompose https://github.com/samhocevar/wincompose
+
+#define UC_BSPC	UC(0x0008)
+
+#define UC_SPC	UC(0x0020)
+
+#define UC_EXLM	UC(0x0021)
+#define UC_DQUT	UC(0x0022)
+#define UC_HASH	UC(0x0023)
+#define UC_DLR	UC(0x0024)
+#define UC_PERC	UC(0x0025)
+#define UC_AMPR	UC(0x0026)
+#define UC_QUOT	UC(0x0027)
+#define UC_LPRN	UC(0x0028)
+#define UC_RPRN	UC(0x0029)
+#define UC_ASTR	UC(0x002A)
+#define UC_PLUS	UC(0x002B)
+#define UC_COMM	UC(0x002C)
+#define UC_DASH	UC(0x002D)
+#define UC_DOT	UC(0x002E)
+#define UC_SLSH	UC(0x002F)
+
+#define UC_0	UC(0x0030)
+#define UC_1	UC(0x0031)
+#define UC_2	UC(0x0032)
+#define UC_3	UC(0x0033)
+#define UC_4	UC(0x0034)
+#define UC_5	UC(0x0035)
+#define UC_6	UC(0x0036)
+#define UC_7	UC(0x0037)
+#define UC_8	UC(0x0038)
+#define UC_9	UC(0x0039)
+
+#define UC_COLN UC(0x003A)
+#define UC_SCLN UC(0x003B)
+#define UC_LT	UC(0x003C)
+#define UC_EQL	UC(0x003D)
+#define UC_GT	UC(0x003E)
+#define UC_QUES	UC(0x003F)
+#define UC_AT 	UC(0x0040)
+
+#define UC_A 	UC(0x0041)
+#define UC_B 	UC(0x0042)
+#define UC_C 	UC(0x0043)
+#define UC_D 	UC(0x0044)
+#define UC_E 	UC(0x0045)
+#define UC_F 	UC(0x0046)
+#define UC_G 	UC(0x0047)
+#define UC_H 	UC(0x0048)
+#define UC_I 	UC(0x0049)
+#define UC_J 	UC(0x004A)
+#define UC_K 	UC(0x004B)
+#define UC_L 	UC(0x004C)
+#define UC_M 	UC(0x004D)
+#define UC_N 	UC(0x004E)
+#define UC_O 	UC(0x004F)
+#define UC_P 	UC(0x0050)
+#define UC_Q 	UC(0x0051)
+#define UC_R 	UC(0x0052)
+#define UC_S 	UC(0x0053)
+#define UC_T 	UC(0x0054)
+#define UC_U 	UC(0x0055)
+#define UC_V 	UC(0x0056)
+#define UC_W 	UC(0x0057)
+#define UC_X 	UC(0x0058)
+#define UC_Y 	UC(0x0059)
+#define UC_Z 	UC(0x005A)
+
+#define UC_LBRC	UC(0x005B)
+#define UC_BSLS	UC(0x005C)
+#define UC_RBRC	UC(0x005D)
+#define UC_CIRM	UC(0x005E)
+#define UC_UNDR	UC(0x005F)
+
+#define UC_GRV 	UC(0x0060)
+
+#define UC_a 	UC(0x0061)
+#define UC_b 	UC(0x0062)
+#define UC_c 	UC(0x0063)
+#define UC_d 	UC(0x0064)
+#define UC_e 	UC(0x0065)
+#define UC_f 	UC(0x0066)
+#define UC_g 	UC(0x0067)
+#define UC_h 	UC(0x0068)
+#define UC_i 	UC(0x0069)
+#define UC_j 	UC(0x006A)
+#define UC_k 	UC(0x006B)
+#define UC_l 	UC(0x006C)
+#define UC_m 	UC(0x006D)
+#define UC_n 	UC(0x006E)
+#define UC_o 	UC(0x006F)
+#define UC_p 	UC(0x0070)
+#define UC_q 	UC(0x0071)
+#define UC_r 	UC(0x0072)
+#define UC_s 	UC(0x0073)
+#define UC_t 	UC(0x0074)
+#define UC_u 	UC(0x0075)
+#define UC_v 	UC(0x0076)
+#define UC_w 	UC(0x0077)
+#define UC_x 	UC(0x0078)
+#define UC_y 	UC(0x0079)
+#define UC_z 	UC(0x007A)
+
+#define UC_LCBR	UC(0x007B)
+#define UC_PIPE	UC(0x007C)
+#define UC_RCBR	UC(0x007D)
+#define UC_TILD	UC(0x007E)
+#define UC_DEL	UC(0x007F)
+
+#endif
\ No newline at end of file
diff --git a/quantum/process_keycode/process_unicodemap.c b/quantum/process_keycode/process_unicodemap.c
index b8cdeaa97..37f10df86 100644
--- a/quantum/process_keycode/process_unicodemap.c
+++ b/quantum/process_keycode/process_unicodemap.c
@@ -1,4 +1,4 @@
-#include "process_unicode_map.h"
+#include "process_unicodemap.h"
 
 __attribute__((weak))
 const uint32_t PROGMEM unicode_map[] = {
diff --git a/quantum/process_keycode/process_unicodemap.h b/quantum/process_keycode/process_unicodemap.h
index 291bd8de0..64a7a0109 100644
--- a/quantum/process_keycode/process_unicodemap.h
+++ b/quantum/process_keycode/process_unicodemap.h
@@ -2,6 +2,7 @@
 #define PROCESS_UNICODEMAP_H
 
 #include "quantum.h"
+#include "process_unicode_common.h"
 
 void unicode_map_input_error(void);
 bool process_unicode_map(uint16_t keycode, keyrecord_t *record);
-- 
cgit v1.2.3


From 1bb574fe48bf73af4f3a4dadcff62599fd5dbb9a Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Wed, 15 Feb 2017 17:09:47 -0500
Subject: add unicode common file, get names right

---
 quantum/process_keycode/process_unicode_common.c | 86 ++++++++++++++++++++++++
 1 file changed, 86 insertions(+)
 create mode 100644 quantum/process_keycode/process_unicode_common.c

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_unicode_common.c b/quantum/process_keycode/process_unicode_common.c
new file mode 100644
index 000000000..1a9d470c9
--- /dev/null
+++ b/quantum/process_keycode/process_unicode_common.c
@@ -0,0 +1,86 @@
+#include "process_unicode_common.h"
+
+static uint8_t input_mode;
+uint8_t mods;
+
+void set_unicode_input_mode(uint8_t os_target)
+{
+  input_mode = os_target;
+}
+
+uint8_t get_unicode_input_mode(void) {
+  return input_mode;
+}
+
+__attribute__((weak))
+void unicode_input_start (void) {
+  // save current mods
+  mods = keyboard_report->mods;
+
+  // unregister all mods to start from clean state
+  if (mods & MOD_BIT(KC_LSFT)) unregister_code(KC_LSFT);
+  if (mods & MOD_BIT(KC_RSFT)) unregister_code(KC_RSFT);
+  if (mods & MOD_BIT(KC_LCTL)) unregister_code(KC_LCTL);
+  if (mods & MOD_BIT(KC_RCTL)) unregister_code(KC_RCTL);
+  if (mods & MOD_BIT(KC_LALT)) unregister_code(KC_LALT);
+  if (mods & MOD_BIT(KC_RALT)) unregister_code(KC_RALT);
+  if (mods & MOD_BIT(KC_LGUI)) unregister_code(KC_LGUI);
+  if (mods & MOD_BIT(KC_RGUI)) unregister_code(KC_RGUI);
+
+  switch(input_mode) {
+  case UC_OSX:
+    register_code(KC_LALT);
+    break;
+  case UC_LNX:
+    register_code(KC_LCTL);
+    register_code(KC_LSFT);
+    register_code(KC_U);
+    unregister_code(KC_U);
+    unregister_code(KC_LSFT);
+    unregister_code(KC_LCTL);
+    break;
+  case UC_WIN:
+    register_code(KC_LALT);
+    register_code(KC_PPLS);
+    unregister_code(KC_PPLS);
+    break;
+  case UC_WINC:
+    register_code(KC_RALT);
+    unregister_code(KC_RALT);
+    register_code(KC_U);
+    unregister_code(KC_U);
+  }
+  wait_ms(UNICODE_TYPE_DELAY);
+}
+
+__attribute__((weak))
+void unicode_input_finish (void) {
+  switch(input_mode) {
+    case UC_OSX:
+    case UC_WIN:
+      unregister_code(KC_LALT);
+      break;
+    case UC_LNX:
+      register_code(KC_SPC);
+      unregister_code(KC_SPC);
+      break;
+  }
+
+  // reregister previously set mods
+  if (mods & MOD_BIT(KC_LSFT)) register_code(KC_LSFT);
+  if (mods & MOD_BIT(KC_RSFT)) register_code(KC_RSFT);
+  if (mods & MOD_BIT(KC_LCTL)) register_code(KC_LCTL);
+  if (mods & MOD_BIT(KC_RCTL)) register_code(KC_RCTL);
+  if (mods & MOD_BIT(KC_LALT)) register_code(KC_LALT);
+  if (mods & MOD_BIT(KC_RALT)) register_code(KC_RALT);
+  if (mods & MOD_BIT(KC_LGUI)) register_code(KC_LGUI);
+  if (mods & MOD_BIT(KC_RGUI)) register_code(KC_RGUI);
+}
+
+void register_hex(uint16_t hex) {
+  for(int i = 3; i >= 0; i--) {
+    uint8_t digit = ((hex >> (i*4)) & 0xF);
+    register_code(hex_to_keycode(digit));
+    unregister_code(hex_to_keycode(digit));
+  }
+}
\ No newline at end of file
-- 
cgit v1.2.3


From c2a9acffd712145dc8b924005feb060c5ac3e2ff Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Wed, 15 Feb 2017 17:39:51 -0500
Subject: publicise variables

---
 quantum/process_keycode/process_unicode_common.c | 3 ---
 quantum/process_keycode/process_unicode_common.h | 4 +++-
 2 files changed, 3 insertions(+), 4 deletions(-)

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_unicode_common.c b/quantum/process_keycode/process_unicode_common.c
index 1a9d470c9..baeee6d08 100644
--- a/quantum/process_keycode/process_unicode_common.c
+++ b/quantum/process_keycode/process_unicode_common.c
@@ -1,8 +1,5 @@
 #include "process_unicode_common.h"
 
-static uint8_t input_mode;
-uint8_t mods;
-
 void set_unicode_input_mode(uint8_t os_target)
 {
   input_mode = os_target;
diff --git a/quantum/process_keycode/process_unicode_common.h b/quantum/process_keycode/process_unicode_common.h
index 171ecbca1..9c26cfb07 100644
--- a/quantum/process_keycode/process_unicode_common.h
+++ b/quantum/process_keycode/process_unicode_common.h
@@ -7,13 +7,15 @@
 #define UNICODE_TYPE_DELAY 10
 #endif
 
+static uint8_t input_mode;
+uint8_t mods;
+
 void set_unicode_input_mode(uint8_t os_target);
 uint8_t get_unicode_input_mode(void);
 void unicode_input_start(void);
 void unicode_input_finish(void);
 void register_hex(uint16_t hex);
 
-
 #define UC_OSX 0  // Mac OS X
 #define UC_LNX 1  // Linux
 #define UC_WIN 2  // Windows 'HexNumpad'
-- 
cgit v1.2.3


From f89499e255afbe5f8adeae5e71367f3d358af527 Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Wed, 15 Feb 2017 18:14:07 -0500
Subject: unique variable name

---
 quantum/process_keycode/process_unicode_common.c | 36 ++++++++++++------------
 quantum/process_keycode/process_unicode_common.h |  2 +-
 2 files changed, 19 insertions(+), 19 deletions(-)

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_unicode_common.c b/quantum/process_keycode/process_unicode_common.c
index baeee6d08..d924c364a 100644
--- a/quantum/process_keycode/process_unicode_common.c
+++ b/quantum/process_keycode/process_unicode_common.c
@@ -12,17 +12,17 @@ uint8_t get_unicode_input_mode(void) {
 __attribute__((weak))
 void unicode_input_start (void) {
   // save current mods
-  mods = keyboard_report->mods;
+  unicode_mods = keyboard_report->mods;
 
   // unregister all mods to start from clean state
-  if (mods & MOD_BIT(KC_LSFT)) unregister_code(KC_LSFT);
-  if (mods & MOD_BIT(KC_RSFT)) unregister_code(KC_RSFT);
-  if (mods & MOD_BIT(KC_LCTL)) unregister_code(KC_LCTL);
-  if (mods & MOD_BIT(KC_RCTL)) unregister_code(KC_RCTL);
-  if (mods & MOD_BIT(KC_LALT)) unregister_code(KC_LALT);
-  if (mods & MOD_BIT(KC_RALT)) unregister_code(KC_RALT);
-  if (mods & MOD_BIT(KC_LGUI)) unregister_code(KC_LGUI);
-  if (mods & MOD_BIT(KC_RGUI)) unregister_code(KC_RGUI);
+  if (unicode_mods & MOD_BIT(KC_LSFT)) unregister_code(KC_LSFT);
+  if (unicode_mods & MOD_BIT(KC_RSFT)) unregister_code(KC_RSFT);
+  if (unicode_mods & MOD_BIT(KC_LCTL)) unregister_code(KC_LCTL);
+  if (unicode_mods & MOD_BIT(KC_RCTL)) unregister_code(KC_RCTL);
+  if (unicode_mods & MOD_BIT(KC_LALT)) unregister_code(KC_LALT);
+  if (unicode_mods & MOD_BIT(KC_RALT)) unregister_code(KC_RALT);
+  if (unicode_mods & MOD_BIT(KC_LGUI)) unregister_code(KC_LGUI);
+  if (unicode_mods & MOD_BIT(KC_RGUI)) unregister_code(KC_RGUI);
 
   switch(input_mode) {
   case UC_OSX:
@@ -63,15 +63,15 @@ void unicode_input_finish (void) {
       break;
   }
 
-  // reregister previously set mods
-  if (mods & MOD_BIT(KC_LSFT)) register_code(KC_LSFT);
-  if (mods & MOD_BIT(KC_RSFT)) register_code(KC_RSFT);
-  if (mods & MOD_BIT(KC_LCTL)) register_code(KC_LCTL);
-  if (mods & MOD_BIT(KC_RCTL)) register_code(KC_RCTL);
-  if (mods & MOD_BIT(KC_LALT)) register_code(KC_LALT);
-  if (mods & MOD_BIT(KC_RALT)) register_code(KC_RALT);
-  if (mods & MOD_BIT(KC_LGUI)) register_code(KC_LGUI);
-  if (mods & MOD_BIT(KC_RGUI)) register_code(KC_RGUI);
+  // reregister previously set unicode_mods
+  if (unicode_mods & MOD_BIT(KC_LSFT)) register_code(KC_LSFT);
+  if (unicode_mods & MOD_BIT(KC_RSFT)) register_code(KC_RSFT);
+  if (unicode_mods & MOD_BIT(KC_LCTL)) register_code(KC_LCTL);
+  if (unicode_mods & MOD_BIT(KC_RCTL)) register_code(KC_RCTL);
+  if (unicode_mods & MOD_BIT(KC_LALT)) register_code(KC_LALT);
+  if (unicode_mods & MOD_BIT(KC_RALT)) register_code(KC_RALT);
+  if (unicode_mods & MOD_BIT(KC_LGUI)) register_code(KC_LGUI);
+  if (unicode_mods & MOD_BIT(KC_RGUI)) register_code(KC_RGUI);
 }
 
 void register_hex(uint16_t hex) {
diff --git a/quantum/process_keycode/process_unicode_common.h b/quantum/process_keycode/process_unicode_common.h
index 9c26cfb07..aa233db22 100644
--- a/quantum/process_keycode/process_unicode_common.h
+++ b/quantum/process_keycode/process_unicode_common.h
@@ -8,7 +8,7 @@
 #endif
 
 static uint8_t input_mode;
-uint8_t mods;
+uint8_t unicode_mods;
 
 void set_unicode_input_mode(uint8_t os_target);
 uint8_t get_unicode_input_mode(void);
-- 
cgit v1.2.3


From 58823b4e0324f5b2861fc5a0f74f6faa3673f5dc Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Wed, 15 Feb 2017 23:20:35 -0500
Subject: fix weirdness with arm and mods

---
 quantum/process_keycode/process_unicode_common.c | 38 +++++++++++++-----------
 quantum/process_keycode/process_unicode_common.h |  1 -
 2 files changed, 20 insertions(+), 19 deletions(-)

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_unicode_common.c b/quantum/process_keycode/process_unicode_common.c
index d924c364a..31bc3b7ab 100644
--- a/quantum/process_keycode/process_unicode_common.c
+++ b/quantum/process_keycode/process_unicode_common.c
@@ -1,5 +1,7 @@
 #include "process_unicode_common.h"
 
+uint8_t mods;
+
 void set_unicode_input_mode(uint8_t os_target)
 {
   input_mode = os_target;
@@ -12,17 +14,17 @@ uint8_t get_unicode_input_mode(void) {
 __attribute__((weak))
 void unicode_input_start (void) {
   // save current mods
-  unicode_mods = keyboard_report->mods;
+  mods = keyboard_report->mods;
 
   // unregister all mods to start from clean state
-  if (unicode_mods & MOD_BIT(KC_LSFT)) unregister_code(KC_LSFT);
-  if (unicode_mods & MOD_BIT(KC_RSFT)) unregister_code(KC_RSFT);
-  if (unicode_mods & MOD_BIT(KC_LCTL)) unregister_code(KC_LCTL);
-  if (unicode_mods & MOD_BIT(KC_RCTL)) unregister_code(KC_RCTL);
-  if (unicode_mods & MOD_BIT(KC_LALT)) unregister_code(KC_LALT);
-  if (unicode_mods & MOD_BIT(KC_RALT)) unregister_code(KC_RALT);
-  if (unicode_mods & MOD_BIT(KC_LGUI)) unregister_code(KC_LGUI);
-  if (unicode_mods & MOD_BIT(KC_RGUI)) unregister_code(KC_RGUI);
+  if (mods & MOD_BIT(KC_LSFT)) unregister_code(KC_LSFT);
+  if (mods & MOD_BIT(KC_RSFT)) unregister_code(KC_RSFT);
+  if (mods & MOD_BIT(KC_LCTL)) unregister_code(KC_LCTL);
+  if (mods & MOD_BIT(KC_RCTL)) unregister_code(KC_RCTL);
+  if (mods & MOD_BIT(KC_LALT)) unregister_code(KC_LALT);
+  if (mods & MOD_BIT(KC_RALT)) unregister_code(KC_RALT);
+  if (mods & MOD_BIT(KC_LGUI)) unregister_code(KC_LGUI);
+  if (mods & MOD_BIT(KC_RGUI)) unregister_code(KC_RGUI);
 
   switch(input_mode) {
   case UC_OSX:
@@ -63,15 +65,15 @@ void unicode_input_finish (void) {
       break;
   }
 
-  // reregister previously set unicode_mods
-  if (unicode_mods & MOD_BIT(KC_LSFT)) register_code(KC_LSFT);
-  if (unicode_mods & MOD_BIT(KC_RSFT)) register_code(KC_RSFT);
-  if (unicode_mods & MOD_BIT(KC_LCTL)) register_code(KC_LCTL);
-  if (unicode_mods & MOD_BIT(KC_RCTL)) register_code(KC_RCTL);
-  if (unicode_mods & MOD_BIT(KC_LALT)) register_code(KC_LALT);
-  if (unicode_mods & MOD_BIT(KC_RALT)) register_code(KC_RALT);
-  if (unicode_mods & MOD_BIT(KC_LGUI)) register_code(KC_LGUI);
-  if (unicode_mods & MOD_BIT(KC_RGUI)) register_code(KC_RGUI);
+  // reregister previously set mods
+  if (mods & MOD_BIT(KC_LSFT)) register_code(KC_LSFT);
+  if (mods & MOD_BIT(KC_RSFT)) register_code(KC_RSFT);
+  if (mods & MOD_BIT(KC_LCTL)) register_code(KC_LCTL);
+  if (mods & MOD_BIT(KC_RCTL)) register_code(KC_RCTL);
+  if (mods & MOD_BIT(KC_LALT)) register_code(KC_LALT);
+  if (mods & MOD_BIT(KC_RALT)) register_code(KC_RALT);
+  if (mods & MOD_BIT(KC_LGUI)) register_code(KC_LGUI);
+  if (mods & MOD_BIT(KC_RGUI)) register_code(KC_RGUI);
 }
 
 void register_hex(uint16_t hex) {
diff --git a/quantum/process_keycode/process_unicode_common.h b/quantum/process_keycode/process_unicode_common.h
index aa233db22..1f25eae7d 100644
--- a/quantum/process_keycode/process_unicode_common.h
+++ b/quantum/process_keycode/process_unicode_common.h
@@ -8,7 +8,6 @@
 #endif
 
 static uint8_t input_mode;
-uint8_t unicode_mods;
 
 void set_unicode_input_mode(uint8_t os_target);
 uint8_t get_unicode_input_mode(void);
-- 
cgit v1.2.3


From 1ac5dc9e524444ef98cfab1d9822151a6bfb9621 Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Thu, 16 Feb 2017 11:37:46 -0500
Subject: fix travis and reduce warnings

---
 quantum/process_keycode/process_unicode_common.h | 1 +
 1 file changed, 1 insertion(+)

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_unicode_common.h b/quantum/process_keycode/process_unicode_common.h
index 1f25eae7d..864693cdd 100644
--- a/quantum/process_keycode/process_unicode_common.h
+++ b/quantum/process_keycode/process_unicode_common.h
@@ -7,6 +7,7 @@
 #define UNICODE_TYPE_DELAY 10
 #endif
 
+__attribute__ ((unused))
 static uint8_t input_mode;
 
 void set_unicode_input_mode(uint8_t os_target);
-- 
cgit v1.2.3


From e405ab4bc6ff47d189d99c4d51aadf60a642d82a Mon Sep 17 00:00:00 2001
From: Gabriel Young <gabeplaysdrums@live.com>
Date: Sat, 18 Feb 2017 03:12:13 -0800
Subject: initial implementation of polyphony using variable length array of
 notes on

---
 quantum/process_keycode/process_midi.c | 199 ++++++++++++++++++++++++++++++++-
 quantum/process_keycode/process_midi.h |   3 +
 2 files changed, 200 insertions(+), 2 deletions(-)

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c
index 577dad43a..bc48b3905 100644
--- a/quantum/process_keycode/process_midi.c
+++ b/quantum/process_keycode/process_midi.c
@@ -1,10 +1,204 @@
 #include "process_midi.h"
 
+#if 0
 bool midi_activated = false;
 uint8_t midi_starting_note = 0x0C;
 int midi_offset = 7;
+#endif
+
+typedef union {
+  uint16_t raw;
+  struct {
+    uint8_t octave   :4;
+    uint8_t velocity :4;
+    uint8_t channel  :4;
+  };
+} midi_config_t;
+
+midi_config_t midi_config;
+
+#define MIDI_INVALID_NOTE 0xFF
+
+#if 0
+typedef struct {
+    uint64_t low;
+    uint64_t high;
+} uint128_t;
+
+#if 0
+static void right_shift_uint128_t(uint128_t* val, uint8_t shift)
+{
+    uint64_t high_mask = ~0 >> (64 - shift);
+    uint64_t high_bits = (val->high & high_mask) << (64 - shift);
+    val->high = val->high >> shift;
+    val->low = (val->low >> shift) | high_bits;
+}
+#endif
+
+static uint64_t left_shift_uint64_t(uint64_t val, uint8_t shift)
+{
+    dprintf("left_shift_uint64_t(val, %c) ...\n", val, shift);
+    while (shift > 16u) {
+        dprintf("  left_shift_uint64_t: val=?, shift=%c\n", val, shift);
+        val <<= 16;
+        shift -= 16;
+    }
+    dprintf("  left_shift_uint64_t: val=?, shift=%c\n", val, shift);
+    val <<= shift;
+    return val;
+}
+
+static void set_bit_uint128_t(uint128_t* val, uint8_t shift)
+{
+    uint64_t x = 1u;
+
+    if (shift < 64)
+    {
+        x = left_shift_uint64_t(x, shift);
+        dprintf("x: %d\n", x);
+        dprintf("set_bit_uint128_t (%d): 0x%016X%016X\n", shift, 0, x);
+        val->low = val->low | left_shift_uint64_t(1u, shift);
+    }
+    else
+    {
+        x = left_shift_uint64_t(x, shift - 64);
+        dprintf("set_bit_uint128_t (%d): 0x%016X%016X\n", shift, x, 0);
+        val->high = val->high | left_shift_uint64_t(1u, shift - 64);
+    }
+}
+
+static void clear_bit_uint128_t(uint128_t* val, uint8_t shift)
+{
+    if (shift < 64)
+    {
+        val->low = val->low & ~left_shift_uint64_t(1u, shift);
+    }
+    else
+    {
+        val->high = val->high & ~left_shift_uint64_t(1u, shift - 64);
+    }
+}
 
-bool process_midi(uint16_t keycode, keyrecord_t *record) {
+static bool is_bit_set_uint128_t(const uint128_t* val, uint8_t shift)
+{
+    if (shift < 64)
+    {
+        return !!(val->low & (1u << shift));
+    }
+    else
+    {
+        return !!(val->high & (1u << (shift - 64)));
+    }
+}
+
+uint128_t note_status = { 0, 0 };
+#endif
+
+
+#define MIDI_MAX_NOTES_ON 10
+
+typedef struct {
+    uint8_t note;
+    uint8_t tone;
+} midi_notes_on_array_entry_t;
+
+typedef struct {
+    uint8_t length;
+    midi_notes_on_array_entry_t values[MIDI_MAX_NOTES_ON];
+} midi_notes_on_array_t;
+
+static midi_notes_on_array_t notes_on;
+
+inline uint8_t compute_velocity(uint8_t setting)
+{
+    return (setting + 1) * (128 / (MIDI_VELOCITY_MAX - MIDI_VELOCITY_MIN + 1));
+}
+
+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;
+    notes_on.length = 0;
+}
+
+bool process_midi(uint16_t keycode, keyrecord_t *record)
+{
+    switch (keycode) {
+        case MIDI_TONE_MIN ... MIDI_TONE_MAX:
+        {
+            uint8_t channel = midi_config.channel;
+            uint8_t tone = keycode - MIDI_TONE_MIN;
+            uint8_t velocity = compute_velocity(midi_config.velocity);
+            if (record->event.pressed && notes_on.length < MIDI_MAX_NOTES_ON) {
+                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);
+                notes_on.values[notes_on.length].note = note;
+                notes_on.values[notes_on.length].tone = tone;
+                notes_on.length++;
+            }
+            else {
+                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) {
+                        midi_send_noteoff(&midi_device, channel, note, velocity);
+                        dprintf("midi noteoff channel:%d note:%d velocity:%d\n", channel, note, velocity);
+
+                        for (uint8_t j=i; j < notes_on.length - 1; j++)
+                        {
+                            notes_on.values[j] = notes_on.values[j + 1];
+                        }
+
+                        notes_on.length--;
+                        break;
+                    }
+                }
+            }
+            return false;
+        }
+        case MIDI_OCTAVE_MIN ... MIDI_OCTAVE_MAX:
+            if (record->event.pressed)
+                midi_config.octave = keycode - MIDI_OCTAVE_MIN;
+            return false;
+        case MI_OCTD:
+            if (record->event.pressed && midi_config.octave > 0)
+                midi_config.octave--;
+            return false;
+        case MI_OCTU:
+            if (record->event.pressed && midi_config.octave < (MIDI_OCTAVE_MAX - MIDI_OCTAVE_MIN))
+                midi_config.octave++;
+            return false;
+        case MIDI_VELOCITY_MIN ... MIDI_VELOCITY_MAX:
+            if (record->event.pressed)
+                midi_config.velocity = keycode - MIDI_VELOCITY_MIN;
+            return false;
+        case MI_VELD:
+            if (record->event.pressed && midi_config.velocity > 0)
+                midi_config.velocity--;
+            return false;
+        case MI_VELU:
+            if (record->event.pressed)
+                midi_config.velocity++;
+            return false;
+        case MIDI_CHANNEL_MIN ... MIDI_CHANNEL_MAX:
+            if (record->event.pressed)
+                midi_config.channel = keycode - MIDI_CHANNEL_MIN;
+            return false;
+        case MI_CHD:
+            if (record->event.pressed)
+                midi_config.channel--;
+            return false;
+        case MI_CHU:
+            if (record->event.pressed)
+                midi_config.channel++;
+            return false;
+        case MI_SUS:
+            //TODO
+            return false;
+    };
+
+#if 0
     if (keycode == MI_ON && record->event.pressed) {
       midi_activated = true;
 #ifdef AUDIO_ENABLE
@@ -64,5 +258,6 @@ bool process_midi(uint16_t keycode, keyrecord_t *record) {
       if (keycode < 0xFF) // ignores all normal keycodes, but lets RAISE, LOWER, etc through
         return false;
     }
-  return true;
+#endif
+    return true;
 }
diff --git a/quantum/process_keycode/process_midi.h b/quantum/process_keycode/process_midi.h
index acd4fc1b1..b0e0aeb83 100644
--- a/quantum/process_keycode/process_midi.h
+++ b/quantum/process_keycode/process_midi.h
@@ -2,6 +2,9 @@
 #define PROCESS_MIDI_H
 
 #include "quantum.h"
+#include "midi.h"
+
+void midi_init(void);
 
 bool process_midi(uint16_t keycode, keyrecord_t *record);
 
-- 
cgit v1.2.3


From f2b2e05f126403c8a6f0fc3d542beddac7974e9b Mon Sep 17 00:00:00 2001
From: Gabriel Young <gabeplaysdrums@live.com>
Date: Sat, 18 Feb 2017 03:13:43 -0800
Subject: clean up commented code

---
 quantum/process_keycode/process_midi.c | 137 ---------------------------------
 1 file changed, 137 deletions(-)

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c
index bc48b3905..acaae7c30 100644
--- a/quantum/process_keycode/process_midi.c
+++ b/quantum/process_keycode/process_midi.c
@@ -19,82 +19,6 @@ midi_config_t midi_config;
 
 #define MIDI_INVALID_NOTE 0xFF
 
-#if 0
-typedef struct {
-    uint64_t low;
-    uint64_t high;
-} uint128_t;
-
-#if 0
-static void right_shift_uint128_t(uint128_t* val, uint8_t shift)
-{
-    uint64_t high_mask = ~0 >> (64 - shift);
-    uint64_t high_bits = (val->high & high_mask) << (64 - shift);
-    val->high = val->high >> shift;
-    val->low = (val->low >> shift) | high_bits;
-}
-#endif
-
-static uint64_t left_shift_uint64_t(uint64_t val, uint8_t shift)
-{
-    dprintf("left_shift_uint64_t(val, %c) ...\n", val, shift);
-    while (shift > 16u) {
-        dprintf("  left_shift_uint64_t: val=?, shift=%c\n", val, shift);
-        val <<= 16;
-        shift -= 16;
-    }
-    dprintf("  left_shift_uint64_t: val=?, shift=%c\n", val, shift);
-    val <<= shift;
-    return val;
-}
-
-static void set_bit_uint128_t(uint128_t* val, uint8_t shift)
-{
-    uint64_t x = 1u;
-
-    if (shift < 64)
-    {
-        x = left_shift_uint64_t(x, shift);
-        dprintf("x: %d\n", x);
-        dprintf("set_bit_uint128_t (%d): 0x%016X%016X\n", shift, 0, x);
-        val->low = val->low | left_shift_uint64_t(1u, shift);
-    }
-    else
-    {
-        x = left_shift_uint64_t(x, shift - 64);
-        dprintf("set_bit_uint128_t (%d): 0x%016X%016X\n", shift, x, 0);
-        val->high = val->high | left_shift_uint64_t(1u, shift - 64);
-    }
-}
-
-static void clear_bit_uint128_t(uint128_t* val, uint8_t shift)
-{
-    if (shift < 64)
-    {
-        val->low = val->low & ~left_shift_uint64_t(1u, shift);
-    }
-    else
-    {
-        val->high = val->high & ~left_shift_uint64_t(1u, shift - 64);
-    }
-}
-
-static bool is_bit_set_uint128_t(const uint128_t* val, uint8_t shift)
-{
-    if (shift < 64)
-    {
-        return !!(val->low & (1u << shift));
-    }
-    else
-    {
-        return !!(val->high & (1u << (shift - 64)));
-    }
-}
-
-uint128_t note_status = { 0, 0 };
-#endif
-
-
 #define MIDI_MAX_NOTES_ON 10
 
 typedef struct {
@@ -198,66 +122,5 @@ 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;
 }
-- 
cgit v1.2.3


From a4163466cb09144a96e2ea7bc697af1af8a5e770 Mon Sep 17 00:00:00 2001
From: Gabriel Young <gabeplaysdrums@live.com>
Date: Sat, 18 Feb 2017 03:40:49 -0800
Subject: Alternative version with a tone array

tone array:
   text	   data	    bss	    dec	    hex	filename
      0	  25698	      0	  25698	   6462	satan_newsboytko.hex
0x6480 bytes written into 0x7000 bytes memory (89.73%).

note on array:
   text	   data	    bss	    dec	    hex	filename
      0	  25802	      0	  25802	   64ca	satan_newsboytko.hex
0x6500 bytes written into 0x7000 bytes memory (90.18%).
---
 quantum/process_keycode/process_midi.c | 109 +++++++++++++++++++++++++++++++++
 1 file changed, 109 insertions(+)

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c
index acaae7c30..4fbb28816 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;
 }
-- 
cgit v1.2.3


From f67aefc522dd8b72711e7fc5280e1cae1470d1c5 Mon Sep 17 00:00:00 2001
From: Gabriel Young <gabeplaysdrums@live.com>
Date: Sat, 18 Feb 2017 03:43:30 -0800
Subject: remove disabled code

---
 quantum/process_keycode/process_midi.c | 129 ---------------------------------
 1 file changed, 129 deletions(-)

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c
index 4fbb28816..2ce7418ea 100644
--- a/quantum/process_keycode/process_midi.c
+++ b/quantum/process_keycode/process_midi.c
@@ -1,11 +1,5 @@
 #include "process_midi.h"
 
-#if 0
-bool midi_activated = false;
-uint8_t midi_starting_note = 0x0C;
-int midi_offset = 7;
-#endif
-
 typedef union {
   uint16_t raw;
   struct {
@@ -19,33 +13,9 @@ 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 {
-    uint8_t note;
-    uint8_t tone;
-} midi_notes_on_array_entry_t;
-
-typedef struct {
-    uint8_t length;
-    midi_notes_on_array_entry_t values[MIDI_MAX_NOTES_ON];
-} midi_notes_on_array_t;
-
-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));
@@ -74,49 +44,13 @@ 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) {
-                        midi_send_noteoff(&midi_device, channel, note, velocity);
-                        dprintf("midi noteoff channel:%d note:%d velocity:%d\n", channel, note, velocity);
-
-                        for (uint8_t j=i; j < notes_on.length - 1; j++)
-                        {
-                            notes_on.values[j] = notes_on.values[j + 1];
-                        }
-
-                        notes_on.length--;
-                        break;
-                    }
-                }
-
-                #else
-
                 uint8_t note = tone_status[tone];
                 if (note != MIDI_INVALID_NOTE)
                 {
@@ -124,8 +58,6 @@ bool process_midi(uint16_t keycode, keyrecord_t *record)
                     dprintf("midi noteoff channel:%d note:%d velocity:%d\n", channel, note, velocity);
                 }
                 tone_status[tone] = MIDI_INVALID_NOTE;
-
-                #endif
             }
             return false;
         }
@@ -170,66 +102,5 @@ 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;
 }
-- 
cgit v1.2.3


From 7c5e510fe2e57d1b3c0f98612f1f89d413c07525 Mon Sep 17 00:00:00 2001
From: Gabriel Young <gabeplaysdrums@live.com>
Date: Sat, 18 Feb 2017 04:25:17 -0800
Subject: add support for pedal cc messages

---
 quantum/process_keycode/process_midi.c | 61 ++++++++++++++++++++++++++++------
 1 file changed, 51 insertions(+), 10 deletions(-)

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c
index 2ce7418ea..f7a8b6650 100644
--- a/quantum/process_keycode/process_midi.c
+++ b/quantum/process_keycode/process_midi.c
@@ -62,43 +62,84 @@ bool process_midi(uint16_t keycode, keyrecord_t *record)
             return false;
         }
         case MIDI_OCTAVE_MIN ... MIDI_OCTAVE_MAX:
-            if (record->event.pressed)
+            if (record->event.pressed) {
                 midi_config.octave = keycode - MIDI_OCTAVE_MIN;
+                dprintf("midi octave %d\n", midi_config.octave);
+            }
             return false;
         case MI_OCTD:
-            if (record->event.pressed && midi_config.octave > 0)
+            if (record->event.pressed && midi_config.octave > 0) {
                 midi_config.octave--;
+                dprintf("midi octave %d\n", midi_config.octave);
+            }
             return false;
         case MI_OCTU:
-            if (record->event.pressed && midi_config.octave < (MIDI_OCTAVE_MAX - MIDI_OCTAVE_MIN))
+            if (record->event.pressed && midi_config.octave < (MIDI_OCTAVE_MAX - MIDI_OCTAVE_MIN)) {
                 midi_config.octave++;
+                dprintf("midi octave %d\n", midi_config.octave);
+            }
             return false;
         case MIDI_VELOCITY_MIN ... MIDI_VELOCITY_MAX:
-            if (record->event.pressed)
+            if (record->event.pressed) {
                 midi_config.velocity = keycode - MIDI_VELOCITY_MIN;
+                dprintf("midi velocity %d\n", midi_config.velocity);
+            }
             return false;
         case MI_VELD:
-            if (record->event.pressed && midi_config.velocity > 0)
+            if (record->event.pressed && midi_config.velocity > 0) {
                 midi_config.velocity--;
+                dprintf("midi velocity %d\n", midi_config.velocity);
+            }
             return false;
         case MI_VELU:
-            if (record->event.pressed)
+            if (record->event.pressed) {
                 midi_config.velocity++;
+                dprintf("midi velocity %d\n", midi_config.velocity);
+            }
             return false;
         case MIDI_CHANNEL_MIN ... MIDI_CHANNEL_MAX:
-            if (record->event.pressed)
+            if (record->event.pressed) {
                 midi_config.channel = keycode - MIDI_CHANNEL_MIN;
+                dprintf("midi channel %d\n", midi_config.channel);
+            }
             return false;
         case MI_CHD:
-            if (record->event.pressed)
+            if (record->event.pressed) {
                 midi_config.channel--;
+                dprintf("midi channel %d\n", midi_config.channel);
+            }
             return false;
         case MI_CHU:
-            if (record->event.pressed)
+            if (record->event.pressed) {
                 midi_config.channel++;
+                dprintf("midi channel %d\n", midi_config.channel);
+            }
+            return false;
+        case MI_OFF:
+            if (record->event.pressed) {
+                midi_send_cc(&midi_device, midi_config.channel, 0x7B, 0);
+                dprintf("midi off\n");
+            }
             return false;
         case MI_SUS:
-            //TODO
+            midi_send_cc(&midi_device, midi_config.channel, 0x40, record->event.pressed ? 127 : 0);
+            dprintf("midi sustain %d\n", record->event.pressed);
+            return false;
+        case MI_PORT:
+            midi_send_cc(&midi_device, midi_config.channel, 0x41, record->event.pressed ? 127 : 0);
+            dprintf("midi portamento %d\n", record->event.pressed);
+            return false;
+        case MI_SOST:
+            midi_send_cc(&midi_device, midi_config.channel, 0x42, record->event.pressed ? 127 : 0);
+            dprintf("midi sostenuto %d\n", record->event.pressed);
+            return false;
+        case MI_SOFT:
+            midi_send_cc(&midi_device, midi_config.channel, 0x43, record->event.pressed ? 127 : 0);
+            dprintf("midi soft %d\n", record->event.pressed);
+            return false;
+        case MI_LEG:
+            midi_send_cc(&midi_device, midi_config.channel, 0x43, record->event.pressed ? 127 : 0);
+            dprintf("midi legato %d\n", record->event.pressed);
             return false;
     };
 
-- 
cgit v1.2.3


From dd8f8e6baeb1549735403edf2a2f04f07edb4bf2 Mon Sep 17 00:00:00 2001
From: Gabriel Young <gabeplaysdrums@live.com>
Date: Sat, 18 Feb 2017 05:32:55 -0800
Subject: implement modulation

---
 quantum/process_keycode/process_midi.c |  58 +++++++++-
 quantum/process_keycode/process_midi.h | 201 +--------------------------------
 2 files changed, 55 insertions(+), 204 deletions(-)

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c
index f7a8b6650..d09aa0b38 100644
--- a/quantum/process_keycode/process_midi.c
+++ b/quantum/process_keycode/process_midi.c
@@ -1,4 +1,5 @@
 #include "process_midi.h"
+#include "timer.h"
 
 typedef union {
   uint16_t raw;
@@ -6,6 +7,7 @@ typedef union {
     uint8_t octave   :4;
     uint8_t velocity :4;
     uint8_t channel  :4;
+    uint8_t modulation_interval  :4;
   };
 } midi_config_t;
 
@@ -16,6 +18,10 @@ midi_config_t midi_config;
 #define MIDI_TONE_COUNT (MIDI_TONE_MAX - MIDI_TONE_MIN + 1)
 static uint8_t tone_status[MIDI_TONE_COUNT];
 
+static uint8_t midi_modulation;
+static int8_t midi_modulation_step;
+static uint16_t midi_modulation_timer;
+
 inline uint8_t compute_velocity(uint8_t setting)
 {
     return (setting + 1) * (128 / (MIDI_VELOCITY_MAX - MIDI_VELOCITY_MIN + 1));
@@ -26,14 +32,40 @@ 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
+    midi_config.modulation_interval = 8;
+
     for (uint8_t i = 0; i < MIDI_TONE_COUNT; i++)
     {
         tone_status[i] = MIDI_INVALID_NOTE;
     }
-    #endif
+
+    midi_modulation = 0;
+    midi_modulation_step = 0;
+    midi_modulation_timer = 0;
+}
+
+void midi_task(void)
+{
+    if (timer_elapsed(midi_modulation_timer) < midi_config.modulation_interval)
+        return;
+    midi_modulation_timer = timer_read();
+
+    if (midi_modulation_step != 0)
+    {
+        dprintf("midi modulation %d\n", midi_modulation);
+        midi_send_cc(&midi_device, midi_config.channel, 0x1, midi_modulation);
+
+        if (midi_modulation_step < 0 && midi_modulation < -midi_modulation_step) {
+            midi_modulation = 0;
+            midi_modulation_step = 0;
+            return;
+        }
+
+        midi_modulation += midi_modulation_step;
+
+        if (midi_modulation > 127)
+            midi_modulation = 127;
+    }
 }
 
 bool process_midi(uint16_t keycode, keyrecord_t *record)
@@ -141,6 +173,24 @@ bool process_midi(uint16_t keycode, keyrecord_t *record)
             midi_send_cc(&midi_device, midi_config.channel, 0x43, record->event.pressed ? 127 : 0);
             dprintf("midi legato %d\n", record->event.pressed);
             return false;
+        case MI_MOD:
+            midi_modulation_step = record->event.pressed ? 1 : -1;
+            return false;
+        case MI_MODSD:
+            if (record->event.pressed) {
+                midi_config.modulation_interval++;
+                // prevent overflow
+                if (midi_config.modulation_interval == 0)
+                    midi_config.modulation_interval--;
+                dprintf("midi modulation interval %d\n", midi_config.modulation_interval);
+            }
+            return false;
+        case MI_MODSU:
+            if (record->event.pressed && midi_config.modulation_interval > 0) {
+                midi_config.modulation_interval--;
+                dprintf("midi modulation interval %d\n", midi_config.modulation_interval);
+            }
+            return false;
     };
 
     return true;
diff --git a/quantum/process_keycode/process_midi.h b/quantum/process_keycode/process_midi.h
index b0e0aeb83..66ce60b0e 100644
--- a/quantum/process_keycode/process_midi.h
+++ b/quantum/process_keycode/process_midi.h
@@ -5,206 +5,7 @@
 #include "midi.h"
 
 void midi_init(void);
-
+void midi_task(void);
 bool process_midi(uint16_t keycode, keyrecord_t *record);
 
-#define MIDI(n) ((n) | 0x6000)
-#define MIDI12 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000
-
-#define CHNL(note, channel) (note + (channel << 8))
-
-#define SCALE (int8_t []){ 0 + (12*0), 2 + (12*0), 4 + (12*0), 5 + (12*0), 7 + (12*0), 9 + (12*0), 11 + (12*0), \
-                           0 + (12*1), 2 + (12*1), 4 + (12*1), 5 + (12*1), 7 + (12*1), 9 + (12*1), 11 + (12*1), \
-                           0 + (12*2), 2 + (12*2), 4 + (12*2), 5 + (12*2), 7 + (12*2), 9 + (12*2), 11 + (12*2), \
-                           0 + (12*3), 2 + (12*3), 4 + (12*3), 5 + (12*3), 7 + (12*3), 9 + (12*3), 11 + (12*3), \
-                           0 + (12*4), 2 + (12*4), 4 + (12*4), 5 + (12*4), 7 + (12*4), 9 + (12*4), 11 + (12*4), }
-
-#define N_CN1  (0x600C + (12 * -1) + 0 )
-#define N_CN1S (0x600C + (12 * -1) + 1 )
-#define N_DN1F (0x600C + (12 * -1) + 1 )
-#define N_DN1  (0x600C + (12 * -1) + 2 )
-#define N_DN1S (0x600C + (12 * -1) + 3 )
-#define N_EN1F (0x600C + (12 * -1) + 3 )
-#define N_EN1  (0x600C + (12 * -1) + 4 )
-#define N_FN1  (0x600C + (12 * -1) + 5 )
-#define N_FN1S (0x600C + (12 * -1) + 6 )
-#define N_GN1F (0x600C + (12 * -1) + 6 )
-#define N_GN1  (0x600C + (12 * -1) + 7 )
-#define N_GN1S (0x600C + (12 * -1) + 8 )
-#define N_AN1F (0x600C + (12 * -1) + 8 )
-#define N_AN1  (0x600C + (12 * -1) + 9 )
-#define N_AN1S (0x600C + (12 * -1) + 10)
-#define N_BN1F (0x600C + (12 * -1) + 10)
-#define N_BN1  (0x600C + (12 * -1) + 11)
-#define N_C0   (0x600C + (12 *  0) + 0 )
-#define N_C0S  (0x600C + (12 *  0) + 1 )
-#define N_D0F  (0x600C + (12 *  0) + 1 )
-#define N_D0   (0x600C + (12 *  0) + 2 )
-#define N_D0S  (0x600C + (12 *  0) + 3 )
-#define N_E0F  (0x600C + (12 *  0) + 3 )
-#define N_E0   (0x600C + (12 *  0) + 4 )
-#define N_F0   (0x600C + (12 *  0) + 5 )
-#define N_F0S  (0x600C + (12 *  0) + 6 )
-#define N_G0F  (0x600C + (12 *  0) + 6 )
-#define N_G0   (0x600C + (12 *  0) + 7 )
-#define N_G0S  (0x600C + (12 *  0) + 8 )
-#define N_A0F  (0x600C + (12 *  0) + 8 )
-#define N_A0   (0x600C + (12 *  0) + 9 )
-#define N_A0S  (0x600C + (12 *  0) + 10)
-#define N_B0F  (0x600C + (12 *  0) + 10)
-#define N_B0   (0x600C + (12 *  0) + 11)
-#define N_C1   (0x600C + (12 *  1) + 0 )
-#define N_C1S  (0x600C + (12 *  1) + 1 )
-#define N_D1F  (0x600C + (12 *  1) + 1 )
-#define N_D1   (0x600C + (12 *  1) + 2 )
-#define N_D1S  (0x600C + (12 *  1) + 3 )
-#define N_E1F  (0x600C + (12 *  1) + 3 )
-#define N_E1   (0x600C + (12 *  1) + 4 )
-#define N_F1   (0x600C + (12 *  1) + 5 )
-#define N_F1S  (0x600C + (12 *  1) + 6 )
-#define N_G1F  (0x600C + (12 *  1) + 6 )
-#define N_G1   (0x600C + (12 *  1) + 7 )
-#define N_G1S  (0x600C + (12 *  1) + 8 )
-#define N_A1F  (0x600C + (12 *  1) + 8 )
-#define N_A1   (0x600C + (12 *  1) + 9 )
-#define N_A1S  (0x600C + (12 *  1) + 10)
-#define N_B1F  (0x600C + (12 *  1) + 10)
-#define N_B1   (0x600C + (12 *  1) + 11)
-#define N_C2   (0x600C + (12 *  2) + 0 )
-#define N_C2S  (0x600C + (12 *  2) + 1 )
-#define N_D2F  (0x600C + (12 *  2) + 1 )
-#define N_D2   (0x600C + (12 *  2) + 2 )
-#define N_D2S  (0x600C + (12 *  2) + 3 )
-#define N_E2F  (0x600C + (12 *  2) + 3 )
-#define N_E2   (0x600C + (12 *  2) + 4 )
-#define N_F2   (0x600C + (12 *  2) + 5 )
-#define N_F2S  (0x600C + (12 *  2) + 6 )
-#define N_G2F  (0x600C + (12 *  2) + 6 )
-#define N_G2   (0x600C + (12 *  2) + 7 )
-#define N_G2S  (0x600C + (12 *  2) + 8 )
-#define N_A2F  (0x600C + (12 *  2) + 8 )
-#define N_A2   (0x600C + (12 *  2) + 9 )
-#define N_A2S  (0x600C + (12 *  2) + 10)
-#define N_B2F  (0x600C + (12 *  2) + 10)
-#define N_B2   (0x600C + (12 *  2) + 11)
-#define N_C3   (0x600C + (12 *  3) + 0 )
-#define N_C3S  (0x600C + (12 *  3) + 1 )
-#define N_D3F  (0x600C + (12 *  3) + 1 )
-#define N_D3   (0x600C + (12 *  3) + 2 )
-#define N_D3S  (0x600C + (12 *  3) + 3 )
-#define N_E3F  (0x600C + (12 *  3) + 3 )
-#define N_E3   (0x600C + (12 *  3) + 4 )
-#define N_F3   (0x600C + (12 *  3) + 5 )
-#define N_F3S  (0x600C + (12 *  3) + 6 )
-#define N_G3F  (0x600C + (12 *  3) + 6 )
-#define N_G3   (0x600C + (12 *  3) + 7 )
-#define N_G3S  (0x600C + (12 *  3) + 8 )
-#define N_A3F  (0x600C + (12 *  3) + 8 )
-#define N_A3   (0x600C + (12 *  3) + 9 )
-#define N_A3S  (0x600C + (12 *  3) + 10)
-#define N_B3F  (0x600C + (12 *  3) + 10)
-#define N_B3   (0x600C + (12 *  3) + 11)
-#define N_C4   (0x600C + (12 *  4) + 0 )
-#define N_C4S  (0x600C + (12 *  4) + 1 )
-#define N_D4F  (0x600C + (12 *  4) + 1 )
-#define N_D4   (0x600C + (12 *  4) + 2 )
-#define N_D4S  (0x600C + (12 *  4) + 3 )
-#define N_E4F  (0x600C + (12 *  4) + 3 )
-#define N_E4   (0x600C + (12 *  4) + 4 )
-#define N_F4   (0x600C + (12 *  4) + 5 )
-#define N_F4S  (0x600C + (12 *  4) + 6 )
-#define N_G4F  (0x600C + (12 *  4) + 6 )
-#define N_G4   (0x600C + (12 *  4) + 7 )
-#define N_G4S  (0x600C + (12 *  4) + 8 )
-#define N_A4F  (0x600C + (12 *  4) + 8 )
-#define N_A4   (0x600C + (12 *  4) + 9 )
-#define N_A4S  (0x600C + (12 *  4) + 10)
-#define N_B4F  (0x600C + (12 *  4) + 10)
-#define N_B4   (0x600C + (12 *  4) + 11)
-#define N_C5   (0x600C + (12 *  5) + 0 )
-#define N_C5S  (0x600C + (12 *  5) + 1 )
-#define N_D5F  (0x600C + (12 *  5) + 1 )
-#define N_D5   (0x600C + (12 *  5) + 2 )
-#define N_D5S  (0x600C + (12 *  5) + 3 )
-#define N_E5F  (0x600C + (12 *  5) + 3 )
-#define N_E5   (0x600C + (12 *  5) + 4 )
-#define N_F5   (0x600C + (12 *  5) + 5 )
-#define N_F5S  (0x600C + (12 *  5) + 6 )
-#define N_G5F  (0x600C + (12 *  5) + 6 )
-#define N_G5   (0x600C + (12 *  5) + 7 )
-#define N_G5S  (0x600C + (12 *  5) + 8 )
-#define N_A5F  (0x600C + (12 *  5) + 8 )
-#define N_A5   (0x600C + (12 *  5) + 9 )
-#define N_A5S  (0x600C + (12 *  5) + 10)
-#define N_B5F  (0x600C + (12 *  5) + 10)
-#define N_B5   (0x600C + (12 *  5) + 11)
-#define N_C6   (0x600C + (12 *  6) + 0 )
-#define N_C6S  (0x600C + (12 *  6) + 1 )
-#define N_D6F  (0x600C + (12 *  6) + 1 )
-#define N_D6   (0x600C + (12 *  6) + 2 )
-#define N_D6S  (0x600C + (12 *  6) + 3 )
-#define N_E6F  (0x600C + (12 *  6) + 3 )
-#define N_E6   (0x600C + (12 *  6) + 4 )
-#define N_F6   (0x600C + (12 *  6) + 5 )
-#define N_F6S  (0x600C + (12 *  6) + 6 )
-#define N_G6F  (0x600C + (12 *  6) + 6 )
-#define N_G6   (0x600C + (12 *  6) + 7 )
-#define N_G6S  (0x600C + (12 *  6) + 8 )
-#define N_A6F  (0x600C + (12 *  6) + 8 )
-#define N_A6   (0x600C + (12 *  6) + 9 )
-#define N_A6S  (0x600C + (12 *  6) + 10)
-#define N_B6F  (0x600C + (12 *  6) + 10)
-#define N_B6   (0x600C + (12 *  6) + 11)
-#define N_C7   (0x600C + (12 *  7) + 0 )
-#define N_C7S  (0x600C + (12 *  7) + 1 )
-#define N_D7F  (0x600C + (12 *  7) + 1 )
-#define N_D7   (0x600C + (12 *  7) + 2 )
-#define N_D7S  (0x600C + (12 *  7) + 3 )
-#define N_E7F  (0x600C + (12 *  7) + 3 )
-#define N_E7   (0x600C + (12 *  7) + 4 )
-#define N_F7   (0x600C + (12 *  7) + 5 )
-#define N_F7S  (0x600C + (12 *  7) + 6 )
-#define N_G7F  (0x600C + (12 *  7) + 6 )
-#define N_G7   (0x600C + (12 *  7) + 7 )
-#define N_G7S  (0x600C + (12 *  7) + 8 )
-#define N_A7F  (0x600C + (12 *  7) + 8 )
-#define N_A7   (0x600C + (12 *  7) + 9 )
-#define N_A7S  (0x600C + (12 *  7) + 10)
-#define N_B7F  (0x600C + (12 *  7) + 10)
-#define N_B7   (0x600C + (12 *  7) + 11)
-#define N_C8   (0x600C + (12 *  8) + 0 )
-#define N_C8S  (0x600C + (12 *  8) + 1 )
-#define N_D8F  (0x600C + (12 *  8) + 1 )
-#define N_D8   (0x600C + (12 *  8) + 2 )
-#define N_D8S  (0x600C + (12 *  8) + 3 )
-#define N_E8F  (0x600C + (12 *  8) + 3 )
-#define N_E8   (0x600C + (12 *  8) + 4 )
-#define N_F8   (0x600C + (12 *  8) + 5 )
-#define N_F8S  (0x600C + (12 *  8) + 6 )
-#define N_G8F  (0x600C + (12 *  8) + 6 )
-#define N_G8   (0x600C + (12 *  8) + 7 )
-#define N_G8S  (0x600C + (12 *  8) + 8 )
-#define N_A8F  (0x600C + (12 *  8) + 8 )
-#define N_A8   (0x600C + (12 *  8) + 9 )
-#define N_A8S  (0x600C + (12 *  8) + 10)
-#define N_B8F  (0x600C + (12 *  8) + 10)
-#define N_B8   (0x600C + (12 *  8) + 11)
-#define N_C8   (0x600C + (12 *  8) + 0 )
-#define N_C8S  (0x600C + (12 *  8) + 1 )
-#define N_D8F  (0x600C + (12 *  8) + 1 )
-#define N_D8   (0x600C + (12 *  8) + 2 )
-#define N_D8S  (0x600C + (12 *  8) + 3 )
-#define N_E8F  (0x600C + (12 *  8) + 3 )
-#define N_E8   (0x600C + (12 *  8) + 4 )
-#define N_F8   (0x600C + (12 *  8) + 5 )
-#define N_F8S  (0x600C + (12 *  8) + 6 )
-#define N_G8F  (0x600C + (12 *  8) + 6 )
-#define N_G8   (0x600C + (12 *  8) + 7 )
-#define N_G8S  (0x600C + (12 *  8) + 8 )
-#define N_A8F  (0x600C + (12 *  8) + 8 )
-#define N_A8   (0x600C + (12 *  8) + 9 )
-#define N_A8S  (0x600C + (12 *  8) + 10)
-#define N_B8F  (0x600C + (12 *  8) + 10)
-#define N_B8   (0x600C + (12 *  8) + 11)
-
 #endif
\ No newline at end of file
-- 
cgit v1.2.3


From 5e6097f0154403dccb9b5658390c84441aa509bc Mon Sep 17 00:00:00 2001
From: Gabriel Young <gabeplaysdrums@live.com>
Date: Sat, 18 Feb 2017 06:19:48 -0800
Subject: add keycodes for transpose range

---
 quantum/process_keycode/process_midi.c | 37 +++++++++++++++++++++++++++-------
 1 file changed, 30 insertions(+), 7 deletions(-)

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c
index d09aa0b38..4d60aefb1 100644
--- a/quantum/process_keycode/process_midi.c
+++ b/quantum/process_keycode/process_midi.c
@@ -2,12 +2,13 @@
 #include "timer.h"
 
 typedef union {
-  uint16_t raw;
+  uint32_t raw;
   struct {
-    uint8_t octave   :4;
-    uint8_t velocity :4;
-    uint8_t channel  :4;
-    uint8_t modulation_interval  :4;
+    uint8_t octave              :4;
+    int8_t transpose            :4;
+    uint8_t velocity            :4;
+    uint8_t channel             :4;
+    uint8_t modulation_interval :4;
   };
 } midi_config_t;
 
@@ -29,7 +30,8 @@ inline uint8_t compute_velocity(uint8_t setting)
 
 void midi_init(void)
 {
-    midi_config.octave = MI_OCT_0 - MIDI_OCTAVE_MIN;
+    midi_config.octave = MI_OCT_2 - MIDI_OCTAVE_MIN;
+    midi_config.transpose = 0;
     midi_config.velocity = (MIDI_VELOCITY_MAX - MIDI_VELOCITY_MIN);
     midi_config.channel = 0;
     midi_config.modulation_interval = 8;
@@ -77,7 +79,7 @@ bool process_midi(uint16_t keycode, keyrecord_t *record)
             uint8_t tone = keycode - MIDI_TONE_MIN;
             uint8_t velocity = compute_velocity(midi_config.velocity);
             if (record->event.pressed) {
-                uint8_t note = 12 * midi_config.octave + tone;
+                uint8_t note = 12 * midi_config.octave + tone + midi_config.transpose;
                 midi_send_noteon(&midi_device, channel, note, velocity);
                 dprintf("midi noteon channel:%d note:%d velocity:%d\n", channel, note, velocity);
                 tone_status[tone] = note;
@@ -111,6 +113,27 @@ bool process_midi(uint16_t keycode, keyrecord_t *record)
                 dprintf("midi octave %d\n", midi_config.octave);
             }
             return false;
+        case MIDI_TRANSPOSE_MIN ... MIDI_TRANSPOSE_MAX:
+            if (record->event.pressed) {
+                midi_config.transpose = keycode - MI_TRNS_0;
+                dprintf("midi transpose %d\n", midi_config.transpose);
+            }
+            return false;
+        case MI_TRNSD:
+            if (record->event.pressed && midi_config.transpose > (MIDI_TRANSPOSE_MIN - MI_TRNS_0)) {
+                midi_config.transpose--;
+                dprintf("midi transpose %d\n", midi_config.transpose);
+            }
+            return false;
+        case MI_TRNSU:
+            if (record->event.pressed && midi_config.transpose < (MIDI_TRANSPOSE_MAX - MI_TRNS_0)) {
+                const bool positive = midi_config.transpose > 0;
+                midi_config.transpose++;
+                if (positive && midi_config.transpose < 0)
+                    midi_config.transpose--;
+                dprintf("midi transpose %d\n", midi_config.transpose);
+            }
+            return false;
         case MIDI_VELOCITY_MIN ... MIDI_VELOCITY_MAX:
             if (record->event.pressed) {
                 midi_config.velocity = keycode - MIDI_VELOCITY_MIN;
-- 
cgit v1.2.3


From ae0752dff552a07fb52e08c7057979959959d247 Mon Sep 17 00:00:00 2001
From: Gabriel Young <gabeplaysdrums@live.com>
Date: Sat, 18 Feb 2017 21:07:07 -0800
Subject: expose midi_config

---
 quantum/process_keycode/process_midi.c | 23 ++++++-----------------
 quantum/process_keycode/process_midi.h | 18 ++++++++++++++++++
 2 files changed, 24 insertions(+), 17 deletions(-)

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c
index 4d60aefb1..9190fa047 100644
--- a/quantum/process_keycode/process_midi.c
+++ b/quantum/process_keycode/process_midi.c
@@ -1,22 +1,6 @@
 #include "process_midi.h"
 #include "timer.h"
 
-typedef union {
-  uint32_t raw;
-  struct {
-    uint8_t octave              :4;
-    int8_t transpose            :4;
-    uint8_t velocity            :4;
-    uint8_t channel             :4;
-    uint8_t modulation_interval :4;
-  };
-} midi_config_t;
-
-midi_config_t midi_config;
-
-#define MIDI_INVALID_NOTE 0xFF
-
-#define MIDI_TONE_COUNT (MIDI_TONE_MAX - MIDI_TONE_MIN + 1)
 static uint8_t tone_status[MIDI_TONE_COUNT];
 
 static uint8_t midi_modulation;
@@ -70,6 +54,11 @@ void midi_task(void)
     }
 }
 
+uint8_t midi_compute_note(uint16_t keycode)
+{
+    return 12 * midi_config.octave + (keycode - MIDI_TONE_MIN) + midi_config.transpose;
+}
+
 bool process_midi(uint16_t keycode, keyrecord_t *record)
 {
     switch (keycode) {
@@ -79,7 +68,7 @@ bool process_midi(uint16_t keycode, keyrecord_t *record)
             uint8_t tone = keycode - MIDI_TONE_MIN;
             uint8_t velocity = compute_velocity(midi_config.velocity);
             if (record->event.pressed) {
-                uint8_t note = 12 * midi_config.octave + tone + midi_config.transpose;
+                uint8_t note = midi_compute_note(keycode);
                 midi_send_noteon(&midi_device, channel, note, velocity);
                 dprintf("midi noteon channel:%d note:%d velocity:%d\n", channel, note, velocity);
                 tone_status[tone] = note;
diff --git a/quantum/process_keycode/process_midi.h b/quantum/process_keycode/process_midi.h
index 66ce60b0e..ffd41579f 100644
--- a/quantum/process_keycode/process_midi.h
+++ b/quantum/process_keycode/process_midi.h
@@ -4,8 +4,26 @@
 #include "quantum.h"
 #include "midi.h"
 
+typedef union {
+  uint32_t raw;
+  struct {
+    uint8_t octave              :4;
+    int8_t transpose            :4;
+    uint8_t velocity            :4;
+    uint8_t channel             :4;
+    uint8_t modulation_interval :4;
+  };
+} midi_config_t;
+
+midi_config_t midi_config;
+
 void midi_init(void);
 void midi_task(void);
 bool process_midi(uint16_t keycode, keyrecord_t *record);
 
+#define MIDI_INVALID_NOTE 0xFF
+#define MIDI_TONE_COUNT (MIDI_TONE_MAX - MIDI_TONE_MIN + 1)
+
+uint8_t midi_compute_note(uint16_t keycode);
+
 #endif
\ No newline at end of file
-- 
cgit v1.2.3


From ed15973a3ffff6e18e62f81654632b97961f18d2 Mon Sep 17 00:00:00 2001
From: Gabriel Young <gabeplaysdrums@live.com>
Date: Sun, 19 Feb 2017 17:45:08 -0800
Subject: Document size added by MIDI_ENABLE (~3800 bytes according to my
 experiments)

satan/keymaps/midi

MIDI_ENABLE = no

   text	   data	    bss	    dec	    hex	filename
      0	  17080	      0	  17080	   42b8	satan_midi.hex

MIDI_ENABLE = yes
#define MIDI_TONE_KEYCODE_OCTAVES 3 // default

   text	   data	    bss	    dec	    hex	filename
      0	  20846	      0	  20846	   516e	satan_midi.hex

MIDI_ENABLE = yes
#define MIDI_TONE_KEYCODE_OCTAVES 2 // fewer octaves

   text	   data	    bss	    dec	    hex	filename
      0	  20846	      0	  20846	   516e	satan_midi.hex
---
 quantum/process_keycode/process_midi.c | 2 ++
 1 file changed, 2 insertions(+)

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c
index 9190fa047..5530ea97c 100644
--- a/quantum/process_keycode/process_midi.c
+++ b/quantum/process_keycode/process_midi.c
@@ -1,3 +1,5 @@
+#define MIDI_TONE_KEYCODE_OCTAVES 2
+
 #include "process_midi.h"
 #include "timer.h"
 
-- 
cgit v1.2.3


From 296b927e7740f23fc91f84ebac6ca0c85c654028 Mon Sep 17 00:00:00 2001
From: Priyadi Iman Nurcahyo <priyadi@priyadi.net>
Date: Thu, 23 Feb 2017 18:10:00 +0700
Subject: Fix UNICODE_MAP input_mode problem

---
 quantum/process_keycode/process_unicodemap.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_unicodemap.c b/quantum/process_keycode/process_unicodemap.c
index 37f10df86..68a593a18 100644
--- a/quantum/process_keycode/process_unicodemap.c
+++ b/quantum/process_keycode/process_unicodemap.c
@@ -1,25 +1,26 @@
 #include "process_unicodemap.h"
+#include "process_unicode_common.h"
 
 __attribute__((weak))
 const uint32_t PROGMEM unicode_map[] = {
 };
 
 void register_hex32(uint32_t hex) {
-  uint8_t onzerostart = 1;
+  bool onzerostart = true;
   for(int i = 7; i >= 0; i--) {
     if (i <= 3) {
-      onzerostart = 0;
+      onzerostart = false;
     }
     uint8_t digit = ((hex >> (i*4)) & 0xF);
     if (digit == 0) {
-      if (onzerostart == 0) {
+      if (!onzerostart) {
         register_code(hex_to_keycode(digit));
         unregister_code(hex_to_keycode(digit));
       }
     } else {
       register_code(hex_to_keycode(digit));
       unregister_code(hex_to_keycode(digit));
-      onzerostart = 0;
+      onzerostart = false;
     }
   }
 }
@@ -28,6 +29,7 @@ __attribute__((weak))
 void unicode_map_input_error() {}
 
 bool process_unicode_map(uint16_t keycode, keyrecord_t *record) {
+  uint8_t input_mode = get_unicode_input_mode();
   if ((keycode & QK_UNICODE_MAP) == QK_UNICODE_MAP && record->event.pressed) {
     const uint32_t* map = unicode_map;
     uint16_t index = keycode - QK_UNICODE_MAP;
-- 
cgit v1.2.3


From 525be99ee938aa6e48448d7dd6ea6e6fe50bb36d Mon Sep 17 00:00:00 2001
From: Gabriel Young <gabeplaysdrums@live.com>
Date: Sat, 25 Feb 2017 15:02:43 -0800
Subject: Split MIDI functionality into MIDI_BASIC and MIDI_ADVANCED

MIDI_ENABLE = no

   text	   data	    bss	    dec	    hex	filename
      0	  17080	      0	  17080	   42b8	satan_midi.hex

MIDI_ENABLE = yes
MIDI_BASIC undefined
MIDI_ADVANCED undefined

   text	   data	    bss	    dec	    hex	filename
      0	  19494	      0	  19494	   4c26	satan_midi.hex

MIDI_ENABLE = yes
#define MIDI_BASIC
MIDI_ADVANCED undefined

   text	   data	    bss	    dec	    hex	filename
      0	  19788	      0	  19788	   4d4c	satan_midi.hex

MIDI_ENABLE = yes
MIDI_BASIC undefined
#define MIDI_ADVANCED

   text	   data	    bss	    dec	    hex	filename
      0	  20846	      0	  20846	   516e	satan_midi.hex

MIDI_ENABLE = yes
#define MIDI_BASIC
#define MIDI_ADVANCED

   text	   data	    bss	    dec	    hex	filename
      0	  21140	      0	  21140	   5294	satan_midi.hex
---
 quantum/process_keycode/process_midi.c  |  9 ++++++---
 quantum/process_keycode/process_music.c | 22 ++++++++++++++++++++++
 2 files changed, 28 insertions(+), 3 deletions(-)

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c
index 5530ea97c..161f04a24 100644
--- a/quantum/process_keycode/process_midi.c
+++ b/quantum/process_keycode/process_midi.c
@@ -1,6 +1,7 @@
-#define MIDI_TONE_KEYCODE_OCTAVES 2
-
 #include "process_midi.h"
+
+#if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED)
+
 #include "timer.h"
 
 static uint8_t tone_status[MIDI_TONE_COUNT];
@@ -161,7 +162,7 @@ bool process_midi(uint16_t keycode, keyrecord_t *record)
                 dprintf("midi channel %d\n", midi_config.channel);
             }
             return false;
-        case MI_OFF:
+        case MI_ALLOFF:
             if (record->event.pressed) {
                 midi_send_cc(&midi_device, midi_config.channel, 0x7B, 0);
                 dprintf("midi off\n");
@@ -209,3 +210,5 @@ bool process_midi(uint16_t keycode, keyrecord_t *record)
 
     return true;
 }
+
+#endif // MIDI_ADVANCED
diff --git a/quantum/process_keycode/process_music.c b/quantum/process_keycode/process_music.c
index 1e2648bff..ac906b628 100644
--- a/quantum/process_keycode/process_music.c
+++ b/quantum/process_keycode/process_music.c
@@ -17,6 +17,7 @@ static uint16_t music_sequence_interval = 100;
 
 bool process_music(uint16_t keycode, keyrecord_t *record) {
 
+	#ifdef AUDIO_ENABLE
     if (keycode == AU_ON && record->event.pressed) {
       audio_on();
       return false;
@@ -38,6 +39,7 @@ bool process_music(uint16_t keycode, keyrecord_t *record) {
         }
       return false;
     }
+	#endif // AUDIO_ENABLE
 
     if (keycode == MU_ON && record->event.pressed) {
         music_on();
@@ -61,6 +63,7 @@ bool process_music(uint16_t keycode, keyrecord_t *record) {
         return false;
     }
 
+	#ifdef AUDIO_ENABLE
     if (keycode == MUV_IN && record->event.pressed) {
         voice_iterate();
         music_scale_user();
@@ -72,11 +75,14 @@ bool process_music(uint16_t keycode, keyrecord_t *record) {
         music_scale_user();
         return false;
     }
+	#endif // AUDIO_ENABLE
 
     if (music_activated) {
 
       if (keycode == KC_LCTL && record->event.pressed) { // Start recording
+		#ifdef AUDIO_ENABLE
         stop_all_notes();
+        #endif
         music_sequence_recording = true;
         music_sequence_recorded = false;
         music_sequence_playing = false;
@@ -85,7 +91,9 @@ bool process_music(uint16_t keycode, keyrecord_t *record) {
       }
 
       if (keycode == KC_LALT && record->event.pressed) { // Stop recording/playing
+        #ifdef AUDIO_ENABLE
         stop_all_notes();
+        #endif
         if (music_sequence_recording) { // was recording
           music_sequence_recorded = true;
         }
@@ -95,7 +103,9 @@ bool process_music(uint16_t keycode, keyrecord_t *record) {
       }
 
       if (keycode == KC_LGUI && record->event.pressed && music_sequence_recorded) { // Start playing
+        #ifdef AUDIO_ENABLE
         stop_all_notes();
+        #endif
         music_sequence_recording = false;
         music_sequence_playing = true;
         music_sequence_position = 0;
@@ -116,6 +126,7 @@ bool process_music(uint16_t keycode, keyrecord_t *record) {
       }
       #define MUSIC_MODE_GUITAR
 
+      #ifdef AUDIO_ENABLE
       #ifdef MUSIC_MODE_CHROMATIC
       float freq = ((float)220.0)*pow(2.0, -5.0)*pow(2.0,(music_starting_note + record->event.key.col + music_offset)/12.0+(MATRIX_ROWS - record->event.key.row));
       #elif defined(MUSIC_MODE_GUITAR)
@@ -125,15 +136,20 @@ bool process_music(uint16_t keycode, keyrecord_t *record) {
       #else
       float freq = ((float)220.0)*pow(2.0, -5.0)*pow(2.0,(music_starting_note + SCALE[record->event.key.col + music_offset])/12.0+(MATRIX_ROWS - record->event.key.row));
       #endif
+      #endif // AUDIO_ENABLE
 
       if (record->event.pressed) {
+      	#ifdef AUDIO_ENABLE
         play_note(freq, 0xF);
         if (music_sequence_recording) {
           music_sequence[music_sequence_count] = freq;
           music_sequence_count++;
         }
+        #endif
       } else {
+      	#ifdef AUDIO_ENABLE
         stop_note(freq);
+        #endif
       }
 
       if (keycode < 0xFF) // ignores all normal keycodes, but lets RAISE, LOWER, etc through
@@ -161,15 +177,19 @@ void music_on(void) {
 
 void music_off(void) {
     music_activated = 0;
+    #ifdef AUDIO_ENABLE
     stop_all_notes();
+    #endif
 }
 
 
 __attribute__ ((weak))
 void music_on_user() {}
 
+#ifdef AUDIO_ENABLE
 __attribute__ ((weak))
 void audio_on_user() {}
+#endif
 
 __attribute__ ((weak))
 void music_scale_user() {}
@@ -178,8 +198,10 @@ void matrix_scan_music(void) {
   if (music_sequence_playing) {
     if ((music_sequence_timer == 0) || (timer_elapsed(music_sequence_timer) > music_sequence_interval)) {
       music_sequence_timer = timer_read();
+      #ifdef AUDIO_ENABLE
       stop_note(music_sequence[(music_sequence_position - 1 < 0)?(music_sequence_position - 1 + music_sequence_count):(music_sequence_position - 1)]);
       play_note(music_sequence[music_sequence_position], 0xF);
+      #endif
       music_sequence_position = (music_sequence_position + 1) % music_sequence_count;
     }
   }
-- 
cgit v1.2.3


From 1000799d1ef594bf9f48076986ec300ef9e536db Mon Sep 17 00:00:00 2001
From: Gabriel Young <gabeplaysdrums@live.com>
Date: Sat, 25 Feb 2017 19:25:33 -0800
Subject: Factor basic note processing into respective processors

---
 quantum/process_keycode/process_audio.c |  62 +++++++++++++++
 quantum/process_keycode/process_audio.h |  11 +++
 quantum/process_keycode/process_midi.c  |  28 ++++++-
 quantum/process_keycode/process_midi.h  |  13 ++-
 quantum/process_keycode/process_music.c | 137 ++++++++++++++------------------
 quantum/process_keycode/process_music.h |   5 +-
 6 files changed, 174 insertions(+), 82 deletions(-)
 create mode 100644 quantum/process_keycode/process_audio.c
 create mode 100644 quantum/process_keycode/process_audio.h

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_audio.c b/quantum/process_keycode/process_audio.c
new file mode 100644
index 000000000..5b5da546e
--- /dev/null
+++ b/quantum/process_keycode/process_audio.c
@@ -0,0 +1,62 @@
+#include "process_audio.h"
+#include "audio.h"
+
+static float compute_freq_for_midi_note(uint8_t note)
+{
+    // https://en.wikipedia.org/wiki/MIDI_tuning_standard
+    return pow(2.0, (note - 69) / 12.0) * 440.0f;
+}
+
+bool process_audio(uint16_t keycode, keyrecord_t *record) {
+
+    if (keycode == AU_ON && record->event.pressed) {
+      audio_on();
+      return false;
+    }
+
+    if (keycode == AU_OFF && record->event.pressed) {
+      audio_off();
+      return false;
+    }
+
+    if (keycode == AU_TOG && record->event.pressed) {
+        if (is_audio_on())
+        {
+            audio_off();
+        }
+        else
+        {
+            audio_on();
+        }
+      return false;
+    }
+
+    if (keycode == MUV_IN && record->event.pressed) {
+        voice_iterate();
+        music_scale_user();
+        return false;
+    }
+
+    if (keycode == MUV_DE && record->event.pressed) {
+        voice_deiterate();
+        music_scale_user();
+        return false;
+    }
+
+    return true
+}
+
+void process_audio_noteon(uint8_t note) {
+    play_note(compute_freq_for_midi_note(note), 0xF);
+}
+
+void process_audio_noteoff(uint8_t note) {
+    stop_note(compute_freq_for_midi_note(note));
+}
+
+void process_audio_stop_all_notes(void) {
+    stop_all_notes();
+}
+
+__attribute__ ((weak))
+void audio_on_user() {}
\ No newline at end of file
diff --git a/quantum/process_keycode/process_audio.h b/quantum/process_keycode/process_audio.h
new file mode 100644
index 000000000..59a17725a
--- /dev/null
+++ b/quantum/process_keycode/process_audio.h
@@ -0,0 +1,11 @@
+#ifndef PROCESS_AUDIO_H
+#define PROCESS_AUDIO_H
+
+bool process_audio(uint16_t keycode, keyrecord_t *record);
+void process_audio_noteon(uint8_t note);
+void process_audio_noteoff(uint8_t note);
+void process_audio_stop_all_notes(void);
+
+void audio_on_user(void);
+
+#endif
\ No newline at end of file
diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c
index 161f04a24..214bba902 100644
--- a/quantum/process_keycode/process_midi.c
+++ b/quantum/process_keycode/process_midi.c
@@ -1,6 +1,28 @@
 #include "process_midi.h"
 
-#if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED)
+#ifdef MIDI_ENABLE
+#include "midi.h"
+
+#ifdef MIDI_BASIC
+
+void process_midi_basic_noteon(uint8_t note) 
+{
+    midi_send_noteon(&midi_device, 0, note, 128);
+}
+
+void process_midi_basic_noteoff(uint8_t note)
+{
+    midi_send_noteoff(&midi_device, 0, note, 0);
+}
+
+void process_midi_basic_stop_all_notes(void)
+{
+    midi_send_cc(&midi_device, 0, 0x7B, 0);
+}
+
+#endif // MIDI_BASIC
+
+#ifdef MIDI_ADVANCED
 
 #include "timer.h"
 
@@ -165,7 +187,7 @@ bool process_midi(uint16_t keycode, keyrecord_t *record)
         case MI_ALLOFF:
             if (record->event.pressed) {
                 midi_send_cc(&midi_device, midi_config.channel, 0x7B, 0);
-                dprintf("midi off\n");
+                dprintf("midi all notes off\n");
             }
             return false;
         case MI_SUS:
@@ -212,3 +234,5 @@ bool process_midi(uint16_t keycode, keyrecord_t *record)
 }
 
 #endif // MIDI_ADVANCED
+
+#endif // MIDI_ENABLE
diff --git a/quantum/process_keycode/process_midi.h b/quantum/process_keycode/process_midi.h
index ffd41579f..0f559ec23 100644
--- a/quantum/process_keycode/process_midi.h
+++ b/quantum/process_keycode/process_midi.h
@@ -2,8 +2,16 @@
 #define PROCESS_MIDI_H
 
 #include "quantum.h"
-#include "midi.h"
 
+#ifdef MIDI_ENABLE
+
+#ifdef MIDI_BASIC
+void process_midi_basic_noteon(uint8_t note);
+void process_midi_basic_noteoff(uint8_t note);
+void process_midi_basic_stop_all_notes(void);
+#endif
+
+#ifdef MIDI_ADVANCED
 typedef union {
   uint32_t raw;
   struct {
@@ -25,5 +33,8 @@ bool process_midi(uint16_t keycode, keyrecord_t *record);
 #define MIDI_TONE_COUNT (MIDI_TONE_MAX - MIDI_TONE_MIN + 1)
 
 uint8_t midi_compute_note(uint16_t keycode);
+#endif // MIDI_ADVANCED
+
+#endif // MIDI_ENABLE
 
 #endif
\ No newline at end of file
diff --git a/quantum/process_keycode/process_music.c b/quantum/process_keycode/process_music.c
index ac906b628..a1e270df1 100644
--- a/quantum/process_keycode/process_music.c
+++ b/quantum/process_keycode/process_music.c
@@ -1,5 +1,14 @@
 #include "process_music.h"
 
+#ifdef AUDIO_ENABLE
+#include "process_audio.h"
+#endif
+#if defined(MIDI_ENABLE) && defined(MIDI_BASIC)
+#include "process_midi.h"
+#endif
+
+#if defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC))
+
 bool music_activated = false;
 uint8_t music_starting_note = 0x0C;
 int music_offset = 7;
@@ -8,38 +17,41 @@ int music_offset = 7;
 static bool music_sequence_recording = false;
 static bool music_sequence_recorded = false;
 static bool music_sequence_playing = false;
-static float music_sequence[16] = {0};
+static uint8_t music_sequence[16] = {0};
 static uint8_t music_sequence_count = 0;
 static uint8_t music_sequence_position = 0;
 
 static uint16_t music_sequence_timer = 0;
 static uint16_t music_sequence_interval = 100;
 
-bool process_music(uint16_t keycode, keyrecord_t *record) {
+static void music_noteon(uint8_t note) {
+    #ifdef AUDIO_ENABLE
+    process_audio_noteon(note);
+    #endif
+    #if defined(MIDI_ENABLE) && defined(MIDI_BASIC)
+    process_midi_basic_noteon(note);
+    #endif
+}
 
-	#ifdef AUDIO_ENABLE
-    if (keycode == AU_ON && record->event.pressed) {
-      audio_on();
-      return false;
-    }
+static void music_noteoff(uint8_t note) {
+    #ifdef AUDIO_ENABLE
+    process_audio_noteoff(note);
+    #endif
+    #if defined(MIDI_ENABLE) && defined(MIDI_BASIC)
+    process_midi_basic_noteoff(note);
+    #endif
+}
 
-    if (keycode == AU_OFF && record->event.pressed) {
-      audio_off();
-      return false;
-    }
+static void music_all_notes_off(void) {
+    #ifdef AUDIO_ENABLE
+    process_audio_stop_all_notes();
+    #endif
+    #if defined(MIDI_ENABLE) && defined(MIDI_BASIC)
+    process_midi_basic_stop_all_notes();
+    #endif
+}
 
-    if (keycode == AU_TOG && record->event.pressed) {
-        if (is_audio_on())
-        {
-            audio_off();
-        }
-        else
-        {
-            audio_on();
-        }
-      return false;
-    }
-	#endif // AUDIO_ENABLE
+bool process_music(uint16_t keycode, keyrecord_t *record) {
 
     if (keycode == MU_ON && record->event.pressed) {
         music_on();
@@ -63,26 +75,10 @@ bool process_music(uint16_t keycode, keyrecord_t *record) {
         return false;
     }
 
-	#ifdef AUDIO_ENABLE
-    if (keycode == MUV_IN && record->event.pressed) {
-        voice_iterate();
-        music_scale_user();
-        return false;
-    }
-
-    if (keycode == MUV_DE && record->event.pressed) {
-        voice_deiterate();
-        music_scale_user();
-        return false;
-    }
-	#endif // AUDIO_ENABLE
-
     if (music_activated) {
 
       if (keycode == KC_LCTL && record->event.pressed) { // Start recording
-		#ifdef AUDIO_ENABLE
-        stop_all_notes();
-        #endif
+        music_all_notes_off();
         music_sequence_recording = true;
         music_sequence_recorded = false;
         music_sequence_playing = false;
@@ -91,9 +87,7 @@ bool process_music(uint16_t keycode, keyrecord_t *record) {
       }
 
       if (keycode == KC_LALT && record->event.pressed) { // Stop recording/playing
-        #ifdef AUDIO_ENABLE
-        stop_all_notes();
-        #endif
+        music_all_notes_off();
         if (music_sequence_recording) { // was recording
           music_sequence_recorded = true;
         }
@@ -103,9 +97,7 @@ bool process_music(uint16_t keycode, keyrecord_t *record) {
       }
 
       if (keycode == KC_LGUI && record->event.pressed && music_sequence_recorded) { // Start playing
-        #ifdef AUDIO_ENABLE
-        stop_all_notes();
-        #endif
+        music_all_notes_off();
         music_sequence_recording = false;
         music_sequence_playing = true;
         music_sequence_position = 0;
@@ -124,32 +116,27 @@ bool process_music(uint16_t keycode, keyrecord_t *record) {
             music_sequence_interval+=10;
         return false;
       }
+
       #define MUSIC_MODE_GUITAR
 
-      #ifdef AUDIO_ENABLE
       #ifdef MUSIC_MODE_CHROMATIC
-      float freq = ((float)220.0)*pow(2.0, -5.0)*pow(2.0,(music_starting_note + record->event.key.col + music_offset)/12.0+(MATRIX_ROWS - record->event.key.row));
+      uint8_t note = (music_starting_note + record->event.key.col + music_offset - 3)+12*(MATRIX_ROWS - record->event.key.row);
       #elif defined(MUSIC_MODE_GUITAR)
-      float freq = ((float)220.0)*pow(2.0, -5.0)*pow(2.0,(music_starting_note + record->event.key.col + music_offset)/12.0+(float)(MATRIX_ROWS - record->event.key.row + 7)*5.0/12);
+      uint8_t note = (music_starting_note + record->event.key.col + music_offset + 32)+5*(MATRIX_ROWS - record->event.key.row);
       #elif defined(MUSIC_MODE_VIOLIN)
-      float freq = ((float)220.0)*pow(2.0, -5.0)*pow(2.0,(music_starting_note + record->event.key.col + music_offset)/12.0+(float)(MATRIX_ROWS - record->event.key.row + 5)*7.0/12);
+      uint8_t note = (music_starting_note + record->event.key.col + music_offset + 32)+7*(MATRIX_ROWS - record->event.key.row);
       #else
-      float freq = ((float)220.0)*pow(2.0, -5.0)*pow(2.0,(music_starting_note + SCALE[record->event.key.col + music_offset])/12.0+(MATRIX_ROWS - record->event.key.row));
+      uint8_t note = (music_starting_note + SCALE[record->event.key.col + music_offset] - 3)+12*(MATRIX_ROWS - record->event.key.row);
       #endif
-      #endif // AUDIO_ENABLE
 
       if (record->event.pressed) {
-      	#ifdef AUDIO_ENABLE
-        play_note(freq, 0xF);
+        music_noteon(note);
         if (music_sequence_recording) {
-          music_sequence[music_sequence_count] = freq;
+          music_sequence[music_sequence_count] = note;
           music_sequence_count++;
         }
-        #endif
       } else {
-      	#ifdef AUDIO_ENABLE
-        stop_note(freq);
-        #endif
+        music_noteoff(note);
       }
 
       if (keycode < 0xFF) // ignores all normal keycodes, but lets RAISE, LOWER, etc through
@@ -177,32 +164,26 @@ void music_on(void) {
 
 void music_off(void) {
     music_activated = 0;
-    #ifdef AUDIO_ENABLE
-    stop_all_notes();
-    #endif
+    music_all_notes_off();
 }
 
-
-__attribute__ ((weak))
-void music_on_user() {}
-
-#ifdef AUDIO_ENABLE
-__attribute__ ((weak))
-void audio_on_user() {}
-#endif
-
-__attribute__ ((weak))
-void music_scale_user() {}
-
 void matrix_scan_music(void) {
   if (music_sequence_playing) {
     if ((music_sequence_timer == 0) || (timer_elapsed(music_sequence_timer) > music_sequence_interval)) {
       music_sequence_timer = timer_read();
-      #ifdef AUDIO_ENABLE
-      stop_note(music_sequence[(music_sequence_position - 1 < 0)?(music_sequence_position - 1 + music_sequence_count):(music_sequence_position - 1)]);
-      play_note(music_sequence[music_sequence_position], 0xF);
-      #endif
+      uint8_t prev_note = music_sequence[(music_sequence_position - 1 < 0)?(music_sequence_position - 1 + music_sequence_count):(music_sequence_position - 1)];
+      uint8_t next_note = music_sequence[music_sequence_position];
+      music_noteoff(prev_note);
+      music_noteon(next_note);
       music_sequence_position = (music_sequence_position + 1) % music_sequence_count;
     }
   }
 }
+
+__attribute__ ((weak))
+void music_on_user() {}
+
+__attribute__ ((weak))
+void music_scale_user() {}
+
+#endif // defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC))
\ No newline at end of file
diff --git a/quantum/process_keycode/process_music.h b/quantum/process_keycode/process_music.h
index 318b3e387..69913b276 100644
--- a/quantum/process_keycode/process_music.h
+++ b/quantum/process_keycode/process_music.h
@@ -3,6 +3,8 @@
 
 #include "quantum.h"
 
+#if defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC))
+
 bool process_music(uint16_t keycode, keyrecord_t *record);
 
 bool is_music_on(void);
@@ -10,7 +12,6 @@ void music_toggle(void);
 void music_on(void);
 void music_off(void);
 
-void audio_on_user(void);
 void music_on_user(void);
 void music_scale_user(void);
 
@@ -24,4 +25,6 @@ void matrix_scan_music(void);
                            0 + (12*4), 2 + (12*4), 4 + (12*4), 5 + (12*4), 7 + (12*4), 9 + (12*4), 11 + (12*4), }
 #endif
 
+#endif // defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC))
+
 #endif
\ No newline at end of file
-- 
cgit v1.2.3


From ea14ed122fb5c1b3be5f5d6edda9b39b151692e5 Mon Sep 17 00:00:00 2001
From: Gabriel Young <gabeplaysdrums@live.com>
Date: Sat, 25 Feb 2017 19:37:33 -0800
Subject: Add basic layer to sample MIDI keycap

---
 quantum/process_keycode/process_audio.c | 2 +-
 quantum/process_keycode/process_music.c | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_audio.c b/quantum/process_keycode/process_audio.c
index 5b5da546e..d45242c9e 100644
--- a/quantum/process_keycode/process_audio.c
+++ b/quantum/process_keycode/process_audio.c
@@ -28,7 +28,7 @@ bool process_audio(uint16_t keycode, keyrecord_t *record) {
         {
             audio_on();
         }
-      return false;
+        return false;
     }
 
     if (keycode == MUV_IN && record->event.pressed) {
diff --git a/quantum/process_keycode/process_music.c b/quantum/process_keycode/process_music.c
index a1e270df1..43bcf973e 100644
--- a/quantum/process_keycode/process_music.c
+++ b/quantum/process_keycode/process_music.c
@@ -142,7 +142,8 @@ bool process_music(uint16_t keycode, keyrecord_t *record) {
       if (keycode < 0xFF) // ignores all normal keycodes, but lets RAISE, LOWER, etc through
         return false;
     }
-  return true;
+
+    return true;
 }
 
 bool is_music_on(void) {
-- 
cgit v1.2.3


From a64ae1066250d3aafb6e9670bf617237ec4338e7 Mon Sep 17 00:00:00 2001
From: Gabriel Young <gabeplaysdrums@live.com>
Date: Sat, 25 Feb 2017 20:41:13 -0800
Subject: Update existing keymaps

Update existing keymaps to enable MIDI_BASIC functionality.  Also added
an option MIDI_ENABLE_STRICT to be strict about keycode use (which also
reduces memory footprint at runtime)
---
 quantum/process_keycode/process_audio.c | 4 ++--
 quantum/process_keycode/process_music.c | 2 +-
 quantum/process_keycode/process_music.h | 1 +
 3 files changed, 4 insertions(+), 3 deletions(-)

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_audio.c b/quantum/process_keycode/process_audio.c
index d45242c9e..71c0297ee 100644
--- a/quantum/process_keycode/process_audio.c
+++ b/quantum/process_keycode/process_audio.c
@@ -1,5 +1,5 @@
-#include "process_audio.h"
 #include "audio.h"
+#include "process_audio.h"
 
 static float compute_freq_for_midi_note(uint8_t note)
 {
@@ -43,7 +43,7 @@ bool process_audio(uint16_t keycode, keyrecord_t *record) {
         return false;
     }
 
-    return true
+    return true;
 }
 
 void process_audio_noteon(uint8_t note) {
diff --git a/quantum/process_keycode/process_music.c b/quantum/process_keycode/process_music.c
index 43bcf973e..4b86b91f0 100644
--- a/quantum/process_keycode/process_music.c
+++ b/quantum/process_keycode/process_music.c
@@ -42,7 +42,7 @@ static void music_noteoff(uint8_t note) {
     #endif
 }
 
-static void music_all_notes_off(void) {
+void music_all_notes_off(void) {
     #ifdef AUDIO_ENABLE
     process_audio_stop_all_notes();
     #endif
diff --git a/quantum/process_keycode/process_music.h b/quantum/process_keycode/process_music.h
index 69913b276..a36514a44 100644
--- a/quantum/process_keycode/process_music.h
+++ b/quantum/process_keycode/process_music.h
@@ -14,6 +14,7 @@ void music_off(void);
 
 void music_on_user(void);
 void music_scale_user(void);
+void music_all_notes_off(void);
 
 void matrix_scan_music(void);
 
-- 
cgit v1.2.3


From d11962aeb27c73b87f8154d7f2cee747c8858d09 Mon Sep 17 00:00:00 2001
From: Gabriel Young <gabeplaysdrums@live.com>
Date: Thu, 2 Mar 2017 11:40:06 -0800
Subject: fix 'stop_all_notes' naming to be more consistent

---
 quantum/process_keycode/process_audio.c | 2 +-
 quantum/process_keycode/process_audio.h | 2 +-
 quantum/process_keycode/process_midi.c  | 2 +-
 quantum/process_keycode/process_midi.h  | 2 +-
 quantum/process_keycode/process_music.c | 4 ++--
 5 files changed, 6 insertions(+), 6 deletions(-)

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_audio.c b/quantum/process_keycode/process_audio.c
index 71c0297ee..0b6380ed3 100644
--- a/quantum/process_keycode/process_audio.c
+++ b/quantum/process_keycode/process_audio.c
@@ -54,7 +54,7 @@ void process_audio_noteoff(uint8_t note) {
     stop_note(compute_freq_for_midi_note(note));
 }
 
-void process_audio_stop_all_notes(void) {
+void process_audio_all_notes_off(void) {
     stop_all_notes();
 }
 
diff --git a/quantum/process_keycode/process_audio.h b/quantum/process_keycode/process_audio.h
index 59a17725a..7ac15b733 100644
--- a/quantum/process_keycode/process_audio.h
+++ b/quantum/process_keycode/process_audio.h
@@ -4,7 +4,7 @@
 bool process_audio(uint16_t keycode, keyrecord_t *record);
 void process_audio_noteon(uint8_t note);
 void process_audio_noteoff(uint8_t note);
-void process_audio_stop_all_notes(void);
+void process_audio_all_notes_off(void);
 
 void audio_on_user(void);
 
diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c
index 214bba902..700c6ce8e 100644
--- a/quantum/process_keycode/process_midi.c
+++ b/quantum/process_keycode/process_midi.c
@@ -15,7 +15,7 @@ void process_midi_basic_noteoff(uint8_t note)
     midi_send_noteoff(&midi_device, 0, note, 0);
 }
 
-void process_midi_basic_stop_all_notes(void)
+void process_midi_all_notes_off(void)
 {
     midi_send_cc(&midi_device, 0, 0x7B, 0);
 }
diff --git a/quantum/process_keycode/process_midi.h b/quantum/process_keycode/process_midi.h
index 0f559ec23..58b7650c6 100644
--- a/quantum/process_keycode/process_midi.h
+++ b/quantum/process_keycode/process_midi.h
@@ -8,7 +8,7 @@
 #ifdef MIDI_BASIC
 void process_midi_basic_noteon(uint8_t note);
 void process_midi_basic_noteoff(uint8_t note);
-void process_midi_basic_stop_all_notes(void);
+void process_midi_all_notes_off(void);
 #endif
 
 #ifdef MIDI_ADVANCED
diff --git a/quantum/process_keycode/process_music.c b/quantum/process_keycode/process_music.c
index 4b86b91f0..f89a04ee3 100644
--- a/quantum/process_keycode/process_music.c
+++ b/quantum/process_keycode/process_music.c
@@ -44,10 +44,10 @@ static void music_noteoff(uint8_t note) {
 
 void music_all_notes_off(void) {
     #ifdef AUDIO_ENABLE
-    process_audio_stop_all_notes();
+    process_audio_all_notes_off();
     #endif
     #if defined(MIDI_ENABLE) && defined(MIDI_BASIC)
-    process_midi_basic_stop_all_notes();
+    process_midi_all_notes_off();
     #endif
 }
 
-- 
cgit v1.2.3


From 23839b8c6d2f955e4da89b0981948c721346c528 Mon Sep 17 00:00:00 2001
From: skullydazed <skullydazed@users.noreply.github.com>
Date: Tue, 28 Mar 2017 15:20:36 -0700
Subject: Clarify the quantum license (#1042)

* Clarify the license for files we have signoff on

* Update against the currently signed off files

* Remove unused and not clearly licensed headers

* Replace an #endif I accidentally removed while resolving merge conflicts
---
 quantum/process_keycode/process_chording.c       | 18 +++++++++++++++++-
 quantum/process_keycode/process_chording.h       | 18 +++++++++++++++++-
 quantum/process_keycode/process_combo.c          | 16 ++++++++++++++++
 quantum/process_keycode/process_combo.h          | 16 ++++++++++++++++
 quantum/process_keycode/process_leader.c         | 18 +++++++++++++++++-
 quantum/process_keycode/process_leader.h         | 18 +++++++++++++++++-
 quantum/process_keycode/process_midi.c           | 15 +++++++++++++++
 quantum/process_keycode/process_midi.h           | 18 +++++++++++++++++-
 quantum/process_keycode/process_music.c          | 15 +++++++++++++++
 quantum/process_keycode/process_music.h          | 18 +++++++++++++++++-
 quantum/process_keycode/process_printer.c        | 18 +++++++++++++++++-
 quantum/process_keycode/process_printer.h        | 18 +++++++++++++++++-
 quantum/process_keycode/process_printer_bb.c     | 18 +++++++++++++++++-
 quantum/process_keycode/process_tap_dance.c      | 15 +++++++++++++++
 quantum/process_keycode/process_tap_dance.h      | 15 +++++++++++++++
 quantum/process_keycode/process_ucis.c           | 18 +++++++++++++++++-
 quantum/process_keycode/process_ucis.h           | 16 ++++++++++++++++
 quantum/process_keycode/process_unicode.c        | 15 +++++++++++++++
 quantum/process_keycode/process_unicode.h        | 15 +++++++++++++++
 quantum/process_keycode/process_unicode_common.c | 18 +++++++++++++++++-
 quantum/process_keycode/process_unicode_common.h | 18 +++++++++++++++++-
 quantum/process_keycode/process_unicodemap.c     | 18 +++++++++++++++++-
 quantum/process_keycode/process_unicodemap.h     | 18 +++++++++++++++++-
 23 files changed, 376 insertions(+), 14 deletions(-)

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_chording.c b/quantum/process_keycode/process_chording.c
index d7814629f..6c6ebe300 100644
--- a/quantum/process_keycode/process_chording.c
+++ b/quantum/process_keycode/process_chording.c
@@ -1,3 +1,19 @@
+/* Copyright 2016 Jack Humbert
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
 #include "process_chording.h"
 
 bool keys_chord(uint8_t keys[]) {
@@ -57,4 +73,4 @@ bool process_chording(uint16_t keycode, keyrecord_t *record) {
     }
   }
   return true;
-}
\ No newline at end of file
+}
diff --git a/quantum/process_keycode/process_chording.h b/quantum/process_keycode/process_chording.h
index 49c97db3b..8c0f4862a 100644
--- a/quantum/process_keycode/process_chording.h
+++ b/quantum/process_keycode/process_chording.h
@@ -1,3 +1,19 @@
+/* Copyright 2016 Jack Humbert
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
 #ifndef PROCESS_CHORDING_H
 #define PROCESS_CHORDING_H
 
@@ -13,4 +29,4 @@ uint8_t chord_key_down = 0;
 
 bool process_chording(uint16_t keycode, keyrecord_t *record);
 
-#endif
\ No newline at end of file
+#endif
diff --git a/quantum/process_keycode/process_combo.c b/quantum/process_keycode/process_combo.c
index e2189ad98..58d45add2 100644
--- a/quantum/process_keycode/process_combo.c
+++ b/quantum/process_keycode/process_combo.c
@@ -1,3 +1,19 @@
+/* Copyright 2016 Jack Humbert
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
 #include "process_combo.h"
 #include "print.h"
 
diff --git a/quantum/process_keycode/process_combo.h b/quantum/process_keycode/process_combo.h
index 847f2b737..a5dbd788a 100644
--- a/quantum/process_keycode/process_combo.h
+++ b/quantum/process_keycode/process_combo.h
@@ -1,3 +1,19 @@
+/* Copyright 2016 Jack Humbert
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
 #ifndef PROCESS_COMBO_H
 #define PROCESS_COMBO_H
 
diff --git a/quantum/process_keycode/process_leader.c b/quantum/process_keycode/process_leader.c
index e53d221e7..473906d65 100644
--- a/quantum/process_keycode/process_leader.c
+++ b/quantum/process_keycode/process_leader.c
@@ -1,3 +1,19 @@
+/* Copyright 2016 Jack Humbert
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
 #include "process_leader.h"
 
 __attribute__ ((weak))
@@ -35,4 +51,4 @@ bool process_leader(uint16_t keycode, keyrecord_t *record) {
     }
   }
   return true;
-}
\ No newline at end of file
+}
diff --git a/quantum/process_keycode/process_leader.h b/quantum/process_keycode/process_leader.h
index c83db8abb..da7a3d2ef 100644
--- a/quantum/process_keycode/process_leader.h
+++ b/quantum/process_keycode/process_leader.h
@@ -1,3 +1,19 @@
+/* Copyright 2016 Jack Humbert
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
 #ifndef PROCESS_LEADER_H
 #define PROCESS_LEADER_H
 
@@ -20,4 +36,4 @@ void leader_end(void);
 #define LEADER_EXTERNS() extern bool leading; extern uint16_t leader_time; extern uint16_t leader_sequence[5]; extern uint8_t leader_sequence_size
 #define LEADER_DICTIONARY() if (leading && timer_elapsed(leader_time) > LEADER_TIMEOUT)
 
-#endif
\ No newline at end of file
+#endif
diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c
index 700c6ce8e..9184feaae 100644
--- a/quantum/process_keycode/process_midi.c
+++ b/quantum/process_keycode/process_midi.c
@@ -1,3 +1,18 @@
+/* Copyright 2016 Jack Humbert
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
 #include "process_midi.h"
 
 #ifdef MIDI_ENABLE
diff --git a/quantum/process_keycode/process_midi.h b/quantum/process_keycode/process_midi.h
index 58b7650c6..ccac8981a 100644
--- a/quantum/process_keycode/process_midi.h
+++ b/quantum/process_keycode/process_midi.h
@@ -1,3 +1,19 @@
+/* Copyright 2016 Jack Humbert
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
 #ifndef PROCESS_MIDI_H
 #define PROCESS_MIDI_H
 
@@ -37,4 +53,4 @@ uint8_t midi_compute_note(uint16_t keycode);
 
 #endif // MIDI_ENABLE
 
-#endif
\ No newline at end of file
+#endif
diff --git a/quantum/process_keycode/process_music.c b/quantum/process_keycode/process_music.c
index f89a04ee3..217dca280 100644
--- a/quantum/process_keycode/process_music.c
+++ b/quantum/process_keycode/process_music.c
@@ -1,3 +1,18 @@
+/* Copyright 2016 Jack Humbert
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
 #include "process_music.h"
 
 #ifdef AUDIO_ENABLE
diff --git a/quantum/process_keycode/process_music.h b/quantum/process_keycode/process_music.h
index a36514a44..8dfbf041f 100644
--- a/quantum/process_keycode/process_music.h
+++ b/quantum/process_keycode/process_music.h
@@ -1,3 +1,19 @@
+/* Copyright 2016 Jack Humbert
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
 #ifndef PROCESS_MUSIC_H
 #define PROCESS_MUSIC_H
 
@@ -28,4 +44,4 @@ void matrix_scan_music(void);
 
 #endif // defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC))
 
-#endif
\ No newline at end of file
+#endif
diff --git a/quantum/process_keycode/process_printer.c b/quantum/process_keycode/process_printer.c
index 2e11dd366..807f7a0b9 100644
--- a/quantum/process_keycode/process_printer.c
+++ b/quantum/process_keycode/process_printer.c
@@ -1,3 +1,19 @@
+/* Copyright 2016 Jack Humbert
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
 #include "process_printer.h"
 #include "action_util.h"
 
@@ -251,4 +267,4 @@ bool process_printer(uint16_t keycode, keyrecord_t *record) {
 	}
 	return true;
 
-}
\ No newline at end of file
+}
diff --git a/quantum/process_keycode/process_printer.h b/quantum/process_keycode/process_printer.h
index fdd36d75a..aa494ac8a 100644
--- a/quantum/process_keycode/process_printer.h
+++ b/quantum/process_keycode/process_printer.h
@@ -1,3 +1,19 @@
+/* Copyright 2016 Jack Humbert
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
 #ifndef PROCESS_PRINTER_H
 #define PROCESS_PRINTER_H
 
@@ -5,4 +21,4 @@
 
 #include "protocol/serial.h"
 
-#endif
\ No newline at end of file
+#endif
diff --git a/quantum/process_keycode/process_printer_bb.c b/quantum/process_keycode/process_printer_bb.c
index 1924d0377..55d3b552b 100644
--- a/quantum/process_keycode/process_printer_bb.c
+++ b/quantum/process_keycode/process_printer_bb.c
@@ -1,3 +1,19 @@
+/* Copyright 2016 Jack Humbert
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
 #include "process_printer.h"
 #include "action_util.h"
 
@@ -257,4 +273,4 @@ bool process_printer(uint16_t keycode, keyrecord_t *record) {
 	}
 	return true;
 
-}
\ No newline at end of file
+}
diff --git a/quantum/process_keycode/process_tap_dance.c b/quantum/process_keycode/process_tap_dance.c
index 403dca538..68c8425bb 100644
--- a/quantum/process_keycode/process_tap_dance.c
+++ b/quantum/process_keycode/process_tap_dance.c
@@ -1,3 +1,18 @@
+/* Copyright 2016 Jack Humbert
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
 #include "quantum.h"
 #include "action_tapping.h"
 
diff --git a/quantum/process_keycode/process_tap_dance.h b/quantum/process_keycode/process_tap_dance.h
index 726752ecc..330809f83 100644
--- a/quantum/process_keycode/process_tap_dance.h
+++ b/quantum/process_keycode/process_tap_dance.h
@@ -1,3 +1,18 @@
+/* Copyright 2016 Jack Humbert
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
 #ifndef PROCESS_TAP_DANCE_H
 #define PROCESS_TAP_DANCE_H
 
diff --git a/quantum/process_keycode/process_ucis.c b/quantum/process_keycode/process_ucis.c
index 4ad2533b0..86c0937f5 100644
--- a/quantum/process_keycode/process_ucis.c
+++ b/quantum/process_keycode/process_ucis.c
@@ -1,3 +1,19 @@
+/* Copyright 2017 Jack Humbert
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
 #include "process_ucis.h"
 
 qk_ucis_state_t qk_ucis_state;
@@ -130,4 +146,4 @@ bool process_ucis (uint16_t keycode, keyrecord_t *record) {
     return false;
   }
   return true;
-}
\ No newline at end of file
+}
diff --git a/quantum/process_keycode/process_ucis.h b/quantum/process_keycode/process_ucis.h
index 4332f57b3..3f736a709 100644
--- a/quantum/process_keycode/process_ucis.h
+++ b/quantum/process_keycode/process_ucis.h
@@ -1,3 +1,19 @@
+/* Copyright 2017 Jack Humbert
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
 #ifndef PROCESS_UCIS_H
 #define PROCESS_UCIS_H
 
diff --git a/quantum/process_keycode/process_unicode.c b/quantum/process_keycode/process_unicode.c
index ccae6fdca..26571ea03 100644
--- a/quantum/process_keycode/process_unicode.c
+++ b/quantum/process_keycode/process_unicode.c
@@ -1,3 +1,18 @@
+/* Copyright 2016 Jack Humbert
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
 #include "process_unicode.h"
 #include "action_util.h"
 
diff --git a/quantum/process_keycode/process_unicode.h b/quantum/process_keycode/process_unicode.h
index 4c21f11eb..c525b74f0 100644
--- a/quantum/process_keycode/process_unicode.h
+++ b/quantum/process_keycode/process_unicode.h
@@ -1,3 +1,18 @@
+/* Copyright 2016 Jack Humbert
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
 #ifndef PROCESS_UNICODE_H
 #define PROCESS_UNICODE_H
 
diff --git a/quantum/process_keycode/process_unicode_common.c b/quantum/process_keycode/process_unicode_common.c
index 31bc3b7ab..6012b4f07 100644
--- a/quantum/process_keycode/process_unicode_common.c
+++ b/quantum/process_keycode/process_unicode_common.c
@@ -1,3 +1,19 @@
+/* Copyright 2017 Jack Humbert
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
 #include "process_unicode_common.h"
 
 uint8_t mods;
@@ -82,4 +98,4 @@ void register_hex(uint16_t hex) {
     register_code(hex_to_keycode(digit));
     unregister_code(hex_to_keycode(digit));
   }
-}
\ No newline at end of file
+}
diff --git a/quantum/process_keycode/process_unicode_common.h b/quantum/process_keycode/process_unicode_common.h
index 864693cdd..f5be1da5c 100644
--- a/quantum/process_keycode/process_unicode_common.h
+++ b/quantum/process_keycode/process_unicode_common.h
@@ -1,3 +1,19 @@
+/* Copyright 2017 Jack Humbert
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
 #ifndef PROCESS_UNICODE_COMMON_H
 #define PROCESS_UNICODE_COMMON_H
 
@@ -129,4 +145,4 @@ void register_hex(uint16_t hex);
 #define UC_TILD	UC(0x007E)
 #define UC_DEL	UC(0x007F)
 
-#endif
\ No newline at end of file
+#endif
diff --git a/quantum/process_keycode/process_unicodemap.c b/quantum/process_keycode/process_unicodemap.c
index 68a593a18..0227fbdd7 100644
--- a/quantum/process_keycode/process_unicodemap.c
+++ b/quantum/process_keycode/process_unicodemap.c
@@ -1,3 +1,19 @@
+/* Copyright 2017 Jack Humbert
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
 #include "process_unicodemap.h"
 #include "process_unicode_common.h"
 
@@ -53,4 +69,4 @@ bool process_unicode_map(uint16_t keycode, keyrecord_t *record) {
     }
   }
   return true;
-}
\ No newline at end of file
+}
diff --git a/quantum/process_keycode/process_unicodemap.h b/quantum/process_keycode/process_unicodemap.h
index 64a7a0109..929c88c0b 100644
--- a/quantum/process_keycode/process_unicodemap.h
+++ b/quantum/process_keycode/process_unicodemap.h
@@ -1,3 +1,19 @@
+/* Copyright 2017 Jack Humbert
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
 #ifndef PROCESS_UNICODEMAP_H
 #define PROCESS_UNICODEMAP_H
 
@@ -6,4 +22,4 @@
 
 void unicode_map_input_error(void);
 bool process_unicode_map(uint16_t keycode, keyrecord_t *record);
-#endif
\ No newline at end of file
+#endif
-- 
cgit v1.2.3


From 7e54332890f4c376314f942574c6183c87a6e9c8 Mon Sep 17 00:00:00 2001
From: nielsenz <nielsen.zac@gmail.com>
Date: Thu, 30 Mar 2017 19:15:43 -0700
Subject: Pulling and pushing troubles

---
 quantum/process_keycode/process_unicode.c        | 75 ------------------------
 quantum/process_keycode/process_unicode_common.c | 15 +++++
 2 files changed, 15 insertions(+), 75 deletions(-)

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_unicode.c b/quantum/process_keycode/process_unicode.c
index cecfaeee9..1f16b9bdb 100644
--- a/quantum/process_keycode/process_unicode.c
+++ b/quantum/process_keycode/process_unicode.c
@@ -16,81 +16,6 @@
 #include "process_unicode.h"
 #include "action_util.h"
 
-static uint8_t input_mode;
-static uint8_t first_flag = 0;
-
-__attribute__((weak))
-uint16_t hex_to_keycode(uint8_t hex)
-{
-  if (hex == 0x0) {
-    return KC_0;
-  } else if (hex < 0xA) {
-    return KC_1 + (hex - 0x1);
-  } else {
-    return KC_A + (hex - 0xA);
-  }
-}
-
-void set_unicode_input_mode(uint8_t os_target)
-{
-  input_mode = os_target;
-  eeprom_update_byte(EECONFIG_UNICODEMODE, os_target);
-}
-
-uint8_t get_unicode_input_mode(void) {
-  return input_mode;
-}
-
-__attribute__((weak))
-void unicode_input_start (void) {
-  switch(input_mode) {
-  case UC_OSX:
-    register_code(KC_LALT);
-    break;
-  case UC_LNX:
-    register_code(KC_LCTL);
-    register_code(KC_LSFT);
-    register_code(KC_U);
-    unregister_code(KC_U);
-    unregister_code(KC_LSFT);
-    unregister_code(KC_LCTL);
-    break;
-  case UC_WIN:
-    register_code(KC_LALT);
-    register_code(KC_PPLS);
-    unregister_code(KC_PPLS);
-    break;
-  case UC_WINC:
-    register_code(KC_RALT);
-    unregister_code(KC_RALT);
-    register_code(KC_U);
-    unregister_code(KC_U);
-  }
-  wait_ms(UNICODE_TYPE_DELAY);
-}
-
-__attribute__((weak))
-void unicode_input_finish (void) {
-  switch(input_mode) {
-  case UC_OSX:
-  case UC_WIN:
-    unregister_code(KC_LALT);
-    break;
-  case UC_LNX:
-    register_code(KC_SPC);
-    unregister_code(KC_SPC);
-    break;
-  }
-}
-
-void register_hex(uint16_t hex) {
-  for(int i = 3; i >= 0; i--) {
-    uint8_t digit = ((hex >> (i*4)) & 0xF);
-    register_code(hex_to_keycode(digit));
-    unregister_code(hex_to_keycode(digit));
-  }
-}
-
 
 bool process_unicode(uint16_t keycode, keyrecord_t *record) {
   if (keycode > QK_UNICODE && record->event.pressed) {
diff --git a/quantum/process_keycode/process_unicode_common.c b/quantum/process_keycode/process_unicode_common.c
index 6012b4f07..b4d4231db 100644
--- a/quantum/process_keycode/process_unicode_common.c
+++ b/quantum/process_keycode/process_unicode_common.c
@@ -16,11 +16,14 @@
 
 #include "process_unicode_common.h"
 
+static uint8_t input_mode;
+static uint8_t first_flag = 0;
 uint8_t mods;
 
 void set_unicode_input_mode(uint8_t os_target)
 {
   input_mode = os_target;
+  eeprom_update_byte(EECONFIG_UNICODEMODE, os_target);
 }
 
 uint8_t get_unicode_input_mode(void) {
@@ -92,6 +95,18 @@ void unicode_input_finish (void) {
   if (mods & MOD_BIT(KC_RGUI)) register_code(KC_RGUI);
 }
 
+__attribute__((weak))
+uint16_t hex_to_keycode(uint8_t hex)
+{
+  if (hex == 0x0) {
+    return KC_0;
+  } else if (hex < 0xA) {
+    return KC_1 + (hex - 0x1);
+  } else {
+    return KC_A + (hex - 0xA);
+  }
+}
+
 void register_hex(uint16_t hex) {
   for(int i = 3; i >= 0; i--) {
     uint8_t digit = ((hex >> (i*4)) & 0xF);
-- 
cgit v1.2.3


From d1e66e2e0715c680a8da3216525b54fd8f2b671f Mon Sep 17 00:00:00 2001
From: nielsenz <nielsenz@oregonstate.edu>
Date: Thu, 30 Mar 2017 20:10:34 -0700
Subject: Worked around some new Makefile issues.

---
 quantum/process_keycode/process_tap_dance.c      | 2 ++
 quantum/process_keycode/process_unicode.c        | 1 +
 quantum/process_keycode/process_unicode_common.c | 1 -
 3 files changed, 3 insertions(+), 1 deletion(-)

(limited to 'quantum/process_keycode')

diff --git a/quantum/process_keycode/process_tap_dance.c b/quantum/process_keycode/process_tap_dance.c
index 68c8425bb..b807ec3c3 100644
--- a/quantum/process_keycode/process_tap_dance.c
+++ b/quantum/process_keycode/process_tap_dance.c
@@ -16,6 +16,8 @@
 #include "quantum.h"
 #include "action_tapping.h"
 
+uint8_t get_oneshot_mods(void);
+
 static uint16_t last_td;
 static int8_t highest_td = -1;
 
diff --git a/quantum/process_keycode/process_unicode.c b/quantum/process_keycode/process_unicode.c
index 1f16b9bdb..678a15234 100644
--- a/quantum/process_keycode/process_unicode.c
+++ b/quantum/process_keycode/process_unicode.c
@@ -16,6 +16,7 @@
 #include "process_unicode.h"
 #include "action_util.h"
 
+static uint8_t first_flag = 0;
 
 bool process_unicode(uint16_t keycode, keyrecord_t *record) {
   if (keycode > QK_UNICODE && record->event.pressed) {
diff --git a/quantum/process_keycode/process_unicode_common.c b/quantum/process_keycode/process_unicode_common.c
index b4d4231db..1dbdec3e7 100644
--- a/quantum/process_keycode/process_unicode_common.c
+++ b/quantum/process_keycode/process_unicode_common.c
@@ -17,7 +17,6 @@
 #include "process_unicode_common.h"
 
 static uint8_t input_mode;
-static uint8_t first_flag = 0;
 uint8_t mods;
 
 void set_unicode_input_mode(uint8_t os_target)
-- 
cgit v1.2.3