keymap.c (17350B)
1 /* Copyright 2015-2023 Jack Humbert 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 17 #include QMK_KEYBOARD_H 18 19 enum planck_layers { _QWERTY, _COLEMAK, _DVORAK, _LOWER, _RAISE, _PLOVER, _ADJUST }; 20 21 enum planck_keycodes { PLOVER = SAFE_RANGE, BACKLIT, EXT_PLV }; 22 23 #define LOWER MO(_LOWER) 24 #define RAISE MO(_RAISE) 25 26 #define QWERTY PDF(_QWERTY) 27 #define COLEMAK PDF(_COLEMAK) 28 #define DVORAK PDF(_DVORAK) 29 30 /* clang-format off */ 31 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 32 33 /* Qwerty 34 * ,-----------------------------------------------------------------------------------. 35 * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | 36 * |------+------+------+------+------+------+------+------+------+------+------+------| 37 * | Esc | A | S | D | F | G | H | J | K | L | ; | ' | 38 * |------+------+------+------+------+------+------+------+------+------+------+------| 39 * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | 40 * |------+------+------+------+------+------+------+------+------+------+------+------| 41 * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | 42 * `-----------------------------------------------------------------------------------' 43 */ 44 [_QWERTY] = LAYOUT_planck_grid( 45 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, 46 KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, 47 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , 48 BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_RSFT, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT 49 ), 50 51 /* Colemak 52 * ,-----------------------------------------------------------------------------------. 53 * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | 54 * |------+------+------+------+------+------+------+------+------+------+------+------| 55 * | Esc | A | R | S | T | D | H | N | E | I | O | ' | 56 * |------+------+------+------+------+------+------+------+------+------+------+------| 57 * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | 58 * |------+------+------+------+------+------+------+------+------+------+------+------| 59 * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | 60 * `-----------------------------------------------------------------------------------' 61 */ 62 [_COLEMAK] = LAYOUT_planck_grid( 63 KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, 64 KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, 65 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , 66 BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_RSFT, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT 67 ), 68 69 /* Dvorak 70 * ,-----------------------------------------------------------------------------------. 71 * | Tab | ' | , | . | P | Y | F | G | C | R | L | Bksp | 72 * |------+------+------+------+------+------+------+------+------+------+------+------| 73 * | Esc | A | O | E | U | I | D | H | T | N | S | / | 74 * |------+------+------+------+------+------+------+------+------+------+------+------| 75 * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | 76 * |------+------+------+------+------+------+------+------+------+------+------+------| 77 * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | 78 * `-----------------------------------------------------------------------------------' 79 */ 80 [_DVORAK] = LAYOUT_planck_grid( 81 KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, 82 KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, 83 KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , 84 BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_RSFT, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT 85 ), 86 87 /* Lower 88 * ,-----------------------------------------------------------------------------------. 89 * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | 90 * |------+------+------+------+------+------+------+------+------+------+------+------| 91 * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | 92 * |------+------+------+------+------+------+------+------+------+------+------+------| 93 * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | Home | End | | 94 * |------+------+------+------+------+------+------+------+------+------+------+------| 95 * | | | | | | | | Next | Vol- | Vol+ | Play | 96 * `-----------------------------------------------------------------------------------' 97 */ 98 [_LOWER] = LAYOUT_planck_grid( 99 KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, 100 KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, 101 _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______, 102 _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY 103 ), 104 105 /* Raise 106 * ,-----------------------------------------------------------------------------------. 107 * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | 108 * |------+------+------+------+------+------+------+------+------+------+------+------| 109 * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | 110 * |------+------+------+------+------+------+------+------+------+------+------+------| 111 * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / |Pg Up |Pg Dn | | 112 * |------+------+------+------+------+------+------+------+------+------+------+------| 113 * | | | | | | | | Next | Vol- | Vol+ | Play | 114 * `-----------------------------------------------------------------------------------' 115 */ 116 [_RAISE] = LAYOUT_planck_grid( 117 KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, 118 KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, 119 _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______, 120 _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY 121 ), 122 123 /* Plover layer (http://opensteno.org) 124 * ,-----------------------------------------------------------------------------------. 125 * | # | # | # | # | # | # | # | # | # | # | # | # | 126 * |------+------+------+------+------+------+------+------+------+------+------+------| 127 * | | S | T | P | H | * | * | F | P | L | T | D | 128 * |------+------+------+------+------+------+------+------+------+------+------+------| 129 * | | S | K | W | R | * | * | R | B | G | S | Z | 130 * |------+------+------+------+------+------+------+------+------+------+------+------| 131 * | Exit | | | A | O | | E | U | | | | 132 * `-----------------------------------------------------------------------------------' 133 */ 134 [_PLOVER] = LAYOUT_planck_grid( 135 KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1 , 136 XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, 137 XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, 138 EXT_PLV, XXXXXXX, XXXXXXX, KC_C, KC_V, XXXXXXX, XXXXXXX, KC_N, KC_M, XXXXXXX, XXXXXXX, XXXXXXX 139 ), 140 141 /* Adjust (Lower + Raise) 142 * v------------------------RGB CONTROL--------------------v 143 * ,-----------------------------------------------------------------------------------. 144 * | | Reset|Debug | RGB |RGBMOD| HUE+ | HUE- | SAT+ | SAT- |BRGTH+|BRGTH-| Del | 145 * |------+------+------+------+------+------+------+------+------+------+------+------| 146 * | | |MUSmod|Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|Plover| | 147 * |------+------+------+------+------+------+------+------+------+------+------+------| 148 * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | 149 * |------+------+------+------+------+------+------+------+------+------+------+------| 150 * | | | | | | | | | | | | 151 * `-----------------------------------------------------------------------------------' 152 */ 153 [_ADJUST] = LAYOUT_planck_grid( 154 _______, QK_BOOT, DB_TOGG, UG_TOGG, UG_NEXT, UG_HUEU, UG_HUED, UG_SATU, UG_SATD, UG_SPDU, UG_SPDD, KC_DEL , 155 _______, EE_CLR, MU_NEXT, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______, 156 _______, AU_PREV, AU_NEXT, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______, 157 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ 158 ) 159 160 }; 161 162 #ifdef ENCODER_MAP_ENABLE 163 /* Rotary Encoders 164 */ 165 const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { 166 /* Qwerty 167 * v- (index) Clockwise / Counter Clockwise v- (index) Clockwise / Counter Clockwise 168 * ,---------------------------------------------------------------------------------------. 169 * | (0) Vol- / Vol+ | | | | | | | | | | | (4) Vol- / Vol+ | 170 * |-----------------------+---+---+---+---+---+---+---+---+---+---+-----------------------| 171 * | (1) KC_MNXT / KC_MPRV | | | | | | | | | | | (5) KC_MNXT / KC_MPRV | 172 * |-----------------------+---+---+---+---+---+---+---+---+---+---+-----------------------| 173 * | (2) KC_WBAK / KC_WFWD | | | | | | | | | | | (6) KC_SPC / KC_ENT | 174 * |-----------------------+---+---+---+---+---+---+---+---+---+---+-----------------------| 175 * | (3) KC_LEFT / KC_RGHT | | | | | | | | | | (7) KC_DOWN / KC_UP | 176 * `---------------------------------------------------------------------------------------' 177 */ 178 [_QWERTY] = { 179 // LEFT SIDE (index 0 to 3) 180 ENCODER_CCW_CW(KC_VOLU, KC_VOLD), 181 ENCODER_CCW_CW(KC_MNXT, KC_MPRV), 182 ENCODER_CCW_CW(KC_WBAK, KC_WFWD), 183 ENCODER_CCW_CW(KC_LEFT, KC_RGHT), 184 // RIGHT SIDE (index 4 to 7) 185 ENCODER_CCW_CW(KC_VOLU, KC_VOLD), 186 ENCODER_CCW_CW(KC_MNXT, KC_MPRV), 187 ENCODER_CCW_CW(KC_SPC, KC_ENT), 188 ENCODER_CCW_CW(KC_DOWN, KC_UP) 189 }, 190 191 /* Adjust (Lower + Raise) 192 * v- (index) Clockwise / Counter Clockwise v- (index) Clockwise / Counter Clockwise 193 * ,---------------------------------------------------------------------------------------. 194 * | (0) _______ / _______ | | | | | | | | | | | (4) _______ / _______ | 195 * |-----------------------+---+---+---+---+---+---+---+---+---+---+-----------------------| 196 * | (1) _______ / _______ | | | | | | | | | | | (5) _______ / _______ | 197 * |-----------------------+---+---+---+---+---+---+---+---+---+---+-----------------------| 198 * | (2) UG_NEXT / UG_PREV | | | | | | | | | | | (6) SAT- / SAT+ | 199 * |-----------------------+---+---+---+---+---+---+---+---+---+---+-----------------------| 200 * | (3) UG_VALD / UG_VALU | | | | | | | | | | (7) HUE- / HUE+ | 201 * `---------------------------------------------------------------------------------------' 202 */ 203 [_ADJUST] = { 204 // LEFT SIDE (index 0 to 3) 205 ENCODER_CCW_CW(_______, _______), 206 ENCODER_CCW_CW(_______, _______), 207 ENCODER_CCW_CW(UG_NEXT, UG_PREV), 208 ENCODER_CCW_CW(UG_VALD, UG_VALU), 209 // RIGHT SIDE (index 4 to 7) 210 ENCODER_CCW_CW(_______, _______), 211 ENCODER_CCW_CW(_______, _______), 212 ENCODER_CCW_CW(UG_SATD, UG_SATU), 213 ENCODER_CCW_CW(UG_HUEU, UG_HUED) 214 } 215 }; 216 #endif 217 /* clang-format on */ 218 219 #ifdef AUDIO_ENABLE 220 float plover_song[][2] = SONG(PLOVER_SOUND); 221 float plover_gb_song[][2] = SONG(PLOVER_GOODBYE_SOUND); 222 #endif 223 224 bool play_encoder_melody(uint8_t index, bool clockwise); 225 226 layer_state_t layer_state_set_user(layer_state_t state) { 227 return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); 228 } 229 230 bool process_record_user(uint16_t keycode, keyrecord_t *record) { 231 #ifdef ENCODER_MAP_ENABLE 232 if (IS_ENCODEREVENT(record->event) && record->event.pressed) { 233 play_encoder_melody(record->event.key.col, record->event.type == ENCODER_CCW_EVENT); 234 } 235 #endif 236 switch (keycode) { 237 case BACKLIT: 238 if (record->event.pressed) { 239 register_code(KC_RSFT); 240 } else { 241 unregister_code(KC_RSFT); 242 } 243 return false; 244 break; 245 case PLOVER: 246 if (record->event.pressed) { 247 #ifdef AUDIO_ENABLE 248 stop_all_notes(); 249 PLAY_SONG(plover_song); 250 #endif 251 layer_off(_RAISE); 252 layer_off(_LOWER); 253 layer_off(_ADJUST); 254 layer_on(_PLOVER); 255 if (!eeconfig_is_enabled()) { 256 eeconfig_init(); 257 } 258 eeconfig_read_keymap(&keymap_config); 259 keymap_config.nkro = 1; 260 eeconfig_update_keymap(&keymap_config); 261 } 262 return false; 263 break; 264 case EXT_PLV: 265 if (record->event.pressed) { 266 #ifdef AUDIO_ENABLE 267 PLAY_SONG(plover_gb_song); 268 #endif 269 layer_off(_PLOVER); 270 } 271 return false; 272 break; 273 } 274 return true; 275 } 276 277 /* clang-format off */ 278 float melody[8][2][2] = { 279 {{440.0f, 8}, {440.0f, 24}}, 280 {{440.0f, 8}, {440.0f, 24}}, 281 {{440.0f, 8}, {440.0f, 24}}, 282 {{440.0f, 8}, {440.0f, 24}}, 283 {{440.0f, 8}, {440.0f, 24}}, 284 {{440.0f, 8}, {440.0f, 24}}, 285 {{440.0f, 8}, {440.0f, 24}}, 286 {{440.0f, 8}, {440.0f, 24}}, 287 }; 288 /* clang-format on */ 289 290 #define JUST_MINOR_THIRD 1.2 291 #define JUST_MAJOR_THIRD 1.25 292 #define JUST_PERFECT_FOURTH 1.33333333 293 #define JUST_TRITONE 1.42222222 294 #define JUST_PERFECT_FIFTH 1.33333333 295 296 #define ET12_MINOR_SECOND 1.059463 297 #define ET12_MAJOR_SECOND 1.122462 298 #define ET12_MINOR_THIRD 1.189207 299 #define ET12_MAJOR_THIRD 1.259921 300 #define ET12_PERFECT_FOURTH 1.33484 301 #define ET12_TRITONE 1.414214 302 #define ET12_PERFECT_FIFTH 1.498307 303 304 deferred_token tokens[8]; 305 306 uint32_t reset_note(uint32_t trigger_time, void *note) { 307 *(float*)note = 440.0f; 308 return 0; 309 } 310 311 bool play_encoder_melody(uint8_t index, bool clockwise) { 312 cancel_deferred_exec(tokens[index]); 313 if (clockwise) { 314 melody[index][1][0] = melody[index][1][0] * ET12_MINOR_SECOND; 315 melody[index][0][0] = melody[index][1][0] / ET12_PERFECT_FIFTH; 316 audio_play_melody(&melody[index], 2, false); 317 } else { 318 melody[index][1][0] = melody[index][1][0] / ET12_MINOR_SECOND; 319 melody[index][0][0] = melody[index][1][0] * ET12_TRITONE; 320 audio_play_melody(&melody[index], 2, false); 321 } 322 tokens[index] = defer_exec(1000, reset_note, &melody[index][1][0]); 323 return false; 324 } 325 326 bool encoder_update_user(uint8_t index, bool clockwise) { 327 return play_encoder_melody(index, clockwise); 328 } 329 330 bool dip_switch_update_user(uint8_t index, bool active) { 331 switch (index) { 332 case 0: { 333 #ifdef AUDIO_ENABLE 334 static bool play_sound = false; 335 #endif 336 if (active) { 337 #ifdef AUDIO_ENABLE 338 if (play_sound) { 339 PLAY_SONG(plover_song); 340 } 341 #endif 342 layer_on(_ADJUST); 343 } else { 344 #ifdef AUDIO_ENABLE 345 if (play_sound) { 346 PLAY_SONG(plover_gb_song); 347 } 348 #endif 349 layer_off(_ADJUST); 350 } 351 #ifdef AUDIO_ENABLE 352 play_sound = true; 353 #endif 354 break; 355 } 356 } 357 return true; 358 }