logo

qmk_firmware

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

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