logo

qmk_firmware

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

keymap.c (36150B)


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