aboutsummaryrefslogtreecommitdiff
path: root/quantum/process_keycode/process_music.c
diff options
context:
space:
mode:
authorRyan Ascheman <rascheman@groupon.com>2016-10-18 12:42:02 -0700
committerRyan Ascheman <rascheman@groupon.com>2016-10-18 12:42:02 -0700
commit55b8b8477cc6aee82dfe6792eea4e589cac433d5 (patch)
treece5bfbd1b0ee59dbffdc2044bcf90c89614392ed /quantum/process_keycode/process_music.c
parentd1c70328f8d8ded6ce1e5422b468fc41ef315e7d (diff)
parent04df74f6360464661bcc1e6794e9fd3549084390 (diff)
downloadqmk_firmware-55b8b8477cc6aee82dfe6792eea4e589cac433d5.tar.gz
qmk_firmware-55b8b8477cc6aee82dfe6792eea4e589cac433d5.zip
Merge remote-tracking branch 'upstream/master'
* upstream/master: (1239 commits) Update ez.c removes planck/rev3 temporarily Move hand_swap_config to ez.c, removes error for infinity Update Makefile ergodox: Update algernon's keymap to v1.9 Added VS Code dir to .gitignore Support the Pegasus Hoof controller. [Jack & Erez] Simplifies and documents TO add readme use wait_ms instead of _delay_ms add messenger init keymap Add example keymap Adding whiskey_tango_foxtrot_capslock ergodox keymap Unicode map framework. Allow unicode up to 0xFFFFF using separate mapping table CIE 1931 dim curve Apply the dim curve to the RGB output Update the Cluecard readme files Tune snake and knight intervals for Cluecard Tunable RGB light intervals ...
Diffstat (limited to 'quantum/process_keycode/process_music.c')
-rw-r--r--quantum/process_keycode/process_music.c176
1 files changed, 176 insertions, 0 deletions
diff --git a/quantum/process_keycode/process_music.c b/quantum/process_keycode/process_music.c
new file mode 100644
index 000000000..2d52e47a7
--- /dev/null
+++ b/quantum/process_keycode/process_music.c
@@ -0,0 +1,176 @@
1#include "process_music.h"
2
3bool music_activated = false;
4uint8_t starting_note = 0x0C;
5int offset = 7;
6
7// music sequencer
8static bool music_sequence_recording = false;
9static bool music_sequence_recorded = false;
10static bool music_sequence_playing = false;
11static float music_sequence[16] = {0};
12static uint8_t music_sequence_count = 0;
13static uint8_t music_sequence_position = 0;
14
15static uint16_t music_sequence_timer = 0;
16static uint16_t music_sequence_interval = 100;
17
18bool process_music(uint16_t keycode, keyrecord_t *record) {
19
20 if (keycode == AU_ON && record->event.pressed) {
21 audio_on();
22 return false;
23 }
24
25 if (keycode == AU_OFF && record->event.pressed) {
26 audio_off();
27 return false;
28 }
29
30 if (keycode == AU_TOG && record->event.pressed) {
31 if (is_audio_on())
32 {
33 audio_off();
34 }
35 else
36 {
37 audio_on();
38 }
39 return false;
40 }
41
42 if (keycode == MU_ON && record->event.pressed) {
43 music_on();
44 return false;
45 }
46
47 if (keycode == MU_OFF && record->event.pressed) {
48 music_off();
49 return false;
50 }
51
52 if (keycode == MU_TOG && record->event.pressed) {
53 if (music_activated)
54 {
55 music_off();
56 }
57 else
58 {
59 music_on();
60 }
61 return false;
62 }
63
64 if (keycode == MUV_IN && record->event.pressed) {
65 voice_iterate();
66 music_scale_user();
67 return false;
68 }
69
70 if (keycode == MUV_DE && record->event.pressed) {
71 voice_deiterate();
72 music_scale_user();
73 return false;
74 }
75
76 if (music_activated) {
77
78 if (keycode == KC_LCTL && record->event.pressed) { // Start recording
79 stop_all_notes();
80 music_sequence_recording = true;
81 music_sequence_recorded = false;
82 music_sequence_playing = false;
83 music_sequence_count = 0;
84 return false;
85 }
86
87 if (keycode == KC_LALT && record->event.pressed) { // Stop recording/playing
88 stop_all_notes();
89 if (music_sequence_recording) { // was recording
90 music_sequence_recorded = true;
91 }
92 music_sequence_recording = false;
93 music_sequence_playing = false;
94 return false;
95 }
96
97 if (keycode == KC_LGUI && record->event.pressed && music_sequence_recorded) { // Start playing
98 stop_all_notes();
99 music_sequence_recording = false;
100 music_sequence_playing = true;
101 music_sequence_position = 0;
102 music_sequence_timer = 0;
103 return false;
104 }
105
106 if (keycode == KC_UP) {
107 if (record->event.pressed)
108 music_sequence_interval-=10;
109 return false;
110 }
111
112 if (keycode == KC_DOWN) {
113 if (record->event.pressed)
114 music_sequence_interval+=10;
115 return false;
116 }
117
118 float freq = ((float)220.0)*pow(2.0, -5.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row));
119 if (record->event.pressed) {
120 play_note(freq, 0xF);
121 if (music_sequence_recording) {
122 music_sequence[music_sequence_count] = freq;
123 music_sequence_count++;
124 }
125 } else {
126 stop_note(freq);
127 }
128
129 if (keycode < 0xFF) // ignores all normal keycodes, but lets RAISE, LOWER, etc through
130 return false;
131 }
132 return true;
133}
134
135bool is_music_on(void) {
136 return (music_activated != 0);
137}
138
139void music_toggle(void) {
140 if (!music_activated) {
141 music_on();
142 } else {
143 music_off();
144 }
145}
146
147void music_on(void) {
148 music_activated = 1;
149 music_on_user();
150}
151
152void music_off(void) {
153 music_activated = 0;
154 stop_all_notes();
155}
156
157
158__attribute__ ((weak))
159void music_on_user() {}
160
161__attribute__ ((weak))
162void audio_on_user() {}
163
164__attribute__ ((weak))
165void music_scale_user() {}
166
167void matrix_scan_music(void) {
168 if (music_sequence_playing) {
169 if ((music_sequence_timer == 0) || (timer_elapsed(music_sequence_timer) > music_sequence_interval)) {
170 music_sequence_timer = timer_read();
171 stop_note(music_sequence[(music_sequence_position - 1 < 0)?(music_sequence_position - 1 + music_sequence_count):(music_sequence_position - 1)]);
172 play_note(music_sequence[music_sequence_position], 0xF);
173 music_sequence_position = (music_sequence_position + 1) % music_sequence_count;
174 }
175 }
176}