]> git.donarmstrong.com Git - qmk_firmware.git/blob - quantum/process_keycode/process_audio.c
Update to drashna keymaps and userspace (#2756)
[qmk_firmware.git] / quantum / process_keycode / process_audio.c
1 #include "audio.h"
2 #include "process_audio.h"
3
4 #ifndef VOICE_CHANGE_SONG
5     #define VOICE_CHANGE_SONG SONG(VOICE_CHANGE_SOUND)
6 #endif
7 float voice_change_song[][2] = VOICE_CHANGE_SONG;
8
9 #ifndef PITCH_STANDARD_A
10     #define PITCH_STANDARD_A 440.0f
11 #endif
12
13 #ifdef AUDIO_CLICKY
14 #ifdef AUDIO_CLICKY_ON
15 bool clicky_enable = true;
16 #else
17 bool clicky_enable = false;
18 #endif
19 #ifndef AUDIO_CLICKY_FREQ_DEFAULT
20 #define AUDIO_CLICKY_FREQ_DEFAULT 440.0f
21 #endif
22 #ifndef AUDIO_CLICKY_FREQ_MIN
23 #define AUDIO_CLICKY_FREQ_MIN 65.0f
24 #endif
25 #ifndef AUDIO_CLICKY_FREQ_MAX
26 #define AUDIO_CLICKY_FREQ_MAX 1500.0f
27 #endif
28 #ifndef AUDIO_CLICKY_FREQ_FACTOR
29 #define AUDIO_CLICKY_FREQ_FACTOR 1.18921f
30 #endif
31 #ifndef AUDIO_CLICKY_FREQ_RANDOMNESS
32 #define AUDIO_CLICKY_FREQ_RANDOMNESS 0.05f
33 #endif
34
35 float clicky_freq = AUDIO_CLICKY_FREQ_DEFAULT;
36 float clicky_song[][2]  = {{AUDIO_CLICKY_FREQ_DEFAULT, 3}, {AUDIO_CLICKY_FREQ_DEFAULT, 1}}; // 3 and 1 --> durations
37
38 #ifndef NO_MUSIC_MODE
39 extern bool music_activated;
40 extern bool midi_activated;
41 #endif
42
43 void clicky_play(void) {
44 #ifndef NO_MUSIC_MODE
45   if (music_activated || midi_activated) return;
46 #endif
47   clicky_song[0][0] = 2.0f * clicky_freq * (1.0f + AUDIO_CLICKY_FREQ_RANDOMNESS * ( ((float)rand()) / ((float)(RAND_MAX)) ) );
48   clicky_song[1][0] = clicky_freq * (1.0f + AUDIO_CLICKY_FREQ_RANDOMNESS * ( ((float)rand()) / ((float)(RAND_MAX)) ) );
49   PLAY_SONG(clicky_song);
50 }
51 #endif
52
53 static float compute_freq_for_midi_note(uint8_t note)
54 {
55     // https://en.wikipedia.org/wiki/MIDI_tuning_standard
56     return pow(2.0, (note - 69) / 12.0) * PITCH_STANDARD_A;
57 }
58
59 bool process_audio(uint16_t keycode, keyrecord_t *record) {
60
61     if (keycode == AU_ON && record->event.pressed) {
62       audio_on();
63       return false;
64     }
65
66     if (keycode == AU_OFF && record->event.pressed) {
67       audio_off();
68       return false;
69     }
70
71     if (keycode == AU_TOG && record->event.pressed) {
72         if (is_audio_on()) {
73             audio_off();
74         } else {
75             audio_on();
76         }
77         return false;
78     }
79
80     if (keycode == MUV_IN && record->event.pressed) {
81         voice_iterate();
82         PLAY_SONG(voice_change_song);
83         return false;
84     }
85
86     if (keycode == MUV_DE && record->event.pressed) {
87         voice_deiterate();
88         PLAY_SONG(voice_change_song);
89         return false;
90     }
91
92 #ifdef AUDIO_CLICKY
93     if (keycode == CLICKY_TOGGLE && record->event.pressed) { clicky_enable = !clicky_enable; }
94
95     if (keycode == CLICKY_RESET && record->event.pressed) { clicky_freq = AUDIO_CLICKY_FREQ_DEFAULT; }
96
97     if (keycode == CLICKY_UP && record->event.pressed) {
98       float new_freq = clicky_freq * AUDIO_CLICKY_FREQ_FACTOR;
99       if (new_freq < AUDIO_CLICKY_FREQ_MAX) {
100         clicky_freq = new_freq;
101       }
102     }
103     if (keycode == CLICKY_TOGGLE && record->event.pressed) {
104       float new_freq = clicky_freq / AUDIO_CLICKY_FREQ_FACTOR;
105       if (new_freq > AUDIO_CLICKY_FREQ_MIN) {
106         clicky_freq = new_freq;
107       }
108       }
109
110
111     if ( clicky_enable ) {
112       if (record->event.pressed) {
113         stop_all_notes();
114         clicky_play();;
115       }
116     }
117 #endif // AUDIO_CLICKY
118
119     return true;
120 }
121
122 void process_audio_noteon(uint8_t note) {
123     play_note(compute_freq_for_midi_note(note), 0xF);
124 }
125
126 void process_audio_noteoff(uint8_t note) {
127     stop_note(compute_freq_for_midi_note(note));
128 }
129
130 void process_audio_all_notes_off(void) {
131     stop_all_notes();
132 }
133
134 __attribute__ ((weak))
135 void audio_on_user() {}