diff options
| -rw-r--r-- | keyboard/preonic/keymaps/default/keymap.c | 160 | ||||
| -rw-r--r-- | quantum/audio.c | 100 |
2 files changed, 165 insertions, 95 deletions
diff --git a/keyboard/preonic/keymaps/default/keymap.c b/keyboard/preonic/keymaps/default/keymap.c index c52d8472f..6824f68b6 100644 --- a/keyboard/preonic/keymaps/default/keymap.c +++ b/keyboard/preonic/keymaps/default/keymap.c | |||
| @@ -1,31 +1,40 @@ | |||
| 1 | #include "preonic.h" | 1 | #include "preonic.h" |
| 2 | #include "action_layer.h" | 2 | #include "action_layer.h" |
| 3 | #include "eeconfig.h" | ||
| 3 | #ifdef AUDIO_ENABLE | 4 | #ifdef AUDIO_ENABLE |
| 4 | #include "audio.h" | 5 | #include "audio.h" |
| 6 | #define SCALE (int []){ 0 + (12*0), 2 + (12*0), 4 + (12*0), 5 + (12*0), 7 + (12*0), 9 + (12*0), 11 + (12*0), \ | ||
| 7 | 0 + (12*1), 2 + (12*1), 4 + (12*1), 5 + (12*1), 7 + (12*1), 9 + (12*1), 11 + (12*1), \ | ||
| 8 | 0 + (12*2), 2 + (12*2), 4 + (12*2), 5 + (12*2), 7 + (12*2), 9 + (12*2), 11 + (12*2), \ | ||
| 9 | 0 + (12*3), 2 + (12*3), 4 + (12*3), 5 + (12*3), 7 + (12*3), 9 + (12*3), 11 + (12*3), \ | ||
| 10 | 0 + (12*4), 2 + (12*4), 4 + (12*4), 5 + (12*4), 7 + (12*4), 9 + (12*4), 11 + (12*4), } | ||
| 5 | #endif | 11 | #endif |
| 6 | 12 | ||
| 7 | // Each layer gets a name for readability, which is then used in the keymap matrix below. | 13 | // Each layer gets a name for readability, which is then used in the keymap matrix below. |
| 8 | // The underscores don't mean anything - you can have a layer called STUFF or any other name. | 14 | // The underscores don't mean anything - you can have a layer called STUFF or any other name. |
| 9 | // Layer names don't all need to be of the same length, obviously, and you can also skip them | 15 | // Layer names don't all need to be of the same length, obviously, and you can also skip them |
| 10 | // entirely and just use numbers. | 16 | // entirely and just use numbers. |
| 11 | #define _QW 0 | 17 | #define _QWERTY 0 |
| 12 | #define _CM 1 | 18 | #define _COLEMAK 1 |
| 13 | #define _DV 2 | 19 | #define _DVORAK 2 |
| 14 | #define _LW 3 | 20 | #define _LOWER 3 |
| 15 | #define _RS 4 | 21 | #define _RAISE 4 |
| 16 | #define _AD 5 | 22 | #define _ADJUST 5 |
| 23 | #define _MUSIC 6 | ||
| 17 | 24 | ||
| 18 | // Macro name shortcuts | 25 | // Macro name shortcuts |
| 19 | #define QWERTY M(_QW) | 26 | #define QWERTY M(_QWERTY) |
| 20 | #define COLEMAK M(_CM) | 27 | #define COLEMAK M(_COLEMAK) |
| 21 | #define DVORAK M(_DV) | 28 | #define DVORAK M(_DVORAK) |
| 22 | #define LOWER M(_LW) | 29 | #define LOWER M(_LOWER) |
| 23 | #define RAISE M(_RS) | 30 | #define RAISE M(_RAISE) |
| 24 | #define M_BL 5 | 31 | #define M_BL 5 |
| 25 | #ifdef AUDIO_ENABLE | 32 | #ifdef AUDIO_ENABLE |
| 26 | #define AUD_OFF M(6) | 33 | #define AUD_OFF M(6) |
| 27 | #define AUD_ON M(7) | 34 | #define AUD_ON M(7) |
| 28 | #endif | 35 | #endif |
| 36 | #define MUS_OFF M(8) | ||
| 37 | #define MUS_ON M(9) | ||
| 29 | 38 | ||
| 30 | // Fillers to make layering more clear | 39 | // Fillers to make layering more clear |
| 31 | #define _______ KC_TRNS | 40 | #define _______ KC_TRNS |
| @@ -46,7 +55,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 46 | * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | | 55 | * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | |
| 47 | * `-----------------------------------------------------------------------------------' | 56 | * `-----------------------------------------------------------------------------------' |
| 48 | */ | 57 | */ |
| 49 | [_QW] = { | 58 | [_QWERTY] = { |
| 50 | {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, | 59 | {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, |
| 51 | {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL}, | 60 | {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL}, |
| 52 | {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, | 61 | {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, |
| @@ -67,7 +76,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 67 | * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | | 76 | * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | |
| 68 | * `-----------------------------------------------------------------------------------' | 77 | * `-----------------------------------------------------------------------------------' |
| 69 | */ | 78 | */ |
| 70 | [_CM] = { | 79 | [_COLEMAK] = { |
| 71 | {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, | 80 | {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, |
| 72 | {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL}, | 81 | {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL}, |
| 73 | {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, | 82 | {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, |
| @@ -88,7 +97,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 88 | * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | | 97 | * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | |
| 89 | * `-----------------------------------------------------------------------------------' | 98 | * `-----------------------------------------------------------------------------------' |
| 90 | */ | 99 | */ |
| 91 | [_DV] = { | 100 | [_DVORAK] = { |
| 92 | {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, | 101 | {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, |
| 93 | {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL}, | 102 | {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL}, |
| 94 | {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH}, | 103 | {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH}, |
| @@ -109,7 +118,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 109 | * | | | | | | | | Next | Vol- | Vol+ | Play | | 118 | * | | | | | | | | Next | Vol- | Vol+ | Play | |
| 110 | * `-----------------------------------------------------------------------------------' | 119 | * `-----------------------------------------------------------------------------------' |
| 111 | */ | 120 | */ |
| 112 | [_LW] = { | 121 | [_LOWER] = { |
| 113 | {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, | 122 | {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, |
| 114 | {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL}, | 123 | {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL}, |
| 115 | {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, | 124 | {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, |
| @@ -130,7 +139,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 130 | * | | | | | | | | Next | Vol- | Vol+ | Play | | 139 | * | | | | | | | | Next | Vol- | Vol+ | Play | |
| 131 | * `-----------------------------------------------------------------------------------' | 140 | * `-----------------------------------------------------------------------------------' |
| 132 | */ | 141 | */ |
| 133 | [_RS] = { | 142 | [_RAISE] = { |
| 134 | {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, | 143 | {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, |
| 135 | {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL}, | 144 | {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL}, |
| 136 | {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, | 145 | {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, |
| @@ -151,10 +160,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 151 | * | | | | | | | | | | | | | 160 | * | | | | | | | | | | | | |
| 152 | * `-----------------------------------------------------------------------------------' | 161 | * `-----------------------------------------------------------------------------------' |
| 153 | */ | 162 | */ |
| 154 | [_AD] = { | 163 | [_ADJUST] = { |
| 155 | {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12}, | 164 | {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12}, |
| 156 | {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, | 165 | {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, |
| 157 | {_______, _______, _______, AUD_ON, AUD_OFF, _______, _______, QWERTY, COLEMAK, DVORAK, _______, _______}, | 166 | {_______, _______, _______, AUD_ON, AUD_OFF, _______, _______, QWERTY, COLEMAK, DVORAK, _______, _______}, |
| 167 | {_______, _______, _______, MUS_ON, MUS_OFF, _______, _______, _______, _______, _______, _______, _______}, | ||
| 168 | {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} | ||
| 169 | }, | ||
| 170 | |||
| 171 | /* Music (reserved for process_action_user) | ||
| 172 | * | ||
| 173 | */ | ||
| 174 | [_MUSIC] = { | ||
| 175 | {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, | ||
| 176 | {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, | ||
| 177 | {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, | ||
| 158 | {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, | 178 | {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, |
| 159 | {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} | 179 | {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} |
| 160 | } | 180 | } |
| @@ -166,24 +186,20 @@ const uint16_t PROGMEM fn_actions[] = { | |||
| 166 | 186 | ||
| 167 | #ifdef AUDIO_ENABLE | 187 | #ifdef AUDIO_ENABLE |
| 168 | float start_up[][2] = { | 188 | float start_up[][2] = { |
| 169 | {440.0*pow(2.0,(55)/12.0), 12}, | 189 | {440.0*pow(2.0,(50)/12.0), 20}, |
| 170 | {0, 2}, | 190 | {440.0*pow(2.0,(62)/12.0), 8}, |
| 171 | {440.0*pow(2.0,(67)/12.0), 8}, | 191 | {440.0*pow(2.0,(54)/12.0), 20}, |
| 172 | {440.0*pow(2.0,(64)/12.0), 8}, | 192 | {440.0*pow(2.0,(62)/12.0), 8} |
| 173 | {440.0*pow(2.0,(55)/12.0), 8}, | ||
| 174 | {440.0*pow(2.0,(67)/12.0), 12}, | ||
| 175 | {0, 2}, | ||
| 176 | {440.0*pow(2.0,(67)/12.0), 12} | ||
| 177 | }; | 193 | }; |
| 178 | 194 | ||
| 179 | float tone_qw[][2] = { | 195 | float tone_qwerty[][2] = { |
| 180 | {440.0*pow(2.0,(59)/12.0), 8}, | 196 | {440.0*pow(2.0,(59)/12.0), 8}, |
| 181 | {440.0*pow(2.0,(60)/12.0), 8}, | 197 | {440.0*pow(2.0,(60)/12.0), 8}, |
| 182 | {0, 4}, | 198 | {0, 4}, |
| 183 | {440.0*pow(2.0,(67)/12.0), 16} | 199 | {440.0*pow(2.0,(67)/12.0), 16} |
| 184 | }; | 200 | }; |
| 185 | 201 | ||
| 186 | float tone_cm[][2] = { | 202 | float tone_colemak[][2] = { |
| 187 | {440.0*pow(2.0,(59)/12.0), 8}, | 203 | {440.0*pow(2.0,(59)/12.0), 8}, |
| 188 | {440.0*pow(2.0,(60)/12.0), 8}, | 204 | {440.0*pow(2.0,(60)/12.0), 8}, |
| 189 | {0, 4}, | 205 | {0, 4}, |
| @@ -192,7 +208,7 @@ float tone_cm[][2] = { | |||
| 192 | {440.0*pow(2.0,(71)/12.0), 12} | 208 | {440.0*pow(2.0,(71)/12.0), 12} |
| 193 | }; | 209 | }; |
| 194 | 210 | ||
| 195 | float tone_dv[][2] = { | 211 | float tone_dvorak[][2] = { |
| 196 | {440.0*pow(2.0,(59)/12.0), 8}, | 212 | {440.0*pow(2.0,(59)/12.0), 8}, |
| 197 | {440.0*pow(2.0,(60)/12.0), 8}, | 213 | {440.0*pow(2.0,(60)/12.0), 8}, |
| 198 | {0, 4}, | 214 | {0, 4}, |
| @@ -202,53 +218,66 @@ float tone_dv[][2] = { | |||
| 202 | {0, 4}, | 218 | {0, 4}, |
| 203 | {440.0*pow(2.0,(67)/12.0), 8} | 219 | {440.0*pow(2.0,(67)/12.0), 8} |
| 204 | }; | 220 | }; |
| 221 | |||
| 222 | float tone_music[][2] = { | ||
| 223 | {440.0*pow(2.0,(48)/12.0), 8}, | ||
| 224 | {440.0*pow(2.0,(50)/12.0), 8}, | ||
| 225 | {440.0*pow(2.0,(52)/12.0), 8}, | ||
| 226 | {440.0*pow(2.0,(53)/12.0), 8}, | ||
| 227 | {440.0*pow(2.0,(55)/12.0), 8}, | ||
| 228 | {440.0*pow(2.0,(57)/12.0), 8}, | ||
| 229 | {440.0*pow(2.0,(59)/12.0), 8}, | ||
| 230 | {440.0*pow(2.0,(60)/12.0), 8} | ||
| 231 | }; | ||
| 205 | #endif | 232 | #endif |
| 206 | 233 | ||
| 207 | 234 | ||
| 208 | const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) | 235 | const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) |
| 209 | { | 236 | { |
| 210 | // MACRODOWN only works in this function | ||
| 211 | switch(id) { | 237 | switch(id) { |
| 212 | case _QW: | 238 | case _QWERTY: |
| 213 | if (record->event.pressed) { | 239 | if (record->event.pressed) { |
| 214 | #ifdef AUDIO_ENABLE | 240 | #ifdef AUDIO_ENABLE |
| 215 | play_notes(&tone_qw, 4, false); | 241 | play_notes(&tone_qwerty, 4, false); |
| 216 | #endif | 242 | #endif |
| 217 | default_layer_set(1UL<<_QW); | 243 | eeconfig_write_default_layer(1UL<<_QWERTY); |
| 244 | default_layer_set(1UL<<_QWERTY); | ||
| 218 | } | 245 | } |
| 219 | break; | 246 | break; |
| 220 | case _CM: | 247 | case _COLEMAK: |
| 221 | if (record->event.pressed) { | 248 | if (record->event.pressed) { |
| 222 | #ifdef AUDIO_ENABLE | 249 | #ifdef AUDIO_ENABLE |
| 223 | play_notes(&tone_cm, 6, false); | 250 | play_notes(&tone_colemak, 6, false); |
| 224 | #endif | 251 | #endif |
| 225 | default_layer_set(1UL<<_CM); | 252 | eeconfig_write_default_layer(1UL<<_COLEMAK); |
| 253 | default_layer_set(1UL<<_COLEMAK); | ||
| 226 | } | 254 | } |
| 227 | break; | 255 | break; |
| 228 | case _DV: | 256 | case _DVORAK: |
| 229 | if (record->event.pressed) { | 257 | if (record->event.pressed) { |
| 230 | #ifdef AUDIO_ENABLE | 258 | #ifdef AUDIO_ENABLE |
| 231 | play_notes(&tone_dv, 8, false); | 259 | play_notes(&tone_dvorak, 8, false); |
| 232 | #endif | 260 | #endif |
| 233 | default_layer_set(1UL<<_DV); | 261 | eeconfig_write_default_layer(1UL<<_DVORAK); |
| 262 | default_layer_set(1UL<<_DVORAK); | ||
| 234 | } | 263 | } |
| 235 | break; | 264 | break; |
| 236 | case _LW: | 265 | case _LOWER: |
| 237 | if (record->event.pressed) { | 266 | if (record->event.pressed) { |
| 238 | layer_on(_LW); | 267 | layer_on(_LOWER); |
| 239 | update_tri_layer(_LW, _RS, _AD); | 268 | update_tri_layer(_LOWER, _RAISE, _ADJUST); |
| 240 | } else { | 269 | } else { |
| 241 | layer_off(_LW); | 270 | layer_off(_LOWER); |
| 242 | update_tri_layer(_LW, _RS, _AD); | 271 | update_tri_layer(_LOWER, _RAISE, _ADJUST); |
| 243 | } | 272 | } |
| 244 | break; | 273 | break; |
| 245 | case _RS: | 274 | case _RAISE: |
| 246 | if (record->event.pressed) { | 275 | if (record->event.pressed) { |
| 247 | layer_on(_RS); | 276 | layer_on(_RAISE); |
| 248 | update_tri_layer(_LW, _RS, _AD); | 277 | update_tri_layer(_LOWER, _RAISE, _ADJUST); |
| 249 | } else { | 278 | } else { |
| 250 | layer_off(_RS); | 279 | layer_off(_RAISE); |
| 251 | update_tri_layer(_LW, _RS, _AD); | 280 | update_tri_layer(_LOWER, _RAISE, _ADJUST); |
| 252 | } | 281 | } |
| 253 | break; | 282 | break; |
| 254 | case M_BL: | 283 | case M_BL: |
| @@ -272,7 +301,23 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) | |||
| 272 | if (record->event.pressed) { | 301 | if (record->event.pressed) { |
| 273 | #ifdef AUDIO_ENABLE | 302 | #ifdef AUDIO_ENABLE |
| 274 | audio_on(); | 303 | audio_on(); |
| 275 | play_notes(&start_up, 7, false); | 304 | play_notes(&start_up, 4, false); |
| 305 | #endif | ||
| 306 | } | ||
| 307 | break; | ||
| 308 | case 8: | ||
| 309 | if (record->event.pressed) { | ||
| 310 | #ifdef AUDIO_ENABLE | ||
| 311 | layer_off(_MUSIC); | ||
| 312 | stop_all_notes(); | ||
| 313 | #endif | ||
| 314 | } | ||
| 315 | break; | ||
| 316 | case 9: | ||
| 317 | if (record->event.pressed) { | ||
| 318 | #ifdef AUDIO_ENABLE | ||
| 319 | play_notes(&tone_music, 8, false); | ||
| 320 | layer_on(_MUSIC); | ||
| 276 | #endif | 321 | #endif |
| 277 | } | 322 | } |
| 278 | break; | 323 | break; |
| @@ -280,9 +325,24 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) | |||
| 280 | return MACRO_NONE; | 325 | return MACRO_NONE; |
| 281 | }; | 326 | }; |
| 282 | 327 | ||
| 328 | uint8_t starting_note = 0x0C; | ||
| 329 | int offset = 7; | ||
| 330 | |||
| 331 | void process_action_user(keyrecord_t *record) { | ||
| 332 | |||
| 333 | if (IS_LAYER_ON(_MUSIC)) { | ||
| 334 | if (record->event.pressed) { | ||
| 335 | play_note(((double)261.626)*pow(2.0, -2.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF); | ||
| 336 | } else { | ||
| 337 | stop_note(((double)261.626)*pow(2.0, -2.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row))); | ||
| 338 | } | ||
| 339 | } | ||
| 340 | |||
| 341 | } | ||
| 342 | |||
| 283 | void matrix_init_user(void) { | 343 | void matrix_init_user(void) { |
| 284 | #ifdef AUDIO_ENABLE | 344 | #ifdef AUDIO_ENABLE |
| 285 | init_notes(); | 345 | init_notes(); |
| 286 | play_notes(&start_up, 7, false); | 346 | play_notes(&start_up, 4, false); |
| 287 | #endif | 347 | #endif |
| 288 | } | 348 | } |
diff --git a/quantum/audio.c b/quantum/audio.c index 73985479c..5edcccdbe 100644 --- a/quantum/audio.c +++ b/quantum/audio.c | |||
| @@ -32,6 +32,8 @@ int voice_place = 0; | |||
| 32 | double frequency = 0; | 32 | double frequency = 0; |
| 33 | int volume = 0; | 33 | int volume = 0; |
| 34 | long position = 0; | 34 | long position = 0; |
| 35 | int duty_place = 1; | ||
| 36 | int duty_counter = 0; | ||
| 35 | 37 | ||
| 36 | double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0}; | 38 | double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0}; |
| 37 | int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0}; | 39 | int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0}; |
| @@ -98,53 +100,55 @@ void stop_all_notes() { | |||
| 98 | } | 100 | } |
| 99 | 101 | ||
| 100 | void stop_note(double freq) { | 102 | void stop_note(double freq) { |
| 101 | #ifdef PWM_AUDIO | 103 | if (note) { |
| 102 | freq = freq / SAMPLE_RATE; | ||
| 103 | #endif | ||
| 104 | for (int i = 7; i >= 0; i--) { | ||
| 105 | if (frequencies[i] == freq) { | ||
| 106 | frequencies[i] = 0; | ||
| 107 | volumes[i] = 0; | ||
| 108 | for (int j = i; (j < 7); j++) { | ||
| 109 | frequencies[j] = frequencies[j+1]; | ||
| 110 | frequencies[j+1] = 0; | ||
| 111 | volumes[j] = volumes[j+1]; | ||
| 112 | volumes[j+1] = 0; | ||
| 113 | } | ||
| 114 | } | ||
| 115 | } | ||
| 116 | voices--; | ||
| 117 | if (voices < 0) | ||
| 118 | voices = 0; | ||
| 119 | if (voices == 0) { | ||
| 120 | #ifdef PWM_AUDIO | 104 | #ifdef PWM_AUDIO |
| 121 | TIMSK3 &= ~_BV(OCIE3A); | 105 | freq = freq / SAMPLE_RATE; |
| 122 | #else | ||
| 123 | TIMSK3 &= ~_BV(OCIE3A); | ||
| 124 | TCCR3A &= ~_BV(COM3A1); | ||
| 125 | #endif | 106 | #endif |
| 126 | frequency = 0; | 107 | for (int i = 7; i >= 0; i--) { |
| 127 | volume = 0; | 108 | if (frequencies[i] == freq) { |
| 128 | note = false; | 109 | frequencies[i] = 0; |
| 129 | } else { | 110 | volumes[i] = 0; |
| 130 | double freq = frequencies[voices - 1]; | 111 | for (int j = i; (j < 7); j++) { |
| 131 | int vol = volumes[voices - 1]; | 112 | frequencies[j] = frequencies[j+1]; |
| 132 | double starting_f = frequency; | 113 | frequencies[j+1] = 0; |
| 133 | if (frequency < freq) { | 114 | volumes[j] = volumes[j+1]; |
| 134 | sliding = true; | 115 | volumes[j+1] = 0; |
| 135 | for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) { | 116 | } |
| 136 | frequency = f; | ||
| 137 | } | 117 | } |
| 138 | sliding = false; | 118 | } |
| 139 | } else if (frequency > freq) { | 119 | voices--; |
| 140 | sliding = true; | 120 | if (voices < 0) |
| 141 | for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 2000.0)) { | 121 | voices = 0; |
| 142 | frequency = f; | 122 | if (voices == 0) { |
| 123 | #ifdef PWM_AUDIO | ||
| 124 | TIMSK3 &= ~_BV(OCIE3A); | ||
| 125 | #else | ||
| 126 | TIMSK3 &= ~_BV(OCIE3A); | ||
| 127 | TCCR3A &= ~_BV(COM3A1); | ||
| 128 | #endif | ||
| 129 | frequency = 0; | ||
| 130 | volume = 0; | ||
| 131 | note = false; | ||
| 132 | } else { | ||
| 133 | double freq = frequencies[voices - 1]; | ||
| 134 | int vol = volumes[voices - 1]; | ||
| 135 | double starting_f = frequency; | ||
| 136 | if (frequency < freq) { | ||
| 137 | sliding = true; | ||
| 138 | for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) { | ||
| 139 | frequency = f; | ||
| 140 | } | ||
| 141 | sliding = false; | ||
| 142 | } else if (frequency > freq) { | ||
| 143 | sliding = true; | ||
| 144 | for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 2000.0)) { | ||
| 145 | frequency = f; | ||
| 146 | } | ||
| 147 | sliding = false; | ||
| 143 | } | 148 | } |
| 144 | sliding = false; | 149 | frequency = freq; |
| 150 | volume = vol; | ||
| 145 | } | 151 | } |
| 146 | frequency = freq; | ||
| 147 | volume = vol; | ||
| 148 | } | 152 | } |
| 149 | } | 153 | } |
| 150 | 154 | ||
| @@ -239,13 +243,19 @@ ISR(TIMER3_COMPA_vect) { | |||
| 239 | if (frequency > 0) { | 243 | if (frequency > 0) { |
| 240 | // ICR3 = (int)(((double)F_CPU) / frequency); // Set max to the period | 244 | // ICR3 = (int)(((double)F_CPU) / frequency); // Set max to the period |
| 241 | // OCR3A = (int)(((double)F_CPU) / frequency) >> 1; // Set compare to half the period | 245 | // OCR3A = (int)(((double)F_CPU) / frequency) >> 1; // Set compare to half the period |
| 242 | if (place > 10) { | 246 | voice_place %= voices; |
| 247 | if (place > (frequencies[voice_place] / 500)) { | ||
| 243 | voice_place = (voice_place + 1) % voices; | 248 | voice_place = (voice_place + 1) % voices; |
| 244 | place = 0.0; | 249 | place = 0.0; |
| 245 | } | 250 | } |
| 246 | ICR3 = (int)(((double)F_CPU) / frequencies[voice_place]); // Set max to the period | 251 | ICR3 = (int)(((double)F_CPU) / frequencies[voice_place]); // Set max to the period |
| 247 | OCR3A = (int)(((double)F_CPU) / frequencies[voice_place]) >> 1; // Set compare to half the period | 252 | OCR3A = (int)(((double)F_CPU) / frequencies[voice_place]) >> 1 * duty_place; // Set compare to half the period |
| 248 | place++; | 253 | place++; |
| 254 | // if (duty_counter > (frequencies[voice_place] / 500)) { | ||
| 255 | // duty_place = (duty_place % 3) + 1; | ||
| 256 | // duty_counter = 0; | ||
| 257 | // } | ||
| 258 | // duty_counter++; | ||
| 249 | } | 259 | } |
| 250 | #endif | 260 | #endif |
| 251 | } | 261 | } |
| @@ -375,7 +385,7 @@ if (audio_config.enable) { | |||
| 375 | 385 | ||
| 376 | void play_note(double freq, int vol) { | 386 | void play_note(double freq, int vol) { |
| 377 | 387 | ||
| 378 | if (audio_config.enable) { | 388 | if (audio_config.enable && voices < 8) { |
| 379 | 389 | ||
| 380 | if (notes) | 390 | if (notes) |
| 381 | stop_all_notes(); | 391 | stop_all_notes(); |
