Adding Musical Notes
This commit is contained in:
commit
4aea806aa8
23 changed files with 1072 additions and 336 deletions
148
quantum/audio.c
148
quantum/audio.c
|
@ -8,6 +8,8 @@
|
|||
#include "audio.h"
|
||||
#include "keymap_common.h"
|
||||
|
||||
#include "eeconfig.h"
|
||||
|
||||
#define PI 3.14159265
|
||||
|
||||
// #define PWM_AUDIO
|
||||
|
@ -30,6 +32,8 @@ int voice_place = 0;
|
|||
double frequency = 0;
|
||||
int volume = 0;
|
||||
long position = 0;
|
||||
int duty_place = 1;
|
||||
int duty_counter = 0;
|
||||
|
||||
double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0};
|
||||
int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0};
|
||||
|
@ -57,6 +61,25 @@ uint8_t notes_length;
|
|||
bool notes_repeat;
|
||||
uint8_t current_note = 0;
|
||||
|
||||
audio_config_t audio_config;
|
||||
|
||||
|
||||
void audio_toggle(void) {
|
||||
audio_config.enable ^= 1;
|
||||
eeconfig_write_audio(audio_config.raw);
|
||||
}
|
||||
|
||||
void audio_on(void) {
|
||||
audio_config.enable = 1;
|
||||
eeconfig_write_audio(audio_config.raw);
|
||||
}
|
||||
|
||||
void audio_off(void) {
|
||||
audio_config.enable = 0;
|
||||
eeconfig_write_audio(audio_config.raw);
|
||||
}
|
||||
|
||||
|
||||
void stop_all_notes() {
|
||||
voices = 0;
|
||||
#ifdef PWM_AUDIO
|
||||
|
@ -77,58 +100,66 @@ void stop_all_notes() {
|
|||
}
|
||||
|
||||
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) {
|
||||
if (note) {
|
||||
#ifdef PWM_AUDIO
|
||||
TIMSK3 &= ~_BV(OCIE3A);
|
||||
#else
|
||||
TIMSK3 &= ~_BV(OCIE3A);
|
||||
TCCR3A &= ~_BV(COM3A1);
|
||||
freq = freq / SAMPLE_RATE;
|
||||
#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;
|
||||
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;
|
||||
}
|
||||
}
|
||||
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;
|
||||
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() {
|
||||
|
||||
/* check signature */
|
||||
if (!eeconfig_is_enabled()) {
|
||||
eeconfig_init();
|
||||
}
|
||||
audio_config.raw = eeconfig_read_audio();
|
||||
|
||||
#ifdef PWM_AUDIO
|
||||
PLLFRQ = _BV(PDIV2);
|
||||
PLLCSR = _BV(PLLE);
|
||||
|
@ -160,7 +191,6 @@ void init_notes() {
|
|||
|
||||
|
||||
ISR(TIMER3_COMPA_vect) {
|
||||
|
||||
if (note) {
|
||||
#ifdef PWM_AUDIO
|
||||
if (voices == 1) {
|
||||
|
@ -213,13 +243,19 @@ ISR(TIMER3_COMPA_vect) {
|
|||
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 %= voices;
|
||||
if (place > (frequencies[voice_place] / 500)) {
|
||||
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
|
||||
OCR3A = (int)(((double)F_CPU) / frequencies[voice_place]) >> 1 * duty_place; // Set compare to half the period
|
||||
place++;
|
||||
// if (duty_counter > (frequencies[voice_place] / 500)) {
|
||||
// duty_place = (duty_place % 3) + 1;
|
||||
// duty_counter = 0;
|
||||
// }
|
||||
// duty_counter++;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
@ -288,9 +324,16 @@ ISR(TIMER3_COMPA_vect) {
|
|||
|
||||
}
|
||||
|
||||
if (!audio_config.enable) {
|
||||
notes = false;
|
||||
note = false;
|
||||
}
|
||||
}
|
||||
|
||||
void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat) {
|
||||
|
||||
if (audio_config.enable) {
|
||||
|
||||
if (note)
|
||||
stop_all_notes();
|
||||
notes = true;
|
||||
|
@ -319,7 +362,12 @@ void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat) {
|
|||
#endif
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void play_sample(uint8_t * s, uint16_t l, bool r) {
|
||||
|
||||
if (audio_config.enable) {
|
||||
|
||||
stop_all_notes();
|
||||
place_int = 0;
|
||||
sample = s;
|
||||
|
@ -330,9 +378,15 @@ void play_sample(uint8_t * s, uint16_t l, bool r) {
|
|||
TIMSK3 |= _BV(OCIE3A);
|
||||
#else
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void play_note(double freq, int vol) {
|
||||
|
||||
if (audio_config.enable && voices < 8) {
|
||||
|
||||
if (notes)
|
||||
stop_all_notes();
|
||||
note = true;
|
||||
|
@ -367,4 +421,6 @@ void play_note(double freq, int vol) {
|
|||
TCCR3A |= _BV(COM3A1);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -3,9 +3,21 @@
|
|||
#include <avr/io.h>
|
||||
#include <util/delay.h>
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
void init_notes(void);
|
||||
void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat);
|
||||
void stop_all_notes();
|
||||
void init_notes();
|
||||
void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat);
|
||||
|
|
|
@ -27,6 +27,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
#include "keymap_midi.h"
|
||||
#include "bootloader.h"
|
||||
|
||||
extern keymap_config_t keymap_config;
|
||||
|
||||
#include <stdio.h>
|
||||
#include <inttypes.h>
|
||||
#ifdef AUDIO_ENABLE
|
||||
|
@ -47,120 +49,9 @@ action_t action_for_key(uint8_t layer, keypos_t key)
|
|||
// 16bit keycodes - important
|
||||
uint16_t keycode = keymap_key_to_keycode(layer, key);
|
||||
|
||||
if (keycode >= 0x0100 && keycode < 0x2000) {
|
||||
// Has a modifier
|
||||
action_t action;
|
||||
// Split it up
|
||||
action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); // adds modifier to key
|
||||
return action;
|
||||
} else if (keycode >= 0x2000 && keycode < 0x3000) {
|
||||
// Is a shortcut for function layer, pull last 12bits
|
||||
// This means we have 4,096 FN macros at our disposal
|
||||
return keymap_func_to_action(keycode & 0xFFF);
|
||||
} else if (keycode >= 0x3000 && keycode < 0x4000) {
|
||||
// When the code starts with 3, it's an action macro.
|
||||
action_t action;
|
||||
action.code = ACTION_MACRO(keycode & 0xFF);
|
||||
return action;
|
||||
#ifdef BACKLIGHT_ENABLE
|
||||
} else if (keycode >= BL_0 && keycode <= BL_15) {
|
||||
action_t action;
|
||||
action.code = ACTION_BACKLIGHT_LEVEL(keycode & 0x000F);
|
||||
return action;
|
||||
} else if (keycode == BL_DEC) {
|
||||
action_t action;
|
||||
action.code = ACTION_BACKLIGHT_DECREASE();
|
||||
return action;
|
||||
} else if (keycode == BL_INC) {
|
||||
action_t action;
|
||||
action.code = ACTION_BACKLIGHT_INCREASE();
|
||||
return action;
|
||||
} else if (keycode == BL_TOGG) {
|
||||
action_t action;
|
||||
action.code = ACTION_BACKLIGHT_TOGGLE();
|
||||
return action;
|
||||
} else if (keycode == BL_STEP) {
|
||||
action_t action;
|
||||
action.code = ACTION_BACKLIGHT_STEP();
|
||||
return action;
|
||||
#endif
|
||||
} else if (keycode == RESET) { // RESET is 0x5000, which is why this is here
|
||||
action_t action;
|
||||
clear_keyboard();
|
||||
#ifdef AUDIO_ENABLE
|
||||
play_notes(&goodbye, 3, false);
|
||||
#endif
|
||||
_delay_ms(250);
|
||||
#ifdef ATREUS_ASTAR
|
||||
*(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific
|
||||
#endif
|
||||
bootloader_jump();
|
||||
return action;
|
||||
} else if (keycode == DEBUG) { // DEBUG is 0x5001
|
||||
// TODO: Does this actually work?
|
||||
action_t action;
|
||||
print("\nDEBUG: enabled.\n");
|
||||
debug_enable = true;
|
||||
return action;
|
||||
} else if (keycode >= 0x5000 && keycode < 0x6000) {
|
||||
// Layer movement shortcuts
|
||||
// See .h to see constraints/usage
|
||||
int type = (keycode >> 0x8) & 0xF;
|
||||
if (type == 0x1) {
|
||||
// Layer set "GOTO"
|
||||
int when = (keycode >> 0x4) & 0x3;
|
||||
int layer = keycode & 0xF;
|
||||
action_t action;
|
||||
action.code = ACTION_LAYER_SET(layer, when);
|
||||
return action;
|
||||
} else if (type == 0x2) {
|
||||
// Momentary layer
|
||||
int layer = keycode & 0xFF;
|
||||
action_t action;
|
||||
action.code = ACTION_LAYER_MOMENTARY(layer);
|
||||
return action;
|
||||
} else if (type == 0x3) {
|
||||
// Set default layer
|
||||
int layer = keycode & 0xFF;
|
||||
action_t action;
|
||||
action.code = ACTION_DEFAULT_LAYER_SET(layer);
|
||||
return action;
|
||||
} else if (type == 0x4) {
|
||||
// Set default layer
|
||||
int layer = keycode & 0xFF;
|
||||
action_t action;
|
||||
action.code = ACTION_LAYER_TOGGLE(layer);
|
||||
return action;
|
||||
}
|
||||
#ifdef MIDI_ENABLE
|
||||
} else if (keycode >= 0x6000 && keycode < 0x7000) {
|
||||
action_t action;
|
||||
action.code = ACTION_FUNCTION_OPT(keycode & 0xFF, (keycode & 0x0F00) >> 8);
|
||||
return action;
|
||||
#endif
|
||||
} else if (keycode >= 0x7000 && keycode < 0x8000) {
|
||||
action_t action;
|
||||
action.code = ACTION_MODS_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF);
|
||||
return action;
|
||||
} else if (keycode >= 0x8000 && keycode < 0x9000) {
|
||||
action_t action;
|
||||
action.code = ACTION_LAYER_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF);
|
||||
return action;
|
||||
#ifdef UNICODE_ENABLE
|
||||
} else if (keycode >= 0x8000000) {
|
||||
action_t action;
|
||||
uint16_t unicode = keycode & ~(0x8000);
|
||||
action.code = ACTION_FUNCTION_OPT(unicode & 0xFF, (unicode & 0xFF00) >> 8);
|
||||
return action;
|
||||
#endif
|
||||
} else {
|
||||
|
||||
}
|
||||
|
||||
switch (keycode) {
|
||||
case KC_FN0 ... KC_FN31:
|
||||
return keymap_fn_to_action(keycode);
|
||||
#ifdef BOOTMAGIC_ENABLE
|
||||
case KC_CAPSLOCK:
|
||||
case KC_LOCKING_CAPS:
|
||||
if (keymap_config.swap_control_capslock || keymap_config.capslock_to_control) {
|
||||
|
@ -224,7 +115,6 @@ action_t action_for_key(uint8_t layer, keypos_t key)
|
|||
return keycode_to_action(KC_BSLASH);
|
||||
}
|
||||
return keycode_to_action(KC_BSPACE);
|
||||
#endif
|
||||
default:
|
||||
return keycode_to_action(keycode);
|
||||
}
|
||||
|
@ -265,6 +155,142 @@ static action_t keycode_to_action(uint16_t keycode)
|
|||
case KC_TRNS:
|
||||
action.code = ACTION_TRANSPARENT;
|
||||
break;
|
||||
case 0x0100 ... 0x1FFF: ;
|
||||
// Has a modifier
|
||||
// Split it up
|
||||
action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); // adds modifier to key
|
||||
break;
|
||||
case 0x2000 ... 0x2FFF:
|
||||
// Is a shortcut for function layer, pull last 12bits
|
||||
// This means we have 4,096 FN macros at our disposal
|
||||
return keymap_func_to_action(keycode & 0xFFF);
|
||||
break;
|
||||
case 0x3000 ... 0x3FFF: ;
|
||||
// When the code starts with 3, it's an action macro.
|
||||
action.code = ACTION_MACRO(keycode & 0xFF);
|
||||
break;
|
||||
#ifdef BACKLIGHT_ENABLE
|
||||
case BL_0 ... BL_15:
|
||||
action.code = ACTION_BACKLIGHT_LEVEL(keycode & 0x000F);
|
||||
break;
|
||||
case BL_DEC:
|
||||
action.code = ACTION_BACKLIGHT_DECREASE();
|
||||
break;
|
||||
case BL_INC:
|
||||
action.code = ACTION_BACKLIGHT_INCREASE();
|
||||
break;
|
||||
case BL_TOGG:
|
||||
action.code = ACTION_BACKLIGHT_TOGGLE();
|
||||
break;
|
||||
case BL_STEP:
|
||||
action.code = ACTION_BACKLIGHT_STEP();
|
||||
break;
|
||||
#endif
|
||||
case RESET: ; // RESET is 0x5000, which is why this is here
|
||||
clear_keyboard();
|
||||
#ifdef AUDIO_ENABLE
|
||||
play_notes(&goodbye, 3, false);
|
||||
#endif
|
||||
_delay_ms(250);
|
||||
#ifdef ATREUS_ASTAR
|
||||
*(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific
|
||||
#endif
|
||||
bootloader_jump();
|
||||
break;
|
||||
case DEBUG: ; // DEBUG is 0x5001
|
||||
print("\nDEBUG: enabled.\n");
|
||||
debug_enable = true;
|
||||
break;
|
||||
case 0x5002 ... 0x50FF:
|
||||
// MAGIC actions (BOOTMAGIC without the boot)
|
||||
if (!eeconfig_is_enabled()) {
|
||||
eeconfig_init();
|
||||
}
|
||||
/* keymap config */
|
||||
keymap_config.raw = eeconfig_read_keymap();
|
||||
if (keycode == MAGIC_SWAP_CONTROL_CAPSLOCK) {
|
||||
keymap_config.swap_control_capslock = 1;
|
||||
} else if (keycode == MAGIC_CAPSLOCK_TO_CONTROL) {
|
||||
keymap_config.capslock_to_control = 1;
|
||||
} else if (keycode == MAGIC_SWAP_LALT_LGUI) {
|
||||
keymap_config.swap_lalt_lgui = 1;
|
||||
} else if (keycode == MAGIC_SWAP_RALT_RGUI) {
|
||||
keymap_config.swap_ralt_rgui = 1;
|
||||
} else if (keycode == MAGIC_NO_GUI) {
|
||||
keymap_config.no_gui = 1;
|
||||
} else if (keycode == MAGIC_SWAP_GRAVE_ESC) {
|
||||
keymap_config.swap_grave_esc = 1;
|
||||
} else if (keycode == MAGIC_SWAP_BACKSLASH_BACKSPACE) {
|
||||
keymap_config.swap_backslash_backspace = 1;
|
||||
} else if (keycode == MAGIC_HOST_NKRO) {
|
||||
keymap_config.nkro = 1;
|
||||
} else if (keycode == MAGIC_SWAP_ALT_GUI) {
|
||||
keymap_config.swap_lalt_lgui = 1;
|
||||
keymap_config.swap_ralt_rgui = 1;
|
||||
}
|
||||
/* UNs */
|
||||
else if (keycode == MAGIC_UNSWAP_CONTROL_CAPSLOCK) {
|
||||
keymap_config.swap_control_capslock = 0;
|
||||
} else if (keycode == MAGIC_UNCAPSLOCK_TO_CONTROL) {
|
||||
keymap_config.capslock_to_control = 0;
|
||||
} else if (keycode == MAGIC_UNSWAP_LALT_LGUI) {
|
||||
keymap_config.swap_lalt_lgui = 0;
|
||||
} else if (keycode == MAGIC_UNSWAP_RALT_RGUI) {
|
||||
keymap_config.swap_ralt_rgui = 0;
|
||||
} else if (keycode == MAGIC_UNNO_GUI) {
|
||||
keymap_config.no_gui = 0;
|
||||
} else if (keycode == MAGIC_UNSWAP_GRAVE_ESC) {
|
||||
keymap_config.swap_grave_esc = 0;
|
||||
} else if (keycode == MAGIC_UNSWAP_BACKSLASH_BACKSPACE) {
|
||||
keymap_config.swap_backslash_backspace = 0;
|
||||
} else if (keycode == MAGIC_UNHOST_NKRO) {
|
||||
keymap_config.nkro = 0;
|
||||
} else if (keycode == MAGIC_UNSWAP_ALT_GUI) {
|
||||
keymap_config.swap_lalt_lgui = 0;
|
||||
keymap_config.swap_ralt_rgui = 0;
|
||||
}
|
||||
eeconfig_write_keymap(keymap_config.raw);
|
||||
break;
|
||||
case 0x5100 ... 0x5FFF: ;
|
||||
// Layer movement shortcuts
|
||||
// See .h to see constraints/usage
|
||||
int type = (keycode >> 0x8) & 0xF;
|
||||
if (type == 0x1) {
|
||||
// Layer set "GOTO"
|
||||
int when = (keycode >> 0x4) & 0x3;
|
||||
int layer = keycode & 0xF;
|
||||
action.code = ACTION_LAYER_SET(layer, when);
|
||||
} else if (type == 0x2) {
|
||||
// Momentary layer
|
||||
int layer = keycode & 0xFF;
|
||||
action.code = ACTION_LAYER_MOMENTARY(layer);
|
||||
} else if (type == 0x3) {
|
||||
// Set default layer
|
||||
int layer = keycode & 0xFF;
|
||||
action.code = ACTION_DEFAULT_LAYER_SET(layer);
|
||||
} else if (type == 0x4) {
|
||||
// Set default layer
|
||||
int layer = keycode & 0xFF;
|
||||
action.code = ACTION_LAYER_TOGGLE(layer);
|
||||
}
|
||||
break;
|
||||
#ifdef MIDI_ENABLE
|
||||
case 0x6000 ... 0x6FFF:
|
||||
action.code = ACTION_FUNCTION_OPT(keycode & 0xFF, (keycode & 0x0F00) >> 8);
|
||||
break;
|
||||
#endif
|
||||
case 0x7000 ... 0x7FFF:
|
||||
action.code = ACTION_MODS_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF);
|
||||
break;
|
||||
case 0x8000 ... 0x8FFF:
|
||||
action.code = ACTION_LAYER_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF);
|
||||
break;
|
||||
#ifdef UNICODE_ENABLE
|
||||
case 0x8000000 ... 0x8FFFFFF:
|
||||
uint16_t unicode = keycode & ~(0x8000);
|
||||
action.code = ACTION_FUNCTION_OPT(unicode & 0xFF, (unicode & 0xFF00) >> 8);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
action.code = ACTION_NO;
|
||||
break;
|
||||
|
@ -291,3 +317,11 @@ action_t keymap_func_to_action(uint16_t keycode)
|
|||
// For FUNC without 8bit limit
|
||||
return (action_t){ .code = pgm_read_word(&fn_actions[(int)keycode]) };
|
||||
}
|
||||
|
||||
void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
|
||||
if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
|
||||
layer_on(layer3);
|
||||
} else {
|
||||
layer_off(layer3);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,7 +30,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
// #include "print.h"
|
||||
#include "debug.h"
|
||||
|
||||
#ifdef BOOTMAGIC_ENABLE
|
||||
/* NOTE: Not portable. Bit field order depends on implementation */
|
||||
typedef union {
|
||||
uint16_t raw;
|
||||
|
@ -45,8 +44,6 @@ typedef union {
|
|||
bool nkro:1;
|
||||
};
|
||||
} keymap_config_t;
|
||||
keymap_config_t keymap_config;
|
||||
#endif
|
||||
|
||||
|
||||
/* translates key to keycode */
|
||||
|
@ -168,6 +165,30 @@ extern const uint16_t fn_actions[];
|
|||
#define RESET 0x5000
|
||||
#define DEBUG 0x5001
|
||||
|
||||
// MAGIC keycodes
|
||||
#define MAGIC_SWAP_CONTROL_CAPSLOCK 0x5002
|
||||
#define MAGIC_UNSWAP_CONTROL_CAPSLOCK 0x5003
|
||||
#define MAGIC_CAPSLOCK_TO_CONTROL 0x5004
|
||||
#define MAGIC_UNCAPSLOCK_TO_CONTROL 0x5005
|
||||
#define MAGIC_SWAP_LALT_LGUI 0x5006
|
||||
#define MAGIC_UNSWAP_LALT_LGUI 0x5007
|
||||
#define MAGIC_SWAP_RALT_RGUI 0x5008
|
||||
#define MAGIC_UNSWAP_RALT_RGUI 0x5009
|
||||
#define MAGIC_NO_GUI 0x500a
|
||||
#define MAGIC_UNNO_GUI 0x500b
|
||||
#define MAGIC_SWAP_GRAVE_ESC 0x500c
|
||||
#define MAGIC_UNSWAP_GRAVE_ESC 0x500d
|
||||
#define MAGIC_SWAP_BACKSLASH_BACKSPACE 0x500e
|
||||
#define MAGIC_UNSWAP_BACKSLASH_BACKSPACE 0x500f
|
||||
#define MAGIC_HOST_NKRO 0x5010
|
||||
#define MAGIC_UNHOST_NKRO 0x5011
|
||||
#define MAGIC_SWAP_ALT_GUI 0x5012
|
||||
#define MAGIC_UNSWAP_ALT_GUI 0x5013
|
||||
|
||||
#define AG_SWAP MAGIC_SWAP_ALT_GUI
|
||||
#define AG_NORM MAGIC_UNSWAP_ALT_GUI
|
||||
|
||||
|
||||
// GOTO layer - 16 layers max
|
||||
// when:
|
||||
// ON_PRESS = 1
|
||||
|
@ -208,5 +229,10 @@ extern const uint16_t fn_actions[];
|
|||
#define UNICODE(n) (n | 0x8000)
|
||||
#define UC(n) UNICODE(n)
|
||||
|
||||
// For tri-layer
|
||||
void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3);
|
||||
#define IS_LAYER_ON(layer) ((layer_state) & (1UL<<(layer)))
|
||||
#define IS_LAYER_OFF(layer) ((!layer_state) & (1UL<<(layer)))
|
||||
|
||||
|
||||
#endif
|
||||
|
|
182
quantum/musical_notes.h
Normal file
182
quantum/musical_notes.h
Normal file
|
@ -0,0 +1,182 @@
|
|||
#ifndef MUSICAL_NOTES_H
|
||||
#define MUSICAL_NOTES_H
|
||||
|
||||
// Tempo Placeholder
|
||||
#define TEMPO 120
|
||||
|
||||
|
||||
// Note Types
|
||||
#define WHOLE_NOTE(note) {(NOTE##note), 64}
|
||||
#define HALF_NOTE(note) {(NOTE##note), 32}
|
||||
#define QUARTER_NOTE(note) {(NOTE##note), 16}
|
||||
#define EIGTH_NOTE(note) {(NOTE##note), 8}
|
||||
#define SIXTEENTH_NOTE(note) {(NOTE##note), 4}
|
||||
|
||||
// Note Types Short
|
||||
#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) EIGTH_NOTE(n)
|
||||
#define S_NOTE(n) SIXTEENTH_NOTE(n)
|
||||
|
||||
|
||||
// Notes - # = Octave
|
||||
#define NOTE_REST 0.00
|
||||
#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
|
|
@ -46,6 +46,7 @@ endif
|
|||
|
||||
# Search Path
|
||||
VPATH += $(TOP_DIR)/$(QUANTUM_DIR)
|
||||
VPATH += $(TOP_DIR)/$(QUANTUM_DIR)/keymap_extras
|
||||
|
||||
include $(TMK_DIR)/protocol/lufa.mk
|
||||
|
||||
|
|
6
quantum/tools/README.md
Normal file
6
quantum/tools/README.md
Normal file
|
@ -0,0 +1,6 @@
|
|||
`eeprom_reset.hex` is to reset the eeprom on the Atmega32u4, like this:
|
||||
|
||||
dfu-programmer atmega32u4 erase
|
||||
dfu-programmer atmega32u4 flash --eeprom eeprom-reset.bin
|
||||
|
||||
You'll need to reflash afterwards, because DFU requires the flash to be erased before messing with the eeprom.
|
9
quantum/tools/eeprom_reset.hex
Normal file
9
quantum/tools/eeprom_reset.hex
Normal file
|
@ -0,0 +1,9 @@
|
|||
:10000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
|
||||
:10001000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0
|
||||
:10002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0
|
||||
:10003000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0
|
||||
:10004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
|
||||
:10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
|
||||
:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
|
||||
:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90
|
||||
:00000001FF
|
Loading…
Add table
Add a link
Reference in a new issue