You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

119 lines
3.6 KiB

  1. #include "process_clicky.h"
  2. #include "audio.h"
  3. #include "eeconfig.h"
  4. #include <stdlib.h>
  5. #ifdef AUDIO_CLICKY
  6. # ifndef AUDIO_CLICKY_DELAY_DURATION
  7. # define AUDIO_CLICKY_DELAY_DURATION 1
  8. # endif // !AUDIO_CLICKY_DELAY_DURATION
  9. # ifndef AUDIO_CLICKY_FREQ_DEFAULT
  10. # define AUDIO_CLICKY_FREQ_DEFAULT 440.0f
  11. # endif // !AUDIO_CLICKY_FREQ_DEFAULT
  12. # ifndef AUDIO_CLICKY_FREQ_MIN
  13. # define AUDIO_CLICKY_FREQ_MIN 65.0f
  14. # endif // !AUDIO_CLICKY_FREQ_MIN
  15. # ifndef AUDIO_CLICKY_FREQ_MAX
  16. # define AUDIO_CLICKY_FREQ_MAX 1500.0f
  17. # endif // !AUDIO_CLICKY_FREQ_MAX
  18. # ifndef AUDIO_CLICKY_FREQ_FACTOR
  19. # define AUDIO_CLICKY_FREQ_FACTOR 1.18921f
  20. # endif // !AUDIO_CLICKY_FREQ_FACTOR
  21. # ifndef AUDIO_CLICKY_FREQ_RANDOMNESS
  22. # define AUDIO_CLICKY_FREQ_RANDOMNESS 0.05f
  23. # endif // !AUDIO_CLICKY_FREQ_RANDOMNESS
  24. float clicky_freq = AUDIO_CLICKY_FREQ_DEFAULT;
  25. float clicky_rand = AUDIO_CLICKY_FREQ_RANDOMNESS;
  26. // the first "note" is an intentional delay; the 2nd and 3rd notes are the "clicky"
  27. float clicky_song[][2] = {{0.0f, AUDIO_CLICKY_DELAY_DURATION}, {AUDIO_CLICKY_FREQ_DEFAULT, 3}, {AUDIO_CLICKY_FREQ_DEFAULT, 1}}; // 3 and 1 --> durations
  28. extern audio_config_t audio_config;
  29. # ifndef NO_MUSIC_MODE
  30. extern bool music_activated;
  31. extern bool midi_activated;
  32. # endif // !NO_MUSIC_MODE
  33. void clicky_play(void) {
  34. # ifndef NO_MUSIC_MODE
  35. if (music_activated || midi_activated || !audio_config.enable) return;
  36. # endif // !NO_MUSIC_MODE
  37. clicky_song[1][0] = 2.0f * clicky_freq * (1.0f + clicky_rand * (((float)rand()) / ((float)(RAND_MAX))));
  38. clicky_song[2][0] = clicky_freq * (1.0f + clicky_rand * (((float)rand()) / ((float)(RAND_MAX))));
  39. PLAY_SONG(clicky_song);
  40. }
  41. void clicky_freq_up(void) {
  42. float new_freq = clicky_freq * AUDIO_CLICKY_FREQ_FACTOR;
  43. if (new_freq < AUDIO_CLICKY_FREQ_MAX) {
  44. clicky_freq = new_freq;
  45. }
  46. }
  47. void clicky_freq_down(void) {
  48. float new_freq = clicky_freq / AUDIO_CLICKY_FREQ_FACTOR;
  49. if (new_freq > AUDIO_CLICKY_FREQ_MIN) {
  50. clicky_freq = new_freq;
  51. }
  52. }
  53. void clicky_freq_reset(void) {
  54. clicky_freq = AUDIO_CLICKY_FREQ_DEFAULT;
  55. }
  56. void clicky_toggle(void) {
  57. audio_config.clicky_enable ^= 1;
  58. eeconfig_update_audio(audio_config.raw);
  59. }
  60. void clicky_on(void) {
  61. audio_config.clicky_enable = 1;
  62. eeconfig_update_audio(audio_config.raw);
  63. }
  64. void clicky_off(void) {
  65. audio_config.clicky_enable = 0;
  66. eeconfig_update_audio(audio_config.raw);
  67. }
  68. bool is_clicky_on(void) {
  69. return (audio_config.clicky_enable != 0);
  70. }
  71. bool process_clicky(uint16_t keycode, keyrecord_t *record) {
  72. if (keycode == QK_AUDIO_CLICKY_TOGGLE && record->event.pressed) {
  73. clicky_toggle();
  74. }
  75. if (keycode == QK_AUDIO_CLICKY_ON && record->event.pressed) {
  76. clicky_on();
  77. }
  78. if (keycode == QK_AUDIO_CLICKY_OFF && record->event.pressed) {
  79. clicky_off();
  80. }
  81. if (keycode == QK_AUDIO_CLICKY_RESET && record->event.pressed) {
  82. clicky_freq_reset();
  83. }
  84. if (keycode == QK_AUDIO_CLICKY_UP && record->event.pressed) {
  85. clicky_freq_up();
  86. }
  87. if (keycode == QK_AUDIO_CLICKY_DOWN && record->event.pressed) {
  88. clicky_freq_down();
  89. }
  90. if (audio_config.enable && audio_config.clicky_enable) {
  91. if (record->event.pressed) { // Leave this separate so it's easier to add upstroke sound
  92. if (keycode != QK_AUDIO_ON && keycode != QK_AUDIO_OFF) { // DO NOT PLAY if audio will be disabled, and causes issuse on ARM
  93. clicky_play();
  94. }
  95. }
  96. }
  97. return true;
  98. }
  99. #endif // AUDIO_CLICKY