keymap.c 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. /* Copyright 2015-2021 Jack Humbert
  2. * Copyright 2022 Rocco Meli <@RMeli>
  3. *
  4. * This program is free software: you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation, either version 2 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. */
  17. #include QMK_KEYBOARD_H
  18. #include "muse.h"
  19. #include "rmeli.h"
  20. enum preonic_layers { _QWERTY, _COLEMAK, _LOWER, _RAISE, _ADJUST };
  21. enum preonic_keycodes { QWERTY = SAFE_RANGE, COLEMAK, LOWER, RAISE, BACKLIT };
  22. #define ____________________BOTTOM_L_x6_____________________ BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC
  23. #define ____________________BOTTOM_R_x6_____________________ KC_ENT, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
  24. /* LAYOUT
  25. *
  26. * ,-----------------------------------------------------------.
  27. * | | | | | | | | | | | | |
  28. * |----+----+----+----+----+----+----+----+----+----+----+----|
  29. * | | | | | | | | | | | | |
  30. * |----+----+----+----+----+----+----+----+----+----+----+----|
  31. * | | | | | | | | | | | | |
  32. * |----+----+----+----+----+----+----+----+----+----+----+----|
  33. * | | | | | | | | | | | | |
  34. * |----+----+----+----+----+----+----+----+----+----+----+----|
  35. * | | | | | | | | | | | | |
  36. * `----+----+----+----+----+----+----+----+----+----+----+----'
  37. */
  38. // Define wrapper for standard CRKB layout
  39. #define LAYOUT_wrapper(...) LAYOUT_preonic_grid(__VA_ARGS__)
  40. // clang-format off
  41. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  42. [_QWERTY] = LAYOUT_wrapper(
  43. ___________________NUMBER_LEFT_x6___________________, ___________________NUMBER_RIGHT_x6__________________,
  44. ___________________QWERTY_L1_x6_____________________, ___________________QWERTY_R1_x6_____________________,
  45. ___________________QWERTY_L2_x6_____________________, ___________________QWERTY_R2_x6_____________________,
  46. ___________________QWERTY_L3_x6_____________________, ___________________QWERTY_R3_x6_____________________,
  47. ____________________BOTTOM_L_x6_____________________, ____________________BOTTOM_R_x6_____________________
  48. ),
  49. [_COLEMAK] = LAYOUT_wrapper(
  50. ___________________NUMBER_LEFT_x6___________________, ___________________NUMBER_RIGHT_x6__________________,
  51. ________________COLEMAK_MOD_DH_L1_x6________________, ________________COLEMAK_MOD_DH_R1_x6________________,
  52. ________________COLEMAK_MOD_DH_L2_x6________________, ________________COLEMAK_MOD_DH_R2_x6________________,
  53. ________________COLEMAK_MOD_DH_L3_x6________________, ________________COLEMAK_MOD_DH_R3_x6________________,
  54. ____________________BOTTOM_L_x6_____________________, ____________________BOTTOM_R_x6_____________________
  55. ),
  56. [_LOWER] = LAYOUT_wrapper(
  57. ____________________FUNC_LEFT_x6____________________, ____________________FUNC_RIGHT_x6___________________,
  58. ___________________NUMBER_LEFT_x6___________________, ___________________NUMBER_RIGHT_x6__________________,
  59. _______, ______________UNICODE_L2_x5________________, ________________NAV_R2_x5__________________, XXXXXXX,
  60. _______, ______________UNICODE_L3_x5________________, ________________NAV_R3_x5__________________, _______,
  61. ______________________BLANK_6x______________________, ______________________BLANK_6x______________________
  62. ),
  63. [_RAISE] = LAYOUT_wrapper(
  64. ___________________NUMBER_LEFT_x6___________________, ___________________NUMBER_RIGHT_x6__________________,
  65. ___________________SYMBOL_LEFT_x6___________________, ___________________SYMBOL_RIGHT_x6__________________,
  66. _______, ____________NAV_VIM_x4____________, XXXXXXX, ____________________SYMBOL_R2_x6____________________,
  67. _______, _________________NONE_5x___________________, ____________________SYMBOL_R3_x6____________________,
  68. ______________________BLANK_6x______________________, ______________________BLANK_6x______________________
  69. ),
  70. [_ADJUST] = LAYOUT_wrapper(
  71. QK_BOOT, _________________NONE_5x___________________, ______________________NONE_6x_______________________,
  72. XXXXXXX, MU_ON, AU_ON, MI_ON, XXXXXXX, XXXXXXX, _______________CONFIG_R1_x5________________, QWERTY,
  73. QK_BOOT, MU_NEXT, AU_TOGG, MI_TOG, XXXXXXX, XXXXXXX, _______________CONFIG_R2_x5________________, XXXXXXX,
  74. XXXXXXX, MU_OFF, AU_OFF, MI_OFF, XXXXXXX, XXXXXXX, _______________CONFIG_R3_x5________________, COLEMAK,
  75. ______________________BLANK_6x______________________, ______________________BLANK_6x______________________
  76. )
  77. };
  78. // clang-format on
  79. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  80. switch (keycode) {
  81. case QWERTY:
  82. if (record->event.pressed) {
  83. set_single_persistent_default_layer(_QWERTY);
  84. }
  85. return false;
  86. break;
  87. case COLEMAK:
  88. if (record->event.pressed) {
  89. set_single_persistent_default_layer(_COLEMAK);
  90. }
  91. return false;
  92. break;
  93. case LOWER:
  94. if (record->event.pressed) {
  95. layer_on(_LOWER);
  96. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  97. } else {
  98. layer_off(_LOWER);
  99. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  100. }
  101. return false;
  102. break;
  103. case RAISE:
  104. if (record->event.pressed) {
  105. layer_on(_RAISE);
  106. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  107. } else {
  108. layer_off(_RAISE);
  109. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  110. }
  111. return false;
  112. break;
  113. case BACKLIT:
  114. if (record->event.pressed) {
  115. register_code(KC_RSFT);
  116. #ifdef BACKLIGHT_ENABLE
  117. backlight_step();
  118. #endif
  119. #ifdef RGBLIGHT_ENABLE
  120. rgblight_step();
  121. #endif
  122. #ifdef __AVR__
  123. writePinLow(E6);
  124. #endif
  125. } else {
  126. unregister_code(KC_RSFT);
  127. #ifdef __AVR__
  128. writePinHigh(E6);
  129. #endif
  130. }
  131. return false;
  132. break;
  133. }
  134. return true;
  135. };
  136. bool muse_mode = false;
  137. uint8_t last_muse_note = 0;
  138. uint16_t muse_counter = 0;
  139. uint8_t muse_offset = 70;
  140. uint16_t muse_tempo = 50;
  141. bool encoder_update_user(uint8_t index, bool clockwise) {
  142. if (muse_mode) {
  143. if (IS_LAYER_ON(_RAISE)) {
  144. if (clockwise) {
  145. muse_offset++;
  146. } else {
  147. muse_offset--;
  148. }
  149. } else {
  150. if (clockwise) {
  151. muse_tempo += 1;
  152. } else {
  153. muse_tempo -= 1;
  154. }
  155. }
  156. } else {
  157. if (clockwise) {
  158. register_code(KC_PGDN);
  159. unregister_code(KC_PGDN);
  160. } else {
  161. register_code(KC_PGUP);
  162. unregister_code(KC_PGUP);
  163. }
  164. }
  165. return true;
  166. }
  167. bool dip_switch_update_user(uint8_t index, bool active) {
  168. switch (index) {
  169. case 0:
  170. if (active) {
  171. layer_on(_ADJUST);
  172. } else {
  173. layer_off(_ADJUST);
  174. }
  175. break;
  176. case 1:
  177. if (active) {
  178. muse_mode = true;
  179. } else {
  180. muse_mode = false;
  181. }
  182. }
  183. return true;
  184. }
  185. void matrix_scan_user(void) {
  186. #ifdef AUDIO_ENABLE
  187. if (muse_mode) {
  188. if (muse_counter == 0) {
  189. uint8_t muse_note = muse_offset + SCALE[muse_clock_pulse()];
  190. if (muse_note != last_muse_note) {
  191. stop_note(compute_freq_for_midi_note(last_muse_note));
  192. play_note(compute_freq_for_midi_note(muse_note), 0xF);
  193. last_muse_note = muse_note;
  194. }
  195. }
  196. muse_counter = (muse_counter + 1) % muse_tempo;
  197. } else {
  198. if (muse_counter) {
  199. stop_all_notes();
  200. muse_counter = 0;
  201. }
  202. }
  203. #endif
  204. }
  205. bool music_mask_user(uint16_t keycode) {
  206. switch (keycode) {
  207. case RAISE:
  208. case LOWER:
  209. return false;
  210. default:
  211. return true;
  212. }
  213. }