]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/planck/keymaps/pvc/keymap.c
Merge pull request #733 from cbbrowne/master
[qmk_firmware.git] / keyboards / planck / keymaps / pvc / keymap.c
1 #include "planck.h"
2 #include "action_layer.h"
3 #include "eeconfig.h"
4 #include "led.h"
5 #include "mousekey.h"
6
7 #ifdef AUDIO_ENABLE
8     #include "audio.h"
9     #include "song_list.h"
10 #endif
11
12 enum keyboard_layers {
13   LAYER_QWERTY = 0,
14   LAYER_UPPER,
15   LAYER_LOWER,
16   LAYER_FUNCTION,
17   LAYER_MOUSE,
18   LAYER_ADJUST,
19 };
20 enum keyboard_macros {
21   MACRO_QWERTY = 0,
22   MACRO_UPPER,
23   MACRO_LOWER,
24   MACRO_FUNCTION,
25   MACRO_MOUSE,
26   MACRO_TIMBRE_1,
27   MACRO_TIMBRE_2,
28   MACRO_TIMBRE_3,
29   MACRO_TIMBRE_4,
30   MACRO_TEMPO_U,
31   MACRO_TEMPO_D,
32   MACRO_TONE_DEFAULT,
33   MACRO_MUSIC_TOGGLE,
34   MACRO_AUDIO_TOGGLE,
35   MACRO_INC_VOICE,
36   MACRO_DEC_VOICE,
37   MACRO_BACKLIGHT,
38   MACRO_BREATH_TOGGLE,
39   MACRO_BREATH_SPEED_INC,
40   MACRO_BREATH_SPEED_DEC,
41   MACRO_BREATH_DEFAULT,
42   MACRO_MOUSE_MOVE_UL,
43   MACRO_MOUSE_MOVE_UR,
44   MACRO_MOUSE_MOVE_DL,
45   MACRO_MOUSE_MOVE_DR,
46 };
47
48 #define M_QWRTY             M(MACRO_QWERTY)
49 #define M_UPPER             M(MACRO_UPPER)
50 #define M_LOWER             M(MACRO_LOWER)
51 #define M_FUNCT             M(MACRO_FUNCTION)
52 #define M_MOUSE             M(MACRO_MOUSE)
53 #define TIMBR_1             M(MACRO_TIMBRE_1)
54 #define TIMBR_2             M(MACRO_TIMBRE_2)
55 #define TIMBR_3             M(MACRO_TIMBRE_3)
56 #define TIMBR_4             M(MACRO_TIMBRE_4)
57 #define TMPO_UP             M(MACRO_TEMPO_U)
58 #define TMPO_DN             M(MACRO_TEMPO_D)
59 #define TMPO_DF             M(MACRO_TONE_DEFAULT)
60 #define M_BACKL             M(MACRO_BACKLIGHT)
61 #define M_BRTOG             M(MACRO_BREATH_TOGGLE)
62 #define M_BSPDU             M(MACRO_BREATH_SPEED_INC)
63 #define M_BSPDD             M(MACRO_BREATH_SPEED_DEC)
64 #define M_BDFLT             M(MACRO_BREATH_DEFAULT)
65 #define M_MS_UL             M(MACRO_MOUSE_MOVE_UL)
66 #define M_MS_UR             M(MACRO_MOUSE_MOVE_UR)
67 #define M_MS_DL             M(MACRO_MOUSE_MOVE_DL)
68 #define M_MS_DR             M(MACRO_MOUSE_MOVE_DR)
69
70
71 #define VC_UP               M(MACRO_INC_VOICE)
72 #define VC_DOWN             M(MACRO_DEC_VOICE)
73
74
75 #define SC_UNDO             LCTL(KC_Z)
76 #define SC_REDO             LCTL(KC_Y)
77 #define SC_CUT              LCTL(KC_X)
78 #define SC_COPY             LCTL(KC_C)
79 #define SC_PSTE             LCTL(KC_V)
80 #define SC_SELA             LCTL(KC_A)
81 #define SC_SAVE             LCTL(KC_S)
82 #define SC_OPEN             LCTL(KC_O)
83 #define SC_ACLS             LALT(KC_F4)
84 #define SC_CCLS             LCTL(KC_F4)
85
86 #define TG_NKRO             MAGIC_TOGGLE_NKRO
87 #define OS_SHFT             KC_FN0
88
89 #define _______             KC_TRNS
90 #define XXXXXXX             KC_NO
91 #define ________________    _______, _______
92 #define XXXXXXXXXXXXXXXX    XXXXXXX, XXXXXXX
93
94 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
95
96 /* LAYER = LAYER_QWERTY
97   .-----------------------------------------------------------------------------------------------------------.
98   | TAB    | Q      | W      | E      | R      | T      | Y      | U      | I      | O      | P      | BACKSP |
99   |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
100   | ESC    | A      | S      | D      | F      | G      | H      | J      | K      | L      | ;      | '      |
101   |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
102   | LSHIFT | Z      | X      | C      | V      | B      | N      | M      | ,      | .      | UP     | ENTER  |
103   |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
104   | LCTRL  | LWIN   | FN     | LALT   | UPPER  | SPACE  | SPACE  | LOWER  | OSHIFT | LEFT   | DOWN   | RIGHT  |
105   '-----------------------------------------------------------------------------------------------------------'
106 */
107
108 [LAYER_QWERTY] = {
109   { KC_TAB , KC_Q   , KC_W   , KC_E   , KC_R   , KC_T   , KC_Y   , KC_U   , KC_I   , KC_O   , KC_P   , KC_BSPC },
110   { KC_ESC , KC_A   , KC_S   , KC_D   , KC_F   , KC_G   , KC_H   , KC_J   , KC_K   , KC_L   , KC_SCLN, KC_QUOT },
111   { KC_LSFT, KC_Z   , KC_X   , KC_C   , KC_V   , KC_B   , KC_N   , KC_M   , KC_COMM, KC_DOT , KC_UP  , KC_ENT  },
112   { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_UPPER, KC_SPC , KC_SPC , M_LOWER, OS_SHFT, KC_LEFT, KC_DOWN, KC_RGHT }
113 },
114
115 /* LAYER = LAYER_UPPER
116   .-----------------------------------------------------------------------------------------------------------.
117   | PRINT  | F1     | F2     | F3     | F4     | NUM LK | KP /   | KP 7   | KP 8   | KP 9   | KP -   | DEL    |
118   |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
119   | PAUSE  | F5     | F6     | F7     | F8     | SCR LK | KP *   | KP 4   | KP 5   | KP 6   | KP +   | INS    |
120   |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
121   | ______ | F9     | F10    | F11    | F12    | PAUSE  | KP 0   | KP 1   | KP 2   | KP 3   | KP ENT | HOME   |
122   |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
123   | ______ | ______ | ______ | ______ | UPPER  | KP 0   | KP 0   | ______ | RALT   | KP .   | KP ENT | END    |
124   '-----------------------------------------------------------------------------------------------------------'
125 */
126
127 [LAYER_UPPER] = {
128   { KC_PSCR, KC_F1  , KC_F2  , KC_F3  , KC_F4  , KC_NLCK, KC_PSLS, KC_KP_7, KC_KP_8, KC_KP_9, KC_PMNS, KC_DEL  },
129   { KC_PAUS, KC_F5  , KC_F6  , KC_F7  , KC_F8  , KC_SLCK, KC_PAST, KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, KC_INS  },
130   { _______, KC_F9  , KC_F10 , KC_F11 , KC_F12 , KC_PAUS, KC_KP_0, KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT, KC_HOME },
131   { _______, _______, _______, _______, M_UPPER, KC_KP_0, KC_KP_0, _______, KC_RALT, KC_PDOT, KC_PENT, KC_END  }
132 },
133
134 /* LAYER = LAYER_LOWER
135   .-----------------------------------------------------------------------------------------------------------.
136   | ______ | $      | {      | [      | (      | %      | #      | )      | ]      | }      | @      | PG UP  |
137   |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
138   | ______ | ^      | *      | +      | -      | /      | \      | _      | '      | "      | `      | PG DN  |
139   |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
140   | ______ | |      | &      | !      | ~      | ;      | :      | =      | <      | >      | ?      | HOME   |
141   |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
142   | ______ | ______ | ______ | ______ | ______ | ______ | ______ | LOWER  | ______ | ______ | ______ | END    |
143   '-----------------------------------------------------------------------------------------------------------'
144 */
145
146 [LAYER_LOWER] = {
147   { _______, KC_DLR , KC_LCBR, KC_LBRC, KC_LPRN, KC_PERC, KC_HASH, KC_RPRN, KC_RBRC, KC_RCBR, KC_AT  , KC_PGUP },
148   { _______, KC_CIRC, KC_ASTR, KC_PLUS, KC_MINS, KC_SLSH, KC_BSLS, KC_UNDS, KC_QUOT, KC_DQT , KC_GRV , KC_PGDN },
149   { _______, KC_PIPE, KC_AMPR, KC_EXLM, KC_TILD, KC_SCLN, KC_COLN, KC_EQL , KC_LT  , KC_GT  , KC_QUES, KC_HOME },
150   { _______, _______, _______, _______, _______, _______, _______, M_LOWER, _______, _______, _______, KC_END  }
151 },
152
153 /* LAYER = LAYER_FUNCTION
154   .-----------------------------------------------------------------------------------------------------------.
155   | XXXXXX | F13    | F14    | F15    | F16    | NUM LK | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX |
156   |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
157   | XXXXXX | F17    | F18    | F19    | F20    | SCR LK | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX |
158   |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
159   | ______ | F21    | F22    | F23    | F24    | CAP LK | XXXXXX | XXXXXX | XXXXXX | XXXXXX | VOL UP | MUTE   |
160   |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
161   | ______ | ______ | FN     | ______ | ______ | PLAY   | PLAY   | ______ | ______ | PREV   | VOL DN | NEXT   |
162   '-----------------------------------------------------------------------------------------------------------'
163 */
164
165 [LAYER_FUNCTION] = {
166   { XXXXXXX, KC_F13 , KC_F14 , KC_F15 , KC_F16 , KC_NLCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
167   { XXXXXXX, KC_F17 , KC_F18 , KC_F19 , KC_F20 , KC_SLCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
168   { _______, KC_F21 , KC_F22 , KC_F23 , KC_F24 , KC_CAPS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLU, KC_MUTE },
169   { _______, _______, M_FUNCT, _______, _______, KC_MPLY, KC_MPLY, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT }
170 },
171
172 #ifdef MOUSEKEY_ENABLE
173
174 /* LAYER = LAYER_MOUSE
175   .-----------------------------------------------------------------------------------------------------------.
176   | ESC    | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | MS UL  | MS U   | MS UR  | MS WHL | MS WHR |
177   |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
178   | XXXXXX | MS BT5 | MS BT4 | MS BT3 | MS BT2 | XXXXXX | XXXXXX | MS L   | XXXXXX | MS R   | XXXXXX | MS WHU |
179   |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
180   | ______ | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | MS DL  | MS D   | MS DR  | MS U   | MS WHD |
181   |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
182   | ______ | ______ | ______ | ______ | ______ | MS BT1 | MS BT1 | ______ | ______ | MS L   | MS D   | MS R   |
183   '-----------------------------------------------------------------------------------------------------------'
184 */
185
186 [LAYER_MOUSE] = {
187   { KC_ESC , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, M_MS_UL, KC_MS_U, M_MS_UR, KC_WH_L, KC_WH_R },
188   { XXXXXXX, KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, XXXXXXX, XXXXXXX, KC_MS_L, XXXXXXX, KC_MS_R, XXXXXXX, KC_WH_U },
189   { _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, M_MS_DL, KC_MS_D, M_MS_DR, KC_MS_U, KC_WH_D },
190   { _______, _______, _______, _______, _______, KC_BTN1, KC_BTN1, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R }
191 },
192
193 #endif
194
195 /* LAYER = LAYER_ADJUST
196   .-----------------------------------------------------------------------------------------------------------.
197   | XXXXXX | BRTOG  | BRSPD+ | BRSPD- | BRDFLT | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | MUSIC  | AUDIO  |
198   |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
199   | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX |
200   |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
201   | XXXXXX | QWERTY | XXXXXX | XXXXXX | BACKLT | RESET  | XXXXXX | MOUSE  | XXXXXX | XXXXXX | VOICE+ | XXXXXX |
202   |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
203   | XXXXXX | XXXXXX | XXXXXX | XXXXXX | UPPER  | XXXXXX | XXXXXX | LOWER  | XXXXXX | TEMPO- | VOICE- | TEMPO+ |
204   '-----------------------------------------------------------------------------------------------------------'
205 */
206
207 [LAYER_ADJUST] = {
208   { XXXXXXX, M_BRTOG, M_BSPDU, M_BSPDD, M_BDFLT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, MU_TOG , AU_TOG  },
209   { XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
210   { XXXXXXX, M_QWRTY, XXXXXXX, XXXXXXX, M_BACKL, RESET  , TG_NKRO, M_MOUSE, XXXXXXX, XXXXXXX, MUV_IN , XXXXXXX },
211   { XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, M_UPPER, XXXXXXX, XXXXXXX, M_LOWER, XXXXXXX, TMPO_DN, MUV_DE , TMPO_UP }
212 },
213
214 };
215
216 #ifdef AUDIO_ENABLE
217
218 float tone_my_startup[][2] = SONG(ODE_TO_JOY);
219 float tone_my_goodbye[][2] = SONG(ROCK_A_BYE_BABY);
220
221 float tone_audio_on[][2]   = SONG(CLOSE_ENCOUNTERS_5_NOTE);
222 float tone_music_on[][2]   = SONG(DOE_A_DEER);
223 float tone_caps_on[][2]    = SONG(CAPS_LOCK_ON_SOUND);
224 float tone_caps_off[][2]   = SONG(CAPS_LOCK_OFF_SOUND);
225 float tone_numlk_on[][2]   = SONG(NUM_LOCK_ON_SOUND);
226 float tone_numlk_off[][2]  = SONG(NUM_LOCK_OFF_SOUND);
227 float tone_scroll_on[][2]  = SONG(SCROLL_LOCK_ON_SOUND);
228 float tone_scroll_off[][2] = SONG(SCROLL_LOCK_OFF_SOUND);
229 float music_scale[][2]     = SONG(MUSIC_SCALE_SOUND);
230
231 #endif /* AUDIO_ENABLE */
232
233 void persistant_default_layer_set(uint16_t default_layer)
234 {
235     eeconfig_update_default_layer(default_layer);
236     default_layer_set(default_layer);
237 }
238
239 const uint16_t PROGMEM fn_actions[] = {
240     [0] = ACTION_MODS_ONESHOT(MOD_RSFT),
241 };
242
243 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
244 {
245
246     // MACRODOWN only works in this function
247     switch(id)
248     {
249
250         case MACRO_BREATH_TOGGLE:
251             if (record->event.pressed)
252             {
253                 breathing_toggle();
254             }
255             break;
256
257         case MACRO_BREATH_SPEED_INC:
258             if (record->event.pressed)
259             {
260                 breathing_speed_inc(1);
261             }
262             break;
263
264         case MACRO_BREATH_SPEED_DEC:
265             if (record->event.pressed)
266             {
267                 breathing_speed_dec(1);
268             }
269             break;
270
271         case MACRO_BREATH_DEFAULT:
272             if (record->event.pressed)
273             {
274                 breathing_defaults();
275             }
276             break;
277
278         case MACRO_QWERTY:
279             if (record->event.pressed)
280             {
281                 persistant_default_layer_set(1UL<<LAYER_QWERTY);
282             }
283             break;
284
285         case MACRO_UPPER:
286             if (record->event.pressed)
287             {
288                 layer_on(LAYER_UPPER);
289                 breathing_speed_set(2);
290                 breathing_pulse();
291                 update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST);
292             }
293             else
294             {
295                 layer_off(LAYER_UPPER);
296                 update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST);
297             }
298             break;
299
300         case MACRO_LOWER:
301             if (record->event.pressed)
302             {
303                 layer_on(LAYER_LOWER);
304                 breathing_speed_set(2);
305                 breathing_pulse();
306                 update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST);
307             }
308             else
309             {
310                 layer_off(LAYER_LOWER);
311                 update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST);
312             }
313             break;
314
315         case MACRO_FUNCTION:
316             if (record->event.pressed)
317             {
318                 breathing_speed_set(3);
319                 breathing_enable();
320                 layer_on(LAYER_FUNCTION);
321             }
322             else
323             {
324                 breathing_speed_set(1);
325                 breathing_self_disable();
326                 layer_off(LAYER_FUNCTION);
327             }
328             break;
329
330
331 #ifdef BACKLIGHT_ENABLE
332                 case MACRO_BACKLIGHT:
333                         if (record->event.pressed)
334                         {
335                                 backlight_step();
336                         }
337 #endif
338
339 #ifdef MOUSEKEY_ENABLE
340
341         case MACRO_MOUSE:
342             if (record->event.pressed)
343             {
344                 layer_invert(LAYER_MOUSE);
345             }
346             break;
347
348         case MACRO_MOUSE_MOVE_UL:
349             if (record->event.pressed)
350             {
351               mousekey_on(KC_MS_UP);
352               mousekey_on(KC_MS_LEFT);
353             }
354             else
355             {
356               mousekey_off(KC_MS_UP);
357               mousekey_off(KC_MS_LEFT);
358             }
359             break;
360
361         case MACRO_MOUSE_MOVE_UR:
362             if (record->event.pressed)
363             {
364               mousekey_on(KC_MS_UP);
365               mousekey_on(KC_MS_RIGHT);
366             }
367             else
368             {
369               mousekey_off(KC_MS_UP);
370               mousekey_off(KC_MS_RIGHT);
371             }
372             break;
373
374         case MACRO_MOUSE_MOVE_DL:
375             if (record->event.pressed)
376             {
377               mousekey_on(KC_MS_DOWN);
378               mousekey_on(KC_MS_LEFT);
379             }
380             else
381             {
382               mousekey_off(KC_MS_DOWN);
383               mousekey_off(KC_MS_LEFT);
384             }
385             break;
386
387         case MACRO_MOUSE_MOVE_DR:
388             if (record->event.pressed)
389             {
390               mousekey_on(KC_MS_DOWN);
391               mousekey_on(KC_MS_RIGHT);
392             }
393             else
394             {
395               mousekey_off(KC_MS_DOWN);
396               mousekey_off(KC_MS_RIGHT);
397             }
398             break;
399
400 #endif /* MOUSEKEY_ENABLE */
401
402 #ifdef AUDIO_ENABLE
403
404         case MACRO_TIMBRE_1:
405             if (record->event.pressed) set_timbre(TIMBRE_12);
406             break;
407
408         case MACRO_TIMBRE_2:
409             if (record->event.pressed) set_timbre(TIMBRE_25);
410             break;
411
412         case MACRO_TIMBRE_3:
413             if (record->event.pressed) set_timbre(TIMBRE_50);
414             break;
415
416         case MACRO_TIMBRE_4:
417             if (record->event.pressed) set_timbre(TIMBRE_75);
418             break;
419
420         case MACRO_TEMPO_U:
421             if (record->event.pressed) increase_tempo(10);
422             break;
423
424         case MACRO_TEMPO_D:
425             if (record->event.pressed) decrease_tempo(10);
426             break;
427
428         case MACRO_TONE_DEFAULT:
429             if (record->event.pressed)
430             {
431                 set_timbre(TIMBRE_DEFAULT);
432                 set_tempo(TEMPO_DEFAULT);
433             }
434             break;
435
436 #endif /* AUDIO_ENABLE */
437
438         default:
439             break;
440
441     }
442     return MACRO_NONE;
443 };
444
445
446 #ifdef AUDIO_ENABLE
447
448 void matrix_init_user(void)
449 {
450     set_voice(default_voice);
451     startup_user();
452     println("Matrix Init");
453 }
454
455 void led_set_user(uint8_t usb_led)
456 {
457     static uint8_t old_usb_led = 0;
458
459     _delay_ms(10); // gets rid of tick
460
461     if ((usb_led & (1<<USB_LED_CAPS_LOCK)) && !(old_usb_led & (1<<USB_LED_CAPS_LOCK)))
462     {
463             // If CAPS LK LED is turning on...
464             PLAY_NOTE_ARRAY(tone_caps_on,  false, LEGATO);
465     }
466     else if (!(usb_led & (1<<USB_LED_CAPS_LOCK)) && (old_usb_led & (1<<USB_LED_CAPS_LOCK)))
467     {
468             // If CAPS LK LED is turning off...
469             PLAY_NOTE_ARRAY(tone_caps_off, false, LEGATO);
470     }
471     else if ((usb_led & (1<<USB_LED_NUM_LOCK)) && !(old_usb_led & (1<<USB_LED_NUM_LOCK)))
472     {
473             // If NUM LK LED is turning on...
474             PLAY_NOTE_ARRAY(tone_numlk_on,  false, LEGATO);
475     }
476     else if (!(usb_led & (1<<USB_LED_NUM_LOCK)) && (old_usb_led & (1<<USB_LED_NUM_LOCK)))
477     {
478             // If NUM LED is turning off...
479             PLAY_NOTE_ARRAY(tone_numlk_off, false, LEGATO);
480     }
481     else if ((usb_led & (1<<USB_LED_SCROLL_LOCK)) && !(old_usb_led & (1<<USB_LED_SCROLL_LOCK)))
482     {
483             // If SCROLL LK LED is turning on...
484             PLAY_NOTE_ARRAY(tone_scroll_on,  false, LEGATO);
485     }
486     else if (!(usb_led & (1<<USB_LED_SCROLL_LOCK)) && (old_usb_led & (1<<USB_LED_SCROLL_LOCK)))
487     {
488             // If SCROLL LED is turning off...
489             PLAY_NOTE_ARRAY(tone_scroll_off, false, LEGATO);
490     }
491     old_usb_led = usb_led;
492 }
493
494
495 void startup_user()
496 {
497     _delay_ms(10); // gets rid of tick
498     PLAY_NOTE_ARRAY(tone_my_startup, false, STACCATO);
499 }
500
501 void shutdown_user()
502 {
503     PLAY_NOTE_ARRAY(tone_my_goodbye, false, STACCATO);
504     _delay_ms(2000);
505     stop_all_notes();
506 }
507
508 void audio_on_user(void)
509 {
510         PLAY_NOTE_ARRAY(tone_audio_on, false, STACCATO);
511 }
512
513 void music_on_user(void)
514 {
515         PLAY_NOTE_ARRAY(tone_music_on, false, STACCATO);
516 }
517
518 void music_scale_user(void)
519 {
520         PLAY_NOTE_ARRAY(music_scale, false, STACCATO);
521 }
522
523 #endif /* AUDIO_ENABLE */