Stephan Bösebeck 9 years ago
commit 6ff5e10592

@ -274,7 +274,7 @@ This requires [some hardware changes](https://www.reddit.com/r/MechanicalKeyboar
## International Characters on Windows ## International Characters on Windows
[AutoHotkey](https://autohotkey.com) allows Windows users to create custom hotkeys amont others. [AutoHotkey](https://autohotkey.com) allows Windows users to create custom hotkeys among others.
The method does not require Unicode support in the keyboard itself but depends instead of AutoHotkey running in the background. The method does not require Unicode support in the keyboard itself but depends instead of AutoHotkey running in the background.

@ -2,12 +2,22 @@
__attribute__ ((weak)) __attribute__ ((weak))
void matrix_init_user(void) { void matrix_init_user(void) {
// leave these blank // leave this function blank - it can be defined in a keymap file
} };
__attribute__ ((weak)) __attribute__ ((weak))
void matrix_scan_user(void) { void matrix_scan_user(void) {
// leave these blank // leave this function blank - it can be defined in a keymap file
}
__attribute__ ((weak))
void process_action_user(keyrecord_t *record) {
// leave this function blank - it can be defined in a keymap file
}
__attribute__ ((weak))
void led_set_user(uint8_t usb_led) {
// leave this function blank - it can be defined in a keymap file
} }
void matrix_init_kb(void) { void matrix_init_kb(void) {
@ -33,4 +43,17 @@ void matrix_scan_kb(void) {
// runs every cycle (a lot) // runs every cycle (a lot)
matrix_scan_user(); matrix_scan_user();
} }
void process_action_kb(keyrecord_t *record) {
// put your per-action keyboard code here
// runs for every action, just before processing by the firmware
process_action_user(record);
}
void led_set_kb(uint8_t usb_led) {
// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
led_set_user(usb_led);
}

@ -41,7 +41,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
* *
*/ */
#define COLS (int []){ F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7, D3, D2, D1 } #define COLS (int []){ F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7, D3, D2, D1 }
#define ROWS (int []){ D0, D5, B5, B6, B3 } #define ROWS (int []){ D0, D5, B5, B6, B3 }
@ -62,17 +62,17 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* Locking resynchronize hack */ /* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE #define LOCKING_RESYNC_ENABLE
/* /*
* Force NKRO * Force NKRO
* *
* Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
* state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
* makefile for this to work.) * makefile for this to work.)
* *
* If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
* until the next keyboard reset. * until the next keyboard reset.
* *
* NKRO may prevent your keystrokes from being detected in the BIOS, but it is * NKRO may prevent your keystrokes from being detected in the BIOS, but it is
* fully operational during normal computer usage. * fully operational during normal computer usage.
* *
* For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
@ -90,7 +90,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
* the keyboard. They are best used in combination with the HID Listen program, * the keyboard. They are best used in combination with the HID Listen program,
* found here: https://www.pjrc.com/teensy/hid_listen.html * found here: https://www.pjrc.com/teensy/hid_listen.html
* *
* The options below allow the magic key functionality to be changed. This is * The options below allow the magic key functionality to be changed. This is
* useful if your keyboard/keypad is missing keys and you want magic key support. * useful if your keyboard/keypad is missing keys and you want magic key support.
* *
*/ */

@ -1,36 +1,78 @@
#include "atomic.h" #include "atomic.h"
#include "action_layer.h" #include "action_layer.h"
#include "eeconfig.h"
#include "led.h"
#ifdef AUDIO_ENABLE #ifdef AUDIO_ENABLE
#include "audio.h" #include "audio.h"
#include "song_list.h" #include "song_list.h"
#endif #endif
#define LAYER_QWERTY 0
#define _QW 0 #define LAYER_COLEMAK 1
#define _LW 1 #define LAYER_DVORAK 2
#define _RS 2 #define LAYER_LOWER 3
#define _AD 3 #define LAYER_RAISE 4
#define _FN 4 #define LAYER_ADJUST 5
#define LAYER_FUNCTION 6
#define M_QW 0 #define LAYER_MUSIC 7
#define M_LW 1
#define M_RS 2 #define MACRO_QWERTY 0
#define M_FN 3 #define MACRO_COLEMAK 1
#define M_T1 4 #define MACRO_DVORAK 2
#define M_T2 5 #define MACRO_LOWER 3
#define M_T3 6 #define MACRO_RAISE 4
#define M_T4 7 #define MACRO_FUNCTION 5
#define M_TU 8 #define MACRO_TIMBRE_1 6
#define M_TD 9 #define MACRO_TIMBRE_2 7
#define M_DF 10 #define MACRO_TIMBRE_3 8
#define MACRO_TIMBRE_4 9
#define MACRO_TEMPO_U 10
#define _______ KC_TRNS #define MACRO_TEMPO_D 11
#define ___T___ KC_TRNS #define MACRO_TONE_DEFAULT 12
#define XXXXXXX KC_NO #define MACRO_MUSIC_ON 13
#define MACRO_MUSIC_OFF 14
/* #define MACRO_AUDIO_ON 15
#define MACRO_AUDIO_OFF 16
#define M_QWRTY M(MACRO_QWERTY)
#define M_COLMK M(MACRO_COLEMAK)
#define M_DVORK M(MACRO_DVORAK)
#define M_LOWER M(MACRO_LOWER)
#define M_RAISE M(MACRO_RAISE)
#define M_FUNCT M(MACRO_FUNCTION)
#define TIMBR_1 M(MACRO_TIMBRE_1)
#define TIMBR_2 M(MACRO_TIMBRE_2)
#define TIMBR_3 M(MACRO_TIMBRE_3)
#define TIMBR_4 M(MACRO_TIMBRE_4)
#define TMPO_UP M(MACRO_TEMPO_U)
#define TMPO_DN M(MACRO_TEMPO_D)
#define TMPO_DF M(MACRO_TONE_DEFAULT)
#define MUS_ON M(MACRO_MUSIC_ON)
#define MUS_OFF M(MACRO_MUSIC_OFF)
#define AUD_OFF M(MACRO_AUDIO_OFF)
#define AUD_ON M(MACRO_AUDIO_ON)
#define SC_UNDO LCTL(KC_Z)
#define SC_REDO LCTL(KC_Y)
#define SC_CUT LCTL(KC_X)
#define SC_COPY LCTL(KC_C)
#define SC_PSTE LCTL(KC_V)
#define SC_SELA LCTL(KC_A)
#define SC_SAVE LCTL(KC_S)
#define SC_OPEN LCTL(KC_O)
#define SC_ACLS LALT(KC_F4)
#define SC_CCLS LCTL(KC_F4)
#define _______ KC_TRNS
#define ___T___ KC_TRNS
#define XXXXXXX KC_NO
/* QWERTY
* .---------------------------------------------------------------------------------------------------------------------- 2u ------------. * .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
* | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | XXXXXX . BACKSP | * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | XXXXXX . BACKSP |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
@ -45,270 +87,383 @@
*/ */
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QW] = { /* QWERTY */ [LAYER_QWERTY] = { /* QWERTY */
{ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, XXXXXXX }, { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, XXXXXXX },
{ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL }, { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL },
{ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, XXXXXXX, KC_PGUP }, { KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, XXXXXXX, KC_PGUP },
{ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, XXXXXXX, KC_UP, KC_PGDN }, { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, XXXXXXX, KC_UP, KC_PGDN },
{ KC_LCTL, KC_LGUI, M(M_FN), KC_LALT, M(M_RS), KC_SPC, XXXXXXX, M(M_LW), KC_RALT, KC_HOME, KC_END, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT }, { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC, XXXXXXX, M_LOWER, KC_RALT, KC_HOME, KC_END, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT },
},
/* COLEMAK
* .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
* | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | XXXXXX . BACKSP |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
* | TAB | Q | W | F | P | G | J | L | U | Y | ; | [ | ] | \ | DEL |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
* | CAPS | A | R | S | T | D | H | N | E | I | O | ' | XXXXXX . ENTER | PG UP |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
* | LSHIFT | Z | X | C | V | B | K | M | , | . | / | XXXXXX . RSHIFT | UP | PG DN |
* |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
* | LCTRL | LWIN | FN | LALT | RAISED | XXXXXX . SPACE | LOWER | RALT | HOME | END | RCTRL | LEFT | DOWN | RIGHT |
* '--------------------------------------------------------------------------------------------------------------------------------------'
*/
[LAYER_COLEMAK] = { /* COLEMAK */
{ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC },
{ KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL },
{ KC_CAPS, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, KC_ENT, KC_PGUP },
{ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, KC_UP, KC_PGDN },
{ KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC, XXXXXXX, M_LOWER, KC_RALT, KC_HOME, KC_END, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT },
}, },
[_LW] = { /* LOWERED */
/* DVORAK
* .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
* | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | [ | ] | XXXXXX . BACKSP |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
* | TAB | ' | , | . | P | Y | F | G | C | R | L | / | = | \ | DEL |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
* | CAPS | A | O | E | U | I | D | H | T | N | S | - | XXXXXX . ENTER | PG UP |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
* | LSHIFT | ; | Q | J | K | X | B | M | W | V | Z | XXXXXX . RSHIFT | UP | PG DN |
* |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
* | LCTRL | LWIN | FN | LALT | RAISED | XXXXXX . SPACE | LOWER | RALT | HOME | END | RCTRL | LEFT | DOWN | RIGHT |
* '--------------------------------------------------------------------------------------------------------------------------------------'
*/
[LAYER_DVORAK] = { /* DVORAK */
{ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC, KC_BSPC, KC_BSPC },
{ KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_BSLS, KC_DEL },
{ KC_CAPS, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_ENT, KC_ENT, KC_PGUP },
{ KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, KC_RSFT, KC_UP, KC_PGDN },
{ KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC, XXXXXXX, M_LOWER, KC_RALT, KC_HOME, KC_END, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT },
},
[LAYER_LOWER] = { /* LOWERED */
{ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ }, { KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS }, { _______, _______, _______, _______, SC_CCLS, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______ }, { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______ },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______ }, { _______, SC_REDO, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______ },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, { _______, _______, _______, _______, _______, KC_BSPC, KC_BSPC, _______, _______, _______, _______, _______, _______, _______, _______ },
}, },
[_RS] = { /* RAISED */
[LAYER_RAISE] = { /* RAISED */
{ KC_TILD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ }, { KC_TILD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS }, { _______, _______, _______, _______, SC_ACLS, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______ }, { _______, SC_SELA, SC_SAVE, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______ },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______ }, { _______, SC_UNDO, SC_CUT, SC_COPY, SC_PSTE, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______ },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, { _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______, _______, _______, _______, _______, _______, _______ },
}, },
[_FN] = { /* FUNCTION */
[LAYER_FUNCTION] = { /* FUNCTION */
{ KC_NLCK, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ }, { KC_NLCK, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ },
{ KC_SLCK, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_PAUS, KC_PSCR }, { KC_SLCK, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_PAUS, KC_PSCR },
{ KC_CAPS, KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, KC_ACL0, KC_ACL2, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, _______, ___T___, ___T___, KC_WH_U }, { KC_CAPS, KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, KC_ACL0, KC_ACL2, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, _______, ___T___, ___T___, KC_WH_U },
{ _______, M(M_T1), M(M_T2), M(M_T3), M(M_T4), M(M_TU), M(M_TD), M(M_DF), _______, _______, _______, ___T___, ___T___, KC_MS_U, KC_WH_D }, { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, KC_MS_U, KC_WH_D },
{ _______, _______, _______, _______, _______, KC_BTN1, KC_BTN1, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R }, { _______, _______, _______, _______, _______, KC_BTN1, KC_BTN1, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R },
}, },
[_AD] = { /* ADJUST */
[LAYER_ADJUST] = { /* ADJUST */
{ _______, TIMBR_1, TIMBR_2, TIMBR_3, TIMBR_4, TMPO_UP, TMPO_DN, TMPO_DF, _______, MUS_ON, MUS_OFF, AUD_ON, AUD_OFF, ___T___, ___T___ },
{ _______, M_QWRTY, M_COLMK, M_DVORK, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______ },
{ _______, _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______ },
{ _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______, _______, _______, _______, _______, _______, _______ },
},
[LAYER_MUSIC] = {
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___ }, { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___ },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______ }, { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______ },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______ }, { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______ },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, { _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______, _______, _______, _______, _______, _______, _______ },
}, },
}; };
#ifdef AUDIO_ENABLE #ifdef AUDIO_ENABLE
float start_up[][2] = SONG(ODE_TO_JOY); float tone_my_startup[][2] = SONG(ODE_TO_JOY);
float tone_my_goodbye[][2] = SONG(ROCK_A_BYE_BABY);
float tone_lw[][2] = {
Q__NOTE(_C4 ) ,
Q__NOTE(_CS4 ) ,
Q__NOTE(_D4 ) ,
Q__NOTE(_DS4 ) ,
Q__NOTE(_E4 ) ,
Q__NOTE(_F4 ) ,
Q__NOTE(_FS4 ) ,
Q__NOTE(_G4 ) ,
Q__NOTE(_GS4 ) ,
Q__NOTE(_A4 ) ,
Q__NOTE(_AS4 ) ,
Q__NOTE(_B1 ) ,
Q__NOTE(_C2 ) ,
Q__NOTE(_CS2 ) ,
Q__NOTE(_D2 ) ,
Q__NOTE(_DS2 ) ,
Q__NOTE(_E2 ) ,
Q__NOTE(_F2 ) ,
Q__NOTE(_FS2 ) ,
Q__NOTE(_G2 ) ,
Q__NOTE(_GS2 ) ,
Q__NOTE(_A2 ) ,
Q__NOTE(_AS2 ) ,
Q__NOTE(_B2 ) ,
Q__NOTE(_C3 ) ,
Q__NOTE(_CS3 ) ,
Q__NOTE(_D3 ) ,
Q__NOTE(_DS3 ) ,
Q__NOTE(_E3 ) ,
Q__NOTE(_F3 ) ,
Q__NOTE(_FS3 ) ,
Q__NOTE(_G3 ) ,
Q__NOTE(_GS3 ) ,
Q__NOTE(_A3 ) ,
Q__NOTE(_AS3 ) ,
Q__NOTE(_B3 ) ,
Q__NOTE(_C4 ) ,
Q__NOTE(_CS4 ) ,
Q__NOTE(_D4 ) ,
Q__NOTE(_DS4 ) ,
Q__NOTE(_E4 ) ,
Q__NOTE(_F4 ) ,
Q__NOTE(_FS4 ) ,
Q__NOTE(_G4 ) ,
Q__NOTE(_GS4 ) ,
Q__NOTE(_A4 ) ,
Q__NOTE(_AS4 ) ,
Q__NOTE(_B4 ) ,
Q__NOTE(_C5 ) ,
Q__NOTE(_CS5 ) ,
Q__NOTE(_D5 ) ,
Q__NOTE(_DS5 ) ,
Q__NOTE(_E5 ) ,
Q__NOTE(_F5 ) ,
Q__NOTE(_FS5 ) ,
Q__NOTE(_G5 ) ,
Q__NOTE(_GS5 ) ,
Q__NOTE(_A5 ) ,
Q__NOTE(_AS5 ) ,
Q__NOTE(_B5 ) ,
Q__NOTE(_C6 ) ,
Q__NOTE(_CS6 ) ,
Q__NOTE(_D6 ) ,
Q__NOTE(_DS6 ) ,
Q__NOTE(_E6 ) ,
Q__NOTE(_F6 ) ,
Q__NOTE(_FS6 ) ,
Q__NOTE(_G6 ) ,
Q__NOTE(_GS6 ) ,
Q__NOTE(_A6 ) ,
Q__NOTE(_AS6 ) ,
Q__NOTE(_B6 ) ,
Q__NOTE(_C7 ) ,
Q__NOTE(_CS7 ) ,
Q__NOTE(_D7 ) ,
Q__NOTE(_DS7 ) ,
Q__NOTE(_E7 ) ,
Q__NOTE(_F7 ) ,
Q__NOTE(_FS7 ) ,
Q__NOTE(_G7 ) ,
Q__NOTE(_GS7 ) ,
Q__NOTE(_A7 ) ,
Q__NOTE(_AS7 ) ,
Q__NOTE(_B7 ) ,
Q__NOTE(_C8 ) ,
Q__NOTE(_CS8 ) ,
Q__NOTE(_D8 ) ,
Q__NOTE(_DS8 ) ,
Q__NOTE(_E8 ) ,
Q__NOTE(_F8 ) ,
Q__NOTE(_FS8 ) ,
Q__NOTE(_G8 ) ,
Q__NOTE(_GS8 ) ,
Q__NOTE(_A8 ) ,
Q__NOTE(_AS8 ) ,
Q__NOTE(_B8 ) ,
};
float tone_rs[][2] = SONG(ROCK_A_BYE_BABY); float tone_qwerty[][2] = SONG(QWERTY_SOUND);
float tone_dvorak[][2] = SONG(COLEMAK_SOUND);
float tone_colemak[][2] = SONG(DVORAK_SOUND);
void matrix_init_user(void) { float tone_audio_on[][2] = SONG(CLOSE_ENCOUNTERS_5_NOTE);
init_notes(); float tone_music_on[][2] = SONG(DOE_A_DEER);
PLAY_NOTE_ARRAY(start_up, false, STACCATO); float tone_caps_on[][2] = SONG(CAPS_LOCK_ON_SOUND);
println("Matrix Init"); float tone_caps_off[][2] = SONG(CAPS_LOCK_OFF_SOUND);
} float tone_numlk_on[][2] = SONG(NUM_LOCK_ON_SOUND);
float tone_numlk_off[][2] = SONG(NUM_LOCK_OFF_SOUND);
#endif float tone_scroll_on[][2] = SONG(SCROLL_LOCK_ON_SOUND);
float tone_scroll_off[][2] = SONG(SCROLL_LOCK_OFF_SOUND);
#endif /* AUDIO_ENABLE */
/*
void update_quad_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3, uint8_t layer4, bool order) void update_quad_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3, uint8_t layer4, bool order)
{ {
if (order) if (order)
{ {
if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2))
{ {
layer_on(layer3); layer_on(layer3);
} }
else else
{ {
layer_off(layer3); layer_off(layer3);
layer_off(layer4); layer_off(layer4);
} }
} }
else else
{ {
if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2))
{ {
layer_on(layer4); layer_on(layer4);
} }
else else
{ {
layer_off(layer3); layer_off(layer3);
layer_off(layer4); layer_off(layer4);
} }
} }
} }
*/
void persistant_default_layer_set(uint16_t default_layer)
{
eeconfig_write_default_layer(default_layer);
default_layer_set(default_layer);
}
const uint16_t PROGMEM fn_actions[] = { const uint16_t PROGMEM fn_actions[] = {
}; };
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{ {
// MACRODOWN only works in this function // MACRODOWN only works in this function
switch(id) switch(id)
{ {
case M_LW:
if (record->event.pressed) { case MACRO_QWERTY:
#ifdef AUDIO_ENABLE if (record->event.pressed)
PLAY_NOTE_ARRAY(tone_lw, false, STACCATO); {
#endif persistant_default_layer_set(1UL<<LAYER_QWERTY);
layer_on(_LW); PLAY_NOTE_ARRAY(tone_qwerty, false, STACCATO);
update_tri_layer(_LW, _RS, _AD); }
} else { break;
layer_off(_LW);
update_tri_layer(_LW, _RS, _AD); case MACRO_COLEMAK:
} if (record->event.pressed)
break; {
case M_RS: persistant_default_layer_set(1UL<<LAYER_COLEMAK);
if (record->event.pressed) { PLAY_NOTE_ARRAY(tone_colemak, false, STACCATO);
#ifdef AUDIO_ENABLE }
PLAY_NOTE_ARRAY(tone_rs, false, LEGATO); break;
#endif
layer_on(_RS); case MACRO_DVORAK:
update_tri_layer(_LW, _RS, _AD); if (record->event.pressed)
} else { {
layer_off(_RS); persistant_default_layer_set(1UL<<LAYER_DVORAK);
update_tri_layer(_LW, _RS, _AD); PLAY_NOTE_ARRAY(tone_dvorak, false, STACCATO);
} }
break; break;
case M_FN:
if (record->event.pressed) { case MACRO_LOWER:
layer_on(_FN); if (record->event.pressed)
} else { {
layer_off(_FN); layer_on(LAYER_LOWER);
} update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
break; }
else
case M_T1: {
if (record->event.pressed) set_timbre(TIMBRE_12); layer_off(LAYER_LOWER);
break; update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
}
case M_T2: break;
if (record->event.pressed) set_timbre(TIMBRE_25);
break; case MACRO_RAISE:
if (record->event.pressed)
case M_T3: {
if (record->event.pressed) set_timbre(TIMBRE_50); layer_on(LAYER_RAISE);
break; update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
}
case M_T4: else
if (record->event.pressed) set_timbre(TIMBRE_75); {
break; layer_off(LAYER_RAISE);
update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
}
case M_TU: break;
if (record->event.pressed) increase_tempo(10);
break; case MACRO_FUNCTION:
if (record->event.pressed)
case M_TD: {
if (record->event.pressed) decrease_tempo(10); layer_on(LAYER_FUNCTION);
break; }
else
case M_DF: {
if (record->event.pressed) layer_off(LAYER_FUNCTION);
{ }
set_timbre(TIMBRE_DEFAULT); break;
set_tempo(TEMPO_DEFAULT);
} case MACRO_TIMBRE_1:
break; if (record->event.pressed) set_timbre(TIMBRE_12);
break;
default:
break; case MACRO_TIMBRE_2:
if (record->event.pressed) set_timbre(TIMBRE_25);
} break;
return MACRO_NONE;
}; case MACRO_TIMBRE_3:
if (record->event.pressed) set_timbre(TIMBRE_50);
break;
case MACRO_TIMBRE_4:
if (record->event.pressed) set_timbre(TIMBRE_75);
break;
case MACRO_TEMPO_U:
if (record->event.pressed) increase_tempo(10);
break;
case MACRO_TEMPO_D:
if (record->event.pressed) decrease_tempo(10);
break;
case MACRO_TONE_DEFAULT:
if (record->event.pressed)
{
set_timbre(TIMBRE_DEFAULT);
set_tempo(TEMPO_DEFAULT);
}
break;
case MACRO_AUDIO_OFF:
if (record->event.pressed)
{
#ifdef AUDIO_ENABLE
audio_off();
#endif
}
break;
case MACRO_AUDIO_ON:
if (record->event.pressed)
{
#ifdef AUDIO_ENABLE
audio_on();
PLAY_NOTE_ARRAY(tone_audio_on, false, STACCATO);
#endif
}
break;
case MACRO_MUSIC_ON:
if (record->event.pressed)
{
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(tone_music_on, false, STACCATO);
layer_on(LAYER_MUSIC);
#endif
}
break;
case MACRO_MUSIC_OFF:
if (record->event.pressed)
{
#ifdef AUDIO_ENABLE
layer_off(LAYER_MUSIC);
stop_all_notes();
#endif
}
break;
default:
break;
}
return MACRO_NONE;
};
#ifdef AUDIO_ENABLE
uint8_t starting_note = 0x0C;
int offset = 7;
void process_action_user(keyrecord_t *record)
{
if (IS_LAYER_ON(LAYER_MUSIC))
{
if (record->event.pressed)
{
play_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF);
}
else
{
stop_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
}
}
}
void matrix_init_user(void)
{
init_notes();
play_startup_tone();
println("Matrix Init");
}
void led_set_user(uint8_t usb_led)
{
static uint8_t old_usb_led = 0;
if ((usb_led & (1<<USB_LED_CAPS_LOCK)) && !(old_usb_led & (1<<USB_LED_CAPS_LOCK)))
{
// If CAPS LK LED is turning on...
PLAY_NOTE_ARRAY(tone_caps_on, false, LEGATO);
}
else if (!(usb_led & (1<<USB_LED_CAPS_LOCK)) && (old_usb_led & (1<<USB_LED_CAPS_LOCK)))
{
// If CAPS LK LED is turning off...
PLAY_NOTE_ARRAY(tone_caps_off, false, LEGATO);
}
else if ((usb_led & (1<<USB_LED_NUM_LOCK)) && !(old_usb_led & (1<<USB_LED_NUM_LOCK)))
{
// If NUM LK LED is turning on...
PLAY_NOTE_ARRAY(tone_numlk_on, false, LEGATO);
}
else if (!(usb_led & (1<<USB_LED_NUM_LOCK)) && (old_usb_led & (1<<USB_LED_NUM_LOCK)))
{
// If NUM LED is turning off...
PLAY_NOTE_ARRAY(tone_numlk_off, false, LEGATO);
}
else if ((usb_led & (1<<USB_LED_SCROLL_LOCK)) && !(old_usb_led & (1<<USB_LED_SCROLL_LOCK)))
{
// If SCROLL LK LED is turning on...
PLAY_NOTE_ARRAY(tone_scroll_on, false, LEGATO);
}
else if (!(usb_led & (1<<USB_LED_SCROLL_LOCK)) && (old_usb_led & (1<<USB_LED_SCROLL_LOCK)))
{
// If SCROLL LED is turning off...
PLAY_NOTE_ARRAY(tone_scroll_off, false, LEGATO);
}
old_usb_led = usb_led;
}
void play_startup_tone()
{
PLAY_NOTE_ARRAY(tone_my_startup, false, STACCATO);
}
void play_goodbye_tone()
{
PLAY_NOTE_ARRAY(tone_my_goodbye, false, STACCATO);
_delay_ms(2000);
}
#endif /* AUDIO_ENABLE */

@ -1,7 +1,7 @@
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700) MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450) EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = yes # Console for debug(+400) CONSOLE_ENABLE = no # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration COMMAND_ENABLE = yes # Commands for debug and configuration
NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality

@ -6,6 +6,9 @@
#ifdef AUDIO_ENABLE #ifdef AUDIO_ENABLE
#include "audio.h" #include "audio.h"
#endif #endif
#include "eeconfig.h"
extern keymap_config_t keymap_config;
// Each layer gets a name for readability, which is then used in the keymap matrix below. // Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name. // The underscores don't mean anything - you can have a layer called STUFF or any other name.
@ -16,8 +19,9 @@
#define _DVORAK 2 #define _DVORAK 2
#define _LOWER 3 #define _LOWER 3
#define _RAISE 4 #define _RAISE 4
#define _ADJUST 5 #define _MUSIC 5
#define _MUSIC 6 #define _PLOVER 6
#define _ADJUST 16
// Macro name shortcuts // Macro name shortcuts
#define QWERTY M(_QWERTY) #define QWERTY M(_QWERTY)
@ -32,6 +36,8 @@
#endif #endif
#define MUS_OFF M(8) #define MUS_OFF M(8)
#define MUS_ON M(9) #define MUS_ON M(9)
#define PLOVER M(10)
#define EXT_PLV M(11)
// Fillers to make layering more clear // Fillers to make layering more clear
#define _______ KC_TRNS #define _______ KC_TRNS
@ -129,33 +135,54 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
{_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
}, },
/* Music (reserved for process_action_user)
*
*/
[_MUSIC] = {
{XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
{XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
{XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
{XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, LOWER, XXXXXXX, XXXXXXX, RAISE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}
},
/* Plover layer (http://openstenoproject.org)
* ,-----------------------------------------------------------------------------------.
* | # | # | # | # | # | # | # | # | # | # | # | # |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | | S | T | P | H | * | * | F | P | L | T | D |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | | S | K | W | R | * | * | R | B | G | S | Z |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Exit | | | C | V | | N | M | | | |
* `-----------------------------------------------------------------------------------'
*/
[_PLOVER] = {
{KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1 },
{XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC},
{XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
{EXT_PLV, XXXXXXX, XXXXXXX, KC_C, KC_V, XXXXXXX, XXXXXXX, KC_N, KC_M, XXXXXXX, XXXXXXX, XXXXXXX}
},
/* Adjust (Lower + Raise) /* Adjust (Lower + Raise)
* ,-----------------------------------------------------------------------------------. * ,-----------------------------------------------------------------------------------.
* | | Reset| | | | | | | | | | Del | * | | Reset| | | | | | | | | | Del |
* |------+------+------+------+------+-------------+------+------+------+------+------| * |------+------+------+------+------+-------------+------+------+------+------+------|
* | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|Plover| |
* |------+------+------+------+------+------|------+------+------+------+------+------| * |------+------+------+------+------+------|------+------+------+------+------+------|
* | | | | | | | | | | | | | * | | | |Mus on|Musoff| | | | | | | |
* |------+------+------+------+------+------+------+------+------+------+------+------| * |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | | | | | | | * | | | | | | | | | | | |
* `-----------------------------------------------------------------------------------' * `-----------------------------------------------------------------------------------'
*/ */
[_ADJUST] = { [_ADJUST] = {
{_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL},
{_______, _______, _______, AUD_ON, AUD_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______}, {_______, _______, _______, AUD_ON, AUD_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______},
{_______, _______, _______, MUS_ON, MUS_OFF, _______, _______, _______, _______, _______, _______, _______}, {_______, _______, _______, MUS_ON, MUS_OFF, _______, _______, _______, _______, _______, _______, _______},
{_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
},
/* Music (reserved for process_action_user)
*
*/
[_MUSIC] = {
{_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______},
{_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______},
{_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______},
{_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
} }
}; };
const uint16_t PROGMEM fn_actions[] = { const uint16_t PROGMEM fn_actions[] = {
@ -302,6 +329,26 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
#endif #endif
} }
break; break;
case 10:
if (record->event.pressed) {
layer_off(_RAISE);
layer_off(_LOWER);
layer_off(_ADJUST);
layer_on(_PLOVER);
if (!eeconfig_is_enabled()) {
eeconfig_init();
}
keymap_config.raw = eeconfig_read_keymap();
keymap_config.nkro = 1;
eeconfig_write_keymap(keymap_config.raw);
}
break;
case 11:
if (record->event.pressed) {
layer_off(_PLOVER);
}
break;
} }
return MACRO_NONE; return MACRO_NONE;
}; };

@ -1 +1,2 @@
AUDIO_ENABLE = yes AUDIO_ENABLE = yes
NKRO_ENABLE = yes

@ -131,8 +131,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/ */
[_FN] = { [_FN] = {
{XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
{XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, MG_H, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
{XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
{XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
{XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX} {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}
} }
}; };
@ -142,16 +142,6 @@ const uint16_t PROGMEM fn_actions[] = {
}; };
int tri_layer = 0;
void update_tri_layer(int layer) {
if (tri_layer > 1) {
layer_on(layer);
} else {
layer_off(layer);
}
}
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{ {
// MACRODOWN only works in this function // MACRODOWN only works in this function
@ -161,13 +151,11 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
if (record->event.pressed) { if (record->event.pressed) {
print("RS_DN"); print("RS_DN");
layer_on(_RS); layer_on(_RS);
tri_layer++; update_tri_layer(_RS, _LW, _FN);
update_tri_layer(_FN);
} else { } else {
print("RS_UP"); print("RS_UP");
layer_off(_RS); layer_off(_RS);
tri_layer--; update_tri_layer(_RS, _LW, _FN);
update_tri_layer(_FN);
phex(layer_state); phex(layer_state);
} }
break; break;
@ -176,13 +164,11 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
if (record->event.pressed) { if (record->event.pressed) {
print("LW_DN"); print("LW_DN");
layer_on(_LW); layer_on(_LW);
tri_layer++; update_tri_layer(_RS, _LW, _FN);
update_tri_layer(_FN);
} else { } else {
print("LW_UP"); print("LW_UP");
layer_off(_LW); layer_off(_LW);
tri_layer--; update_tri_layer(_RS, _LW, _FN);
update_tri_layer(_FN);
} }
break; break;

@ -14,8 +14,8 @@
#define _DVORAK 2 #define _DVORAK 2
#define _LOWER 3 #define _LOWER 3
#define _RAISE 4 #define _RAISE 4
#define _ADJUST 5 #define _MUSIC 5
#define _MUSIC 6 #define _ADJUST 6
// Macro name shortcuts // Macro name shortcuts
#define QWERTY M(_QWERTY) #define QWERTY M(_QWERTY)
@ -158,7 +158,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_ADJUST] = { [_ADJUST] = {
{KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12}, {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12},
{_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL},
{_______, _______, _______, AUD_ON, AUD_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______}, {_______, _______, _______, AUD_ON, AUD_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______},
{_______, _______, _______, MUS_ON, MUS_OFF, _______, _______, _______, _______, _______, _______, _______}, {_______, _______, _______, MUS_ON, MUS_OFF, _______, _______, _______, _______, _______, _______, _______},
{_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
}, },
@ -167,12 +167,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* *
*/ */
[_MUSIC] = { [_MUSIC] = {
{_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
{_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
{_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
{_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
{_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, LOWER, XXXXXXX, XXXXXXX, RAISE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}
} }
}; };
const uint16_t PROGMEM fn_actions[] = { const uint16_t PROGMEM fn_actions[] = {
@ -224,7 +225,8 @@ float tone_music[][2] = {
{440.0*pow(2.0,(23)/12.0), 8}, {440.0*pow(2.0,(23)/12.0), 8},
{440.0*pow(2.0,(24)/12.0), 8} {440.0*pow(2.0,(24)/12.0), 8}
}; };
float ode_to_joy[][2] = SONG(ODE_TO_JOY); float music_scale[][2] = SONG(MUSIC_SCALE_SOUND);
float goodbye[][2] = SONG(GOODBYE_SOUND);
#endif #endif
void persistant_default_layer_set(uint16_t default_layer) { void persistant_default_layer_set(uint16_t default_layer) {
@ -314,8 +316,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
if (record->event.pressed) { if (record->event.pressed) {
#ifdef AUDIO_ENABLE #ifdef AUDIO_ENABLE
init_notes(); init_notes();
set_tempo(150); PLAY_NOTE_ARRAY(music_scale, false, 0);
PLAY_NOTE_ARRAY(ode_to_joy, false, .25);
layer_on(_MUSIC); layer_on(_MUSIC);
#endif #endif
} }
@ -342,6 +343,13 @@ void process_action_user(keyrecord_t *record) {
void matrix_init_user(void) { void matrix_init_user(void) {
#ifdef AUDIO_ENABLE #ifdef AUDIO_ENABLE
init_notes(); init_notes();
_delay_ms(10);
PLAY_NOTE_ARRAY(start_up, false, 0); PLAY_NOTE_ARRAY(start_up, false, 0);
#endif #endif
} }
void play_goodbye_tone()
{
PLAY_NOTE_ARRAY(goodbye, false, 0);
_delay_ms(150);
}

@ -2,39 +2,39 @@
__attribute__ ((weak)) __attribute__ ((weak))
void matrix_init_user(void) { void matrix_init_user(void) {
// leave this function blank - it can be defined in a keymap file // leave this function blank - it can be defined in a keymap file
}; };
__attribute__ ((weak)) __attribute__ ((weak))
void matrix_scan_user(void) { void matrix_scan_user(void) {
// leave this function blank - it can be defined in a keymap file // leave this function blank - it can be defined in a keymap file
}; };
__attribute__ ((weak)) __attribute__ ((weak))
void led_set_user(uint8_t usb_led) { void led_set_user(uint8_t usb_led) {
// leave this function blank - it can be defined in a keymap file // leave this function blank - it can be defined in a keymap file
}; };
void matrix_init_kb(void) { void matrix_init_kb(void) {
// put your keyboard start-up code here // put your keyboard start-up code here
// runs once when the firmware starts up // runs once when the firmware starts up
// Disable status LED on KB, enable status LED on Teensy (KB_STATUS = !TEENSY_STATUS) // Disable status LED on KB, enable status LED on Teensy (KB_STATUS = !TEENSY_STATUS)
DDRD |= (1<<6); DDRD |= (1<<6);
PORTD |= (1<<6); PORTD |= (1<<6);
matrix_init_user(); matrix_init_user();
}; };
void amatrix_scan_kb(void) { void amatrix_scan_kb(void) {
// put your looping keyboard code here // put your looping keyboard code here
// runs every cycle (a lot) // runs every cycle (a lot)
matrix_scan_user(); matrix_scan_user();
}; };
void led_set_kb(uint8_t usb_led) { void led_set_kb(uint8_t usb_led) {
// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
if (usb_led & (1<<USB_LED_CAPS_LOCK)) { if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
// output low // output low
@ -62,7 +62,7 @@ void led_set_kb(uint8_t usb_led) {
// Hi-Z // Hi-Z
DDRC &= ~(1<<6); DDRC &= ~(1<<6);
PORTC &= ~(1<<6); PORTC &= ~(1<<6);
} }
led_set_user(usb_led); led_set_user(usb_led);
}; };

@ -10,10 +10,13 @@
#include "eeconfig.h" #include "eeconfig.h"
#include "vibrato_lut.h"
#define PI 3.14159265 #define PI 3.14159265
#define CPU_PRESCALER 8 #define CPU_PRESCALER 8
// Largely untested PWM audio mode (doesn't sound as good)
// #define PWM_AUDIO // #define PWM_AUDIO
#ifdef PWM_AUDIO #ifdef PWM_AUDIO
@ -34,8 +37,6 @@ int voice_place = 0;
double frequency = 0; double frequency = 0;
int volume = 0; int volume = 0;
long position = 0; long position = 0;
int duty_place = 1;
int duty_counter = 0;
double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0}; double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0};
int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0}; int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0};
@ -51,7 +52,7 @@ uint16_t place_int = 0;
bool repeat = true; bool repeat = true;
uint8_t * sample; uint8_t * sample;
uint16_t sample_length = 0; uint16_t sample_length = 0;
double freq = 0;
bool notes = false; bool notes = false;
bool note = false; bool note = false;
@ -69,6 +70,12 @@ bool note_resting = false;
uint8_t current_note = 0; uint8_t current_note = 0;
uint8_t rest_counter = 0; uint8_t rest_counter = 0;
float vibrato_counter = 0;
float vibrato_strength = .5;
float vibrato_rate = 0.125;
float polyphony_rate = .5;
audio_config_t audio_config; audio_config_t audio_config;
@ -87,6 +94,81 @@ void audio_off(void) {
eeconfig_write_audio(audio_config.raw); eeconfig_write_audio(audio_config.raw);
} }
// Vibrato rate functions
void set_vibrato_rate(float rate) {
vibrato_rate = rate;
}
void increase_vibrato_rate(float change) {
vibrato_rate *= change;
}
void decrease_vibrato_rate(float change) {
vibrato_rate /= change;
}
#ifdef VIBRATO_STRENGTH_ENABLE
void set_vibrato_strength(float strength) {
vibrato_strength = strength;
}
void increase_vibrato_strength(float change) {
vibrato_strength *= change;
}
void decrease_vibrato_strength(float change) {
vibrato_strength /= change;
}
#endif
// Polyphony functions
void set_polyphony_rate(float rate) {
polyphony_rate = rate;
}
void enable_polyphony() {
polyphony_rate = 5;
}
void disable_polyphony() {
polyphony_rate = 0;
}
void increase_polyphony_rate(float change) {
polyphony_rate *= change;
}
void decrease_polyphony_rate(float change) {
polyphony_rate /= change;
}
// Timbre function
void set_timbre(float timbre) {
note_timbre = timbre;
}
// Tempo functions
void set_tempo(float tempo) {
note_tempo = tempo;
}
void decrease_tempo(uint8_t tempo_change) {
note_tempo += (float) tempo_change;
}
void increase_tempo(uint8_t tempo_change) {
if (note_tempo - (float) tempo_change < 10) {
note_tempo = 10;
} else {
note_tempo -= (float) tempo_change;
}
}
void stop_all_notes() { void stop_all_notes() {
voices = 0; voices = 0;
@ -109,6 +191,7 @@ void stop_all_notes() {
void stop_note(double freq) { void stop_note(double freq) {
if (note) { if (note) {
cli();
#ifdef PWM_AUDIO #ifdef PWM_AUDIO
freq = freq / SAMPLE_RATE; freq = freq / SAMPLE_RATE;
#endif #endif
@ -122,11 +205,15 @@ void stop_note(double freq) {
volumes[j] = volumes[j+1]; volumes[j] = volumes[j+1];
volumes[j+1] = 0; volumes[j+1] = 0;
} }
break;
} }
} }
voices--; voices--;
if (voices < 0) if (voices < 0)
voices = 0; voices = 0;
if (voice_place >= voices) {
voice_place = 0;
}
if (voices == 0) { if (voices == 0) {
#ifdef PWM_AUDIO #ifdef PWM_AUDIO
TIMSK3 &= ~_BV(OCIE3A); TIMSK3 &= ~_BV(OCIE3A);
@ -137,26 +224,8 @@ void stop_note(double freq) {
frequency = 0; frequency = 0;
volume = 0; volume = 0;
note = false; note = false;
} else {
double freq = frequencies[voices - 1];
int vol = volumes[voices - 1];
double starting_f = frequency;
if (frequency < freq) {
sliding = true;
for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) {
frequency = f;
}
sliding = false;
} else if (frequency > freq) {
sliding = true;
for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 2000.0)) {
frequency = f;
}
sliding = false;
}
frequency = freq;
volume = vol;
} }
sei();
} }
} }
@ -197,6 +266,21 @@ void init_notes() {
#endif #endif
} }
float mod(float a, int b)
{
float r = fmod(a, b);
return r < 0 ? r + b : r;
}
float vibrato(float average_freq) {
#ifdef VIBRATO_STRENGTH_ENABLE
float vibrated_freq = average_freq * pow(VIBRATO_LUT[(int)vibrato_counter], vibrato_strength);
#else
float vibrated_freq = average_freq * VIBRATO_LUT[(int)vibrato_counter];
#endif
vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0/average_freq)), VIBRATO_LUT_LENGTH);
return vibrated_freq;
}
ISR(TIMER3_COMPA_vect) { ISR(TIMER3_COMPA_vect) {
if (note) { if (note) {
@ -248,23 +332,37 @@ ISR(TIMER3_COMPA_vect) {
OCR4A = sum; OCR4A = sum;
} }
#else #else
if (frequency > 0) { if (voices > 0) {
// ICR3 = (int)(((double)F_CPU) / frequency); // Set max to the period if (polyphony_rate > 0) {
// OCR3A = (int)(((double)F_CPU) / frequency) >> 1; // Set compare to half the period if (voices > 1) {
voice_place %= voices; voice_place %= voices;
if (place > (frequencies[voice_place] / 50)) { if (place++ > (frequencies[voice_place] / polyphony_rate / CPU_PRESCALER)) {
voice_place = (voice_place + 1) % voices; voice_place = (voice_place + 1) % voices;
place = 0.0; place = 0.0;
}
}
if (vibrato_strength > 0) {
freq = vibrato(frequencies[voice_place]);
} else {
freq = frequencies[voice_place];
}
} else {
if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440/frequencies[voices - 1]/12/2)) {
frequency = frequency * pow(2, 440/frequency/12/2);
} else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440/frequencies[voices - 1]/12/2)) {
frequency = frequency * pow(2, -440/frequency/12/2);
} else {
frequency = frequencies[voices - 1];
}
if (vibrato_strength > 0) {
freq = vibrato(frequency);
} else {
freq = frequency;
}
} }
ICR3 = (int)(((double)F_CPU) / (frequencies[voice_place] * CPU_PRESCALER)); // Set max to the period ICR3 = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period
OCR3A = (int)((((double)F_CPU) / (frequencies[voice_place] * CPU_PRESCALER)) * note_timbre); // Set compare to half the period OCR3A = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period
//OCR3A = (int)(((double)F_CPU) / (frequencies[voice_place] * CPU_PRESCALER)) >> 1 * duty_place; // Set compare to half the period
place++;
// if (duty_counter > (frequencies[voice_place] / 500)) {
// duty_place = (duty_place % 3) + 1;
// duty_counter = 0;
// }
// duty_counter++;
} }
#endif #endif
} }
@ -290,8 +388,16 @@ ISR(TIMER3_COMPA_vect) {
place -= SINE_LENGTH; place -= SINE_LENGTH;
#else #else
if (note_frequency > 0) { if (note_frequency > 0) {
ICR3 = (int)(((double)F_CPU) / (note_frequency * CPU_PRESCALER)); // Set max to the period float freq;
OCR3A = (int)((((double)F_CPU) / (note_frequency * CPU_PRESCALER)) * note_timbre); // Set compare to half the period
if (vibrato_strength > 0) {
freq = vibrato(note_frequency);
} else {
freq = note_frequency;
}
ICR3 = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period
OCR3A = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period
} else { } else {
ICR3 = 0; ICR3 = 0;
OCR3A = 0; OCR3A = 0;
@ -350,7 +456,8 @@ ISR(TIMER3_COMPA_vect) {
void play_notes(float (*np)[][2], uint8_t n_count, bool n_repeat, float n_rest) { void play_notes(float (*np)[][2], uint8_t n_count, bool n_repeat, float n_rest) {
if (audio_config.enable) { if (audio_config.enable) {
cli();
// Cancel note if a note is playing
if (note) if (note)
stop_all_notes(); stop_all_notes();
notes = true; notes = true;
@ -378,7 +485,7 @@ if (audio_config.enable) {
TIMSK3 |= _BV(OCIE3A); TIMSK3 |= _BV(OCIE3A);
TCCR3A |= _BV(COM3A1); TCCR3A |= _BV(COM3A1);
#endif #endif
sei();
} }
} }
@ -405,7 +512,8 @@ if (audio_config.enable) {
void play_note(double freq, int vol) { void play_note(double freq, int vol) {
if (audio_config.enable && voices < 8) { if (audio_config.enable && voices < 8) {
cli();
// Cancel notes if notes are playing
if (notes) if (notes)
stop_all_notes(); stop_all_notes();
note = true; note = true;
@ -413,23 +521,8 @@ if (audio_config.enable && voices < 8) {
freq = freq / SAMPLE_RATE; freq = freq / SAMPLE_RATE;
#endif #endif
if (freq > 0) { if (freq > 0) {
if (frequency != 0) { frequencies[voices] = freq;
double starting_f = frequency; volumes[voices] = vol;
if (frequency < freq) {
for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) {
frequency = f;
}
} else if (frequency > freq) {
for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 2000.0)) {
frequency = f;
}
}
}
frequency = freq;
volume = vol;
frequencies[voices] = frequency;
volumes[voices] = volume;
voices++; voices++;
} }
@ -439,35 +532,21 @@ if (audio_config.enable && voices < 8) {
TIMSK3 |= _BV(OCIE3A); TIMSK3 |= _BV(OCIE3A);
TCCR3A |= _BV(COM3A1); TCCR3A |= _BV(COM3A1);
#endif #endif
sei();
} }
} }
void set_timbre(float timbre) //------------------------------------------------------------------------------
{ // Override these functions in your keymap file to play different tunes on
note_timbre = timbre; // startup and bootloader jump
} __attribute__ ((weak))
void play_startup_tone()
void set_tempo(float tempo)
{ {
note_tempo = tempo;
} }
void decrease_tempo(uint8_t tempo_change) __attribute__ ((weak))
void play_goodbye_tone()
{ {
note_tempo += (float) tempo_change;
} }
//------------------------------------------------------------------------------
void increase_tempo(uint8_t tempo_change)
{
if (note_tempo - (float) tempo_change < 10)
{
note_tempo = 10;
}
else
{
note_tempo -= (float) tempo_change;
}
}

@ -8,6 +8,9 @@
#ifndef AUDIO_H #ifndef AUDIO_H
#define AUDIO_H #define AUDIO_H
// Enable vibrato strength/amplitude - slows down ISR too much
// #define VIBRATO_STRENGTH_ENABLE
typedef union { typedef union {
uint8_t raw; uint8_t raw;
struct { struct {
@ -20,6 +23,34 @@ void audio_toggle(void);
void audio_on(void); void audio_on(void);
void audio_off(void); void audio_off(void);
// Vibrato rate functions
void set_vibrato_rate(float rate);
void increase_vibrato_rate(float change);
void decrease_vibrato_rate(float change);
#ifdef VIBRATO_STRENGTH_ENABLE
void set_vibrato_strength(float strength);
void increase_vibrato_strength(float change);
void decrease_vibrato_strength(float change);
#endif
// Polyphony functions
void set_polyphony_rate(float rate);
void enable_polyphony();
void disable_polyphony();
void increase_polyphony_rate(float change);
void decrease_polyphony_rate(float change);
void set_timbre(float timbre);
void set_tempo(float tempo);
void increase_tempo(uint8_t tempo_change);
void decrease_tempo(uint8_t tempo_change);
void play_sample(uint8_t * s, uint16_t l, bool r); void play_sample(uint8_t * s, uint16_t l, bool r);
void play_note(double freq, int vol); void play_note(double freq, int vol);
void stop_note(double freq); void stop_note(double freq);
@ -27,11 +58,6 @@ void stop_all_notes(void);
void init_notes(void); void init_notes(void);
void play_notes(float (*np)[][2], uint8_t n_count, bool n_repeat, float n_rest); void play_notes(float (*np)[][2], uint8_t n_count, bool n_repeat, float n_rest);
void set_timbre(float timbre);
void set_tempo(float tempo);
void increase_tempo(uint8_t tempo_change);
void decrease_tempo(uint8_t tempo_change);
#define SCALE (int []){ 0 + (12*0), 2 + (12*0), 4 + (12*0), 5 + (12*0), 7 + (12*0), 9 + (12*0), 11 + (12*0), \ #define SCALE (int []){ 0 + (12*0), 2 + (12*0), 4 + (12*0), 5 + (12*0), 7 + (12*0), 9 + (12*0), 11 + (12*0), \
0 + (12*1), 2 + (12*1), 4 + (12*1), 5 + (12*1), 7 + (12*1), 9 + (12*1), 11 + (12*1), \ 0 + (12*1), 2 + (12*1), 4 + (12*1), 5 + (12*1), 7 + (12*1), 9 + (12*1), 11 + (12*1), \
0 + (12*2), 2 + (12*2), 4 + (12*2), 5 + (12*2), 7 + (12*2), 9 + (12*2), 11 + (12*2), \ 0 + (12*2), 2 + (12*2), 4 + (12*2), 5 + (12*2), 7 + (12*2), 9 + (12*2), 11 + (12*2), \
@ -44,5 +70,7 @@ void decrease_tempo(uint8_t tempo_change);
#define NOTE_ARRAY_SIZE(x) ((int)(sizeof(x) / (sizeof(x[0])))) #define NOTE_ARRAY_SIZE(x) ((int)(sizeof(x) / (sizeof(x[0]))))
#define PLAY_NOTE_ARRAY(note_array, note_repeat, note_rest_style) play_notes(&note_array, NOTE_ARRAY_SIZE((note_array)), (note_repeat), (note_rest_style)); #define PLAY_NOTE_ARRAY(note_array, note_repeat, note_rest_style) play_notes(&note_array, NOTE_ARRAY_SIZE((note_array)), (note_repeat), (note_rest_style));
void play_goodbye_tone(void);
void play_startup_tone(void);
#endif #endif

@ -34,12 +34,6 @@ extern keymap_config_t keymap_config;
#include <inttypes.h> #include <inttypes.h>
#ifdef AUDIO_ENABLE #ifdef AUDIO_ENABLE
#include "audio.h" #include "audio.h"
#ifndef TONE_GOODBYE
#define TONE_GOODBYE OLKB_GOODBYE
#endif /*! TONE_GOODBYE */
float tone_goodbye[][2] = SONG(TONE_GOODBYE);
#endif /* AUDIO_ENABLE */ #endif /* AUDIO_ENABLE */
static action_t keycode_to_action(uint16_t keycode); static action_t keycode_to_action(uint16_t keycode);
@ -47,7 +41,7 @@ static action_t keycode_to_action(uint16_t keycode);
/* converts key to action */ /* converts key to action */
action_t action_for_key(uint8_t layer, keypos_t key) action_t action_for_key(uint8_t layer, keypos_t key)
{ {
// 16bit keycodes - important // 16bit keycodes - important
uint16_t keycode = keymap_key_to_keycode(layer, key); uint16_t keycode = keymap_key_to_keycode(layer, key);
switch (keycode) { switch (keycode) {
@ -190,7 +184,8 @@ static action_t keycode_to_action(uint16_t keycode)
case RESET: ; // RESET is 0x5000, which is why this is here case RESET: ; // RESET is 0x5000, which is why this is here
clear_keyboard(); clear_keyboard();
#ifdef AUDIO_ENABLE #ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(tone_goodbye, false, 0); stop_all_notes();
play_goodbye_tone();
#endif #endif
_delay_ms(250); _delay_ms(250);
#ifdef ATREUS_ASTAR #ifdef ATREUS_ASTAR
@ -303,7 +298,7 @@ static action_t keycode_to_action(uint16_t keycode)
/* translates key to keycode */ /* translates key to keycode */
uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key)
{ {
// Read entire word (16bits) // Read entire word (16bits)
return pgm_read_word(&keymaps[(layer)][(key.row)][(key.col)]); return pgm_read_word(&keymaps[(layer)][(key.row)][(key.col)]);
} }
@ -315,7 +310,7 @@ action_t keymap_fn_to_action(uint16_t keycode)
action_t keymap_func_to_action(uint16_t keycode) action_t keymap_func_to_action(uint16_t keycode)
{ {
// For FUNC without 8bit limit // For FUNC without 8bit limit
return (action_t){ .code = pgm_read_word(&fn_actions[(int)keycode]) }; return (action_t){ .code = pgm_read_word(&fn_actions[(int)keycode]) };
} }

@ -51,7 +51,10 @@
// Notes - # = Octave // Notes - # = Octave
#define NOTE_REST 0.00 #define NOTE_REST 0.00
/* These notes are currently bugged
#define NOTE_C0 16.35 #define NOTE_C0 16.35
#define NOTE_CS0 17.32 #define NOTE_CS0 17.32
#define NOTE_D0 18.35 #define NOTE_D0 18.35
@ -75,6 +78,8 @@
#define NOTE_GS1 51.91 #define NOTE_GS1 51.91
#define NOTE_A1 55.00 #define NOTE_A1 55.00
#define NOTE_AS1 58.27 #define NOTE_AS1 58.27
*/
#define NOTE_B1 61.74 #define NOTE_B1 61.74
#define NOTE_C2 65.41 #define NOTE_C2 65.41
#define NOTE_CS2 69.30 #define NOTE_CS2 69.30

@ -4,20 +4,98 @@
#define SONG_LIST_H #define SONG_LIST_H
#define ODE_TO_JOY \ #define ODE_TO_JOY \
Q__NOTE(_E4), Q__NOTE(_E4), Q__NOTE(_F4), Q__NOTE(_G4), \ Q__NOTE(_E4), Q__NOTE(_E4), Q__NOTE(_F4), Q__NOTE(_G4), \
Q__NOTE(_G4), Q__NOTE(_F4), Q__NOTE(_E4), Q__NOTE(_D4), \ Q__NOTE(_G4), Q__NOTE(_F4), Q__NOTE(_E4), Q__NOTE(_D4), \
Q__NOTE(_C4), Q__NOTE(_C4), Q__NOTE(_D4), Q__NOTE(_E4), \ Q__NOTE(_C4), Q__NOTE(_C4), Q__NOTE(_D4), Q__NOTE(_E4), \
QD_NOTE(_E4), E__NOTE(_D4), H__NOTE(_D4), QD_NOTE(_E4), E__NOTE(_D4), H__NOTE(_D4),
#define ROCK_A_BYE_BABY \ #define ROCK_A_BYE_BABY \
QD_NOTE(_B4), E__NOTE(_D4), Q__NOTE(_B5), \ QD_NOTE(_B4), E__NOTE(_D4), Q__NOTE(_B5), \
H__NOTE(_A5), Q__NOTE(_G5), \ H__NOTE(_A5), Q__NOTE(_G5), \
QD_NOTE(_B4), E__NOTE(_D5), Q__NOTE(_G5), \ QD_NOTE(_B4), E__NOTE(_D5), Q__NOTE(_G5), \
H__NOTE(_FS5), H__NOTE(_FS5),
#define OLKB_GOODBYE \ #define CLOSE_ENCOUNTERS_5_NOTE \
E__NOTE(_E7), \ Q__NOTE(_D5), \
E__NOTE(_A6), \ Q__NOTE(_E5), \
ED_NOTE(_E6), Q__NOTE(_C5), \
Q__NOTE(_C4), \
Q__NOTE(_G4),
#define DOE_A_DEER \
QD_NOTE(_C4), E__NOTE(_D4), \
QD_NOTE(_E4), E__NOTE(_C4), \
Q__NOTE(_E4), Q__NOTE(_C4), \
Q__NOTE(_E4),
#define GOODBYE_SOUND \
E__NOTE(_E7), \
E__NOTE(_A6), \
ED_NOTE(_E6),
#define STARTUP_SOUND \
ED_NOTE(_E7 ), \
E__NOTE(_CS7), \
E__NOTE(_E6 ), \
E__NOTE(_A6 ), \
M__NOTE(_CS7, 20),
#define QWERTY_SOUND \
E__NOTE(_GS6 ), \
E__NOTE(_A6 ), \
S__NOTE(_REST), \
Q__NOTE(_E7 ),
#define COLEMAK_SOUND \
E__NOTE(_GS6 ), \
E__NOTE(_A6 ), \
S__NOTE(_REST), \
ED_NOTE(_E7 ), \
S__NOTE(_REST), \
ED_NOTE(_GS7 ),
#define DVORAK_SOUND \
E__NOTE(_GS6 ), \
E__NOTE(_A6 ), \
S__NOTE(_REST), \
E__NOTE(_E7 ), \
S__NOTE(_REST), \
E__NOTE(_FS7 ), \
S__NOTE(_REST), \
E__NOTE(_E7 ),
#define MUSIC_SCALE_SOUND \
E__NOTE(_A5 ), \
E__NOTE(_B5 ), \
E__NOTE(_CS6), \
E__NOTE(_D6 ), \
E__NOTE(_E6 ), \
E__NOTE(_FS6), \
E__NOTE(_GS6), \
E__NOTE(_A6 ),
#define CAPS_LOCK_ON_SOUND \
E__NOTE(_A3), \
E__NOTE(_B3),
#define CAPS_LOCK_OFF_SOUND \
E__NOTE(_B3), \
E__NOTE(_A3),
#define SCROLL_LOCK_ON_SOUND \
E__NOTE(_D4), \
E__NOTE(_E4),
#define SCROLL_LOCK_OFF_SOUND \
E__NOTE(_E4), \
E__NOTE(_D4),
#define NUM_LOCK_ON_SOUND \
E__NOTE(_D5), \
E__NOTE(_E5),
#define NUM_LOCK_OFF_SOUND \
E__NOTE(_E5), \
E__NOTE(_D5),
#endif #endif

@ -0,0 +1,108 @@
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#define VIBRATO_LUT_LENGTH 100
const float VIBRATO_LUT[VIBRATO_LUT_LENGTH] = { \
1.00045346811453,
1.00090535101508,
1.00135386178926,
1.00179722447259,
1.00223368114872,
1.0026614990145,
1.00307897737994,
1.00348445457284,
1.00387631471807,
1.00425299436105,
1.00461298890553,
1.00495485883603,
1.00527723569589,
1.00557882779254,
1.00585842560279,
1.00611490685176,
1.00634724124066,
1.00655449479987,
1.00673583384565,
1.00689052852052,
1.00701795589922,
1.00711760264454,
1.0071890671992,
1.00723206150266,
1.0072464122237,
1.00723206150266,
1.0071890671992,
1.00711760264454,
1.00701795589922,
1.00689052852052,
1.00673583384565,
1.00655449479987,
1.00634724124066,
1.00611490685176,
1.00585842560279,
1.00557882779254,
1.00527723569589,
1.00495485883603,
1.00461298890553,
1.00425299436105,
1.00387631471807,
1.00348445457284,
1.00307897737994,
1.0026614990145,
1.00223368114872,
1.00179722447259,
1.00135386178926,
1.00090535101508,
1.00045346811453,
1,
0.999546737425598,
0.999095467903976,
0.998647968674285,
0.998205999748565,
0.99777129706302,
0.997345565759612,
0.996930473622346,
0.996527644691494,
0.996138653077835,
0.99576501699778,
0.995408193048995,
0.995069570744927,
0.994750467325326,
0.994452122858643,
0.994175695650927,
0.993922257974591,
0.99369279212925,
0.993488186845591,
0.993309234042139,
0.993156625943589,
0.993030952568311,
0.99293269959154,
0.992862246589715,
0.992819865670409,
0.992805720491269,
0.992819865670409,
0.992862246589715,
0.99293269959154,
0.993030952568311,
0.993156625943589,
0.993309234042139,
0.993488186845591,
0.99369279212925,
0.993922257974591,
0.994175695650927,
0.994452122858643,
0.994750467325326,
0.995069570744927,
0.995408193048995,
0.99576501699778,
0.996138653077835,
0.996527644691494,
0.996930473622346,
0.997345565759612,
0.99777129706302,
0.998205999748565,
0.998647968674285,
0.999095467903976,
0.999546737425598,
1
};

@ -9,10 +9,16 @@
#include "suspend.h" #include "suspend.h"
#include "timer.h" #include "timer.h"
#include "led.h" #include "led.h"
#ifdef PROTOCOL_LUFA #ifdef PROTOCOL_LUFA
#include "lufa.h" #include "lufa.h"
#endif #endif
#ifdef AUDIO_ENABLE
#include "audio.h"
#endif /* AUDIO_ENABLE */
#define wdt_intr_enable(value) \ #define wdt_intr_enable(value) \
__asm__ __volatile__ ( \ __asm__ __volatile__ ( \
@ -72,6 +78,10 @@ static void power_down(uint8_t wdto)
// Turn off LED indicators // Turn off LED indicators
led_set(0); led_set(0);
#ifdef AUDIO_ENABLE
stop_all_notes();
#endif /* AUDIO_ENABLE */
// TODO: more power saving // TODO: more power saving
// See PicoPower application note // See PicoPower application note
// - I/O port input with pullup // - I/O port input with pullup

@ -49,6 +49,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
# include "usbdrv.h" # include "usbdrv.h"
#endif #endif
#ifdef AUDIO_ENABLE
#include "audio.h"
#endif /* AUDIO_ENABLE */
static bool command_common(uint8_t code); static bool command_common(uint8_t code);
static void command_common_help(void); static void command_common_help(void);
@ -352,6 +356,9 @@ static bool command_common(uint8_t code)
case MAGIC_KC(MAGIC_KEY_BOOTLOADER): case MAGIC_KC(MAGIC_KEY_BOOTLOADER):
clear_keyboard(); // clear to prevent stuck keys clear_keyboard(); // clear to prevent stuck keys
print("\n\nJumping to bootloader... "); print("\n\nJumping to bootloader... ");
#ifdef AUDIO_ENABLE
play_goodbye_tone();
#endif
_delay_ms(1000); _delay_ms(1000);
bootloader_jump(); // not return bootloader_jump(); // not return
break; break;

Loading…
Cancel
Save