logo

qmk_firmware

custom branch of QMK firmware git clone https://anongit.hacktivis.me/git/qmk_firmware.git

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