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