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