keymap.c (9351B)
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(...) LAYOUT(__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( 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_Fs2, 160 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, 161 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, 162 MI_A2, MI_C3, MI_Eb3, MI_Fs3, MI_A3, MI_C4, MI_Eb4, MI_Fs4, MI_A4, MI_C5, MI_Eb5, MI_Fs5 163 ), 164 165 /* QWERTY */ 166 [_QWERTY] = LAYOUT_wrapper( 167 QK_GESC, _________________NUMBER_L__________________, _________________NUMBER_R__________________, KC_BSPC, 168 KC_TAB, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_DEL, 169 KC_CAPS, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_ENT, 170 KC_LSFT, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_RSFT, 171 KC_LCTL, KC_LGUI, KC_LALT, KC_LNG2, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_LNG1, KC_RALT, KC_RGUI, KC_RCTL, 172 173 _______, 174 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, 175 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, 176 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ 177 ), 178 179 /* Fn */ 180 [_FN] = LAYOUT( 181 DFCBASE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, 182 DF_QWER, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, 183 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, 184 XXXXXXX, 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 187 XXXXXXX, 188 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, VERSION, XXXXXXX, _______, 189 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, 190 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX 191 ) 192 }; 193 194 #if defined(ENCODER_MAP_ENABLE) 195 const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { 196 [_C_SYSTEM_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, 197 [_QWERTY] = { ENCODER_CCW_CW(_______, _______) }, 198 [_FN] = { ENCODER_CCW_CW(_______, _______) }, 199 }; 200 #endif 201 202 void keyboard_post_init_user(void) { 203 // Set octave to 0 204 midi_config.octave = QK_MIDI_OCTAVE_0 - MIDI_OCTAVE_MIN; 205 206 // avoid using 127 since it is used as a special number in some sound sources. 207 midi_config.velocity = MIDI_INITIAL_VELOCITY; 208 209 for (uint8_t i = 0; i < MY_CHORD_COUNT; i++) { 210 chord_status[i] = MIDI_INVALID_NOTE; 211 } 212 213 default_layer_set(1UL << _C_SYSTEM_BASE); 214 }; 215 216 bool process_record_user(uint16_t keycode, keyrecord_t *record) { 217 uint16_t root_note = MIDI_INVALID_NOTE; // Starting value for the root note of each chord 218 219 uint8_t chord = keycode - MY_CHORD_MIN; 220 221 switch (keycode) { 222 case VERSION: // Output firmware info. 223 if (record->event.pressed) { 224 SEND_STRING(QMK_KEYBOARD ":" QMK_KEYMAP " @ " QMK_VERSION " | " QMK_BUILDDATE); 225 } 226 break; 227 228 // MIDI Chord Keycodes, on the left side. 229 case MI_CH_Cr ... MI_CH_Br: // Root Notes 230 root_note = keycode - MI_CH_Cr + MI_C1; 231 my_process_midi4Bass(midi_bass_ch, record, chord_status, chord, root_note, false); 232 break; 233 234 case MI_CH_C ... MI_CH_B: // Major Chords 235 root_note = keycode - MI_CH_C + MI_C2; 236 // Root, Major Third, and Fifth Notes 237 my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 4, 7); 238 break; 239 240 case MI_CH_Cm ... MI_CH_Bm: // Minor Chord 241 root_note = keycode - MI_CH_Cm + MI_C2; 242 // Root, Minor Third, and Fifth Notes 243 my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 7); 244 break; 245 246 case MI_CH_CDom7 ... MI_CH_BDom7: // Dominant 7th Chord 247 root_note = keycode - MI_CH_CDom7 + MI_C2; 248 // Major Third, Major Fifth, and Minor Seventh Notes 249 my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 4, 7, 10); 250 break; 251 252 case MI_CH_CDim7 ... MI_CH_BDim7: // Diminished 7th Chord 253 root_note = keycode - MI_CH_CDim7 + MI_C2; 254 // Root, Minor Third, and Diminished 5th Note 255 my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 6); 256 break; 257 } 258 return true; 259 }