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