summaryrefslogtreecommitdiff
path: root/quantum
diff options
context:
space:
mode:
authorDrashna Jaelre <drashna@live.com>2018-04-18 22:47:04 -0700
committerJack Humbert <jack.humb@gmail.com>2018-04-19 01:47:04 -0400
commit8b0b17a369be6d3dff4cb9bad4253960252a5e95 (patch)
tree11d453ef480983571de84147db3bc9c1bfcb5054 /quantum
parent23b45710acc57ed147e006a8c79a1caf6fa57fd7 (diff)
downloadqmk_firmware-8b0b17a369be6d3dff4cb9bad4253960252a5e95.tar.gz
qmk_firmware-8b0b17a369be6d3dff4cb9bad4253960252a5e95.zip
Add Faux Clicking as subset of Audio feature (#2748)
* Add Faux Clicky to main Audio feature * Make clicky settings user configurable * Add additional documentation * Don't play when music mode is enabled (hopefully)
Diffstat (limited to 'quantum')
-rw-r--r--quantum/process_keycode/process_audio.c69
-rw-r--r--quantum/quantum_keycodes.h11
2 files changed, 79 insertions, 1 deletions
diff --git a/quantum/process_keycode/process_audio.c b/quantum/process_keycode/process_audio.c
index 32057ae8dc..2d92e4064d 100644
--- a/quantum/process_keycode/process_audio.c
+++ b/quantum/process_keycode/process_audio.c
@@ -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() {}
diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h
index d545440c99..d6030284a9 100644
--- a/quantum/quantum_keycodes.h
+++ b/quantum/quantum_keycodes.h
@@ -140,6 +140,12 @@ enum quantum_keycodes {
AU_OFF,
AU_TOG,
+ // Faux clicky as part of main audio feature
+ CLICKY_TOGGLE,
+ CLICKY_UP,
+ CLICKY_DOWN,
+ CLICKY_RESET,
+
#ifdef FAUXCLICKY_ENABLE
// Faux clicky
FC_ON,
@@ -561,6 +567,11 @@ enum quantum_keycodes {
#define KC_GESC GRAVE_ESC
+#define CK_TOGG CLICKY_TOGGLE
+#define CK_RST CLICKY_RESET
+#define CK_UP CLICKY_UP
+#define CK_DOWN CLICKY_DOWN
+
#define RGB_MOD RGB_MODE_FORWARD
#define RGB_SMOD RGB_MODE_FORWARD
#define RGB_RMOD RGB_MODE_REVERSE