keymap.c 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754
  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 MI_OCT_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. _C_SYSTEM_ENTIRELY, // single notes for both left and right keybaords.
  55. _C_SYSTEM_FREEBASS, // C-system Free Bass
  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. CSYSFBS, // C-SYStem Free BaSs
  163. CHRTONE, // CHRomaTONE layout
  164. CFLIP2B, // C-system FLIPped 2(to) Backwards
  165. TGLBASS, // ToGgLe BASS unison
  166. TGLMICH, // ToGgLe MIdi CHannel separation
  167. MELDYAL, // MELody DYad Low
  168. MELODYS, // MELODY Single
  169. MELDYAH, // MELody DYad High
  170. TGLUVEL // ToGgLe Unison VELocity
  171. };
  172. #define MY_CHORD_COUNT (MY_CHORD_MAX - MY_CHORD_MIN + 1)
  173. static uint8_t chord_status[MY_CHORD_COUNT];
  174. static uint8_t my_tone_status[MIDI_TONE_COUNT];
  175. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  176. /* C-system Base */
  177. [_C_SYSTEM_BASE] = LAYOUT(
  178. 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,
  179. 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,
  180. 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,
  181. 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,
  182. 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,
  183. MI_Fs_2,
  184. MI_Ab_2, MI_B_2, MI_D_3, MI_F_3, MI_Ab_3, MI_B_3, MI_D_4, MI_F_4, MI_Ab_4, MI_B_4, MI_D_5, MI_F_5, FN_MUTE,
  185. MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4, MI_Db_5, MI_E_5, MI_G_5,
  186. MI_A_2, MI_C_3, MI_Eb_3, MI_Fs_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Fs_4, MI_A_4, MI_C_5, MI_Eb_5, MI_Fs_5
  187. ),
  188. /* fake B-system */
  189. [_FAKE_B_SYSTEM] = LAYOUT(
  190. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  191. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  192. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  193. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  194. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  195. MI_Ab_2,
  196. MI_A_2, MI_C_3, MI_Eb_3, MI_Gb_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Gb_4, MI_A_4, MI_C_5, MI_Eb_5, MI_Gb_5, _______,
  197. MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4, MI_Db_5, MI_E_5, MI_G_5,
  198. MI_Ab_2, MI_B_2, MI_D_3, MI_F_3, MI_Ab_3, MI_B_3, MI_D_4, MI_F_4, MI_Ab_4, MI_B_4, MI_D_5, MI_F_5
  199. ),
  200. /* BASS2row */
  201. [_C_SYSTEM_BASS2ROW] = LAYOUT(
  202. 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,
  203. 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,
  204. 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,
  205. 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,
  206. 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,
  207. MI_Fs_2,
  208. MI_Ab_2, MI_B_2, MI_D_3, MI_F_3, MI_Ab_3, MI_B_3, MI_D_4, MI_F_4, MI_Ab_4, MI_B_4, MI_D_5, MI_F_5, _______,
  209. MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4, MI_Db_5, MI_E_5, MI_G_5,
  210. MI_A_2, MI_C_3, MI_Eb_3, MI_Fs_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Fs_4, MI_A_4, MI_C_5, MI_Eb_5, MI_Fs_5
  211. ),
  212. /* C-system entirely */
  213. [_C_SYSTEM_ENTIRELY] = LAYOUT(
  214. MI_BENDU, XXXXXXX, XXXXXXX, MI_Db, MI_E, MI_G, MI_Bb, MI_Db_1, MI_E_1, MI_G_1, MI_Bb_1, MI_Db_2,
  215. MI_BENDD, XXXXXXX, MI_C, MI_Eb, MI_Fs, MI_A, MI_C_1, MI_Eb_1, MI_Fs_1, MI_A_1, MI_C_2, MI_Eb_2,
  216. XXXXXXX, XXXXXXX, MI_D, MI_F, MI_Ab, MI_B, MI_D_1, MI_F_1, MI_Ab_1, MI_B_1, MI_D_2, MI_F_2,
  217. XXXXXXX, MI_Db, MI_E, MI_G, MI_Bb, MI_Db_1, MI_E_1, MI_G_1, MI_Bb_1, MI_Db_2, MI_E_2, MI_G_2,
  218. MI_C, MI_Eb, MI_Fs, MI_A, MI_C_1, MI_Eb_1, MI_Fs_1, MI_A_1, MI_C_2, MI_Eb_2, MI_Fs_2, MI_A_2,
  219. MI_Fs_2,
  220. MI_Ab_2, MI_B_2, MI_D_3, MI_F_3, MI_Ab_3, MI_B_3, MI_D_4, MI_F_4, MI_Ab_4, MI_B_4, MI_D_5, MI_F_5, FN_MUTE,
  221. MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4, MI_Db_5, MI_E_5, MI_G_5,
  222. MI_A_2, MI_C_3, MI_Eb_3, MI_Fs_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Fs_4, MI_A_4, MI_C_5, MI_Eb_5, MI_Fs_5
  223. ),
  224. /* C-system free bass */
  225. [_C_SYSTEM_FREEBASS] = LAYOUT(
  226. MI_Db_3, MI_Bb_2, MI_G_2, MI_E_2, MI_Db_2, MI_Bb_1, MI_G_1, MI_E_1, MI_Db_1, MI_Bb, MI_G, MI_E,
  227. MI_C_3, MI_A_2, MI_Fs_2, MI_Eb_2, MI_C_2, MI_A_1, MI_Fs_1, MI_Eb_1, MI_C_1, MI_A, MI_Fs, MI_Eb,
  228. MI_B_2, MI_Ab_2, MI_F_2, MI_D_2, MI_B_1, MI_Ab_1, MI_F_1, MI_D_1, MI_B, MI_Ab, MI_F, MI_D,
  229. MI_Bb_2, MI_G_2, MI_E_2, MI_Db_2, MI_Bb_1, MI_G_1, MI_E_1, MI_Db_1, MI_Bb, MI_G, MI_E, MI_Db,
  230. MI_A_2, MI_Fs_2, MI_Eb_2, MI_C_2, MI_A_1, MI_Fs_1, MI_Eb_1, MI_C_1, MI_A, MI_Fs, MI_Eb, MI_C,
  231. MI_Fs_2,
  232. MI_Ab_2, MI_B_2, MI_D_3, MI_F_3, MI_Ab_3, MI_B_3, MI_D_4, MI_F_4, MI_Ab_4, MI_B_4, MI_D_5, MI_F_5, FN_MUTE,
  233. MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4, MI_Db_5, MI_E_5, MI_G_5,
  234. MI_A_2, MI_C_3, MI_Eb_3, MI_Fs_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Fs_4, MI_A_4, MI_C_5, MI_Eb_5, MI_Fs_5
  235. ),
  236. /* Chromatone */
  237. [_CHROMATONE] = LAYOUT(
  238. MI_Db, MI_Eb, MI_F, MI_G, MI_A, MI_B, MI_Db_1, MI_Eb_1, MI_F_1, MI_G_1, MI_A_1, MI_B_1,
  239. MI_D, MI_E, MI_Fs, MI_Ab, MI_Bb, MI_C_1, MI_D_1, MI_E_1, MI_Fs_1, MI_Ab_1, MI_Bb_1, MI_C_2,
  240. MI_Eb, MI_F, MI_G, MI_A, MI_B, MI_Db_1, MI_Eb_1, MI_F_1, MI_G_1, MI_A_1, MI_B_1, MI_Db_2,
  241. MI_E, MI_Fs, MI_Ab, MI_Bb, MI_C_1, MI_D_1, MI_E_1, MI_Fs_1, MI_Ab_1, MI_Bb_1, MI_C_2, MI_D_2,
  242. MI_F, MI_G, MI_A, MI_B, MI_Db_1, MI_Eb_1, MI_F_1, MI_G_1, MI_A_1, MI_B_1, MI_Db_2, MI_Eb_2,
  243. MI_C_2,
  244. MI_Db_2, MI_Eb_2, MI_F_2, MI_G_2, MI_A_2, MI_B_2, MI_Db_3, MI_Eb_3, MI_F_3, MI_G_3, MI_A_3, MI_B_3, FN_MUTE,
  245. MI_C_2, MI_D_2, MI_E_2, MI_Gb_2, MI_Ab_2, MI_Bb_2, MI_C_3, MI_D_3, MI_E_3, MI_Gb_3, MI_Ab_3, MI_Bb_3, MI_C_4,
  246. MI_Db_2, MI_Eb_2, MI_F_2, MI_G_2, MI_A_2, MI_B_2, MI_Db_3, MI_Eb_3, MI_F_3, MI_G_3, MI_A_3, MI_B_3
  247. ),
  248. [_CFLIP_BASS2ROW] = LAYOUT(
  249. 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,
  250. 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,
  251. 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,
  252. 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,
  253. 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,
  254. MI_G_5,
  255. MI_F_5, MI_D_5, MI_B_4, MI_Ab_4, MI_F_4, MI_D_4, MI_B_3, MI_Ab_3, MI_F_3, MI_D_3, MI_B_2, MI_Ab_2, FN_MUTE,
  256. MI_Fs_5, MI_Eb_5, MI_C_5, MI_A_4, MI_Fs_4, MI_Eb_4, MI_C_4, MI_A_3, MI_Fs_3, MI_Eb_3, MI_C_3, MI_A_2, MI_Fs_2,
  257. MI_E_5, MI_Db_5, MI_Bb_4, MI_G_4, MI_E_4, MI_Db_4, MI_Bb_3, MI_G_3, MI_E_3, MI_Db_3, MI_Bb_2, MI_G_2
  258. ),
  259. /* QWERTY */
  260. [_QWERTY] = LAYOUT_wrapper(
  261. KC_GESC, _________________NUMBER_L__________________, _________________NUMBER_R__________________, KC_BSPC,
  262. KC_TAB, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_DEL,
  263. KC_CAPS, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_ENT,
  264. KC_LSFT, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_RSFT,
  265. KC_LCTL, KC_LGUI, KC_LALT, ADJ_EIS, KC_SPC, KC_SPC, KC_LNG1, KC_APP, MO_ADJ, KC_LEFT, KC_DOWN, KC_RGHT,
  266. _______,
  267. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  268. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  269. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  270. ),
  271. /* COLEMAK */
  272. [_COLEMAK] = LAYOUT_wrapper(
  273. KC_GESC, _________________NUMBER_L__________________, _________________NUMBER_R__________________, KC_BSPC,
  274. KC_TAB, _________________COLEMAK_L1________________, _________________COLEMAK_R1________________, KC_DEL,
  275. KC_LCTL, _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, KC_ENT,
  276. KC_LSFT, _________________COLEMAK_L3________________, _________________COLEMAK_R3________________, SHIF_UP,
  277. KC_CAPS, KC_LGUI, KC_LALT, ADJ_EIS, KC_SPC, KC_SPC, KC_LNG1, KC_APP, MO_ADJ, KC_LEFT, KC_DOWN, KC_RGHT,
  278. _______,
  279. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  280. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  281. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  282. ),
  283. /* ADJUST */
  284. [_ADJUST] = LAYOUT_wrapper(
  285. _______, _________________FUNC__L___________________, _________________FUNC__R___________________, _______,
  286. _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MINS, KC_EQL, _______,
  287. _______, KC_VOLD, KC_VOLU, KC_MUTE, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_GRV, _______,
  288. _______, KC_BRID, KC_BRIU, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LBRC, KC_RBRC, _______,
  289. _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_QUOT, KC_BSLS, _______,
  290. _______,
  291. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  292. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  293. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  294. ),
  295. /* Fn */
  296. [_FN] = LAYOUT(
  297. CSYSTEM, BSYSTEM, CNTBASC, CSYSALL, CHRTONE, CFLIP2B, CSYSFBS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_TOG,
  298. DF_QWER, TGLBASS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  299. DF_COLE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, TGLMICH,
  300. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  301. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  302. XXXXXXX,
  303. MI_OCT_N2, MI_OCT_N1, MI_OCT_0, MI_OCT_1, MI_OCT_2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, VERSION, EE_CLR, _______,
  304. CSYSTEM, BSYSTEM, CNTBASC, CSYSALL, CHRTONE, CFLIP2B, CSYSFBS, XXXXXXX, XXXXXXX, MI_VELD, MI_VELU, XXXXXXX, RGB_TOG,
  305. XXXXXXX, TGLBASS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, TGLUVEL, MELDYAL, MELODYS, MELDYAH
  306. )
  307. };
  308. #if defined(ENCODER_MAP_ENABLE)
  309. const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
  310. [_C_SYSTEM_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
  311. [_FAKE_B_SYSTEM] = { ENCODER_CCW_CW(_______, _______) },
  312. [_C_SYSTEM_BASS2ROW] = { ENCODER_CCW_CW(_______, _______) },
  313. [_C_SYSTEM_ENTIRELY] = { ENCODER_CCW_CW(_______, _______) },
  314. [_C_SYSTEM_FREEBASS] = { ENCODER_CCW_CW(_______, _______) },
  315. [_CHROMATONE] = { ENCODER_CCW_CW(_______, _______) },
  316. [_CFLIP_BASS2ROW] = { ENCODER_CCW_CW(_______, _______) },
  317. [_QWERTY] = { ENCODER_CCW_CW(_______, _______) },
  318. [_COLEMAK] = { ENCODER_CCW_CW(_______, _______) },
  319. [_ADJUST] = { ENCODER_CCW_CW(_______, _______) },
  320. [_FN] = { ENCODER_CCW_CW(_______, _______) },
  321. };
  322. #endif
  323. #ifdef RGBLIGHT_ENABLE
  324. // Light up adjust layer keys (left keyboard)
  325. const rgblight_segment_t PROGMEM my_adjust_layer[] = RGBLIGHT_LAYER_SEGMENTS({1, 10, HSV_ORANGE},
  326. {21, 2, HSV_ORANGE},
  327. {25, 3, HSV_ORANGE},
  328. {30, 5, HSV_ORANGE},
  329. {37, 2, HSV_ORANGE},
  330. {45, 2, HSV_ORANGE},
  331. {57, 2, HSV_ORANGE}
  332. );
  333. // Light up fn layer keys
  334. const rgblight_segment_t PROGMEM my_fn_layer[] = RGBLIGHT_LAYER_SEGMENTS( // left keyboard
  335. {0, 7, HSV_ORANGE}, // MIDI layouts
  336. {11, 1, HSV_RED}, // RGB_TOG
  337. {12, 1, HSV_WHITE}, // DF_QWER
  338. {13, 1, HSV_CORAL}, // TGLBASS
  339. {24, 1, HSV_WHITE}, // DF_COLE
  340. {35, 1, HSV_TEAL}, // TGLMICH
  341. #if 0 // Color Test
  342. {36, 1, HSV_WHITE},
  343. {37, 1, HSV_RED},
  344. {38, 1, HSV_CORAL},
  345. {39, 1, HSV_ORANGE},
  346. {40, 1, HSV_GOLDENROD},
  347. {41, 1, HSV_GOLD},
  348. {42, 1, HSV_YELLOW},
  349. {43, 1, HSV_CHARTREUSE},
  350. {44, 1, HSV_GREEN},
  351. {45, 1, HSV_SPRINGGREEN},
  352. {46, 1, HSV_TURQUOISE},
  353. {47, 1, HSV_TEAL},
  354. {48, 1, HSV_CYAN},
  355. {49, 1, HSV_AZURE},
  356. {50, 1, HSV_BLUE},
  357. {51, 1, HSV_PURPLE},
  358. {52, 1, HSV_MAGENTA},
  359. {53, 1, HSV_PINK},
  360. #endif
  361. // right keyboard
  362. {60, 7, HSV_ORANGE}, // MIDI layouts
  363. {74, 1, HSV_CORAL}, // TGLBASS
  364. {85, 1, HSV_BLUE}, // MIDI Oct
  365. {86, 1, HSV_CYAN}, // MIDI Oct
  366. {87, 1, HSV_SPRINGGREEN}, // MIDI Oct
  367. {88, 1, HSV_GREEN}, // MIDI Oct
  368. {89, 1, HSV_CHARTREUSE}, // MIDI Oct
  369. {96, 1, HSV_PINK}, // EE_CLR
  370. {98, 7, HSV_ORANGE}, // MIDI layouts
  371. {107, 1, HSV_YELLOW}, // MI_VELD
  372. {108, 1, HSV_GREEN}, // MI_VELU
  373. {110, 1, HSV_RED}, // RGB_TOG
  374. {112, 1, HSV_CORAL}, // TGLBASS
  375. {119, 1, HSV_CORAL}, // TGLUVEL
  376. {120, 1, HSV_CYAN}, // MELDYAL
  377. {121, 1, HSV_GOLD}, // MELODYS
  378. {122, 1, HSV_SPRINGGREEN} // MELDYAH
  379. );
  380. // Now define the array of layers. Later layers take precedence
  381. const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(my_fn_layer, my_adjust_layer);
  382. layer_state_t layer_state_set_user(layer_state_t state) {
  383. // Both layers will light up if both kb layers are active
  384. rgblight_set_layer_state(0, layer_state_cmp(state, _FN));
  385. rgblight_set_layer_state(1, layer_state_cmp(state, _ADJUST));
  386. return state;
  387. };
  388. #endif // RGBLIGHT_ENABLE
  389. void my_init(void){
  390. // Set octave to MI_OCT_0
  391. midi_config.octave = MI_OCT_0 - MIDI_OCTAVE_MIN;
  392. // avoid using 127 since it is used as a special number in some sound sources.
  393. midi_config.velocity = MIDI_INITIAL_VELOCITY;
  394. }
  395. void eeconfig_init_user(void) {
  396. midi_init();
  397. my_init();
  398. // Used to set octave to MI_OCT_0
  399. midi_bass_ch = 0, midi_chord_ch = 0; // By default, all use the same channel.
  400. // UNISON flags
  401. melody_dyad_high = false; // true when +1 octave unison dyad is enabled.
  402. melody_dyad_low = false; // true when -1 octave unison dyad is enabled.
  403. melody_unison_suppress = true; // true: velocity of octave unison note is suppressd to UNISON_VELOCITY_RATIO
  404. // Reset Bass setting
  405. user_config.raw = 0; // default: dyad
  406. eeconfig_update_user(user_config.raw);
  407. // Reset the midi keyboard layout
  408. set_single_persistent_default_layer(_C_SYSTEM_BASS2ROW);
  409. }
  410. void keyboard_post_init_user(void) {
  411. my_init();
  412. for (uint8_t i = 0; i < MY_CHORD_COUNT; i++) {
  413. chord_status[i] = MIDI_INVALID_NOTE;
  414. }
  415. for (uint8_t i = 0; i < MIDI_TONE_COUNT; i++) {
  416. my_tone_status[i] = MIDI_INVALID_NOTE;
  417. }
  418. // load EEPROM data for isSingleBass
  419. user_config.raw = eeconfig_read_user();
  420. #ifdef RGBLIGHT_ENABLE
  421. rgblight_layers = my_rgb_layers;
  422. // Reset LED off
  423. rgblight_sethsv(HSV_BLACK);
  424. # if defined(RGBLIGHT_EFFECT_KNIGHT) || defined(RGBLIGHT_EFFECT_TWINKLE)
  425. rgblight_sethsv(30, 50, 40);
  426. # ifdef RGBLIGHT_EFFECT_KNIGHT
  427. rgblight_mode(RGBLIGHT_MODE_KNIGHT);
  428. # elif defined(RGBLIGHT_EFFECT_TWINKLE)
  429. rgblight_mode(RGBLIGHT_MODE_TWINKLE+3);
  430. # endif
  431. # endif
  432. #endif // RGBLIGHT_ENABLE
  433. };
  434. void toggle_isSingleBass(void) {
  435. #ifdef CONSOLE_ENABLE
  436. uprintf("isSingleBass(before) %u\n", user_config.isSingleBass);
  437. #endif
  438. user_config.isSingleBass = !user_config.isSingleBass;
  439. #ifdef CONSOLE_ENABLE
  440. uprintf("isSingleBass(after) %u\n", user_config.isSingleBass);
  441. #endif
  442. eeconfig_update_user(user_config.raw);
  443. }
  444. void toggle_MIDI_channel_separation(void) {
  445. if (midi_chord_ch > 0) {
  446. midi_chord_ch = 0;
  447. midi_bass_ch = 0;
  448. } else {
  449. midi_chord_ch = 1;
  450. midi_bass_ch = 2;
  451. }
  452. }
  453. #ifdef RGBLIGHT_ENABLE
  454. void switch_keylight_color4bass(keyrecord_t *record, uint8_t keylocation){
  455. switch (biton32(default_layer_state)) {
  456. case _C_SYSTEM_BASE:
  457. keylight_manager(record, HSV_GREEN, keylocation);
  458. break;
  459. case _FAKE_B_SYSTEM:
  460. keylight_manager(record, HSV_ORANGE, keylocation);
  461. break;
  462. case _C_SYSTEM_BASS2ROW:
  463. keylight_manager(record, HSV_YELLOW, keylocation);
  464. break;
  465. case _CFLIP_BASS2ROW:
  466. keylight_manager(record, HSV_PURPLE, keylocation);
  467. break;
  468. }
  469. }
  470. void switch_keylight_color4chords(keyrecord_t *record, uint8_t keylocation){
  471. switch (biton32(default_layer_state)) {
  472. case _C_SYSTEM_BASE:
  473. keylight_manager(record, HSV_SPRINGGREEN, keylocation);
  474. break;
  475. case _FAKE_B_SYSTEM:
  476. keylight_manager(record, HSV_YELLOW, keylocation);
  477. break;
  478. case _C_SYSTEM_BASS2ROW:
  479. keylight_manager(record, HSV_GOLDENROD, keylocation);
  480. break;
  481. case _CFLIP_BASS2ROW:
  482. keylight_manager(record, HSV_MAGENTA, keylocation);
  483. break;
  484. }
  485. }
  486. #endif // RGBLIGHT_ENABLE
  487. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  488. uint16_t root_note = MIDI_INVALID_NOTE; // Starting value for the root note of each chord
  489. #ifdef RGBLIGHT_ENABLE
  490. /* prepare for turning on LEDs when keys are pressed. */
  491. uint8_t r = record->event.key.row;
  492. uint8_t c = record->event.key.col;
  493. // uint8_t keylocation = convert_key_to_led[MATRIX_COLS * r + c];
  494. // uint8_t keylocation2 = convert_key_to_led2[MATRIX_COLS * r + c];
  495. uint8_t keylocation = pgm_read_byte(&convert_key_to_led[MATRIX_COLS * r + c]);
  496. uint8_t keylocation2 = pgm_read_byte(&convert_key_to_led2[MATRIX_COLS * r + c]);
  497. #endif // RGBLIGHT_ENABLE
  498. uint8_t chord = keycode - MY_CHORD_MIN;
  499. switch (keycode) {
  500. case VERSION: // Output firmware info.
  501. if (record->event.pressed) {
  502. SEND_STRING(QMK_KEYBOARD ":" QMK_KEYMAP " @ " QMK_VERSION " | " QMK_BUILDDATE);
  503. }
  504. break;
  505. // set default layer and save it to EEPROM when MIDI key layers are selected.
  506. case CSYSTEM:
  507. if (record->event.pressed) {
  508. set_single_persistent_default_layer(_C_SYSTEM_BASE);
  509. }
  510. break;
  511. case BSYSTEM:
  512. if (record->event.pressed) {
  513. set_single_persistent_default_layer(_FAKE_B_SYSTEM);
  514. }
  515. break;
  516. case CNTBASC:
  517. if (record->event.pressed) {
  518. set_single_persistent_default_layer(_C_SYSTEM_BASS2ROW);
  519. }
  520. break;
  521. case CSYSALL:
  522. if (record->event.pressed) {
  523. set_single_persistent_default_layer(_C_SYSTEM_ENTIRELY);
  524. }
  525. break;
  526. case CHRTONE:
  527. if (record->event.pressed) {
  528. set_single_persistent_default_layer(_CHROMATONE);
  529. }
  530. break;
  531. case CFLIP2B:
  532. if (record->event.pressed) {
  533. set_single_persistent_default_layer(_CFLIP_BASS2ROW);
  534. }
  535. break;
  536. case CSYSFBS:
  537. if (record->event.pressed) {
  538. set_single_persistent_default_layer(_C_SYSTEM_FREEBASS);
  539. }
  540. break;
  541. case TGLBASS:
  542. if (record->event.pressed) {
  543. toggle_isSingleBass();
  544. };
  545. break;
  546. case TGLMICH:
  547. if (record->event.pressed) {
  548. toggle_MIDI_channel_separation();
  549. };
  550. break;
  551. case MELDYAL:
  552. if (record->event.pressed) {
  553. melody_dyad_low = true;
  554. melody_dyad_high = false;
  555. };
  556. break;
  557. case MELODYS:
  558. if (record->event.pressed) {
  559. melody_dyad_low = false;
  560. melody_dyad_high = false;
  561. };
  562. break;
  563. case MELDYAH:
  564. if (record->event.pressed) {
  565. melody_dyad_low = false;
  566. melody_dyad_high = true;
  567. };
  568. break;
  569. case TGLUVEL:
  570. if (record->event.pressed) {
  571. melody_unison_suppress = !melody_unison_suppress;
  572. };
  573. break;
  574. // MIDI Chord Keycodes, on the left side.
  575. case MI_CH_Cr ... MI_CH_Br: // Root Notes
  576. root_note = keycode - MI_CH_Cr + MI_C_1;
  577. my_process_midi4Bass(midi_bass_ch, record, chord_status, chord, root_note, IS_SINGLE_BASS());
  578. #ifdef RGBLIGHT_ENABLE
  579. switch_keylight_color4bass(record, keylocation);
  580. #endif
  581. break;
  582. case MI_CH_C ... MI_CH_B: // Major Chords
  583. root_note = keycode - MI_CH_C + MI_C_2;
  584. // Root, Major Third, and Fifth Notes
  585. my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 4, 7);
  586. #ifdef RGBLIGHT_ENABLE
  587. switch_keylight_color4chords(record, keylocation);
  588. #endif
  589. break;
  590. case MI_CH_Cm ... MI_CH_Bm: // Minor Chord
  591. root_note = keycode - MI_CH_Cm + MI_C_2;
  592. // Root, Minor Third, and Fifth Notes
  593. my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 7);
  594. #ifdef RGBLIGHT_ENABLE
  595. switch_keylight_color4chords(record, keylocation);
  596. #endif
  597. break;
  598. case MI_CH_CDom7 ... MI_CH_BDom7: // Dominant 7th Chord
  599. root_note = keycode - MI_CH_CDom7 + MI_C_2;
  600. // Major Third, Major Fifth, and Minor Seventh Notes
  601. my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 4, 7, 10);
  602. #ifdef RGBLIGHT_ENABLE
  603. switch_keylight_color4chords(record, keylocation);
  604. #endif
  605. break;
  606. case MI_CH_CDim7 ... MI_CH_BDim7: // Diminished 7th Chord
  607. root_note = keycode - MI_CH_CDim7 + MI_C_2;
  608. // Root, Minor Third, and Diminished 5th Note
  609. my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 6);
  610. #ifdef RGBLIGHT_ENABLE
  611. switch_keylight_color4chords(record, keylocation);
  612. #endif
  613. break;
  614. #ifdef RGBLIGHT_ENABLE
  615. case KC_A ... KC_RGUI: // for QWERTY
  616. case KC_GESC:
  617. case ADJ_EIS:
  618. case MO_ADJ:
  619. case SHIF_UP:
  620. keylight_manager(record, HSV_RED, keylocation);
  621. break;
  622. #endif
  623. // Keycodes on the right side.
  624. case MIDI_TONE_MIN ... MIDI_TONE_MAX: // notes on the right side keyboard.
  625. // root_note is played by process_midi().
  626. if ( melody_dyad_high == true ) { // play 1 octave higher as well.
  627. my_process_midi(0, keycode, record, my_tone_status, 12, melody_unison_suppress);
  628. #ifdef RGBLIGHT_ENABLE
  629. keylight_manager(record, HSV_RED, keylocation);
  630. keylight_manager(record, HSV_RED, keylocation2);
  631. #endif
  632. } else if ( melody_dyad_low == true ) { // play 1 octave lower as well.
  633. my_process_midi(0, keycode, record, my_tone_status, -12, melody_unison_suppress);
  634. #ifdef RGBLIGHT_ENABLE
  635. keylight_manager(record, HSV_CYAN, keylocation);
  636. keylight_manager(record, HSV_CYAN, keylocation2);
  637. #endif
  638. } else {
  639. uprintf("layer=%u, default_layer_state = %u\n", biton32(default_layer_state), default_layer_state);
  640. #ifdef RGBLIGHT_ENABLE
  641. keylight_manager(record, HSV_GOLDENROD, keylocation);
  642. keylight_manager(record, HSV_GOLDENROD, keylocation2);
  643. #endif
  644. }
  645. break;
  646. #ifdef RGBLIGHT_ENABLE
  647. // case KC_MUTE:
  648. case FN_MUTE:
  649. keylight_manager(record, HSV_GOLDENROD, keylocation);
  650. break;
  651. #endif
  652. }
  653. // If console is enabled, it will print the matrix position and status of each key pressed
  654. #if defined(CONSOLE_ENABLE) && defined(RGBLIGHT_ENABLE)
  655. uprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed);
  656. uprintf("r=%d, c=%d, keyloc=%d, keyloc2=%d, matrix_col x r + c = %d\n", r, c, keylocation, keylocation2, MATRIX_COLS * r + c);
  657. #endif
  658. return true;
  659. }