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 }