qmk_firmware

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

keymap.c (36150B)


      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 "print.h"
     18 #include "version.h"
     19 
     20 // Alias layout macros that expand groups of keys.
     21 #define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__)
     22 
     23 #define DF_QWER  DF(_QWERTY)
     24 #define DF_COLE  DF(_COLEMAK)
     25 #define MO_ADJ   MO(_ADJUST)
     26 // Long press: go to _FN layer, tap: MUTE
     27 #define FN_MUTE  LT(_FN, KC_MUTE)
     28 #define SHIF_UP  RSFT_T(KC_UP)
     29 #define ADJ_EIS  LT(_ADJUST,KC_LNG2)
     30 #define MIS_KAN  LT(_MISC,KC_LNG1)
     31 
     32 // Used to set octave to 0
     33 extern midi_config_t midi_config;
     34 uint8_t midi_bass_ch = 0, midi_chord_ch = 0;  // By default, all use the same channel.
     35 
     36 // UNISON flags
     37 static bool melody_dyad_high = false;  //  true when +1 octave unison dyad is enabled.
     38 static bool melody_dyad_low  = false;  //  true when -1 octave unison dyad is enabled.
     39 
     40 static bool melody_unison_suppress  = true;  //  true: velocity of octave unison note is suppressd to UNISON_VELOCITY_RATIO
     41 
     42 // To record the status of Bass Chord (single or dyad, default: dyad.)
     43 typedef union {
     44     uint32_t raw;
     45     struct {
     46         bool isSingleBass:1;
     47     };
     48 } user_config_t;
     49 user_config_t user_config;
     50 
     51 #define IS_SINGLE_BASS()   (user_config.isSingleBass)
     52 
     53 #ifdef RGBLIGHT_ENABLE
     54 /* used to specify there is no LED on the keylocation. */
     55 #    define NO_LED 255
     56 #endif  //  RGBLIGHT_ENABLE
     57 
     58 
     59 // Defines names for use in layer keycodes and the keymap
     60 enum layer_names {
     61     _C_SYSTEM_BASE,          //  MIDI C-system
     62     _FAKE_B_SYSTEM,          //  MIDI fake B-system doesn't have correct assignments on top two rows. The bottom 3 rows are B-system.
     63     _C_SYSTEM_BASS2ROW,      //  counter bass system
     64     _FAKE_B_SYSTEM_BASS2ROW, //  MIDI fake B-system doesn't have correct assignments on top two rows. The bottom 3 rows are B-system. Counter bass version.
     65     _C_SYSTEM_ENTIRELY,      //  single notes for both left and right keybaords.
     66     _C_SYSTEM_FREEBASS,      //  C-system Free Bass
     67     _CHROMATONE,
     68     _CFLIP_BASS2ROW,         //  180 degree flipped layout on right side keyboard
     69     _QWERTY,
     70     _COLEMAK,
     71     _ADJUST,                 //  for Fn keys, etc.
     72     _FN                      //  for changing layers, octaves, etc.
     73 };
     74 
     75 // Defines the keycodes used by our macros in process_record_user
     76 enum custom_keycodes {
     77 
     78     // MIDI Chord Keycodes - Root notes
     79     MY_CHORD_MIN = SAFE_RANGE,
     80 
     81     MI_CH_Cr = MY_CHORD_MIN,
     82     MI_CH_Csr,
     83     MI_CH_Dbr = MI_CH_Csr,
     84     MI_CH_Dr,
     85     MI_CH_Dsr,
     86     MI_CH_Ebr = MI_CH_Dsr,
     87     MI_CH_Er,
     88     MI_CH_Fr,
     89     MI_CH_Fsr,
     90     MI_CH_Gbr = MI_CH_Fsr,
     91     MI_CH_Gr,
     92     MI_CH_Gsr,
     93     MI_CH_Abr = MI_CH_Gsr,
     94     MI_CH_Ar,
     95     MI_CH_Asr,
     96     MI_CH_Bbr = MI_CH_Asr,
     97     MI_CH_Br,
     98 
     99     // MIDI Chord Keycodes - Major
    100 
    101     MI_CH_C,
    102     MI_CH_Cs,
    103     MI_CH_Db = MI_CH_Cs,
    104     MI_CH_D,
    105     MI_CH_Ds,
    106     MI_CH_Eb = MI_CH_Ds,
    107     MI_CH_E,
    108     MI_CH_F,
    109     MI_CH_Fs,
    110     MI_CH_Gb = MI_CH_Fs,
    111     MI_CH_G,
    112     MI_CH_Gs,
    113     MI_CH_Ab = MI_CH_Gs,
    114     MI_CH_A,
    115     MI_CH_As,
    116     MI_CH_Bb = MI_CH_As,
    117     MI_CH_B,
    118 
    119     // MIDI Chord Keycodes Minor
    120 
    121     MI_CH_Cm,
    122     MI_CH_Csm,
    123     MI_CH_Dbm = MI_CH_Csm,
    124     MI_CH_Dm,
    125     MI_CH_Dsm,
    126     MI_CH_Ebm = MI_CH_Dsm,
    127     MI_CH_Em,
    128     MI_CH_Fm,
    129     MI_CH_Fsm,
    130     MI_CH_Gbm = MI_CH_Fsm,
    131     MI_CH_Gm,
    132     MI_CH_Gsm,
    133     MI_CH_Abm = MI_CH_Gsm,
    134     MI_CH_Am,
    135     MI_CH_Asm,
    136     MI_CH_Bbm = MI_CH_Asm,
    137     MI_CH_Bm,
    138 
    139     //MIDI Chord Keycodes Dominant Seventh
    140 
    141     MI_CH_CDom7,
    142     MI_CH_CsDom7,
    143     MI_CH_DbDom7 = MI_CH_CsDom7,
    144     MI_CH_DDom7,
    145     MI_CH_DsDom7,
    146     MI_CH_EbDom7 = MI_CH_DsDom7,
    147     MI_CH_EDom7,
    148     MI_CH_FDom7,
    149     MI_CH_FsDom7,
    150     MI_CH_GbDom7 = MI_CH_FsDom7,
    151     MI_CH_GDom7,
    152     MI_CH_GsDom7,
    153     MI_CH_AbDom7 = MI_CH_GsDom7,
    154     MI_CH_ADom7,
    155     MI_CH_AsDom7,
    156     MI_CH_BbDom7 = MI_CH_AsDom7,
    157     MI_CH_BDom7,
    158 
    159     // MIDI Chord Keycodes Diminished Seventh
    160 
    161     MI_CH_CDim7,
    162     MI_CH_CsDim7,
    163     MI_CH_DbDim7 = MI_CH_CsDim7,
    164     MI_CH_DDim7,
    165     MI_CH_DsDim7,
    166     MI_CH_EbDim7 = MI_CH_DsDim7,
    167     MI_CH_EDim7,
    168     MI_CH_FDim7,
    169     MI_CH_FsDim7,
    170     MI_CH_GbDim7 = MI_CH_FsDim7,
    171     MI_CH_GDim7,
    172     MI_CH_GsDim7,
    173     MI_CH_AbDim7 = MI_CH_GsDim7,
    174     MI_CH_ADim7,
    175     MI_CH_AsDim7,
    176     MI_CH_BbDim7 = MI_CH_AsDim7,
    177     MI_CH_BDim7,
    178 
    179     MY_CHORD_MAX = MI_CH_BDim7,
    180 
    181     VERSION,
    182     CSYSTEM,  // C-SYSTEM layout
    183     BSYSTEM,  // B-SYSTEM layout
    184     CNTBASC,  // CouNTer BASs C-system layout
    185     CNTBASB,  // CouNTer BASs B-system layout
    186     CSYSALL,  // C-SYStem ALL layout
    187     CSYSFBS,  // C-SYStem Free BaSs
    188     CHRTONE,  // CHRomaTONE layout
    189     CFLIP2B,  // C-system FLIPped 2(to) Backwards
    190     TGLBASS,  // ToGgLe BASS unison
    191     TGLMICH,  // ToGgLe MIdi CHannel separation
    192     MELDYAL,  // MELody DYad Low
    193     MELODYS,  // MELODY Single
    194     MELDYAH,  // MELody DYad High
    195     TGLUVEL   // ToGgLe Unison VELocity
    196 };
    197 
    198 #define MY_CHORD_COUNT (MY_CHORD_MAX - MY_CHORD_MIN + 1)
    199 static uint8_t chord_status[MY_CHORD_COUNT];
    200 static uint8_t my_tone_status[MIDI_TONE_COUNT];
    201 
    202 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    203   /* C-system Base */
    204   [_C_SYSTEM_BASE] = LAYOUT(
    205     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,
    206       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,
    207         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,
    208           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,
    209             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,
    210 
    211     MI_Fs2,
    212       MI_Ab2, MI_B2,  MI_D3,  MI_F3,  MI_Ab3, MI_B3,  MI_D4,  MI_F4,  MI_Ab4, MI_B4,  MI_D5,  MI_F5,    FN_MUTE,
    213     MI_G2,  MI_Bb2, MI_Db3, MI_E3,  MI_G3,  MI_Bb3, MI_Db4, MI_E4,  MI_G4,  MI_Bb4, MI_Db5, MI_E5,  MI_G5,
    214       MI_A2,  MI_C3,  MI_Eb3, MI_Fs3, MI_A3,  MI_C4,  MI_Eb4, MI_Fs4, MI_A4,  MI_C5,  MI_Eb5, MI_Fs5
    215   ),
    216 
    217   /* fake B-system */
    218   [_FAKE_B_SYSTEM] = LAYOUT(
    219     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
    220       _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
    221         _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
    222           _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
    223             _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
    224 
    225     MI_Ab2,
    226       MI_A2,  MI_C3,  MI_Eb3, MI_Gb3, MI_A3, MI_C4,  MI_Eb4, MI_Gb4, MI_A4, MI_C5,  MI_Eb5, MI_Gb5,     _______,
    227     MI_G2,  MI_Bb2, MI_Db3, MI_E3,  MI_G3, MI_Bb3, MI_Db4, MI_E4,  MI_G4, MI_Bb4, MI_Db5, MI_E5,  MI_G5,
    228       MI_Ab2, MI_B2,  MI_D3,  MI_F3, MI_Ab3, MI_B3,  MI_D4,  MI_F4, MI_Ab4, MI_B4,  MI_D5,  MI_F5
    229   ),
    230 
    231   /* BASS2row */
    232   [_C_SYSTEM_BASS2ROW] = LAYOUT(
    233     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,
    234       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,
    235         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,
    236           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,
    237             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,
    238 
    239     MI_Fs2,
    240       MI_Ab2, MI_B2,  MI_D3,  MI_F3,  MI_Ab3, MI_B3,  MI_D4,  MI_F4,  MI_Ab4, MI_B4,  MI_D5,  MI_F5,    _______,
    241     MI_G2,  MI_Bb2, MI_Db3, MI_E3,  MI_G3,  MI_Bb3, MI_Db4, MI_E4,  MI_G4,  MI_Bb4, MI_Db5, MI_E5,  MI_G5,
    242       MI_A2,  MI_C3,  MI_Eb3, MI_Fs3, MI_A3,  MI_C4,  MI_Eb4, MI_Fs4, MI_A4,  MI_C5,  MI_Eb5, MI_Fs5
    243   ),
    244 
    245   /* fake B-system */
    246   [_FAKE_B_SYSTEM_BASS2ROW] = LAYOUT(
    247     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,
    248       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,
    249         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,
    250           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,
    251             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,
    252 
    253     MI_Ab2,
    254       MI_A2,  MI_C3,  MI_Eb3, MI_Gb3, MI_A3, MI_C4,  MI_Eb4, MI_Gb4, MI_A4, MI_C5,  MI_Eb5, MI_Gb5,     _______,
    255     MI_G2,  MI_Bb2, MI_Db3, MI_E3,  MI_G3, MI_Bb3, MI_Db4, MI_E4,  MI_G4, MI_Bb4, MI_Db5, MI_E5,  MI_G5,
    256       MI_Ab2, MI_B2,  MI_D3,  MI_F3, MI_Ab3, MI_B3,  MI_D4,  MI_F4, MI_Ab4, MI_B4,  MI_D5,  MI_F5
    257   ),
    258 
    259   /* C-system entirely */
    260   [_C_SYSTEM_ENTIRELY] = LAYOUT(
    261     MI_BNDU, XXXXXXX, XXXXXXX, MI_Db,   MI_E,    MI_G,    MI_Bb,   MI_Db1, MI_E1,  MI_G1,  MI_Bb1, MI_Db2,
    262       MI_BNDD, XXXXXXX, MI_C,    MI_Eb,   MI_Fs,   MI_A,    MI_C1,  MI_Eb1, MI_Fs1, MI_A1,  MI_C2,  MI_Eb2,
    263         XXXXXXX, XXXXXXX, MI_D,    MI_F,    MI_Ab,   MI_B,    MI_D1,  MI_F1,  MI_Ab1, MI_B1,  MI_D2,  MI_F2,
    264           XXXXXXX, MI_Db,   MI_E,    MI_G,    MI_Bb,   MI_Db1, MI_E1,  MI_G1,  MI_Bb1, MI_Db2, MI_E2,  MI_G2,
    265             MI_C,    MI_Eb,   MI_Fs,   MI_A,    MI_C1,  MI_Eb1, MI_Fs1, MI_A1,  MI_C2,  MI_Eb2, MI_Fs2, MI_A2,
    266 
    267     MI_Fs2,
    268       MI_Ab2, MI_B2,  MI_D3,  MI_F3,  MI_Ab3, MI_B3,  MI_D4,  MI_F4,  MI_Ab4, MI_B4,  MI_D5,  MI_F5,    FN_MUTE,
    269     MI_G2,  MI_Bb2, MI_Db3, MI_E3,  MI_G3,  MI_Bb3, MI_Db4, MI_E4,  MI_G4,  MI_Bb4, MI_Db5, MI_E5,  MI_G5,
    270       MI_A2,  MI_C3,  MI_Eb3, MI_Fs3, MI_A3,  MI_C4,  MI_Eb4, MI_Fs4, MI_A4,  MI_C5,  MI_Eb5, MI_Fs5
    271   ),
    272 
    273   /* C-system free bass */
    274   [_C_SYSTEM_FREEBASS] = LAYOUT(
    275     MI_Db3,  MI_Bb2,  MI_G2,   MI_E2,   MI_Db2,  MI_Bb1, MI_G1,   MI_E1,  MI_Db1,  MI_Bb,  MI_G,  MI_E,
    276       MI_C3,   MI_A2,   MI_Fs2,  MI_Eb2,  MI_C2,   MI_A1,  MI_Fs1,  MI_Eb1,  MI_C1,  MI_A,   MI_Fs, MI_Eb,
    277         MI_B2,   MI_Ab2,  MI_F2,   MI_D2,   MI_B1,  MI_Ab1,   MI_F1,  MI_D1,   MI_B,    MI_Ab,  MI_F,  MI_D,
    278           MI_Bb2, MI_G2,   MI_E2,   MI_Db2,  MI_Bb1, MI_G1,    MI_E1,  MI_Db1,   MI_Bb,  MI_G,   MI_E,  MI_Db,
    279             MI_A2,  MI_Fs2,  MI_Eb2,  MI_C2,   MI_A1,  MI_Fs1,   MI_Eb1,  MI_C1,   MI_A,   MI_Fs,  MI_Eb, MI_C,
    280 
    281     MI_Fs2,
    282       MI_Ab2, MI_B2,  MI_D3,  MI_F3,  MI_Ab3, MI_B3,  MI_D4,  MI_F4,  MI_Ab4, MI_B4,  MI_D5,  MI_F5,    FN_MUTE,
    283     MI_G2,  MI_Bb2, MI_Db3, MI_E3,  MI_G3,  MI_Bb3, MI_Db4, MI_E4,  MI_G4,  MI_Bb4, MI_Db5, MI_E5,  MI_G5,
    284       MI_A2,  MI_C3,  MI_Eb3, MI_Fs3, MI_A3,  MI_C4,  MI_Eb4, MI_Fs4, MI_A4,  MI_C5,  MI_Eb5, MI_Fs5
    285   ),
    286 
    287   /* Chromatone */
    288   [_CHROMATONE] = LAYOUT(
    289     MI_Db,   MI_Eb,   MI_F,    MI_G,    MI_A,    MI_B,    MI_Db1, MI_Eb1, MI_F1,  MI_G1,  MI_A1,  MI_B1,
    290       MI_D,    MI_E,    MI_Fs,   MI_Ab,   MI_Bb,   MI_C1,  MI_D1,  MI_E1,  MI_Fs1, MI_Ab1, MI_Bb1, MI_C2,
    291         MI_Eb,   MI_F,    MI_G,    MI_A,    MI_B,    MI_Db1, MI_Eb1, MI_F1,  MI_G1,  MI_A1,  MI_B1,  MI_Db2,
    292           MI_E,    MI_Fs,   MI_Ab,   MI_Bb,   MI_C1,  MI_D1,  MI_E1,  MI_Fs1, MI_Ab1, MI_Bb1, MI_C2,  MI_D2,
    293             MI_F,    MI_G,    MI_A,    MI_B,    MI_Db1, MI_Eb1, MI_F1,  MI_G1,  MI_A1,  MI_B1,  MI_Db2, MI_Eb2,
    294 
    295     MI_C2,
    296       MI_Db2, MI_Eb2, MI_F2,  MI_G2,  MI_A2,  MI_B2,  MI_Db3, MI_Eb3, MI_F3,  MI_G3,  MI_A3,  MI_B3,    FN_MUTE,
    297     MI_C2,  MI_D2,  MI_E2,  MI_Gb2, MI_Ab2, MI_Bb2, MI_C3,  MI_D3,  MI_E3,  MI_Gb3, MI_Ab3, MI_Bb3, MI_C4,
    298       MI_Db2, MI_Eb2, MI_F2,  MI_G2,  MI_A2,  MI_B2,  MI_Db3, MI_Eb3, MI_F3,  MI_G3,  MI_A3,  MI_B3
    299   ),
    300 
    301   [_CFLIP_BASS2ROW] = LAYOUT(
    302     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,
    303       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,
    304         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,
    305           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,
    306             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,
    307 
    308     MI_G5,
    309       MI_F5,  MI_D5,  MI_B4,  MI_Ab4, MI_F4,  MI_D4,  MI_B3,  MI_Ab3, MI_F3,  MI_D3,  MI_B2,  MI_Ab2,   FN_MUTE,
    310     MI_Fs5, MI_Eb5, MI_C5,  MI_A4,  MI_Fs4, MI_Eb4, MI_C4,  MI_A3,  MI_Fs3, MI_Eb3, MI_C3,  MI_A2,  MI_Fs2,
    311       MI_E5,  MI_Db5, MI_Bb4, MI_G4,  MI_E4,  MI_Db4, MI_Bb3, MI_G3,  MI_E3,  MI_Db3, MI_Bb2, MI_G2
    312   ),
    313 
    314   /* QWERTY */
    315   [_QWERTY] = LAYOUT_wrapper(
    316     QK_GESC, _________________NUMBER_L__________________, _________________NUMBER_R__________________, KC_BSPC,
    317       KC_TAB,  _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_DEL,
    318         KC_CAPS, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_ENT,
    319           KC_LSFT, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_RSFT,
    320             KC_LCTL, KC_LGUI, KC_LALT, ADJ_EIS, KC_SPC,  KC_SPC,  KC_LNG1, KC_APP, MO_ADJ,  KC_LEFT, KC_DOWN, KC_RGHT,
    321 
    322     _______,
    323       _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,   _______,
    324     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
    325       _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
    326   ),
    327 
    328   /* COLEMAK */
    329   [_COLEMAK] = LAYOUT_wrapper(
    330     QK_GESC, _________________NUMBER_L__________________, _________________NUMBER_R__________________, KC_BSPC,
    331       KC_TAB,  _________________COLEMAK_L1________________, _________________COLEMAK_R1________________, KC_DEL,
    332         KC_LCTL, _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, KC_ENT,
    333           KC_LSFT, _________________COLEMAK_L3________________, _________________COLEMAK_R3________________, SHIF_UP,
    334             KC_CAPS, KC_LGUI, KC_LALT, ADJ_EIS, KC_SPC,  KC_SPC,  KC_LNG1, KC_APP, MO_ADJ,  KC_LEFT, KC_DOWN, KC_RGHT,
    335 
    336     _______,
    337       _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,   _______,
    338     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
    339       _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
    340   ),
    341 
    342   /* ADJUST */
    343   [_ADJUST] = LAYOUT_wrapper(
    344     _______, _________________FUNC__L___________________, _________________FUNC__R___________________, _______,
    345       _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MINS, KC_EQL,  _______,
    346         _______, KC_VOLD, KC_VOLU, KC_MUTE, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT, KC_GRV,  _______,
    347           _______, KC_BRID, KC_BRIU, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LBRC, KC_RBRC, _______,
    348             _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_QUOT, KC_BSLS, _______,
    349 
    350     _______,
    351       _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,   _______,
    352     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
    353       _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
    354   ),
    355 
    356 
    357   /* Fn */
    358   [_FN] = LAYOUT(
    359     CSYSTEM, BSYSTEM, CNTBASC, CSYSALL, CHRTONE, CFLIP2B, CSYSFBS, CNTBASB, XXXXXXX, XXXXXXX, XXXXXXX, UG_TOGG,
    360       DF_QWER, TGLBASS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
    361         DF_COLE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, TGLMICH,
    362           XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
    363             XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
    364 
    365     XXXXXXX,
    366       MI_OCN2, MI_OCN1, MI_OC0,  MI_OC1,  MI_OC2,  XXXXXXX, XXXXXXX, MI_OCTD, MI_OCTU, XXXXXXX, VERSION, EE_CLR, _______,
    367     CSYSTEM, BSYSTEM,  CNTBASC,  CSYSALL,  CHRTONE,  CFLIP2B, CSYSFBS, CNTBASB, XXXXXXX, MI_VELD, MI_VELU, XXXXXXX, UG_TOGG,
    368       XXXXXXX,   TGLBASS,   XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX, MI_TRSD, MI_TRSU, TGLUVEL, MELDYAL, MELODYS, MELDYAH
    369   )
    370 };
    371 
    372 #if defined(ENCODER_MAP_ENABLE)
    373 const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
    374     [_C_SYSTEM_BASE]          = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
    375     [_FAKE_B_SYSTEM]          = { ENCODER_CCW_CW(_______, _______) },
    376     [_C_SYSTEM_BASS2ROW]      = { ENCODER_CCW_CW(_______, _______) },
    377     [_FAKE_B_SYSTEM_BASS2ROW] = { ENCODER_CCW_CW(_______, _______) },
    378     [_C_SYSTEM_ENTIRELY]      = { ENCODER_CCW_CW(_______, _______) },
    379     [_C_SYSTEM_FREEBASS]      = { ENCODER_CCW_CW(_______, _______) },
    380     [_CHROMATONE]             = { ENCODER_CCW_CW(_______, _______) },
    381     [_CFLIP_BASS2ROW]         = { ENCODER_CCW_CW(_______, _______) },
    382     [_QWERTY]                 = { ENCODER_CCW_CW(_______, _______) },
    383     [_COLEMAK]                = { ENCODER_CCW_CW(_______, _______) },
    384     [_ADJUST]                 = { ENCODER_CCW_CW(_______, _______) },
    385     [_FN]                     = { ENCODER_CCW_CW(_______, _______) },
    386 };
    387 #endif
    388 
    389 #ifdef RGBLIGHT_ENABLE
    390 
    391 // Light up adjust layer keys (left keyboard)
    392 const rgblight_segment_t PROGMEM my_adjust_layer[] = RGBLIGHT_LAYER_SEGMENTS({1,  10, HSV_ORANGE},
    393                                                                              {21,  2, HSV_ORANGE},
    394                                                                              {25,  3, HSV_ORANGE},
    395                                                                              {30,  5, HSV_ORANGE},
    396                                                                              {37,  2, HSV_ORANGE},
    397                                                                              {45,  2, HSV_ORANGE},
    398                                                                              {57,  2, HSV_ORANGE}
    399 );
    400 
    401 // Light up fn layer keys
    402 const rgblight_segment_t PROGMEM my_fn_layer[] = RGBLIGHT_LAYER_SEGMENTS(                           //  left keyboard
    403                                                                          {0,   8, HSV_ORANGE},      //  MIDI layouts
    404                                                                          {11,  1, HSV_RED},         //  UG_TOGG
    405                                                                          {12,  1, HSV_WHITE},       //  DF_QWER
    406                                                                          {13,  1, HSV_CORAL},       //  TGLBASS
    407                                                                          {24,  1, HSV_WHITE},       //  DF_COLE
    408                                                                          {35,  1, HSV_TEAL},        //  TGLMICH
    409 #if 0  //  Color Test
    410                                                                          {36,  1, HSV_WHITE},
    411                                                                          {37,  1, HSV_RED},
    412                                                                          {38,  1, HSV_CORAL},
    413                                                                          {39,  1, HSV_ORANGE},
    414                                                                          {40,  1, HSV_GOLDENROD},
    415                                                                          {41,  1, HSV_GOLD},
    416                                                                          {42,  1, HSV_YELLOW},
    417                                                                          {43,  1, HSV_CHARTREUSE},
    418                                                                          {44,  1, HSV_GREEN},
    419                                                                          {45,  1, HSV_SPRINGGREEN},
    420                                                                          {46,  1, HSV_TURQUOISE},
    421                                                                          {47,  1, HSV_TEAL},
    422                                                                          {48,  1, HSV_CYAN},
    423                                                                          {49,  1, HSV_AZURE},
    424                                                                          {50,  1, HSV_BLUE},
    425                                                                          {51,  1, HSV_PURPLE},
    426                                                                          {52,  1, HSV_MAGENTA},
    427                                                                          {53,  1, HSV_PINK},
    428 #endif
    429                                                                                                     //  right keyboard
    430                                                                          {60,  8, HSV_ORANGE},      //  MIDI layouts
    431                                                                          {74,  1, HSV_CORAL},       //  TGLBASS
    432                                                                          {85,  1, HSV_BLUE},        //  MIDI Oct
    433                                                                          {86,  1, HSV_CYAN},        //  MIDI Oct
    434                                                                          {87,  1, HSV_SPRINGGREEN}, //  MIDI Oct
    435                                                                          {88,  1, HSV_GREEN},       //  MIDI Oct
    436                                                                          {89,  1, HSV_CHARTREUSE},  //  MIDI Oct
    437                                                                          {95,  1, HSV_GOLD},        //  VERSION
    438                                                                          {96,  1, HSV_PINK},        //  EE_CLR
    439                                                                          {98,  8, HSV_ORANGE},      //  MIDI layouts
    440                                                                          {107, 1, HSV_YELLOW},      //  MI_VELD
    441                                                                          {108, 1, HSV_GREEN},       //  MI_VELU
    442                                                                          {110, 1, HSV_RED},         //  UG_TOGG
    443                                                                          {112, 1, HSV_CORAL},       //  TGLBASS
    444                                                                          {119, 1, HSV_CORAL},       //  TGLUVEL
    445                                                                          {120, 1, HSV_CYAN},        //  MELDYAL
    446                                                                          {121, 1, HSV_GOLD},        //  MELODYS
    447                                                                          {122, 1, HSV_SPRINGGREEN}  //  MELDYAH
    448 );
    449 
    450 // Now define the array of layers. Later layers take precedence
    451 const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(my_fn_layer, my_adjust_layer);
    452 
    453 layer_state_t layer_state_set_user(layer_state_t state) {
    454     // Both layers will light up if both kb layers are active
    455     rgblight_set_layer_state(0, layer_state_cmp(state, _FN));
    456     rgblight_set_layer_state(1, layer_state_cmp(state, _ADJUST));
    457     return state;
    458 };
    459 
    460 #endif  //  RGBLIGHT_ENABLE
    461 
    462 void my_init(void){
    463     //  Set octave to 0
    464     midi_config.octave = QK_MIDI_OCTAVE_0 - MIDI_OCTAVE_MIN;
    465     // avoid using 127 since it is used as a special number in some sound sources.
    466     midi_config.velocity = MIDI_INITIAL_VELOCITY;
    467 }
    468 
    469 void eeconfig_init_user(void) {
    470     midi_init();
    471     my_init();
    472 
    473     // Used to set octave to 0
    474     midi_bass_ch = 0, midi_chord_ch = 0;  // By default, all use the same channel.
    475 
    476     // UNISON flags
    477     melody_dyad_high = false;  //  true when +1 octave unison dyad is enabled.
    478     melody_dyad_low  = false;  //  true when -1 octave unison dyad is enabled.
    479     melody_unison_suppress  = true;  //  true: velocity of octave unison note is suppressd to UNISON_VELOCITY_RATIO
    480 
    481     //  Reset Bass setting
    482     user_config.raw = 0;  // default: dyad
    483     eeconfig_update_user(user_config.raw);
    484 
    485     //  Reset the midi keyboard layout
    486     set_single_persistent_default_layer(_C_SYSTEM_BASS2ROW);
    487 }
    488 
    489 void keyboard_post_init_user(void) {
    490     my_init();
    491 
    492     for (uint8_t i = 0; i < MY_CHORD_COUNT; i++) {
    493         chord_status[i] = MIDI_INVALID_NOTE;
    494     }
    495 
    496     for (uint8_t i = 0; i < MIDI_TONE_COUNT; i++) {
    497         my_tone_status[i] = MIDI_INVALID_NOTE;
    498     }
    499     //  load EEPROM data for isSingleBass
    500     user_config.raw = eeconfig_read_user();
    501 
    502 #ifdef RGBLIGHT_ENABLE
    503 
    504     rgblight_layers = my_rgb_layers;
    505 
    506     // Reset LED off
    507     rgblight_sethsv(HSV_BLACK);
    508 #    if defined(RGBLIGHT_EFFECT_KNIGHT) || defined(RGBLIGHT_EFFECT_TWINKLE)
    509     rgblight_sethsv(30, 50, 40);
    510 #        ifdef RGBLIGHT_EFFECT_KNIGHT
    511     rgblight_mode(RGBLIGHT_MODE_KNIGHT);
    512 #        elif defined(RGBLIGHT_EFFECT_TWINKLE)
    513     rgblight_mode(RGBLIGHT_MODE_TWINKLE+3);
    514 #        endif
    515 #    endif
    516 #endif  // RGBLIGHT_ENABLE
    517 };
    518 
    519 void toggle_isSingleBass(void) {
    520 #ifdef CONSOLE_ENABLE
    521     uprintf("isSingleBass(before) %u\n", user_config.isSingleBass);
    522 #endif
    523     user_config.isSingleBass = !user_config.isSingleBass;
    524 #ifdef CONSOLE_ENABLE
    525     uprintf("isSingleBass(after) %u\n", user_config.isSingleBass);
    526 #endif
    527 
    528     eeconfig_update_user(user_config.raw);
    529 }
    530 
    531 void toggle_MIDI_channel_separation(void) {
    532     if (midi_chord_ch > 0) {
    533         midi_chord_ch = 0;
    534         midi_bass_ch  = 0;
    535     } else {
    536         midi_chord_ch = 1;
    537         midi_bass_ch  = 2;
    538     }
    539 }
    540 
    541 #ifdef RGBLIGHT_ENABLE
    542 void switch_keylight_color4bass(keyrecord_t *record, uint8_t keylocation){
    543     switch (biton32(default_layer_state)) {
    544         case _C_SYSTEM_BASE:
    545             keylight_manager(record, HSV_GREEN, keylocation);
    546             break;
    547         case _FAKE_B_SYSTEM:
    548             keylight_manager(record, HSV_ORANGE, keylocation);
    549             break;
    550         case _C_SYSTEM_BASS2ROW:
    551         case _FAKE_B_SYSTEM_BASS2ROW:
    552             keylight_manager(record, HSV_YELLOW, keylocation);
    553             break;
    554         case _CFLIP_BASS2ROW:
    555             keylight_manager(record, HSV_PURPLE, keylocation);
    556             break;
    557     }
    558 }
    559 void switch_keylight_color4chords(keyrecord_t *record, uint8_t keylocation){
    560     switch (biton32(default_layer_state)) {
    561         case _C_SYSTEM_BASE:
    562             keylight_manager(record, HSV_SPRINGGREEN, keylocation);
    563             break;
    564         case _FAKE_B_SYSTEM:
    565             keylight_manager(record, HSV_YELLOW, keylocation);
    566             break;
    567         case _C_SYSTEM_BASS2ROW:
    568         case _FAKE_B_SYSTEM_BASS2ROW:
    569             keylight_manager(record, HSV_GOLDENROD, keylocation);
    570             break;
    571         case _CFLIP_BASS2ROW:
    572             keylight_manager(record, HSV_MAGENTA, keylocation);
    573             break;
    574     }
    575 }
    576 #endif  // RGBLIGHT_ENABLE
    577 
    578 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    579     uint16_t root_note = MIDI_INVALID_NOTE;  // Starting value for the root note of each chord
    580 
    581 #ifdef RGBLIGHT_ENABLE
    582     /* prepare for turning on LEDs when keys are pressed. */
    583     uint8_t r            = record->event.key.row;
    584     uint8_t c            = record->event.key.col;
    585     // uint8_t keylocation  = convert_key_to_led[MATRIX_COLS * r + c];
    586     // uint8_t keylocation2 = convert_key_to_led2[MATRIX_COLS * r + c];
    587     uint8_t keylocation  = pgm_read_byte(&convert_key_to_led[MATRIX_COLS * r + c]);
    588     uint8_t keylocation2 = pgm_read_byte(&convert_key_to_led2[MATRIX_COLS * r + c]);
    589 #endif  // RGBLIGHT_ENABLE
    590 
    591     uint8_t chord        = keycode - MY_CHORD_MIN;
    592 
    593     switch (keycode) {
    594         case VERSION: // Output firmware info.
    595             if (record->event.pressed) {
    596                 SEND_STRING(QMK_KEYBOARD ":" QMK_KEYMAP " @ " QMK_VERSION " | " QMK_BUILDDATE);
    597             }
    598             break;
    599 
    600         //  set default layer and save it to EEPROM when MIDI key layers are selected.
    601         case CSYSTEM:
    602             if (record->event.pressed) {
    603                 set_single_persistent_default_layer(_C_SYSTEM_BASE);
    604             }
    605             break;
    606 
    607         case BSYSTEM:
    608             if (record->event.pressed) {
    609                 set_single_persistent_default_layer(_FAKE_B_SYSTEM);
    610             }
    611             break;
    612 
    613         case CNTBASC:
    614             if (record->event.pressed) {
    615                 set_single_persistent_default_layer(_C_SYSTEM_BASS2ROW);
    616             }
    617             break;
    618 
    619         case CNTBASB:
    620             if (record->event.pressed) {
    621                 set_single_persistent_default_layer(_FAKE_B_SYSTEM_BASS2ROW);
    622             }
    623             break;
    624 
    625         case CSYSALL:
    626             if (record->event.pressed) {
    627                 set_single_persistent_default_layer(_C_SYSTEM_ENTIRELY);
    628             }
    629             break;
    630 
    631         case CHRTONE:
    632             if (record->event.pressed) {
    633                 set_single_persistent_default_layer(_CHROMATONE);
    634             }
    635             break;
    636 
    637         case CFLIP2B:
    638             if (record->event.pressed) {
    639                 set_single_persistent_default_layer(_CFLIP_BASS2ROW);
    640             }
    641             break;
    642 
    643         case CSYSFBS:
    644             if (record->event.pressed) {
    645                 set_single_persistent_default_layer(_C_SYSTEM_FREEBASS);
    646             }
    647             break;
    648 
    649         case TGLBASS:
    650             if (record->event.pressed) {
    651                 toggle_isSingleBass();
    652             };
    653             break;
    654 
    655         case TGLMICH:
    656             if (record->event.pressed) {
    657                 toggle_MIDI_channel_separation();
    658             };
    659             break;
    660 
    661         case MELDYAL:
    662             if (record->event.pressed) {
    663                 melody_dyad_low  = true;
    664                 melody_dyad_high = false;
    665             };
    666             break;
    667 
    668         case MELODYS:
    669             if (record->event.pressed) {
    670                 melody_dyad_low  = false;
    671                 melody_dyad_high = false;
    672             };
    673             break;
    674 
    675         case MELDYAH:
    676             if (record->event.pressed) {
    677                 melody_dyad_low  = false;
    678                 melody_dyad_high = true;
    679             };
    680             break;
    681 
    682         case TGLUVEL:
    683             if (record->event.pressed) {
    684                 melody_unison_suppress = !melody_unison_suppress;
    685             };
    686             break;
    687 
    688         // MIDI Chord Keycodes, on the left side.
    689         case MI_CH_Cr ... MI_CH_Br:  // Root Notes
    690             root_note = keycode - MI_CH_Cr + MI_C1;
    691             my_process_midi4Bass(midi_bass_ch, record, chord_status, chord, root_note, IS_SINGLE_BASS());
    692 #ifdef RGBLIGHT_ENABLE
    693             switch_keylight_color4bass(record, keylocation);
    694 #endif
    695             break;
    696 
    697         case MI_CH_C ... MI_CH_B:  // Major Chords
    698             root_note = keycode - MI_CH_C + MI_C2;
    699             // Root, Major Third, and Fifth Notes
    700             my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 4, 7);
    701 #ifdef RGBLIGHT_ENABLE
    702             switch_keylight_color4chords(record, keylocation);
    703 #endif
    704             break;
    705 
    706         case MI_CH_Cm ... MI_CH_Bm:  // Minor Chord
    707             root_note = keycode - MI_CH_Cm + MI_C2;
    708             // Root, Minor Third, and Fifth Notes
    709             my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 7);
    710 #ifdef RGBLIGHT_ENABLE
    711             switch_keylight_color4chords(record, keylocation);
    712 #endif
    713             break;
    714 
    715         case MI_CH_CDom7 ... MI_CH_BDom7:  // Dominant 7th Chord
    716             root_note = keycode - MI_CH_CDom7 + MI_C2;
    717             // Major Third, Major Fifth, and Minor Seventh Notes
    718             my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 4, 7, 10);
    719 #ifdef RGBLIGHT_ENABLE
    720             switch_keylight_color4chords(record, keylocation);
    721 #endif
    722             break;
    723 
    724         case MI_CH_CDim7 ... MI_CH_BDim7:                // Diminished 7th Chord
    725             root_note = keycode - MI_CH_CDim7 + MI_C2;
    726             // Root, Minor Third, and Diminished 5th Note
    727             my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 6);
    728 #ifdef RGBLIGHT_ENABLE
    729             switch_keylight_color4chords(record, keylocation);
    730 #endif
    731             break;
    732 
    733 #ifdef RGBLIGHT_ENABLE
    734         case KC_A ... KC_RGUI:                // for QWERTY
    735         case QK_GRAVE_ESCAPE:
    736         case ADJ_EIS:
    737         case MO_ADJ:
    738         case SHIF_UP:
    739             keylight_manager(record, HSV_RED, keylocation);
    740             break;
    741 #endif
    742 
    743         // Keycodes on the right side.
    744         case MIDI_TONE_MIN ... MIDI_TONE_MAX:  // notes on the right side keyboard.
    745             //  root_note is played by process_midi().
    746             if ( melody_dyad_high == true ) {        //  play 1 octave higher as well.
    747                 my_process_midi(0, keycode, record, my_tone_status, 12, melody_unison_suppress);
    748 #ifdef RGBLIGHT_ENABLE
    749                 keylight_manager(record, HSV_RED, keylocation);
    750                 keylight_manager(record, HSV_RED, keylocation2);
    751 #endif
    752             } else if ( melody_dyad_low == true ) {  //  play 1 octave lower as well.
    753                 my_process_midi(0, keycode, record, my_tone_status, -12, melody_unison_suppress);
    754 #ifdef RGBLIGHT_ENABLE
    755                 keylight_manager(record, HSV_CYAN, keylocation);
    756                 keylight_manager(record, HSV_CYAN, keylocation2);
    757 #endif
    758             } else {
    759                 uprintf("layer=%u, default_layer_state = %u\n", biton32(default_layer_state), default_layer_state);
    760 #ifdef RGBLIGHT_ENABLE
    761                 keylight_manager(record, HSV_GOLDENROD, keylocation);
    762                 keylight_manager(record, HSV_GOLDENROD, keylocation2);
    763 #endif
    764             }
    765             break;
    766 
    767 #ifdef RGBLIGHT_ENABLE
    768         // case KC_MUTE:
    769         case FN_MUTE:
    770             keylight_manager(record, HSV_GOLDENROD, keylocation);
    771             break;
    772 #endif
    773     }
    774     // If console is enabled, it will print the matrix position and status of each key pressed
    775 #if defined(CONSOLE_ENABLE) && defined(RGBLIGHT_ENABLE)
    776     uprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed);
    777     uprintf("r=%d, c=%d, keyloc=%d, keyloc2=%d, matrix_col x r + c = %d\n", r, c, keylocation, keylocation2, MATRIX_COLS * r + c);
    778 #endif
    779     return true;
    780 }