From e0e5efbead6ea125f3223508886dd443be3c39a9 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Wed, 4 Apr 2018 16:49:39 -0400 Subject: [PATCH] muse working with encoder as control --- keyboards/planck/keymaps/default/keymap.c | 69 ++++++++++++++-- keyboards/planck/keymaps/default/rules.mk | 1 + keyboards/planck/rev6/matrix.c | 18 ++--- quantum/audio/audio_arm.c | 97 ++++++++++++++++++++++- quantum/audio/muse.c | 59 +++++++------- quantum/audio/muse.h | 9 +++ quantum/process_keycode/process_audio.c | 4 +- quantum/process_keycode/process_audio.h | 4 +- 8 files changed, 210 insertions(+), 51 deletions(-) create mode 100644 quantum/audio/muse.h diff --git a/keyboards/planck/keymaps/default/keymap.c b/keyboards/planck/keymaps/default/keymap.c index 40ae7777..c1a7e0fe 100644 --- a/keyboards/planck/keymaps/default/keymap.c +++ b/keyboards/planck/keymaps/default/keymap.c @@ -16,6 +16,7 @@ #include "planck.h" #include "action_layer.h" +#include "muse.h" extern keymap_config_t keymap_config; @@ -267,20 +268,42 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return true; } -void encoder_update(bool direction) { - if (direction) { - register_code(KC_PGUP); - unregister_code(KC_PGUP); +bool muse_mode = false; +uint8_t last_muse_note = 0; +uint16_t muse_counter = 0; +uint8_t muse_offset = 70; +uint16_t muse_tempo = 50; + +void encoder_update(bool clockwise) { + if (muse_mode) { + if (IS_LAYER_ON(_RAISE)) { + if (clockwise) { + muse_offset++; + } else { + muse_offset--; + } + } else { + if (clockwise) { + muse_tempo+=1; + } else { + muse_tempo-=1; + } + } } else { - register_code(KC_PGDN); - unregister_code(KC_PGDN); + if (clockwise) { + register_code(KC_PGUP); + unregister_code(KC_PGUP); + } else { + register_code(KC_PGDN); + unregister_code(KC_PGDN); + } } } -void dip_update(uint8_t index, bool value) { +void dip_update(uint8_t index, bool active) { switch (index) { case 0: - if (value) { + if (active) { #ifdef AUDIO_ENABLE PLAY_SONG(plover_song); #endif @@ -292,5 +315,35 @@ void dip_update(uint8_t index, bool value) { layer_off(_ADJUST); } break; + case 1: + if (active) { + muse_mode = true; + } else { + muse_mode = false; + stop_all_notes(); + } + } +} + +void matrix_init_user(void) { + palSetPadMode(GPIOB, 5, PAL_MODE_OUTPUT_PUSHPULL); +} + +void matrix_scan_user(void) { + if (muse_mode) { + if (muse_counter == 0) { + uint8_t muse_note = muse_offset + SCALE[muse_clock_pulse()]; + if (muse_note != last_muse_note) { + stop_note(compute_freq_for_midi_note(last_muse_note)); + play_note(compute_freq_for_midi_note(muse_note), 0xF); + last_muse_note = muse_note; + } + } + if (muse_counter > (muse_tempo / 2)) { + palSetPad(GPIOB, 5); + } else { + palClearPad(GPIOB, 5); + } + muse_counter = (muse_counter + 1) % muse_tempo; } } diff --git a/keyboards/planck/keymaps/default/rules.mk b/keyboards/planck/keymaps/default/rules.mk index e69de29b..dcf16bef 100644 --- a/keyboards/planck/keymaps/default/rules.mk +++ b/keyboards/planck/keymaps/default/rules.mk @@ -0,0 +1 @@ +SRC += muse.c diff --git a/keyboards/planck/rev6/matrix.c b/keyboards/planck/rev6/matrix.c index 36d9259e..e4ebe48a 100644 --- a/keyboards/planck/rev6/matrix.c +++ b/keyboards/planck/rev6/matrix.c @@ -85,10 +85,10 @@ void matrix_init(void) { } __attribute__ ((weak)) -void dip_update(uint8_t index, bool value) { } +void dip_update(uint8_t index, bool active) { } __attribute__ ((weak)) -void encoder_update(bool direction) { } +void encoder_update(bool clockwise) { } bool last_dip_switch[4] = {0}; @@ -98,10 +98,10 @@ bool last_dip_switch[4] = {0}; uint8_t matrix_scan(void) { // dip switch - dip_switch[0] = palReadPad(GPIOB, 14); - dip_switch[1] = palReadPad(GPIOA, 15); - dip_switch[2] = palReadPad(GPIOA, 10); - dip_switch[3] = palReadPad(GPIOB, 9); + dip_switch[0] = !palReadPad(GPIOB, 14); + dip_switch[1] = !palReadPad(GPIOA, 15); + dip_switch[2] = !palReadPad(GPIOA, 10); + dip_switch[3] = !palReadPad(GPIOB, 9); for (uint8_t i = 0; i < 4; i++) { if (last_dip_switch[i] ^ dip_switch[i]) dip_update(i, dip_switch[i]); @@ -113,11 +113,11 @@ uint8_t matrix_scan(void) { encoder_state |= (palReadPad(GPIOB, 12) << 0) | (palReadPad(GPIOB, 13) << 1); encoder_value += encoder_LUT[encoder_state & 0xF]; if (encoder_value >= ENCODER_RESOLUTION) { - encoder_update(1); - } - if (encoder_value <= -ENCODER_RESOLUTION) { encoder_update(0); } + if (encoder_value <= -ENCODER_RESOLUTION) { // direction is arbitrary here, but this clockwise + encoder_update(1); + } encoder_value %= ENCODER_RESOLUTION; // actual matrix diff --git a/quantum/audio/audio_arm.c b/quantum/audio/audio_arm.c index c8856586..d38184f3 100644 --- a/quantum/audio/audio_arm.c +++ b/quantum/audio/audio_arm.c @@ -79,7 +79,7 @@ float startup_song[][2] = STARTUP_SONG; static void gpt_cb8(GPTDriver *gptp); -#define DAC_BUFFER_SIZE 360 +#define DAC_BUFFER_SIZE 720 #define START_CHANNEL_1() gptStart(&GPTD6, &gpt6cfg1); \ gptStartContinuous(&GPTD6, 2U) @@ -167,6 +167,39 @@ GPTConfig gpt8cfg1 = { // 1622, 1657, 1692, 1727, 1763, 1798, 1834, 1869, 1905, 1940, 1976, 2012 // }; +// static const dacsample_t dac_buffer_2[DAC_BUFFER_SIZE] = { +// 12, 8, 5, 3, 2, 1, 0, 1, 2, 3, 5, 8, +// 12, 16, 20, 26, 32, 38, 45, 53, 61, 70, 80, 90, +// 101, 112, 124, 136, 150, 163, 177, 192, 208, 224, 240, 257, +// 275, 293, 312, 331, 350, 371, 391, 413, 434, 457, 479, 503, +// 526, 550, 575, 600, 626, 651, 678, 705, 732, 759, 787, 816, +// 844, 873, 903, 933, 963, 993, 1024, 1055, 1086, 1118, 1150, 1182, +// 1215, 1248, 1281, 1314, 1347, 1381, 1415, 1449, 1483, 1518, 1552, 1587, +// 1622, 1657, 1692, 1727, 1763, 1798, 1834, 1869, 1905, 1940, 1976, 2012, +// 2047, 2082, 2118, 2154, 2189, 2225, 2260, 2296, 2331, 2367, 2402, 2437, +// 2472, 2507, 2542, 2576, 2611, 2645, 2679, 2713, 2747, 2780, 2813, 2846, +// 2879, 2912, 2944, 2976, 3008, 3039, 3070, 3101, 3131, 3161, 3191, 3221, +// 3250, 3278, 3307, 3335, 3362, 3389, 3416, 3443, 3468, 3494, 3519, 3544, +// 3568, 3591, 3615, 3637, 3660, 3681, 3703, 3723, 3744, 3763, 3782, 3801, +// 3819, 3837, 3854, 3870, 3886, 3902, 3917, 3931, 3944, 3958, 3970, 3982, +// 3993, 4004, 4014, 4024, 4033, 4041, 4049, 4056, 4062, 4068, 4074, 4078, +// 4082, 4086, 4089, 4091, 4092, 4093, 4094, 4093, 4092, 4091, 4089, 4086, +// 4082, 4078, 4074, 4068, 4062, 4056, 4049, 4041, 4033, 4024, 4014, 4004, +// 3993, 3982, 3970, 3958, 3944, 3931, 3917, 3902, 3886, 3870, 3854, 3837, +// 3819, 3801, 3782, 3763, 3744, 3723, 3703, 3681, 3660, 3637, 3615, 3591, +// 3568, 3544, 3519, 3494, 3468, 3443, 3416, 3389, 3362, 3335, 3307, 3278, +// 3250, 3221, 3191, 3161, 3131, 3101, 3070, 3039, 3008, 2976, 2944, 2912, +// 2879, 2846, 2813, 2780, 2747, 2713, 2679, 2645, 2611, 2576, 2542, 2507, +// 2472, 2437, 2402, 2367, 2331, 2296, 2260, 2225, 2189, 2154, 2118, 2082, +// 2047, 2012, 1976, 1940, 1905, 1869, 1834, 1798, 1763, 1727, 1692, 1657, +// 1622, 1587, 1552, 1518, 1483, 1449, 1415, 1381, 1347, 1314, 1281, 1248, +// 1215, 1182, 1150, 1118, 1086, 1055, 1024, 993, 963, 933, 903, 873, +// 844, 816, 787, 759, 732, 705, 678, 651, 626, 600, 575, 550, +// 526, 503, 479, 457, 434, 413, 391, 371, 350, 331, 312, 293, +// 275, 257, 240, 224, 208, 192, 177, 163, 150, 136, 124, 112, +// 101, 90, 80, 70, 61, 53, 45, 38, 32, 26, 20, 16 +// }; + // squarewave static const dacsample_t dac_buffer[DAC_BUFFER_SIZE] = { 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, @@ -184,7 +217,37 @@ static const dacsample_t dac_buffer[DAC_BUFFER_SIZE] = { 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -204,6 +267,22 @@ static const dacsample_t dac_buffer[DAC_BUFFER_SIZE] = { // squarewave static const dacsample_t dac_buffer_2[DAC_BUFFER_SIZE] = { + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -233,8 +312,22 @@ static const dacsample_t dac_buffer_2[DAC_BUFFER_SIZE] = { 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, + 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047 - }; /* diff --git a/quantum/audio/muse.c b/quantum/audio/muse.c index 88dc31af..f3cb592d 100644 --- a/quantum/audio/muse.c +++ b/quantum/audio/muse.c @@ -1,3 +1,4 @@ +#include "muse.h" enum { MUSE_OFF, @@ -47,14 +48,14 @@ bool number_of_ones_to_bool[16] = { 0, 1, 1, 0, 1, 0, 0, 1 }; -uint8_t muse_interval[4] = {0}; -uint8_t muse_theme[4] = {0}; +uint8_t muse_interval[4] = {MUSE_B7, MUSE_B19, MUSE_B3, MUSE_B28}; +uint8_t muse_theme[4] = {MUSE_B8, MUSE_B23, MUSE_B18, MUSE_B17}; -bool timer_1bit = 0; -uint8_t timer_2bit = 0; -uint8_t timer_2bit_counter = 0; -uint8_t timer_4bit = 0; -uint32_t timer_31bit = 0; +bool muse_timer_1bit = 0; +uint8_t muse_timer_2bit = 0; +uint8_t muse_timer_2bit_counter = 0; +uint8_t muse_timer_4bit = 0; +uint32_t muse_timer_31bit = 0; bool bit_for_value(uint8_t value) { switch (value) { @@ -63,48 +64,48 @@ bool bit_for_value(uint8_t value) { case MUSE_ON: return 1; case MUSE_C_1_2: - return timer_1bit; + return muse_timer_1bit; case MUSE_C1: - return (timer_4bit & 1); + return (muse_timer_4bit & 1); case MUSE_C2: - return (timer_4bit & 2); + return (muse_timer_4bit & 2); case MUSE_C4: - return (timer_4bit & 4); + return (muse_timer_4bit & 4); case MUSE_C8: - return (timer_4bit & 8); + return (muse_timer_4bit & 8); case MUSE_C3: - return (timer_2bit & 1); + return (muse_timer_2bit & 1); case MUSE_C6: - return (timer_2bit & 2); + return (muse_timer_2bit & 2); default: - return timer_31bit & (1UL << (value - MUSE_B1)); + return muse_timer_31bit & (1UL << (value - MUSE_B1)); } } -uint8_t clock_pulse() { +uint8_t muse_clock_pulse(void) { bool top = number_of_ones_to_bool[ bit_for_value(muse_theme[0]) + - bit_for_value(muse_theme[1]) << 1 + - bit_for_value(muse_theme[2]) << 2 + - bit_for_value(muse_theme[3]) << 3 + (bit_for_value(muse_theme[1]) << 1) + + (bit_for_value(muse_theme[2]) << 2) + + (bit_for_value(muse_theme[3]) << 3) ]; - if (timer_1bit == 0) { - if (timer_2bit_counter == 0) { - timer_2bit = (timer_2bit + 1) % 4; - timer_2bit_counter = (timer_2bit_counter + 1) % 3; + if (muse_timer_1bit == 0) { + if (muse_timer_2bit_counter == 0) { + muse_timer_2bit = (muse_timer_2bit + 1) % 4; } - timer_4bit = (timer_4bit + 1) % 16; - timer_31bit = (timer_31bit << 1) + top; + muse_timer_2bit_counter = (muse_timer_2bit_counter + 1) % 3; + muse_timer_4bit = (muse_timer_4bit + 1) % 16; + muse_timer_31bit = (muse_timer_31bit << 1) + top; } - timer_1bit = (timer_1bit + 1) % 2; + muse_timer_1bit = (muse_timer_1bit + 1) % 2; return bit_for_value(muse_interval[0]) + - bit_for_value(muse_interval[1]) << 1 + - bit_for_value(muse_interval[2]) << 2 + - bit_for_value(muse_interval[3]) << 3; + (bit_for_value(muse_interval[1]) << 1) + + (bit_for_value(muse_interval[2]) << 2) + + (bit_for_value(muse_interval[3]) << 3); } diff --git a/quantum/audio/muse.h b/quantum/audio/muse.h new file mode 100644 index 00000000..6f382a7f --- /dev/null +++ b/quantum/audio/muse.h @@ -0,0 +1,9 @@ +#ifndef MUSE_H +#define MUSE_H + +#include "quantum.h" +#include "process_audio.h" + +uint8_t muse_clock_pulse(void); + +#endif diff --git a/quantum/process_keycode/process_audio.c b/quantum/process_keycode/process_audio.c index 32057ae8..0a25aa53 100644 --- a/quantum/process_keycode/process_audio.c +++ b/quantum/process_keycode/process_audio.c @@ -10,7 +10,7 @@ float voice_change_song[][2] = VOICE_CHANGE_SONG; #define PITCH_STANDARD_A 440.0f #endif -static float compute_freq_for_midi_note(uint8_t note) +float compute_freq_for_midi_note(uint8_t note) { // https://en.wikipedia.org/wiki/MIDI_tuning_standard return pow(2.0, (note - 69) / 12.0) * PITCH_STANDARD_A; @@ -65,4 +65,4 @@ void process_audio_all_notes_off(void) { } __attribute__ ((weak)) -void audio_on_user() {} \ No newline at end of file +void audio_on_user() {} diff --git a/quantum/process_keycode/process_audio.h b/quantum/process_keycode/process_audio.h index 7ac15b73..3a84c3d8 100644 --- a/quantum/process_keycode/process_audio.h +++ b/quantum/process_keycode/process_audio.h @@ -1,6 +1,8 @@ #ifndef PROCESS_AUDIO_H #define PROCESS_AUDIO_H +float compute_freq_for_midi_note(uint8_t note); + bool process_audio(uint16_t keycode, keyrecord_t *record); void process_audio_noteon(uint8_t note); void process_audio_noteoff(uint8_t note); @@ -8,4 +10,4 @@ void process_audio_all_notes_off(void); void audio_on_user(void); -#endif \ No newline at end of file +#endif