qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

keymap.c (20172B)


      1 /* Copyright 2020 3araht
      2  *
      3  * This program is free software: you can redistribute it and/or modify
      4  * it under the terms of the GNU General Public License as published by
      5  * the Free Software Foundation, either version 2 of the License, or
      6  * (at your option) any later version.
      7  *
      8  * This program is distributed in the hope that it will be useful,
      9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     11  * GNU General Public License for more details.
     12  *
     13  * You should have received a copy of the GNU General Public License
     14  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
     15  */
     16 #include QMK_KEYBOARD_H
     17 #include "version.h"
     18 
     19 // Alias layout macros that expand groups of keys.
     20 #define LAYOUT_wrapper_giabarinaix2(...) LAYOUT_giabarinaix2(__VA_ARGS__)
     21 
     22 #define DFCBASE DF(_C_SYSTEM_BASE)
     23 #define DF_QWER DF(_QWERTY)
     24 // Long press: go to _FN layer, tap: MUTE
     25 #define FN_MUTE LT(_FN, KC_MUTE)
     26 
     27 // Used to set octave to 0
     28 extern midi_config_t midi_config;
     29 uint8_t midi_bass_ch = 0, midi_chord_ch = 0;  // By default, all use the same channel.
     30 
     31 #ifdef RGBLIGHT_ENABLE
     32 /* used to specify there is no LED on the keylocation. */
     33 #    define NO_LED 255
     34 #endif  //  RGBLIGHT_ENABLE
     35 // Defines names for use in layer keycodes and the keymap
     36 enum layer_names {
     37     _C_SYSTEM_BASE,      //  MIDI C-system
     38     _C_SYSTEM_BASS2ROW,  //  counter bass system
     39     _C_SYSTEM_ENTIRELY,  //  single notes for both left and right keybaords.
     40     _CHROMATONE,
     41     _QWERTY,             //  just in case
     42     _FN
     43 };
     44 
     45 // Defines the keycodes used by our macros in process_record_user
     46 enum custom_keycodes {
     47 
     48     // MIDI Chord Keycodes - Root notes
     49     MY_CHORD_MIN = SAFE_RANGE,
     50 
     51     MI_CH_Cr = MY_CHORD_MIN,
     52     MI_CH_Csr,
     53     MI_CH_Dbr = MI_CH_Csr,
     54     MI_CH_Dr,
     55     MI_CH_Dsr,
     56     MI_CH_Ebr = MI_CH_Dsr,
     57     MI_CH_Er,
     58     MI_CH_Fr,
     59     MI_CH_Fsr,
     60     MI_CH_Gbr = MI_CH_Fsr,
     61     MI_CH_Gr,
     62     MI_CH_Gsr,
     63     MI_CH_Abr = MI_CH_Gsr,
     64     MI_CH_Ar,
     65     MI_CH_Asr,
     66     MI_CH_Bbr = MI_CH_Asr,
     67     MI_CH_Br,
     68 
     69     // MIDI Chord Keycodes - Major
     70 
     71     MI_CH_C,
     72     MI_CH_Cs,
     73     MI_CH_Db = MI_CH_Cs,
     74     MI_CH_D,
     75     MI_CH_Ds,
     76     MI_CH_Eb = MI_CH_Ds,
     77     MI_CH_E,
     78     MI_CH_F,
     79     MI_CH_Fs,
     80     MI_CH_Gb = MI_CH_Fs,
     81     MI_CH_G,
     82     MI_CH_Gs,
     83     MI_CH_Ab = MI_CH_Gs,
     84     MI_CH_A,
     85     MI_CH_As,
     86     MI_CH_Bb = MI_CH_As,
     87     MI_CH_B,
     88 
     89     // MIDI Chord Keycodes Minor
     90 
     91     MI_CH_Cm,
     92     MI_CH_Csm,
     93     MI_CH_Dbm = MI_CH_Csm,
     94     MI_CH_Dm,
     95     MI_CH_Dsm,
     96     MI_CH_Ebm = MI_CH_Dsm,
     97     MI_CH_Em,
     98     MI_CH_Fm,
     99     MI_CH_Fsm,
    100     MI_CH_Gbm = MI_CH_Fsm,
    101     MI_CH_Gm,
    102     MI_CH_Gsm,
    103     MI_CH_Abm = MI_CH_Gsm,
    104     MI_CH_Am,
    105     MI_CH_Asm,
    106     MI_CH_Bbm = MI_CH_Asm,
    107     MI_CH_Bm,
    108 
    109     //MIDI Chord Keycodes Dominant Seventh
    110 
    111     MI_CH_CDom7,
    112     MI_CH_CsDom7,
    113     MI_CH_DbDom7 = MI_CH_CsDom7,
    114     MI_CH_DDom7,
    115     MI_CH_DsDom7,
    116     MI_CH_EbDom7 = MI_CH_DsDom7,
    117     MI_CH_EDom7,
    118     MI_CH_FDom7,
    119     MI_CH_FsDom7,
    120     MI_CH_GbDom7 = MI_CH_FsDom7,
    121     MI_CH_GDom7,
    122     MI_CH_GsDom7,
    123     MI_CH_AbDom7 = MI_CH_GsDom7,
    124     MI_CH_ADom7,
    125     MI_CH_AsDom7,
    126     MI_CH_BbDom7 = MI_CH_AsDom7,
    127     MI_CH_BDom7,
    128 
    129     // MIDI Chord Keycodes Diminished Seventh
    130 
    131     MI_CH_CDim7,
    132     MI_CH_CsDim7,
    133     MI_CH_DbDim7 = MI_CH_CsDim7,
    134     MI_CH_DDim7,
    135     MI_CH_DsDim7,
    136     MI_CH_EbDim7 = MI_CH_DsDim7,
    137     MI_CH_EDim7,
    138     MI_CH_FDim7,
    139     MI_CH_FsDim7,
    140     MI_CH_GbDim7 = MI_CH_FsDim7,
    141     MI_CH_GDim7,
    142     MI_CH_GsDim7,
    143     MI_CH_AbDim7 = MI_CH_GsDim7,
    144     MI_CH_ADim7,
    145     MI_CH_AsDim7,
    146     MI_CH_BbDim7 = MI_CH_AsDim7,
    147     MI_CH_BDim7,
    148 
    149     MY_CHORD_MAX = MI_CH_BDim7,
    150 
    151     VERSION,
    152     CSYSTEM,  // C-SYSTEM layout
    153     CNTBASC,  // CouNTer BASs C-system layout
    154     CSYSALL,  // C-SYStem ALL layout
    155     CHRTONE,  // CHRomaTONE layout
    156     TGLMICH   // ToGgLe MIdi CHannel separation
    157 };
    158 
    159 #define MY_CHORD_COUNT (MY_CHORD_MAX - MY_CHORD_MIN + 1)
    160 static uint8_t chord_status[MY_CHORD_COUNT];
    161 
    162 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    163   /* C-system Base */
    164   [_C_SYSTEM_BASE] = LAYOUT_giabarinaix2(
    165     MI_CH_Dbr,    MI_CH_Abr,    MI_CH_Ebr,    MI_CH_Bbr,    MI_CH_Fr,    MI_CH_Cr,    MI_CH_Gr,    MI_CH_Dr,    MI_CH_Ar,    MI_CH_Er,    MI_CH_Br,    MI_CH_Fsr,
    166       MI_CH_Db,     MI_CH_Ab,     MI_CH_Eb,     MI_CH_Bb,     MI_CH_F,     MI_CH_C,     MI_CH_G,     MI_CH_D,     MI_CH_A,     MI_CH_E,     MI_CH_B,     MI_CH_Fs,
    167         MI_CH_Dbm,    MI_CH_Abm,    MI_CH_Ebm,    MI_CH_Bbm,    MI_CH_Fm,    MI_CH_Cm,    MI_CH_Gm,    MI_CH_Dm,    MI_CH_Am,    MI_CH_Em,    MI_CH_Bm,    MI_CH_Fsm,
    168           MI_CH_DbDom7, MI_CH_AbDom7, MI_CH_EbDom7, MI_CH_BbDom7, MI_CH_FDom7, MI_CH_CDom7, MI_CH_GDom7, MI_CH_DDom7, MI_CH_ADom7, MI_CH_EDom7, MI_CH_BDom7, MI_CH_FsDom7,
    169             MI_CH_DbDim7, MI_CH_AbDim7, MI_CH_EbDim7, MI_CH_BbDim7, MI_CH_FDim7, MI_CH_CDim7, MI_CH_GDim7, MI_CH_DDim7, MI_CH_ADim7, MI_CH_EDim7, MI_CH_BDim7, MI_CH_FsDim7,
    170 
    171     MI_Db2,      MI_E2,       MI_G2,       MI_Bb2,      MI_Db3,     MI_E3,      MI_G3,      MI_Bb3,     MI_Db4,     MI_E4,      MI_G4,      MI_Bb4,
    172       MI_Eb2,      MI_Fs2,      MI_A2,       MI_C3,       MI_Eb3,     MI_Fs3,     MI_A3,      MI_C4,      MI_Eb4,     MI_Fs4,     MI_A4,      MI_C5,
    173         MI_F2,       MI_Ab2,      MI_B2,       MI_D3,       MI_F3,      MI_Ab3,     MI_B3,      MI_D4,      MI_F4,      MI_Ab4,     MI_B4,      MI_D5,
    174           MI_G2,       MI_Bb2,      MI_Db3,      MI_E3,       MI_G3,      MI_Bb3,     MI_Db4,     MI_E4,      MI_G4,      MI_Bb4,     MI_Db5,     MI_E5,
    175             MI_A2,       MI_C3,       MI_Eb3,      MI_Fs3,      MI_A3,      MI_C4,      MI_Eb4,     MI_Fs4,     MI_A4,      MI_C5,      MI_Eb5,     FN_MUTE
    176   ),
    177 
    178   /* BASS2row */
    179   [_C_SYSTEM_BASS2ROW] = LAYOUT_giabarinaix2(
    180     MI_CH_Fr,     MI_CH_Cr,     MI_CH_Gr,     MI_CH_Dr,     MI_CH_Ar,    MI_CH_Er,    MI_CH_Br,    MI_CH_Fsr,   MI_CH_Csr,   MI_CH_Gsr,   MI_CH_Dsr,   MI_CH_Asr,
    181       MI_CH_Dbr,    MI_CH_Abr,    MI_CH_Ebr,    MI_CH_Bbr,    MI_CH_Fr,    MI_CH_Cr,    MI_CH_Gr,    MI_CH_Dr,    MI_CH_Ar,    MI_CH_Er,    MI_CH_Br,    MI_CH_Fsr,
    182         MI_CH_Db,     MI_CH_Ab,     MI_CH_Eb,     MI_CH_Bb,     MI_CH_F,     MI_CH_C,     MI_CH_G,     MI_CH_D,     MI_CH_A,     MI_CH_E,     MI_CH_B,     MI_CH_Fs,
    183           MI_CH_Dbm,    MI_CH_Abm,    MI_CH_Ebm,    MI_CH_Bbm,    MI_CH_Fm,    MI_CH_Cm,    MI_CH_Gm,    MI_CH_Dm,    MI_CH_Am,    MI_CH_Em,    MI_CH_Bm,    MI_CH_Fsm,
    184             MI_CH_DbDom7, MI_CH_AbDom7, MI_CH_EbDom7, MI_CH_BbDom7, MI_CH_FDom7, MI_CH_CDom7, MI_CH_GDom7, MI_CH_DDom7, MI_CH_ADom7, MI_CH_EDom7, MI_CH_BDom7, MI_CH_FsDom7,
    185 
    186 
    187     MI_Db2,      MI_E2,       MI_G2,       MI_Bb2,      MI_Db3,     MI_E3,      MI_G3,      MI_Bb3,     MI_Db4,     MI_E4,      MI_G4,      MI_Bb4,
    188       MI_Eb2,      MI_Fs2,      MI_A2,       MI_C3,       MI_Eb3,     MI_Fs3,     MI_A3,      MI_C4,      MI_Eb4,     MI_Fs4,     MI_A4,      MI_C5,
    189         MI_F2,       MI_Ab2,      MI_B2,       MI_D3,       MI_F3,      MI_Ab3,     MI_B3,      MI_D4,      MI_F4,      MI_Ab4,     MI_B4,      MI_D5,
    190           MI_G2,       MI_Bb2,      MI_Db3,      MI_E3,       MI_G3,      MI_Bb3,     MI_Db4,     MI_E4,      MI_G4,      MI_Bb4,     MI_Db5,     MI_E5,
    191             MI_A2,       MI_C3,       MI_Eb3,      MI_Fs3,      MI_A3,      MI_C4,      MI_Eb4,     MI_Fs4,     MI_A4,      MI_C5,      MI_Eb5,     FN_MUTE
    192   ),
    193 
    194   /* C-system entirely */
    195   [_C_SYSTEM_ENTIRELY] = LAYOUT_giabarinaix2(
    196     XXXXXXX, XXXXXXX, XXXXXXX, MI_Db,   MI_E,    MI_G,    MI_Bb,   MI_Db1, MI_E1,  MI_G1,  MI_Bb1, MI_Db2,
    197       XXXXXXX, XXXXXXX, MI_C,    MI_Eb,   MI_Fs,   MI_A,    MI_C1,  MI_Eb1, MI_Fs1, MI_A1,  MI_C2,  MI_Eb2,
    198         XXXXXXX, XXXXXXX, MI_D,    MI_F,    MI_Ab,   MI_B,    MI_D1,  MI_F1,  MI_Ab1, MI_B1,  MI_D2,  MI_F2,
    199           XXXXXXX, MI_Db,   MI_E,    MI_G,    MI_Bb,   MI_Db1, MI_E1,  MI_G1,  MI_Bb1, MI_Db2, MI_E2,  MI_G2,
    200             MI_C,    MI_Eb,   MI_Fs,   MI_A,    MI_C1,  MI_Eb1, MI_Fs1, MI_A1,  MI_C2,  MI_Eb2, MI_Fs2, MI_A2,
    201 
    202     MI_E2,  MI_G2,  MI_Bb2, MI_Db3, MI_E3,  MI_G3,  MI_Bb3, MI_Db4, MI_E4,   MI_G4, MI_Bb4, MI_Db5,
    203       MI_Fs2, MI_A2,  MI_C3,  MI_Eb3, MI_Fs3, MI_A3,  MI_C4,  MI_Eb4, MI_Fs4,  MI_A4, MI_C5,  MI_Eb5,
    204         MI_Ab2, MI_B2,  MI_D3,  MI_F3,  MI_Ab3, MI_B3,  MI_D4,  MI_F4,  MI_Ab4, MI_B4,  MI_D5,  MI_F5,
    205           MI_Bb2, MI_Db3, MI_E3,  MI_G3,  MI_Bb3, MI_Db4, MI_E4,  MI_G4,  MI_Bb4, MI_Db5, MI_E5,  MI_G5,
    206             MI_C3,  MI_Eb3, MI_Fs3, MI_A3,  MI_C4,  MI_Eb4, MI_Fs4, MI_A4,  MI_C5,  MI_Eb5, MI_Fs5,  FN_MUTE
    207   ),
    208 
    209   /* Chromatone */
    210   [_CHROMATONE] = LAYOUT_giabarinaix2(
    211     XXXXXXX, XXXXXXX, MI_Db,   MI_Eb,   MI_F,    MI_G,    MI_A,    MI_B,    MI_Db1,  MI_Eb1,  MI_F1,   MI_G1,
    212         XXXXXXX,  MI_C,    MI_D,    MI_E,    MI_Fs,   MI_Ab,   MI_Bb,   MI_C1,  MI_D1,  MI_E1,  MI_Fs1, MI_Ab1,
    213              XXXXXXX, MI_Db,   MI_Eb,   MI_F,    MI_G,    MI_A,    MI_B,    MI_Db1,  MI_Eb1,  MI_F1,   MI_G1,   MI_A1,
    214                   MI_C,    MI_D,    MI_E,    MI_Fs,   MI_Ab,   MI_Bb,   MI_C1,  MI_D1,  MI_E1,  MI_Fs1, MI_Ab1, MI_Bb1,
    215                       MI_Db,   MI_Eb,   MI_F,    MI_G,    MI_A,    MI_B,    MI_Db1,  MI_Eb1,  MI_F1,   MI_G1,   MI_A1,  MI_B1,
    216 
    217     MI_A1,  MI_B1, MI_Db2, MI_Eb2, MI_F2,  MI_G2,  MI_A2,  MI_B2,  MI_Db3,  MI_Eb3,  MI_F3,   MI_G3,
    218          MI_Bb1, MI_C2,  MI_D2,  MI_E2,  MI_Gb2, MI_Ab2, MI_Bb2, MI_C3,  MI_D3,  MI_E3,  MI_Gb3, MI_Ab3,
    219              MI_B1, MI_Db2, MI_Eb2, MI_F2,  MI_G2,  MI_A2,  MI_B2,  MI_Db3,  MI_Eb3,  MI_F3,   MI_G3,   MI_A3,
    220                   MI_C2,  MI_D2,  MI_E2,  MI_Gb2, MI_Ab2, MI_Bb2, MI_C3,  MI_D3,  MI_E3,  MI_Gb3, MI_Ab3, MI_Bb3,
    221                      MI_Db2, MI_Eb2, MI_F2,  MI_G2,  MI_A2,  MI_B2,  MI_Db3,  MI_Eb3,  MI_F3,   MI_G3,   MI_A3,  FN_MUTE
    222   ),
    223 
    224   /* QWERTY */
    225   [_QWERTY] = LAYOUT_wrapper_giabarinaix2(
    226     QK_GESC, _________________NUMBER_L__________________, _________________NUMBER_R__________________, KC_BSPC,
    227       KC_TAB,  _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_DEL,
    228         KC_CAPS, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_ENT,
    229           KC_LSFT, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_RSFT,
    230             KC_LCTL, KC_LGUI, KC_LALT, KC_LNG2, KC_SPC,  KC_SPC, KC_SPC, KC_SPC, KC_LNG1, KC_RALT,  KC_RGUI, KC_RCTL,
    231 
    232     QK_GESC, _________________NUMBER_L__________________, _________________NUMBER_R__________________, KC_BSPC,
    233       KC_TAB,  _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_DEL,
    234         KC_CAPS, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_ENT,
    235           KC_LSFT, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_RSFT,
    236             KC_LCTL, KC_LGUI, KC_LALT, KC_LNG2, KC_SPC,  KC_SPC, KC_SPC, KC_SPC, KC_LNG1, KC_RALT,  KC_RGUI, _______
    237   ),
    238 
    239   /* Fn */
    240   [_FN] = LAYOUT_giabarinaix2(
    241     CSYSTEM, CNTBASC, CSYSALL, CHRTONE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, UG_TOGG,
    242       DF_QWER, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
    243         XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, TGLMICH,
    244           XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
    245             XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
    246 
    247     CSYSTEM, CNTBASC, CSYSALL, CHRTONE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, UG_TOGG,
    248       DF_QWER, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
    249         XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, VERSION, TGLMICH,
    250           XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
    251             XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,  _______
    252   )
    253 };
    254 
    255 #if defined(ENCODER_MAP_ENABLE)
    256 const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
    257     [_C_SYSTEM_BASE]        = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
    258     [_C_SYSTEM_BASS2ROW]    = { ENCODER_CCW_CW(_______, _______) },
    259     [_C_SYSTEM_ENTIRELY]    = { ENCODER_CCW_CW(_______, _______) },
    260     [_CHROMATONE]           = { ENCODER_CCW_CW(_______, _______) },
    261     [_QWERTY]               = { ENCODER_CCW_CW(_______, _______) },
    262     [_FN]                   = { ENCODER_CCW_CW(_______, _______) },
    263 };
    264 #endif
    265 
    266 #ifdef RGBLIGHT_ENABLE
    267 
    268 // Light up fn layer keys
    269 const rgblight_segment_t PROGMEM my_fn_layer[] = RGBLIGHT_LAYER_SEGMENTS(                           //  left keyboard
    270                                                                          {0,   4, HSV_ORANGE},      //  MIDI layouts
    271                                                                          {11,  1, HSV_RED},         //  UG_TOGG
    272                                                                          {12,  1, HSV_WHITE},       //  DF_QWER
    273                                                                          {35,  1, HSV_TEAL},        //  TGLMICH
    274 
    275                                                                                                     //  right keyboard
    276                                                                          {60,  4, HSV_ORANGE},      //  MIDI layouts
    277                                                                          {71 , 1, HSV_RED},         //  UG_TOGG
    278                                                                          {72,  1, HSV_WHITE},       //  DF_QWER
    279                                                                          {83,  1, HSV_TEAL}         //  TGLMICH
    280 );
    281 
    282 
    283 // Now define the array of layers. Later layers take precedence
    284 const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(my_fn_layer);
    285 
    286 layer_state_t layer_state_set_user(layer_state_t state) {
    287     // Both layers will light up if both kb layers are active
    288     rgblight_set_layer_state(0, layer_state_cmp(state, _FN));
    289     return state;
    290 };
    291 
    292 #endif  //  RGBLIGHT_ENABLE
    293 void keyboard_post_init_user(void) {
    294     //  Set octave to 0
    295     midi_config.octave = QK_MIDI_OCTAVE_0 - MIDI_OCTAVE_MIN;
    296 
    297     // avoid using 127 since it is used as a special number in some sound sources.
    298     midi_config.velocity = MIDI_INITIAL_VELOCITY;
    299 
    300     for (uint8_t i = 0; i < MY_CHORD_COUNT; i++) {
    301         chord_status[i] = MIDI_INVALID_NOTE;
    302     }
    303 
    304 #ifdef RGBLIGHT_ENABLE
    305 
    306     rgblight_layers = my_rgb_layers;
    307 
    308     // Reset LED off
    309     rgblight_sethsv(HSV_BLACK);
    310 #    if defined(RGBLIGHT_EFFECT_KNIGHT) || defined(RGBLIGHT_EFFECT_TWINKLE)
    311     rgblight_sethsv(30, 50, 40);
    312 #        ifdef RGBLIGHT_EFFECT_KNIGHT
    313     rgblight_mode(RGBLIGHT_MODE_KNIGHT);
    314 #        elif defined(RGBLIGHT_EFFECT_TWINKLE)
    315     rgblight_mode(RGBLIGHT_MODE_TWINKLE+3);
    316 #        endif
    317 #    endif
    318 #endif  // RGBLIGHT_ENABLE
    319 };
    320 
    321 void toggle_MIDI_channel_separation(void) {
    322     if (midi_chord_ch > 0) {
    323         midi_chord_ch = 0;
    324         midi_bass_ch  = 0;
    325     } else {
    326         midi_chord_ch = 1;
    327         midi_bass_ch  = 2;
    328     }
    329 }
    330 
    331 #ifdef RGBLIGHT_ENABLE
    332 void switch_keylight_color4bass(keyrecord_t *record, uint8_t keylocation){
    333     switch (biton32(default_layer_state)) {
    334         case _C_SYSTEM_BASE:
    335             keylight_manager(record, HSV_GREEN, keylocation);
    336             break;
    337         case _C_SYSTEM_BASS2ROW:
    338             keylight_manager(record, HSV_YELLOW, keylocation);
    339             break;
    340     }
    341 }
    342 void switch_keylight_color4chords(keyrecord_t *record, uint8_t keylocation){
    343     switch (biton32(default_layer_state)) {
    344         case _C_SYSTEM_BASE:
    345             keylight_manager(record, HSV_SPRINGGREEN, keylocation);
    346             break;
    347         case _C_SYSTEM_BASS2ROW:
    348             keylight_manager(record, HSV_GOLDENROD, keylocation);
    349             break;
    350     }
    351 }
    352 #endif  // RGBLIGHT_ENABLE
    353 
    354 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    355     uint16_t root_note = MIDI_INVALID_NOTE;  // Starting value for the root note of each chord
    356 
    357     #ifdef RGBLIGHT_ENABLE
    358         /* prepare for turning on LEDs when keys are pressed. */
    359         uint8_t r            = record->event.key.row;
    360         uint8_t c            = record->event.key.col;
    361         uint8_t keylocation  = pgm_read_byte(&convert_key_to_led[MATRIX_COLS * r + c]);
    362     #endif  // RGBLIGHT_ENABLE
    363 
    364     uint8_t chord        = keycode - MY_CHORD_MIN;
    365 
    366     switch (keycode) {
    367         case VERSION: // Output firmware info.
    368             if (record->event.pressed) {
    369                 SEND_STRING(QMK_KEYBOARD ":" QMK_KEYMAP " @ " QMK_VERSION " | " QMK_BUILDDATE);
    370             }
    371             break;
    372 
    373         //  set default layer and save it to EEPROM when MIDI key layers are selected.
    374         case CSYSTEM:
    375             if (record->event.pressed) {
    376                 set_single_persistent_default_layer(_C_SYSTEM_BASE);
    377             }
    378             break;
    379 
    380         case CNTBASC:
    381             if (record->event.pressed) {
    382                 set_single_persistent_default_layer(_C_SYSTEM_BASS2ROW);
    383             }
    384             break;
    385 
    386         case CSYSALL:
    387             if (record->event.pressed) {
    388                 set_single_persistent_default_layer(_C_SYSTEM_ENTIRELY);
    389             }
    390             break;
    391 
    392         case CHRTONE:
    393             if (record->event.pressed) {
    394                 set_single_persistent_default_layer(_CHROMATONE);
    395             }
    396             break;
    397 
    398         case TGLMICH:
    399             if (record->event.pressed) {
    400                 toggle_MIDI_channel_separation();
    401             };
    402             break;
    403 
    404 
    405         // MIDI Chord Keycodes, on the left side.
    406         case MI_CH_Cr ... MI_CH_Br:  // Root Notes
    407             root_note = keycode - MI_CH_Cr + MI_C1;
    408             my_process_midi4Bass(midi_bass_ch, record, chord_status, chord, root_note, false);
    409 #ifdef RGBLIGHT_ENABLE
    410             switch_keylight_color4bass(record, keylocation);
    411 #endif
    412             break;
    413         case MI_CH_C ... MI_CH_B:  // Major Chords
    414             root_note = keycode - MI_CH_C + MI_C2;
    415             // Root, Major Third, and Fifth Notes
    416             my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 4, 7);
    417 #ifdef RGBLIGHT_ENABLE
    418             switch_keylight_color4chords(record, keylocation);
    419 #endif
    420             break;
    421         case MI_CH_Cm ... MI_CH_Bm:  // Minor Chord
    422             root_note = keycode - MI_CH_Cm + MI_C2;
    423             // Root, Minor Third, and Fifth Notes
    424             my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 7);
    425 #ifdef RGBLIGHT_ENABLE
    426             switch_keylight_color4chords(record, keylocation);
    427 #endif
    428             break;
    429         case MI_CH_CDom7 ... MI_CH_BDom7:  // Dominant 7th Chord
    430             root_note = keycode - MI_CH_CDom7 + MI_C2;
    431             // Major Third, Major Fifth, and Minor Seventh Notes
    432             my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 4, 7, 10);
    433 #ifdef RGBLIGHT_ENABLE
    434             switch_keylight_color4chords(record, keylocation);
    435 #endif
    436             break;
    437         case MI_CH_CDim7 ... MI_CH_BDim7:                // Diminished 7th Chord
    438             root_note = keycode - MI_CH_CDim7 + MI_C2;
    439             // Root, Minor Third, and Diminished 5th Note
    440             my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 6);
    441 #ifdef RGBLIGHT_ENABLE
    442             switch_keylight_color4chords(record, keylocation);
    443 #endif
    444             break;
    445 
    446 #ifdef RGBLIGHT_ENABLE
    447         case KC_A ... KC_RGUI:                // for QWERTY
    448         case QK_GRAVE_ESCAPE:
    449             keylight_manager(record, HSV_GOLDENROD, keylocation);
    450             break;
    451 #endif
    452             // Keycodes on the right side.
    453 #ifdef RGBLIGHT_ENABLE
    454         case MIDI_TONE_MIN ... MIDI_TONE_MAX:  // notes on the right side.
    455             keylight_manager(record, HSV_GOLDENROD, keylocation);
    456             break;
    457         // case KC_MUTE:
    458         case FN_MUTE:
    459             keylight_manager(record, HSV_GOLDENROD, keylocation);
    460             break;
    461 #endif
    462     }
    463     return true;
    464 }