qmk_firmware

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

keymap.c (33183B)


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