]> git.donarmstrong.com Git - qmk_firmware.git/blobdiff - quantum/process_keycode/process_audio.c
Add Faux Clicking as subset of Audio feature (#2748)
[qmk_firmware.git] / quantum / process_keycode / process_audio.c
index 32057ae8dc3ebf216659617a6e71695d4c8ee6b5..2d92e4064d2c587ec64942494f91339a7c343ee3 100644 (file)
@@ -10,6 +10,46 @@ float voice_change_song[][2] = VOICE_CHANGE_SONG;
     #define PITCH_STANDARD_A 440.0f
 #endif
 
+#ifdef AUDIO_CLICKY
+#ifdef AUDIO_CLICKY_ON
+bool clicky_enable = true;
+#else
+bool clicky_enable = false;
+#endif
+#ifndef AUDIO_CLICKY_FREQ_DEFAULT
+#define AUDIO_CLICKY_FREQ_DEFAULT 440.0f
+#endif
+#ifndef AUDIO_CLICKY_FREQ_MIN
+#define AUDIO_CLICKY_FREQ_MIN 65.0f
+#endif
+#ifndef AUDIO_CLICKY_FREQ_MAX
+#define AUDIO_CLICKY_FREQ_MAX 1500.0f
+#endif
+#ifndef AUDIO_CLICKY_FREQ_FACTOR
+#define AUDIO_CLICKY_FREQ_FACTOR 1.18921f
+#endif
+#ifndef AUDIO_CLICKY_FREQ_RANDOMNESS
+#define AUDIO_CLICKY_FREQ_RANDOMNESS 0.05f
+#endif
+
+float clicky_freq = AUDIO_CLICKY_FREQ_DEFAULT;
+float clicky_song[][2]  = {{AUDIO_CLICKY_FREQ_DEFAULT, 3}, {AUDIO_CLICKY_FREQ_DEFAULT, 1}}; // 3 and 1 --> durations
+
+#ifndef NO_MUSIC_MODE
+extern bool music_activated;
+extern bool midi_activated;
+#endif
+
+void clicky_play(void) {
+#ifndef NO_MUSIC_MODE
+  if (music_activated || midi_activated) return;
+#endif
+  clicky_song[0][0] = 2.0f * clicky_freq * (1.0f + AUDIO_CLICKY_FREQ_RANDOMNESS * ( ((float)rand()) / ((float)(RAND_MAX)) ) );
+  clicky_song[1][0] = clicky_freq * (1.0f + AUDIO_CLICKY_FREQ_RANDOMNESS * ( ((float)rand()) / ((float)(RAND_MAX)) ) );
+  PLAY_SONG(clicky_song);
+}
+#endif
+
 static float compute_freq_for_midi_note(uint8_t note)
 {
     // https://en.wikipedia.org/wiki/MIDI_tuning_standard
@@ -49,6 +89,33 @@ bool process_audio(uint16_t keycode, keyrecord_t *record) {
         return false;
     }
 
+#ifdef AUDIO_CLICKY
+    if (keycode == CLICKY_TOGGLE && record->event.pressed) { clicky_enable = !clicky_enable; }
+
+    if (keycode == CLICKY_RESET && record->event.pressed) { clicky_freq = AUDIO_CLICKY_FREQ_DEFAULT; }
+
+    if (keycode == CLICKY_UP && record->event.pressed) {
+      float new_freq = clicky_freq * AUDIO_CLICKY_FREQ_FACTOR;
+      if (new_freq < AUDIO_CLICKY_FREQ_MAX) {
+        clicky_freq = new_freq;
+      }
+    }
+    if (keycode == CLICKY_TOGGLE && record->event.pressed) {
+      float new_freq = clicky_freq / AUDIO_CLICKY_FREQ_FACTOR;
+      if (new_freq > AUDIO_CLICKY_FREQ_MIN) {
+        clicky_freq = new_freq;
+      }
+      }
+
+
+    if ( (clicky_enable && keycode != CLICKY_TOGGLE) || (!clicky_enable && keycode == CLICKY_TOGGLE) ) {
+      if (record->event.pressed) {
+        stop_all_notes();
+        clicky_play();;
+      }
+    }
+#endif // AUDIO_CLICKY
+
     return true;
 }
 
@@ -65,4 +132,4 @@ void process_audio_all_notes_off(void) {
 }
 
 __attribute__ ((weak))
-void audio_on_user() {}
\ No newline at end of file
+void audio_on_user() {}