aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorM. de Verteuil <mverteuil@users.noreply.github.com>2020-01-18 14:24:56 -0500
committerDrashna Jaelre <drashna@live.com>2020-01-18 11:24:56 -0800
commit9b9a0f0bcb791e3652627a642f19f7cebd30955d (patch)
tree66b41cbcbd8a6b8bd61d52cc4983b90d99e88465
parent6b17067b1571bd19023e175980b8d74765ce7cfe (diff)
downloadqmk_firmware-9b9a0f0bcb791e3652627a642f19f7cebd30955d.tar.gz
qmk_firmware-9b9a0f0bcb791e3652627a642f19f7cebd30955d.zip
[Keymap] Added mverteuil keymaps and userspace common code (#7876)
* Added mverteuil content - Userspace - Knops keymap - Preonic keymaps * Simplified and replaced some magic numbers * Convert tabs to spaces * Clean up LED handling, better animation, better layer init * Use get_highest_layer per @drashna suggestion * Reorder prototypes/reformat * Simplified/more expessive and fixed initial layer LED * Remove changes to git ignored files
-rw-r--r--keyboards/knops/mini/keymaps/mverteuil/config.h25
-rw-r--r--keyboards/knops/mini/keymaps/mverteuil/keymap.c306
-rw-r--r--keyboards/knops/mini/keymaps/mverteuil/readme.md1
-rw-r--r--keyboards/knops/mini/keymaps/mverteuil/rules.mk6
-rw-r--r--keyboards/preonic/keymaps/mverteuil/config.h39
-rw-r--r--keyboards/preonic/keymaps/mverteuil/keymap.c508
-rw-r--r--keyboards/preonic/keymaps/mverteuil/readme.md2
-rw-r--r--keyboards/preonic/keymaps/mverteuil/rules.mk5
-rw-r--r--keyboards/preonic/keymaps/mverteuil_2x2u/config.h39
-rw-r--r--keyboards/preonic/keymaps/mverteuil_2x2u/keymap.c413
-rw-r--r--keyboards/preonic/keymaps/mverteuil_2x2u/rules.mk6
-rw-r--r--users/mverteuil/.gitignore1
-rw-r--r--users/mverteuil/mverteuil.c2
-rw-r--r--users/mverteuil/mverteuil.h21
-rw-r--r--users/mverteuil/rules.mk1
15 files changed, 1375 insertions, 0 deletions
diff --git a/keyboards/knops/mini/keymaps/mverteuil/config.h b/keyboards/knops/mini/keymaps/mverteuil/config.h
new file mode 100644
index 000000000..f72145c5a
--- /dev/null
+++ b/keyboards/knops/mini/keymaps/mverteuil/config.h
@@ -0,0 +1,25 @@
1/* Copyright 2017 Pawnerd, 2019 Matthew de Verteuil
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#pragma once
18
19#if defined(AUDIO_ENABLE)
20 #define AUDIO_CLICKY
21 #define B5_AUDIO
22 #define C6_AUDIO
23 #define STARTUP_SONG SONG(ZELDA_PUZZLE)
24 #define GOODBYE_SONG SONG(COIN_SOUND)
25#endif
diff --git a/keyboards/knops/mini/keymaps/mverteuil/keymap.c b/keyboards/knops/mini/keymaps/mverteuil/keymap.c
new file mode 100644
index 000000000..5ecba0d5a
--- /dev/null
+++ b/keyboards/knops/mini/keymaps/mverteuil/keymap.c
@@ -0,0 +1,306 @@
1#include QMK_KEYBOARD_H
2
3#define MAXIMIZ A(G(KC_F))
4#define NXTDSPL C(A(G(KC_RIGHT)))
5#define BTMHALF A(G(KC_DOWN))
6#define TOPHALF A(G(KC_UP))
7#define NXTTHRD SS_LCTL(SS_LALT(SS_TAP(X_RIGHT)))
8#define PRVTHRD C(A(KC_LEFT))
9
10#define LT_MSTP LT(_LAYER_SELECT, KC_MSTP)
11#define LT_ESC LT(_LAYER_SELECT, KC_ESC)
12#define LT_NXTH TD(TD_SPEC)
13
14#define writeLayerLedState(layer) writePin(layer)
15#define layer_led_0_off B6, false
16#define layer_led_1_off D5, true
17#define layer_led_2_off B0, false
18#define layer_led_0_on B6, true
19#define layer_led_1_on D5, false
20#define layer_led_2_on B0, true
21
22void led_init_animation(void);
23void led_set_layer(int layer);
24void td_spectacles_finish(qk_tap_dance_state_t *state, void *user_data);
25void td_spectacles_reset(qk_tap_dance_state_t *state, void *user_data);
26
27enum layer_led_mode {
28 ALL_LAYERS_OFF = -1,
29 LAYER_0,
30 LAYER_1,
31 LAYER_2,
32 LAYER_3,
33 LAYER_4,
34 LAYER_5,
35 ALL_LAYERS_ON,
36};
37
38enum mini_layers {
39 _MEDIA,
40 _COPYPASTA,
41 _SPECTACLES,
42 _LAYER_3,
43 _LAYER_4,
44 _LAYER_5,
45 _LAYER_SELECT,
46};
47
48enum { TD_SPEC = 0 };
49
50qk_tap_dance_action_t tap_dance_actions[] = {
51 /* Tap once for spectacles macro, hold for layer toggle */
52 [TD_SPEC] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, td_spectacles_finish, td_spectacles_reset),
53};
54
55/*
56 * Key Layout
57 * _____ _____ _____
58 * | | | | | |
59 * | 1 | | 2 | | 3 |
60 * |_____| |_____| |_____|
61 * _____ _____ _____
62 * | | | | | |
63 * | 4 | | 5 | | 6 |
64 * |_____| |_____| |_____|
65 *
66 * Hold 1 and:
67 * - press 4, 5, or 6 to change layers
68 * - press 3 to reset, or press and hold 3 to enter DFU programming mode
69 *
70 * If something prevents you from using the above to reprogram, you can hold 3 while powering on as a fallback.
71 */
72
73/* clang-format off */
74const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
75 /*
76 * Layer 0 (Media Keys)
77 * _____ _____ _____
78 * | | | | | |
79 * |Stop | |VolUp| |Play |
80 * |_____| |_____| |_____|
81 * _____ _____ _____
82 * | | | | | |
83 * |Prev | |VolDn| |Next |
84 * |_____| |_____| |_____|
85 *
86 */
87 [_MEDIA] = LAYOUT(
88 LT_MSTP, KC_VOLU, KC_MPLY,
89 KC_MPRV, KC_VOLD, KC_MNXT
90 ),
91
92 /*
93 * Layer 1 (Copy and Paste Macros)
94 * _____ _____ _____
95 * | | | | | |
96 * | ESC | |Ctl+Z| |CSf+Z|
97 * |_____| |_____| |_____|
98 * _____ _____ _____
99 * | | | | | |
100 * |Ctl+X| |Ctl+C| |Ctl+V|
101 * |_____| |_____| |_____|
102 *
103 */
104
105 [_COPYPASTA] = LAYOUT(
106 LT_ESC, C(KC_Z), C(S(KC_Z)),
107 C(KC_X), C(KC_C), C(KC_V)
108 ),
109
110 /*
111 * Layer 2 (Spectacles Macros)
112 * _LT&_ _____ _____
113 * | Win | | Win | | Win |
114 * | Next| | Top | |Mximze
115 * |_1/3_| |_1/2_| |_____|
116 * _____ _____ _____
117 * | Win | | Win | | Win |
118 * | Prev| | Bot | | Next|
119 * |_1/3_| |_1/2_| |Displ|
120 *
121 */
122 [_SPECTACLES] = LAYOUT(
123 LT_NXTH,TOPHALF,MAXIMIZ,
124 PRVTHRD,BTMHALF,NXTDSPL
125 ),
126
127 /*
128 * Layer 6 (Layer Select/Reset)
129 * _____ _____ _____
130 * | | | | | |
131 * |None | |None | |Reset|
132 * |_____| |_____| |_____|
133 * _____ _____ _____
134 * |Layer| |Layer| |Layer|
135 * | 0 | | 1 | | 2 |
136 * |_____| |_____| |_____|
137 *
138 * Layers 0, 1, and 2 have the top left button held to activate this layer.
139 * Then press the specific layer to switch to it.
140 *
141 */
142 [_LAYER_SELECT] = LAYOUT(
143 _______, _______, RESET,
144 TO(_MEDIA),TO(_COPYPASTA),TO(_SPECTACLES)
145 )
146};
147/* clang-format on */
148
149/*
150 * Knops Mini LED Numbers:
151 * _____ _____ _____
152 * | | | | | |
153 * | 1 | | 2 | | 3 | <---
154 * |_____| |_____| |_____| | These LEDs are called 'Switch LEDs'
155 * _____ _____ _____ |----- To turn on/off these leds, use:
156 * | | | | | | | set_switch_led( [1-6], [true/false]);
157 * | 4 | | 5 | | 6 | <---
158 * |_____| |_____| |_____|
159 *
160 * < 0 > < 1 > < 2 > <--- These front-LEDs are called 'Layer LEDs'
161 * To turn on/off these leds, use:
162 * set_layer_led( [0-2], [true/false] );
163 */
164
165void set_switch_led(int ledId, bool state) {
166 switch (ledId) {
167 case 1:
168 writePin(D7, state);
169 break;
170 case 2:
171 writePin(readPin(B7) ? C6 : C7, state);
172 break;
173 case 3:
174 writePin(D4, state);
175 break;
176 case 4:
177 writePin(E6, state);
178 break;
179 case 5:
180 writePin(B4, state);
181 break;
182 case 6:
183 writePin(D6, state);
184 break;
185 }
186}
187
188void set_layer_led(int layerLedMode) {
189 writeLayerLedState(layer_led_0_off);
190 writeLayerLedState(layer_led_1_off);
191 writeLayerLedState(layer_led_2_off);
192
193 switch (layerLedMode) {
194 case ALL_LAYERS_OFF:
195 break;
196 case LAYER_0:
197 writeLayerLedState(layer_led_0_on);
198 break;
199 case LAYER_1:
200 writeLayerLedState(layer_led_1_on);
201 break;
202 case LAYER_2:
203 writeLayerLedState(layer_led_2_on);
204 break;
205 case LAYER_3:
206 writeLayerLedState(layer_led_0_on);
207 writeLayerLedState(layer_led_1_on);
208 break;
209 case LAYER_4:
210 writeLayerLedState(layer_led_1_on);
211 writeLayerLedState(layer_led_2_on);
212 break;
213 case LAYER_5:
214 writeLayerLedState(layer_led_0_on);
215 writeLayerLedState(layer_led_2_on);
216 break;
217 default:
218 writeLayerLedState(layer_led_0_on);
219 writeLayerLedState(layer_led_1_on);
220 writeLayerLedState(layer_led_2_on);
221 break;
222 }
223}
224
225void led_init_animation() {
226 for (int i = ALL_LAYERS_OFF; i <= ALL_LAYERS_ON; i++) {
227 led_set_layer(i);
228 }
229
230 led_set_layer(LAYER_0);
231}
232
233/*
234 * This function led_set_layer gets called when you switch between layers.
235 * It allows you to turn on and off leds for each different layer and do
236 * other cool stuff.
237 */
238void led_set_layer(int layer) {
239 switch (layer) {
240 case ALL_LAYERS_OFF:
241 set_switch_led(1, false);
242 set_switch_led(2, false);
243 set_switch_led(3, false);
244 set_switch_led(4, false);
245 set_switch_led(5, false);
246 set_switch_led(6, false);
247
248 case _LAYER_SELECT:
249 set_switch_led(1, false);
250 set_switch_led(2, false);
251 set_switch_led(3, false);
252 set_switch_led(4, true);
253 set_switch_led(5, true);
254 set_switch_led(6, true);
255 break;
256
257 default:
258 set_switch_led(1, true);
259 set_switch_led(2, true);
260 set_switch_led(3, true);
261 set_switch_led(4, true);
262 set_switch_led(5, true);
263 set_switch_led(6, true);
264 break;
265 }
266
267 set_layer_led(layer);
268}
269
270/*
271 * Prepare all LED ports for output
272 */
273void led_init_ports() {
274 setPinOutput(D7); // Switch 1 LED
275 setPinOutput(C6); // Switch 2 LED Pin1
276 setPinOutput(C7); // Switch 2 LED Pin2
277 setPinOutput(D4); // Switch 3 LED
278 setPinOutput(E6); // Switch 4 LED
279 setPinOutput(B4); // Switch 5 LED
280 setPinOutput(D6); // Switch 6 LED
281 setPinOutput(D5); // Layer 0 LED
282 setPinOutput(B6); // Layer 1 LED
283 setPinOutput(B0); // Layer 2 LED
284}
285
286// Runs on layer change, no matter where the change was initiated
287layer_state_t layer_state_set_user(layer_state_t state) {
288 set_layer_led(get_highest_layer(state));
289 led_set_layer(get_highest_layer(state));
290 return state;
291}
292
293void matrix_init_user(void) {
294 led_init_ports();
295 led_init_animation();
296}
297
298void td_spectacles_finish(qk_tap_dance_state_t *state, void *user_data) {
299 if (state->pressed) {
300 layer_on(_LAYER_SELECT);
301 } else {
302 SEND_STRING(NXTTHRD);
303 }
304}
305
306void td_spectacles_reset(qk_tap_dance_state_t *state, void *user_data) { layer_off(_LAYER_SELECT); }
diff --git a/keyboards/knops/mini/keymaps/mverteuil/readme.md b/keyboards/knops/mini/keymaps/mverteuil/readme.md
new file mode 100644
index 000000000..46ea01583
--- /dev/null
+++ b/keyboards/knops/mini/keymaps/mverteuil/readme.md
@@ -0,0 +1 @@
# mverteuil does knops mini
diff --git a/keyboards/knops/mini/keymaps/mverteuil/rules.mk b/keyboards/knops/mini/keymaps/mverteuil/rules.mk
new file mode 100644
index 000000000..91a53d56a
--- /dev/null
+++ b/keyboards/knops/mini/keymaps/mverteuil/rules.mk
@@ -0,0 +1,6 @@
1BACKLIGHT_ENABLE = no
2CONSOLE_ENABLE = no
3TAP_DANCE_ENABLE = yes
4MOUSEKEY_ENABLE = no
5AUDIO_ENABLE = no
6
diff --git a/keyboards/preonic/keymaps/mverteuil/config.h b/keyboards/preonic/keymaps/mverteuil/config.h
new file mode 100644
index 000000000..51b278f64
--- /dev/null
+++ b/keyboards/preonic/keymaps/mverteuil/config.h
@@ -0,0 +1,39 @@
1#ifdef AUDIO_ENABLE
2# if __has_include("copyright.h")
3# include "copyright.h"
4# endif
5
6# define AUDIO_CLICKY_DELAY_DURATION 0
7# define AUDIO_CLICKY_FREQ_DEFAULT 100.0f
8# define AUDIO_CLICKY_FREQ_MIN 61.0f
9# define AUDIO_CLICKY_FREQ_RANDOMNESS 0.2f
10# define DAC_SAMPLE_MAX 7000U
11# define STARTUP_SONG SONG(WORKMAN_SOUND)
12# define GOODBYE_SONG SONG(COIN_SOUND)
13#endif
14
15#define MUSIC_MASK (keycode != KC_NO)
16
17/*
18 * MIDI options
19 */
20
21/* Prevent use of disabled MIDI features in the keymap */
22//#define MIDI_ENABLE_STRICT 1
23
24/* enable basic MIDI features:
25 - MIDI notes can be sent when in Music mode is on
26*/
27
28#define MIDI_BASIC
29
30/* enable advanced MIDI features:
31 - MIDI notes can be added to the keymap
32 - Octave shift and transpose
33 - Virtual sustain, portamento, and modulation wheel
34 - etc.
35*/
36//#define MIDI_ADVANCED
37
38/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
39//#define MIDI_TONE_KEYCODE_OCTAVES 2
diff --git a/keyboards/preonic/keymaps/mverteuil/keymap.c b/keyboards/preonic/keymaps/mverteuil/keymap.c
new file mode 100644
index 000000000..621d60be6
--- /dev/null
+++ b/keyboards/preonic/keymaps/mverteuil/keymap.c
@@ -0,0 +1,508 @@
1/* Copyright 2015-2017 Jack Humbert, 2019 Matthew de Verteuil
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 "muse.h"
18#include "mverteuil.h"
19
20/* TapDance Aliases */
21#define TD_LBRK TD(TD_BRACKETS_LEFT)
22#define TD_RBRK TD(TD_BRACKETS_RIGHT)
23#define TD_CLES TD(TD_CONTROL_ESCAPE)
24#define TD_NPFR TD(TD_NUMPAD_FUNCTIONROW)
25#define TD_PLEQ TD(TD_PLUS_EQUALS)
26#define TD_SCOL TD(TD_SEMICOLON_COLON)
27#define TD_SLQU TD(TD_SLASH_QUESTION)
28#define TD_SQDQ TD(TD_QUOTE_DOUBLEQUOTE)
29#define TD_USMI TD(TD_UNDERSCORE_MINUS)
30
31/* Sentinel value for invalid tap dance exit */
32#define TAP_DANCE_NO_MATCH 64
33
34enum preonic_layers {
35 _QWERTY,
36 _FUNCTIONROW,
37 _NUMPAD,
38 _LOWER,
39 _RAISE,
40 _ADJUST,
41};
42
43enum preonic_keycodes {
44 QWERTY = SAFE_RANGE,
45 NUMPAD,
46 LOWER,
47 RAISE,
48 BACKLIT,
49};
50
51enum tapdance_keycodes {
52 TD_BRACKETS_LEFT,
53 TD_BRACKETS_RIGHT,
54 TD_CONTROL_ESCAPE,
55 TD_NUMPAD_FUNCTIONROW,
56 TD_PLUS_EQUALS,
57 TD_QUOTE_DOUBLEQUOTE,
58 TD_SEMICOLON_COLON,
59 TD_SLASH_QUESTION,
60 TD_UNDERSCORE_MINUS,
61};
62
63typedef enum {
64 SINGLE_TAP,
65 SINGLE_HOLD,
66 DOUBLE_TAP,
67 DOUBLE_HOLD,
68 TRIPLE_TAP,
69 TRIPLE_HOLD,
70} t_tap_state;
71
72typedef struct {
73 t_tap_state left_brackets;
74 t_tap_state numpad_funcrow;
75 t_tap_state right_brackets;
76} t_tap;
77
78t_tap_state get_tapdance_state(qk_tap_dance_state_t *state);
79
80void td_numpad_funcrow_finished(qk_tap_dance_state_t *state, void *user_data);
81void td_numpad_funcrow_reset(qk_tap_dance_state_t *state, void *user_data);
82void td_brackets_left_finished(qk_tap_dance_state_t *state, void *user_data);
83void td_brackets_left_reset(qk_tap_dance_state_t *state, void *user_data);
84void td_brackets_right_finished(qk_tap_dance_state_t *state, void *user_data);
85void td_brackets_right_reset(qk_tap_dance_state_t *state, void *user_data);
86
87/* Tap Dance Definitions */
88qk_tap_dance_action_t tap_dance_actions[] = {
89 /* Tap once for left parenthesis, twice for left bracket, thrice for left brace */
90 [TD_BRACKETS_LEFT] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, td_brackets_left_finished, td_brackets_left_reset),
91 /* Tap once for right parenthesis, twice for right bracket, thrice for right brace */
92 [TD_BRACKETS_RIGHT] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, td_brackets_right_finished, td_brackets_right_reset),
93 /* Tap once for control, twice for escape */
94 [TD_CONTROL_ESCAPE] = ACTION_TAP_DANCE_DOUBLE(KC_LCTRL, KC_ESCAPE),
95 /* Tap once for plus, twice for equals */
96 [TD_PLUS_EQUALS] = ACTION_TAP_DANCE_DOUBLE(KC_PLUS, KC_EQUAL),
97 /* Hold for numpad, tap twice to toggle function row, double hold for temporary function row */
98 [TD_NUMPAD_FUNCTIONROW] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, td_numpad_funcrow_finished, td_numpad_funcrow_reset),
99 /* Tap once for single quote, twice for double quote */
100 [TD_QUOTE_DOUBLEQUOTE] = ACTION_TAP_DANCE_DOUBLE(KC_QUOTE, KC_DOUBLE_QUOTE),
101 /* Tap once for semicolon, twice for colon */
102 [TD_SEMICOLON_COLON] = ACTION_TAP_DANCE_DOUBLE(KC_SCOLON, KC_COLON),
103 /* Tap once for slash, twice for question mark */
104 [TD_SLASH_QUESTION] = ACTION_TAP_DANCE_DOUBLE(KC_SLASH, KC_QUESTION),
105 /* Tap once for underscore, twice for minus */
106 [TD_UNDERSCORE_MINUS] = ACTION_TAP_DANCE_DOUBLE(KC_UNDERSCORE, KC_MINUS),
107};
108
109/* clang-format off */
110const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
111
112/* Qwerty
113 * ,-----------------------------------------------------------------------------------.
114 * | ` | ! | @ | # | $ | % | ^ | & | * | _ - | + = | Bksp |
115 * |------+------+------+------+------+------+------+------+------+------+------+------|
116 * | Tab | Q | W | E | R | T | Y | U | I | O | P | ' " |
117 * |------+------+------+------+------+-------------+------+------+------+------+------|
118 * |CtlEsc| A | S | D | F | G | H | J | K | L | ; : | Enter|
119 * |------+------+------+------+------+------|------+------+------+------+------+------|
120 * | Shift| Z | X | C | V | B | N | M | , | . | Up | GUI |
121 * |------+------+------+------+------+------+------+------+------+------+------+------|
122 * |NP FRw| Ctrl | Alt | GUI |Lower | Space |Raise | / ? | Left | Down |Right |
123 * `-----------------------------------------------------------------------------------'
124 */
125[_QWERTY] = LAYOUT_preonic_1x2uC (
126 KC_GRV, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, TD_USMI, TD_PLEQ, KC_BSPC,
127 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, TD_SQDQ,
128 TD_CLES, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, TD_SCOL, KC_ENT,
129 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, KC_RGUI,
130 TD_NPFR, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, RAISE, TD_SLQU, KC_LEFT, KC_DOWN, KC_RGHT
131),
132
133/* Function Row
134 * ,-----------------------------------------------------------------------------------.
135 * | F12 | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 |
136 * |------+------+------+------+------+------+------+------+------+------+------+------|
137 * | | | | | | | | | | | | |
138 * |------+------+------+------+------+-------------+------+------+------+------+------|
139 * | | | | | | | | | | | | |
140 * |------+------+------+------+------+------|------+------+------+------+------+------|
141 * | | | | | | | | | | | | |
142 * |------+------+------+------+------+------+------+------+------+------+------+------|
143 * | | | | | | | | | | | |
144 * `-----------------------------------------------------------------------------------'
145 */
146[_FUNCTIONROW] = LAYOUT_preonic_1x2uC (
147 KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
148 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
149 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
150 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
151 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
152),
153
154/* Numpad
155 * ,------+------+------+------+------+------|------+------+------+------+------+------.
156 * | | | | | | | | Tab | / | * |Bksp | |
157 * |------+------+------+------+------+------|------+------+------+------+------+------|
158 * | | | | | | | | 7 | 8 | 9 | - | |
159 * |------+------+------+------+------+------|------+------+------+------+------+------|
160 * | | | | | | | | 4 | 5 | 6 | + | |
161 * |------+------+------+------+------+------|------+------+------+------+------+------|
162 * | | | | | | | | 1 | 2 | 3 |Enter | |
163 * |------+------+------+------+------+------+------+------+------+------+------+------|
164 * | | | | | | | | 0 | . |Enter | |
165 * `-----------------------------------------------------------------------------------'
166 */
167[_NUMPAD] = LAYOUT_preonic_1x2uC (
168 _______, _______, _______, _______, _______, _______, _______, KC_TAB, KC_SLSH, KC_PAST, KC_BSPC, _______,
169 _______, _______, _______, _______, _______, _______, _______, KC_KP_7, KC_KP_8, KC_KP_9, KC_PMNS, _______,
170 _______, _______, _______, _______, _______, _______, _______, KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, _______,
171 _______, _______, _______, _______, _______, _______, _______, KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT, _______,
172 _______, _______, _______, _______, _______, _______, _______, KC_KP_0, KC_PDOT, KC_PENT, _______
173),
174
175/* Lower
176 * ,-----------------------------------------------------------------------------------.
177 * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del |
178 * |------+------+------+------+------+-------------+------+------+------+------+------|
179 * | | | Vol+ | | | | | | | | Play | |
180 * |------+------+------+------+------+-------------+------+------+------+------+------|
181 * | | Prev | Vol- | Next | | | ? | _ | + | | | |
182 * |------+------+------+------+------+------|------+------+------+------+------+------|
183 * | | | | | | | | Mute | | | PgUp | |
184 * |------+------+------+------+------+------+------+------+------+------+------+------|
185 * |RGBmod| | | | | | | \ | Home | PgDn | End |
186 * `-----------------------------------------------------------------------------------'
187 */
188[_LOWER] = LAYOUT_preonic_1x2uC (
189 KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL,
190 _______, _______, KC_VOLU, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, _______,
191 _______, KC_MPRV, KC_VOLD, KC_MNXT, _______, _______, KC_QUES, KC_UNDS, KC_PLUS, _______, _______, _______,
192 _______, _______, _______, _______, _______, _______, _______, KC_MUTE, _______, _______, KC_PGUP, _______,
193 _______, _______, _______, _______, _______, _______, _______, KC_BSLS, KC_HOME, KC_PGDN, KC_END
194),
195
196/* Raise
197 * ,-----------------------------------------------------------------------------------.
198 * | ~ | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | |
199 * |------+------+------+------+------+------+------+------+------+------+------+------|
200 * | | | | | | | | | | | | |
201 * |------+------+------+------+------+-------------+------+------+------+------+------|
202 * | | | | | | | | | | [ { (| ) } ]| |
203 * |------+------+------+------+------+------|------+------+------+------+------+------|
204 * | | | | | | | | | | | | |
205 * |------+------+------+------+------+------+------+------+------+------+------+------|
206 * | | | | | | | | | | | | |
207 * `-----------------------------------------------------------------------------------'
208 */
209[_RAISE] = LAYOUT_preonic_1x2uC (
210 KC_TILD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______,
211 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
212 _______, _______, _______, _______, _______, _______, _______, _______, _______, TD_LBRK, TD_RBRK, _______,
213 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
214 _______, _______, _______, _______, _______, _______, _______, KC_PIPE, _______, _______, _______
215),
216
217/* Adjust (Lower + Raise)
218 * ,-----------------------------------------------------------------------------------.
219 * |AudTog|XXXXXX|XXXXXX|XXXXXX|XXXXXX|XXXXXX|XXXXXX|XXXXXX|XXXXXX|XXXXXX| Debug| Reset|
220 * |------+------+------+------+------+------+------+------+------+------+------+------|
221 * |ClkTog|ClkFq-|ClkFq+|XXXXXX|XXXXXX|XXXXXX|XXXXXX|XXXXXX|XXXXXX|XXXXXX|TermOn|TermOf|
222 * |------+------+------+------+------+-------------+------+------+------+------+------|
223 * |MusTog|Voice- Voice+|XXXXXX|XXXXXX|XXXXXX|XXXXXX|XXXXXX|XXXXXX|XXXXXX|AGnorm|AGswap|
224 * |------+------+------+------+------+------|------+------+------+------+------+------|
225 * |MidTog|Rplain|Rbreat|Rrainb|Rswirl|Rsnake|Rkridr|Rxmas |Rgrad |RGBtst|XXXXXX|Shift |
226 * |------+------+------+------+------+------+------+------+------+------+------+------|
227 * |RGBmod|RGBhue|RBGsat|RGBval| | | |XXXXXX|XXXXXX|XXXXXX|XXXXXX|
228 * `-----------------------------------------------------------------------------------'
229 */
230[_ADJUST] = LAYOUT_preonic_1x2uC (
231 AU_TOG, XXXXXXX, XXXXXXX, XXXXXXX, RGB_HUI, RGB_HUD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DEBUG, RESET,
232 CK_TOGG, CK_DOWN, CK_UP, XXXXXXX, RGB_SAI, RGB_SAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, TERM_ON, TERM_OFF,
233 MU_TOG, MUV_DE, MUV_IN, XXXXXXX, RGB_VAI, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, AG_NORM, AG_SWAP,
234 MI_TOG, RGB_M_P, RGB_M_B, RGB_M_R,RGB_M_SW,RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, RGB_M_T, RGB_SPI, KC_LSHIFT,
235 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, RGB_TOG, _______, XXXXXXX,RGB_RMOD, RGB_SPD, RGB_MOD
236)
237
238};
239/* clang-format on */
240
241float s_audio_on[][2] = AUDIO_ON_SONG;
242float s_layer_lower[][2] = LAYER_LOWER_SONG;
243float s_layer_raise[][2] = LAYER_RAISE_SONG;
244
245void audio_on_user() { PLAY_SONG(s_audio_on); };
246
247bool process_record_user(uint16_t keycode, keyrecord_t *record) {
248 switch (keycode) {
249 case LOWER:
250 if (record->event.pressed) {
251 layer_on(_LOWER);
252 update_tri_layer(_LOWER, _RAISE, _ADJUST);
253 PLAY_SONG(s_layer_lower);
254 } else {
255 layer_off(_LOWER);
256 update_tri_layer(_LOWER, _RAISE, _ADJUST);
257 }
258 return false;
259 break;
260 case RAISE:
261 if (record->event.pressed) {
262 layer_on(_RAISE);
263 update_tri_layer(_LOWER, _RAISE, _ADJUST);
264 PLAY_SONG(s_layer_raise);
265 } else {
266 layer_off(_RAISE);
267 update_tri_layer(_LOWER, _RAISE, _ADJUST);
268 }
269 return false;
270 break;
271 case BACKLIT:
272 if (record->event.pressed) {
273 register_code(KC_RSFT);
274#ifdef BACKLIGHT_ENABLE
275 backlight_step();
276#endif
277#ifdef __AVR__
278 writePinLow(E6);
279#endif
280 } else {
281 unregister_code(KC_RSFT);
282#ifdef __AVR__
283 writePinHigh(E6);
284#endif
285 }
286 return false;
287 break;
288 }
289 return true;
290};
291
292/* Global TapDance State */
293static t_tap qk_tap_state = {
294 .left_brackets = 0,
295 .numpad_funcrow = 0,
296 .right_brackets = 0,
297};
298
299float s_functionrow_on[][2] = LAYER_FUNCROW_ON_SONG;
300float s_functionrow_off[][2] = LAYER_FUNCROW_OFF_SONG;
301float s_numpad_toggle[][2] = LAYER_NMPAD_SONG;
302
303t_tap_state get_tapdance_state(qk_tap_dance_state_t *state) {
304 if (state->count == 1) {
305 if (state->interrupted || !state->pressed) {
306 return SINGLE_TAP;
307 } else {
308 return SINGLE_HOLD;
309 }
310 } else if (state->count == 2) {
311 if (state->interrupted || !state->pressed) {
312 return DOUBLE_TAP;
313 } else {
314 return DOUBLE_HOLD;
315 }
316 } else if (state->count == 3) {
317 if (state->interrupted || !state->pressed) {
318 return TRIPLE_TAP;
319 } else {
320 return TRIPLE_HOLD;
321 }
322 } else
323 return TAP_DANCE_NO_MATCH;
324}
325
326void td_numpad_funcrow_finished(qk_tap_dance_state_t *state, void *user_data) {
327 qk_tap_state.numpad_funcrow = get_tapdance_state(state);
328 switch (qk_tap_state.numpad_funcrow) {
329 case SINGLE_TAP ... SINGLE_HOLD:
330 layer_on(_NUMPAD);
331 PLAY_SONG(s_numpad_toggle);
332 break;
333 case DOUBLE_HOLD:
334 layer_on(_FUNCTIONROW);
335 break;
336 case DOUBLE_TAP:
337 if (layer_state_is(_FUNCTIONROW)) {
338 layer_off(_FUNCTIONROW);
339 PLAY_SONG(s_functionrow_off);
340 } else {
341 layer_on(_FUNCTIONROW);
342 PLAY_SONG(s_functionrow_on);
343 }
344 break;
345 default:
346 break;
347 }
348}
349
350void td_numpad_funcrow_reset(qk_tap_dance_state_t *state, void *user_data) {
351 switch (qk_tap_state.numpad_funcrow) {
352 case SINGLE_HOLD:
353 layer_off(_NUMPAD);
354 break;
355 case DOUBLE_HOLD:
356 layer_off(_FUNCTIONROW);
357 break;
358 default:
359 break;
360 }
361}
362
363void td_brackets_left_finished(qk_tap_dance_state_t *state, void *user_data) {
364 qk_tap_state.left_brackets = get_tapdance_state(state);
365 switch (qk_tap_state.left_brackets) {
366 case SINGLE_TAP:
367 register_code16(KC_LEFT_PAREN);
368 break;
369 case DOUBLE_TAP:
370 register_code(KC_LBRACKET);
371 break;
372 case TRIPLE_TAP:
373 register_code16(KC_LEFT_CURLY_BRACE);
374 break;
375 default:
376 break;
377 }
378}
379
380void td_brackets_left_reset(qk_tap_dance_state_t *state, void *user_data) {
381 switch (qk_tap_state.left_brackets) {
382 case SINGLE_TAP:
383 unregister_code16(KC_LEFT_PAREN);
384 break;
385 case DOUBLE_TAP:
386 unregister_code(KC_LBRACKET);
387 break;
388 case TRIPLE_TAP:
389 unregister_code16(KC_LEFT_CURLY_BRACE);
390 break;
391 default:
392 break;
393 }
394 qk_tap_state.left_brackets = 0;
395}
396
397void td_brackets_right_finished(qk_tap_dance_state_t *state, void *user_data) {
398 qk_tap_state.right_brackets = get_tapdance_state(state);
399 switch (qk_tap_state.right_brackets) {
400 case SINGLE_TAP:
401 register_code16(KC_RIGHT_PAREN);
402 break;
403 case DOUBLE_TAP:
404 register_code(KC_RBRACKET);
405 break;
406 case TRIPLE_TAP:
407 register_code16(KC_RIGHT_CURLY_BRACE);
408 break;
409 default:
410 break;
411 }
412}
413
414void td_brackets_right_reset(qk_tap_dance_state_t *state, void *user_data) {
415 switch (qk_tap_state.right_brackets) {
416 case SINGLE_TAP:
417 unregister_code16(KC_RIGHT_PAREN);
418 break;
419 case DOUBLE_TAP:
420 unregister_code(KC_RBRACKET);
421 break;
422 case TRIPLE_TAP:
423 unregister_code16(KC_RIGHT_CURLY_BRACE);
424 break;
425 default:
426 break;
427 }
428 qk_tap_state.right_brackets = 0;
429}
430
431bool muse_mode = false;
432uint8_t last_muse_note = 0;
433uint16_t muse_counter = 0;
434uint8_t muse_offset = 70;
435uint16_t muse_tempo = 50;
436
437void encoder_update_user(uint8_t index, bool clockwise) {
438 if (muse_mode) {
439 if (IS_LAYER_ON(_RAISE)) {
440 if (clockwise) {
441 muse_offset++;
442 } else {
443 muse_offset--;
444 }
445 } else {
446 if (clockwise) {
447 muse_tempo += 1;
448 } else {
449 muse_tempo -= 1;
450 }
451 }
452 } else {
453 if (clockwise) {
454 tap_code(KC_PGDN);
455 } else {
456 tap_code(KC_PGUP);
457 }
458 }
459}
460
461void dip_switch_update_user(uint8_t index, bool active) {
462 switch (index) {
463 case 0:
464 if (active) {
465 layer_on(_ADJUST);
466 } else {
467 layer_off(_ADJUST);
468 }
469 break;
470 case 1:
471 if (active) {
472 muse_mode = true;
473 } else {
474 muse_mode = false;
475 }
476 }
477}
478
479void matrix_scan_user(void) {
480#ifdef AUDIO_ENABLE
481 if (muse_mode) {
482 if (muse_counter == 0) {
483 uint8_t muse_note = muse_offset + SCALE[muse_clock_pulse()];
484 if (muse_note != last_muse_note) {
485 stop_note(compute_freq_for_midi_note(last_muse_note));
486 play_note(compute_freq_for_midi_note(muse_note), 0xF);
487 last_muse_note = muse_note;
488 }
489 }
490 muse_counter = (muse_counter + 1) % muse_tempo;
491 } else {
492 if (muse_counter) {
493 stop_all_notes();
494 muse_counter = 0;
495 }
496 }
497#endif
498}
499
500bool music_mask_user(uint16_t keycode) {
501 switch (keycode) {
502 case RAISE:
503 case LOWER:
504 return false;
505 default:
506 return true;
507 }
508}
diff --git a/keyboards/preonic/keymaps/mverteuil/readme.md b/keyboards/preonic/keymaps/mverteuil/readme.md
new file mode 100644
index 000000000..b21df3f8f
--- /dev/null
+++ b/keyboards/preonic/keymaps/mverteuil/readme.md
@@ -0,0 +1,2 @@
1# mverteuil does olkb preonic
2## 1x2u: One 2u spacebar on bottom row
diff --git a/keyboards/preonic/keymaps/mverteuil/rules.mk b/keyboards/preonic/keymaps/mverteuil/rules.mk
new file mode 100644
index 000000000..a29a3cad7
--- /dev/null
+++ b/keyboards/preonic/keymaps/mverteuil/rules.mk
@@ -0,0 +1,5 @@
1SRC += muse.c
2
3AUDIO_ENABLE = yes
4MIDI_ENABLE = yes
5TAP_DANCE_ENABLE = yes
diff --git a/keyboards/preonic/keymaps/mverteuil_2x2u/config.h b/keyboards/preonic/keymaps/mverteuil_2x2u/config.h
new file mode 100644
index 000000000..51b278f64
--- /dev/null
+++ b/keyboards/preonic/keymaps/mverteuil_2x2u/config.h
@@ -0,0 +1,39 @@
1#ifdef AUDIO_ENABLE
2# if __has_include("copyright.h")
3# include "copyright.h"
4# endif
5
6# define AUDIO_CLICKY_DELAY_DURATION 0
7# define AUDIO_CLICKY_FREQ_DEFAULT 100.0f
8# define AUDIO_CLICKY_FREQ_MIN 61.0f
9# define AUDIO_CLICKY_FREQ_RANDOMNESS 0.2f
10# define DAC_SAMPLE_MAX 7000U
11# define STARTUP_SONG SONG(WORKMAN_SOUND)
12# define GOODBYE_SONG SONG(COIN_SOUND)
13#endif
14
15#define MUSIC_MASK (keycode != KC_NO)
16
17/*
18 * MIDI options
19 */
20
21/* Prevent use of disabled MIDI features in the keymap */
22//#define MIDI_ENABLE_STRICT 1
23
24/* enable basic MIDI features:
25 - MIDI notes can be sent when in Music mode is on
26*/
27
28#define MIDI_BASIC
29
30/* enable advanced MIDI features:
31 - MIDI notes can be added to the keymap
32 - Octave shift and transpose
33 - Virtual sustain, portamento, and modulation wheel
34 - etc.
35*/
36//#define MIDI_ADVANCED
37
38/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
39//#define MIDI_TONE_KEYCODE_OCTAVES 2
diff --git a/keyboards/preonic/keymaps/mverteuil_2x2u/keymap.c b/keyboards/preonic/keymaps/mverteuil_2x2u/keymap.c
new file mode 100644
index 000000000..232b85311
--- /dev/null
+++ b/keyboards/preonic/keymaps/mverteuil_2x2u/keymap.c
@@ -0,0 +1,413 @@
1/* Copyright 2015-2017 Jack Humbert, 2019 Matthew de Verteuil
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 "muse.h"
18#include "mverteuil.h"
19
20/* Layer Aliases */
21#define LT_LWSP LT(_LOWER, KC_SPACE)
22#define LT_RSRT LT(_RAISE, KC_ENTER)
23#define MO_NUMS MO(_NUMPAD)
24
25/* Mod-Tap Aliases */
26#define MT_CESC CTL_T(KC_ESCAPE)
27
28/* TapDance Aliases */
29#define TD_LBRK TD(TD_BRACKETS_LEFT)
30#define TD_RBRK TD(TD_BRACKETS_RIGHT)
31#define TD_PLEQ TD(TD_PLUS_EQUALS)
32#define TD_SCOL TD(TD_SEMICOLON_COLON)
33#define TD_SLQU TD(TD_SLASH_QUESTION)
34#define TD_SQDQ TD(TD_QUOTE_DOUBLEQUOTE)
35#define TD_USMI TD(TD_UNDERSCORE_MINUS)
36
37/* Sentinel value for invalid tap dance exit */
38#define TAP_DANCE_NO_MATCH 64
39
40enum preonic_layers {
41 _QWERTY,
42 _NUMPAD,
43 _LOWER,
44 _RAISE,
45 _ADJUST,
46};
47
48enum preonic_keycodes {
49 QWERTY = SAFE_RANGE,
50 NUMPAD,
51 LOWER,
52 RAISE,
53 BACKLIT,
54};
55
56enum tapdance_keycodes {
57 TD_BRACKETS_LEFT,
58 TD_BRACKETS_RIGHT,
59 TD_CONTROL_ESCAPE,
60 TD_PLUS_EQUALS,
61 TD_QUOTE_DOUBLEQUOTE,
62 TD_SEMICOLON_COLON,
63 TD_SLASH_QUESTION,
64 TD_UNDERSCORE_MINUS,
65};
66
67typedef enum {
68 SINGLE_TAP,
69 SINGLE_HOLD,
70 DOUBLE_TAP,
71 DOUBLE_HOLD,
72 TRIPLE_TAP,
73 TRIPLE_HOLD,
74} t_tap_state;
75
76typedef struct {
77 t_tap_state left_brackets;
78 t_tap_state right_brackets;
79} t_tap;
80
81t_tap_state get_tapdance_state(qk_tap_dance_state_t *state);
82
83void td_brackets_left_finished(qk_tap_dance_state_t *state, void *user_data);
84void td_brackets_left_reset(qk_tap_dance_state_t *state, void *user_data);
85void td_brackets_right_finished(qk_tap_dance_state_t *state, void *user_data);
86void td_brackets_right_reset(qk_tap_dance_state_t *state, void *user_data);
87
88/* Tap Dance Definitions */
89qk_tap_dance_action_t tap_dance_actions[] = {
90 /* Tap once for left parenthesis, twice for left bracket, thrice for left brace */
91 [TD_BRACKETS_LEFT] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, td_brackets_left_finished, td_brackets_left_reset),
92 /* Tap once for right parenthesis, twice for right bracket, thrice for right brace */
93 [TD_BRACKETS_RIGHT] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, td_brackets_right_finished, td_brackets_right_reset),
94 /* Tap once for plus, twice for equals */
95 [TD_PLUS_EQUALS] = ACTION_TAP_DANCE_DOUBLE(KC_PLUS, KC_EQUAL),
96 /* Tap once for single quote, twice for double quote */
97 [TD_QUOTE_DOUBLEQUOTE] = ACTION_TAP_DANCE_DOUBLE(KC_QUOTE, KC_DOUBLE_QUOTE),
98 /* Tap once for semicolon, twice for colon */
99 [TD_SEMICOLON_COLON] = ACTION_TAP_DANCE_DOUBLE(KC_SCOLON, KC_COLON),
100 /* Tap once for slash, twice for question mark */
101 [TD_SLASH_QUESTION] = ACTION_TAP_DANCE_DOUBLE(KC_SLASH, KC_QUESTION),
102 /* Tap once for underscore, twice for minus */
103 [TD_UNDERSCORE_MINUS] = ACTION_TAP_DANCE_DOUBLE(KC_UNDERSCORE, KC_MINUS),
104};
105
106/* clang-format off */
107const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
108
109/* Qwerty
110 * ,-------+-------+-------+-------+-------+-------|-------+-------+-------+-------+-------+-------.
111 * | ` | ! | @ | # | $ | % | ^ | & | * | _ - | + = | Bksp |
112 * |-------+-------+-------+-------+-------+-------|-------+-------+-------+-------+-------+-------|
113 * | Tab | Q | W | E | R | T | Y | U | I | O | P | ' " |
114 * |-------+-------+-------+-------+-------+-------|-------+-------+-------+-------+-------+-------|
115 * |CtrlEsc| A | S | D | F | G | H | J | K | L | ; : | / ? |
116 * |-------+-------+-------+-------+-------+-------|-------+-------+-------+-------+-------+-------|
117 * | Shift | Z | X | C | V | B | N | M | , | . | ↑ | RShift|
118 * |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
119 * |NumPad | Ctrl | Alt | GUI | Lower/Space | Raise/Enter | GUI | ← | ↓ | → |
120 * `-----------------------------------------------------------------------------------------------'
121 */
122[_QWERTY] = LAYOUT_preonic_2x2u (
123 KC_GRV, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, TD_USMI, TD_PLEQ, KC_BSPC,
124 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, TD_SQDQ,
125 MT_CESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, TD_SCOL, TD_SLQU,
126 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, KC_RSFT,
127 MO_NUMS, KC_LCTL, KC_LALT, KC_LGUI, LT_LWSP, LT_RSRT, KC_RGUI, KC_LEFT, KC_DOWN, KC_RGHT
128),
129
130/* Numpad
131 * ,-------+-------+-------+-------+-------+-------|-------+-------+-------+-------+-------+-------.
132 * | | | | | | | | Tab | / | * | Bksp | |
133 * |-------+-------+-------+-------+-------+-------|-------+-------+-------+-------+-------+-------|
134 * | | | | | | | | 7 | 8 | 9 | - | |
135 * |-------+-------+-------+-------+-------+-------|-------+-------+-------+-------+-------+-------|
136 * | | | | | | | | 4 | 5 | 6 | + | |
137 * |-------+-------+-------+-------+-------+-------|-------+-------+-------+-------+-------+-------|
138 * | | | | | | | | 1 | 2 | 3 | Enter | |
139 * |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
140 * | | | | | | | 0 | . | Enter | |
141 * `-----------------------------------------------------------------------------------------------'
142 */
143[_NUMPAD] = LAYOUT_preonic_2x2u (
144 _______, _______, _______, _______, _______, _______, _______, KC_TAB, KC_SLSH, KC_PAST, KC_BSPC, _______,
145 _______, _______, _______, _______, _______, _______, _______, KC_KP_7, KC_KP_8, KC_KP_9, KC_PMNS, _______,
146 _______, _______, _______, _______, _______, _______, _______, KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, _______,
147 _______, _______, _______, _______, _______, _______, _______, KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT, _______,
148 _______, _______, _______, _______, _______, _______, KC_KP_0, KC_PDOT, KC_PENT, _______
149),
150
151/* Lower
152 * ,-------+-------+-------+-------+-------+-------|-------+-------+-------+-------+-------+-------.
153 * | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 |Delete |
154 * |-------+-------+-------+-------+-------+-------|-------+-------+-------+-------+-------+-------|
155 * | | | Vol+ | | | | | | | | MPlay | |
156 * |-------+-------+-------+-------+-------+-------|-------+-------+-------+-------+-------+-------|
157 * | | MPrev | Vol- | MNext | | | | | | | | \ |
158 * |-------+-------+-------+-------+-------+-------|-------+-------+-------+-------+-------+-------|
159 * | | | | | | | | Mute | | | PgUp | |
160 * |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
161 * | | | | | | | | Home | PgDn | End |
162 * `-----------------------------------------------------------------------------------------------'
163 */
164[_LOWER] = LAYOUT_preonic_2x2u (
165 KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL,
166 _______, _______, KC_VOLU, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, _______,
167 _______, KC_MPRV, KC_VOLD, KC_MNXT, _______, _______, _______, _______, _______, _______, _______, KC_BSLS,
168 _______, _______, _______, _______, _______, _______, _______, KC_MUTE, _______, _______, KC_PGUP, _______,
169 _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END
170),
171
172/* Raise
173 * ,-------+-------+-------+-------+-------+-------|-------+-------+-------+-------+-------+-------.
174 * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | |
175 * |-------+-------+-------+-------+-------+-------|-------+-------+-------+-------+-------+-------|
176 * | | | | | | | | | | | | |
177 * |-------+-------+-------+-------+-------+-------|-------+-------+-------+-------+-------+-------|
178 * | | | | | | | | | [ { ( | ) } ] | | | |
179 * |-------+-------+-------+-------+-------+-------|-------+-------+-------+-------+-------+-------|
180 * | | | | | | | | | | | | |
181 * |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
182 * | | | | | | | | | | |
183 * `-----------------------------------------------------------------------------------------------'
184 */
185[_RAISE] = LAYOUT_preonic_2x2u (
186 _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______,
187 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
188 _______, _______, _______, _______, _______, _______, _______, _______, TD_LBRK, TD_RBRK, _______, KC_PIPE,
189 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
190 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
191),
192
193/* Adjust (Lower + Raise)
194 * ,-------+-------+-------+-------+-------+-------|-------+-------+-------+-------+-------+-------.
195 * |AudTog |███████|███████|███████|███████|███████|███████|███████|███████|███████| Debug | Reset |
196 * |-------+-------+-------+-------+-------+-------|-------+-------+-------+-------+-------+-------|
197 * |Clicky |ClkFrq-|ClkFrq+|███████|███████|███████|███████|███████|███████|███████|TermOn |TermOff|
198 * |-------+-------+-------+-------+-------+-------|-------+-------+-------+-------+-------+-------|
199 * | Music |Voice- |Voice+ |███████|███████|███████|███████|███████|███████|███████|AGnorm |AGswap |
200 * |-------+-------+-------+-------+-------+-------|-------+-------+-------+-------+-------+-------|
201 * | MIDI |R plain|R breat|R rnbow|R swirl|R snake|R knigt|R xmas |R grade|RGBtest|███████| Shift |
202 * |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
203 * |RGBmode|RGBhue+|RGBsat+|RGBval+| | |███████|███████|███████|███████|
204 * `-----------------------------------------------------------------------------------------------'
205 */
206[_ADJUST] = LAYOUT_preonic_2x2u (
207 AU_TOG, XXXXXXX, XXXXXXX, XXXXXXX, RGB_HUI, RGB_HUD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DEBUG, RESET,
208 CK_TOGG, CK_DOWN, CK_UP, XXXXXXX, RGB_SAI, RGB_SAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, TERM_ON, TERM_OFF,
209 MU_TOG, MUV_DE, MUV_IN, XXXXXXX, RGB_VAI, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, AG_NORM, AG_SWAP,
210 MI_TOG, RGB_M_P, RGB_M_B, RGB_M_R,RGB_M_SW,RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, RGB_M_T, RGB_SPI, KC_LSHIFT,
211 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX,RGB_RMOD, RGB_SPD, RGB_MOD
212)
213
214};
215/* clang-format on */
216
217float s_audio_on[][2] = AUDIO_ON_SONG;
218float s_layer_lower[][2] = LAYER_LOWER_SONG;
219float s_layer_raise[][2] = LAYER_RAISE_SONG;
220
221void audio_on_user() { PLAY_SONG(s_audio_on); };
222
223bool process_record_user(uint16_t keycode, keyrecord_t *record) {
224 switch (keycode) {
225 case LOWER:
226 if (record->event.pressed) {
227 layer_on(_LOWER);
228 update_tri_layer(_LOWER, _RAISE, _ADJUST);
229 PLAY_SONG(s_layer_lower);
230 } else {
231 layer_off(_LOWER);
232 update_tri_layer(_LOWER, _RAISE, _ADJUST);
233 }
234 return false;
235 break;
236 case RAISE:
237 if (record->event.pressed) {
238 layer_on(_RAISE);
239 update_tri_layer(_LOWER, _RAISE, _ADJUST);
240 PLAY_SONG(s_layer_raise);
241 } else {
242 layer_off(_RAISE);
243 update_tri_layer(_LOWER, _RAISE, _ADJUST);
244 }
245 return false;
246 break;
247 case BACKLIT:
248 if (record->event.pressed) {
249 register_code(KC_RSFT);
250#ifdef BACKLIGHT_ENABLE
251 backlight_step();
252#endif
253#ifdef __AVR__
254 writePinLow(E6);
255#endif
256 } else {
257 unregister_code(KC_RSFT);
258#ifdef __AVR__
259 writePinHigh(E6);
260#endif
261 }
262 return false;
263 break;
264 }
265 return true;
266};
267
268/* Global TapDance State */
269static t_tap qk_tap_state = {
270 .left_brackets = 0,
271 .right_brackets = 0,
272};
273
274float s_numpad_toggle[][2] = LAYER_NMPAD_SONG;
275
276t_tap_state get_tapdance_state(qk_tap_dance_state_t *state) {
277 if (state->count == 1) {
278 if (state->interrupted || !state->pressed) {
279 return SINGLE_TAP;
280 } else {
281 return SINGLE_HOLD;
282 }
283 } else if (state->count == 2) {
284 if (state->interrupted || !state->pressed) {
285 return DOUBLE_TAP;
286 } else {
287 return DOUBLE_HOLD;
288 }
289 } else if (state->count == 3) {
290 if (state->interrupted || !state->pressed) {
291 return TRIPLE_TAP;
292 } else {
293 return TRIPLE_HOLD;
294 }
295 } else
296 return TAP_DANCE_NO_MATCH;
297}
298
299void td_brackets_left_finished(qk_tap_dance_state_t *state, void *user_data) {
300 qk_tap_state.left_brackets = get_tapdance_state(state);
301 switch (qk_tap_state.left_brackets) {
302 case SINGLE_TAP:
303 register_code16(KC_LEFT_PAREN);
304 break;
305 case DOUBLE_TAP:
306 register_code(KC_LBRACKET);
307 break;
308 case TRIPLE_TAP:
309 register_code16(KC_LEFT_CURLY_BRACE);
310 break;
311 default:
312 break;
313 }
314}
315
316void td_brackets_left_reset(qk_tap_dance_state_t *state, void *user_data) {
317 switch (qk_tap_state.left_brackets) {
318 case SINGLE_TAP:
319 unregister_code16(KC_LEFT_PAREN);
320 break;
321 case DOUBLE_TAP:
322 unregister_code(KC_LBRACKET);
323 break;
324 case TRIPLE_TAP:
325 unregister_code16(KC_LEFT_CURLY_BRACE);
326 break;
327 default:
328 break;
329 }
330 qk_tap_state.left_brackets = 0;
331}
332
333void td_brackets_right_finished(qk_tap_dance_state_t *state, void *user_data) {
334 qk_tap_state.right_brackets = get_tapdance_state(state);
335 switch (qk_tap_state.right_brackets) {
336 case SINGLE_TAP:
337 register_code16(KC_RIGHT_PAREN);
338 break;
339 case DOUBLE_TAP:
340 register_code(KC_RBRACKET);
341 break;
342 case TRIPLE_TAP:
343 register_code16(KC_RIGHT_CURLY_BRACE);
344 break;
345 default:
346 break;
347 }
348}
349
350void td_brackets_right_reset(qk_tap_dance_state_t *state, void *user_data) {
351 switch (qk_tap_state.right_brackets) {
352 case SINGLE_TAP:
353 unregister_code16(KC_RIGHT_PAREN);
354 break;
355 case DOUBLE_TAP:
356 unregister_code(KC_RBRACKET);
357 break;
358 case TRIPLE_TAP:
359 unregister_code16(KC_RIGHT_CURLY_BRACE);
360 break;
361 default:
362 break;
363 }
364 qk_tap_state.right_brackets = 0;
365}
366
367bool muse_mode = false;
368uint8_t last_muse_note = 0;
369uint16_t muse_counter = 0;
370uint8_t muse_offset = 70;
371uint16_t muse_tempo = 50;
372
373void encoder_update_user(uint8_t index, bool clockwise) {
374 if (muse_mode) {
375 if (IS_LAYER_ON(_RAISE)) {
376 if (clockwise) {
377 muse_offset++;
378 } else {
379 muse_offset--;
380 }
381 } else {
382 if (clockwise) {
383 muse_tempo += 1;
384 } else {
385 muse_tempo -= 1;
386 }
387 }
388 } else {
389 if (clockwise) {
390 tap_code(KC_PGDN);
391 } else {
392 tap_code(KC_PGUP);
393 }
394 }
395}
396
397void dip_switch_update_user(uint8_t index, bool active) {
398 switch (index) {
399 case 0:
400 if (active) {
401 layer_on(_ADJUST);
402 } else {
403 layer_off(_ADJUST);
404 }
405 break;
406 case 1:
407 if (active) {
408 muse_mode = true;
409 } else {
410 muse_mode = false;
411 }
412 }
413}
diff --git a/keyboards/preonic/keymaps/mverteuil_2x2u/rules.mk b/keyboards/preonic/keymaps/mverteuil_2x2u/rules.mk
new file mode 100644
index 000000000..9e55d0aa6
--- /dev/null
+++ b/keyboards/preonic/keymaps/mverteuil_2x2u/rules.mk
@@ -0,0 +1,6 @@
1USER_NAME := mverteuil
2SRC += muse.c
3
4AUDIO_ENABLE = yes
5MIDI_ENABLE = yes
6TAP_DANCE_ENABLE = yes
diff --git a/users/mverteuil/.gitignore b/users/mverteuil/.gitignore
new file mode 100644
index 000000000..785f649dc
--- /dev/null
+++ b/users/mverteuil/.gitignore
@@ -0,0 +1 @@
copyright.h
diff --git a/users/mverteuil/mverteuil.c b/users/mverteuil/mverteuil.c
new file mode 100644
index 000000000..a3afc417f
--- /dev/null
+++ b/users/mverteuil/mverteuil.c
@@ -0,0 +1,2 @@
1#include QMK_KEYBOARD_H
2#include "mverteuil.h"
diff --git a/users/mverteuil/mverteuil.h b/users/mverteuil/mverteuil.h
new file mode 100644
index 000000000..1119b75ad
--- /dev/null
+++ b/users/mverteuil/mverteuil.h
@@ -0,0 +1,21 @@
1#if AUDIO_ENABLE
2# if __has_include("copyright.h")
3# include "copyright.h"
4# endif
5
6# define LOWER_SOUND S__NOTE(_EF5), W__NOTE(_REST), Q__NOTE(_E4)
7# define NUMPAD_SOUND S__NOTE(_DF5), S__NOTE(_REST), S__NOTE(_C6)
8# define RAISE_SOUND S__NOTE(_E4), W__NOTE(_REST), Q__NOTE(_EF5)
9
10# define AUDIO_ON_SONG SONG(ZELDA_PUZZLE)
11# define LAYER_FUNCROW_ON_SONG SONG(COLEMAK_SOUND)
12# define LAYER_FUNCROW_OFF_SONG SONG(QWERTY_SOUND)
13# define LAYER_NMPAD_SONG SONG(NUMPAD_SOUND)
14# define LAYER_LOWER_SONG SONG(LOWER_SOUND)
15# define LAYER_RAISE_SONG SONG(RAISE_SOUND)
16#else
17// No-op version of PLAY_SONG instead of many checks for AUDIO_ENABLED
18# ifndef PLAY_SONG
19# define PLAY_SONG(ARG) // ARG
20# endif
21#endif
diff --git a/users/mverteuil/rules.mk b/users/mverteuil/rules.mk
new file mode 100644
index 000000000..bfc4b1ed1
--- /dev/null
+++ b/users/mverteuil/rules.mk
@@ -0,0 +1 @@
SRC += mverteuil.c