1
0
Fork 0

Adding Musical Notes

This commit is contained in:
IBNobody 2016-04-16 19:31:32 -05:00
commit 4aea806aa8
23 changed files with 1072 additions and 336 deletions

View file

@ -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
}
}

View file

@ -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);

View file

@ -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);
}
}

View file

@ -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
View 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

View file

@ -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
View 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.

View file

@ -0,0 +1,9 @@
:10000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
:10001000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0
:10002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0
:10003000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0
:10004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
:10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90
:00000001FF