keymap.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. /* Copyright 2020 3araht
  2. *
  3. * This program is free software: you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License as published by
  5. * the Free Software Foundation, either version 2 of the License, or
  6. * (at your option) any later version.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. #include QMK_KEYBOARD_H
  17. #include "version.h"
  18. // Alias layout macros that expand groups of keys.
  19. #define LAYOUT_wrapper_giabarinaix2(...) LAYOUT_giabarinaix2(__VA_ARGS__)
  20. #define DFCBASE DF(_C_SYSTEM_BASE)
  21. #define DF_QWER DF(_QWERTY)
  22. // Long press: go to _FN layer, tap: MUTE
  23. #define FN_MUTE LT(_FN, KC_MUTE)
  24. // Used to set octave to 0
  25. extern midi_config_t midi_config;
  26. uint8_t midi_bass_ch = 0, midi_chord_ch = 0; // By default, all use the same channel.
  27. // Defines names for use in layer keycodes and the keymap
  28. enum layer_names {
  29. _C_SYSTEM_BASE, // MIDI C-system
  30. _QWERTY, // just in case
  31. _FN
  32. };
  33. // Defines the keycodes used by our macros in process_record_user
  34. enum custom_keycodes {
  35. // MIDI Chord Keycodes - Root notes
  36. MY_CHORD_MIN = SAFE_RANGE,
  37. MI_CH_Cr = MY_CHORD_MIN,
  38. MI_CH_Csr,
  39. MI_CH_Dbr = MI_CH_Csr,
  40. MI_CH_Dr,
  41. MI_CH_Dsr,
  42. MI_CH_Ebr = MI_CH_Dsr,
  43. MI_CH_Er,
  44. MI_CH_Fr,
  45. MI_CH_Fsr,
  46. MI_CH_Gbr = MI_CH_Fsr,
  47. MI_CH_Gr,
  48. MI_CH_Gsr,
  49. MI_CH_Abr = MI_CH_Gsr,
  50. MI_CH_Ar,
  51. MI_CH_Asr,
  52. MI_CH_Bbr = MI_CH_Asr,
  53. MI_CH_Br,
  54. // MIDI Chord Keycodes - Major
  55. MI_CH_C,
  56. MI_CH_Cs,
  57. MI_CH_Db = MI_CH_Cs,
  58. MI_CH_D,
  59. MI_CH_Ds,
  60. MI_CH_Eb = MI_CH_Ds,
  61. MI_CH_E,
  62. MI_CH_F,
  63. MI_CH_Fs,
  64. MI_CH_Gb = MI_CH_Fs,
  65. MI_CH_G,
  66. MI_CH_Gs,
  67. MI_CH_Ab = MI_CH_Gs,
  68. MI_CH_A,
  69. MI_CH_As,
  70. MI_CH_Bb = MI_CH_As,
  71. MI_CH_B,
  72. // MIDI Chord Keycodes Minor
  73. MI_CH_Cm,
  74. MI_CH_Csm,
  75. MI_CH_Dbm = MI_CH_Csm,
  76. MI_CH_Dm,
  77. MI_CH_Dsm,
  78. MI_CH_Ebm = MI_CH_Dsm,
  79. MI_CH_Em,
  80. MI_CH_Fm,
  81. MI_CH_Fsm,
  82. MI_CH_Gbm = MI_CH_Fsm,
  83. MI_CH_Gm,
  84. MI_CH_Gsm,
  85. MI_CH_Abm = MI_CH_Gsm,
  86. MI_CH_Am,
  87. MI_CH_Asm,
  88. MI_CH_Bbm = MI_CH_Asm,
  89. MI_CH_Bm,
  90. //MIDI Chord Keycodes Dominant Seventh
  91. MI_CH_CDom7,
  92. MI_CH_CsDom7,
  93. MI_CH_DbDom7 = MI_CH_CsDom7,
  94. MI_CH_DDom7,
  95. MI_CH_DsDom7,
  96. MI_CH_EbDom7 = MI_CH_DsDom7,
  97. MI_CH_EDom7,
  98. MI_CH_FDom7,
  99. MI_CH_FsDom7,
  100. MI_CH_GbDom7 = MI_CH_FsDom7,
  101. MI_CH_GDom7,
  102. MI_CH_GsDom7,
  103. MI_CH_AbDom7 = MI_CH_GsDom7,
  104. MI_CH_ADom7,
  105. MI_CH_AsDom7,
  106. MI_CH_BbDom7 = MI_CH_AsDom7,
  107. MI_CH_BDom7,
  108. // MIDI Chord Keycodes Diminished Seventh
  109. MI_CH_CDim7,
  110. MI_CH_CsDim7,
  111. MI_CH_DbDim7 = MI_CH_CsDim7,
  112. MI_CH_DDim7,
  113. MI_CH_DsDim7,
  114. MI_CH_EbDim7 = MI_CH_DsDim7,
  115. MI_CH_EDim7,
  116. MI_CH_FDim7,
  117. MI_CH_FsDim7,
  118. MI_CH_GbDim7 = MI_CH_FsDim7,
  119. MI_CH_GDim7,
  120. MI_CH_GsDim7,
  121. MI_CH_AbDim7 = MI_CH_GsDim7,
  122. MI_CH_ADim7,
  123. MI_CH_AsDim7,
  124. MI_CH_BbDim7 = MI_CH_AsDim7,
  125. MI_CH_BDim7,
  126. MY_CHORD_MAX = MI_CH_BDim7,
  127. VERSION = USER00
  128. };
  129. #define MY_CHORD_COUNT (MY_CHORD_MAX - MY_CHORD_MIN + 1)
  130. static uint8_t chord_status[MY_CHORD_COUNT];
  131. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  132. /* C-system Base */
  133. [_C_SYSTEM_BASE] = LAYOUT_giabarinaix2(
  134. 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,
  135. 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,
  136. 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,
  137. 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,
  138. 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,
  139. MI_Db2, MI_E2, MI_G2, MI_Bb2, MI_Db3, MI_E3, MI_G3, MI_Bb3, MI_Db4, MI_E4, MI_G4, MI_Bb4,
  140. MI_Eb2, MI_Fs2, MI_A2, MI_C3, MI_Eb3, MI_Fs3, MI_A3, MI_C4, MI_Eb4, MI_Fs4, MI_A4, MI_C5,
  141. MI_F2, MI_Ab2, MI_B2, MI_D3, MI_F3, MI_Ab3, MI_B3, MI_D4, MI_F4, MI_Ab4, MI_B4, MI_D5,
  142. MI_G2, MI_Bb2, MI_Db3, MI_E3, MI_G3, MI_Bb3, MI_Db4, MI_E4, MI_G4, MI_Bb4, MI_Db5, MI_E5,
  143. MI_A2, MI_C3, MI_Eb3, MI_Fs3, MI_A3, MI_C4, MI_Eb4, MI_Fs4, MI_A4, MI_C5, MI_Eb5, FN_MUTE
  144. ),
  145. /* QWERTY */
  146. [_QWERTY] = LAYOUT_wrapper_giabarinaix2(
  147. QK_GESC, _________________NUMBER_L__________________, _________________NUMBER_R__________________, KC_BSPC,
  148. KC_TAB, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_DEL,
  149. KC_CAPS, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_ENT,
  150. KC_LSFT, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_RSFT,
  151. KC_LCTL, KC_LGUI, KC_LALT, KC_LNG2, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_LNG1, KC_RALT, KC_RGUI, KC_RCTL,
  152. QK_GESC, _________________NUMBER_L__________________, _________________NUMBER_R__________________, KC_BSPC,
  153. KC_TAB, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_DEL,
  154. KC_CAPS, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_ENT,
  155. KC_LSFT, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_RSFT,
  156. KC_LCTL, KC_LGUI, KC_LALT, KC_LNG2, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_LNG1, KC_RALT, KC_RGUI, _______
  157. ),
  158. /* Fn */
  159. [_FN] = LAYOUT_giabarinaix2(
  160. DFCBASE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  161. DF_QWER, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  162. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  163. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  164. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  165. DFCBASE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  166. DF_QWER, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  167. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, VERSION, XXXXXXX,
  168. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  169. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______
  170. )
  171. };
  172. #if defined(ENCODER_MAP_ENABLE)
  173. const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
  174. [_C_SYSTEM_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
  175. [_QWERTY] = { ENCODER_CCW_CW(_______, _______) },
  176. [_FN] = { ENCODER_CCW_CW(_______, _______) },
  177. };
  178. #endif
  179. void keyboard_post_init_user(void) {
  180. // Set octave to 0
  181. midi_config.octave = QK_MIDI_OCTAVE_0 - MIDI_OCTAVE_MIN;
  182. // avoid using 127 since it is used as a special number in some sound sources.
  183. midi_config.velocity = MIDI_INITIAL_VELOCITY;
  184. for (uint8_t i = 0; i < MY_CHORD_COUNT; i++) {
  185. chord_status[i] = MIDI_INVALID_NOTE;
  186. }
  187. default_layer_set(1UL << _C_SYSTEM_BASE);
  188. };
  189. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  190. uint16_t root_note = MIDI_INVALID_NOTE; // Starting value for the root note of each chord
  191. uint8_t chord = keycode - MY_CHORD_MIN;
  192. switch (keycode) {
  193. case VERSION: // Output firmware info.
  194. if (record->event.pressed) {
  195. SEND_STRING(QMK_KEYBOARD ":" QMK_KEYMAP " @ " QMK_VERSION " | " QMK_BUILDDATE);
  196. }
  197. break;
  198. // MIDI Chord Keycodes, on the left side.
  199. case MI_CH_Cr ... MI_CH_Br: // Root Notes
  200. root_note = keycode - MI_CH_Cr + MI_C1;
  201. my_process_midi4Bass(midi_bass_ch, record, chord_status, chord, root_note, false);
  202. break;
  203. case MI_CH_C ... MI_CH_B: // Major Chords
  204. root_note = keycode - MI_CH_C + MI_C2;
  205. // Root, Major Third, and Fifth Notes
  206. my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 4, 7);
  207. break;
  208. case MI_CH_Cm ... MI_CH_Bm: // Minor Chord
  209. root_note = keycode - MI_CH_Cm + MI_C2;
  210. // Root, Minor Third, and Fifth Notes
  211. my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 7);
  212. break;
  213. case MI_CH_CDom7 ... MI_CH_BDom7: // Dominant 7th Chord
  214. root_note = keycode - MI_CH_CDom7 + MI_C2;
  215. // Major Third, Major Fifth, and Minor Seventh Notes
  216. my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 4, 7, 10);
  217. break;
  218. case MI_CH_CDim7 ... MI_CH_BDim7: // Diminished 7th Chord
  219. root_note = keycode - MI_CH_CDim7 + MI_C2;
  220. // Root, Minor Third, and Diminished 5th Note
  221. my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 6);
  222. break;
  223. }
  224. return true;
  225. }