aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStuart Fong <72262579+stuartfong1@users.noreply.github.com>2021-02-12 14:15:38 -0500
committerGitHub <noreply@github.com>2021-02-12 14:15:38 -0500
commitbedb72b0bc30db906b436e2fc820a4a6559a7520 (patch)
tree6e5d89cfe8892847bc3084b0a8c0fa8068ca3e07
parent22368ee49e507dc494b4217bc2a8bbd1606714ee (diff)
downloadqmk_firmware-bedb72b0bc30db906b436e2fc820a4a6559a7520.tar.gz
qmk_firmware-bedb72b0bc30db906b436e2fc820a4a6559a7520.zip
Add stuartfong1 Planck Layout (#11814)
* Add files via upload * Update readme.md * Update readme.md * Add GPL2+ compatible license header to config.h * Update keyboards/planck/keymaps/stuartfong1/keymap.c Co-authored-by: Drashna Jaelre <drashna@live.com> Co-authored-by: Drashna Jaelre <drashna@live.com>
-rw-r--r--keyboards/planck/keymaps/stuartfong1/config.h29
-rw-r--r--keyboards/planck/keymaps/stuartfong1/keymap.c318
-rw-r--r--keyboards/planck/keymaps/stuartfong1/readme.md68
-rw-r--r--keyboards/planck/keymaps/stuartfong1/rules.mk4
4 files changed, 419 insertions, 0 deletions
diff --git a/keyboards/planck/keymaps/stuartfong1/config.h b/keyboards/planck/keymaps/stuartfong1/config.h
new file mode 100644
index 000000000..7245bc806
--- /dev/null
+++ b/keyboards/planck/keymaps/stuartfong1/config.h
@@ -0,0 +1,29 @@
1/* Copyright 2020 Stuart Fong
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#define MIDI_BASIC
19#define DYNAMIC_MACRO_NO_NESTING
20#define AUTO_SHIFT_TIMEOUT 175
21
22#ifdef AUDIO_ENABLE
23 #define STARTUP_SONG SONG(PLANCK_SOUND)
24
25 #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \
26 SONG(COLEMAK_SOUND), \
27 SONG(DVORAK_SOUND) \
28 }
29#endif
diff --git a/keyboards/planck/keymaps/stuartfong1/keymap.c b/keyboards/planck/keymaps/stuartfong1/keymap.c
new file mode 100644
index 000000000..b15afb788
--- /dev/null
+++ b/keyboards/planck/keymaps/stuartfong1/keymap.c
@@ -0,0 +1,318 @@
1/* Copyright 2020 Stuart Fong
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#include "muse.h"
19
20enum planck_layers
21{
22 _COLEMAK,
23 _PLOVER,
24 _LOWER,
25 _RAISE,
26 _SYMBOL,
27 _FUNCTION,
28 _ADJUST
29};
30
31enum planck_keycodes {
32 COLEMAK = SAFE_RANGE,
33 PLOVER,
34 EXT_PLV,
35 CBR, // {}
36 PRN, // ()
37 BRC, // []
38 DQUO, // ""
39 PRTSC3, // Capture Entire Screen
40 PRTSC4, // Capture Selected Portion
41 PRTSC5 // Screenshot Toolbar
42};
43
44#define LOWER MO(_LOWER)
45#define RAISE MO(_RAISE)
46#define SYMBOL MO(_SYMBOL)
47#define FUNCTION MO(_FUNCTION)
48
49#define LTL LT(LOWER, KC_BSPC)
50#define LTS LT(SYMBOL, KC_TAB)
51#define LTF LT(FUNCTION, KC_ENT)
52#define LTR LT(RAISE, KC_SPC)
53
54const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] =
55{
56 /* Colemak
57 * ,-----------------------------------------------------------------------------------.
58 * | Q | W | F | P | B |Macro1|Macro2| J | L | U | Y | ; |
59 * |------+------+------+------+------+------+------+------+------+------+------+------|
60 * | A | R | S | T | G |Play 1|Play 2| M | N | E | I | O |
61 * |------+------+------+------+------+------+------+------+------+------+------+------|
62 * | Z | X | C | D | V | Shift| Shift| K | H | , | . | / |
63 * |------+------+------+------+------+------+------+------+------+------+------+------|
64 * | Ctrl | Alt | GUI | Bksp | Tab | Caps | Esc | Enter| Space| GUI | Alt | Ctrl |
65 * `-----------------------------------------------------------------------------------'
66 */
67 [_COLEMAK] = LAYOUT_planck_grid(
68 KC_Q, KC_W, KC_F, KC_P, KC_B, DM_REC1, DM_REC2, KC_J, KC_L, KC_U, KC_Y, KC_SCLN,
69 KC_A, KC_R, KC_S, KC_T, KC_G, DM_PLY1, DM_PLY2, KC_M, KC_N, KC_E, KC_I, KC_O,
70 KC_Z, KC_X, KC_C, KC_D, KC_V, KC_LSFT, KC_RSFT, KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH,
71 KC_LCTL, KC_LALT, KC_LGUI, LTL, LTS, KC_CAPS, KC_ESC, LTF, LTR, KC_RGUI, KC_RALT, KC_RCTL
72 ),
73
74 /* Plover layer (http://opensteno.org)
75 * ,-----------------------------------------------------------------------------------.
76 * | # | # | # | # | # | # | # | # | # | # | # | # |
77 * |------+------+------+------+------+------+------+------+------+------+------+------|
78 * | Tab | S | T | P | H | * | * | F | P | L | T | D |
79 * |------+------+------+------+------+------+------+------+------+------+------+------|
80 * | Enter| S | K | W | R | * | * | R | B | G | S | Z |
81 * |------+------+------+------+------+------+------+------+------+------+------+------|
82 * | Exit | Up | Down | A | O | Bksp | Space| E | U | Left | Right| Esc |
83 * `-----------------------------------------------------------------------------------'
84 */
85 [_PLOVER] = LAYOUT_planck_grid(
86 KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1,
87 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,
88 KC_ENT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
89 EXT_PLV, KC_UP, KC_DOWN, KC_C, KC_V, KC_BSPC, KC_SPC, KC_N, KC_M, KC_LEFT, KC_RGHT, KC_ESC
90 ),
91
92 /* Lower
93 * ,-----------------------------------------------------------------------------------.
94 * | - | ' | ; | {} | % | | | + | 7 | 8 | 9 | . |
95 * |------+------+------+------+------+------+------+------+------+------+------+------|
96 * | _ | " | = | () | / | | | - | 4 | 5 | 6 | 0 |
97 * |------+------+------+------+------+------+------+------+------+------+------+------|
98 * | \ | & | ! | [] | ^ | | | * | 1 | 2 | 3 | , |
99 * |------+------+------+------+------+------+------+------+------+------+------+------|
100 * | | | | | | | | Enter| Space| Bksp | | |
101 * `-----------------------------------------------------------------------------------'
102 */
103 [_LOWER] = LAYOUT_planck_grid(
104 KC_MINS, KC_QUOT, KC_SCLN, CBR, KC_PERC, XXXXXXX, XXXXXXX, KC_PPLS, KC_P7, KC_P8, KC_P9, KC_DOT,
105 KC_UNDS, DQUO, KC_PEQL, PRN, KC_PSLS, XXXXXXX, XXXXXXX, KC_PMNS, KC_P4, KC_P5, KC_P6, KC_P0,
106 KC_PIPE, KC_AMPR, KC_EXLM, BRC, KC_CIRC, XXXXXXX, XXXXXXX, KC_PAST, KC_P1, KC_P2, KC_P3, KC_COMM,
107 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_ENT, LTR, KC_BSPC, XXXXXXX, XXXXXXX
108 ),
109
110 /* Raise
111 * ,-----------------------------------------------------------------------------------.
112 * |Buttn4|Buttn3|RClick|LClick| Mute | | |Accel2| Home | PgDn | PgUp | End |
113 * |------+------+------+------+------+------+------+------+------+------+------+------|
114 * |MouseL|MouseU|MouseD|MouseR| VolD | | |Accel1| Left | Down | Up | Right|
115 * |------+------+------+------+------+------+------+------+------+------+------+------|
116 * |WheelL|WheelD|WheelU|WheelR| VolU | | |Accel0| RWD | Play | FFD | Stop |
117 * |------+------+------+------+------+------+------+------+------+------+------+------|
118 * | | | | | | | | | | | | |
119 * `-----------------------------------------------------------------------------------'
120 */
121 [_RAISE] = LAYOUT_planck_grid(
122 KC_BTN4, KC_BTN3, KC_BTN2, KC_BTN1, KC_MUTE, XXXXXXX, XXXXXXX, KC_ACL2, KC_HOME, KC_PGDN, KC_PGUP, KC_END,
123 KC_MS_L, KC_MS_U, KC_MS_D, KC_MS_R, KC_VOLD, XXXXXXX, XXXXXXX, KC_ACL1, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT,
124 KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R, KC_VOLU, XXXXXXX, XXXXXXX, KC_ACL0, KC_MRWD, KC_MPLY, KC_MFFD, KC_MSTP,
125 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
126 ),
127
128 /* Symbol
129 * ,-----------------------------------------------------------------------------------.
130 * | ! | @ | # | $ | | | | | + | { | } | ' |
131 * |------+------+------+------+------+------+------+------+------+------+------+------|
132 * | % | ^ | & | | | | | | | - | ( | } | " |
133 * |------+------+------+------+------+------+------+------+------+------+------+------|
134 * | = | ` | \ | ~ | | | | | * | ( | ) | _ |
135 * |------+------+------+------+------+------+------+------+------+------+------+------|
136 * | | | | | | | | | | | | |
137 * `-----------------------------------------------------------------------------------'
138 */
139 [_SYMBOL] = LAYOUT_planck_grid(
140 KC_EXLM, KC_AT, KC_HASH, KC_DLR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PLUS, KC_LCBR, KC_RCBR, KC_QUOT,
141 KC_PERC, KC_CIRC, KC_AMPR, KC_PIPE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MINS, KC_LPRN, KC_RPRN, KC_DQUO,
142 KC_EQL, KC_GRV, KC_BSLS, KC_TILD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_ASTR, KC_LBRC, KC_RBRC, KC_UNDS,
143 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
144 ),
145
146 /* Function
147 * ,-----------------------------------------------------------------------------------.
148 * | F1 | F2 | F3 | F4 |PrtSc5| | | | F13 | F14 | F15 | F16 |
149 * |------+------+------+------+------+------+------+------+------+------+------+------|
150 * | F5 | F6 | F7 | F8 |PrtSc4| | | | F17 | F18 | F19 | F20 |
151 * |------+------+------+------+------+------+------+------+------+------+------+------|
152 * | F9 | F10 | F11 | F12 |PrtSc3| | | | F21 | F22 | F23 | F24 |
153 * |------+------+------+------+------+------+------+------+------+------+------+------|
154 * | | | | | | | | | | | | |
155 * `-----------------------------------------------------------------------------------'
156 */
157 [_FUNCTION] = LAYOUT_planck_grid(
158 KC_F1, KC_F2, KC_F3, KC_F4, PRTSC5, XXXXXXX, XXXXXXX, XXXXXXX, KC_F13, KC_F14, KC_F15, KC_F16,
159 KC_F5, KC_F6, KC_F7, KC_F8, PRTSC4, XXXXXXX, XXXXXXX, XXXXXXX, KC_F17, KC_F18, KC_F19, KC_F20,
160 KC_F9, KC_F10, KC_F11, KC_F12, PRTSC3, XXXXXXX, XXXXXXX, XXXXXXX, KC_F21, KC_F22, KC_F23, KC_F24,
161 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
162 ),
163
164 /* Adjust (Lower + Raise)
165 * v------------------------RGB CONTROL--------------------v
166 * ,-----------------------------------------------------------------------------------.
167 * | | Reset|Debug | RGB |RGBMOD| HUE+ | HUE- | SAT+ | SAT- |BRGTH+|BRGTH-| |
168 * |------+------+------+------+------+------+------+------+------+------+------+------|
169 * | | |MUSmod|Aud on|Audoff|AGnorm|AGswap| |Plover| | | |
170 * |------+------+------+------+------+------+------+------+------+------+------+------|
171 * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof|TermOn|TermOf| | | |
172 * |------+------+------+------+------+------+------+------+------+------+------+------|
173 * | | | | | | | | | | | | |
174 * `-----------------------------------------------------------------------------------'
175 */
176 [_ADJUST] = LAYOUT_planck_grid(
177 XXXXXXX, RESET, DEBUG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, XXXXXXX,
178 XXXXXXX, XXXXXXX, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, XXXXXXX, PLOVER, XXXXXXX, XXXXXXX, XXXXXXX,
179 XXXXXXX, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, TERM_ON, TERM_OFF, XXXXXXX, XXXXXXX, XXXXXXX,
180 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
181 )
182};
183
184#ifdef AUDIO_ENABLE
185 float plover_song[][2] = SONG(PLOVER_SOUND);
186 float plover_gb_song[][2] = SONG(PLOVER_GOODBYE_SOUND);
187#endif
188
189layer_state_t layer_state_set_user(layer_state_t state) {
190 bool is_plover_on = layer_state_cmp(state, _PLOVER);
191 bool static was_plover_on = false, autoshift_on;
192 if (is_plover_on != was_plover_on) {
193 if (is_plover_on) {
194 autoshift_on = get_autoshift_state();
195 autoshift_disable();
196 } else {
197 if (autoshift_on) {
198 autoshift_enable();
199 autoshift_on = false;
200 }
201 }
202 was_plover_on = is_plover_on;
203 }
204 return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
205}
206
207bool process_record_user(uint16_t keycode, keyrecord_t *record) {
208 switch (keycode) {
209 case CBR:
210 if (record->event.pressed) {
211 SEND_STRING("{}" SS_TAP(X_LEFT));
212 }
213 return false;
214 break;
215 case PRN:
216 if (record->event.pressed) {
217 SEND_STRING("()" SS_TAP(X_LEFT));
218 }
219 return false;
220 break;
221 case BRC:
222 if (record->event.pressed) {
223 SEND_STRING("[]" SS_TAP(X_LEFT));
224 }
225 return false;
226 break;
227 case DQUO:
228 if (record->event.pressed) {
229 SEND_STRING("\"\"" SS_TAP(X_LEFT));
230 }
231 return false;
232 break;
233 case PRTSC3:
234 if (record->event.pressed) {
235 SEND_STRING(SS_LCMD(SS_LSFT("3")));
236 }
237 return false;
238 break;
239 case PRTSC4:
240 if (record->event.pressed) {
241 SEND_STRING(SS_LCMD(SS_LSFT("4")));
242 }
243 return false;
244 break;
245 case PRTSC5:
246 if (record->event.pressed) {
247 SEND_STRING(SS_LCMD(SS_LSFT("5")));
248 }
249 return false;
250 break;
251 case PLOVER:
252 if (record->event.pressed) {
253 #ifdef AUDIO_ENABLE
254 stop_all_notes();
255 PLAY_SONG(plover_song);
256 #endif
257 layer_off(_RAISE);
258 layer_off(_LOWER);
259 layer_off(_ADJUST);
260 layer_on(_PLOVER);
261 if (!eeconfig_is_enabled()) {
262 eeconfig_init();
263 }
264 keymap_config.raw = eeconfig_read_keymap();
265 keymap_config.nkro = 1;
266 eeconfig_update_keymap(keymap_config.raw);
267 }
268 return false;
269 break;
270 case EXT_PLV:
271 if (record->event.pressed) {
272 #ifdef AUDIO_ENABLE
273 PLAY_SONG(plover_gb_song);
274 #endif
275 layer_off(_PLOVER);
276 }
277 return false;
278 break;
279 }
280 return true;
281}
282
283bool muse_mode = false;
284uint8_t last_muse_note = 0;
285uint16_t muse_counter = 0;
286uint8_t muse_offset = 70;
287uint16_t muse_tempo = 50;
288
289void matrix_scan_user(void) {
290#ifdef AUDIO_ENABLE
291 if (muse_mode) {
292 if (muse_counter == 0) {
293 uint8_t muse_note = muse_offset + SCALE[muse_clock_pulse()];
294 if (muse_note != last_muse_note) {
295 stop_note(compute_freq_for_midi_note(last_muse_note));
296 play_note(compute_freq_for_midi_note(muse_note), 0xF);
297 last_muse_note = muse_note;
298 }
299 }
300 muse_counter = (muse_counter + 1) % muse_tempo;
301 } else {
302 if (muse_counter) {
303 stop_all_notes();
304 muse_counter = 0;
305 }
306 }
307#endif
308}
309
310bool music_mask_user(uint16_t keycode) {
311 switch (keycode) {
312 case RAISE:
313 case LOWER:
314 return false;
315 default:
316 return true;
317 }
318}
diff --git a/keyboards/planck/keymaps/stuartfong1/readme.md b/keyboards/planck/keymaps/stuartfong1/readme.md
new file mode 100644
index 000000000..1e5bc5e0c
--- /dev/null
+++ b/keyboards/planck/keymaps/stuartfong1/readme.md
@@ -0,0 +1,68 @@
1# stuartfong1's Planck Layout
2
3I made this layout to improve ergonomics during daily usage, and to make access to symbols easier when writing code. The main idea is to make all keys easily accessible while reducing the risk of finger strain.
4
5## Specifications
6This was made to work on a Planck rev. 6.1, and is used on macOS.
7
8## Base Layer
9
10![Image of Base Layer](https://i.imgur.com/XO7sgv4.png)
11
12This uses the Colemak DH layout with the wide mod.
13
14- Colemak is an alternative to the QWERTY layout designed for efficient and ergonomic typing in the English language (https://colemak.com). The Colemak DH is a modification of Colemak that makes the D and H keys easier to reach. The wide mod shifts the halves of the keyboard apart, making it easier on the shoulders (https://colemakmods.github.io/mod-dh/).
15- Space and backspace are located under the thumbs. Rotate the keys on the bottom row 180° for ease of use.
16- I use Auto Shift. This allows me to hold a key to shift it, which prevents me from having to reach for the shift key. The time to activate auto shift can be changed in the config.h file.
17- The 4 keys in the center are used for dynamic macros. On each side, hold the top key to start recording, and tap it to stop recording. Tap the middle key to play the macro. 2 macros can be stored at a time; the keys on the left are used for macro #1, and the keys on the right are used for macro #2.
18- Modifiers are located at the bottom left and bottom right of the keyboard. They can be accessed by moving the thumbs or with the sides of your hands.
19
20## Numpad Layer
21
22![Image of Numpad Layer](https://i.imgur.com/dPzvYM6.png)
23
24This contains a numpad and some non-alphanumeric characters such as math symbols and quotes.
25
26- The numpad is found under the right hand. It contains numbers and basic math symbols.
27- Brackets are typed using the left index finger. These keys. as well as the quotation marks, are macros that type both the beginning and end bracket, and move the cursor inside them.
28- The rest of the keys are those that are commonly used while writing code.
29
30## Navigation Layer
31
32![Image of Navigation Layer](https://i.imgur.com/Mr4EQbW.png)
33
34This contains mouse keys, arrow keys, and other keys used for navigation.
35
36- The left side has all the basic functionality of a mouse. The keys on the home row are used to move the mouse, the top ones are used for clicking on something, and the keys on the bottom are used to move the scroll wheel. The speed of the mouse can be adjusted using the right index finger.
37- The arrow keys are located on the right hand on the home row. Above these keys are some keys that are located on the navigation cluster.
38- Media keys are located on the bottom right, and the volume can be adjusted by using the left index finger.
39
40## Symbol Layer
41
42![Image of Symbol Layer](https://i.imgur.com/1ny1x9H.png)
43
44This contains all the symbols that are not found on the other layers.
45
46- The left side has most of the shifted number keys in increasing order. Some other keys here are for bitwise operators.
47- The right side has symbols that are repeated in the numpad layer. Individual brackets are located here in case I accidentally press backspace on one.
48
49## Function Layer
50
51![Image of Function Layer](https://i.imgur.com/Sc3qUs3.png)
52
53This has all the function keys from F1 to F24.
54
55- The function keys are sorted in increasing order.
56- F14 and F15 are used to lower and increase the brightness respectively.
57- Commands to screenshot / screen record are accessed with the left index finger.
58
59## Additional Layers
60
61- Adjust: Some settings for RGB control, music mode, and to reset the keyboard.
62
63![Image of Adjust Layer](https://i.imgur.com/gjxXXqj.png)
64
65- Plover: Used for stenography (http://www.openstenoproject.org). As I am still learning, I have included some extra keys.
66
67![Image of Plover Layer](https://i.imgur.com/uoSHgIC.png)
68
diff --git a/keyboards/planck/keymaps/stuartfong1/rules.mk b/keyboards/planck/keymaps/stuartfong1/rules.mk
new file mode 100644
index 000000000..d6c7c7277
--- /dev/null
+++ b/keyboards/planck/keymaps/stuartfong1/rules.mk
@@ -0,0 +1,4 @@
1SRC += muse.c
2AUTO_SHIFT_ENABLE = yes
3DYNAMIC_MACRO_ENABLE = yes
4STENO_ENABLE = yes