diff options
| author | Jack Humbert <jack.humb@gmail.com> | 2017-07-20 23:57:11 -0400 |
|---|---|---|
| committer | Jack Humbert <jack.humb@gmail.com> | 2017-07-23 14:59:29 -0400 |
| commit | 6a3c66776cb10888b24400526241b46deeb051a8 (patch) | |
| tree | 7604aafe7087d9ab40aa0bb6bc603975e31d7e2e | |
| parent | 8edb67b08242f2ab641d7e658a0a7adb579bbae2 (diff) | |
| download | qmk_firmware-6a3c66776cb10888b24400526241b46deeb051a8.tar.gz qmk_firmware-6a3c66776cb10888b24400526241b46deeb051a8.zip | |
clean-up planck and preonic keymaps, move audio stuff around
| -rw-r--r-- | keyboards/planck/keymaps/default/config.h | 10 | ||||
| -rw-r--r-- | keyboards/planck/keymaps/default/keymap.c | 100 | ||||
| -rw-r--r-- | keyboards/preonic/keymaps/default/config.h | 10 | ||||
| -rw-r--r-- | keyboards/preonic/keymaps/default/keymap.c | 95 | ||||
| -rw-r--r-- | quantum/audio/audio.c | 14 | ||||
| -rw-r--r-- | quantum/audio/audio.h | 2 | ||||
| -rw-r--r-- | quantum/audio/song_list.h | 42 | ||||
| -rw-r--r-- | quantum/config_common.h | 2 | ||||
| -rw-r--r-- | quantum/process_keycode/process_music.c | 20 | ||||
| -rw-r--r-- | quantum/quantum.c | 47 | ||||
| -rw-r--r-- | quantum/quantum.h | 3 | ||||
| -rw-r--r-- | quantum/quantum_keycodes.h | 4 |
12 files changed, 184 insertions, 165 deletions
diff --git a/keyboards/planck/keymaps/default/config.h b/keyboards/planck/keymaps/default/config.h index 4c6158199..1ce547b94 100644 --- a/keyboards/planck/keymaps/default/config.h +++ b/keyboards/planck/keymaps/default/config.h | |||
| @@ -15,6 +15,16 @@ | |||
| 15 | */ | 15 | */ |
| 16 | #define MIDI_BASIC | 16 | #define MIDI_BASIC |
| 17 | 17 | ||
| 18 | #ifdef AUDIO_ENABLE | ||
| 19 | #define STARTUP_SONG SONG(PLANCK_SOUND) | ||
| 20 | // #define STARTUP_SONG SONG(NO_SOUND) | ||
| 21 | |||
| 22 | #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \ | ||
| 23 | SONG(COLEMAK_SOUND), \ | ||
| 24 | SONG(DVORAK_SOUND) \ | ||
| 25 | } | ||
| 26 | #endif | ||
| 27 | |||
| 18 | /* enable advanced MIDI features: | 28 | /* enable advanced MIDI features: |
| 19 | - MIDI notes can be added to the keymap | 29 | - MIDI notes can be added to the keymap |
| 20 | - Octave shift and transpose | 30 | - Octave shift and transpose |
diff --git a/keyboards/planck/keymaps/default/keymap.c b/keyboards/planck/keymaps/default/keymap.c index 61275cb26..ddb93c885 100644 --- a/keyboards/planck/keymaps/default/keymap.c +++ b/keyboards/planck/keymaps/default/keymap.c | |||
| @@ -1,20 +1,28 @@ | |||
| 1 | // This is the canonical layout file for the Quantum project. If you want to add another keyboard, | 1 | /* Copyright 2015-2017 Jack Humbert |
| 2 | // this is the style you want to emulate. | 2 | * |
| 3 | * This program is free software: you can redistribute it and/or modify | ||
| 4 | * it under the terms of the GNU General Public License as published by | ||
| 5 | * the Free Software Foundation, either version 2 of the License, or | ||
| 6 | * (at your option) any later version. | ||
| 7 | * | ||
| 8 | * This program is distributed in the hope that it will be useful, | ||
| 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 11 | * GNU General Public License for more details. | ||
| 12 | * | ||
| 13 | * You should have received a copy of the GNU General Public License | ||
| 14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
| 15 | */ | ||
| 3 | 16 | ||
| 4 | #include "planck.h" | 17 | #include "planck.h" |
| 5 | #include "action_layer.h" | 18 | #include "action_layer.h" |
| 19 | #include "eeconfig.h" | ||
| 6 | #ifdef AUDIO_ENABLE | 20 | #ifdef AUDIO_ENABLE |
| 7 | #include "audio.h" | 21 | #include "audio.h" |
| 8 | #endif | 22 | #endif |
| 9 | #include "eeconfig.h" | ||
| 10 | 23 | ||
| 11 | extern keymap_config_t keymap_config; | 24 | extern keymap_config_t keymap_config; |
| 12 | 25 | ||
| 13 | // Each layer gets a name for readability, which is then used in the keymap matrix below. | ||
| 14 | // The underscores don't mean anything - you can have a layer called STUFF or any other name. | ||
| 15 | // Layer names don't all need to be of the same length, obviously, and you can also skip them | ||
| 16 | // entirely and just use numbers. | ||
| 17 | |||
| 18 | enum planck_layers { | 26 | enum planck_layers { |
| 19 | _QWERTY, | 27 | _QWERTY, |
| 20 | _COLEMAK, | 28 | _COLEMAK, |
| @@ -36,10 +44,6 @@ enum planck_keycodes { | |||
| 36 | EXT_PLV | 44 | EXT_PLV |
| 37 | }; | 45 | }; |
| 38 | 46 | ||
| 39 | // Fillers to make layering more clear | ||
| 40 | #define _______ KC_TRNS | ||
| 41 | #define XXXXXXX KC_NO | ||
| 42 | |||
| 43 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | 47 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
| 44 | 48 | ||
| 45 | /* Qwerty | 49 | /* Qwerty |
| @@ -173,50 +177,27 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 173 | }; | 177 | }; |
| 174 | 178 | ||
| 175 | #ifdef AUDIO_ENABLE | 179 | #ifdef AUDIO_ENABLE |
| 176 | 180 | float plover_song[][2] = SONG(PLOVER_SOUND); | |
| 177 | float tone_startup[][2] = SONG(STARTUP_SOUND); | 181 | float plover_gb_song[][2] = SONG(PLOVER_GOODBYE_SOUND); |
| 178 | float tone_qwerty[][2] = SONG(QWERTY_SOUND); | ||
| 179 | float tone_dvorak[][2] = SONG(DVORAK_SOUND); | ||
| 180 | float tone_colemak[][2] = SONG(COLEMAK_SOUND); | ||
| 181 | float tone_plover[][2] = SONG(PLOVER_SOUND); | ||
| 182 | float tone_plover_gb[][2] = SONG(PLOVER_GOODBYE_SOUND); | ||
| 183 | float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); | ||
| 184 | |||
| 185 | float tone_goodbye[][2] = SONG(GOODBYE_SOUND); | ||
| 186 | #endif | 182 | #endif |
| 187 | 183 | ||
| 188 | |||
| 189 | void persistent_default_layer_set(uint16_t default_layer) { | ||
| 190 | eeconfig_update_default_layer(default_layer); | ||
| 191 | default_layer_set(default_layer); | ||
| 192 | } | ||
| 193 | |||
| 194 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { | 184 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { |
| 195 | switch (keycode) { | 185 | switch (keycode) { |
| 196 | case QWERTY: | 186 | case QWERTY: |
| 197 | if (record->event.pressed) { | 187 | if (record->event.pressed) { |
| 198 | #ifdef AUDIO_ENABLE | 188 | set_single_persistent_default_layer(_QWERTY); |
| 199 | PLAY_NOTE_ARRAY(tone_qwerty, false, 0); | ||
| 200 | #endif | ||
| 201 | persistent_default_layer_set(1UL<<_QWERTY); | ||
| 202 | } | 189 | } |
| 203 | return false; | 190 | return false; |
| 204 | break; | 191 | break; |
| 205 | case COLEMAK: | 192 | case COLEMAK: |
| 206 | if (record->event.pressed) { | 193 | if (record->event.pressed) { |
| 207 | #ifdef AUDIO_ENABLE | 194 | set_single_persistent_default_layer(_COLEMAK); |
| 208 | PLAY_NOTE_ARRAY(tone_colemak, false, 0); | ||
| 209 | #endif | ||
| 210 | persistent_default_layer_set(1UL<<_COLEMAK); | ||
| 211 | } | 195 | } |
| 212 | return false; | 196 | return false; |
| 213 | break; | 197 | break; |
| 214 | case DVORAK: | 198 | case DVORAK: |
| 215 | if (record->event.pressed) { | 199 | if (record->event.pressed) { |
| 216 | #ifdef AUDIO_ENABLE | 200 | set_single_persistent_default_layer(_DVORAK); |
| 217 | PLAY_NOTE_ARRAY(tone_dvorak, false, 0); | ||
| 218 | #endif | ||
| 219 | persistent_default_layer_set(1UL<<_DVORAK); | ||
| 220 | } | 201 | } |
| 221 | return false; | 202 | return false; |
| 222 | break; | 203 | break; |
| @@ -255,7 +236,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |||
| 255 | if (record->event.pressed) { | 236 | if (record->event.pressed) { |
| 256 | #ifdef AUDIO_ENABLE | 237 | #ifdef AUDIO_ENABLE |
| 257 | stop_all_notes(); | 238 | stop_all_notes(); |
| 258 | PLAY_NOTE_ARRAY(tone_plover, false, 0); | 239 | PLAY_SONG(plover_song); |
| 259 | #endif | 240 | #endif |
| 260 | layer_off(_RAISE); | 241 | layer_off(_RAISE); |
| 261 | layer_off(_LOWER); | 242 | layer_off(_LOWER); |
| @@ -273,7 +254,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |||
| 273 | case EXT_PLV: | 254 | case EXT_PLV: |
| 274 | if (record->event.pressed) { | 255 | if (record->event.pressed) { |
| 275 | #ifdef AUDIO_ENABLE | 256 | #ifdef AUDIO_ENABLE |
| 276 | PLAY_NOTE_ARRAY(tone_plover_gb, false, 0); | 257 | PLAY_SONG(plover_gb_song); |
| 277 | #endif | 258 | #endif |
| 278 | layer_off(_PLOVER); | 259 | layer_off(_PLOVER); |
| 279 | } | 260 | } |
| @@ -281,37 +262,4 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |||
| 281 | break; | 262 | break; |
| 282 | } | 263 | } |
| 283 | return true; | 264 | return true; |
| 284 | } | 265 | } \ No newline at end of file |
| 285 | |||
| 286 | void matrix_init_user(void) { | ||
| 287 | #ifdef AUDIO_ENABLE | ||
| 288 | startup_user(); | ||
| 289 | #endif | ||
| 290 | } | ||
| 291 | |||
| 292 | #ifdef AUDIO_ENABLE | ||
| 293 | |||
| 294 | void startup_user() | ||
| 295 | { | ||
| 296 | _delay_ms(20); // gets rid of tick | ||
| 297 | PLAY_NOTE_ARRAY(tone_startup, false, 0); | ||
| 298 | } | ||
| 299 | |||
| 300 | void shutdown_user() | ||
| 301 | { | ||
| 302 | PLAY_NOTE_ARRAY(tone_goodbye, false, 0); | ||
| 303 | _delay_ms(150); | ||
| 304 | stop_all_notes(); | ||
| 305 | } | ||
| 306 | |||
| 307 | void music_on_user(void) | ||
| 308 | { | ||
| 309 | music_scale_user(); | ||
| 310 | } | ||
| 311 | |||
| 312 | void music_scale_user(void) | ||
| 313 | { | ||
| 314 | PLAY_NOTE_ARRAY(music_scale, false, 0); | ||
| 315 | } | ||
| 316 | |||
| 317 | #endif | ||
diff --git a/keyboards/preonic/keymaps/default/config.h b/keyboards/preonic/keymaps/default/config.h index 4c6158199..1ce547b94 100644 --- a/keyboards/preonic/keymaps/default/config.h +++ b/keyboards/preonic/keymaps/default/config.h | |||
| @@ -15,6 +15,16 @@ | |||
| 15 | */ | 15 | */ |
| 16 | #define MIDI_BASIC | 16 | #define MIDI_BASIC |
| 17 | 17 | ||
| 18 | #ifdef AUDIO_ENABLE | ||
| 19 | #define STARTUP_SONG SONG(PLANCK_SOUND) | ||
| 20 | // #define STARTUP_SONG SONG(NO_SOUND) | ||
| 21 | |||
| 22 | #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \ | ||
| 23 | SONG(COLEMAK_SOUND), \ | ||
| 24 | SONG(DVORAK_SOUND) \ | ||
| 25 | } | ||
| 26 | #endif | ||
| 27 | |||
| 18 | /* enable advanced MIDI features: | 28 | /* enable advanced MIDI features: |
| 19 | - MIDI notes can be added to the keymap | 29 | - MIDI notes can be added to the keymap |
| 20 | - Octave shift and transpose | 30 | - Octave shift and transpose |
diff --git a/keyboards/preonic/keymaps/default/keymap.c b/keyboards/preonic/keymaps/default/keymap.c index 2516a726b..a05117c9e 100644 --- a/keyboards/preonic/keymaps/default/keymap.c +++ b/keyboards/preonic/keymaps/default/keymap.c | |||
| @@ -1,3 +1,19 @@ | |||
| 1 | /* Copyright 2015-2017 Jack Humbert | ||
| 2 | * | ||
| 3 | * This program is free software: you can redistribute it and/or modify | ||
| 4 | * it under the terms of the GNU General Public License as published by | ||
| 5 | * the Free Software Foundation, either version 2 of the License, or | ||
| 6 | * (at your option) any later version. | ||
| 7 | * | ||
| 8 | * This program is distributed in the hope that it will be useful, | ||
| 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 11 | * GNU General Public License for more details. | ||
| 12 | * | ||
| 13 | * You should have received a copy of the GNU General Public License | ||
| 14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
| 15 | */ | ||
| 16 | |||
| 1 | #include "preonic.h" | 17 | #include "preonic.h" |
| 2 | #include "action_layer.h" | 18 | #include "action_layer.h" |
| 3 | #include "eeconfig.h" | 19 | #include "eeconfig.h" |
| @@ -5,11 +21,6 @@ | |||
| 5 | #include "audio.h" | 21 | #include "audio.h" |
| 6 | #endif | 22 | #endif |
| 7 | 23 | ||
| 8 | // Each layer gets a name for readability, which is then used in the keymap matrix below. | ||
| 9 | // The underscores don't mean anything - you can have a layer called STUFF or any other name. | ||
| 10 | // Layer names don't all need to be of the same length, obviously, and you can also skip them | ||
| 11 | // entirely and just use numbers. | ||
| 12 | |||
| 13 | enum preonic_layers { | 24 | enum preonic_layers { |
| 14 | _QWERTY, | 25 | _QWERTY, |
| 15 | _COLEMAK, | 26 | _COLEMAK, |
| @@ -28,10 +39,6 @@ enum preonic_keycodes { | |||
| 28 | BACKLIT | 39 | BACKLIT |
| 29 | }; | 40 | }; |
| 30 | 41 | ||
| 31 | // Fillers to make layering more clear | ||
| 32 | #define _______ KC_TRNS | ||
| 33 | #define XXXXXXX KC_NO | ||
| 34 | |||
| 35 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | 42 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
| 36 | 43 | ||
| 37 | /* Qwerty | 44 | /* Qwerty |
| @@ -163,54 +170,23 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 163 | 170 | ||
| 164 | }; | 171 | }; |
| 165 | 172 | ||
| 166 | #ifdef AUDIO_ENABLE | ||
| 167 | float tone_startup[][2] = { | ||
| 168 | {NOTE_B5, 20}, | ||
| 169 | {NOTE_B6, 8}, | ||
| 170 | {NOTE_DS6, 20}, | ||
| 171 | {NOTE_B6, 8} | ||
| 172 | }; | ||
| 173 | |||
| 174 | float tone_qwerty[][2] = SONG(QWERTY_SOUND); | ||
| 175 | float tone_dvorak[][2] = SONG(DVORAK_SOUND); | ||
| 176 | float tone_colemak[][2] = SONG(COLEMAK_SOUND); | ||
| 177 | |||
| 178 | float tone_goodbye[][2] = SONG(GOODBYE_SOUND); | ||
| 179 | |||
| 180 | float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); | ||
| 181 | #endif | ||
| 182 | |||
| 183 | void persistent_default_layer_set(uint16_t default_layer) { | ||
| 184 | eeconfig_update_default_layer(default_layer); | ||
| 185 | default_layer_set(default_layer); | ||
| 186 | } | ||
| 187 | |||
| 188 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { | 173 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { |
| 189 | switch (keycode) { | 174 | switch (keycode) { |
| 190 | case QWERTY: | 175 | case QWERTY: |
| 191 | if (record->event.pressed) { | 176 | if (record->event.pressed) { |
| 192 | #ifdef AUDIO_ENABLE | 177 | set_single_persistent_default_layer(_QWERTY); |
| 193 | PLAY_NOTE_ARRAY(tone_qwerty, false, 0); | ||
| 194 | #endif | ||
| 195 | persistent_default_layer_set(1UL<<_QWERTY); | ||
| 196 | } | 178 | } |
| 197 | return false; | 179 | return false; |
| 198 | break; | 180 | break; |
| 199 | case COLEMAK: | 181 | case COLEMAK: |
| 200 | if (record->event.pressed) { | 182 | if (record->event.pressed) { |
| 201 | #ifdef AUDIO_ENABLE | 183 | set_single_persistent_default_layer(_COLEMAK); |
| 202 | PLAY_NOTE_ARRAY(tone_colemak, false, 0); | ||
| 203 | #endif | ||
| 204 | persistent_default_layer_set(1UL<<_COLEMAK); | ||
| 205 | } | 184 | } |
| 206 | return false; | 185 | return false; |
| 207 | break; | 186 | break; |
| 208 | case DVORAK: | 187 | case DVORAK: |
| 209 | if (record->event.pressed) { | 188 | if (record->event.pressed) { |
| 210 | #ifdef AUDIO_ENABLE | 189 | set_single_persistent_default_layer(_DVORAK); |
| 211 | PLAY_NOTE_ARRAY(tone_dvorak, false, 0); | ||
| 212 | #endif | ||
| 213 | persistent_default_layer_set(1UL<<_DVORAK); | ||
| 214 | } | 190 | } |
| 215 | return false; | 191 | return false; |
| 216 | break; | 192 | break; |
| @@ -248,36 +224,3 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |||
| 248 | } | 224 | } |
| 249 | return true; | 225 | return true; |
| 250 | }; | 226 | }; |
| 251 | |||
| 252 | void matrix_init_user(void) { | ||
| 253 | #ifdef AUDIO_ENABLE | ||
| 254 | startup_user(); | ||
| 255 | #endif | ||
| 256 | } | ||
| 257 | |||
| 258 | #ifdef AUDIO_ENABLE | ||
| 259 | |||
| 260 | void startup_user() | ||
| 261 | { | ||
| 262 | _delay_ms(20); // gets rid of tick | ||
| 263 | PLAY_NOTE_ARRAY(tone_startup, false, 0); | ||
| 264 | } | ||
| 265 | |||
| 266 | void shutdown_user() | ||
| 267 | { | ||
| 268 | PLAY_NOTE_ARRAY(tone_goodbye, false, 0); | ||
| 269 | _delay_ms(150); | ||
| 270 | stop_all_notes(); | ||
| 271 | } | ||
| 272 | |||
| 273 | void music_on_user(void) | ||
| 274 | { | ||
| 275 | music_scale_user(); | ||
| 276 | } | ||
| 277 | |||
| 278 | void music_scale_user(void) | ||
| 279 | { | ||
| 280 | PLAY_NOTE_ARRAY(music_scale, false, 0); | ||
| 281 | } | ||
| 282 | |||
| 283 | #endif | ||
diff --git a/quantum/audio/audio.c b/quantum/audio/audio.c index c924f2bd5..5b8563093 100644 --- a/quantum/audio/audio.c +++ b/quantum/audio/audio.c | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | * You should have received a copy of the GNU General Public License | 13 | * You should have received a copy of the GNU General Public License |
| 14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | 14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
| 15 | */ | 15 | */ |
| 16 | |||
| 16 | #include <stdio.h> | 17 | #include <stdio.h> |
| 17 | #include <string.h> | 18 | #include <string.h> |
| 18 | //#include <math.h> | 19 | //#include <math.h> |
| @@ -119,9 +120,17 @@ audio_config_t audio_config; | |||
| 119 | uint16_t envelope_index = 0; | 120 | uint16_t envelope_index = 0; |
| 120 | bool glissando = true; | 121 | bool glissando = true; |
| 121 | 122 | ||
| 123 | #ifndef STARTUP_SONG | ||
| 124 | #define STARTUP_SONG SONG(STARTUP_SOUND) | ||
| 125 | #endif | ||
| 126 | float startup_song[][2] = STARTUP_SONG; | ||
| 127 | |||
| 122 | void audio_init() | 128 | void audio_init() |
| 123 | { | 129 | { |
| 124 | 130 | ||
| 131 | if (audio_initialized) | ||
| 132 | return; | ||
| 133 | |||
| 125 | // Check EEPROM | 134 | // Check EEPROM |
| 126 | if (!eeconfig_is_enabled()) | 135 | if (!eeconfig_is_enabled()) |
| 127 | { | 136 | { |
| @@ -169,6 +178,11 @@ void audio_init() | |||
| 169 | #endif | 178 | #endif |
| 170 | 179 | ||
| 171 | audio_initialized = true; | 180 | audio_initialized = true; |
| 181 | |||
| 182 | if (audio_config.enable) { | ||
| 183 | PLAY_NOTE_ARRAY(startup_song, false, LEGATO); | ||
| 184 | } | ||
| 185 | |||
| 172 | } | 186 | } |
| 173 | 187 | ||
| 174 | void stop_all_notes() | 188 | void stop_all_notes() |
diff --git a/quantum/audio/audio.h b/quantum/audio/audio.h index 27fdc2ab6..ad3abeb78 100644 --- a/quantum/audio/audio.h +++ b/quantum/audio/audio.h | |||
| @@ -99,7 +99,7 @@ void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest) | |||
| 99 | // The global float array for the song must be used here. | 99 | // The global float array for the song must be used here. |
| 100 | #define NOTE_ARRAY_SIZE(x) ((int16_t)(sizeof(x) / (sizeof(x[0])))) | 100 | #define NOTE_ARRAY_SIZE(x) ((int16_t)(sizeof(x) / (sizeof(x[0])))) |
| 101 | #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)); | 101 | #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)); |
| 102 | 102 | #define PLAY_SONG(song) PLAY_NOTE_ARRAY(song, false, STACCATO) | |
| 103 | 103 | ||
| 104 | bool is_playing_notes(void); | 104 | bool is_playing_notes(void); |
| 105 | 105 | ||
diff --git a/quantum/audio/song_list.h b/quantum/audio/song_list.h index db2d1a94c..6960bee6d 100644 --- a/quantum/audio/song_list.h +++ b/quantum/audio/song_list.h | |||
| @@ -18,9 +18,7 @@ | |||
| 18 | #ifndef SONG_LIST_H | 18 | #ifndef SONG_LIST_H |
| 19 | #define SONG_LIST_H | 19 | #define SONG_LIST_H |
| 20 | 20 | ||
| 21 | #define COIN_SOUND \ | 21 | #define NO_SOUND |
| 22 | E__NOTE(_A5 ),\ | ||
| 23 | HD_NOTE(_E6 ), | ||
| 24 | 22 | ||
| 25 | #define ODE_TO_JOY \ | 23 | #define ODE_TO_JOY \ |
| 26 | Q__NOTE(_E4), Q__NOTE(_E4), Q__NOTE(_F4), Q__NOTE(_G4), \ | 24 | Q__NOTE(_E4), Q__NOTE(_E4), Q__NOTE(_F4), Q__NOTE(_G4), \ |
| @@ -55,18 +53,29 @@ | |||
| 55 | E__NOTE(_CS4), E__NOTE(_B4), QD_NOTE(_AS4), \ | 53 | E__NOTE(_CS4), E__NOTE(_B4), QD_NOTE(_AS4), \ |
| 56 | E__NOTE(_AS4), E__NOTE(_AS4), QD_NOTE(_B4), | 54 | E__NOTE(_AS4), E__NOTE(_AS4), QD_NOTE(_B4), |
| 57 | 55 | ||
| 56 | #define STARTUP_SOUND \ | ||
| 57 | E__NOTE(_E6), \ | ||
| 58 | E__NOTE(_A6), \ | ||
| 59 | ED_NOTE(_E7), | ||
| 60 | |||
| 58 | #define GOODBYE_SOUND \ | 61 | #define GOODBYE_SOUND \ |
| 59 | E__NOTE(_E7), \ | 62 | E__NOTE(_E7), \ |
| 60 | E__NOTE(_A6), \ | 63 | E__NOTE(_A6), \ |
| 61 | ED_NOTE(_E6), | 64 | ED_NOTE(_E6), |
| 62 | 65 | ||
| 63 | #define STARTUP_SOUND \ | 66 | #define PLANCK_SOUND \ |
| 64 | ED_NOTE(_E7 ), \ | 67 | ED_NOTE(_E7 ), \ |
| 65 | E__NOTE(_CS7), \ | 68 | E__NOTE(_CS7), \ |
| 66 | E__NOTE(_E6 ), \ | 69 | E__NOTE(_E6 ), \ |
| 67 | E__NOTE(_A6 ), \ | 70 | E__NOTE(_A6 ), \ |
| 68 | M__NOTE(_CS7, 20), | 71 | M__NOTE(_CS7, 20), |
| 69 | 72 | ||
| 73 | #define PREONIC_SOUND \ | ||
| 74 | M__NOTE(_B5, 20), \ | ||
| 75 | E__NOTE(_B6), \ | ||
| 76 | M__NOTE(_DS6, 20), \ | ||
| 77 | E__NOTE(_B6), | ||
| 78 | |||
| 70 | #define QWERTY_SOUND \ | 79 | #define QWERTY_SOUND \ |
| 71 | E__NOTE(_GS6 ), \ | 80 | E__NOTE(_GS6 ), \ |
| 72 | E__NOTE(_A6 ), \ | 81 | E__NOTE(_A6 ), \ |
| @@ -107,7 +116,8 @@ | |||
| 107 | S__NOTE(_REST), \ | 116 | S__NOTE(_REST), \ |
| 108 | ED_NOTE(_E7 ), | 117 | ED_NOTE(_E7 ), |
| 109 | 118 | ||
| 110 | #define MUSIC_SCALE_SOUND \ | 119 | |
| 120 | #define MUSIC_ON_SOUND \ | ||
| 111 | E__NOTE(_A5 ), \ | 121 | E__NOTE(_A5 ), \ |
| 112 | E__NOTE(_B5 ), \ | 122 | E__NOTE(_B5 ), \ |
| 113 | E__NOTE(_CS6), \ | 123 | E__NOTE(_CS6), \ |
| @@ -117,6 +127,18 @@ | |||
| 117 | E__NOTE(_GS6), \ | 127 | E__NOTE(_GS6), \ |
| 118 | E__NOTE(_A6 ), | 128 | E__NOTE(_A6 ), |
| 119 | 129 | ||
| 130 | #define MUSIC_SCALE_SOUND MUSIC_ON_SOUND | ||
| 131 | |||
| 132 | #define MUSIC_OFF_SOUND \ | ||
| 133 | E__NOTE(_A6 ), \ | ||
| 134 | E__NOTE(_GS6 ), \ | ||
| 135 | E__NOTE(_FS6), \ | ||
| 136 | E__NOTE(_E6 ), \ | ||
| 137 | E__NOTE(_D6 ), \ | ||
| 138 | E__NOTE(_CS6), \ | ||
| 139 | E__NOTE(_B5), \ | ||
| 140 | E__NOTE(_A5 ), | ||
| 141 | |||
| 120 | #define CAPS_LOCK_ON_SOUND \ | 142 | #define CAPS_LOCK_ON_SOUND \ |
| 121 | E__NOTE(_A3), \ | 143 | E__NOTE(_A3), \ |
| 122 | E__NOTE(_B3), | 144 | E__NOTE(_B3), |
| @@ -141,6 +163,16 @@ | |||
| 141 | E__NOTE(_E5), \ | 163 | E__NOTE(_E5), \ |
| 142 | E__NOTE(_D5), | 164 | E__NOTE(_D5), |
| 143 | 165 | ||
| 166 | #define AG_NORM_SOUND \ | ||
| 167 | E__NOTE(_A5), \ | ||
| 168 | E__NOTE(_A5), | ||
| 169 | |||
| 170 | #define AG_SWAP_SOUND \ | ||
| 171 | SD_NOTE(_B5), \ | ||
| 172 | SD_NOTE(_A5), \ | ||
| 173 | SD_NOTE(_B5), \ | ||
| 174 | SD_NOTE(_A5), | ||
| 175 | |||
| 144 | #define UNICODE_WINDOWS \ | 176 | #define UNICODE_WINDOWS \ |
| 145 | E__NOTE(_B5), \ | 177 | E__NOTE(_B5), \ |
| 146 | S__NOTE(_E6), | 178 | S__NOTE(_E6), |
diff --git a/quantum/config_common.h b/quantum/config_common.h index c88e02d91..4c6a702af 100644 --- a/quantum/config_common.h +++ b/quantum/config_common.h | |||
| @@ -100,4 +100,6 @@ | |||
| 100 | 100 | ||
| 101 | #define API_SYSEX_MAX_SIZE 32 | 101 | #define API_SYSEX_MAX_SIZE 32 |
| 102 | 102 | ||
| 103 | #include "song_list.h" | ||
| 104 | |||
| 103 | #endif | 105 | #endif |
diff --git a/quantum/process_keycode/process_music.c b/quantum/process_keycode/process_music.c index 217dca280..c01740a7f 100644 --- a/quantum/process_keycode/process_music.c +++ b/quantum/process_keycode/process_music.c | |||
| @@ -39,6 +39,15 @@ static uint8_t music_sequence_position = 0; | |||
| 39 | static uint16_t music_sequence_timer = 0; | 39 | static uint16_t music_sequence_timer = 0; |
| 40 | static uint16_t music_sequence_interval = 100; | 40 | static uint16_t music_sequence_interval = 100; |
| 41 | 41 | ||
| 42 | #ifndef MUSIC_ON_SONG | ||
| 43 | #define MUSIC_ON_SONG SONG(MUSIC_ON_SOUND) | ||
| 44 | #endif | ||
| 45 | #ifndef MUSIC_OFF_SONG | ||
| 46 | #define MUSIC_OFF_SONG SONG(MUSIC_OFF_SOUND) | ||
| 47 | #endif | ||
| 48 | float music_on_song[][2] = MUSIC_ON_SONG; | ||
| 49 | float music_off_song[][2] = MUSIC_OFF_SONG; | ||
| 50 | |||
| 42 | static void music_noteon(uint8_t note) { | 51 | static void music_noteon(uint8_t note) { |
| 43 | #ifdef AUDIO_ENABLE | 52 | #ifdef AUDIO_ENABLE |
| 44 | process_audio_noteon(note); | 53 | process_audio_noteon(note); |
| @@ -79,12 +88,9 @@ bool process_music(uint16_t keycode, keyrecord_t *record) { | |||
| 79 | } | 88 | } |
| 80 | 89 | ||
| 81 | if (keycode == MU_TOG && record->event.pressed) { | 90 | if (keycode == MU_TOG && record->event.pressed) { |
| 82 | if (music_activated) | 91 | if (music_activated) { |
| 83 | { | ||
| 84 | music_off(); | 92 | music_off(); |
| 85 | } | 93 | } else { |
| 86 | else | ||
| 87 | { | ||
| 88 | music_on(); | 94 | music_on(); |
| 89 | } | 95 | } |
| 90 | return false; | 96 | return false; |
| @@ -175,12 +181,14 @@ void music_toggle(void) { | |||
| 175 | 181 | ||
| 176 | void music_on(void) { | 182 | void music_on(void) { |
| 177 | music_activated = 1; | 183 | music_activated = 1; |
| 184 | PLAY_SONG(music_on_song); | ||
| 178 | music_on_user(); | 185 | music_on_user(); |
| 179 | } | 186 | } |
| 180 | 187 | ||
| 181 | void music_off(void) { | 188 | void music_off(void) { |
| 182 | music_activated = 0; | ||
| 183 | music_all_notes_off(); | 189 | music_all_notes_off(); |
| 190 | music_activated = 0; | ||
| 191 | PLAY_SONG(music_off_song); | ||
| 184 | } | 192 | } |
| 185 | 193 | ||
| 186 | void matrix_scan_music(void) { | 194 | void matrix_scan_music(void) { |
diff --git a/quantum/quantum.c b/quantum/quantum.c index 36e586d31..31a6fc713 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c | |||
| @@ -30,6 +30,28 @@ extern backlight_config_t backlight_config; | |||
| 30 | #include "fauxclicky.h" | 30 | #include "fauxclicky.h" |
| 31 | #endif | 31 | #endif |
| 32 | 32 | ||
| 33 | #ifdef AUDIO_ENABLE | ||
| 34 | #ifndef GOODBYE_SONG | ||
| 35 | #define GOODBYE_SONG SONG(GOODBYE_SOUND) | ||
| 36 | #endif | ||
| 37 | #ifndef AG_NORM_SONG | ||
| 38 | #define AG_NORM_SONG SONG(AG_NORM_SOUND) | ||
| 39 | #endif | ||
| 40 | #ifndef AG_SWAP_SONG | ||
| 41 | #define AG_SWAP_SONG SONG(AG_SWAP_SOUND) | ||
| 42 | #endif | ||
| 43 | #ifndef DEFAULT_LAYER_SONGS | ||
| 44 | #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \ | ||
| 45 | SONG(COLEMAK_SOUND) \ | ||
| 46 | SONG(DVORAK_SOUND) \ | ||
| 47 | } | ||
| 48 | #endif | ||
| 49 | float goodbye_song[][2] = GOODBYE_SONG; | ||
| 50 | float ag_norm_song[][2] = AG_NORM_SONG; | ||
| 51 | float ag_swap_song[][2] = AG_SWAP_SONG; | ||
| 52 | float default_layer_songs[][16][2] = DEFAULT_LAYER_SONGS; | ||
| 53 | #endif | ||
| 54 | |||
| 33 | static void do_code16 (uint16_t code, void (*f) (uint8_t)) { | 55 | static void do_code16 (uint16_t code, void (*f) (uint8_t)) { |
| 34 | switch (code) { | 56 | switch (code) { |
| 35 | case QK_MODS ... QK_MODS_MAX: | 57 | case QK_MODS ... QK_MODS_MAX: |
| @@ -116,9 +138,15 @@ void reset_keyboard(void) { | |||
| 116 | clear_keyboard(); | 138 | clear_keyboard(); |
| 117 | #if defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_ENABLE_BASIC)) | 139 | #if defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_ENABLE_BASIC)) |
| 118 | music_all_notes_off(); | 140 | music_all_notes_off(); |
| 141 | uint16_t timer_start = timer_read(); | ||
| 142 | PLAY_SONG(goodbye_song); | ||
| 119 | shutdown_user(); | 143 | shutdown_user(); |
| 120 | #endif | 144 | while(timer_elapsed(timer_start) < 250) |
| 145 | wait_ms(1); | ||
| 146 | stop_all_notes(); | ||
| 147 | #else | ||
| 121 | wait_ms(250); | 148 | wait_ms(250); |
| 149 | #endif | ||
| 122 | #ifdef CATERINA_BOOTLOADER | 150 | #ifdef CATERINA_BOOTLOADER |
| 123 | *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific | 151 | *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific |
| 124 | #endif | 152 | #endif |
| @@ -351,6 +379,9 @@ bool process_record_quantum(keyrecord_t *record) { | |||
| 351 | case MAGIC_SWAP_ALT_GUI: | 379 | case MAGIC_SWAP_ALT_GUI: |
| 352 | keymap_config.swap_lalt_lgui = true; | 380 | keymap_config.swap_lalt_lgui = true; |
| 353 | keymap_config.swap_ralt_rgui = true; | 381 | keymap_config.swap_ralt_rgui = true; |
| 382 | #ifdef AUDIO_ENABLE | ||
| 383 | PLAY_SONG(ag_swap_song); | ||
| 384 | #endif | ||
| 354 | break; | 385 | break; |
| 355 | case MAGIC_UNSWAP_CONTROL_CAPSLOCK: | 386 | case MAGIC_UNSWAP_CONTROL_CAPSLOCK: |
| 356 | keymap_config.swap_control_capslock = false; | 387 | keymap_config.swap_control_capslock = false; |
| @@ -379,6 +410,9 @@ bool process_record_quantum(keyrecord_t *record) { | |||
| 379 | case MAGIC_UNSWAP_ALT_GUI: | 410 | case MAGIC_UNSWAP_ALT_GUI: |
| 380 | keymap_config.swap_lalt_lgui = false; | 411 | keymap_config.swap_lalt_lgui = false; |
| 381 | keymap_config.swap_ralt_rgui = false; | 412 | keymap_config.swap_ralt_rgui = false; |
| 413 | #ifdef AUDIO_ENABLE | ||
| 414 | PLAY_SONG(ag_norm_song); | ||
| 415 | #endif | ||
| 382 | break; | 416 | break; |
| 383 | case MAGIC_TOGGLE_NKRO: | 417 | case MAGIC_TOGGLE_NKRO: |
| 384 | keymap_config.nkro = !keymap_config.nkro; | 418 | keymap_config.nkro = !keymap_config.nkro; |
| @@ -521,6 +555,14 @@ void send_string_with_delay(const char *str, uint8_t interval) { | |||
| 521 | } | 555 | } |
| 522 | } | 556 | } |
| 523 | 557 | ||
| 558 | void set_single_persistent_default_layer(uint8_t default_layer) { | ||
| 559 | #ifdef AUDIO_ENABLE | ||
| 560 | PLAY_SONG(default_layer_songs[default_layer]); | ||
| 561 | #endif | ||
| 562 | eeconfig_update_default_layer(1U<<default_layer); | ||
| 563 | default_layer_set(1U<<default_layer); | ||
| 564 | } | ||
| 565 | |||
| 524 | void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3) { | 566 | void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3) { |
| 525 | if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) { | 567 | if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) { |
| 526 | layer_on(layer3); | 568 | layer_on(layer3); |
| @@ -571,6 +613,9 @@ void matrix_init_quantum() { | |||
| 571 | #ifdef BACKLIGHT_ENABLE | 613 | #ifdef BACKLIGHT_ENABLE |
| 572 | backlight_init_ports(); | 614 | backlight_init_ports(); |
| 573 | #endif | 615 | #endif |
| 616 | #ifdef AUDIO_ENABLE | ||
| 617 | audio_init(); | ||
| 618 | #endif | ||
| 574 | matrix_init_kb(); | 619 | matrix_init_kb(); |
| 575 | } | 620 | } |
| 576 | 621 | ||
diff --git a/quantum/quantum.h b/quantum/quantum.h index e00fe2346..6c0e46573 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h | |||
| @@ -56,6 +56,7 @@ extern uint32_t default_layer_state; | |||
| 56 | #endif // MIDI_ENABLE | 56 | #endif // MIDI_ENABLE |
| 57 | 57 | ||
| 58 | #ifdef AUDIO_ENABLE | 58 | #ifdef AUDIO_ENABLE |
| 59 | #include "audio.h" | ||
| 59 | #include "process_audio.h" | 60 | #include "process_audio.h" |
| 60 | #endif | 61 | #endif |
| 61 | 62 | ||
| @@ -103,6 +104,8 @@ void send_string_with_delay(const char *str, uint8_t interval); | |||
| 103 | // For tri-layer | 104 | // For tri-layer |
| 104 | void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3); | 105 | void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3); |
| 105 | 106 | ||
| 107 | void set_single_persistent_default_layer(uint8_t default_layer); | ||
| 108 | |||
| 106 | void tap_random_base64(void); | 109 | void tap_random_base64(void); |
| 107 | 110 | ||
| 108 | #define IS_LAYER_ON(layer) (layer_state & (1UL << (layer))) | 111 | #define IS_LAYER_ON(layer) (layer_state & (1UL << (layer))) |
diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index 6038e31c4..c863b887a 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h | |||
| @@ -26,6 +26,10 @@ | |||
| 26 | #endif | 26 | #endif |
| 27 | #endif | 27 | #endif |
| 28 | 28 | ||
| 29 | // Fillers to make layering more clear | ||
| 30 | #define _______ KC_TRNS | ||
| 31 | #define XXXXXXX KC_NO | ||
| 32 | |||
| 29 | enum quantum_keycodes { | 33 | enum quantum_keycodes { |
| 30 | // Ranges used in shortucuts - not to be used directly | 34 | // Ranges used in shortucuts - not to be used directly |
| 31 | QK_TMK = 0x0000, | 35 | QK_TMK = 0x0000, |
