Merge branch 'master' of https://github.com/jackhumbert/qmk_firmware
@ -0,0 +1,161 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2012 Jun Wako <wakojun@gmail.com>
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CONFIG_H
|
||||||
|
#define CONFIG_H
|
||||||
|
|
||||||
|
#include "config_common.h"
|
||||||
|
|
||||||
|
/* USB Device descriptor parameter */
|
||||||
|
#define VENDOR_ID 0xFEED
|
||||||
|
#define PRODUCT_ID 0x6060
|
||||||
|
#define DEVICE_VER 0x0001
|
||||||
|
#define MANUFACTURER Ortholinear Keyboards
|
||||||
|
#define PRODUCT The Atomic Keyboard
|
||||||
|
#define DESCRIPTION A compact ortholinear keyboard
|
||||||
|
|
||||||
|
/* key matrix size */
|
||||||
|
#define MATRIX_ROWS 5
|
||||||
|
#define MATRIX_COLS 15
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Keyboard Matrix Assignments
|
||||||
|
*
|
||||||
|
* Change this to how you wired your keyboard
|
||||||
|
* COLS: AVR pins used for columns, left to right
|
||||||
|
* ROWS: AVR pins used for rows, top to bottom
|
||||||
|
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = 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 ROWS (int []){ D0, D5, B5, B6, B3 }
|
||||||
|
|
||||||
|
/* COL2ROW or ROW2COL */
|
||||||
|
#define DIODE_DIRECTION COL2ROW
|
||||||
|
|
||||||
|
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
|
||||||
|
#define DEBOUNCE 5
|
||||||
|
|
||||||
|
/* define if matrix has ghost (lacks anti-ghosting diodes) */
|
||||||
|
//#define MATRIX_HAS_GHOST
|
||||||
|
|
||||||
|
/* number of backlight levels */
|
||||||
|
#define BACKLIGHT_LEVELS 3
|
||||||
|
|
||||||
|
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
|
||||||
|
#define LOCKING_SUPPORT_ENABLE
|
||||||
|
/* Locking resynchronize hack */
|
||||||
|
#define LOCKING_RESYNC_ENABLE
|
||||||
|
|
||||||
|
// Enable Keyboard Locking via magic key
|
||||||
|
#define KEYBOARD_LOCK_ENABLE
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Force NKRO
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
* makefile for this to work.)
|
||||||
|
*
|
||||||
|
* If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
|
||||||
|
* until the next keyboard reset.
|
||||||
|
*
|
||||||
|
* NKRO may prevent your keystrokes from being detected in the BIOS, but it is
|
||||||
|
* fully operational during normal computer usage.
|
||||||
|
*
|
||||||
|
* For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
|
||||||
|
* or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
|
||||||
|
* bootmagic, NKRO mode will always be enabled until it is toggled again during a
|
||||||
|
* power-up.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//#define FORCE_NKRO
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Magic Key Options
|
||||||
|
*
|
||||||
|
* Magic keys are hotkey commands that allow control over firmware functions of
|
||||||
|
* the keyboard. They are best used in combination with the HID Listen program,
|
||||||
|
* found here: https://www.pjrc.com/teensy/hid_listen.html
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* key combination for magic key command */
|
||||||
|
#define IS_COMMAND() ( \
|
||||||
|
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
|
||||||
|
)
|
||||||
|
|
||||||
|
/* control how magic key switches layers */
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
|
||||||
|
|
||||||
|
/* override magic key keymap */
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
|
||||||
|
//#define MAGIC_KEY_HELP1 H
|
||||||
|
//#define MAGIC_KEY_HELP2 SLASH
|
||||||
|
//#define MAGIC_KEY_DEBUG D
|
||||||
|
//#define MAGIC_KEY_DEBUG_MATRIX X
|
||||||
|
//#define MAGIC_KEY_DEBUG_KBD K
|
||||||
|
//#define MAGIC_KEY_DEBUG_MOUSE M
|
||||||
|
//#define MAGIC_KEY_VERSION V
|
||||||
|
//#define MAGIC_KEY_STATUS S
|
||||||
|
//#define MAGIC_KEY_CONSOLE C
|
||||||
|
//#define MAGIC_KEY_LAYER0_ALT1 ESC
|
||||||
|
//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
|
||||||
|
//#define MAGIC_KEY_LAYER0 0
|
||||||
|
//#define MAGIC_KEY_LAYER1 1
|
||||||
|
//#define MAGIC_KEY_LAYER2 2
|
||||||
|
//#define MAGIC_KEY_LAYER3 3
|
||||||
|
//#define MAGIC_KEY_LAYER4 4
|
||||||
|
//#define MAGIC_KEY_LAYER5 5
|
||||||
|
//#define MAGIC_KEY_LAYER6 6
|
||||||
|
//#define MAGIC_KEY_LAYER7 7
|
||||||
|
//#define MAGIC_KEY_LAYER8 8
|
||||||
|
//#define MAGIC_KEY_LAYER9 9
|
||||||
|
#define MAGIC_KEY_BOOTLOADER B
|
||||||
|
//#define MAGIC_KEY_LOCK CAPS
|
||||||
|
//#define MAGIC_KEY_EEPROM E
|
||||||
|
//#define MAGIC_KEY_NKRO N
|
||||||
|
//#define MAGIC_KEY_SLEEP_LED Z
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Feature disable options
|
||||||
|
* These options are also useful to firmware size reduction.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* disable debug print */
|
||||||
|
//#define NO_DEBUG
|
||||||
|
|
||||||
|
/* disable print */
|
||||||
|
//#define NO_PRINT
|
||||||
|
|
||||||
|
/* disable action features */
|
||||||
|
//#define NO_ACTION_LAYER
|
||||||
|
//#define NO_ACTION_TAPPING
|
||||||
|
//#define NO_ACTION_ONESHOT
|
||||||
|
//#define NO_ACTION_MACRO
|
||||||
|
//#define NO_ACTION_FUNCTION
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,517 @@
|
|||||||
|
#include "atomic.h"
|
||||||
|
#include "action_layer.h"
|
||||||
|
#include "eeconfig.h"
|
||||||
|
#include "led.h"
|
||||||
|
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
#include "audio.h"
|
||||||
|
#include "song_list.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define LAYER_QWERTY 0
|
||||||
|
#define LAYER_COLEMAK 1
|
||||||
|
#define LAYER_DVORAK 2
|
||||||
|
#define LAYER_LOWER 3
|
||||||
|
#define LAYER_RAISE 4
|
||||||
|
#define LAYER_FUNCTION 5
|
||||||
|
#define LAYER_MOUSE 6
|
||||||
|
#define LAYER_MUSIC 7
|
||||||
|
#define LAYER_ADJUST 8
|
||||||
|
|
||||||
|
#define MACRO_QWERTY 0
|
||||||
|
#define MACRO_COLEMAK 1
|
||||||
|
#define MACRO_DVORAK 2
|
||||||
|
#define MACRO_LOWER 3
|
||||||
|
#define MACRO_RAISE 4
|
||||||
|
#define MACRO_FUNCTION 5
|
||||||
|
#define MACRO_MOUSE 6
|
||||||
|
#define MACRO_TIMBRE_1 7
|
||||||
|
#define MACRO_TIMBRE_2 8
|
||||||
|
#define MACRO_TIMBRE_3 9
|
||||||
|
#define MACRO_TIMBRE_4 10
|
||||||
|
#define MACRO_TEMPO_U 11
|
||||||
|
#define MACRO_TEMPO_D 12
|
||||||
|
#define MACRO_TONE_DEFAULT 13
|
||||||
|
#define MACRO_MUSIC_ON 14
|
||||||
|
#define MACRO_MUSIC_OFF 15
|
||||||
|
#define MACRO_AUDIO_ON 16
|
||||||
|
#define MACRO_AUDIO_OFF 17
|
||||||
|
#define MACRO_INC_VOICE 18
|
||||||
|
#define MACRO_DEC_VOICE 19
|
||||||
|
|
||||||
|
#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 M_MOUSE M(MACRO_MOUSE)
|
||||||
|
#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 VC_UP M(MACRO_INC_VOICE)
|
||||||
|
#define VC_DOWN M(MACRO_DEC_VOICE)
|
||||||
|
|
||||||
|
|
||||||
|
#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 XXXXXXX KC_NO
|
||||||
|
#define ________________ _______, _______
|
||||||
|
#define XXXXXXXXXXXXXXXX XXXXXXX, XXXXXXX
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
|
||||||
|
/* QWERTY
|
||||||
|
* .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
|
||||||
|
* | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | XXXXXX . BACKSP |
|
||||||
|
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
|
||||||
|
* | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | DEL |
|
||||||
|
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
|
||||||
|
* | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | XXXXXX . ENTER | PG UP |
|
||||||
|
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
|
||||||
|
* | LSHIFT | Z | X | C | V | B | N | M | , | . | / | XXXXXX . RSHIFT | UP | PG DN |
|
||||||
|
* |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
|
||||||
|
* | LCTRL | LWIN | FN | LALT | RAISE | XXXXXX . SPACE | LOWER | RALT | RWIN | MENU | RCTRL | LEFT | DOWN | RIGHT |
|
||||||
|
* '--------------------------------------------------------------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
|
||||||
|
[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, KC_BSPC },
|
||||||
|
{ 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, KC_ENT, 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, KC_RSFT, KC_UP, KC_PGDN },
|
||||||
|
{ KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC, KC_SPC, M_LOWER, KC_RALT, KC_RGUI, KC_MENU, 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 ------------+--------|
|
||||||
|
* | BACKSP | 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 | RAISE | XXXXXX . SPACE | LOWER | RALT | RWIN | MENU | 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_BSPC, 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, KC_SPC, M_LOWER, KC_RALT, KC_RGUI, KC_MENU, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT },
|
||||||
|
},
|
||||||
|
|
||||||
|
/* 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 | RAISE | XXXXXX . SPACE | LOWER | RALT | RWIN | MENU | 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, KC_SPC, M_LOWER, KC_RALT, KC_RGUI, KC_MENU, 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, ________________ },
|
||||||
|
{ _______, _______, _______, _______, SC_CCLS, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS },
|
||||||
|
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, KC_HOME },
|
||||||
|
{ _______, SC_REDO, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, _______, KC_END },
|
||||||
|
{ _______, _______, _______, _______, _______, KC_BSPC, KC_BSPC, _______, _______, _______, _______, _______, _______, _______, _______ },
|
||||||
|
},
|
||||||
|
|
||||||
|
[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, ________________ },
|
||||||
|
{ _______, _______, _______, _______, SC_ACLS, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS },
|
||||||
|
{ _______, SC_SELA, SC_SAVE, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, KC_HOME },
|
||||||
|
{ _______, SC_UNDO, SC_CUT, SC_COPY, SC_PSTE, _______, _______, _______, _______, _______, _______, ________________, _______, KC_END },
|
||||||
|
{ _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, _______, _______, _______ },
|
||||||
|
},
|
||||||
|
|
||||||
|
[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, ________________ },
|
||||||
|
{ 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_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, KC_PSCR },
|
||||||
|
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, KC_VOLU, KC_MUTE },
|
||||||
|
{ _______, _______, _______, _______, _______, KC_MPLY, KC_MPLY, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT },
|
||||||
|
},
|
||||||
|
|
||||||
|
#ifdef MOUSEKEY_ENABLE
|
||||||
|
|
||||||
|
[LAYER_MOUSE] = { /* MOUSE */
|
||||||
|
{ _______, KC_ACL0, KC_ACL1, KC_ACL2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXXXXXXXXXXX },
|
||||||
|
{ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
|
||||||
|
{ XXXXXXX, KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXXXXXXXXXXX, KC_WH_U },
|
||||||
|
{ _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, ________________, KC_MS_U, KC_WH_D },
|
||||||
|
{ _______, _______, _______, _______, _______, KC_BTN1, KC_BTN1, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R },
|
||||||
|
},
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
[LAYER_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, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
|
||||||
|
{ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, M_RAISE, XXXXXXX, XXXXXXX, M_LOWER, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
|
||||||
|
},
|
||||||
|
|
||||||
|
[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, ________________ },
|
||||||
|
{ _______, M_QWRTY, M_COLMK, M_DVORK, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ },
|
||||||
|
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, _______ },
|
||||||
|
{ _______, _______, _______, _______, _______, RESET, _______, M_MOUSE, _______, _______, _______, ________________, VC_UP, _______ },
|
||||||
|
{ _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, _______, VC_DOWN, _______ },
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
[LAYER_EMPTY] = {
|
||||||
|
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________ },
|
||||||
|
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ },
|
||||||
|
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, _______ },
|
||||||
|
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, _______, _______ },
|
||||||
|
{ _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, _______, _______, _______ },
|
||||||
|
},
|
||||||
|
*/
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
|
||||||
|
float tone_my_startup[][2] = SONG(ODE_TO_JOY);
|
||||||
|
float tone_my_goodbye[][2] = SONG(ROCK_A_BYE_BABY);
|
||||||
|
|
||||||
|
float tone_qwerty[][2] = SONG(QWERTY_SOUND);
|
||||||
|
float tone_dvorak[][2] = SONG(DVORAK_SOUND);
|
||||||
|
float tone_colemak[][2] = SONG(COLEMAK_SOUND);
|
||||||
|
|
||||||
|
float tone_audio_on[][2] = SONG(CLOSE_ENCOUNTERS_5_NOTE);
|
||||||
|
float tone_music_on[][2] = SONG(DOE_A_DEER);
|
||||||
|
float tone_caps_on[][2] = SONG(CAPS_LOCK_ON_SOUND);
|
||||||
|
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);
|
||||||
|
float tone_scroll_on[][2] = SONG(SCROLL_LOCK_ON_SOUND);
|
||||||
|
float tone_scroll_off[][2] = SONG(SCROLL_LOCK_OFF_SOUND);
|
||||||
|
float music_scale[][2] = SONG(MUSIC_SCALE_SOUND);
|
||||||
|
|
||||||
|
#endif /* AUDIO_ENABLE */
|
||||||
|
|
||||||
|
void persistant_default_layer_set(uint16_t default_layer)
|
||||||
|
{
|
||||||
|
eeconfig_update_default_layer(default_layer);
|
||||||
|
default_layer_set(default_layer);
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint16_t PROGMEM fn_actions[] = {
|
||||||
|
};
|
||||||
|
|
||||||
|
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
||||||
|
{
|
||||||
|
|
||||||
|
// MACRODOWN only works in this function
|
||||||
|
switch(id)
|
||||||
|
{
|
||||||
|
|
||||||
|
case MACRO_QWERTY:
|
||||||
|
if (record->event.pressed)
|
||||||
|
{
|
||||||
|
persistant_default_layer_set(1UL<<LAYER_QWERTY);
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
PLAY_NOTE_ARRAY(tone_qwerty, false, STACCATO);
|
||||||
|
#endif /* AUDIO_ENABLE */
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MACRO_COLEMAK:
|
||||||
|
if (record->event.pressed)
|
||||||
|
{
|
||||||
|
persistant_default_layer_set(1UL<<LAYER_COLEMAK);
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
PLAY_NOTE_ARRAY(tone_colemak, false, STACCATO);
|
||||||
|
#endif /* AUDIO_ENABLE */
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MACRO_DVORAK:
|
||||||
|
if (record->event.pressed)
|
||||||
|
{
|
||||||
|
persistant_default_layer_set(1UL<<LAYER_DVORAK);
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
PLAY_NOTE_ARRAY(tone_dvorak, false, STACCATO);
|
||||||
|
#endif /* AUDIO_ENABLE */
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MACRO_LOWER:
|
||||||
|
if (record->event.pressed)
|
||||||
|
{
|
||||||
|
layer_on(LAYER_LOWER);
|
||||||
|
update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
layer_off(LAYER_LOWER);
|
||||||
|
update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MACRO_RAISE:
|
||||||
|
if (record->event.pressed)
|
||||||
|
{
|
||||||
|
layer_on(LAYER_RAISE);
|
||||||
|
update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
layer_off(LAYER_RAISE);
|
||||||
|
update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MACRO_FUNCTION:
|
||||||
|
if (record->event.pressed)
|
||||||
|
{
|
||||||
|
layer_on(LAYER_FUNCTION);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
layer_off(LAYER_FUNCTION);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
#ifdef MOUSEKEY_ENABLE
|
||||||
|
|
||||||
|
case MACRO_MOUSE:
|
||||||
|
if (record->event.pressed)
|
||||||
|
{
|
||||||
|
layer_invert(LAYER_MOUSE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
#endif /* MOUSEKEY_ENABLE */
|
||||||
|
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
|
||||||
|
case MACRO_TIMBRE_1:
|
||||||
|
if (record->event.pressed) set_timbre(TIMBRE_12);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MACRO_TIMBRE_2:
|
||||||
|
if (record->event.pressed) set_timbre(TIMBRE_25);
|
||||||
|
break;
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
case MACRO_INC_VOICE:
|
||||||
|
if (record->event.pressed)
|
||||||
|
{
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
voice_iterate();
|
||||||
|
PLAY_NOTE_ARRAY(music_scale, false, STACCATO);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MACRO_DEC_VOICE:
|
||||||
|
if (record->event.pressed)
|
||||||
|
{
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
voice_deiterate();
|
||||||
|
PLAY_NOTE_ARRAY(music_scale, false, STACCATO);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
#endif /* AUDIO_ENABLE */
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
return MACRO_NONE;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
|
||||||
|
|
||||||
|
void process_action_user(keyrecord_t *record)
|
||||||
|
{
|
||||||
|
|
||||||
|
uint8_t starting_note = 0x0C;
|
||||||
|
int offset = 7;
|
||||||
|
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
set_voice(default_voice);
|
||||||
|
play_startup_tone();
|
||||||
|
println("Matrix Init");
|
||||||
|
}
|
||||||
|
|
||||||
|
void led_set_user(uint8_t usb_led)
|
||||||
|
{
|
||||||
|
static uint8_t old_usb_led = 0;
|
||||||
|
|
||||||
|
_delay_ms(10); // gets rid of tick
|
||||||
|
|
||||||
|
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()
|
||||||
|
{
|
||||||
|
_delay_ms(10); // gets rid of tick
|
||||||
|
PLAY_NOTE_ARRAY(tone_my_startup, false, STACCATO);
|
||||||
|
}
|
||||||
|
|
||||||
|
void play_goodbye_tone()
|
||||||
|
{
|
||||||
|
PLAY_NOTE_ARRAY(tone_my_goodbye, false, STACCATO);
|
||||||
|
_delay_ms(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* AUDIO_ENABLE */
|
@ -0,0 +1,17 @@
|
|||||||
|
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
|
||||||
|
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
|
||||||
|
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
||||||
|
CONSOLE_ENABLE = no # Console for debug(+400)
|
||||||
|
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
|
||||||
|
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
|
||||||
|
MIDI_ENABLE = no # MIDI controls
|
||||||
|
AUDIO_ENABLE = yes # Audio output on port C6
|
||||||
|
UNICODE_ENABLE = no # Unicode
|
||||||
|
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
|
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
|
||||||
|
|
||||||
|
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||||
|
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||||
|
|
||||||
|
CONFIG_H = keymaps/$(KEYMAP)/config.h
|
@ -0,0 +1,136 @@
|
|||||||
|
#----------------------------------------------------------------------------
|
||||||
|
# On command line:
|
||||||
|
#
|
||||||
|
# make all = Make software.
|
||||||
|
#
|
||||||
|
# make clean = Clean out built project files.
|
||||||
|
#
|
||||||
|
# make coff = Convert ELF to AVR COFF.
|
||||||
|
#
|
||||||
|
# make extcoff = Convert ELF to AVR Extended COFF.
|
||||||
|
#
|
||||||
|
# make program = Download the hex file to the device.
|
||||||
|
# Please customize your programmer settings(PROGRAM_CMD)
|
||||||
|
#
|
||||||
|
# make teensy = Download the hex file to the device, using teensy_loader_cli.
|
||||||
|
# (must have teensy_loader_cli installed).
|
||||||
|
#
|
||||||
|
# make dfu = Download the hex file to the device, using dfu-programmer (must
|
||||||
|
# have dfu-programmer installed).
|
||||||
|
#
|
||||||
|
# make flip = Download the hex file to the device, using Atmel FLIP (must
|
||||||
|
# have Atmel FLIP installed).
|
||||||
|
#
|
||||||
|
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
|
||||||
|
# (must have dfu-programmer installed).
|
||||||
|
#
|
||||||
|
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
|
||||||
|
# (must have Atmel FLIP installed).
|
||||||
|
#
|
||||||
|
# make debug = Start either simulavr or avarice as specified for debugging,
|
||||||
|
# with avr-gdb or avr-insight as the front end for debugging.
|
||||||
|
#
|
||||||
|
# make filename.s = Just compile filename.c into the assembler code only.
|
||||||
|
#
|
||||||
|
# make filename.i = Create a preprocessed source file for use in submitting
|
||||||
|
# bug reports to the GCC project.
|
||||||
|
#
|
||||||
|
# To rebuild project do "make clean" then "make all".
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Target file name (without extension).
|
||||||
|
TARGET = clueboard1
|
||||||
|
|
||||||
|
|
||||||
|
# Directory common source filess exist
|
||||||
|
TOP_DIR = ../..
|
||||||
|
TMK_DIR = ../../tmk_core
|
||||||
|
|
||||||
|
# Directory keyboard dependent files exist
|
||||||
|
TARGET_DIR = .
|
||||||
|
|
||||||
|
# # project specific files
|
||||||
|
SRC = clueboard1.c \
|
||||||
|
led.c
|
||||||
|
|
||||||
|
ifdef KEYMAP
|
||||||
|
SRC := keymaps/keymap_$(KEYMAP).c $(SRC)
|
||||||
|
else
|
||||||
|
SRC := keymaps/keymap_default.c $(SRC)
|
||||||
|
endif
|
||||||
|
|
||||||
|
CONFIG_H = config.h
|
||||||
|
|
||||||
|
# MCU name
|
||||||
|
MCU = atmega32u4
|
||||||
|
|
||||||
|
# Processor frequency.
|
||||||
|
# This will define a symbol, F_CPU, in all source code files equal to the
|
||||||
|
# processor frequency in Hz. You can then use this symbol in your source code to
|
||||||
|
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
|
||||||
|
# automatically to create a 32-bit value in your source code.
|
||||||
|
#
|
||||||
|
# This will be an integer division of F_USB below, as it is sourced by
|
||||||
|
# F_USB after it has run through any CPU prescalers. Note that this value
|
||||||
|
# does not *change* the processor frequency - it should merely be updated to
|
||||||
|
# reflect the processor speed set externally so that the code can use accurate
|
||||||
|
# software delays.
|
||||||
|
F_CPU = 16000000
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# LUFA specific
|
||||||
|
#
|
||||||
|
# Target architecture (see library "Board Types" documentation).
|
||||||
|
ARCH = AVR8
|
||||||
|
|
||||||
|
# Input clock frequency.
|
||||||
|
# This will define a symbol, F_USB, in all source code files equal to the
|
||||||
|
# input clock frequency (before any prescaling is performed) in Hz. This value may
|
||||||
|
# differ from F_CPU if prescaling is used on the latter, and is required as the
|
||||||
|
# raw input clock is fed directly to the PLL sections of the AVR for high speed
|
||||||
|
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
|
||||||
|
# at the end, this will be done automatically to create a 32-bit value in your
|
||||||
|
# source code.
|
||||||
|
#
|
||||||
|
# If no clock division is performed on the input clock inside the AVR (via the
|
||||||
|
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
|
||||||
|
F_USB = $(F_CPU)
|
||||||
|
|
||||||
|
# Interrupt driven control endpoint task(+60)
|
||||||
|
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
|
||||||
|
|
||||||
|
|
||||||
|
# Boot Section Size in *bytes*
|
||||||
|
# Teensy halfKay 512
|
||||||
|
# Teensy++ halfKay 1024
|
||||||
|
# Atmel DFU loader 4096
|
||||||
|
# LUFA bootloader 4096
|
||||||
|
# USBaspLoader 2048
|
||||||
|
OPT_DEFS += -DBOOTLOADER_SIZE=4096
|
||||||
|
|
||||||
|
|
||||||
|
# Build Options
|
||||||
|
# comment out to disable the options.
|
||||||
|
#
|
||||||
|
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
|
||||||
|
# MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
|
||||||
|
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
||||||
|
CONSOLE_ENABLE = yes # Console for debug(+400)
|
||||||
|
COMMAND_ENABLE = yes # Commands for debug and configuration
|
||||||
|
NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||||
|
# RGBLIGHT_ENABLE = yes # Enable keyboard underlight functionality
|
||||||
|
# MIDI_ENABLE = YES # MIDI controls
|
||||||
|
# UNICODE_ENABLE = YES # Unicode
|
||||||
|
# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
|
|
||||||
|
|
||||||
|
# Optimize size but this may cause error "relocation truncated to fit"
|
||||||
|
#EXTRALDFLAGS = -Wl,--relax
|
||||||
|
|
||||||
|
# Search Path
|
||||||
|
VPATH += $(TARGET_DIR)
|
||||||
|
VPATH += $(TOP_DIR)
|
||||||
|
VPATH += $(TMK_DIR)
|
||||||
|
|
||||||
|
include $(TOP_DIR)/quantum/quantum.mk
|
@ -0,0 +1,23 @@
|
|||||||
|
#include "clueboard1.h"
|
||||||
|
|
||||||
|
__attribute__ ((weak))
|
||||||
|
void matrix_init_user(void) {
|
||||||
|
// leave these blank
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__ ((weak))
|
||||||
|
void matrix_scan_user(void) {
|
||||||
|
// leave these blank
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_init_kb(void) {
|
||||||
|
#ifdef RGBLIGHT_ENABLE
|
||||||
|
rgblight_init();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
matrix_init_user();
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_scan_kb(void) {
|
||||||
|
matrix_scan_user();
|
||||||
|
}
|
@ -0,0 +1,52 @@
|
|||||||
|
#ifndef CLUEBOARD1_H
|
||||||
|
#define CLUEBOARD1_H
|
||||||
|
|
||||||
|
#include "matrix.h"
|
||||||
|
#include "keymap_common.h"
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* Clueboard matrix layout
|
||||||
|
* ,-----------------------------------------------------------. ,---.
|
||||||
|
* | 00| 01| 02| 03| 04| 05| 06| 07| 08| 09| 0A| 0B| 0C| 0D| 0E| | 0F|
|
||||||
|
* |-----------------------------------------------------------| |---|
|
||||||
|
* | 10| 11| 12| 13| 14| 15| 16| 17| 18| 19| 1A| 1B| 1C| 1D| | 1F|
|
||||||
|
* |-----------------------------------------------------------| `---'
|
||||||
|
* | 20| 21| 22| 23| 24| 25| 26| 27| 28| 29| 2A| 2B| 2C| 2D|
|
||||||
|
* |------------------------------------------------------------.
|
||||||
|
* | 30| 31| 32| 33| 34| 35| 36| 37| 38| 39| 3A| 3B| 3C| 3D|3E|
|
||||||
|
* |------------------------------------------------------------------.
|
||||||
|
* | 40| 41| 42| 43| 45| 46| 49| 4A| 4B| 4C| 4D| 4E| 4F|
|
||||||
|
* `------------------------------------------------------------------'
|
||||||
|
* ,-----------------------------------------------------------. ,---.
|
||||||
|
* | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Yen| BS| |Ins|
|
||||||
|
* |-----------------------------------------------------------| |---|
|
||||||
|
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|
|
||||||
|
* |-----------------------------------------------------------| `---'
|
||||||
|
* |Caps | A| S| D| F| G| H| J| k| L| ;| '| # | Ent|
|
||||||
|
* |--------------------------------------------------------------.
|
||||||
|
* |Shift| \| Z| X| C| V| B| N| M| ,| .| /| \|Shift| Up|
|
||||||
|
* |------------------------------------------------------------------.
|
||||||
|
* |Ctrl|Alt|Gui |MHen| Space| Space|Henk|Gui |Ctrl| Fn|Left|Down|Rgt|
|
||||||
|
* `------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
// The first section contains all of the arguements
|
||||||
|
// The second converts the arguments into a two-dimensional array
|
||||||
|
#define KEYMAP( \
|
||||||
|
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, k0F, \
|
||||||
|
k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1F, \
|
||||||
|
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, \
|
||||||
|
k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, k3D, k3E, \
|
||||||
|
k40, k41, k42, k43, k45, k46, k49, k4A, k4B, k4C, k4D, k4E, k4F \
|
||||||
|
) { \
|
||||||
|
{ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, k0F }, \
|
||||||
|
{ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, KC_NO, k1F }, \
|
||||||
|
{ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D }, \
|
||||||
|
{ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, k3D, k3E }, \
|
||||||
|
{ k40, k41, k42, k43, KC_NO, k45, k46, KC_NO, KC_NO, k49, k4A, k4B, k4C, k4D, k4E, k4F } \
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_init_user(void);
|
||||||
|
void matrix_scan_user(void);
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,96 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2012 Jun Wako <wakojun@gmail.com>
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CONFIG_H
|
||||||
|
#define CONFIG_H
|
||||||
|
|
||||||
|
#include "config_common.h"
|
||||||
|
|
||||||
|
/* USB Device descriptor parameter */
|
||||||
|
#define VENDOR_ID 0xC1ED
|
||||||
|
#define PRODUCT_ID 0x2301
|
||||||
|
#define DEVICE_VER 0x0003
|
||||||
|
#define MANUFACTURER Clueboard
|
||||||
|
#define PRODUCT Clueboard
|
||||||
|
#define DESCRIPTION QMK keyboard firmware for Clueboard
|
||||||
|
|
||||||
|
/* key matrix size */
|
||||||
|
#define MATRIX_ROWS 5
|
||||||
|
#define MATRIX_COLS 16
|
||||||
|
|
||||||
|
// COLS: Left to right, ROWS: Top to bottom
|
||||||
|
|
||||||
|
/* Column pin configuration
|
||||||
|
* col: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
||||||
|
* pin: B3 F1 F4 F5 F6 C7 C6 B6 B5 B4 D7 D6 D4 F7 B0 B1
|
||||||
|
*/
|
||||||
|
#define COLS (int []){ B3, F1, F4, F5, F6, C7, C6, B6, B5, B4, D7, D6, D4, F7, B0, B1 }
|
||||||
|
|
||||||
|
/* Row pin configuration
|
||||||
|
* row: 0 1 2 3 4
|
||||||
|
* pin: D1 D0 D2 D5 D3
|
||||||
|
*/
|
||||||
|
#define ROWS (int []){ D1, D0, D2, D5, D3 }
|
||||||
|
|
||||||
|
/* COL2ROW or ROW2COL */
|
||||||
|
#define DIODE_DIRECTION COL2ROW
|
||||||
|
|
||||||
|
/* define if matrix has ghost */
|
||||||
|
//#define MATRIX_HAS_GHOST
|
||||||
|
|
||||||
|
/* Set 0 if debouncing isn't needed */
|
||||||
|
#define DEBOUNCE 5
|
||||||
|
|
||||||
|
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
|
||||||
|
#define LOCKING_SUPPORT_ENABLE
|
||||||
|
/* Locking resynchronize hack */
|
||||||
|
#define LOCKING_RESYNC_ENABLE
|
||||||
|
|
||||||
|
/* key combination for command */
|
||||||
|
#define IS_COMMAND() ( \
|
||||||
|
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
|
||||||
|
)
|
||||||
|
|
||||||
|
/* Underlight configuration
|
||||||
|
*/
|
||||||
|
#define ws2812_PORTREG PORTB
|
||||||
|
#define ws2812_DDRREG DDRB
|
||||||
|
#define ws2812_pin 2
|
||||||
|
#define RGBLED_NUM 14 // Number of LEDs
|
||||||
|
#define RGBLIGHT_HUE_STEP 10
|
||||||
|
#define RGBLIGHT_SAT_STEP 17
|
||||||
|
#define RGBLIGHT_VAL_STEP 17
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Feature disable options
|
||||||
|
* These options are also useful to firmware size reduction.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* disable debug print */
|
||||||
|
//#define NO_DEBUG
|
||||||
|
|
||||||
|
/* disable print */
|
||||||
|
//#define NO_PRINT
|
||||||
|
|
||||||
|
/* disable action features */
|
||||||
|
//#define NO_ACTION_LAYER
|
||||||
|
//#define NO_ACTION_TAPPING
|
||||||
|
//#define NO_ACTION_ONESHOT
|
||||||
|
//#define NO_ACTION_MACRO
|
||||||
|
//#define NO_ACTION_FUNCTION
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,184 @@
|
|||||||
|
#include "clueboard1.h"
|
||||||
|
|
||||||
|
#ifdef RGBLIGHT_ENABLE
|
||||||
|
#include "rgblight.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Used for SHIFT_ESC
|
||||||
|
#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
|
||||||
|
|
||||||
|
// 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.
|
||||||
|
// Layer names don't all need to be of the same length, obviously, and you can also skip them
|
||||||
|
// entirely and just use numbers.
|
||||||
|
#define _BL 0
|
||||||
|
#define _FL 1
|
||||||
|
#define _RS 2
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
/* Keymap _BL: (Base Layer) Default Layer
|
||||||
|
* ,--------------------------------------------------------------------------. ,----.
|
||||||
|
* |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| BS| |PGUP|
|
||||||
|
* |--------------------------------------------------------------------------| |----|
|
||||||
|
* | Tab| Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |PGDN|
|
||||||
|
* |--------------------------------------------------------------------------| `----'
|
||||||
|
* |Capslck| A| S| D| F| G| H| J| K| L| ;| '| # | Ent|
|
||||||
|
* |-----------------------------------------------------------------------------.
|
||||||
|
* |Shift| BS| Z| X| C| V| B| N| M| ,| .| /| BS|Shift| UP|
|
||||||
|
* |------------------------------------------------------------------------|----|----.
|
||||||
|
* | Ctrl| Gui| Alt| MHen| Space| Space| Hen| Alt| Ctrl| _FL|LEFT|DOWN|RGHT|
|
||||||
|
* `----------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[_BL] = KEYMAP(
|
||||||
|
F(0), 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_GRV, KC_BSPC, KC_PGUP, \
|
||||||
|
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_PGDN, \
|
||||||
|
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_NUHS, KC_ENT, \
|
||||||
|
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, \
|
||||||
|
KC_LCTL, KC_LGUI, KC_LALT, KC_MHEN, KC_SPC,KC_SPC, KC_HENK, KC_RALT, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT),
|
||||||
|
|
||||||
|
/* Keymap _FL: Function Layer
|
||||||
|
* ,--------------------------------------------------------------------------. ,----.
|
||||||
|
* | `| F1| F2| F3| F4| F5| F6| F7| F8| F9| F10| F11| F12| | Del| |BLIN|
|
||||||
|
* |--------------------------------------------------------------------------| |----|
|
||||||
|
* | | | | | | | | |PScr|SLck|Paus| | | | |BLDE|
|
||||||
|
* |--------------------------------------------------------------------------| `----'
|
||||||
|
* | | | _RS| | | | | | | | | | | |
|
||||||
|
* |-----------------------------------------------------------------------------.
|
||||||
|
* | | | | | | | | | | | | | | |PGUP|
|
||||||
|
* |------------------------------------------------------------------------|----|----.
|
||||||
|
* | | | | | | | | | | _FL|HOME|PGDN| END|
|
||||||
|
* `----------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[_FL] = KEYMAP(
|
||||||
|
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, KC_TRNS, KC_DEL, BL_STEP, \
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, \
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), KC_HOME, KC_PGDN, KC_END),
|
||||||
|
|
||||||
|
/* Keymap _RS: Reset layer
|
||||||
|
* ,--------------------------------------------------------------------------. ,----.
|
||||||
|
* | | | | | | | | | | | | | | | | | |
|
||||||
|
* |--------------------------------------------------------------------------| |----|
|
||||||
|
* | | | | |RESET| | | | | | | | | | | |
|
||||||
|
* |--------------------------------------------------------------------------| `----'
|
||||||
|
* | | | _RS| | | | | | | | | | | |
|
||||||
|
* |-----------------------------------------------------------------------------.
|
||||||
|
* | | | | | | | | | | | | | | | |
|
||||||
|
* |------------------------------------------------------------------------|----|----.
|
||||||
|
* | | | | | | | | | | _FL| | | |
|
||||||
|
* `----------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[_RS] = KEYMAP(
|
||||||
|
#ifdef RGBLIGHT_ENABLE
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(1), F(7), \
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(8), \
|
||||||
|
KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||||
|
MO(_FL), KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), F(5), \
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, F(2), F(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(4), F(6), F(3)),
|
||||||
|
#else
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), KC_TRNS, KC_TRNS, KC_TRNS),
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
enum function_id {
|
||||||
|
SHIFT_ESC,
|
||||||
|
#ifdef RGBLIGHT_ENABLE
|
||||||
|
RGBLED_TOGGLE,
|
||||||
|
RGBLED_STEP_MODE,
|
||||||
|
RGBLED_INCREASE_HUE,
|
||||||
|
RGBLED_DECREASE_HUE,
|
||||||
|
RGBLED_INCREASE_SAT,
|
||||||
|
RGBLED_DECREASE_SAT,
|
||||||
|
RGBLED_INCREASE_VAL,
|
||||||
|
RGBLED_DECREASE_VAL
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t PROGMEM fn_actions[] = {
|
||||||
|
[0] = ACTION_FUNCTION(SHIFT_ESC),
|
||||||
|
#ifdef RGBLIGHT_ENABLE
|
||||||
|
[1] = ACTION_FUNCTION(RGBLED_TOGGLE),
|
||||||
|
[2] = ACTION_FUNCTION(RGBLED_STEP_MODE),
|
||||||
|
[3] = ACTION_FUNCTION(RGBLED_INCREASE_HUE),
|
||||||
|
[4] = ACTION_FUNCTION(RGBLED_DECREASE_HUE),
|
||||||
|
[5] = ACTION_FUNCTION(RGBLED_INCREASE_SAT),
|
||||||
|
[6] = ACTION_FUNCTION(RGBLED_DECREASE_SAT),
|
||||||
|
[7] = ACTION_FUNCTION(RGBLED_INCREASE_VAL),
|
||||||
|
[8] = ACTION_FUNCTION(RGBLED_DECREASE_VAL),
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||||
|
static uint8_t shift_esc_shift_mask;
|
||||||
|
switch (id) {
|
||||||
|
case SHIFT_ESC:
|
||||||
|
shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK;
|
||||||
|
if (record->event.pressed) {
|
||||||
|
if (shift_esc_shift_mask) {
|
||||||
|
add_key(KC_GRV);
|
||||||
|
send_keyboard_report();
|
||||||
|
} else {
|
||||||
|
add_key(KC_ESC);
|
||||||
|
send_keyboard_report();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (shift_esc_shift_mask) {
|
||||||
|
del_key(KC_GRV);
|
||||||
|
send_keyboard_report();
|
||||||
|
} else {
|
||||||
|
del_key(KC_ESC);
|
||||||
|
send_keyboard_report();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//led operations
|
||||||
|
#ifdef RGBLIGHT_ENABLE
|
||||||
|
case RGBLED_TOGGLE:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_toggle();
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case RGBLED_INCREASE_HUE:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_increase_hue();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RGBLED_DECREASE_HUE:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_decrease_hue();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RGBLED_INCREASE_SAT:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_increase_sat();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RGBLED_DECREASE_SAT:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_decrease_sat();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RGBLED_INCREASE_VAL:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_increase_val();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RGBLED_DECREASE_VAL:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_decrease_val();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RGBLED_STEP_MODE:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_step();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2012 Jun Wako <wakojun@gmail.com>
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include "stdint.h"
|
||||||
|
#include "led.h"
|
||||||
|
|
||||||
|
|
||||||
|
void led_set_kb(uint8_t usb_led) {
|
||||||
|
DDRF |= (1<<0);
|
||||||
|
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
|
||||||
|
// Turn capslock on
|
||||||
|
PORTF |= (1<<0);
|
||||||
|
} else {
|
||||||
|
// Turn capslock off
|
||||||
|
PORTF &= ~(1<<0);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,140 @@
|
|||||||
|
#----------------------------------------------------------------------------
|
||||||
|
# On command line:
|
||||||
|
#
|
||||||
|
# make all = Make software.
|
||||||
|
#
|
||||||
|
# make clean = Clean out built project files.
|
||||||
|
#
|
||||||
|
# make coff = Convert ELF to AVR COFF.
|
||||||
|
#
|
||||||
|
# make extcoff = Convert ELF to AVR Extended COFF.
|
||||||
|
#
|
||||||
|
# make program = Download the hex file to the device.
|
||||||
|
# Please customize your programmer settings(PROGRAM_CMD)
|
||||||
|
#
|
||||||
|
# make teensy = Download the hex file to the device, using teensy_loader_cli.
|
||||||
|
# (must have teensy_loader_cli installed).
|
||||||
|
#
|
||||||
|
# make dfu = Download the hex file to the device, using dfu-programmer (must
|
||||||
|
# have dfu-programmer installed).
|
||||||
|
#
|
||||||
|
# make flip = Download the hex file to the device, using Atmel FLIP (must
|
||||||
|
# have Atmel FLIP installed).
|
||||||
|
#
|
||||||
|
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
|
||||||
|
# (must have dfu-programmer installed).
|
||||||
|
#
|
||||||
|
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
|
||||||
|
# (must have Atmel FLIP installed).
|
||||||
|
#
|
||||||
|
# make debug = Start either simulavr or avarice as specified for debugging,
|
||||||
|
# with avr-gdb or avr-insight as the front end for debugging.
|
||||||
|
#
|
||||||
|
# make filename.s = Just compile filename.c into the assembler code only.
|
||||||
|
#
|
||||||
|
# make filename.i = Create a preprocessed source file for use in submitting
|
||||||
|
# bug reports to the GCC project.
|
||||||
|
#
|
||||||
|
# To rebuild project do "make clean" then "make all".
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Target file name (without extension).
|
||||||
|
TARGET = clueboard2
|
||||||
|
|
||||||
|
|
||||||
|
# Directory common source filess exist
|
||||||
|
TOP_DIR = ../..
|
||||||
|
TMK_DIR = ../../tmk_core
|
||||||
|
|
||||||
|
# Directory keyboard dependent files exist
|
||||||
|
TARGET_DIR = .
|
||||||
|
|
||||||
|
# # project specific files
|
||||||
|
SRC = clueboard2.c led.c
|
||||||
|
|
||||||
|
ifdef KEYMAP
|
||||||
|
SRC := keymaps/keymap_$(KEYMAP).c $(SRC)
|
||||||
|
else
|
||||||
|
SRC := keymaps/keymap_default.c $(SRC)
|
||||||
|
endif
|
||||||
|
|
||||||
|
CONFIG_H = config.h
|
||||||
|
|
||||||
|
# MCU name
|
||||||
|
#MCU = at90usb1287
|
||||||
|
MCU = atmega32u4
|
||||||
|
|
||||||
|
# Processor frequency.
|
||||||
|
# This will define a symbol, F_CPU, in all source code files equal to the
|
||||||
|
# processor frequency in Hz. You can then use this symbol in your source code to
|
||||||
|
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
|
||||||
|
# automatically to create a 32-bit value in your source code.
|
||||||
|
#
|
||||||
|
# This will be an integer division of F_USB below, as it is sourced by
|
||||||
|
# F_USB after it has run through any CPU prescalers. Note that this value
|
||||||
|
# does not *change* the processor frequency - it should merely be updated to
|
||||||
|
# reflect the processor speed set externally so that the code can use accurate
|
||||||
|
# software delays.
|
||||||
|
F_CPU = 16000000
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# LUFA specific
|
||||||
|
#
|
||||||
|
# Target architecture (see library "Board Types" documentation).
|
||||||
|
ARCH = AVR8
|
||||||
|
|
||||||
|
# Input clock frequency.
|
||||||
|
# This will define a symbol, F_USB, in all source code files equal to the
|
||||||
|
# input clock frequency (before any prescaling is performed) in Hz. This value may
|
||||||
|
# differ from F_CPU if prescaling is used on the latter, and is required as the
|
||||||
|
# raw input clock is fed directly to the PLL sections of the AVR for high speed
|
||||||
|
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
|
||||||
|
# at the end, this will be done automatically to create a 32-bit value in your
|
||||||
|
# source code.
|
||||||
|
#
|
||||||
|
# If no clock division is performed on the input clock inside the AVR (via the
|
||||||
|
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
|
||||||
|
F_USB = $(F_CPU)
|
||||||
|
|
||||||
|
# Interrupt driven control endpoint task(+60)
|
||||||
|
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
|
||||||
|
|
||||||
|
|
||||||
|
# Boot Section Size in *bytes*
|
||||||
|
# Teensy halfKay 512
|
||||||
|
# Teensy++ halfKay 1024
|
||||||
|
# Atmel DFU loader 4096
|
||||||
|
# LUFA bootloader 4096
|
||||||
|
# USBaspLoader 2048
|
||||||
|
OPT_DEFS += -DBOOTLOADER_SIZE=4096
|
||||||
|
|
||||||
|
|
||||||
|
# Build Options
|
||||||
|
# comment out to disable the options.
|
||||||
|
#
|
||||||
|
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
|
||||||
|
# MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
|
||||||
|
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
||||||
|
CONSOLE_ENABLE = yes # Console for debug(+400)
|
||||||
|
COMMAND_ENABLE = yes # Commands for debug and configuration
|
||||||
|
NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||||
|
RGBLIGHT_ENABLE = yes # Enable keyboard underlight functionality
|
||||||
|
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
|
||||||
|
# MIDI_ENABLE = YES # MIDI controls
|
||||||
|
# UNICODE_ENABLE = YES # Unicode
|
||||||
|
# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
|
|
||||||
|
#ifdef BACKLIGHT_ENABLE
|
||||||
|
SRC := backlight.c $(SRC)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
# Optimize size but this may cause error "relocation truncated to fit"
|
||||||
|
#EXTRALDFLAGS = -Wl,--relax
|
||||||
|
|
||||||
|
# Search Path
|
||||||
|
VPATH += $(TARGET_DIR)
|
||||||
|
VPATH += $(TOP_DIR)
|
||||||
|
VPATH += $(TMK_DIR)
|
||||||
|
|
||||||
|
include $(TOP_DIR)/quantum/quantum.mk
|
@ -0,0 +1,41 @@
|
|||||||
|
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include "backlight.h"
|
||||||
|
#include "print.h"
|
||||||
|
|
||||||
|
/* Clueboard 2.0 LED locations:
|
||||||
|
*
|
||||||
|
* Capslock: B4, pull high to turn on
|
||||||
|
* LCtrl: Shared with Capslock, DO NOT INSTALL LED'S IN BOTH
|
||||||
|
* Page Up: B7, pull high to turn on
|
||||||
|
* Escape: D6, pull high to turn on
|
||||||
|
* Arrows: D4, pull high to turn on
|
||||||
|
*/
|
||||||
|
|
||||||
|
void init_backlight_pin(void) {
|
||||||
|
print("init_backlight_pin()\n");
|
||||||
|
// Set our LED pins as output
|
||||||
|
DDRD |= (1<<6); // Esc
|
||||||
|
DDRB |= (1<<7); // Page Up
|
||||||
|
DDRD |= (1<<4); // Arrows
|
||||||
|
|
||||||
|
// Set our LED pins low
|
||||||
|
PORTD &= ~(1<<6); // Esc
|
||||||
|
PORTB &= ~(1<<7); // Page Up
|
||||||
|
PORTD &= ~(1<<4); // Arrows
|
||||||
|
}
|
||||||
|
|
||||||
|
void backlight_set(uint8_t level) {
|
||||||
|
if ( level == 0 ) {
|
||||||
|
// Turn off light
|
||||||
|
PORTD |= (1<<6); // Esc
|
||||||
|
PORTB |= (1<<7); // Page Up
|
||||||
|
PORTD |= (1<<4); // Arrows
|
||||||
|
} else {
|
||||||
|
// Turn on light
|
||||||
|
PORTD &= ~(1<<6); // Esc
|
||||||
|
PORTB &= ~(1<<7); // Page Up
|
||||||
|
PORTD &= ~(1<<4); // Arrows
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,44 @@
|
|||||||
|
#include "clueboard2.h"
|
||||||
|
|
||||||
|
#ifdef BACKLIGHT_ENABLE
|
||||||
|
#include "backlight.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
__attribute__ ((weak))
|
||||||
|
void matrix_init_user(void) {
|
||||||
|
// leave these blank
|
||||||
|
};
|
||||||
|
|
||||||
|
__attribute__ ((weak))
|
||||||
|
void matrix_scan_user(void) {
|
||||||
|
// leave these blank
|
||||||
|
};
|
||||||
|
|
||||||
|
void matrix_init_kb(void) {
|
||||||
|
// put your keyboard start-up code here
|
||||||
|
// runs once when the firmware starts up
|
||||||
|
if (matrix_init_user) {
|
||||||
|
(*matrix_init_user)();
|
||||||
|
}
|
||||||
|
led_init_ports();
|
||||||
|
|
||||||
|
#ifdef BACKLIGHT_ENABLE
|
||||||
|
init_backlight_pin();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef RGBLIGHT_ENABLE
|
||||||
|
rgblight_init();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// JTAG disable for PORT F. write JTD bit twice within four cycles.
|
||||||
|
MCUCR |= (1<<JTD);
|
||||||
|
MCUCR |= (1<<JTD);
|
||||||
|
};
|
||||||
|
|
||||||
|
void matrix_scan_kb(void) {
|
||||||
|
// put your looping keyboard code here
|
||||||
|
// runs every cycle (a lot)
|
||||||
|
if (matrix_scan_user) {
|
||||||
|
(*matrix_scan_user)();
|
||||||
|
}
|
||||||
|
};
|
@ -0,0 +1,57 @@
|
|||||||
|
#ifndef CLUEBOARD2_H
|
||||||
|
#define CLUEBOARD2_H
|
||||||
|
|
||||||
|
#include "matrix.h"
|
||||||
|
#include "keymap_common.h"
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* Clueboard matrix layout
|
||||||
|
* ,-----------------------------------------------------------. ,---.
|
||||||
|
* | 00| 01| 02| 03| 04| 05| 06| 07| 50| 51| 52| 53| 54| 55| 56| | 57|
|
||||||
|
* |-----------------------------------------------------------| |---|
|
||||||
|
* | 10| 11| 12| 13| 14| 15| 16| 17| 60| 61| 62| 63| 64| 65| | 67|
|
||||||
|
* |-----------------------------------------------------------| `---'
|
||||||
|
* | 20| 21| 22| 23| 24| 25| 26| 27| 70| 71| 72| 73| 74| 75|
|
||||||
|
* |------------------------------------------------------------.
|
||||||
|
* | 30| 31| 32| 33| 34| 35| 36| 37| 80| 81| 82| 83| 84| 85|86|
|
||||||
|
* |------------------------------------------------------------------.
|
||||||
|
* | 40| 41| 42| 43| 45| 46| 90| 91| 92| 93| 94| 95| 96|
|
||||||
|
* `------------------------------------------------------------------'
|
||||||
|
* ,-----------------------------------------------------------. ,---.
|
||||||
|
* | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Yen| BS| |Ins|
|
||||||
|
* |-----------------------------------------------------------| |---|
|
||||||
|
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|
|
||||||
|
* |-----------------------------------------------------------| `---'
|
||||||
|
* |Caps | A| S| D| F| G| H| J| k| L| ;| '| # | Ent|
|
||||||
|
* |--------------------------------------------------------------.
|
||||||
|
* |Shift| \| Z| X| C| V| B| N| M| ,| .| /| \|Shift| Up|
|
||||||
|
* |------------------------------------------------------------------.
|
||||||
|
* |Ctrl|Alt|Gui |MHen| Space| Space|Henk|Gui |Ctrl| Fn|Left|Down|Rgt|
|
||||||
|
* `------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
// The first section contains all of the arguments
|
||||||
|
// The second converts the arguments into a two-dimensional array
|
||||||
|
#define KEYMAP( \
|
||||||
|
k00, k01, k02, k03, k04, k05, k06, k07, k50, k51, k52, k53, k54, k55, k56, k57, \
|
||||||
|
k10, k11, k12, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64, k65, k67, \
|
||||||
|
k20, k21, k22, k23, k24, k25, k26, k27, k70, k71, k72, k73, k74, k75, \
|
||||||
|
k30, k31, k32, k33, k34, k35, k36, k37, k80, k81, k82, k83, k84, k85, k86, \
|
||||||
|
k40, k41, k42, k43, k45, k46, k90, k92, k93, k94, k95, k96, k97 \
|
||||||
|
) { \
|
||||||
|
{ k00, k01, k02, k03, k04, k05, k06, k07 }, \
|
||||||
|
{ k10, k11, k12, k13, k14, k15, k16, k17 }, \
|
||||||
|
{ k20, k21, k22, k23, k24, k25, k26, k27 }, \
|
||||||
|
{ k30, k31, k32, k33, k34, k35, k36, k37 }, \
|
||||||
|
{ k40, k41, k42, k43, KC_NO, k45, k46, KC_NO }, \
|
||||||
|
{ k50, k51, k52, k53, k54, k55, k56, k57 }, \
|
||||||
|
{ k60, k61, k62, k63, k64, k65, KC_NO, k67 }, \
|
||||||
|
{ k70, k71, k72, k73, k74, k75, KC_NO, KC_NO }, \
|
||||||
|
{ k80, k81, k82, k83, k84, k85, k86, KC_NO }, \
|
||||||
|
{ k90, KC_NO, k92, k93, k94, k95, k96, k97 } \
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_init_user(void);
|
||||||
|
void matrix_scan_user(void);
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,100 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2012 Jun Wako <wakojun@gmail.com>
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CONFIG_H
|
||||||
|
#define CONFIG_H
|
||||||
|
|
||||||
|
#include "config_common.h"
|
||||||
|
|
||||||
|
/* USB Device descriptor parameter */
|
||||||
|
#define VENDOR_ID 0xC1ED
|
||||||
|
#define PRODUCT_ID 0x2320
|
||||||
|
#define DEVICE_VER 0x0001
|
||||||
|
#define MANUFACTURER Clueboard
|
||||||
|
#define PRODUCT Clueboard with RGB Underlighting
|
||||||
|
#define DESCRIPTION QMK keyboard firmware for Clueboard
|
||||||
|
|
||||||
|
/* key matrix size */
|
||||||
|
#define MATRIX_ROWS 10
|
||||||
|
#define MATRIX_COLS 8
|
||||||
|
|
||||||
|
// COLS: Left to right, ROWS: Top to bottom
|
||||||
|
|
||||||
|
/* Column pin configuration
|
||||||
|
* col: 0 1 2 3 4 5 6 7
|
||||||
|
* pin: F0 F1 F4 F5 F6 F7 E6 B1
|
||||||
|
*/
|
||||||
|
#define COLS (int []){ F0, F1, F4, F5, F6, F7, E6, B1 }
|
||||||
|
|
||||||
|
/* Row pin configuration
|
||||||
|
* row: 0 1 2 3 4 5 6 7 8 9
|
||||||
|
* pin: B2 C7 C6 B6 B5 B0 B3 D5 D3 D2
|
||||||
|
*/
|
||||||
|
#define ROWS (int []){ B2, C7, C6, B6, B5, B0, B3, D5, D3, D2 }
|
||||||
|
|
||||||
|
/* COL2ROW or ROW2COL */
|
||||||
|
#define DIODE_DIRECTION COL2ROW
|
||||||
|
|
||||||
|
/* define if matrix has ghost */
|
||||||
|
//#define MATRIX_HAS_GHOST
|
||||||
|
|
||||||
|
/* Set 0 if debouncing isn't needed */
|
||||||
|
#define DEBOUNCE 5
|
||||||
|
|
||||||
|
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
|
||||||
|
#define LOCKING_SUPPORT_ENABLE
|
||||||
|
/* Locking resynchronize hack */
|
||||||
|
#define LOCKING_RESYNC_ENABLE
|
||||||
|
|
||||||
|
/* key combination for command */
|
||||||
|
#define IS_COMMAND() ( \
|
||||||
|
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
|
||||||
|
)
|
||||||
|
|
||||||
|
/* Backlight configuration
|
||||||
|
*/
|
||||||
|
#define BACKLIGHT_LEVELS 1
|
||||||
|
|
||||||
|
/* Underlight configuration
|
||||||
|
*/
|
||||||
|
#define ws2812_PORTREG PORTD
|
||||||
|
#define ws2812_DDRREG DDRD
|
||||||
|
#define ws2812_pin 7
|
||||||
|
#define RGBLED_NUM 14 // Number of LEDs
|
||||||
|
#define RGBLIGHT_HUE_STEP 10
|
||||||
|
#define RGBLIGHT_SAT_STEP 17
|
||||||
|
#define RGBLIGHT_VAL_STEP 17
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Feature disable options
|
||||||
|
* These options are also useful to firmware size reduction.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* disable debug print */
|
||||||
|
//#define NO_DEBUG
|
||||||
|
|
||||||
|
/* disable print */
|
||||||
|
//#define NO_PRINT
|
||||||
|
|
||||||
|
/* disable action features */
|
||||||
|
//#define NO_ACTION_LAYER
|
||||||
|
//#define NO_ACTION_TAPPING
|
||||||
|
//#define NO_ACTION_ONESHOT
|
||||||
|
//#define NO_ACTION_MACRO
|
||||||
|
//#define NO_ACTION_FUNCTION
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,183 @@
|
|||||||
|
#include "clueboard2.h"
|
||||||
|
|
||||||
|
#ifdef RGBLIGHT_ENABLE
|
||||||
|
#include "rgblight.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Used for SHIFT_ESC
|
||||||
|
#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
|
||||||
|
|
||||||
|
// 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.
|
||||||
|
// Layer names don't all need to be of the same length, obviously, and you can also skip them
|
||||||
|
// entirely and just use numbers.
|
||||||
|
#define _BL 0
|
||||||
|
#define _FL 1
|
||||||
|
#define _RS 2
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
/* Keymap _BL: (Base Layer) Default Layer
|
||||||
|
* ,--------------------------------------------------------------------------. ,----.
|
||||||
|
* |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| BS| |PGUP|
|
||||||
|
* |--------------------------------------------------------------------------| |----|
|
||||||
|
* | Tab| Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |PGDN|
|
||||||
|
* |--------------------------------------------------------------------------| `----'
|
||||||
|
* |Capslck| A| S| D| F| G| H| J| K| L| ;| '| # | Ent|
|
||||||
|
* |-----------------------------------------------------------------------------.
|
||||||
|
* |Shift| BS| Z| X| C| V| B| N| M| ,| .| /| BS|Shift| UP|
|
||||||
|
* |------------------------------------------------------------------------|----|----.
|
||||||
|
* | Ctrl| Gui| Alt| MHen| Space| Space| Hen| Alt| Ctrl| _FL|LEFT|DOWN|RGHT|
|
||||||
|
* `----------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[_BL] = KEYMAP(
|
||||||
|
F(0), 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_GRV, KC_BSPC, KC_PGUP, \
|
||||||
|
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_PGDN, \
|
||||||
|
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_NUHS, KC_ENT, \
|
||||||
|
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, \
|
||||||
|
KC_LCTL, KC_LGUI, KC_LALT, KC_MHEN, KC_SPC,KC_SPC, KC_HENK, KC_RALT, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT),
|
||||||
|
|
||||||
|
/* Keymap _FL: Function Layer
|
||||||
|
* ,--------------------------------------------------------------------------. ,----.
|
||||||
|
* | `| F1| F2| F3| F4| F5| F6| F7| F8| F9| F10| F11| F12| | Del| |BLIN|
|
||||||
|
* |--------------------------------------------------------------------------| |----|
|
||||||
|
* | | | | | | | | |PScr|SLck|Paus| | | | |BLDE|
|
||||||
|
* |--------------------------------------------------------------------------| `----'
|
||||||
|
* | | | _RS| | | | | | | | | | | |
|
||||||
|
* |-----------------------------------------------------------------------------.
|
||||||
|
* | | | | | | | | | | | | | | |PGUP|
|
||||||
|
* |------------------------------------------------------------------------|----|----.
|
||||||
|
* | | | | | | | | | | _FL|HOME|PGDN| END|
|
||||||
|
* `----------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[_FL] = KEYMAP(
|
||||||
|
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, KC_TRNS, KC_DEL, BL_STEP, \
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, \
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), KC_HOME, KC_PGDN, KC_END),
|
||||||
|
|
||||||
|
/* Keymap _RS: Reset layer
|
||||||
|
* ,--------------------------------------------------------------------------. ,----.
|
||||||
|
* | | | | | | | | | | | | | | | | | |
|
||||||
|
* |--------------------------------------------------------------------------| |----|
|
||||||
|
* | | | | |RESET| | | | | | | | | | | |
|
||||||
|
* |--------------------------------------------------------------------------| `----'
|
||||||
|
* | | | _RS| | | | | | | | | | | |
|
||||||
|
* |-----------------------------------------------------------------------------.
|
||||||
|
* | | | | | | | | | | | | | | | |
|
||||||
|
* |------------------------------------------------------------------------|----|----.
|
||||||
|
* | | | | | | | | | | _FL| | | |
|
||||||
|
* `----------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[_RS] = KEYMAP(
|
||||||
|
#ifdef RGBLIGHT_ENABLE
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(1), F(7), \
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(8), \
|
||||||
|
KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||||
|
MO(_FL), KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), F(5), \
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, F(2), F(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(4), F(6), F(3)),
|
||||||
|
#else
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), KC_TRNS, KC_TRNS, KC_TRNS),
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
enum function_id {
|
||||||
|
SHIFT_ESC,
|
||||||
|
#ifdef RGBLIGHT_ENABLE
|
||||||
|
RGBLED_TOGGLE,
|
||||||
|
RGBLED_STEP_MODE,
|
||||||
|
RGBLED_INCREASE_HUE,
|
||||||
|
RGBLED_DECREASE_HUE,
|
||||||
|
RGBLED_INCREASE_SAT,
|
||||||
|
RGBLED_DECREASE_SAT,
|
||||||
|
RGBLED_INCREASE_VAL,
|
||||||
|
RGBLED_DECREASE_VAL
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t PROGMEM fn_actions[] = {
|
||||||
|
[0] = ACTION_FUNCTION(SHIFT_ESC),
|
||||||
|
#ifdef RGBLIGHT_ENABLE
|
||||||
|
[1] = ACTION_FUNCTION(RGBLED_TOGGLE),
|
||||||
|
[2] = ACTION_FUNCTION(RGBLED_STEP_MODE),
|
||||||
|
[3] = ACTION_FUNCTION(RGBLED_INCREASE_HUE),
|
||||||
|
[4] = ACTION_FUNCTION(RGBLED_DECREASE_HUE),
|
||||||
|
[5] = ACTION_FUNCTION(RGBLED_INCREASE_SAT),
|
||||||
|
[6] = ACTION_FUNCTION(RGBLED_DECREASE_SAT),
|
||||||
|
[7] = ACTION_FUNCTION(RGBLED_INCREASE_VAL),
|
||||||
|
[8] = ACTION_FUNCTION(RGBLED_DECREASE_VAL),
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||||
|
static uint8_t shift_esc_shift_mask;
|
||||||
|
switch (id) {
|
||||||
|
case SHIFT_ESC:
|
||||||
|
shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK;
|
||||||
|
if (record->event.pressed) {
|
||||||
|
if (shift_esc_shift_mask) {
|
||||||
|
add_key(KC_GRV);
|
||||||
|
send_keyboard_report();
|
||||||
|
} else {
|
||||||
|
add_key(KC_ESC);
|
||||||
|
send_keyboard_report();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (shift_esc_shift_mask) {
|
||||||
|
del_key(KC_GRV);
|
||||||
|
send_keyboard_report();
|
||||||
|
} else {
|
||||||
|
del_key(KC_ESC);
|
||||||
|
send_keyboard_report();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//led operations
|
||||||
|
#ifdef RGBLIGHT_ENABLE
|
||||||
|
case RGBLED_TOGGLE:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_toggle();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RGBLED_INCREASE_HUE:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_increase_hue();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RGBLED_DECREASE_HUE:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_decrease_hue();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RGBLED_INCREASE_SAT:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_increase_sat();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RGBLED_DECREASE_SAT:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_decrease_sat();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RGBLED_INCREASE_VAL:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_increase_val();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RGBLED_DECREASE_VAL:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_decrease_val();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RGBLED_STEP_MODE:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_step();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,147 @@
|
|||||||
|
#include "clueboard2.h"
|
||||||
|
|
||||||
|
#ifdef ENABLE_RGBLIGHT
|
||||||
|
#include "rgblight.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Used for SHIFT_ESC
|
||||||
|
#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
|
||||||
|
|
||||||
|
// 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.
|
||||||
|
// Layer names don't all need to be of the same length, obviously, and you can also skip them
|
||||||
|
// entirely and just use numbers.
|
||||||
|
#define _BL 0
|
||||||
|
#define _FL 1
|
||||||
|
#define _RS 2
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
/* Keymap _BL: (Base Layer) Default Layer
|
||||||
|
* ,--------------------------------------------------------------------------. ,----.
|
||||||
|
* | Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| ~| BS| |PgUp|
|
||||||
|
* |--------------------------------------------------------------------------| |----|
|
||||||
|
* | Tab| Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |PgDn|
|
||||||
|
* |--------------------------------------------------------------------------| `----'
|
||||||
|
* |Capslck| A| S| D| F| G| H| J| K| L| ;| '| # | Ent|
|
||||||
|
* |-----------------------------------------------------------------------------.
|
||||||
|
* |Shift| BS| Z| X| C| V| B| N| M| ,| .| /| BS|Shift| Up|
|
||||||
|
* |------------------------------------------------------------------------|----|----.
|
||||||
|
* | Ctrl| Alt| Gui| MHen| Space| Space| Hen| Gui| Alt| Ctrl|Left|Down|Rght|
|
||||||
|
* `----------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[_BL] = KEYMAP(
|
||||||
|
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_GRV, KC_BSPC, KC_PGUP, \
|
||||||
|
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_PGDN, \
|
||||||
|
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_NUHS, KC_ENT, \
|
||||||
|
MO(_FL), KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FL), KC_UP, \
|
||||||
|
KC_LCTL, KC_LALT, KC_LGUI,KC_MHEN, KC_SPC, KC_SPC, KC_HENK, KC_RGUI, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
|
||||||
|
|
||||||
|
/* Keymap _FL: Function Layer
|
||||||
|
* ,--------------------------------------------------------------------------. ,----.
|
||||||
|
* | `| F1| F2| F3| F4| F5| F6| F7| F8| F9| F10| F11| F12| | Del| |BLIN|
|
||||||
|
* |--------------------------------------------------------------------------| |----|
|
||||||
|
* | | | | | | | | |PScr|SLck|Paus| | | | |BLDE|
|
||||||
|
* |--------------------------------------------------------------------------| `----'
|
||||||
|
* | | | _RS| | | | | | | | | | | |
|
||||||
|
* |-----------------------------------------------------------------------------.
|
||||||
|
* | | | | | | | | | | | | | | |PGUP|
|
||||||
|
* |------------------------------------------------------------------------|----|----.
|
||||||
|
* | | | | | | | | | | _FL|HOME|PGDN| END|
|
||||||
|
* `----------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[_FL] = KEYMAP(
|
||||||
|
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, KC_TRNS, KC_DEL, BL_STEP, \
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||||
|
MO(_FL), KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), KC_PGUP, \
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_END),
|
||||||
|
|
||||||
|
/* Keymap _RS: Reset/Underlight layer
|
||||||
|
* ,--------------------------------------------------------------------------. ,----.
|
||||||
|
* | | | | | | | | | | | | | | | | | |
|
||||||
|
* |--------------------------------------------------------------------------| |----|
|
||||||
|
* | | | | |RESET| | | | | | | | | | | |
|
||||||
|
* |--------------------------------------------------------------------------| `----'
|
||||||
|
* | | | _RS| | | | | | | | | | | |
|
||||||
|
* |-----------------------------------------------------------------------------.
|
||||||
|
* | | | | | | | | | | | | | | | |
|
||||||
|
* |------------------------------------------------------------------------|----|----.
|
||||||
|
* | | | | | | | | | | _FL| | | |
|
||||||
|
* `----------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[_RS] = KEYMAP(
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(0), F(6), \
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(7), \
|
||||||
|
KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||||
|
MO(_FL), KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), F(4), \
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, F(1), F(1), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(3), F(5), F(2)),
|
||||||
|
};
|
||||||
|
|
||||||
|
enum function_id {
|
||||||
|
RGBLED_TOGGLE,
|
||||||
|
RGBLED_STEP_MODE,
|
||||||
|
RGBLED_INCREASE_HUE,
|
||||||
|
RGBLED_DECREASE_HUE,
|
||||||
|
RGBLED_INCREASE_SAT,
|
||||||
|
RGBLED_DECREASE_SAT,
|
||||||
|
RGBLED_INCREASE_VAL,
|
||||||
|
RGBLED_DECREASE_VAL,
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t PROGMEM fn_actions[] = {
|
||||||
|
[0] = ACTION_FUNCTION(RGBLED_TOGGLE),
|
||||||
|
[1] = ACTION_FUNCTION(RGBLED_STEP_MODE),
|
||||||
|
[2] = ACTION_FUNCTION(RGBLED_INCREASE_HUE),
|
||||||
|
[3] = ACTION_FUNCTION(RGBLED_DECREASE_HUE),
|
||||||
|
[4] = ACTION_FUNCTION(RGBLED_INCREASE_SAT),
|
||||||
|
[5] = ACTION_FUNCTION(RGBLED_DECREASE_SAT),
|
||||||
|
[6] = ACTION_FUNCTION(RGBLED_INCREASE_VAL),
|
||||||
|
[7] = ACTION_FUNCTION(RGBLED_DECREASE_VAL),
|
||||||
|
};
|
||||||
|
|
||||||
|
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||||
|
switch (id) {
|
||||||
|
case RGBLED_TOGGLE:
|
||||||
|
//led operations
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_toggle();
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case RGBLED_INCREASE_HUE:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_increase_hue();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RGBLED_DECREASE_HUE:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_decrease_hue();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RGBLED_INCREASE_SAT:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_increase_sat();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RGBLED_DECREASE_SAT:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_decrease_sat();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RGBLED_INCREASE_VAL:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_increase_val();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RGBLED_DECREASE_VAL:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_decrease_val();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RGBLED_STEP_MODE:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_step();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,108 @@
|
|||||||
|
#include "clueboard2.h"
|
||||||
|
|
||||||
|
// Used for SHIFT_ESC
|
||||||
|
#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
|
||||||
|
|
||||||
|
// 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.
|
||||||
|
// Layer names don't all need to be of the same length, obviously, and you can also skip them
|
||||||
|
// entirely and just use numbers.
|
||||||
|
#define _BL 0
|
||||||
|
#define _FL 1
|
||||||
|
#define _RS 2
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
/* Keymap _BL: (Base Layer) Default Layer
|
||||||
|
* ,--------------------------------------------------------------------------. ,----.
|
||||||
|
* |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| BS| |PGUP|
|
||||||
|
* |--------------------------------------------------------------------------| |----|
|
||||||
|
* | Tab| Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |PGDN|
|
||||||
|
* |--------------------------------------------------------------------------| `----'
|
||||||
|
* |Capslck| A| S| D| F| G| H| J| K| L| ;| '| # | Ent|
|
||||||
|
* |-----------------------------------------------------------------------------.
|
||||||
|
* |Shift| BS| Z| X| C| V| B| N| M| ,| .| /| BS|Shift| UP|
|
||||||
|
* |------------------------------------------------------------------------|----|----.
|
||||||
|
* | Ctrl| Gui| Alt| MHen| Space| Space| Hen| Alt| Ctrl| _FL|LEFT|DOWN|RGHT|
|
||||||
|
* `----------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[_BL] = KEYMAP(
|
||||||
|
F(0), 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_GRV, KC_BSPC, KC_PGUP, \
|
||||||
|
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_PGDN, \
|
||||||
|
KC_LCTL,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, \
|
||||||
|
KC_LSFT,KC_NUBS,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, \
|
||||||
|
KC_LCTL,KC_LALT,KC_LGUI,MO(_FL), KC_SPC, KC_SPC, MO(_FL), KC_RGUI, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT),
|
||||||
|
|
||||||
|
/* Keymap _FL: Function Layer
|
||||||
|
* ,--------------------------------------------------------------------------. ,----.
|
||||||
|
* | `| F1| F2| F3| F4| F5| F6| F7| F8| F9| F10| F11| F12| | Del| |BLIN|
|
||||||
|
* |--------------------------------------------------------------------------| |----|
|
||||||
|
* | | | | | | | | |PScr|SLck|Paus| | | | |BLDE|
|
||||||
|
* |--------------------------------------------------------------------------| `----'
|
||||||
|
* | | | _RS| | | | | | | | | | | |
|
||||||
|
* |-----------------------------------------------------------------------------.
|
||||||
|
* | | | | | | | | | | | | | | |PGUP|
|
||||||
|
* |------------------------------------------------------------------------|----|----.
|
||||||
|
* | | | | | | | | | | _FL|HOME|PGDN| END|
|
||||||
|
* `----------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[_FL] = KEYMAP(
|
||||||
|
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, KC_TRNS,KC_DEL, BL_STEP, \
|
||||||
|
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK,KC_PAUS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS,KC_TRNS,MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \
|
||||||
|
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_PGUP, \
|
||||||
|
KC_TRNS,KC_TRNS,KC_TRNS,MO(_FL), KC_TRNS,KC_TRNS, MO(_FL),KC_TRNS,KC_TRNS,MO(_FL),KC_HOME,KC_PGDN,KC_END),
|
||||||
|
|
||||||
|
/* Keymap _RS: Reset layer
|
||||||
|
* ,--------------------------------------------------------------------------. ,----.
|
||||||
|
* | | | | | | | | | | | | | | | | | |
|
||||||
|
* |--------------------------------------------------------------------------| |----|
|
||||||
|
* | | | | |RESET| | | | | | | | | | | |
|
||||||
|
* |--------------------------------------------------------------------------| `----'
|
||||||
|
* | | | _RS| | | | | | | | | | | |
|
||||||
|
* |-----------------------------------------------------------------------------.
|
||||||
|
* | | | | | | | | | | | | | | | |
|
||||||
|
* |------------------------------------------------------------------------|----|----.
|
||||||
|
* | | | | | | | | | | _FL| | | |
|
||||||
|
* `----------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[_RS] = KEYMAP(
|
||||||
|
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS,KC_TRNS,MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \
|
||||||
|
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,MO(_FL),KC_TRNS, KC_TRNS, KC_TRNS),
|
||||||
|
};
|
||||||
|
|
||||||
|
enum function_id {
|
||||||
|
SHIFT_ESC,
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t PROGMEM fn_actions[] = {
|
||||||
|
[0] = ACTION_FUNCTION(SHIFT_ESC),
|
||||||
|
};
|
||||||
|
|
||||||
|
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||||
|
static uint8_t shift_esc_shift_mask;
|
||||||
|
switch (id) {
|
||||||
|
case SHIFT_ESC:
|
||||||
|
shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK;
|
||||||
|
if (record->event.pressed) {
|
||||||
|
if (shift_esc_shift_mask) {
|
||||||
|
add_key(KC_GRV);
|
||||||
|
send_keyboard_report();
|
||||||
|
} else {
|
||||||
|
add_key(KC_ESC);
|
||||||
|
send_keyboard_report();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (shift_esc_shift_mask) {
|
||||||
|
del_key(KC_GRV);
|
||||||
|
send_keyboard_report();
|
||||||
|
} else {
|
||||||
|
del_key(KC_ESC);
|
||||||
|
send_keyboard_report();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2012 Jun Wako <wakojun@gmail.com>
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include "stdint.h"
|
||||||
|
#include "led.h"
|
||||||
|
|
||||||
|
|
||||||
|
void led_init_ports() {
|
||||||
|
// * Set our LED pins as output
|
||||||
|
DDRB |= (1<<4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void led_set_kb(uint8_t usb_led) {
|
||||||
|
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
|
||||||
|
// Turn capslock on
|
||||||
|
PORTB |= (1<<4);
|
||||||
|
} else {
|
||||||
|
// Turn capslock off
|
||||||
|
PORTB &= ~(1<<4);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,136 @@
|
|||||||
|
#----------------------------------------------------------------------------
|
||||||
|
# On command line:
|
||||||
|
#
|
||||||
|
# make all = Make software.
|
||||||
|
#
|
||||||
|
# make clean = Clean out built project files.
|
||||||
|
#
|
||||||
|
# make coff = Convert ELF to AVR COFF.
|
||||||
|
#
|
||||||
|
# make extcoff = Convert ELF to AVR Extended COFF.
|
||||||
|
#
|
||||||
|
# make program = Download the hex file to the device.
|
||||||
|
# Please customize your programmer settings(PROGRAM_CMD)
|
||||||
|
#
|
||||||
|
# make teensy = Download the hex file to the device, using teensy_loader_cli.
|
||||||
|
# (must have teensy_loader_cli installed).
|
||||||
|
#
|
||||||
|
# make dfu = Download the hex file to the device, using dfu-programmer (must
|
||||||
|
# have dfu-programmer installed).
|
||||||
|
#
|
||||||
|
# make flip = Download the hex file to the device, using Atmel FLIP (must
|
||||||
|
# have Atmel FLIP installed).
|
||||||
|
#
|
||||||
|
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
|
||||||
|
# (must have dfu-programmer installed).
|
||||||
|
#
|
||||||
|
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
|
||||||
|
# (must have Atmel FLIP installed).
|
||||||
|
#
|
||||||
|
# make debug = Start either simulavr or avarice as specified for debugging,
|
||||||
|
# with avr-gdb or avr-insight as the front end for debugging.
|
||||||
|
#
|
||||||
|
# make filename.s = Just compile filename.c into the assembler code only.
|
||||||
|
#
|
||||||
|
# make filename.i = Create a preprocessed source file for use in submitting
|
||||||
|
# bug reports to the GCC project.
|
||||||
|
#
|
||||||
|
# To rebuild project do "make clean" then "make all".
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Target file name (without extension).
|
||||||
|
TARGET = cluepad
|
||||||
|
|
||||||
|
|
||||||
|
# Directory common source filess exist
|
||||||
|
TOP_DIR = ../..
|
||||||
|
TMK_DIR = ../../tmk_core
|
||||||
|
|
||||||
|
# Directory keyboard dependent files exist
|
||||||
|
TARGET_DIR = .
|
||||||
|
|
||||||
|
# # project specific files
|
||||||
|
SRC = cluepad.c backlight.c
|
||||||
|
|
||||||
|
ifdef KEYMAP
|
||||||
|
SRC := keymaps/keymap_$(KEYMAP).c $(SRC)
|
||||||
|
else
|
||||||
|
SRC := keymaps/keymap_default.c $(SRC)
|
||||||
|
endif
|
||||||
|
|
||||||
|
CONFIG_H = config.h
|
||||||
|
|
||||||
|
# MCU name
|
||||||
|
#MCU = at90usb1287
|
||||||
|
MCU = atmega32u4
|
||||||
|
|
||||||
|
# Processor frequency.
|
||||||
|
# This will define a symbol, F_CPU, in all source code files equal to the
|
||||||
|
# processor frequency in Hz. You can then use this symbol in your source code to
|
||||||
|
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
|
||||||
|
# automatically to create a 32-bit value in your source code.
|
||||||
|
#
|
||||||
|
# This will be an integer division of F_USB below, as it is sourced by
|
||||||
|
# F_USB after it has run through any CPU prescalers. Note that this value
|
||||||
|
# does not *change* the processor frequency - it should merely be updated to
|
||||||
|
# reflect the processor speed set externally so that the code can use accurate
|
||||||
|
# software delays.
|
||||||
|
F_CPU = 16000000
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# LUFA specific
|
||||||
|
#
|
||||||
|
# Target architecture (see library "Board Types" documentation).
|
||||||
|
ARCH = AVR8
|
||||||
|
|
||||||
|
# Input clock frequency.
|
||||||
|
# This will define a symbol, F_USB, in all source code files equal to the
|
||||||
|
# input clock frequency (before any prescaling is performed) in Hz. This value may
|
||||||
|
# differ from F_CPU if prescaling is used on the latter, and is required as the
|
||||||
|
# raw input clock is fed directly to the PLL sections of the AVR for high speed
|
||||||
|
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
|
||||||
|
# at the end, this will be done automatically to create a 32-bit value in your
|
||||||
|
# source code.
|
||||||
|
#
|
||||||
|
# If no clock division is performed on the input clock inside the AVR (via the
|
||||||
|
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
|
||||||
|
F_USB = $(F_CPU)
|
||||||
|
|
||||||
|
# Interrupt driven control endpoint task(+60)
|
||||||
|
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
|
||||||
|
|
||||||
|
|
||||||
|
# Boot Section Size in *bytes*
|
||||||
|
# Teensy halfKay 512
|
||||||
|
# Teensy++ halfKay 1024
|
||||||
|
# Atmel DFU loader 4096
|
||||||
|
# LUFA bootloader 4096
|
||||||
|
# USBaspLoader 2048
|
||||||
|
OPT_DEFS += -DBOOTLOADER_SIZE=4096
|
||||||
|
|
||||||
|
|
||||||
|
# Build Options
|
||||||
|
# comment out to disable the options.
|
||||||
|
#
|
||||||
|
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
|
||||||
|
# MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
|
||||||
|
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
||||||
|
CONSOLE_ENABLE = yes # Console for debug(+400)
|
||||||
|
COMMAND_ENABLE = yes # Commands for debug and configuration
|
||||||
|
NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||||
|
BACKLIGHT_ENABLE = yes # Enable numpad's backlight functionality
|
||||||
|
RGBLIGHT_ENABLE = yes
|
||||||
|
# MIDI_ENABLE = YES # MIDI controls
|
||||||
|
# UNICODE_ENABLE = YES # Unicode
|
||||||
|
# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
|
|
||||||
|
# Optimize size but this may cause error "relocation truncated to fit"
|
||||||
|
#EXTRALDFLAGS = -Wl,--relax
|
||||||
|
|
||||||
|
# Search Path
|
||||||
|
VPATH += $(TARGET_DIR)
|
||||||
|
VPATH += $(TOP_DIR)
|
||||||
|
VPATH += $(TMK_DIR)
|
||||||
|
|
||||||
|
include $(TOP_DIR)/quantum/quantum.mk
|
@ -0,0 +1,54 @@
|
|||||||
|
#include <avr/io.h>
|
||||||
|
#include "backlight.h"
|
||||||
|
#include "led.h"
|
||||||
|
|
||||||
|
#include "print.h"
|
||||||
|
|
||||||
|
int pwm_level;
|
||||||
|
|
||||||
|
void led_set_kb(uint8_t usb_led)
|
||||||
|
{
|
||||||
|
print("led_set\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void init_backlight_pin(void)
|
||||||
|
{
|
||||||
|
// Set C7 to output
|
||||||
|
DDRC |= (1<<7);
|
||||||
|
|
||||||
|
// Initialize the timer
|
||||||
|
TC4H = 0x03;
|
||||||
|
OCR4C = 0xFF;
|
||||||
|
TCCR4A = 0b10000010;
|
||||||
|
TCCR4B = 0b00000001;
|
||||||
|
}
|
||||||
|
|
||||||
|
void backlight_set(uint8_t level)
|
||||||
|
{
|
||||||
|
// Determine the PWM level
|
||||||
|
switch (level)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
// 33%
|
||||||
|
pwm_level = 0x54;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
// 66%
|
||||||
|
pwm_level = 0xA8;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
// 100%
|
||||||
|
pwm_level = 0xFF;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
// 0%
|
||||||
|
pwm_level = 0x00;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
xprintf("Unknown level: %d\n", level);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write the PWM level to the timer
|
||||||
|
TC4H = pwm_level >> 8;
|
||||||
|
OCR4A = 0xFF & pwm_level;
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
#include "cluepad.h"
|
||||||
|
|
||||||
|
__attribute__ ((weak))
|
||||||
|
void matrix_init_user(void) {
|
||||||
|
// leave these blank
|
||||||
|
};
|
||||||
|
|
||||||
|
__attribute__ ((weak))
|
||||||
|
void matrix_scan_user(void) {
|
||||||
|
// leave these blank
|
||||||
|
};
|
||||||
|
|
||||||
|
void matrix_init_kb(void) {
|
||||||
|
// put your keyboard start-up code here
|
||||||
|
// runs once when the firmware starts up
|
||||||
|
if (matrix_init_user) {
|
||||||
|
(*matrix_init_user)();
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef BACKLIGHT_ENABLE
|
||||||
|
init_backlight_pin();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef RGBLIGHT_ENABLE
|
||||||
|
rgblight_init();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// JTAG disable for PORT F. write JTD bit twice within four cycles.
|
||||||
|
MCUCR |= (1<<JTD);
|
||||||
|
MCUCR |= (1<<JTD);
|
||||||
|
};
|
||||||
|
|
||||||
|
void matrix_scan_kb(void) {
|
||||||
|
// put your looping keyboard code here
|
||||||
|
// runs every cycle (a lot)
|
||||||
|
if (matrix_scan_user) {
|
||||||
|
(*matrix_scan_user)();
|
||||||
|
}
|
||||||
|
};
|
@ -0,0 +1,41 @@
|
|||||||
|
#ifndef CLUEPAD_H
|
||||||
|
#define CLUEPAD_H
|
||||||
|
|
||||||
|
#include "matrix.h"
|
||||||
|
#include "keymap_common.h"
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* Cluepad matrix layout
|
||||||
|
* .-------------------.
|
||||||
|
* |NLCK| /| *| -|
|
||||||
|
* |-------------------|
|
||||||
|
* | 7| 8| 9| |
|
||||||
|
* |--------------| |
|
||||||
|
* | 4| 5| 6| +|
|
||||||
|
* |-------------------|
|
||||||
|
* | 1| 2| 3| |
|
||||||
|
* |--------------| |
|
||||||
|
* | 0| .| Ent|
|
||||||
|
* '-------------------'
|
||||||
|
*/
|
||||||
|
// The first section contains all of the arguments
|
||||||
|
// The second converts the arguments into a two-dimensional array
|
||||||
|
#define KEYMAP( \
|
||||||
|
k00, k01, k02, k03, \
|
||||||
|
k10, k11, k12, k13, \
|
||||||
|
k20, k21, k22, \
|
||||||
|
k30, k31, k32, k33, \
|
||||||
|
k40, k42 \
|
||||||
|
) { \
|
||||||
|
{ k00, k01, k02, k03, }, \
|
||||||
|
{ k10, k11, k12, k13, }, \
|
||||||
|
{ k20, k21, k22, KC_NO, }, \
|
||||||
|
{ k30, k31, k32, k33, }, \
|
||||||
|
{ k40, KC_NO, k42, KC_NO } \
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_init_user(void);
|
||||||
|
void matrix_scan_user(void);
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,102 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2012 Jun Wako <wakojun@gmail.com>
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CONFIG_H
|
||||||
|
#define CONFIG_H
|
||||||
|
|
||||||
|
#include "config_common.h"
|
||||||
|
|
||||||
|
/* USB Device descriptor parameter */
|
||||||
|
#define VENDOR_ID 0xC1ED
|
||||||
|
#define PRODUCT_ID 0x2312
|
||||||
|
#define DEVICE_VER 0x0001
|
||||||
|
#define MANUFACTURER Clueboard
|
||||||
|
#define PRODUCT Cluepad with RGB Underlighting
|
||||||
|
#define DESCRIPTION QMK keyboard firmware for Cluepad
|
||||||
|
|
||||||
|
/* key matrix size */
|
||||||
|
#define MATRIX_ROWS 5
|
||||||
|
#define MATRIX_COLS 4
|
||||||
|
|
||||||
|
// COLS: Left to right, ROWS: Top to bottom
|
||||||
|
|
||||||
|
/* Column pin configuration
|
||||||
|
* col: 0 1 2 3
|
||||||
|
* pin: F4 E6 B1 D2
|
||||||
|
*/
|
||||||
|
#define COLS (int []){ F4, E6, B1, D2 }
|
||||||
|
|
||||||
|
/* Row pin configuration
|
||||||
|
* row: 0 1 2 3 4
|
||||||
|
* pin:
|
||||||
|
*/
|
||||||
|
#define ROWS (int []){ B0, D3, D5, D4, D6 }
|
||||||
|
|
||||||
|
/* COL2ROW or ROW2COL */
|
||||||
|
#define DIODE_DIRECTION COL2ROW
|
||||||
|
|
||||||
|
/* define if matrix has ghost */
|
||||||
|
//#define MATRIX_HAS_GHOST
|
||||||
|
|
||||||
|
/* Set 0 if debouncing isn't needed */
|
||||||
|
#define DEBOUNCE 5
|
||||||
|
|
||||||
|
/* Number of backlighting levels */
|
||||||
|
#define BACKLIGHT_LEVELS 3
|
||||||
|
|
||||||
|
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
|
||||||
|
#define LOCKING_SUPPORT_ENABLE
|
||||||
|
/* Locking resynchronize hack */
|
||||||
|
#define LOCKING_RESYNC_ENABLE
|
||||||
|
|
||||||
|
/* key combination for command */
|
||||||
|
#define IS_COMMAND() ( \
|
||||||
|
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
|
||||||
|
)
|
||||||
|
|
||||||
|
/* Underlight configuration
|
||||||
|
*/
|
||||||
|
#define ws2812_PORTREG PORTF
|
||||||
|
#define ws2812_DDRREG DDRF
|
||||||
|
#define ws2812_pin 6
|
||||||
|
#define RGBLED_NUM 4 // Number of LEDs
|
||||||
|
#define RGBLIGHT_HUE_STEP 10
|
||||||
|
#define RGBLIGHT_SAT_STEP 17
|
||||||
|
#define RGBLIGHT_VAL_STEP 17
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Feature disable options
|
||||||
|
* These options are also useful to firmware size reduction.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* disable debug print */
|
||||||
|
//#define NO_DEBUG
|
||||||
|
|
||||||
|
/* Debug forcibly enabled */
|
||||||
|
#define ALWAYS_DEBUG
|
||||||
|
|
||||||
|
/* disable print */
|
||||||
|
//#define NO_PRINT
|
||||||
|
|
||||||
|
/* disable action features */
|
||||||
|
//#define NO_ACTION_LAYER
|
||||||
|
//#define NO_ACTION_TAPPING
|
||||||
|
//#define NO_ACTION_ONESHOT
|
||||||
|
//#define NO_ACTION_MACRO
|
||||||
|
//#define NO_ACTION_FUNCTION
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,122 @@
|
|||||||
|
#include "cluepad.h"
|
||||||
|
|
||||||
|
#include "backlight.h"
|
||||||
|
#include "rgblight.h"
|
||||||
|
|
||||||
|
// 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.
|
||||||
|
// Layer names don't all need to be of the same length, obviously, and you can also skip them
|
||||||
|
// entirely and just use numbers.
|
||||||
|
#define _BL 0
|
||||||
|
#define _FL 1
|
||||||
|
#define _RS 2
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
/* Keymap _BL: (Base Layer) Default Layer
|
||||||
|
* .-------------------.
|
||||||
|
* |NL F| /| *| -|
|
||||||
|
* |-------------------|
|
||||||
|
* | 7| 8| 9| |
|
||||||
|
* |--------------| |
|
||||||
|
* | 4| 5| 6| +|
|
||||||
|
* |-------------------|
|
||||||
|
* | 1| 2| 3| |
|
||||||
|
* |--------------| |
|
||||||
|
* | 0| .| Ent|
|
||||||
|
* '-------------------'
|
||||||
|
*/
|
||||||
|
[_BL] = KEYMAP(
|
||||||
|
LT(_FL, KC_NLCK), KC_PSLS, KC_PAST, KC_PMNS, \
|
||||||
|
KC_P7, KC_P8, KC_P9, KC_PPLS, \
|
||||||
|
KC_P4, KC_P5, KC_P6, \
|
||||||
|
KC_P1, KC_P2, KC_P3, KC_PENT, \
|
||||||
|
KC_P0, KC_PDOT),
|
||||||
|
|
||||||
|
/* Keymap _FL: Function Layer
|
||||||
|
* .-------------------.
|
||||||
|
* |NL F| | | Fn0|
|
||||||
|
* |-------------------|
|
||||||
|
* | | Fn4| | |
|
||||||
|
* |--------------| |
|
||||||
|
* | Fn3|BL_S| Fn2| Fn6|
|
||||||
|
* |-------------------|
|
||||||
|
* | | Fn5| | |
|
||||||
|
* |--------------| |
|
||||||
|
* | Fn1| | Fn7|
|
||||||
|
* '-------------------'
|
||||||
|
*/
|
||||||
|
[_FL] = KEYMAP(
|
||||||
|
LT(_FL, KC_NLCK), KC_TRNS, KC_TRNS, F(0), \
|
||||||
|
KC_TRNS, F(4), KC_TRNS, F(6), \
|
||||||
|
F(3), BL_STEP, F(2), \
|
||||||
|
KC_TRNS, F(5), KC_TRNS, F(7), \
|
||||||
|
F(1), KC_TRNS)
|
||||||
|
};
|
||||||
|
|
||||||
|
enum function_id {
|
||||||
|
RGBLED_TOGGLE,
|
||||||
|
RGBLED_STEP_MODE,
|
||||||
|
RGBLED_INCREASE_HUE,
|
||||||
|
RGBLED_DECREASE_HUE,
|
||||||
|
RGBLED_INCREASE_SAT,
|
||||||
|
RGBLED_DECREASE_SAT,
|
||||||
|
RGBLED_INCREASE_VAL,
|
||||||
|
RGBLED_DECREASE_VAL,
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t PROGMEM fn_actions[] = {
|
||||||
|
[0] = ACTION_FUNCTION(RGBLED_TOGGLE),
|
||||||
|
[1] = ACTION_FUNCTION(RGBLED_STEP_MODE),
|
||||||
|
[2] = ACTION_FUNCTION(RGBLED_INCREASE_HUE),
|
||||||
|
[3] = ACTION_FUNCTION(RGBLED_DECREASE_HUE),
|
||||||
|
[4] = ACTION_FUNCTION(RGBLED_INCREASE_SAT),
|
||||||
|
[5] = ACTION_FUNCTION(RGBLED_DECREASE_SAT),
|
||||||
|
[6] = ACTION_FUNCTION(RGBLED_INCREASE_VAL),
|
||||||
|
[7] = ACTION_FUNCTION(RGBLED_DECREASE_VAL),
|
||||||
|
};
|
||||||
|
|
||||||
|
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||||
|
switch (id) {
|
||||||
|
case RGBLED_TOGGLE:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_toggle();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RGBLED_INCREASE_HUE:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_increase_hue();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RGBLED_DECREASE_HUE:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_decrease_hue();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RGBLED_INCREASE_SAT:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_increase_sat();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RGBLED_DECREASE_SAT:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_decrease_sat();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RGBLED_INCREASE_VAL:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_increase_val();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RGBLED_DECREASE_VAL:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_decrease_val();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RGBLED_STEP_MODE:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_step();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 118 KiB |
Before Width: | Height: | Size: 96 KiB After Width: | Height: | Size: 101 KiB |
@ -1,27 +1,27 @@
|
|||||||
[{x:3.5,c:"#99de2a"},"F3",{x:10.5},"F8"],
|
[{x:3.5,c:"#99de2a"},"F3",{x:10.5},"F8"],
|
||||||
[{y:-0.875,x:2.5},"F2",{x:1},"F4",{x:8.5},"F7",{x:1},"F9"],
|
[{y:-0.875,x:2.5},"F2",{x:1},"F4",{x:8.5},"F7",{x:1},"F9"],
|
||||||
[{y:-0.875,x:5.5},"F5",{c:"#ff4444"},"Esc",{x:4.5,c:"#cccccc",a:7},"",{c:"#99de2a",a:4},"F6"],
|
[{y:-0.875,x:5.5},"F5",{c:"#ff4444"},"Esc",{x:4.5,c:"#bbddbb"},"_\n\n\n\n\n\n-",{c:"#99de2a"},"F6"],
|
||||||
[{y:-0.875,c:"#2277ff",w:1.5},"Shift\n\n\n\n\n\nLock",{c:"#99de2a"},"F1",{x:14.5},"F10",{c:"#2277ff",w:1.5},"\n\nShift\n\n\n\n\nLock"],
|
[{y:-0.875,c:"#2277ff",w:1.5},"Shift\n\n\n\n\n\nLock",{c:"#99de2a"},"F1",{x:14.5},"F10",{c:"#2277ff",w:1.5},"\n\nShift\n\n\n\n\nLock"],
|
||||||
[{y:-0.375,x:3.5,c:"#c4e0bf"},"{",{x:10.5,c:"#89b087"},"8"],
|
[{y:-0.375,x:3.5,c:"#bbddbb"},"{",{x:10.5,c:"#89b087"},"8"],
|
||||||
[{y:-0.875,x:2.5,c:"#c4e0bf"},"@",{x:1},"}",{x:8.5,c:"#89b087"},"7",{x:1},"9"],
|
[{y:-0.875,x:2.5,c:"#bbddbb"},"@",{x:1},"}",{x:8.5,c:"#89b087"},"7",{x:1},"9"],
|
||||||
[{y:-0.875,x:5.5,c:"#c4e0bf"},"&",{h:1.5},"<",{x:4.5,h:1.5},">","|"],
|
[{y:-0.875,x:5.5,c:"#bbddbb"},"&",{h:1.5},"<",{x:4.5,h:1.5},">","|"],
|
||||||
[{y:-0.875,c:"#2277ff",w:1.5},"Media\n\n\n\n\n\nShift",{c:"#c4e0bf"},"!",{x:14.5,c:"#89b087"},"/",{c:"#2277ff",w:1.5},"\n\nMedia\n\n\n\n\nShift"],
|
[{y:-0.875,c:"#2277ff",w:1.5},"Media\n\n\n\n\n\nShift",{c:"#bbddbb"},"!",{x:14.5,c:"#89b087"},"/",{c:"#2277ff",w:1.5},"\n\nMedia\n\n\n\n\nShift"],
|
||||||
[{y:-0.375,x:3.5,c:"#c4e0bf"},"(",{x:10.5,c:"#89b087"},"5"],
|
[{y:-0.375,x:3.5,c:"#bbddbb"},"(",{x:10.5,c:"#89b087"},"5"],
|
||||||
[{y:-0.875,x:2.5,c:"#c4e0bf"},"$",{x:1},")",{x:8.5,c:"#89b087"},"4",{x:1},"6"],
|
[{y:-0.875,x:2.5,c:"#bbddbb"},"$",{x:1},")",{x:8.5,c:"#89b087"},"4",{x:1},"6"],
|
||||||
[{y:-0.875,x:5.5,c:"#c4e0bf"},"`",{x:6.5},"/"],
|
[{y:-0.875,x:5.5,c:"#bbddbb"},"`",{x:6.5},"/"],
|
||||||
[{y:-0.875,c:"#000000",t:"#ff0000",w:1.5},"Symbols\n\n\n\n\n\nShift",{c:"#c4e0bf",t:"#000000"},"#",{x:14.5,c:"#89b087"},"*",{c:"#000000",t:"#ff0000",w:1.5},"\n\nSymbols\n\n\n\n\nShift"],
|
[{y:-0.875,c:"#000000",t:"#ff0000",w:1.5},"Symbols\n\n\n\n\n\nShift",{c:"#bbddbb",t:"#000000"},"#",{x:14.5,c:"#89b087"},"*",{c:"#000000",t:"#ff0000",w:1.5},"\n\nSymbols\n\n\n\n\nShift"],
|
||||||
[{y:-0.625,x:6.5,c:"#54d6de",t:"#000000",fa:[0,0,0,1],h:1.5},"Tab >\n\n\nTab",{x:4.5,h:1.5},"< Tab\n\n\nShift Tab"],
|
[{y:-0.625,x:6.5,c:"#54d6de",t:"#000000",fa:[0,0,0,1],h:1.5},"Tab >\n\n\nTab",{x:4.5,h:1.5},"< Tab\n\n\nShift Tab"],
|
||||||
[{y:-0.75,x:3.5,c:"#c4e0bf"},"[",{x:10.5,c:"#89b087"},"2"],
|
[{y:-0.75,x:3.5,c:"#bbddbb"},"[",{x:10.5,c:"#89b087"},"2"],
|
||||||
[{y:-0.875,x:2.5,c:"#c4e0bf"},"^",{x:1},"]",{x:8.5,c:"#89b087"},"1",{x:1},"3"],
|
[{y:-0.875,x:2.5,c:"#bbddbb"},"^",{x:1},"]",{x:8.5,c:"#89b087"},"1",{x:1},"3"],
|
||||||
[{y:-0.875,x:5.5,c:"#c4e0bf"},"~",{x:6.5},"\\"],
|
[{y:-0.875,x:5.5,c:"#bbddbb"},"~",{x:6.5},"\\"],
|
||||||
[{y:-0.875,c:"#2277ff",f2:1,w:1.5},"Capitals\nShift\n\n\n\n\nShift",{c:"#c4e0bf"},"%",{x:14.5,c:"#89b087"},"-",{c:"#2277ff",fa:[0,1,0,1],w:1.5},"\n\nCapitals\nShift\n\n\n\nShift"],
|
[{y:-0.875,c:"#2277ff",fa:[0,1,0,1,0,0,1],w:1.5},"Capitals\nShift\n\n\n\n\nShift",{c:"#bbddbb"},"%",{x:14.5,c:"#89b087"},"-",{c:"#2277ff",w:1.5},"\n\nCapitals\nShift\n\n\n\nShift"],
|
||||||
[{y:-0.375,x:3.5,c:"#cccccc",a:7},"",{x:10.5,c:"#89b087",a:4},"."],
|
[{y:-0.375,x:3.5,c:"#77aaff"},"Option\n\n\nLAlt",{x:10.5,c:"#89b087"},".\n\n\nOption"],
|
||||||
[{y:-0.875,x:2.5,c:"#cccccc",a:7},"",{x:1},"",{x:8.5,c:"#89b087",a:4},"0",{x:1},"="],
|
[{y:-0.875,x:2.5,c:"#77aaff"},"Hyper",{x:1},"Cmd\n\n\nSuper",{x:8.5,c:"#89b087"},"0\n\n\nCmd",{x:1},"=\n\n\nHyper"],
|
||||||
[{y:-0.75,x:0.5,c:"#cccccc",a:7},"","",{x:14.5,c:"#89b087",a:4},"+","Enter"],
|
[{y:-0.75,x:0.5,c:"#77aaff"},"Ctrl\n\n\nLCtrl","Meh",{x:14.5,c:"#89b087"},"+\n\n\nMeh","Enter\n\n\nCtrl"],
|
||||||
[{r:30,rx:6.5,ry:4.25,y:-1,x:1,c:"#54d6de"},"Left","Right"],
|
[{r:30,rx:6.5,ry:4.25,y:-1,x:1,c:"#54d6de"},"Left","Right"],
|
||||||
[{h:2},"Space",{h:2},"Enter","Up"],
|
[{h:2},"Space",{h:2},"Enter","Up"],
|
||||||
[{x:2},"Down"],
|
[{x:2},"Down"],
|
||||||
[{r:-30,rx:13,y:-1,x:-3},"Home","End"],
|
[{r:-30,rx:13,y:-1,x:-3},"Home","End"],
|
||||||
[{x:-3},"Page\n\n\n\n\n\nUp",{h:2},"< Del\n\n\nBackspace",{h:2},"Del >\n\n\nDelete"],
|
[{x:-3,f:3},"Page\n\n\n\n\n\nUp",{h:2},"< Del\n\n\nBackspace",{h:2},"Del >\n\n\nDelete"],
|
||||||
[{x:-3},"Page\n\n\n\n\n\nDown"]
|
[{x:-3,f:3},"Page\n\n\n\n\n\nDown"]
|
||||||
|
|
||||||
|
Before Width: | Height: | Size: 669 KiB After Width: | Height: | Size: 292 KiB |
After Width: | Height: | Size: 180 KiB |
@ -0,0 +1,376 @@
|
|||||||
|
#include "ergodox_ez.h"
|
||||||
|
#include "debug.h"
|
||||||
|
#include "action_layer.h"
|
||||||
|
#include "keymap_extras/keymap_french.h"
|
||||||
|
#include "keymap_extras/keymap_neo2.h"
|
||||||
|
#include "keymap_extras/keymap_uk.h"
|
||||||
|
#include "keymap_extras/keymap_colemak.h"
|
||||||
|
#include "keymap_extras/keymap_french_osx.h"
|
||||||
|
#include "keymap_extras/keymap_nordic.h"
|
||||||
|
#include "keymap_extras/keymap_dvorak.h"
|
||||||
|
#include "keymap_extras/keymap_german.h"
|
||||||
|
#include "keymap_extras/keymap_norwegian.c"
|
||||||
|
#include "keymap_extras/keymap_fr_ch.h"
|
||||||
|
#include "keymap_extras/keymap_german_osx.h"
|
||||||
|
#include "keymap_extras/keymap_spanish.h"
|
||||||
|
#include "keymap_extras/keymap_bepo.h"
|
||||||
|
|
||||||
|
#define BASE 0
|
||||||
|
#define SYMB 1
|
||||||
|
#define MDIA 2
|
||||||
|
#define SMLY 3
|
||||||
|
#define NUMB 4
|
||||||
|
#define EGOS 5
|
||||||
|
|
||||||
|
#define SMLY_TOG_QUOT 0
|
||||||
|
#define M_TOGGLE_5 1
|
||||||
|
#define TGH_NUM 2
|
||||||
|
#define M_DE_OSX_PLUS_CTRLALT 3
|
||||||
|
#define SM_KISS 4
|
||||||
|
#define SM_FROWN 5
|
||||||
|
#define SM_CRY 6
|
||||||
|
#define SM_SMILE 7
|
||||||
|
#define SM_SMIRK 8
|
||||||
|
#define M_LGUI_SHFT 9
|
||||||
|
#define SM_HEART 10
|
||||||
|
#define TOG_HLD_MDIA 11
|
||||||
|
#define SM_LAUGH 12
|
||||||
|
#define SM_SAD 13
|
||||||
|
#define M_DE_OSX_CIRC_CTRLCMD 14
|
||||||
|
#define M_MEH_SH_ACUT 15
|
||||||
|
|
||||||
|
//Layout keymap.c generated with ErgodoxLayoutGenerator V1.0BETA1
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
[BASE]=KEYMAP(
|
||||||
|
//left half
|
||||||
|
KC_ESC, DE_OSX_1, DE_OSX_2, DE_OSX_3, DE_OSX_4, DE_OSX_5, M(TGH_NUM),
|
||||||
|
KC_TAB, DE_OSX_Q, DE_OSX_W, DE_OSX_E, DE_OSX_R, DE_OSX_T, KC_LGUI,
|
||||||
|
KC_LALT, DE_OSX_A, DE_OSX_S, DE_OSX_D, DE_OSX_F, DE_OSX_G,
|
||||||
|
KC_LSFT, CTL_T(DE_OSX_Y), DE_OSX_X, DE_OSX_C, DE_OSX_V, DE_OSX_B, KC_LALT,
|
||||||
|
LT(SYMB,DE_OSX_LESS), M(M_DE_OSX_CIRC_CTRLCMD), M(M_DE_OSX_PLUS_CTRLALT), LSFT(KC_LCTRL), M(SMLY_TOG_QUOT),
|
||||||
|
KC_HOME, KC_END,
|
||||||
|
KC_PGUP,
|
||||||
|
KC_BSPC, KC_DEL, KC_PGDN,
|
||||||
|
//right half
|
||||||
|
M(TOG_HLD_MDIA), DE_OSX_6, DE_OSX_7, DE_OSX_8, DE_OSX_9, DE_OSX_0, DE_OSX_SS,
|
||||||
|
KC_RGUI, DE_OSX_Z, DE_OSX_U, DE_OSX_I, DE_OSX_O, DE_OSX_P, DE_OSX_UE,
|
||||||
|
DE_OSX_H, DE_OSX_J, DE_OSX_K, DE_OSX_L, DE_OSX_OE, ALT_T(DE_OSX_AE),
|
||||||
|
KC_RALT, DE_OSX_N, DE_OSX_M, DE_OSX_COMM, DE_OSX_DOT, CTL_T(DE_OSX_MINS), KC_RSFT,
|
||||||
|
MEH_T(DE_OSX_HASH), ALL_T(DE_OSX_ACUT), LGUI(KC_LSFT), LALT(KC_LSFT), LT(SYMB,DE_OSX_PLUS),
|
||||||
|
KC_LEFT, KC_RIGHT,
|
||||||
|
KC_UP,
|
||||||
|
KC_DOWN, KC_ENT, KC_SPC),
|
||||||
|
[SYMB]=KEYMAP(
|
||||||
|
//left half
|
||||||
|
KC_APPLICATION, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F5,
|
||||||
|
KC_TRNS, DE_OSX_LESS, DE_OSX_MORE, DE_OSX_EXLM, DE_OSX_QST, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, DE_OSX_HASH, DE_OSX_DLR, DE_OSX_BSLS, DE_OSX_SLSH, KC_DOT,
|
||||||
|
KC_TRNS, KC_TRNS, DE_OSX_LESS, DE_OSX_PERC, DE_OSX_PIPE, DE_OSX_TILD, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS,
|
||||||
|
KC_TRNS, KC_DEL, KC_TRNS,
|
||||||
|
//right half
|
||||||
|
KC_F6, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
|
||||||
|
KC_TRNS, DE_OSX_BSLS, DE_OSX_LBRC, DE_OSX_RBRC, DE_OSX_LESS, DE_OSX_MORE, DE_OSX_EXLM,
|
||||||
|
DE_OSX_SLSH, DE_OSX_LPRN, DE_OSX_RPRN, DE_OSX_LCBR, DE_OSX_RCBR, DE_OSX_HASH,
|
||||||
|
KC_TRNS, DE_OSX_PIPE, DE_OSX_TILD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
DE_OSX_QUOT, DE_OSX_DQOT, KC_TRNS, M(M_TOGGLE_5), KC_TRNS,
|
||||||
|
KC_F13, KC_F12,
|
||||||
|
KC_F14,
|
||||||
|
KC_F15, KC_TRNS, KC_TRNS),
|
||||||
|
[MDIA]=KEYMAP(
|
||||||
|
//left half
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D,
|
||||||
|
KC_TRNS, KC_TRNS, KC_WH_L, KC_WH_D, KC_WH_R, KC_BTN3, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
//right half
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_VOLD, KC_TRNS, KC_MPRV, KC_MNXT, KC_UP, KC_TRNS,
|
||||||
|
KC_MUTE, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT,
|
||||||
|
KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_WBAK),
|
||||||
|
[SMLY]=KEYMAP(
|
||||||
|
//left half
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
//right half
|
||||||
|
M(SM_SMILE), M(SM_SMIRK), M(SM_LAUGH), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, M(SM_FROWN), M(SM_SAD), M(SM_CRY), KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
M(SM_HEART), M(SM_KISS), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS),
|
||||||
|
[NUMB]=KEYMAP(
|
||||||
|
//left half
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
//right half
|
||||||
|
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
|
||||||
|
KC_TRNS, DE_OSX_SLSH, KC_7, KC_8, KC_9, DE_OSX_ASTR, KC_F12,
|
||||||
|
DE_OSX_SLSH, KC_4, KC_5, KC_6, DE_OSX_PLUS, DE_OSX_MINS,
|
||||||
|
KC_TRNS, DE_OSX_PERC, KC_1, KC_2, KC_3, KC_TRNS, KC_TRNS,
|
||||||
|
KC_0, KC_DOT, KC_COMM, DE_OSX_EQL, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS),
|
||||||
|
[EGOS]=KEYMAP(
|
||||||
|
//left half
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_LCTL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_F1, KC_F2,
|
||||||
|
KC_F3,
|
||||||
|
KC_SPC, KC_LCTL, KC_F4,
|
||||||
|
//right half
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, M(M_TOGGLE_5), KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS),
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t PROGMEM fn_actions[] = {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
||||||
|
{
|
||||||
|
static uint16_t start;
|
||||||
|
switch(id) {
|
||||||
|
case SMLY_TOG_QUOT:
|
||||||
|
//Macro: SMLY_TOG_QUOT//-----------------------
|
||||||
|
if (record->event.pressed) {
|
||||||
|
start = timer_read();
|
||||||
|
layer_state ^= (1<<SMLY);
|
||||||
|
layer_state &= (1<<SMLY);
|
||||||
|
return MACRO_NONE; } else {
|
||||||
|
layer_state ^= (1<<SMLY);
|
||||||
|
layer_state &= (1<<SMLY);
|
||||||
|
if (timer_elapsed(start) >150) {
|
||||||
|
return MACRO_NONE;
|
||||||
|
} else {
|
||||||
|
return MACRO(DOWN(KC_LSFT),TYPE(DE_OSX_HASH),UP(KC_LSFT),END);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case M_TOGGLE_5:
|
||||||
|
//Macro: M_TOGGLE_5//-----------------------
|
||||||
|
if (record->event.pressed){
|
||||||
|
layer_state ^= (1<<5);
|
||||||
|
layer_state &= (1<<5);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case TGH_NUM:
|
||||||
|
//Macro: TGH_NUM//-----------------------
|
||||||
|
if (record->event.pressed){
|
||||||
|
start = timer_read();
|
||||||
|
layer_state ^=(1<<NUMB);
|
||||||
|
layer_state &=(1<<NUMB);
|
||||||
|
} else {
|
||||||
|
if (timer_elapsed(start) > 150) {
|
||||||
|
layer_state^=(1<<NUMB);
|
||||||
|
layer_state&=(1<<NUMB);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return MACRO_NONE;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case M_DE_OSX_PLUS_CTRLALT:
|
||||||
|
//Macro: M_DE_OSX_PLUS_CTRLALT//-----------------------
|
||||||
|
if (record->event.pressed) {
|
||||||
|
start = timer_read();
|
||||||
|
return MACRO(DOWN(KC_LCTRL),DOWN(KC_LALT),END);
|
||||||
|
} else {
|
||||||
|
if (timer_elapsed(start) >150) {
|
||||||
|
return MACRO(U(LCTRL),U(LALT),END);
|
||||||
|
} else {
|
||||||
|
return MACRO(UP(KC_LCTRL),UP(KC_LALT),TYPE(KC_RBRC),END);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case SM_KISS:
|
||||||
|
//Macro: SM_KISS//-----------------------
|
||||||
|
if (record->event.pressed) {
|
||||||
|
return MACRO(DOWN(KC_LSFT),TYPE(KC_DOT),UP(KC_LSFT),TYPE(KC_SLSH),DOWN(KC_LSFT),TYPE(KC_RBRC),UP(KC_LSFT),END);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case SM_FROWN:
|
||||||
|
//Macro: SM_FROWN//-----------------------
|
||||||
|
if (record->event.pressed) {
|
||||||
|
return MACRO(DOWN(KC_LSFT),TYPE(KC_DOT),UP(KC_LSFT),TYPE(KC_SLSH),DOWN(KC_LALT),TYPE(KC_8),UP(KC_LALT),END);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case SM_CRY:
|
||||||
|
//Macro: SM_CRY//-----------------------
|
||||||
|
if (record->event.pressed) {
|
||||||
|
return MACRO(DOWN(KC_LSFT),TYPE(KC_COMM),UP(KC_LSFT),TYPE(KC_SLSH),DOWN(KC_LSFT),TYPE(KC_8),UP(KC_LSFT),END);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case SM_SMILE:
|
||||||
|
//Macro: SM_SMILE//-----------------------
|
||||||
|
if (record->event.pressed) {
|
||||||
|
return MACRO(DOWN(KC_LSFT),TYPE(KC_DOT),UP(KC_LSFT),TYPE(KC_SLSH),DOWN(KC_LSFT),TYPE(KC_9),UP(KC_LSFT),END);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case SM_SMIRK:
|
||||||
|
//Macro: SM_SMIRK//-----------------------
|
||||||
|
if (record->event.pressed) {
|
||||||
|
return MACRO(DOWN(KC_LSFT),TYPE(KC_COMM),UP(KC_LSFT),TYPE(KC_SLSH),DOWN(KC_LSFT),TYPE(KC_9),UP(KC_LSFT),END);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case M_LGUI_SHFT:
|
||||||
|
//Macro: M_LGUI_SHFT//-----------------------
|
||||||
|
if (record->event.pressed){
|
||||||
|
return MACRO(DOWN(KC_LGUI),DOWN(KC_LSFT),END);
|
||||||
|
}else{
|
||||||
|
return MACRO(UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),U(LGUI),U(LSFT),END);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case SM_HEART:
|
||||||
|
//Macro: SM_HEART//-----------------------
|
||||||
|
if (record->event.pressed) {
|
||||||
|
return MACRO(TYPE(KC_GRV),TYPE(KC_3),END);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case TOG_HLD_MDIA:
|
||||||
|
//Macro: TOG_HLD_MDIA//-----------------------
|
||||||
|
if (record->event.pressed){
|
||||||
|
start = timer_read();
|
||||||
|
layer_state ^=(1<<MDIA);
|
||||||
|
layer_state &=(1<<MDIA);
|
||||||
|
} else {
|
||||||
|
if (timer_elapsed(start) > 150) {
|
||||||
|
layer_state^=(1<<MDIA);
|
||||||
|
layer_state&=(1<<MDIA);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return MACRO_NONE;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case SM_LAUGH:
|
||||||
|
//Macro: SM_LAUGH//-----------------------
|
||||||
|
if (record->event.pressed) {
|
||||||
|
return MACRO(DOWN(KC_LSFT),TYPE(KC_DOT),UP(KC_LSFT),TYPE(KC_SLSH),DOWN(KC_LSFT),TYPE(KC_D),UP(KC_LSFT),END);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case SM_SAD:
|
||||||
|
//Macro: SM_SAD//-----------------------
|
||||||
|
if (record->event.pressed) {
|
||||||
|
return MACRO(DOWN(KC_LSFT),TYPE(KC_DOT),UP(KC_LSFT),TYPE(KC_SLSH),DOWN(KC_LSFT),TYPE(KC_8),UP(KC_LSFT),END);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case M_DE_OSX_CIRC_CTRLCMD:
|
||||||
|
//Macro: M_DE_OSX_CIRC_CTRLCMD//-----------------------
|
||||||
|
if (record->event.pressed) {
|
||||||
|
start = timer_read();
|
||||||
|
return MACRO(DOWN(KC_LCTRL),DOWN(KC_LGUI),END);
|
||||||
|
} else {
|
||||||
|
if (timer_elapsed(start) >150) {
|
||||||
|
return MACRO(U(LCTRL),U(LGUI),END);
|
||||||
|
} else {
|
||||||
|
return MACRO(UP(KC_LCTRL),UP(KC_LGUI),TYPE(KC_NUBS),END);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case M_MEH_SH_ACUT:
|
||||||
|
//Macro: M_MEH_SH_ACUT//-----------------------
|
||||||
|
if (record->event.pressed) {
|
||||||
|
start = timer_read();
|
||||||
|
return MACRO(DOWN(KC_LCTRL),DOWN(KC_LSFT),DOWN(KC_LALT),END);
|
||||||
|
} else {
|
||||||
|
if (timer_elapsed(start) >150) {
|
||||||
|
return MACRO(U(LCTRL),U(LSFT),U(LALT),END);
|
||||||
|
} else {
|
||||||
|
return MACRO(UP(KC_LCTRL),UP(KC_LALT),TYPE(DE_OSX_ACUT),UP(KC_LSFT),END);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return MACRO_NONE;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Runs just one time when the keyboard initializes.
|
||||||
|
void matrix_init_user(void) {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// Runs constantly in the background, in a loop.
|
||||||
|
void matrix_scan_user(void) {
|
||||||
|
|
||||||
|
uint8_t layer = biton32(layer_state);
|
||||||
|
|
||||||
|
ergodox_board_led_off();
|
||||||
|
ergodox_right_led_1_off();
|
||||||
|
ergodox_right_led_2_off();
|
||||||
|
ergodox_right_led_3_off();
|
||||||
|
switch (layer) {
|
||||||
|
|
||||||
|
case SYMB:
|
||||||
|
ergodox_right_led_1_on();
|
||||||
|
|
||||||
|
|
||||||
|
break;
|
||||||
|
case MDIA:
|
||||||
|
|
||||||
|
ergodox_right_led_2_on();
|
||||||
|
|
||||||
|
break;
|
||||||
|
case NUMB:
|
||||||
|
|
||||||
|
|
||||||
|
ergodox_right_led_3_on();
|
||||||
|
break;
|
||||||
|
case EGOS:
|
||||||
|
ergodox_right_led_1_on();
|
||||||
|
ergodox_right_led_2_on();
|
||||||
|
ergodox_right_led_3_on();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// none
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
After Width: | Height: | Size: 282 KiB |
@ -0,0 +1,229 @@
|
|||||||
|
#include "ergodox_ez.h"
|
||||||
|
#include "debug.h"
|
||||||
|
#include "action_layer.h"
|
||||||
|
|
||||||
|
#define BASE 0 // default layer
|
||||||
|
#define SYMB 1 // symbols
|
||||||
|
#define MDIA 2 // media keys
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
/* Keymap 0: Basic layer
|
||||||
|
*
|
||||||
|
* ,--------------------------------------------------. ,--------------------------------------------------.
|
||||||
|
* | ` | 1 | 2 | 3 | 4 | 5 | F5 | |Hypr+M| 6 | 7 | 8 | 9 | 0 | Mute |
|
||||||
|
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
|
||||||
|
* | Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | \ |
|
||||||
|
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
|
||||||
|
* | LGui | A | S | D | F | G |------| |------| H | J | K | L | ; | ' |
|
||||||
|
* |--------+------+------+------+------+------| SYMB | | MDIA |------+------+------+------+------+--------|
|
||||||
|
* | LShift | Z | X | C | V | B | | | | N | M | , | . | / | RShift |
|
||||||
|
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
|
||||||
|
* |Ca/Ctl| { | ( | | | : | | - | = | ) | } |C`/Ctl|
|
||||||
|
* `----------------------------------' `----------------------------------'
|
||||||
|
* ,-------------. ,-------------.
|
||||||
|
* | LGA | LAlt | | RAlt | Play |
|
||||||
|
* ,------|------|------| |------+------+------.
|
||||||
|
* | | | Home | | PgUp | | |
|
||||||
|
* |Backsp| Esc |------| |------|Enter |Space |
|
||||||
|
* |ace | | End | | PgDn | | |
|
||||||
|
* `--------------------' `--------------------'
|
||||||
|
*/
|
||||||
|
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
|
||||||
|
// Otherwise, it needs KC_*
|
||||||
|
[BASE] = KEYMAP( // layer 0 : default
|
||||||
|
// left hand
|
||||||
|
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_F5,
|
||||||
|
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC,
|
||||||
|
KC_LGUI, KC_A, KC_S, KC_D, KC_F, KC_G,
|
||||||
|
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, TG(SYMB),
|
||||||
|
F(0), KC_LCBR, KC_LPRN,KC_PIPE,KC_COLN,
|
||||||
|
LGUI(KC_LALT), KC_LALT,
|
||||||
|
KC_HOME,
|
||||||
|
KC_BSPC, KC_ESC, KC_END,
|
||||||
|
// right hand
|
||||||
|
HYPR(KC_M), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MUTE,
|
||||||
|
KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
|
||||||
|
KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
|
||||||
|
TG(MDIA), KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
|
||||||
|
KC_MINS, KC_EQL, KC_RPRN, KC_RCBR, F(1),
|
||||||
|
KC_RALT, KC_MPLY,
|
||||||
|
KC_PGUP,
|
||||||
|
KC_PGDN, KC_ENT, KC_SPC
|
||||||
|
),
|
||||||
|
/* Keymap 1: Symbol Layer
|
||||||
|
*
|
||||||
|
* ,--------------------------------------------------. ,--------------------------------------------------.
|
||||||
|
* | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
|
||||||
|
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
|
||||||
|
* | | ! | @ | { | } | | | | | | | | | | | F12 |
|
||||||
|
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
|
||||||
|
* | | # | $ | ( | ) | ` |------| |------| Left | Down | Up | Right| | |
|
||||||
|
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
|
||||||
|
* | | % | ^ | [ | ] | ~ | | | | | | | | | |
|
||||||
|
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
|
||||||
|
* | | | | | | | | | | | |
|
||||||
|
* `----------------------------------' `----------------------------------'
|
||||||
|
* ,-------------. ,-------------.
|
||||||
|
* | | | | | |
|
||||||
|
* ,------|------|------| |------+------+------.
|
||||||
|
* | | | | | | | |
|
||||||
|
* | | |------| |------| | |
|
||||||
|
* | | | | | | | |
|
||||||
|
* `--------------------' `--------------------'
|
||||||
|
*/
|
||||||
|
// SYMBOLS
|
||||||
|
[SYMB] = KEYMAP(
|
||||||
|
// left hand
|
||||||
|
KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
|
||||||
|
KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
|
||||||
|
KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
|
||||||
|
KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
|
||||||
|
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
|
||||||
|
KC_TRNS,KC_TRNS,
|
||||||
|
KC_TRNS,
|
||||||
|
KC_TRNS,KC_TRNS,KC_TRNS,
|
||||||
|
// right hand
|
||||||
|
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F12,
|
||||||
|
KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS
|
||||||
|
),
|
||||||
|
/* Keymap 2: Media and mouse keys
|
||||||
|
*
|
||||||
|
* ,--------------------------------------------------. ,--------------------------------------------------.
|
||||||
|
* | | | | | | | | | | | | | | | |
|
||||||
|
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
|
||||||
|
* | | | | | | | | | | | | | | | |
|
||||||
|
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
|
||||||
|
* | | | | | | |------| |------|MsLeft|MsDown| MsUp |MsRght| | |
|
||||||
|
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
|
||||||
|
* | | | | | | | | | | | | | | | |
|
||||||
|
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
|
||||||
|
* |VolUp |VolDn | Prev | Next | | | LClk | RClk | | | |
|
||||||
|
* `----------------------------------' `----------------------------------'
|
||||||
|
* ,-------------. ,-------------.
|
||||||
|
* | | | | | |
|
||||||
|
* ,------|------|------| |------+------+------.
|
||||||
|
* | | | | | | | |
|
||||||
|
* | | |------| |------| | |
|
||||||
|
* | | | | | | | |
|
||||||
|
* `--------------------' `--------------------'
|
||||||
|
*/
|
||||||
|
// MEDIA AND MOUSE
|
||||||
|
[MDIA] = KEYMAP(
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_VOLU, KC_VOLD, KC_MPRV, KC_MNXT, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
// right hand
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_BTN1, KC_BTN2, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_WBAK
|
||||||
|
),
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t PROGMEM fn_actions[] = {
|
||||||
|
[0] = ACTION_MACRO_TAP(0), // FN0 - Ctrl + a (For screen/tmux)
|
||||||
|
[1] = ACTION_MACRO_TAP(1) // FN1 - Ctrl + ` (For quake style console)
|
||||||
|
};
|
||||||
|
|
||||||
|
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) // this is the function signature -- just copy/paste it into your keymap file as it is.
|
||||||
|
{
|
||||||
|
switch(id) {
|
||||||
|
case 0:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
if (record->tap.count) {
|
||||||
|
if (record->tap.interrupted) {
|
||||||
|
record->tap.count = 0;
|
||||||
|
// hold press action
|
||||||
|
register_code(KC_LCTL);
|
||||||
|
} else {
|
||||||
|
// tap press action
|
||||||
|
return MACRO( D(LCTL), T(A), U(LCTL), END );
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// hold press action
|
||||||
|
register_code(KC_LCTL);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (record->tap.count) {
|
||||||
|
// tap release action
|
||||||
|
} else {
|
||||||
|
// hold release action
|
||||||
|
unregister_code(KC_LCTL);
|
||||||
|
}
|
||||||
|
record->tap.count = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
if (record->tap.count) {
|
||||||
|
if (record->tap.interrupted) {
|
||||||
|
record->tap.count = 0;
|
||||||
|
// hold press action
|
||||||
|
register_code(KC_RCTL);
|
||||||
|
} else {
|
||||||
|
// tap press action
|
||||||
|
return MACRO( DOWN(KC_RCTL), TYPE(KC_GRV), UP(KC_RCTL), END );
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// hold press action
|
||||||
|
register_code(KC_RCTL);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (record->tap.count) {
|
||||||
|
// tap release action
|
||||||
|
} else {
|
||||||
|
// hold release action
|
||||||
|
unregister_code(KC_RCTL);
|
||||||
|
}
|
||||||
|
record->tap.count = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return MACRO_NONE;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Runs just one time when the keyboard initializes.
|
||||||
|
void matrix_init_user(void) {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// Runs constantly in the background, in a loop.
|
||||||
|
void matrix_scan_user(void) {
|
||||||
|
|
||||||
|
uint8_t layer = biton32(layer_state);
|
||||||
|
|
||||||
|
ergodox_board_led_off();
|
||||||
|
ergodox_right_led_1_off();
|
||||||
|
ergodox_right_led_2_off();
|
||||||
|
ergodox_right_led_3_off();
|
||||||
|
switch (layer) {
|
||||||
|
// TODO: Make this relevant to the ErgoDox EZ.
|
||||||
|
case 1:
|
||||||
|
ergodox_right_led_1_on();
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
ergodox_right_led_2_on();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// none
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
After Width: | Height: | Size: 218 KiB |
@ -0,0 +1,11 @@
|
|||||||
|
# ErgoDox EZ Plums Configuration
|
||||||
|
|
||||||
|
## Changelog
|
||||||
|
|
||||||
|
* Apr 23, 2016 (v0.1.0):
|
||||||
|
* Shortcut for iTerm2 quake style dropdown (Ctrl+`)
|
||||||
|
* Shortcut for screen/tmux (Ctrl+a)
|
||||||
|
* Shortcut for shush (Hyper+m)
|
||||||
|
* Combo modifier for LGUI + LALT
|
||||||
|
|
||||||
|
![Plums](plums.png)
|
@ -0,0 +1,225 @@
|
|||||||
|
#include "ergodox_ez.h"
|
||||||
|
#include "debug.h"
|
||||||
|
#include "action_layer.h"
|
||||||
|
#include "keymap_plover.h"
|
||||||
|
|
||||||
|
#define BASE 0 // default layer
|
||||||
|
#define SYMB 1 // symbols
|
||||||
|
#define MDIA 2 // media keys
|
||||||
|
#define STEN 3 // steno
|
||||||
|
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
/* Keymap 0: Basic layer
|
||||||
|
*
|
||||||
|
* ,---------------------------------------------------. ,---------------------------------------------------.
|
||||||
|
* | = | 1 | 2 | 3 | 4 | 5 | STEN | | NONE | 6 | 7 | 8 | 9 | 0 | \ |
|
||||||
|
* |--------+------+------+------+-------+-------------| |-------+------+------+------+------+------+--------|
|
||||||
|
* | Del | ' | , | . | P | Y | Esc | | Caps | F | G | C | R | L | / |
|
||||||
|
* |--------+------+------+------+-------+------| | | |------+------+------+------+------+--------|
|
||||||
|
* | BkSp | A | O | E | U | I |------| |-------| D | H | T | N |S / L2|- / Cmd |
|
||||||
|
* |--------+------+------+------+-------+------| Tab | | Enter |------+------+------+------+------+--------|
|
||||||
|
* | LShift | ; | Q | J | K | X | | | | B | M | W | V | Z | RShift |
|
||||||
|
* `--------+------+------+------+-------+-------------' `--------------+------+------+------+------+--------'
|
||||||
|
* |Grv/L1| '" |AltShf| Left | Right | | Up | Down | [ | ] | ~L1 |
|
||||||
|
* `-----------------------------------' `----------------------------------'
|
||||||
|
* ,-------------. ,---------------.
|
||||||
|
* | PgUp | PgDn | | Home | End |
|
||||||
|
* ,------|------|------| |-------+-------+------.
|
||||||
|
* | | | NONE | | NONE | | |
|
||||||
|
* | Alt | NONE |------| |-------| Space | Ctrl |
|
||||||
|
* | | | Supr | | AltGr | | |
|
||||||
|
* `--------------------' `----------------------'
|
||||||
|
*/
|
||||||
|
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
|
||||||
|
// Otherwise, it needs KC_*
|
||||||
|
[BASE] = KEYMAP( // layer 0 : default
|
||||||
|
// left hand
|
||||||
|
KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, M(0),
|
||||||
|
KC_DELT, KC_QUOT, KC_COMM,KC_DOT, KC_P, KC_Y, KC_ESC,
|
||||||
|
KC_BSPC, KC_A, KC_O, KC_E, KC_U, KC_I,
|
||||||
|
KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_TAB,
|
||||||
|
LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT,KC_RGHT,
|
||||||
|
KC_PGUP,KC_PGDN,
|
||||||
|
KC_NO,
|
||||||
|
KC_LALT,KC_ENT ,KC_LGUI,
|
||||||
|
// right hand
|
||||||
|
KC_NO, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSLS,
|
||||||
|
KC_CAPS, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH,
|
||||||
|
KC_D, KC_H, KC_T, KC_N, LT(MDIA, KC_S), GUI_T(KC_MINS),
|
||||||
|
KC_ENT, KC_B, KC_M, KC_W, KC_V, KC_Z , KC_RSFT,
|
||||||
|
KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1,
|
||||||
|
KC_HOME,KC_END,
|
||||||
|
KC_NO,
|
||||||
|
KC_RALT,KC_SPC,KC_RCTL
|
||||||
|
),
|
||||||
|
/* Keymap 1: Symbol Layer
|
||||||
|
*
|
||||||
|
* ,--------------------------------------------------. ,--------------------------------------------------.
|
||||||
|
* | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
|
||||||
|
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
|
||||||
|
* | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 |
|
||||||
|
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
|
||||||
|
* | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | |
|
||||||
|
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
|
||||||
|
* | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | |
|
||||||
|
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
|
||||||
|
* | | | | | | | | . | 0 | = | |
|
||||||
|
* `----------------------------------' `----------------------------------'
|
||||||
|
* ,-------------. ,-------------.
|
||||||
|
* | | | | | |
|
||||||
|
* ,------|------|------| |------+------+------.
|
||||||
|
* | | | | | | | |
|
||||||
|
* | | |------| |------| | |
|
||||||
|
* | | | | | | | |
|
||||||
|
* `--------------------' `--------------------'
|
||||||
|
*/
|
||||||
|
// SYMBOLS
|
||||||
|
[SYMB] = KEYMAP(
|
||||||
|
// left hand
|
||||||
|
KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
|
||||||
|
KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
|
||||||
|
KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
|
||||||
|
KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
|
||||||
|
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
|
||||||
|
KC_TRNS,KC_TRNS,
|
||||||
|
KC_TRNS,
|
||||||
|
KC_TRNS,KC_TRNS,KC_TRNS,
|
||||||
|
// right hand
|
||||||
|
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
|
||||||
|
KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12,
|
||||||
|
KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS,
|
||||||
|
KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS
|
||||||
|
),
|
||||||
|
/* Keymap 2: Media and mouse keys
|
||||||
|
*
|
||||||
|
* ,--------------------------------------------------. ,--------------------------------------------------.
|
||||||
|
* | | | | | | | | | | | | | | | |
|
||||||
|
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
|
||||||
|
* | | | | MsUp | | | | | | | | | | | |
|
||||||
|
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
|
||||||
|
* | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play |
|
||||||
|
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
|
||||||
|
* | | | | | | | | | | | | Prev | Next | | |
|
||||||
|
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
|
||||||
|
* | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | |
|
||||||
|
* `----------------------------------' `----------------------------------'
|
||||||
|
* ,-------------. ,-------------.
|
||||||
|
* | | | | | |
|
||||||
|
* ,------|------|------| |------+------+------.
|
||||||
|
* | | | | | | |Brwser|
|
||||||
|
* | | |------| |------| |Back |
|
||||||
|
* | | | | | | | |
|
||||||
|
* `--------------------' `--------------------'
|
||||||
|
*/
|
||||||
|
// MEDIA AND MOUSE
|
||||||
|
[MDIA] = KEYMAP(
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
|
||||||
|
KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
// right hand
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
|
||||||
|
KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_WBAK
|
||||||
|
),
|
||||||
|
|
||||||
|
[STEN] = KEYMAP( // layout: layer 4: Steno for Plover
|
||||||
|
// left hand
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS,
|
||||||
|
KC_NO, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_STAR,
|
||||||
|
KC_NO, PV_LS, PV_LT, PV_LP, PV_LH, PV_STAR,
|
||||||
|
KC_NO, PV_LS, PV_LK, PV_LW, PV_LR, PV_STAR, PV_STAR,
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_TRNS, KC_TRNS,
|
||||||
|
KC_NO, KC_NO,
|
||||||
|
KC_NO,
|
||||||
|
PV_A, PV_O, KC_NO,
|
||||||
|
// right hand
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
|
||||||
|
PV_STAR, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM,
|
||||||
|
PV_STAR, PV_RF, PV_RP, PV_RL, PV_RT, PV_RD,
|
||||||
|
PV_STAR, PV_STAR, PV_RR, PV_RB, PV_RG, PV_RS, PV_RZ,
|
||||||
|
KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_NO,
|
||||||
|
KC_NO, KC_NO,
|
||||||
|
KC_NO,
|
||||||
|
KC_NO, PV_E, PV_U
|
||||||
|
),
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t PROGMEM fn_actions[] = {
|
||||||
|
[1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols)
|
||||||
|
};
|
||||||
|
|
||||||
|
void toggle_steno(int pressed)
|
||||||
|
{
|
||||||
|
uint8_t layer = biton32(layer_state);
|
||||||
|
|
||||||
|
if (pressed) {
|
||||||
|
if (layer != STEN) layer_on(STEN); else layer_off(STEN);
|
||||||
|
|
||||||
|
register_code(PV_LS);
|
||||||
|
register_code(PV_LH);
|
||||||
|
register_code(PV_RF);
|
||||||
|
register_code(PV_RT);
|
||||||
|
} else {
|
||||||
|
unregister_code(PV_LS);
|
||||||
|
unregister_code(PV_LH);
|
||||||
|
unregister_code(PV_RF);
|
||||||
|
unregister_code(PV_RT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
||||||
|
{
|
||||||
|
// MACRODOWN only works in this function
|
||||||
|
switch(id) {
|
||||||
|
case 0:
|
||||||
|
toggle_steno(record->event.pressed);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return MACRO_NONE;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Runs just one time when the keyboard initializes.
|
||||||
|
void matrix_init_user(void) {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// Runs constantly in the background, in a loop.
|
||||||
|
void matrix_scan_user(void) {
|
||||||
|
uint8_t layer = biton32(layer_state);
|
||||||
|
|
||||||
|
ergodox_board_led_off();
|
||||||
|
ergodox_right_led_1_off();
|
||||||
|
ergodox_right_led_2_off();
|
||||||
|
ergodox_right_led_3_off();
|
||||||
|
switch (layer) {
|
||||||
|
// TODO: Make this relevant to the ErgoDox EZ.
|
||||||
|
case 1:
|
||||||
|
ergodox_right_led_1_on();
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
ergodox_right_led_2_on();
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
ergodox_right_led_3_on();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// none
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
@ -0,0 +1,140 @@
|
|||||||
|
#----------------------------------------------------------------------------
|
||||||
|
# On command line:
|
||||||
|
#
|
||||||
|
# make all = Make software.
|
||||||
|
#
|
||||||
|
# make clean = Clean out built project files.
|
||||||
|
#
|
||||||
|
# make coff = Convert ELF to AVR COFF.
|
||||||
|
#
|
||||||
|
# make extcoff = Convert ELF to AVR Extended COFF.
|
||||||
|
#
|
||||||
|
# make program = Download the hex file to the device.
|
||||||
|
# Please customize your programmer settings(PROGRAM_CMD)
|
||||||
|
#
|
||||||
|
# make teensy = Download the hex file to the device, using teensy_loader_cli.
|
||||||
|
# (must have teensy_loader_cli installed).
|
||||||
|
#
|
||||||
|
# make dfu = Download the hex file to the device, using dfu-programmer (must
|
||||||
|
# have dfu-programmer installed).
|
||||||
|
#
|
||||||
|
# make flip = Download the hex file to the device, using Atmel FLIP (must
|
||||||
|
# have Atmel FLIP installed).
|
||||||
|
#
|
||||||
|
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
|
||||||
|
# (must have dfu-programmer installed).
|
||||||
|
#
|
||||||
|
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
|
||||||
|
# (must have Atmel FLIP installed).
|
||||||
|
#
|
||||||
|
# make debug = Start either simulavr or avarice as specified for debugging,
|
||||||
|
# with avr-gdb or avr-insight as the front end for debugging.
|
||||||
|
#
|
||||||
|
# make filename.s = Just compile filename.c into the assembler code only.
|
||||||
|
#
|
||||||
|
# make filename.i = Create a preprocessed source file for use in submitting
|
||||||
|
# bug reports to the GCC project.
|
||||||
|
#
|
||||||
|
# To rebuild project do "make clean" then "make all".
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Target file name (without extension).
|
||||||
|
TARGET = gh60
|
||||||
|
|
||||||
|
|
||||||
|
# Directory common source filess exist
|
||||||
|
TOP_DIR = ../..
|
||||||
|
TMK_DIR = ../../tmk_core
|
||||||
|
|
||||||
|
# Directory keyboard dependent files exist
|
||||||
|
TARGET_DIR = .
|
||||||
|
|
||||||
|
# # project specific files
|
||||||
|
SRC = gh60.c
|
||||||
|
|
||||||
|
ifdef KEYMAP
|
||||||
|
SRC := keymaps/$(KEYMAP).c $(SRC)
|
||||||
|
else
|
||||||
|
SRC := keymaps/default.c $(SRC)
|
||||||
|
endif
|
||||||
|
|
||||||
|
CONFIG_H = config.h
|
||||||
|
|
||||||
|
# MCU name
|
||||||
|
#MCU = at90usb1287
|
||||||
|
MCU = atmega32u4
|
||||||
|
|
||||||
|
# Processor frequency.
|
||||||
|
# This will define a symbol, F_CPU, in all source code files equal to the
|
||||||
|
# processor frequency in Hz. You can then use this symbol in your source code to
|
||||||
|
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
|
||||||
|
# automatically to create a 32-bit value in your source code.
|
||||||
|
#
|
||||||
|
# This will be an integer division of F_USB below, as it is sourced by
|
||||||
|
# F_USB after it has run through any CPU prescalers. Note that this value
|
||||||
|
# does not *change* the processor frequency - it should merely be updated to
|
||||||
|
# reflect the processor speed set externally so that the code can use accurate
|
||||||
|
# software delays.
|
||||||
|
F_CPU = 16000000
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# LUFA specific
|
||||||
|
#
|
||||||
|
# Target architecture (see library "Board Types" documentation).
|
||||||
|
ARCH = AVR8
|
||||||
|
|
||||||
|
# Input clock frequency.
|
||||||
|
# This will define a symbol, F_USB, in all source code files equal to the
|
||||||
|
# input clock frequency (before any prescaling is performed) in Hz. This value may
|
||||||
|
# differ from F_CPU if prescaling is used on the latter, and is required as the
|
||||||
|
# raw input clock is fed directly to the PLL sections of the AVR for high speed
|
||||||
|
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
|
||||||
|
# at the end, this will be done automatically to create a 32-bit value in your
|
||||||
|
# source code.
|
||||||
|
#
|
||||||
|
# If no clock division is performed on the input clock inside the AVR (via the
|
||||||
|
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
|
||||||
|
F_USB = $(F_CPU)
|
||||||
|
|
||||||
|
# Interrupt driven control endpoint task(+60)
|
||||||
|
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
|
||||||
|
|
||||||
|
|
||||||
|
# Boot Section Size in *bytes*
|
||||||
|
# Teensy halfKay 512
|
||||||
|
# Teensy++ halfKay 1024
|
||||||
|
# Atmel DFU loader 4096
|
||||||
|
# LUFA bootloader 4096
|
||||||
|
# USBaspLoader 2048
|
||||||
|
OPT_DEFS += -DBOOTLOADER_SIZE=4096
|
||||||
|
|
||||||
|
|
||||||
|
# Build Options
|
||||||
|
# comment out to disable the options.
|
||||||
|
#
|
||||||
|
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
|
||||||
|
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
|
||||||
|
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
||||||
|
# CONSOLE_ENABLE = yes # Console for debug(+400)
|
||||||
|
# COMMAND_ENABLE = yes # Commands for debug and configuration
|
||||||
|
KEYBOARD_LOCK_ENABLE = yes # Allow locking of keyboard via magic key
|
||||||
|
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||||
|
# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
|
||||||
|
NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||||
|
# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
|
||||||
|
# MIDI_ENABLE = YES # MIDI controls
|
||||||
|
# UNICODE_ENABLE = YES # Unicode
|
||||||
|
# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
|
|
||||||
|
|
||||||
|
# Optimize size but this may cause error "relocation truncated to fit"
|
||||||
|
#EXTRALDFLAGS = -Wl,--relax
|
||||||
|
|
||||||
|
# Search Path
|
||||||
|
VPATH += $(TARGET_DIR)
|
||||||
|
VPATH += $(TOP_DIR)
|
||||||
|
VPATH += $(TMK_DIR)
|
||||||
|
|
||||||
|
include $(TOP_DIR)/quantum/quantum.mk
|
||||||
|
|
@ -0,0 +1,60 @@
|
|||||||
|
## gh60 Rev C keyboard firmware
|
||||||
|
|
||||||
|
![gh60 Rev C PCB](gh60revc.jpg)
|
||||||
|
|
||||||
|
/* Column pin configuration
|
||||||
|
* col: 0 1 2 3 4 5 6 7 8 9 10 11 12 13
|
||||||
|
* pin: F0 F1 E6 C7 C6 B6 D4 B1 B7 B5 B4 D7 D6 B3 (Rev.C)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Row pin configuration
|
||||||
|
* row: 0 1 2 3 4
|
||||||
|
* pin: D0 D1 D2 D3 D5
|
||||||
|
*/
|
||||||
|
|
||||||
|
GPIO pads
|
||||||
|
0 F7 WASD LEDs
|
||||||
|
1 F6 ESC LED
|
||||||
|
2 F5 FN LED
|
||||||
|
3 F4 POKER Arrow LEDs
|
||||||
|
|
||||||
|
B2 Capslock LED
|
||||||
|
B0 not connected
|
||||||
|
|
||||||
|
Functions to controls LED clusters
|
||||||
|
|
||||||
|
gh60_caps_led_on()
|
||||||
|
gh60_poker_leds_on()
|
||||||
|
gh60_fn_led_on()
|
||||||
|
gh60_esc_led_on()
|
||||||
|
gh60_wasd_leds_on()
|
||||||
|
|
||||||
|
gh60_caps_led_off()
|
||||||
|
gh60_poker_leds_off()
|
||||||
|
gh60_fn_led_off()
|
||||||
|
gh60_esc_led_off()
|
||||||
|
gh60_wasd_leds_off()
|
||||||
|
|
||||||
|
======================
|
||||||
|
|
||||||
|
## Quantum MK Firmware
|
||||||
|
|
||||||
|
For the full Quantum feature list, see [the parent README.md](/README.md).
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
Download or clone the whole firmware and navigate to the keyboard/gh60_rev_c folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file.
|
||||||
|
|
||||||
|
Depending on which keymap you would like to use, you will have to compile slightly differently.
|
||||||
|
|
||||||
|
### Default
|
||||||
|
To build with the default keymap, simply run `make`.
|
||||||
|
|
||||||
|
### Other Keymaps
|
||||||
|
Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` in the keymaps folder, and see keymap document (you can find in top README.md) and existent keymap files.
|
||||||
|
|
||||||
|
To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like:
|
||||||
|
```
|
||||||
|
$ make KEYMAP=[default|jack|<name>]
|
||||||
|
```
|
||||||
|
Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
|
@ -0,0 +1,157 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2012 Jun Wako <wakojun@gmail.com>
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CONFIG_H
|
||||||
|
#define CONFIG_H
|
||||||
|
|
||||||
|
#include "config_common.h"
|
||||||
|
|
||||||
|
/* USB Device descriptor parameter */
|
||||||
|
#define VENDOR_ID 0xFEED
|
||||||
|
#define PRODUCT_ID 0x6060
|
||||||
|
#define DEVICE_VER 0x0001
|
||||||
|
#define MANUFACTURER You
|
||||||
|
#define PRODUCT gh60
|
||||||
|
#define DESCRIPTION A custom keyboard
|
||||||
|
|
||||||
|
/* key matrix size */
|
||||||
|
#define MATRIX_ROWS 5
|
||||||
|
#define MATRIX_COLS 14
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Keyboard Matrix Assignments
|
||||||
|
*
|
||||||
|
* Change this to how you wired your keyboard
|
||||||
|
* COLS: AVR pins used for columns, left to right
|
||||||
|
* ROWS: AVR pins used for rows, top to bottom
|
||||||
|
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
|
||||||
|
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#define COLS (int []){ F0, F1, E6, C7, C6, B6, D4, B1, B7, B5, B4, D7, D6, B3 }
|
||||||
|
#define ROWS (int []){ D0, D1, D2, D3, D5 }
|
||||||
|
|
||||||
|
/* COL2ROW or ROW2COL */
|
||||||
|
#define DIODE_DIRECTION COL2ROW
|
||||||
|
|
||||||
|
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
|
||||||
|
#define DEBOUNCE 5
|
||||||
|
|
||||||
|
/* define if matrix has ghost (lacks anti-ghosting diodes) */
|
||||||
|
//#define MATRIX_HAS_GHOST
|
||||||
|
|
||||||
|
/* number of backlight levels */
|
||||||
|
#define BACKLIGHT_LEVELS 3
|
||||||
|
|
||||||
|
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
|
||||||
|
#define LOCKING_SUPPORT_ENABLE
|
||||||
|
/* Locking resynchronize hack */
|
||||||
|
#define LOCKING_RESYNC_ENABLE
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Force NKRO
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
* makefile for this to work.)
|
||||||
|
*
|
||||||
|
* If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
|
||||||
|
* until the next keyboard reset.
|
||||||
|
*
|
||||||
|
* NKRO may prevent your keystrokes from being detected in the BIOS, but it is
|
||||||
|
* fully operational during normal computer usage.
|
||||||
|
*
|
||||||
|
* For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
|
||||||
|
* or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
|
||||||
|
* bootmagic, NKRO mode will always be enabled until it is toggled again during a
|
||||||
|
* power-up.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//#define FORCE_NKRO
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Magic Key Options
|
||||||
|
*
|
||||||
|
* Magic keys are hotkey commands that allow control over firmware functions of
|
||||||
|
* the keyboard. They are best used in combination with the HID Listen program,
|
||||||
|
* found here: https://www.pjrc.com/teensy/hid_listen.html
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* key combination for magic key command */
|
||||||
|
#define IS_COMMAND() ( \
|
||||||
|
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
|
||||||
|
)
|
||||||
|
|
||||||
|
/* control how magic key switches layers */
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
|
||||||
|
|
||||||
|
/* override magic key keymap */
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
|
||||||
|
//#define MAGIC_KEY_HELP1 H
|
||||||
|
//#define MAGIC_KEY_HELP2 SLASH
|
||||||
|
//#define MAGIC_KEY_DEBUG D
|
||||||
|
//#define MAGIC_KEY_DEBUG_MATRIX X
|
||||||
|
//#define MAGIC_KEY_DEBUG_KBD K
|
||||||
|
//#define MAGIC_KEY_DEBUG_MOUSE M
|
||||||
|
//#define MAGIC_KEY_VERSION V
|
||||||
|
//#define MAGIC_KEY_STATUS S
|
||||||
|
//#define MAGIC_KEY_CONSOLE C
|
||||||
|
//#define MAGIC_KEY_LAYER0_ALT1 ESC
|
||||||
|
//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
|
||||||
|
//#define MAGIC_KEY_LAYER0 0
|
||||||
|
//#define MAGIC_KEY_LAYER1 1
|
||||||
|
//#define MAGIC_KEY_LAYER2 2
|
||||||
|
//#define MAGIC_KEY_LAYER3 3
|
||||||
|
//#define MAGIC_KEY_LAYER4 4
|
||||||
|
//#define MAGIC_KEY_LAYER5 5
|
||||||
|
//#define MAGIC_KEY_LAYER6 6
|
||||||
|
//#define MAGIC_KEY_LAYER7 7
|
||||||
|
//#define MAGIC_KEY_LAYER8 8
|
||||||
|
//#define MAGIC_KEY_LAYER9 9
|
||||||
|
//#define MAGIC_KEY_BOOTLOADER PAUSE
|
||||||
|
//#define MAGIC_KEY_LOCK CAPS
|
||||||
|
//#define MAGIC_KEY_EEPROM E
|
||||||
|
//#define MAGIC_KEY_NKRO N
|
||||||
|
//#define MAGIC_KEY_SLEEP_LED Z
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Feature disable options
|
||||||
|
* These options are also useful to firmware size reduction.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* disable debug print */
|
||||||
|
//#define NO_DEBUG
|
||||||
|
|
||||||
|
/* disable print */
|
||||||
|
//#define NO_PRINT
|
||||||
|
|
||||||
|
/* disable action features */
|
||||||
|
//#define NO_ACTION_LAYER
|
||||||
|
//#define NO_ACTION_TAPPING
|
||||||
|
//#define NO_ACTION_ONESHOT
|
||||||
|
//#define NO_ACTION_MACRO
|
||||||
|
//#define NO_ACTION_FUNCTION
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,67 @@
|
|||||||
|
#include "gh60.h"
|
||||||
|
#include "led.h"
|
||||||
|
|
||||||
|
__attribute__ ((weak))
|
||||||
|
void matrix_init_user(void) {
|
||||||
|
// leave this function blank - it can be defined in a keymap file
|
||||||
|
};
|
||||||
|
|
||||||
|
__attribute__ ((weak))
|
||||||
|
void matrix_scan_user(void) {
|
||||||
|
// 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) {
|
||||||
|
// put your keyboard start-up code here
|
||||||
|
// runs once when the firmware starts up
|
||||||
|
|
||||||
|
matrix_init_user();
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_scan_kb(void) {
|
||||||
|
// put your looping keyboard code here
|
||||||
|
// runs every cycle (a lot)
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
|
||||||
|
gh60_caps_led_on();
|
||||||
|
} else {
|
||||||
|
gh60_caps_led_off();
|
||||||
|
}
|
||||||
|
|
||||||
|
// if (usb_led & (1<<USB_LED_NUM_LOCK)) {
|
||||||
|
// gh60_esc_led_on();
|
||||||
|
// } else {
|
||||||
|
// gh60_esc_led_off();
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if (usb_led & (1<<USB_LED_SCROLL_LOCK)) {
|
||||||
|
// gh60_fn_led_on();
|
||||||
|
// } else {
|
||||||
|
// gh60_fn_led_off();
|
||||||
|
// }
|
||||||
|
|
||||||
|
led_set_user(usb_led);
|
||||||
|
}
|
@ -0,0 +1,81 @@
|
|||||||
|
#ifndef GH60_H
|
||||||
|
#define GH60_H
|
||||||
|
|
||||||
|
#include "matrix.h"
|
||||||
|
#include "keymap_common.h"
|
||||||
|
#include "backlight.h"
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
/* GH60 LEDs
|
||||||
|
* GPIO pads
|
||||||
|
* 0 F7 WASD LEDs
|
||||||
|
* 1 F6 ESC LED
|
||||||
|
* 2 F5 FN LED
|
||||||
|
* 3 F4 POKER Arrow LEDs
|
||||||
|
* B2 Capslock LED
|
||||||
|
* B0 not connected
|
||||||
|
*/
|
||||||
|
inline void gh60_caps_led_on(void) { DDRB |= (1<<2); PORTB &= ~(1<<2); }
|
||||||
|
inline void gh60_poker_leds_on(void) { DDRF |= (1<<4); PORTF &= ~(1<<4); }
|
||||||
|
inline void gh60_fn_led_on(void) { DDRF |= (1<<5); PORTF &= ~(1<<5); }
|
||||||
|
inline void gh60_esc_led_on(void) { DDRF |= (1<<6); PORTF &= ~(1<<6); }
|
||||||
|
inline void gh60_wasd_leds_on(void) { DDRF |= (1<<7); PORTF &= ~(1<<7); }
|
||||||
|
|
||||||
|
inline void gh60_caps_led_off(void) { DDRB &= ~(1<<2); PORTB &= ~(1<<2); }
|
||||||
|
inline void gh60_poker_leds_off(void) { DDRF &= ~(1<<4); PORTF &= ~(1<<4); }
|
||||||
|
inline void gh60_fn_led_off(void) { DDRF &= ~(1<<5); PORTF &= ~(1<<5); }
|
||||||
|
inline void gh60_esc_led_off(void) { DDRF &= ~(1<<6); PORTF &= ~(1<<6); }
|
||||||
|
inline void gh60_wasd_leds_off(void) { DDRF &= ~(1<<7); PORTF &= ~(1<<7); }
|
||||||
|
|
||||||
|
/* GH60 keymap definition macro
|
||||||
|
* K2C, K31 and K3C are extra keys for ISO
|
||||||
|
*/
|
||||||
|
#define KEYMAP( \
|
||||||
|
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
|
||||||
|
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
|
||||||
|
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \
|
||||||
|
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
|
||||||
|
K40, K41, K42, K45, K49, K4A, K4B, K4C, K4D \
|
||||||
|
) { \
|
||||||
|
{ KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D }, \
|
||||||
|
{ KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D }, \
|
||||||
|
{ KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D }, \
|
||||||
|
{ KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D }, \
|
||||||
|
{ KC_##K40, KC_##K41, KC_##K42, KC_NO, KC_NO, KC_##K45, KC_NO, KC_NO, KC_NO, KC_##K49, KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D } \
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ANSI valiant. No extra keys for ISO */
|
||||||
|
#define KEYMAP_ANSI( \
|
||||||
|
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
|
||||||
|
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
|
||||||
|
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \
|
||||||
|
K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, \
|
||||||
|
K40, K41, K42, K45, K4A, K4B, K4C, K4D \
|
||||||
|
) KEYMAP( \
|
||||||
|
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
|
||||||
|
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
|
||||||
|
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, NO, K2D, \
|
||||||
|
K30, NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, NO, K3D, \
|
||||||
|
K40, K41, K42, K45, NO, K4A, K4B, K4C, K4D \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define KEYMAP_HHKB( \
|
||||||
|
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K49,\
|
||||||
|
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
|
||||||
|
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \
|
||||||
|
K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3C, \
|
||||||
|
K40, K41, K42, K45, K4A, K4B, K4C, K4D \
|
||||||
|
) KEYMAP( \
|
||||||
|
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
|
||||||
|
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
|
||||||
|
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, NO, K2D, \
|
||||||
|
K30, NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
|
||||||
|
K40, K41, K42, K45, K49, K4A, K4B, K4C, K4D \
|
||||||
|
)
|
||||||
|
|
||||||
|
void matrix_init_user(void);
|
||||||
|
void matrix_scan_user(void);
|
||||||
|
void process_action_user(keyrecord_t *record);
|
||||||
|
void led_set_user(uint8_t usb_led);
|
||||||
|
|
||||||
|
#endif
|
After Width: | Height: | Size: 1.4 MiB |
@ -0,0 +1,69 @@
|
|||||||
|
#include "gh60.h"
|
||||||
|
#include "action_layer.h"
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
/* 0: qwerty */
|
||||||
|
KEYMAP(
|
||||||
|
ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, GRV, \
|
||||||
|
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, \
|
||||||
|
CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT,NO, ENT, \
|
||||||
|
LSFT,FN1, Z, X, C, V, B, N, M, COMM,DOT, SLSH,FN0, RSFT, \
|
||||||
|
LCTL,LGUI,LALT, SPC, BSLS,RALT,RGUI,APP, RCTL),
|
||||||
|
/* 1: fn */
|
||||||
|
KEYMAP(
|
||||||
|
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, \
|
||||||
|
TRNS,TRNS,UP, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
|
||||||
|
TRNS,LEFT,DOWN,RGHT,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
|
||||||
|
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
|
||||||
|
TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS),
|
||||||
|
/* 2: arrows */
|
||||||
|
KEYMAP(
|
||||||
|
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
|
||||||
|
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
|
||||||
|
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
|
||||||
|
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,UP, \
|
||||||
|
TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,LEFT,DOWN,RGHT),
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t PROGMEM fn_actions[] = {
|
||||||
|
[0] = ACTION_LAYER_MOMENTARY(1), // to Fn overlay
|
||||||
|
[1] = ACTION_LAYER_TOGGLE(2), // toggle arrow overlay
|
||||||
|
};
|
||||||
|
|
||||||
|
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
||||||
|
{
|
||||||
|
// MACRODOWN only works in this function
|
||||||
|
switch(id) {
|
||||||
|
case 0:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
register_code(KC_RSFT);
|
||||||
|
} else {
|
||||||
|
unregister_code(KC_RSFT);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return MACRO_NONE;
|
||||||
|
};
|
||||||
|
|
||||||
|
void matrix_scan_user(void) {
|
||||||
|
|
||||||
|
//Layer LED indicators
|
||||||
|
uint32_t layer = layer_state;
|
||||||
|
|
||||||
|
if (layer & (1<<1)) {
|
||||||
|
gh60_wasd_leds_on();
|
||||||
|
gh60_fn_led_on();
|
||||||
|
} else {
|
||||||
|
gh60_wasd_leds_off();
|
||||||
|
gh60_fn_led_off();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (layer & (1<<2)) {
|
||||||
|
gh60_poker_leds_on();
|
||||||
|
gh60_esc_led_on();
|
||||||
|
} else {
|
||||||
|
gh60_poker_leds_off();
|
||||||
|
gh60_esc_led_off();
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
@ -0,0 +1,18 @@
|
|||||||
|
/* Column pin configuration
|
||||||
|
* col: 0 1 2 3 4 5 6 7 8 9 10 11 12 13
|
||||||
|
* pin: F0 F1 E6 C7 C6 B6 D4 B1 B7 B5 B4 D7 D6 B3 (Rev.C)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Row pin configuration
|
||||||
|
* row: 0 1 2 3 4
|
||||||
|
* pin: D0 D1 D2 D3 D5
|
||||||
|
*/
|
||||||
|
|
||||||
|
GPIO pads
|
||||||
|
0 F7 WASD LEDs
|
||||||
|
1 F6 ESC LED
|
||||||
|
2 F5 FN LED
|
||||||
|
3 F4 POKER Arrow LEDs
|
||||||
|
|
||||||
|
B2 Capslock LED
|
||||||
|
B0 not connected
|
@ -1,34 +1,2 @@
|
|||||||
# The Default Planck Layout
|
# The Default Planck Layout
|
||||||
|
|
||||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|
||||||
[_QW] = { /* Qwerty */
|
|
||||||
{KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
|
|
||||||
{KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
|
|
||||||
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
|
|
||||||
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
|
|
||||||
},
|
|
||||||
[_CM] = { /* Colemak */
|
|
||||||
{KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
|
|
||||||
{KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
|
|
||||||
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
|
|
||||||
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
|
|
||||||
},
|
|
||||||
[_DV] = { /* Dvorak */
|
|
||||||
{KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC},
|
|
||||||
{KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH},
|
|
||||||
{KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT },
|
|
||||||
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
|
|
||||||
},
|
|
||||||
[_RS] = { /* RAISE */
|
|
||||||
{KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
|
|
||||||
{KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
|
|
||||||
{KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
|
|
||||||
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
|
|
||||||
},
|
|
||||||
[_LW] = { /* LOWER */
|
|
||||||
{KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
|
|
||||||
{KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
|
|
||||||
{KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
|
|
||||||
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
|
|
||||||
}
|
|
||||||
};
|
|
@ -0,0 +1,2 @@
|
|||||||
|
AUDIO_ENABLE = yes
|
||||||
|
NKRO_ENABLE = yes
|
@ -0,0 +1,88 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2012 Jun Wako <wakojun@gmail.com>
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CONFIG_H
|
||||||
|
#define CONFIG_H
|
||||||
|
|
||||||
|
#include "config_common.h"
|
||||||
|
|
||||||
|
/* USB Device descriptor parameter */
|
||||||
|
#define VENDOR_ID 0xFEED
|
||||||
|
#define PRODUCT_ID 0x6060
|
||||||
|
#define DEVICE_VER 0x0001
|
||||||
|
#define MANUFACTURER Ortholinear Keyboards
|
||||||
|
#define PRODUCT The Planck Keyboard
|
||||||
|
#define DESCRIPTION A compact ortholinear keyboard
|
||||||
|
|
||||||
|
/* key matrix size */
|
||||||
|
#define MATRIX_ROWS 4
|
||||||
|
#define MATRIX_COLS 12
|
||||||
|
|
||||||
|
/* Planck PCB default pin-out */
|
||||||
|
#define COLS (int []){ F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 }
|
||||||
|
#define ROWS (int []){ D0, D5, B5, B6 }
|
||||||
|
|
||||||
|
/* COL2ROW or ROW2COL */
|
||||||
|
#define DIODE_DIRECTION COL2ROW
|
||||||
|
|
||||||
|
/* define if matrix has ghost */
|
||||||
|
//#define MATRIX_HAS_GHOST
|
||||||
|
|
||||||
|
/* number of backlight levels */
|
||||||
|
#define BACKLIGHT_LEVELS 3
|
||||||
|
|
||||||
|
/* Set 0 if debouncing isn't needed */
|
||||||
|
#define DEBOUNCE 5
|
||||||
|
|
||||||
|
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
|
||||||
|
#define LOCKING_SUPPORT_ENABLE
|
||||||
|
/* Locking resynchronize hack */
|
||||||
|
#define LOCKING_RESYNC_ENABLE
|
||||||
|
|
||||||
|
/* key combination for command */
|
||||||
|
#define IS_COMMAND() ( \
|
||||||
|
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
|
||||||
|
)
|
||||||
|
|
||||||
|
/* ws2812 RGB LED */
|
||||||
|
#define ws2812_PORTREG PORTD
|
||||||
|
#define ws2812_DDRREG DDRD
|
||||||
|
#define ws2812_pin PD1
|
||||||
|
#define RGBLED_NUM 28 // Number of LEDs
|
||||||
|
#define RGBLIGHT_HUE_STEP 10
|
||||||
|
#define RGBLIGHT_SAT_STEP 17
|
||||||
|
#define RGBLIGHT_VAL_STEP 17
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Feature disable options
|
||||||
|
* These options are also useful to firmware size reduction.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* disable debug print */
|
||||||
|
//#define NO_DEBUG
|
||||||
|
|
||||||
|
/* disable print */
|
||||||
|
//#define NO_PRINT
|
||||||
|
|
||||||
|
/* disable action features */
|
||||||
|
//#define NO_ACTION_LAYER
|
||||||
|
//#define NO_ACTION_TAPPING
|
||||||
|
//#define NO_ACTION_ONESHOT
|
||||||
|
//#define NO_ACTION_MACRO
|
||||||
|
//#define NO_ACTION_FUNCTION
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,536 @@
|
|||||||
|
#include "planck.h"
|
||||||
|
#include "action_layer.h"
|
||||||
|
#include "eeconfig.h"
|
||||||
|
#include "led.h"
|
||||||
|
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
#include "audio.h"
|
||||||
|
#include "song_list.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define LAYER_QWERTY 0
|
||||||
|
#define LAYER_COLEMAK 1
|
||||||
|
#define LAYER_DVORAK 2
|
||||||
|
#define LAYER_LOWER 3
|
||||||
|
#define LAYER_RAISE 4
|
||||||
|
#define LAYER_FUNCTION 5
|
||||||
|
#define LAYER_MOUSE 6
|
||||||
|
#define LAYER_MUSIC 7
|
||||||
|
#define LAYER_ADJUST 8
|
||||||
|
|
||||||
|
#define MACRO_QWERTY 0
|
||||||
|
#define MACRO_COLEMAK 1
|
||||||
|
#define MACRO_DVORAK 2
|
||||||
|
#define MACRO_LOWER 3
|
||||||
|
#define MACRO_RAISE 4
|
||||||
|
#define MACRO_FUNCTION 5
|
||||||
|
#define MACRO_MOUSE 6
|
||||||
|
#define MACRO_TIMBRE_1 7
|
||||||
|
#define MACRO_TIMBRE_2 8
|
||||||
|
#define MACRO_TIMBRE_3 9
|
||||||
|
#define MACRO_TIMBRE_4 10
|
||||||
|
#define MACRO_TEMPO_U 11
|
||||||
|
#define MACRO_TEMPO_D 12
|
||||||
|
#define MACRO_TONE_DEFAULT 13
|
||||||
|
#define MACRO_MUSIC_ON 14
|
||||||
|
#define MACRO_MUSIC_OFF 15
|
||||||
|
#define MACRO_AUDIO_ON 16
|
||||||
|
#define MACRO_AUDIO_OFF 17
|
||||||
|
#define MACRO_INC_VOICE 18
|
||||||
|
#define MACRO_DEC_VOICE 19
|
||||||
|
|
||||||
|
#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 M_MOUSE M(MACRO_MOUSE)
|
||||||
|
#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 VC_UP M(MACRO_INC_VOICE)
|
||||||
|
#define VC_DOWN M(MACRO_DEC_VOICE)
|
||||||
|
|
||||||
|
|
||||||
|
#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 XXXXXXX KC_NO
|
||||||
|
#define ________________ _______, _______
|
||||||
|
#define XXXXXXXXXXXXXXXX XXXXXXX, XXXXXXX
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
|
||||||
|
/* QWERTY
|
||||||
|
* .-----------------------------------------------------------------------------------------------------------.
|
||||||
|
* | TAB | Q | W | E | R | T | Y | U | I | O | P | BACKSP |
|
||||||
|
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
|
||||||
|
* | ESC | A | S | D | F | G | H | J | K | L | ; | ' |
|
||||||
|
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
|
||||||
|
* | LSHIFT | Z | X | C | V | B | N | M | , | . | / | ENTER |
|
||||||
|
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
|
||||||
|
* | LCTRL | LWIN | FN | LALT | RAISE | SPACE | SPACE | LOWER | UP | DOWN | LEFT | RIGHT |
|
||||||
|
* '-----------------------------------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
|
||||||
|
[LAYER_QWERTY] = { /* QWERTY */
|
||||||
|
{ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC },
|
||||||
|
{ KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT },
|
||||||
|
{ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
|
||||||
|
{ KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC, KC_SPC, M_LOWER, KC_UP, KC_DOWN, KC_LEFT, KC_RGHT },
|
||||||
|
},
|
||||||
|
|
||||||
|
/* COLEMAK
|
||||||
|
* .-----------------------------------------------------------------------------------------------------------.
|
||||||
|
* | TAB | Q | W | F | P | G | J | L | U | Y | ; | ESC |
|
||||||
|
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
|
||||||
|
* | BACKSP | A | R | S | T | D | H | N | E | I | O | ' |
|
||||||
|
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
|
||||||
|
* | LSHIFT | Z | X | C | V | B | K | M | , | . | / | ENTER |
|
||||||
|
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
|
||||||
|
* | LCTRL | LWIN | FN | LALT | RAISE | SPACE | SPACE | LOWER | UP | DOWN | LEFT | RIGHT |
|
||||||
|
* '-----------------------------------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
|
||||||
|
[LAYER_COLEMAK] = { /* COLEMAK */
|
||||||
|
{ KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_ESC },
|
||||||
|
{ KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT },
|
||||||
|
{ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
|
||||||
|
{ KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC, KC_SPC, M_LOWER, KC_UP, KC_DOWN, KC_LEFT, KC_RGHT },
|
||||||
|
},
|
||||||
|
|
||||||
|
/* DVORAK
|
||||||
|
* .-----------------------------------------------------------------------------------------------------------.
|
||||||
|
* | TAB | ' | , | . | P | Y | F | G | C | R | L | BACKSP |
|
||||||
|
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
|
||||||
|
* | ESC | A | O | E | U | I | D | H | T | N | S | ' |
|
||||||
|
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
|
||||||
|
* | LSHIFT | ; | Q | J | K | X | B | M | W | V | Z | ENTER |
|
||||||
|
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
|
||||||
|
* | LCTRL | LWIN | FN | LALT | RAISE | SPACE | SPACE | LOWER | UP | DOWN | LEFT | RIGHT |
|
||||||
|
* '-----------------------------------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
|
||||||
|
[LAYER_DVORAK] = { /* DVORAK */
|
||||||
|
{ KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC },
|
||||||
|
{ KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH },
|
||||||
|
{ KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT },
|
||||||
|
{ KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC, KC_SPC, M_LOWER, KC_UP, KC_DOWN, KC_LEFT, KC_RGHT },
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Raise
|
||||||
|
* .-----------------------------------------------------------------------------------------------------------.
|
||||||
|
* | ~ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | DEL |
|
||||||
|
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
|
||||||
|
* | XXXXXX | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | [ | ] | \ |
|
||||||
|
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
|
||||||
|
* | LSHIFT | F7 | F8 | F9 | F10 | F11 | F12 | XXXXXX | XXXXXX | XXXXXX | XXXXXX | ENTER |
|
||||||
|
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
|
||||||
|
* | LCTRL | LWIN | FN | LALT | RAISE | BACKSP | BACKSP | LOWER | PG UP | PG DN | HOME | END |
|
||||||
|
* '-----------------------------------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
|
||||||
|
[LAYER_RAISE] = { /* RAISED */
|
||||||
|
{ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL },
|
||||||
|
{ XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS },
|
||||||
|
{ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
|
||||||
|
{ _______, _______, _______, _______, _______, KC_BSPC, KC_BSPC, _______, KC_PGUP, KC_PGDN, KC_HOME, KC_END },
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
/* LOWERED
|
||||||
|
* .-----------------------------------------------------------------------------------------------------------.
|
||||||
|
* | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | INS |
|
||||||
|
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
|
||||||
|
* | XXXXXX | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
|
||||||
|
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
|
||||||
|
* | LSHIFT | F7 | F8 | F9 | F10 | F11 | F12 | XXXXXX | XXXXXX | XXXXXX | XXXXXX | ENTER |
|
||||||
|
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
|
||||||
|
* | LCTRL | LWIN | FN | LALT | RAISE | BACKSP | BACKSP | LOWER | PG UP | PG DN | HOME | END |
|
||||||
|
* '-----------------------------------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
|
||||||
|
[LAYER_LOWER] = { /* LOWERED */
|
||||||
|
{ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_INS },
|
||||||
|
{ XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS },
|
||||||
|
{ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
|
||||||
|
{ _______, _______, _______, _______, _______, KC_BSPC, KC_BSPC, _______, KC_PGUP, KC_PGDN, KC_HOME, KC_END },
|
||||||
|
},
|
||||||
|
|
||||||
|
/* FUNCTION
|
||||||
|
* .-----------------------------------------------------------------------------------------------------------.
|
||||||
|
* | NUM LK | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | PAUSE |
|
||||||
|
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
|
||||||
|
* | CAP LK | F11 | F12 | F13 | F14 | F15 | F16 | F17 | F18 | F19 | F20 | PRINT |
|
||||||
|
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
|
||||||
|
* | SCR LK | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | MUTE |
|
||||||
|
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
|
||||||
|
* | LCTRL | LWIN | FN | LALT | RAISE | PLAY | PLAY | LOWER | VOL UP | VOL DN | NEXT | PREV |
|
||||||
|
* '-----------------------------------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[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_PAUS },
|
||||||
|
{ KC_CAPS, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_PSCR },
|
||||||
|
{ KC_SLCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MUTE },
|
||||||
|
{ _______, _______, _______, _______, _______, KC_MPLY, KC_MPLY, _______, KC_VOLU, KC_VOLD, KC_MPRV, KC_MNXT },
|
||||||
|
},
|
||||||
|
|
||||||
|
#ifdef MOUSEKEY_ENABLE
|
||||||
|
|
||||||
|
[LAYER_MOUSE] = { /* MOUSE */
|
||||||
|
{ KC_ESC, KC_ACL0, KC_ACL1, KC_ACL2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC },
|
||||||
|
{ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
|
||||||
|
{ _______, KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_WH_U, KC_WH_D },
|
||||||
|
{ _______, _______, _______, _______, _______, KC_BTN1, KC_BTN1, _______, KC_MS_U, KC_MS_D, KC_MS_L, KC_MS_R },
|
||||||
|
},
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
[LAYER_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, M_RAISE, XXXXXXX, XXXXXXX, M_LOWER, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
|
||||||
|
},
|
||||||
|
|
||||||
|
[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 },
|
||||||
|
{ _______, M_QWRTY, M_COLMK, M_DVORK, _______, _______, _______, _______, _______, _______, _______, _______ },
|
||||||
|
{ _______, _______, _______, _______, _______, RESET, _______, M_MOUSE, _______, _______, _______, _______ },
|
||||||
|
{ _______, _______, _______, _______, _______, _______, _______, _______, VC_UP, VC_DOWN, _______, _______ },
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
[LAYER_EMPTY] = {
|
||||||
|
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, },
|
||||||
|
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, },
|
||||||
|
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, },
|
||||||
|
{ _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, },
|
||||||
|
},
|
||||||
|
*/
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
|
||||||
|
float tone_my_startup[][2] = SONG(ODE_TO_JOY);
|
||||||
|
float tone_my_goodbye[][2] = SONG(ROCK_A_BYE_BABY);
|
||||||
|
|
||||||
|
float tone_qwerty[][2] = SONG(QWERTY_SOUND);
|
||||||
|
float tone_dvorak[][2] = SONG(DVORAK_SOUND);
|
||||||
|
float tone_colemak[][2] = SONG(COLEMAK_SOUND);
|
||||||
|
|
||||||
|
float tone_audio_on[][2] = SONG(CLOSE_ENCOUNTERS_5_NOTE);
|
||||||
|
float tone_music_on[][2] = SONG(DOE_A_DEER);
|
||||||
|
float tone_caps_on[][2] = SONG(CAPS_LOCK_ON_SOUND);
|
||||||
|
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);
|
||||||
|
float tone_scroll_on[][2] = SONG(SCROLL_LOCK_ON_SOUND);
|
||||||
|
float tone_scroll_off[][2] = SONG(SCROLL_LOCK_OFF_SOUND);
|
||||||
|
float music_scale[][2] = SONG(MUSIC_SCALE_SOUND);
|
||||||
|
|
||||||
|
#endif /* AUDIO_ENABLE */
|
||||||
|
|
||||||
|
void persistant_default_layer_set(uint16_t default_layer)
|
||||||
|
{
|
||||||
|
eeconfig_update_default_layer(default_layer);
|
||||||
|
default_layer_set(default_layer);
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint16_t PROGMEM fn_actions[] = {
|
||||||
|
};
|
||||||
|
|
||||||
|
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
||||||
|
{
|
||||||
|
|
||||||
|
// MACRODOWN only works in this function
|
||||||
|
switch(id)
|
||||||
|
{
|
||||||
|
|
||||||
|
case MACRO_QWERTY:
|
||||||
|
if (record->event.pressed)
|
||||||
|
{
|
||||||
|
persistant_default_layer_set(1UL<<LAYER_QWERTY);
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
PLAY_NOTE_ARRAY(tone_qwerty, false, STACCATO);
|
||||||
|
#endif /* AUDIO_ENABLE */
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MACRO_COLEMAK:
|
||||||
|
if (record->event.pressed)
|
||||||
|
{
|
||||||
|
persistant_default_layer_set(1UL<<LAYER_COLEMAK);
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
PLAY_NOTE_ARRAY(tone_colemak, false, STACCATO);
|
||||||
|
#endif /* AUDIO_ENABLE */
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MACRO_DVORAK:
|
||||||
|
if (record->event.pressed)
|
||||||
|
{
|
||||||
|
persistant_default_layer_set(1UL<<LAYER_DVORAK);
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
PLAY_NOTE_ARRAY(tone_dvorak, false, STACCATO);
|
||||||
|
#endif /* AUDIO_ENABLE */
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MACRO_LOWER:
|
||||||
|
if (record->event.pressed)
|
||||||
|
{
|
||||||
|
layer_on(LAYER_LOWER);
|
||||||
|
update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
layer_off(LAYER_LOWER);
|
||||||
|
update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MACRO_RAISE:
|
||||||
|
if (record->event.pressed)
|
||||||
|
{
|
||||||
|
layer_on(LAYER_RAISE);
|
||||||
|
update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
layer_off(LAYER_RAISE);
|
||||||
|
update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MACRO_FUNCTION:
|
||||||
|
if (record->event.pressed)
|
||||||
|
{
|
||||||
|
layer_on(LAYER_FUNCTION);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
layer_off(LAYER_FUNCTION);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
#ifdef MOUSEKEY_ENABLE
|
||||||
|
|
||||||
|
case MACRO_MOUSE:
|
||||||
|
if (record->event.pressed)
|
||||||
|
{
|
||||||
|
layer_invert(LAYER_MOUSE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
#endif /* MOUSEKEY_ENABLE */
|
||||||
|
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
|
||||||
|
case MACRO_TIMBRE_1:
|
||||||
|
if (record->event.pressed) set_timbre(TIMBRE_12);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MACRO_TIMBRE_2:
|
||||||
|
if (record->event.pressed) set_timbre(TIMBRE_25);
|
||||||
|
break;
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
case MACRO_INC_VOICE:
|
||||||
|
if (record->event.pressed)
|
||||||
|
{
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
voice_iterate();
|
||||||
|
PLAY_NOTE_ARRAY(music_scale, false, STACCATO);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MACRO_DEC_VOICE:
|
||||||
|
if (record->event.pressed)
|
||||||
|
{
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
voice_deiterate();
|
||||||
|
PLAY_NOTE_ARRAY(music_scale, false, STACCATO);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
#endif /* AUDIO_ENABLE */
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
return MACRO_NONE;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
|
||||||
|
|
||||||
|
void process_action_user(keyrecord_t *record)
|
||||||
|
{
|
||||||
|
|
||||||
|
uint8_t starting_note = 0x0C;
|
||||||
|
int offset = 7;
|
||||||
|
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
set_voice(default_voice);
|
||||||
|
play_startup_tone();
|
||||||
|
println("Matrix Init");
|
||||||
|
}
|
||||||
|
|
||||||
|
void led_set_user(uint8_t usb_led)
|
||||||
|
{
|
||||||
|
static uint8_t old_usb_led = 0;
|
||||||
|
|
||||||
|
_delay_ms(10); // gets rid of tick
|
||||||
|
|
||||||
|
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()
|
||||||
|
{
|
||||||
|
_delay_ms(10); // gets rid of tick
|
||||||
|
PLAY_NOTE_ARRAY(tone_my_startup, false, STACCATO);
|
||||||
|
}
|
||||||
|
|
||||||
|
void play_goodbye_tone()
|
||||||
|
{
|
||||||
|
PLAY_NOTE_ARRAY(tone_my_goodbye, false, STACCATO);
|
||||||
|
_delay_ms(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* AUDIO_ENABLE */
|
@ -0,0 +1,16 @@
|
|||||||
|
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
|
||||||
|
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
|
||||||
|
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
||||||
|
CONSOLE_ENABLE = yes # Console for debug(+400)
|
||||||
|
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
|
||||||
|
MIDI_ENABLE = no # MIDI controls
|
||||||
|
AUDIO_ENABLE = no # Audio output on port C6
|
||||||
|
UNICODE_ENABLE = no # Unicode
|
||||||
|
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
|
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
|
||||||
|
|
||||||
|
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||||
|
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||||
|
|
||||||
|
CONFIG_H = keymaps/$(KEYMAP)/config.h
|
@ -1,34 +1 @@
|
|||||||
# The Default Planck Layout
|
# The default Preonic layout - largely based on the Planck's
|
||||||
|
|
||||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|
||||||
[_QW] = { /* Qwerty */
|
|
||||||
{KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
|
|
||||||
{KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
|
|
||||||
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
|
|
||||||
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
|
|
||||||
},
|
|
||||||
[_CM] = { /* Colemak */
|
|
||||||
{KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
|
|
||||||
{KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
|
|
||||||
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
|
|
||||||
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
|
|
||||||
},
|
|
||||||
[_DV] = { /* Dvorak */
|
|
||||||
{KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC},
|
|
||||||
{KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH},
|
|
||||||
{KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT },
|
|
||||||
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
|
|
||||||
},
|
|
||||||
[_RS] = { /* RAISE */
|
|
||||||
{KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
|
|
||||||
{KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
|
|
||||||
{KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
|
|
||||||
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
|
|
||||||
},
|
|
||||||
[_LW] = { /* LOWER */
|
|
||||||
{KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
|
|
||||||
{KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
|
|
||||||
{KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
|
|
||||||
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
|
|
||||||
}
|
|
||||||
};
|
|
@ -0,0 +1 @@
|
|||||||
|
AUDIO_ENABLE = yes
|
@ -1,365 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <avr/pgmspace.h>
|
|
||||||
#include <avr/interrupt.h>
|
|
||||||
#include <avr/io.h>
|
|
||||||
|
|
||||||
#include "audio.h"
|
|
||||||
#include "keymap_common.h"
|
|
||||||
|
|
||||||
#define PI 3.14159265
|
|
||||||
|
|
||||||
// #define PWM_AUDIO
|
|
||||||
|
|
||||||
#ifdef PWM_AUDIO
|
|
||||||
#include "wave.h"
|
|
||||||
#define SAMPLE_DIVIDER 39
|
|
||||||
#define SAMPLE_RATE (2000000.0/SAMPLE_DIVIDER/2048)
|
|
||||||
// Resistor value of 1/ (2 * PI * 10nF * (2000000 hertz / SAMPLE_DIVIDER / 10)) for 10nF cap
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void delay_us(int count) {
|
|
||||||
while(count--) {
|
|
||||||
_delay_us(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int voices = 0;
|
|
||||||
int voice_place = 0;
|
|
||||||
double frequency = 0;
|
|
||||||
int volume = 0;
|
|
||||||
long position = 0;
|
|
||||||
|
|
||||||
double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0};
|
|
||||||
int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0};
|
|
||||||
bool sliding = false;
|
|
||||||
|
|
||||||
int max = 0xFF;
|
|
||||||
float sum = 0;
|
|
||||||
int value = 128;
|
|
||||||
float place = 0;
|
|
||||||
float places[8] = {0, 0, 0, 0, 0, 0, 0, 0};
|
|
||||||
|
|
||||||
uint16_t place_int = 0;
|
|
||||||
bool repeat = true;
|
|
||||||
uint8_t * sample;
|
|
||||||
uint16_t sample_length = 0;
|
|
||||||
|
|
||||||
|
|
||||||
bool notes = false;
|
|
||||||
bool note = false;
|
|
||||||
float note_frequency = 0;
|
|
||||||
float note_length = 0;
|
|
||||||
uint16_t note_position = 0;
|
|
||||||
float (* notes_pointer)[][2];
|
|
||||||
uint8_t notes_length;
|
|
||||||
bool notes_repeat;
|
|
||||||
uint8_t current_note = 0;
|
|
||||||
|
|
||||||
void stop_all_notes() {
|
|
||||||
voices = 0;
|
|
||||||
#ifdef PWM_AUDIO
|
|
||||||
TIMSK3 &= ~_BV(OCIE3A);
|
|
||||||
#else
|
|
||||||
TIMSK3 &= ~_BV(OCIE3A);
|
|
||||||
TCCR3A &= ~_BV(COM3A1);
|
|
||||||
#endif
|
|
||||||
notes = false;
|
|
||||||
note = false;
|
|
||||||
frequency = 0;
|
|
||||||
volume = 0;
|
|
||||||
|
|
||||||
for (int i = 0; i < 8; i++) {
|
|
||||||
frequencies[i] = 0;
|
|
||||||
volumes[i] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void stop_note(double freq) {
|
|
||||||
#ifdef PWM_AUDIO
|
|
||||||
freq = freq / SAMPLE_RATE;
|
|
||||||
#endif
|
|
||||||
for (int i = 7; i >= 0; i--) {
|
|
||||||
if (frequencies[i] == freq) {
|
|
||||||
frequencies[i] = 0;
|
|
||||||
volumes[i] = 0;
|
|
||||||
for (int j = i; (j < 7); j++) {
|
|
||||||
frequencies[j] = frequencies[j+1];
|
|
||||||
frequencies[j+1] = 0;
|
|
||||||
volumes[j] = volumes[j+1];
|
|
||||||
volumes[j+1] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
voices--;
|
|
||||||
if (voices < 0)
|
|
||||||
voices = 0;
|
|
||||||
if (voices == 0) {
|
|
||||||
#ifdef PWM_AUDIO
|
|
||||||
TIMSK3 &= ~_BV(OCIE3A);
|
|
||||||
#else
|
|
||||||
TIMSK3 &= ~_BV(OCIE3A);
|
|
||||||
TCCR3A &= ~_BV(COM3A1);
|
|
||||||
#endif
|
|
||||||
frequency = 0;
|
|
||||||
volume = 0;
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void init_notes() {
|
|
||||||
|
|
||||||
#ifdef PWM_AUDIO
|
|
||||||
PLLFRQ = _BV(PDIV2);
|
|
||||||
PLLCSR = _BV(PLLE);
|
|
||||||
while(!(PLLCSR & _BV(PLOCK)));
|
|
||||||
PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */
|
|
||||||
|
|
||||||
/* Init a fast PWM on Timer4 */
|
|
||||||
TCCR4A = _BV(COM4A0) | _BV(PWM4A); /* Clear OC4A on Compare Match */
|
|
||||||
TCCR4B = _BV(CS40); /* No prescaling => f = PCK/256 = 187500Hz */
|
|
||||||
OCR4A = 0;
|
|
||||||
|
|
||||||
/* Enable the OC4A output */
|
|
||||||
DDRC |= _BV(PORTC6);
|
|
||||||
|
|
||||||
TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs
|
|
||||||
|
|
||||||
TCCR3A = 0x0; // Options not needed
|
|
||||||
TCCR3B = _BV(CS31) | _BV(CS30) | _BV(WGM32); // 64th prescaling and CTC
|
|
||||||
OCR3A = SAMPLE_DIVIDER - 1; // Correct count/compare, related to sample playback
|
|
||||||
#else
|
|
||||||
DDRC |= _BV(PORTC6);
|
|
||||||
|
|
||||||
TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs
|
|
||||||
|
|
||||||
TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
|
|
||||||
TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ISR(TIMER3_COMPA_vect) {
|
|
||||||
|
|
||||||
if (note) {
|
|
||||||
#ifdef PWM_AUDIO
|
|
||||||
if (voices == 1) {
|
|
||||||
// SINE
|
|
||||||
OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 2;
|
|
||||||
|
|
||||||
// SQUARE
|
|
||||||
// if (((int)place) >= 1024){
|
|
||||||
// OCR4A = 0xFF >> 2;
|
|
||||||
// } else {
|
|
||||||
// OCR4A = 0x00;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// SAWTOOTH
|
|
||||||
// OCR4A = (int)place / 4;
|
|
||||||
|
|
||||||
// TRIANGLE
|
|
||||||
// if (((int)place) >= 1024) {
|
|
||||||
// OCR4A = (int)place / 2;
|
|
||||||
// } else {
|
|
||||||
// OCR4A = 2048 - (int)place / 2;
|
|
||||||
// }
|
|
||||||
|
|
||||||
place += frequency;
|
|
||||||
|
|
||||||
if (place >= SINE_LENGTH)
|
|
||||||
place -= SINE_LENGTH;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
int sum = 0;
|
|
||||||
for (int i = 0; i < voices; i++) {
|
|
||||||
// SINE
|
|
||||||
sum += pgm_read_byte(&sinewave[(uint16_t)places[i]]) >> 2;
|
|
||||||
|
|
||||||
// SQUARE
|
|
||||||
// if (((int)places[i]) >= 1024){
|
|
||||||
// sum += 0xFF >> 2;
|
|
||||||
// } else {
|
|
||||||
// sum += 0x00;
|
|
||||||
// }
|
|
||||||
|
|
||||||
places[i] += frequencies[i];
|
|
||||||
|
|
||||||
if (places[i] >= SINE_LENGTH)
|
|
||||||
places[i] -= SINE_LENGTH;
|
|
||||||
}
|
|
||||||
OCR4A = sum;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if (frequency > 0) {
|
|
||||||
// ICR3 = (int)(((double)F_CPU) / frequency); // Set max to the period
|
|
||||||
// OCR3A = (int)(((double)F_CPU) / frequency) >> 1; // Set compare to half the period
|
|
||||||
if (place > 10) {
|
|
||||||
voice_place = (voice_place + 1) % voices;
|
|
||||||
place = 0.0;
|
|
||||||
}
|
|
||||||
ICR3 = (int)(((double)F_CPU) / frequencies[voice_place]); // Set max to the period
|
|
||||||
OCR3A = (int)(((double)F_CPU) / frequencies[voice_place]) >> 1; // Set compare to half the period
|
|
||||||
place++;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// SAMPLE
|
|
||||||
// OCR4A = pgm_read_byte(&sample[(uint16_t)place_int]);
|
|
||||||
|
|
||||||
// place_int++;
|
|
||||||
|
|
||||||
// if (place_int >= sample_length)
|
|
||||||
// if (repeat)
|
|
||||||
// place_int -= sample_length;
|
|
||||||
// else
|
|
||||||
// TIMSK3 &= ~_BV(OCIE3A);
|
|
||||||
|
|
||||||
|
|
||||||
if (notes) {
|
|
||||||
#ifdef PWM_AUDIO
|
|
||||||
OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 0;
|
|
||||||
|
|
||||||
place += note_frequency;
|
|
||||||
if (place >= SINE_LENGTH)
|
|
||||||
place -= SINE_LENGTH;
|
|
||||||
#else
|
|
||||||
if (note_frequency > 0) {
|
|
||||||
ICR3 = (int)(((double)F_CPU) / note_frequency); // Set max to the period
|
|
||||||
OCR3A = (int)(((double)F_CPU) / note_frequency) >> 1; // Set compare to half the period
|
|
||||||
} else {
|
|
||||||
ICR3 = 0;
|
|
||||||
OCR3A = 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
note_position++;
|
|
||||||
if (note_position >= note_length) {
|
|
||||||
current_note++;
|
|
||||||
if (current_note >= notes_length) {
|
|
||||||
if (notes_repeat) {
|
|
||||||
current_note = 0;
|
|
||||||
} else {
|
|
||||||
#ifdef PWM_AUDIO
|
|
||||||
TIMSK3 &= ~_BV(OCIE3A);
|
|
||||||
#else
|
|
||||||
TIMSK3 &= ~_BV(OCIE3A);
|
|
||||||
TCCR3A &= ~_BV(COM3A1);
|
|
||||||
#endif
|
|
||||||
notes = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#ifdef PWM_AUDIO
|
|
||||||
note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
|
|
||||||
note_length = (*notes_pointer)[current_note][1];
|
|
||||||
#else
|
|
||||||
note_frequency = (*notes_pointer)[current_note][0];
|
|
||||||
note_length = (*notes_pointer)[current_note][1] / 4;
|
|
||||||
#endif
|
|
||||||
note_position = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat) {
|
|
||||||
if (note)
|
|
||||||
stop_all_notes();
|
|
||||||
notes = true;
|
|
||||||
|
|
||||||
notes_pointer = np;
|
|
||||||
notes_length = n_length;
|
|
||||||
notes_repeat = n_repeat;
|
|
||||||
|
|
||||||
place = 0;
|
|
||||||
current_note = 0;
|
|
||||||
#ifdef PWM_AUDIO
|
|
||||||
note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
|
|
||||||
note_length = (*notes_pointer)[current_note][1];
|
|
||||||
#else
|
|
||||||
note_frequency = (*notes_pointer)[current_note][0];
|
|
||||||
note_length = (*notes_pointer)[current_note][1] / 4;
|
|
||||||
#endif
|
|
||||||
note_position = 0;
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef PWM_AUDIO
|
|
||||||
TIMSK3 |= _BV(OCIE3A);
|
|
||||||
#else
|
|
||||||
TIMSK3 |= _BV(OCIE3A);
|
|
||||||
TCCR3A |= _BV(COM3A1);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void play_sample(uint8_t * s, uint16_t l, bool r) {
|
|
||||||
stop_all_notes();
|
|
||||||
place_int = 0;
|
|
||||||
sample = s;
|
|
||||||
sample_length = l;
|
|
||||||
repeat = r;
|
|
||||||
|
|
||||||
#ifdef PWM_AUDIO
|
|
||||||
TIMSK3 |= _BV(OCIE3A);
|
|
||||||
#else
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void play_note(double freq, int vol) {
|
|
||||||
if (notes)
|
|
||||||
stop_all_notes();
|
|
||||||
note = true;
|
|
||||||
#ifdef PWM_AUDIO
|
|
||||||
freq = freq / SAMPLE_RATE;
|
|
||||||
#endif
|
|
||||||
if (freq > 0) {
|
|
||||||
if (frequency != 0) {
|
|
||||||
double starting_f = frequency;
|
|
||||||
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++;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef PWM_AUDIO
|
|
||||||
TIMSK3 |= _BV(OCIE3A);
|
|
||||||
#else
|
|
||||||
TIMSK3 |= _BV(OCIE3A);
|
|
||||||
TCCR3A |= _BV(COM3A1);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
#include <stdint.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <avr/io.h>
|
|
||||||
#include <util/delay.h>
|
|
||||||
|
|
||||||
void play_sample(uint8_t * s, uint16_t l, bool r);
|
|
||||||
void play_note(double freq, int vol);
|
|
||||||
void stop_note(double freq);
|
|
||||||
void stop_all_notes();
|
|
||||||
void init_notes();
|
|
||||||
void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat);
|
|
@ -0,0 +1,607 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include "print.h"
|
||||||
|
#include "audio.h"
|
||||||
|
#include "keymap_common.h"
|
||||||
|
|
||||||
|
#include "eeconfig.h"
|
||||||
|
|
||||||
|
#ifdef VIBRATO_ENABLE
|
||||||
|
#include "vibrato_lut.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define PI 3.14159265
|
||||||
|
|
||||||
|
#define CPU_PRESCALER 8
|
||||||
|
|
||||||
|
#ifdef PWM_AUDIO
|
||||||
|
#include "wave.h"
|
||||||
|
#define SAMPLE_DIVIDER 39
|
||||||
|
#define SAMPLE_RATE (2000000.0/SAMPLE_DIVIDER/2048)
|
||||||
|
// Resistor value of 1/ (2 * PI * 10nF * (2000000 hertz / SAMPLE_DIVIDER / 10)) for 10nF cap
|
||||||
|
|
||||||
|
float places[8] = {0, 0, 0, 0, 0, 0, 0, 0};
|
||||||
|
uint16_t place_int = 0;
|
||||||
|
bool repeat = true;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void delay_us(int count) {
|
||||||
|
while(count--) {
|
||||||
|
_delay_us(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int voices = 0;
|
||||||
|
int voice_place = 0;
|
||||||
|
float frequency = 0;
|
||||||
|
int volume = 0;
|
||||||
|
long position = 0;
|
||||||
|
|
||||||
|
float frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0};
|
||||||
|
int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0};
|
||||||
|
bool sliding = false;
|
||||||
|
|
||||||
|
int max = 0xFF;
|
||||||
|
float sum = 0;
|
||||||
|
float place = 0;
|
||||||
|
|
||||||
|
uint8_t * sample;
|
||||||
|
uint16_t sample_length = 0;
|
||||||
|
// float freq = 0;
|
||||||
|
|
||||||
|
bool notes = false;
|
||||||
|
bool note = false;
|
||||||
|
float note_frequency = 0;
|
||||||
|
float note_length = 0;
|
||||||
|
float note_tempo = TEMPO_DEFAULT;
|
||||||
|
float note_timbre = TIMBRE_DEFAULT;
|
||||||
|
uint16_t note_position = 0;
|
||||||
|
float (* notes_pointer)[][2];
|
||||||
|
uint16_t notes_count;
|
||||||
|
bool notes_repeat;
|
||||||
|
float notes_rest;
|
||||||
|
bool note_resting = false;
|
||||||
|
|
||||||
|
uint8_t current_note = 0;
|
||||||
|
uint8_t rest_counter = 0;
|
||||||
|
|
||||||
|
#ifdef VIBRATO_ENABLE
|
||||||
|
float vibrato_counter = 0;
|
||||||
|
float vibrato_strength = .5;
|
||||||
|
float vibrato_rate = 0.125;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
float polyphony_rate = 0;
|
||||||
|
|
||||||
|
bool inited = false;
|
||||||
|
|
||||||
|
audio_config_t audio_config;
|
||||||
|
|
||||||
|
uint16_t envelope_index = 0;
|
||||||
|
|
||||||
|
void audio_toggle(void) {
|
||||||
|
audio_config.enable ^= 1;
|
||||||
|
eeconfig_update_audio(audio_config.raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
void audio_on(void) {
|
||||||
|
audio_config.enable = 1;
|
||||||
|
eeconfig_update_audio(audio_config.raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
void audio_off(void) {
|
||||||
|
audio_config.enable = 0;
|
||||||
|
eeconfig_update_audio(audio_config.raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef VIBRATO_ENABLE
|
||||||
|
// 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
|
||||||
|
|
||||||
|
#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 audio_init() {
|
||||||
|
|
||||||
|
/* check signature */
|
||||||
|
if (!eeconfig_is_enabled()) {
|
||||||
|
eeconfig_init();
|
||||||
|
}
|
||||||
|
audio_config.raw = eeconfig_read_audio();
|
||||||
|
|
||||||
|
#ifdef PWM_AUDIO
|
||||||
|
PLLFRQ = _BV(PDIV2);
|
||||||
|
PLLCSR = _BV(PLLE);
|
||||||
|
while(!(PLLCSR & _BV(PLOCK)));
|
||||||
|
PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */
|
||||||
|
|
||||||
|
/* Init a fast PWM on Timer4 */
|
||||||
|
TCCR4A = _BV(COM4A0) | _BV(PWM4A); /* Clear OC4A on Compare Match */
|
||||||
|
TCCR4B = _BV(CS40); /* No prescaling => f = PCK/256 = 187500Hz */
|
||||||
|
OCR4A = 0;
|
||||||
|
|
||||||
|
/* Enable the OC4A output */
|
||||||
|
DDRC |= _BV(PORTC6);
|
||||||
|
|
||||||
|
TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs
|
||||||
|
|
||||||
|
TCCR3A = 0x0; // Options not needed
|
||||||
|
TCCR3B = _BV(CS31) | _BV(CS30) | _BV(WGM32); // 64th prescaling and CTC
|
||||||
|
OCR3A = SAMPLE_DIVIDER - 1; // Correct count/compare, related to sample playback
|
||||||
|
#else
|
||||||
|
DDRC |= _BV(PORTC6);
|
||||||
|
|
||||||
|
TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs
|
||||||
|
|
||||||
|
TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
|
||||||
|
TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
inited = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void stop_all_notes() {
|
||||||
|
if (!inited) {
|
||||||
|
audio_init();
|
||||||
|
}
|
||||||
|
voices = 0;
|
||||||
|
#ifdef PWM_AUDIO
|
||||||
|
TIMSK3 &= ~_BV(OCIE3A);
|
||||||
|
#else
|
||||||
|
TIMSK3 &= ~_BV(OCIE3A);
|
||||||
|
TCCR3A &= ~_BV(COM3A1);
|
||||||
|
#endif
|
||||||
|
notes = false;
|
||||||
|
note = false;
|
||||||
|
frequency = 0;
|
||||||
|
volume = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < 8; i++) {
|
||||||
|
frequencies[i] = 0;
|
||||||
|
volumes[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void stop_note(float freq) {
|
||||||
|
if (note) {
|
||||||
|
if (!inited) {
|
||||||
|
audio_init();
|
||||||
|
}
|
||||||
|
#ifdef PWM_AUDIO
|
||||||
|
freq = freq / SAMPLE_RATE;
|
||||||
|
#endif
|
||||||
|
for (int i = 7; i >= 0; i--) {
|
||||||
|
if (frequencies[i] == freq) {
|
||||||
|
frequencies[i] = 0;
|
||||||
|
volumes[i] = 0;
|
||||||
|
for (int j = i; (j < 7); j++) {
|
||||||
|
frequencies[j] = frequencies[j+1];
|
||||||
|
frequencies[j+1] = 0;
|
||||||
|
volumes[j] = volumes[j+1];
|
||||||
|
volumes[j+1] = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
voices--;
|
||||||
|
if (voices < 0)
|
||||||
|
voices = 0;
|
||||||
|
if (voice_place >= voices) {
|
||||||
|
voice_place = 0;
|
||||||
|
}
|
||||||
|
if (voices == 0) {
|
||||||
|
#ifdef PWM_AUDIO
|
||||||
|
TIMSK3 &= ~_BV(OCIE3A);
|
||||||
|
#else
|
||||||
|
TIMSK3 &= ~_BV(OCIE3A);
|
||||||
|
TCCR3A &= ~_BV(COM3A1);
|
||||||
|
#endif
|
||||||
|
frequency = 0;
|
||||||
|
volume = 0;
|
||||||
|
note = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef VIBRATO_ENABLE
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ISR(TIMER3_COMPA_vect) {
|
||||||
|
if (note) {
|
||||||
|
#ifdef PWM_AUDIO
|
||||||
|
if (voices == 1) {
|
||||||
|
// SINE
|
||||||
|
OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 2;
|
||||||
|
|
||||||
|
// SQUARE
|
||||||
|
// if (((int)place) >= 1024){
|
||||||
|
// OCR4A = 0xFF >> 2;
|
||||||
|
// } else {
|
||||||
|
// OCR4A = 0x00;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// SAWTOOTH
|
||||||
|
// OCR4A = (int)place / 4;
|
||||||
|
|
||||||
|
// TRIANGLE
|
||||||
|
// if (((int)place) >= 1024) {
|
||||||
|
// OCR4A = (int)place / 2;
|
||||||
|
// } else {
|
||||||
|
// OCR4A = 2048 - (int)place / 2;
|
||||||
|
// }
|
||||||
|
|
||||||
|
place += frequency;
|
||||||
|
|
||||||
|
if (place >= SINE_LENGTH)
|
||||||
|
place -= SINE_LENGTH;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
int sum = 0;
|
||||||
|
for (int i = 0; i < voices; i++) {
|
||||||
|
// SINE
|
||||||
|
sum += pgm_read_byte(&sinewave[(uint16_t)places[i]]) >> 2;
|
||||||
|
|
||||||
|
// SQUARE
|
||||||
|
// if (((int)places[i]) >= 1024){
|
||||||
|
// sum += 0xFF >> 2;
|
||||||
|
// } else {
|
||||||
|
// sum += 0x00;
|
||||||
|
// }
|
||||||
|
|
||||||
|
places[i] += frequencies[i];
|
||||||
|
|
||||||
|
if (places[i] >= SINE_LENGTH)
|
||||||
|
places[i] -= SINE_LENGTH;
|
||||||
|
}
|
||||||
|
OCR4A = sum;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (voices > 0) {
|
||||||
|
float freq;
|
||||||
|
if (polyphony_rate > 0) {
|
||||||
|
if (voices > 1) {
|
||||||
|
voice_place %= voices;
|
||||||
|
if (place++ > (frequencies[voice_place] / polyphony_rate / CPU_PRESCALER)) {
|
||||||
|
voice_place = (voice_place + 1) % voices;
|
||||||
|
place = 0.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#ifdef VIBRATO_ENABLE
|
||||||
|
if (vibrato_strength > 0) {
|
||||||
|
freq = vibrato(frequencies[voice_place]);
|
||||||
|
} else {
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
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];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef VIBRATO_ENABLE
|
||||||
|
if (vibrato_strength > 0) {
|
||||||
|
freq = vibrato(frequency);
|
||||||
|
} else {
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
freq = frequency;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (envelope_index < 65535) {
|
||||||
|
envelope_index++;
|
||||||
|
}
|
||||||
|
freq = voice_envelope(freq);
|
||||||
|
|
||||||
|
if (freq < 30.517578125)
|
||||||
|
freq = 30.52;
|
||||||
|
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
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// SAMPLE
|
||||||
|
// OCR4A = pgm_read_byte(&sample[(uint16_t)place_int]);
|
||||||
|
|
||||||
|
// place_int++;
|
||||||
|
|
||||||
|
// if (place_int >= sample_length)
|
||||||
|
// if (repeat)
|
||||||
|
// place_int -= sample_length;
|
||||||
|
// else
|
||||||
|
// TIMSK3 &= ~_BV(OCIE3A);
|
||||||
|
|
||||||
|
|
||||||
|
if (notes) {
|
||||||
|
#ifdef PWM_AUDIO
|
||||||
|
OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 0;
|
||||||
|
|
||||||
|
place += note_frequency;
|
||||||
|
if (place >= SINE_LENGTH)
|
||||||
|
place -= SINE_LENGTH;
|
||||||
|
#else
|
||||||
|
if (note_frequency > 0) {
|
||||||
|
float freq;
|
||||||
|
|
||||||
|
#ifdef VIBRATO_ENABLE
|
||||||
|
if (vibrato_strength > 0) {
|
||||||
|
freq = vibrato(note_frequency);
|
||||||
|
} else {
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
freq = note_frequency;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (envelope_index < 65535) {
|
||||||
|
envelope_index++;
|
||||||
|
}
|
||||||
|
freq = voice_envelope(freq);
|
||||||
|
|
||||||
|
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 {
|
||||||
|
ICR3 = 0;
|
||||||
|
OCR3A = 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
note_position++;
|
||||||
|
bool end_of_note = false;
|
||||||
|
if (ICR3 > 0)
|
||||||
|
end_of_note = (note_position >= (note_length / ICR3 * 0xFFFF));
|
||||||
|
else
|
||||||
|
end_of_note = (note_position >= (note_length * 0x7FF));
|
||||||
|
if (end_of_note) {
|
||||||
|
current_note++;
|
||||||
|
if (current_note >= notes_count) {
|
||||||
|
if (notes_repeat) {
|
||||||
|
current_note = 0;
|
||||||
|
} else {
|
||||||
|
#ifdef PWM_AUDIO
|
||||||
|
TIMSK3 &= ~_BV(OCIE3A);
|
||||||
|
#else
|
||||||
|
TIMSK3 &= ~_BV(OCIE3A);
|
||||||
|
TCCR3A &= ~_BV(COM3A1);
|
||||||
|
#endif
|
||||||
|
notes = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!note_resting && (notes_rest > 0)) {
|
||||||
|
note_resting = true;
|
||||||
|
note_frequency = 0;
|
||||||
|
note_length = notes_rest;
|
||||||
|
current_note--;
|
||||||
|
} else {
|
||||||
|
note_resting = false;
|
||||||
|
#ifdef PWM_AUDIO
|
||||||
|
note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
|
||||||
|
note_length = (*notes_pointer)[current_note][1] * (note_tempo / 100);
|
||||||
|
#else
|
||||||
|
envelope_index = 0;
|
||||||
|
note_frequency = (*notes_pointer)[current_note][0];
|
||||||
|
note_length = ((*notes_pointer)[current_note][1] / 4) * (note_tempo / 100);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
note_position = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!audio_config.enable) {
|
||||||
|
notes = false;
|
||||||
|
note = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void play_note(float freq, int vol) {
|
||||||
|
|
||||||
|
if (!inited) {
|
||||||
|
audio_init();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (audio_config.enable && voices < 8) {
|
||||||
|
TIMSK3 &= ~_BV(OCIE3A);
|
||||||
|
// Cancel notes if notes are playing
|
||||||
|
if (notes)
|
||||||
|
stop_all_notes();
|
||||||
|
note = true;
|
||||||
|
envelope_index = 0;
|
||||||
|
#ifdef PWM_AUDIO
|
||||||
|
freq = freq / SAMPLE_RATE;
|
||||||
|
#endif
|
||||||
|
if (freq > 0) {
|
||||||
|
frequencies[voices] = freq;
|
||||||
|
volumes[voices] = vol;
|
||||||
|
voices++;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef PWM_AUDIO
|
||||||
|
TIMSK3 |= _BV(OCIE3A);
|
||||||
|
#else
|
||||||
|
TIMSK3 |= _BV(OCIE3A);
|
||||||
|
TCCR3A |= _BV(COM3A1);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest) {
|
||||||
|
|
||||||
|
if (!inited) {
|
||||||
|
audio_init();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (audio_config.enable) {
|
||||||
|
TIMSK3 &= ~_BV(OCIE3A);
|
||||||
|
// Cancel note if a note is playing
|
||||||
|
if (note)
|
||||||
|
stop_all_notes();
|
||||||
|
notes = true;
|
||||||
|
|
||||||
|
notes_pointer = np;
|
||||||
|
notes_count = n_count;
|
||||||
|
notes_repeat = n_repeat;
|
||||||
|
notes_rest = n_rest;
|
||||||
|
|
||||||
|
place = 0;
|
||||||
|
current_note = 0;
|
||||||
|
#ifdef PWM_AUDIO
|
||||||
|
note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
|
||||||
|
note_length = (*notes_pointer)[current_note][1] * (note_tempo / 100);
|
||||||
|
#else
|
||||||
|
note_frequency = (*notes_pointer)[current_note][0];
|
||||||
|
note_length = ((*notes_pointer)[current_note][1] / 4) * (note_tempo / 100);
|
||||||
|
#endif
|
||||||
|
note_position = 0;
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef PWM_AUDIO
|
||||||
|
TIMSK3 |= _BV(OCIE3A);
|
||||||
|
#else
|
||||||
|
TIMSK3 |= _BV(OCIE3A);
|
||||||
|
TCCR3A |= _BV(COM3A1);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef PWM_AUDIO
|
||||||
|
void play_sample(uint8_t * s, uint16_t l, bool r) {
|
||||||
|
if (!inited) {
|
||||||
|
audio_init();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (audio_config.enable) {
|
||||||
|
TIMSK3 &= ~_BV(OCIE3A);
|
||||||
|
stop_all_notes();
|
||||||
|
place_int = 0;
|
||||||
|
sample = s;
|
||||||
|
sample_length = l;
|
||||||
|
repeat = r;
|
||||||
|
|
||||||
|
TIMSK3 |= _BV(OCIE3A);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Override these functions in your keymap file to play different tunes on
|
||||||
|
// startup and bootloader jump
|
||||||
|
__attribute__ ((weak))
|
||||||
|
void play_startup_tone()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
__attribute__ ((weak))
|
||||||
|
void play_goodbye_tone()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
@ -0,0 +1,89 @@
|
|||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <util/delay.h>
|
||||||
|
#include "musical_notes.h"
|
||||||
|
#include "song_list.h"
|
||||||
|
#include "voices.h"
|
||||||
|
|
||||||
|
#ifndef AUDIO_H
|
||||||
|
#define AUDIO_H
|
||||||
|
|
||||||
|
// Largely untested PWM audio mode (doesn't sound as good)
|
||||||
|
// #define PWM_AUDIO
|
||||||
|
|
||||||
|
// #define VIBRATO_ENABLE
|
||||||
|
|
||||||
|
// Enable vibrato strength/amplitude - slows down ISR too much
|
||||||
|
// #define VIBRATO_STRENGTH_ENABLE
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
uint8_t raw;
|
||||||
|
struct {
|
||||||
|
bool enable :1;
|
||||||
|
uint8_t level :7;
|
||||||
|
};
|
||||||
|
} audio_config_t;
|
||||||
|
|
||||||
|
void audio_toggle(void);
|
||||||
|
void audio_on(void);
|
||||||
|
void audio_off(void);
|
||||||
|
|
||||||
|
// Vibrato rate functions
|
||||||
|
|
||||||
|
#ifdef VIBRATO_ENABLE
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Polyphony functions
|
||||||
|
|
||||||
|
void set_polyphony_rate(float rate);
|
||||||
|
void enable_polyphony(void);
|
||||||
|
void disable_polyphony(void);
|
||||||
|
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 audio_init(void);
|
||||||
|
|
||||||
|
#ifdef PWM_AUDIO
|
||||||
|
void play_sample(uint8_t * s, uint16_t l, bool r);
|
||||||
|
#endif
|
||||||
|
void play_note(float freq, int vol);
|
||||||
|
void stop_note(float freq);
|
||||||
|
void stop_all_notes(void);
|
||||||
|
void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest);
|
||||||
|
|
||||||
|
#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*2), 2 + (12*2), 4 + (12*2), 5 + (12*2), 7 + (12*2), 9 + (12*2), 11 + (12*2), \
|
||||||
|
0 + (12*3), 2 + (12*3), 4 + (12*3), 5 + (12*3), 7 + (12*3), 9 + (12*3), 11 + (12*3), \
|
||||||
|
0 + (12*4), 2 + (12*4), 4 + (12*4), 5 + (12*4), 7 + (12*4), 9 + (12*4), 11 + (12*4), }
|
||||||
|
|
||||||
|
// These macros are used to allow play_notes to play an array of indeterminate
|
||||||
|
// length. This works around the limitation of C's sizeof operation on pointers.
|
||||||
|
// The global float array for the song must be used here.
|
||||||
|
#define NOTE_ARRAY_SIZE(x) ((int16_t)(sizeof(x) / (sizeof(x[0]))))
|
||||||
|
#define PLAY_NOTE_ARRAY(note_array, note_repeat, note_rest_style) play_notes(¬e_array, NOTE_ARRAY_SIZE((note_array)), (note_repeat), (note_rest_style));
|
||||||
|
|
||||||
|
void play_goodbye_tone(void);
|
||||||
|
void play_startup_tone(void);
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,357 @@
|
|||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
|
#define FREQUENCY_LUT_LENGTH 349
|
||||||
|
|
||||||
|
const uint16_t FREQUENCY_LUT[FREQUENCY_LUT_LENGTH] = {
|
||||||
|
0x8E0B,
|
||||||
|
0x8C02,
|
||||||
|
0x8A00,
|
||||||
|
0x8805,
|
||||||
|
0x8612,
|
||||||
|
0x8426,
|
||||||
|
0x8241,
|
||||||
|
0x8063,
|
||||||
|
0x7E8C,
|
||||||
|
0x7CBB,
|
||||||
|
0x7AF2,
|
||||||
|
0x792E,
|
||||||
|
0x7772,
|
||||||
|
0x75BB,
|
||||||
|
0x740B,
|
||||||
|
0x7261,
|
||||||
|
0x70BD,
|
||||||
|
0x6F20,
|
||||||
|
0x6D88,
|
||||||
|
0x6BF6,
|
||||||
|
0x6A69,
|
||||||
|
0x68E3,
|
||||||
|
0x6762,
|
||||||
|
0x65E6,
|
||||||
|
0x6470,
|
||||||
|
0x6300,
|
||||||
|
0x6194,
|
||||||
|
0x602E,
|
||||||
|
0x5ECD,
|
||||||
|
0x5D71,
|
||||||
|
0x5C1A,
|
||||||
|
0x5AC8,
|
||||||
|
0x597B,
|
||||||
|
0x5833,
|
||||||
|
0x56EF,
|
||||||
|
0x55B0,
|
||||||
|
0x5475,
|
||||||
|
0x533F,
|
||||||
|
0x520E,
|
||||||
|
0x50E1,
|
||||||
|
0x4FB8,
|
||||||
|
0x4E93,
|
||||||
|
0x4D73,
|
||||||
|
0x4C57,
|
||||||
|
0x4B3E,
|
||||||
|
0x4A2A,
|
||||||
|
0x491A,
|
||||||
|
0x480E,
|
||||||
|
0x4705,
|
||||||
|
0x4601,
|
||||||
|
0x4500,
|
||||||
|
0x4402,
|
||||||
|
0x4309,
|
||||||
|
0x4213,
|
||||||
|
0x4120,
|
||||||
|
0x4031,
|
||||||
|
0x3F46,
|
||||||
|
0x3E5D,
|
||||||
|
0x3D79,
|
||||||
|
0x3C97,
|
||||||
|
0x3BB9,
|
||||||
|
0x3ADD,
|
||||||
|
0x3A05,
|
||||||
|
0x3930,
|
||||||
|
0x385E,
|
||||||
|
0x3790,
|
||||||
|
0x36C4,
|
||||||
|
0x35FB,
|
||||||
|
0x3534,
|
||||||
|
0x3471,
|
||||||
|
0x33B1,
|
||||||
|
0x32F3,
|
||||||
|
0x3238,
|
||||||
|
0x3180,
|
||||||
|
0x30CA,
|
||||||
|
0x3017,
|
||||||
|
0x2F66,
|
||||||
|
0x2EB8,
|
||||||
|
0x2E0D,
|
||||||
|
0x2D64,
|
||||||
|
0x2CBD,
|
||||||
|
0x2C19,
|
||||||
|
0x2B77,
|
||||||
|
0x2AD8,
|
||||||
|
0x2A3A,
|
||||||
|
0x299F,
|
||||||
|
0x2907,
|
||||||
|
0x2870,
|
||||||
|
0x27DC,
|
||||||
|
0x2749,
|
||||||
|
0x26B9,
|
||||||
|
0x262B,
|
||||||
|
0x259F,
|
||||||
|
0x2515,
|
||||||
|
0x248D,
|
||||||
|
0x2407,
|
||||||
|
0x2382,
|
||||||
|
0x2300,
|
||||||
|
0x2280,
|
||||||
|
0x2201,
|
||||||
|
0x2184,
|
||||||
|
0x2109,
|
||||||
|
0x2090,
|
||||||
|
0x2018,
|
||||||
|
0x1FA3,
|
||||||
|
0x1F2E,
|
||||||
|
0x1EBC,
|
||||||
|
0x1E4B,
|
||||||
|
0x1DDC,
|
||||||
|
0x1D6E,
|
||||||
|
0x1D02,
|
||||||
|
0x1C98,
|
||||||
|
0x1C2F,
|
||||||
|
0x1BC8,
|
||||||
|
0x1B62,
|
||||||
|
0x1AFD,
|
||||||
|
0x1A9A,
|
||||||
|
0x1A38,
|
||||||
|
0x19D8,
|
||||||
|
0x1979,
|
||||||
|
0x191C,
|
||||||
|
0x18C0,
|
||||||
|
0x1865,
|
||||||
|
0x180B,
|
||||||
|
0x17B3,
|
||||||
|
0x175C,
|
||||||
|
0x1706,
|
||||||
|
0x16B2,
|
||||||
|
0x165E,
|
||||||
|
0x160C,
|
||||||
|
0x15BB,
|
||||||
|
0x156C,
|
||||||
|
0x151D,
|
||||||
|
0x14CF,
|
||||||
|
0x1483,
|
||||||
|
0x1438,
|
||||||
|
0x13EE,
|
||||||
|
0x13A4,
|
||||||
|
0x135C,
|
||||||
|
0x1315,
|
||||||
|
0x12CF,
|
||||||
|
0x128A,
|
||||||
|
0x1246,
|
||||||
|
0x1203,
|
||||||
|
0x11C1,
|
||||||
|
0x1180,
|
||||||
|
0x1140,
|
||||||
|
0x1100,
|
||||||
|
0x10C2,
|
||||||
|
0x1084,
|
||||||
|
0x1048,
|
||||||
|
0x100C,
|
||||||
|
0xFD1,
|
||||||
|
0xF97,
|
||||||
|
0xF5E,
|
||||||
|
0xF25,
|
||||||
|
0xEEE,
|
||||||
|
0xEB7,
|
||||||
|
0xE81,
|
||||||
|
0xE4C,
|
||||||
|
0xE17,
|
||||||
|
0xDE4,
|
||||||
|
0xDB1,
|
||||||
|
0xD7E,
|
||||||
|
0xD4D,
|
||||||
|
0xD1C,
|
||||||
|
0xCEC,
|
||||||
|
0xCBC,
|
||||||
|
0xC8E,
|
||||||
|
0xC60,
|
||||||
|
0xC32,
|
||||||
|
0xC05,
|
||||||
|
0xBD9,
|
||||||
|
0xBAE,
|
||||||
|
0xB83,
|
||||||
|
0xB59,
|
||||||
|
0xB2F,
|
||||||
|
0xB06,
|
||||||
|
0xADD,
|
||||||
|
0xAB6,
|
||||||
|
0xA8E,
|
||||||
|
0xA67,
|
||||||
|
0xA41,
|
||||||
|
0xA1C,
|
||||||
|
0x9F7,
|
||||||
|
0x9D2,
|
||||||
|
0x9AE,
|
||||||
|
0x98A,
|
||||||
|
0x967,
|
||||||
|
0x945,
|
||||||
|
0x923,
|
||||||
|
0x901,
|
||||||
|
0x8E0,
|
||||||
|
0x8C0,
|
||||||
|
0x8A0,
|
||||||
|
0x880,
|
||||||
|
0x861,
|
||||||
|
0x842,
|
||||||
|
0x824,
|
||||||
|
0x806,
|
||||||
|
0x7E8,
|
||||||
|
0x7CB,
|
||||||
|
0x7AF,
|
||||||
|
0x792,
|
||||||
|
0x777,
|
||||||
|
0x75B,
|
||||||
|
0x740,
|
||||||
|
0x726,
|
||||||
|
0x70B,
|
||||||
|
0x6F2,
|
||||||
|
0x6D8,
|
||||||
|
0x6BF,
|
||||||
|
0x6A6,
|
||||||
|
0x68E,
|
||||||
|
0x676,
|
||||||
|
0x65E,
|
||||||
|
0x647,
|
||||||
|
0x630,
|
||||||
|
0x619,
|
||||||
|
0x602,
|
||||||
|
0x5EC,
|
||||||
|
0x5D7,
|
||||||
|
0x5C1,
|
||||||
|
0x5AC,
|
||||||
|
0x597,
|
||||||
|
0x583,
|
||||||
|
0x56E,
|
||||||
|
0x55B,
|
||||||
|
0x547,
|
||||||
|
0x533,
|
||||||
|
0x520,
|
||||||
|
0x50E,
|
||||||
|
0x4FB,
|
||||||
|
0x4E9,
|
||||||
|
0x4D7,
|
||||||
|
0x4C5,
|
||||||
|
0x4B3,
|
||||||
|
0x4A2,
|
||||||
|
0x491,
|
||||||
|
0x480,
|
||||||
|
0x470,
|
||||||
|
0x460,
|
||||||
|
0x450,
|
||||||
|
0x440,
|
||||||
|
0x430,
|
||||||
|
0x421,
|
||||||
|
0x412,
|
||||||
|
0x403,
|
||||||
|
0x3F4,
|
||||||
|
0x3E5,
|
||||||
|
0x3D7,
|
||||||
|
0x3C9,
|
||||||
|
0x3BB,
|
||||||
|
0x3AD,
|
||||||
|
0x3A0,
|
||||||
|
0x393,
|
||||||
|
0x385,
|
||||||
|
0x379,
|
||||||
|
0x36C,
|
||||||
|
0x35F,
|
||||||
|
0x353,
|
||||||
|
0x347,
|
||||||
|
0x33B,
|
||||||
|
0x32F,
|
||||||
|
0x323,
|
||||||
|
0x318,
|
||||||
|
0x30C,
|
||||||
|
0x301,
|
||||||
|
0x2F6,
|
||||||
|
0x2EB,
|
||||||
|
0x2E0,
|
||||||
|
0x2D6,
|
||||||
|
0x2CB,
|
||||||
|
0x2C1,
|
||||||
|
0x2B7,
|
||||||
|
0x2AD,
|
||||||
|
0x2A3,
|
||||||
|
0x299,
|
||||||
|
0x290,
|
||||||
|
0x287,
|
||||||
|
0x27D,
|
||||||
|
0x274,
|
||||||
|
0x26B,
|
||||||
|
0x262,
|
||||||
|
0x259,
|
||||||
|
0x251,
|
||||||
|
0x248,
|
||||||
|
0x240,
|
||||||
|
0x238,
|
||||||
|
0x230,
|
||||||
|
0x228,
|
||||||
|
0x220,
|
||||||
|
0x218,
|
||||||
|
0x210,
|
||||||
|
0x209,
|
||||||
|
0x201,
|
||||||
|
0x1FA,
|
||||||
|
0x1F2,
|
||||||
|
0x1EB,
|
||||||
|
0x1E4,
|
||||||
|
0x1DD,
|
||||||
|
0x1D6,
|
||||||
|
0x1D0,
|
||||||
|
0x1C9,
|
||||||
|
0x1C2,
|
||||||
|
0x1BC,
|
||||||
|
0x1B6,
|
||||||
|
0x1AF,
|
||||||
|
0x1A9,
|
||||||
|
0x1A3,
|
||||||
|
0x19D,
|
||||||
|
0x197,
|
||||||
|
0x191,
|
||||||
|
0x18C,
|
||||||
|
0x186,
|
||||||
|
0x180,
|
||||||
|
0x17B,
|
||||||
|
0x175,
|
||||||
|
0x170,
|
||||||
|
0x16B,
|
||||||
|
0x165,
|
||||||
|
0x160,
|
||||||
|
0x15B,
|
||||||
|
0x156,
|
||||||
|
0x151,
|
||||||
|
0x14C,
|
||||||
|
0x148,
|
||||||
|
0x143,
|
||||||
|
0x13E,
|
||||||
|
0x13A,
|
||||||
|
0x135,
|
||||||
|
0x131,
|
||||||
|
0x12C,
|
||||||
|
0x128,
|
||||||
|
0x124,
|
||||||
|
0x120,
|
||||||
|
0x11C,
|
||||||
|
0x118,
|
||||||
|
0x114,
|
||||||
|
0x110,
|
||||||
|
0x10C,
|
||||||
|
0x108,
|
||||||
|
0x104,
|
||||||
|
0x100,
|
||||||
|
0xFD,
|
||||||
|
0xF9,
|
||||||
|
0xF5,
|
||||||
|
0xF2,
|
||||||
|
0xEE
|
||||||
|
};
|
@ -0,0 +1,217 @@
|
|||||||
|
#ifndef MUSICAL_NOTES_H
|
||||||
|
#define MUSICAL_NOTES_H
|
||||||
|
|
||||||
|
// Tempo Placeholder
|
||||||
|
#define TEMPO_DEFAULT 100
|
||||||
|
|
||||||
|
|
||||||
|
#define SONG(notes...) { notes }
|
||||||
|
|
||||||
|
|
||||||
|
// Note Types
|
||||||
|
#define MUSICAL_NOTE(note, duration) {(NOTE##note), duration}
|
||||||
|
#define WHOLE_NOTE(note) MUSICAL_NOTE(note, 64)
|
||||||
|
#define HALF_NOTE(note) MUSICAL_NOTE(note, 32)
|
||||||
|
#define QUARTER_NOTE(note) MUSICAL_NOTE(note, 16)
|
||||||
|
#define EIGHTH_NOTE(note) MUSICAL_NOTE(note, 8)
|
||||||
|
#define SIXTEENTH_NOTE(note) MUSICAL_NOTE(note, 4)
|
||||||
|
|
||||||
|
#define WHOLE_DOT_NOTE(note) MUSICAL_NOTE(note, 64+32)
|
||||||
|
#define HALF_DOT_NOTE(note) MUSICAL_NOTE(note, 32+16)
|
||||||
|
#define QUARTER_DOT_NOTE(note) MUSICAL_NOTE(note, 16+8)
|
||||||
|
#define EIGHTH_DOT_NOTE(note) MUSICAL_NOTE(note, 8+4)
|
||||||
|
#define SIXTEENTH_DOT_NOTE(note) MUSICAL_NOTE(note, 4+2)
|
||||||
|
|
||||||
|
// Note Type Shortcuts
|
||||||
|
#define M__NOTE(note, duration) MUSICAL_NOTE(note, duration)
|
||||||
|
#define W__NOTE(n) WHOLE_NOTE(n)
|
||||||
|
#define H__NOTE(n) HALF_NOTE(n)
|
||||||
|
#define Q__NOTE(n) QUARTER_NOTE(n)
|
||||||
|
#define E__NOTE(n) EIGHTH_NOTE(n)
|
||||||
|
#define S__NOTE(n) SIXTEENTH_NOTE(n)
|
||||||
|
#define WD_NOTE(n) WHOLE_DOT_NOTE(n)
|
||||||
|
#define HD_NOTE(n) HALF_DOT_NOTE(n)
|
||||||
|
#define QD_NOTE(n) QUARTER_DOT_NOTE(n)
|
||||||
|
#define ED_NOTE(n) EIGHTH_DOT_NOTE(n)
|
||||||
|
#define SD_NOTE(n) SIXTEENTH_DOT_NOTE(n)
|
||||||
|
|
||||||
|
// Note Styles
|
||||||
|
// Staccato makes sure there is a rest between each note. Think: TA TA TA
|
||||||
|
// Legato makes notes flow together. Think: TAAA
|
||||||
|
#define STACCATO 0.01
|
||||||
|
#define LEGATO 0
|
||||||
|
|
||||||
|
// Note Timbre
|
||||||
|
// Changes how the notes sound
|
||||||
|
#define TIMBRE_12 0.125
|
||||||
|
#define TIMBRE_25 0.250
|
||||||
|
#define TIMBRE_50 0.500
|
||||||
|
#define TIMBRE_75 0.750
|
||||||
|
#define TIMBRE_DEFAULT TIMBRE_50
|
||||||
|
|
||||||
|
|
||||||
|
// Notes - # = Octave
|
||||||
|
|
||||||
|
#define NOTE_REST 0.00
|
||||||
|
|
||||||
|
/* These notes are currently bugged
|
||||||
|
#define NOTE_C0 16.35
|
||||||
|
#define NOTE_CS0 17.32
|
||||||
|
#define NOTE_D0 18.35
|
||||||
|
#define NOTE_DS0 19.45
|
||||||
|
#define NOTE_E0 20.60
|
||||||
|
#define NOTE_F0 21.83
|
||||||
|
#define NOTE_FS0 23.12
|
||||||
|
#define NOTE_G0 24.50
|
||||||
|
#define NOTE_GS0 25.96
|
||||||
|
#define NOTE_A0 27.50
|
||||||
|
#define NOTE_AS0 29.14
|
||||||
|
#define NOTE_B0 30.87
|
||||||
|
#define NOTE_C1 32.70
|
||||||
|
#define NOTE_CS1 34.65
|
||||||
|
#define NOTE_D1 36.71
|
||||||
|
#define NOTE_DS1 38.89
|
||||||
|
#define NOTE_E1 41.20
|
||||||
|
#define NOTE_F1 43.65
|
||||||
|
#define NOTE_FS1 46.25
|
||||||
|
#define NOTE_G1 49.00
|
||||||
|
#define NOTE_GS1 51.91
|
||||||
|
#define NOTE_A1 55.00
|
||||||
|
#define NOTE_AS1 58.27
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define NOTE_B1 61.74
|
||||||
|
#define NOTE_C2 65.41
|
||||||
|
#define NOTE_CS2 69.30
|
||||||
|
#define NOTE_D2 73.42
|
||||||
|
#define NOTE_DS2 77.78
|
||||||
|
#define NOTE_E2 82.41
|
||||||
|
#define NOTE_F2 87.31
|
||||||
|
#define NOTE_FS2 92.50
|
||||||
|
#define NOTE_G2 98.00
|
||||||
|
#define NOTE_GS2 103.83
|
||||||
|
#define NOTE_A2 110.00
|
||||||
|
#define NOTE_AS2 116.54
|
||||||
|
#define NOTE_B2 123.47
|
||||||
|
#define NOTE_C3 130.81
|
||||||
|
#define NOTE_CS3 138.59
|
||||||
|
#define NOTE_D3 146.83
|
||||||
|
#define NOTE_DS3 155.56
|
||||||
|
#define NOTE_E3 164.81
|
||||||
|
#define NOTE_F3 174.61
|
||||||
|
#define NOTE_FS3 185.00
|
||||||
|
#define NOTE_G3 196.00
|
||||||
|
#define NOTE_GS3 207.65
|
||||||
|
#define NOTE_A3 220.00
|
||||||
|
#define NOTE_AS3 233.08
|
||||||
|
#define NOTE_B3 246.94
|
||||||
|
#define NOTE_C4 261.63
|
||||||
|
#define NOTE_CS4 277.18
|
||||||
|
#define NOTE_D4 293.66
|
||||||
|
#define NOTE_DS4 311.13
|
||||||
|
#define NOTE_E4 329.63
|
||||||
|
#define NOTE_F4 349.23
|
||||||
|
#define NOTE_FS4 369.99
|
||||||
|
#define NOTE_G4 392.00
|
||||||
|
#define NOTE_GS4 415.30
|
||||||
|
#define NOTE_A4 440.00
|
||||||
|
#define NOTE_AS4 466.16
|
||||||
|
#define NOTE_B4 493.88
|
||||||
|
#define NOTE_C5 523.25
|
||||||
|
#define NOTE_CS5 554.37
|
||||||
|
#define NOTE_D5 587.33
|
||||||
|
#define NOTE_DS5 622.25
|
||||||
|
#define NOTE_E5 659.26
|
||||||
|
#define NOTE_F5 698.46
|
||||||
|
#define NOTE_FS5 739.99
|
||||||
|
#define NOTE_G5 783.99
|
||||||
|
#define NOTE_GS5 830.61
|
||||||
|
#define NOTE_A5 880.00
|
||||||
|
#define NOTE_AS5 932.33
|
||||||
|
#define NOTE_B5 987.77
|
||||||
|
#define NOTE_C6 1046.50
|
||||||
|
#define NOTE_CS6 1108.73
|
||||||
|
#define NOTE_D6 1174.66
|
||||||
|
#define NOTE_DS6 1244.51
|
||||||
|
#define NOTE_E6 1318.51
|
||||||
|
#define NOTE_F6 1396.91
|
||||||
|
#define NOTE_FS6 1479.98
|
||||||
|
#define NOTE_G6 1567.98
|
||||||
|
#define NOTE_GS6 1661.22
|
||||||
|
#define NOTE_A6 1760.00
|
||||||
|
#define NOTE_AS6 1864.66
|
||||||
|
#define NOTE_B6 1975.53
|
||||||
|
#define NOTE_C7 2093.00
|
||||||
|
#define NOTE_CS7 2217.46
|
||||||
|
#define NOTE_D7 2349.32
|
||||||
|
#define NOTE_DS7 2489.02
|
||||||
|
#define NOTE_E7 2637.02
|
||||||
|
#define NOTE_F7 2793.83
|
||||||
|
#define NOTE_FS7 2959.96
|
||||||
|
#define NOTE_G7 3135.96
|
||||||
|
#define NOTE_GS7 3322.44
|
||||||
|
#define NOTE_A7 3520.00
|
||||||
|
#define NOTE_AS7 3729.31
|
||||||
|
#define NOTE_B7 3951.07
|
||||||
|
#define NOTE_C8 4186.01
|
||||||
|
#define NOTE_CS8 4434.92
|
||||||
|
#define NOTE_D8 4698.64
|
||||||
|
#define NOTE_DS8 4978.03
|
||||||
|
#define NOTE_E8 5274.04
|
||||||
|
#define NOTE_F8 5587.65
|
||||||
|
#define NOTE_FS8 5919.91
|
||||||
|
#define NOTE_G8 6271.93
|
||||||
|
#define NOTE_GS8 6644.88
|
||||||
|
#define NOTE_A8 7040.00
|
||||||
|
#define NOTE_AS8 7458.62
|
||||||
|
#define NOTE_B8 7902.13
|
||||||
|
|
||||||
|
// Flat Aliases
|
||||||
|
#define NOTE_DF0 NOTE_CS0
|
||||||
|
#define NOTE_EF0 NOTE_DS0
|
||||||
|
#define NOTE_GF0 NOTE_FS0
|
||||||
|
#define NOTE_AF0 NOTE_GS0
|
||||||
|
#define NOTE_BF0 NOTE_AS0
|
||||||
|
#define NOTE_DF1 NOTE_CS1
|
||||||
|
#define NOTE_EF1 NOTE_DS1
|
||||||
|
#define NOTE_GF1 NOTE_FS1
|
||||||
|
#define NOTE_AF1 NOTE_GS1
|
||||||
|
#define NOTE_BF1 NOTE_AS1
|
||||||
|
#define NOTE_DF2 NOTE_CS2
|
||||||
|
#define NOTE_EF2 NOTE_DS2
|
||||||
|
#define NOTE_GF2 NOTE_FS2
|
||||||
|
#define NOTE_AF2 NOTE_GS2
|
||||||
|
#define NOTE_BF2 NOTE_AS2
|
||||||
|
#define NOTE_DF3 NOTE_CS3
|
||||||
|
#define NOTE_EF3 NOTE_DS3
|
||||||
|
#define NOTE_GF3 NOTE_FS3
|
||||||
|
#define NOTE_AF3 NOTE_GS3
|
||||||
|
#define NOTE_BF3 NOTE_AS3
|
||||||
|
#define NOTE_DF4 NOTE_CS4
|
||||||
|
#define NOTE_EF4 NOTE_DS4
|
||||||
|
#define NOTE_GF4 NOTE_FS4
|
||||||
|
#define NOTE_AF4 NOTE_GS4
|
||||||
|
#define NOTE_BF4 NOTE_AS4
|
||||||
|
#define NOTE_DF5 NOTE_CS5
|
||||||
|
#define NOTE_EF5 NOTE_DS5
|
||||||
|
#define NOTE_GF5 NOTE_FS5
|
||||||
|
#define NOTE_AF5 NOTE_GS5
|
||||||
|
#define NOTE_BF5 NOTE_AS5
|
||||||
|
#define NOTE_DF6 NOTE_CS6
|
||||||
|
#define NOTE_EF6 NOTE_DS6
|
||||||
|
#define NOTE_GF6 NOTE_FS6
|
||||||
|
#define NOTE_AF6 NOTE_GS6
|
||||||
|
#define NOTE_BF6 NOTE_AS6
|
||||||
|
#define NOTE_DF7 NOTE_CS7
|
||||||
|
#define NOTE_EF7 NOTE_DS7
|
||||||
|
#define NOTE_GF7 NOTE_FS7
|
||||||
|
#define NOTE_AF7 NOTE_GS7
|
||||||
|
#define NOTE_BF7 NOTE_AS7
|
||||||
|
#define NOTE_DF8 NOTE_CS8
|
||||||
|
#define NOTE_EF8 NOTE_DS8
|
||||||
|
#define NOTE_GF8 NOTE_FS8
|
||||||
|
#define NOTE_AF8 NOTE_GS8
|
||||||
|
#define NOTE_BF8 NOTE_AS8
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,117 @@
|
|||||||
|
#include "musical_notes.h"
|
||||||
|
|
||||||
|
#ifndef SONG_LIST_H
|
||||||
|
#define SONG_LIST_H
|
||||||
|
|
||||||
|
#define ODE_TO_JOY \
|
||||||
|
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(_C4), Q__NOTE(_C4), Q__NOTE(_D4), Q__NOTE(_E4), \
|
||||||
|
QD_NOTE(_E4), E__NOTE(_D4), H__NOTE(_D4),
|
||||||
|
|
||||||
|
#define ROCK_A_BYE_BABY \
|
||||||
|
QD_NOTE(_B4), E__NOTE(_D4), Q__NOTE(_B5), \
|
||||||
|
H__NOTE(_A5), Q__NOTE(_G5), \
|
||||||
|
QD_NOTE(_B4), E__NOTE(_D5), Q__NOTE(_G5), \
|
||||||
|
H__NOTE(_FS5),
|
||||||
|
|
||||||
|
#define CLOSE_ENCOUNTERS_5_NOTE \
|
||||||
|
Q__NOTE(_D5), \
|
||||||
|
Q__NOTE(_E5), \
|
||||||
|
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 PLOVER_SOUND \
|
||||||
|
E__NOTE(_GS6 ), \
|
||||||
|
E__NOTE(_A6 ), \
|
||||||
|
S__NOTE(_REST), \
|
||||||
|
ED_NOTE(_E7 ), \
|
||||||
|
S__NOTE(_REST), \
|
||||||
|
ED_NOTE(_A7 ),
|
||||||
|
|
||||||
|
#define PLOVER_GOODBYE_SOUND \
|
||||||
|
E__NOTE(_GS6 ), \
|
||||||
|
E__NOTE(_A6 ), \
|
||||||
|
S__NOTE(_REST), \
|
||||||
|
ED_NOTE(_A7 ), \
|
||||||
|
S__NOTE(_REST), \
|
||||||
|
ED_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
|
@ -0,0 +1,28 @@
|
|||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
|
#define VIBRATO_LUT_LENGTH 20
|
||||||
|
|
||||||
|
const float VIBRATO_LUT[VIBRATO_LUT_LENGTH] = { \
|
||||||
|
1.00223368114872,
|
||||||
|
1.00425299436105,
|
||||||
|
1.00585842560279,
|
||||||
|
1.00689052852052,
|
||||||
|
1.0072464122237,
|
||||||
|
1.00689052852052,
|
||||||
|
1.00585842560279,
|
||||||
|
1.00425299436105,
|
||||||
|
1.00223368114872,
|
||||||
|
1,
|
||||||
|
0.99777129706302,
|
||||||
|
0.99576501699778,
|
||||||
|
0.994175695650927,
|
||||||
|
0.993156625943589,
|
||||||
|
0.992805720491269,
|
||||||
|
0.993156625943589,
|
||||||
|
0.994175695650927,
|
||||||
|
0.99576501699778,
|
||||||
|
0.99777129706302,
|
||||||
|
1
|
||||||
|
};
|
@ -0,0 +1,163 @@
|
|||||||
|
#include "voices.h"
|
||||||
|
#include "stdlib.h"
|
||||||
|
#include "vibrato_lut.h"
|
||||||
|
|
||||||
|
// these are imported from audio.c
|
||||||
|
extern uint16_t envelope_index;
|
||||||
|
extern float note_timbre;
|
||||||
|
extern float polyphony_rate;
|
||||||
|
|
||||||
|
voice_type voice = default_voice;
|
||||||
|
|
||||||
|
void set_voice(voice_type v) {
|
||||||
|
voice = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
void voice_iterate() {
|
||||||
|
voice = (voice + 1) % number_of_voices;
|
||||||
|
}
|
||||||
|
|
||||||
|
void voice_deiterate() {
|
||||||
|
voice = (voice - 1) % number_of_voices;
|
||||||
|
}
|
||||||
|
|
||||||
|
float voice_envelope(float frequency) {
|
||||||
|
// envelope_index ranges from 0 to 0xFFFF, which is preserved at 880.0 Hz
|
||||||
|
uint16_t compensated_index = (uint16_t)((float)envelope_index * (880.0 / frequency));
|
||||||
|
|
||||||
|
switch (voice) {
|
||||||
|
case default_voice:
|
||||||
|
note_timbre = TIMBRE_50;
|
||||||
|
polyphony_rate = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case butts_fader:
|
||||||
|
polyphony_rate = 0;
|
||||||
|
switch (compensated_index) {
|
||||||
|
case 0 ... 9:
|
||||||
|
frequency = frequency / 4;
|
||||||
|
note_timbre = TIMBRE_12;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 10 ... 19:
|
||||||
|
frequency = frequency / 2;
|
||||||
|
note_timbre = TIMBRE_12;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 20 ... 200:
|
||||||
|
note_timbre = .125 - pow(((float)compensated_index - 20) / (200 - 20), 2)*.125;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
note_timbre = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case octave_crunch:
|
||||||
|
polyphony_rate = 0;
|
||||||
|
switch (compensated_index) {
|
||||||
|
case 0 ... 9:
|
||||||
|
case 20 ... 24:
|
||||||
|
case 30 ... 32:
|
||||||
|
frequency = frequency / 2;
|
||||||
|
note_timbre = TIMBRE_12;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 10 ... 19:
|
||||||
|
case 25 ... 29:
|
||||||
|
case 33 ... 35:
|
||||||
|
frequency = frequency * 2;
|
||||||
|
note_timbre = TIMBRE_12;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
note_timbre = TIMBRE_12;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case duty_osc:
|
||||||
|
// This slows the loop down a substantial amount, so higher notes may freeze
|
||||||
|
polyphony_rate = 0;
|
||||||
|
switch (compensated_index) {
|
||||||
|
default:
|
||||||
|
#define OCS_SPEED 10
|
||||||
|
#define OCS_AMP .25
|
||||||
|
// sine wave is slow
|
||||||
|
// note_timbre = (sin((float)compensated_index/10000*OCS_SPEED) * OCS_AMP / 2) + .5;
|
||||||
|
// triangle wave is a bit faster
|
||||||
|
note_timbre = (float)abs((compensated_index*OCS_SPEED % 3000) - 1500) * ( OCS_AMP / 1500 ) + (1 - OCS_AMP) / 2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case duty_octave_down:
|
||||||
|
polyphony_rate = 0;
|
||||||
|
note_timbre = (envelope_index % 2) * .125 + .375 * 2;
|
||||||
|
if ((envelope_index % 4) == 0)
|
||||||
|
note_timbre = 0.5;
|
||||||
|
if ((envelope_index % 8) == 0)
|
||||||
|
note_timbre = 0;
|
||||||
|
break;
|
||||||
|
case delayed_vibrato:
|
||||||
|
polyphony_rate = 0;
|
||||||
|
note_timbre = TIMBRE_50;
|
||||||
|
#define VOICE_VIBRATO_DELAY 150
|
||||||
|
#define VOICE_VIBRATO_SPEED 50
|
||||||
|
switch (compensated_index) {
|
||||||
|
case 0 ... VOICE_VIBRATO_DELAY:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
frequency = frequency * VIBRATO_LUT[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
// case delayed_vibrato_octave:
|
||||||
|
// polyphony_rate = 0;
|
||||||
|
// if ((envelope_index % 2) == 1) {
|
||||||
|
// note_timbre = 0.55;
|
||||||
|
// } else {
|
||||||
|
// note_timbre = 0.45;
|
||||||
|
// }
|
||||||
|
// #define VOICE_VIBRATO_DELAY 150
|
||||||
|
// #define VOICE_VIBRATO_SPEED 50
|
||||||
|
// switch (compensated_index) {
|
||||||
|
// case 0 ... VOICE_VIBRATO_DELAY:
|
||||||
|
// break;
|
||||||
|
// default:
|
||||||
|
// frequency = frequency * VIBRATO_LUT[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)];
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// break;
|
||||||
|
// case duty_fifth_down:
|
||||||
|
// note_timbre = 0.5;
|
||||||
|
// if ((envelope_index % 3) == 0)
|
||||||
|
// note_timbre = 0.75;
|
||||||
|
// break;
|
||||||
|
// case duty_fourth_down:
|
||||||
|
// note_timbre = 0.0;
|
||||||
|
// if ((envelope_index % 12) == 0)
|
||||||
|
// note_timbre = 0.75;
|
||||||
|
// if (((envelope_index % 12) % 4) != 1)
|
||||||
|
// note_timbre = 0.75;
|
||||||
|
// break;
|
||||||
|
// case duty_third_down:
|
||||||
|
// note_timbre = 0.5;
|
||||||
|
// if ((envelope_index % 5) == 0)
|
||||||
|
// note_timbre = 0.75;
|
||||||
|
// break;
|
||||||
|
// case duty_fifth_third_down:
|
||||||
|
// note_timbre = 0.5;
|
||||||
|
// if ((envelope_index % 5) == 0)
|
||||||
|
// note_timbre = 0.75;
|
||||||
|
// if ((envelope_index % 3) == 0)
|
||||||
|
// note_timbre = 0.25;
|
||||||
|
// break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return frequency;
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <util/delay.h>
|
||||||
|
#include "musical_notes.h"
|
||||||
|
#include "song_list.h"
|
||||||
|
|
||||||
|
#ifndef VOICES_H
|
||||||
|
#define VOICES_H
|
||||||
|
|
||||||
|
float voice_envelope(float frequency);
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
default_voice,
|
||||||
|
butts_fader,
|
||||||
|
octave_crunch,
|
||||||
|
duty_osc,
|
||||||
|
duty_octave_down,
|
||||||
|
delayed_vibrato,
|
||||||
|
// delayed_vibrato_octave,
|
||||||
|
// duty_fifth_down,
|
||||||
|
// duty_fourth_down,
|
||||||
|
// duty_third_down,
|
||||||
|
// duty_fifth_third_down,
|
||||||
|
number_of_voices // important that this is last
|
||||||
|
} voice_type;
|
||||||
|
|
||||||
|
void set_voice(voice_type v);
|
||||||
|
void voice_iterate(void);
|
||||||
|
void voice_deiterate(void);
|
||||||
|
|
||||||
|
#endif
|