aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--keyboard/preonic/keymaps/default/keymap.c160
-rw-r--r--quantum/audio.c100
2 files changed, 165 insertions, 95 deletions
diff --git a/keyboard/preonic/keymaps/default/keymap.c b/keyboard/preonic/keymaps/default/keymap.c
index c52d8472f..6824f68b6 100644
--- a/keyboard/preonic/keymaps/default/keymap.c
+++ b/keyboard/preonic/keymaps/default/keymap.c
@@ -1,31 +1,40 @@
1#include "preonic.h" 1#include "preonic.h"
2#include "action_layer.h" 2#include "action_layer.h"
3#include "eeconfig.h"
3#ifdef AUDIO_ENABLE 4#ifdef AUDIO_ENABLE
4 #include "audio.h" 5 #include "audio.h"
6 #define SCALE (int []){ 0 + (12*0), 2 + (12*0), 4 + (12*0), 5 + (12*0), 7 + (12*0), 9 + (12*0), 11 + (12*0), \
7 0 + (12*1), 2 + (12*1), 4 + (12*1), 5 + (12*1), 7 + (12*1), 9 + (12*1), 11 + (12*1), \
8 0 + (12*2), 2 + (12*2), 4 + (12*2), 5 + (12*2), 7 + (12*2), 9 + (12*2), 11 + (12*2), \
9 0 + (12*3), 2 + (12*3), 4 + (12*3), 5 + (12*3), 7 + (12*3), 9 + (12*3), 11 + (12*3), \
10 0 + (12*4), 2 + (12*4), 4 + (12*4), 5 + (12*4), 7 + (12*4), 9 + (12*4), 11 + (12*4), }
5#endif 11#endif
6 12
7// Each layer gets a name for readability, which is then used in the keymap matrix below. 13// Each layer gets a name for readability, which is then used in the keymap matrix below.
8// The underscores don't mean anything - you can have a layer called STUFF or any other name. 14// The underscores don't mean anything - you can have a layer called STUFF or any other name.
9// Layer names don't all need to be of the same length, obviously, and you can also skip them 15// Layer names don't all need to be of the same length, obviously, and you can also skip them
10// entirely and just use numbers. 16// entirely and just use numbers.
11#define _QW 0 17#define _QWERTY 0
12#define _CM 1 18#define _COLEMAK 1
13#define _DV 2 19#define _DVORAK 2
14#define _LW 3 20#define _LOWER 3
15#define _RS 4 21#define _RAISE 4
16#define _AD 5 22#define _ADJUST 5
23#define _MUSIC 6
17 24
18// Macro name shortcuts 25// Macro name shortcuts
19#define QWERTY M(_QW) 26#define QWERTY M(_QWERTY)
20#define COLEMAK M(_CM) 27#define COLEMAK M(_COLEMAK)
21#define DVORAK M(_DV) 28#define DVORAK M(_DVORAK)
22#define LOWER M(_LW) 29#define LOWER M(_LOWER)
23#define RAISE M(_RS) 30#define RAISE M(_RAISE)
24#define M_BL 5 31#define M_BL 5
25#ifdef AUDIO_ENABLE 32#ifdef AUDIO_ENABLE
26 #define AUD_OFF M(6) 33 #define AUD_OFF M(6)
27 #define AUD_ON M(7) 34 #define AUD_ON M(7)
28#endif 35#endif
36#define MUS_OFF M(8)
37#define MUS_ON M(9)
29 38
30// Fillers to make layering more clear 39// Fillers to make layering more clear
31#define _______ KC_TRNS 40#define _______ KC_TRNS
@@ -46,7 +55,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
46 * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | 55 * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
47 * `-----------------------------------------------------------------------------------' 56 * `-----------------------------------------------------------------------------------'
48 */ 57 */
49[_QW] = { 58[_QWERTY] = {
50 {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, 59 {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
51 {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL}, 60 {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL},
52 {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, 61 {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
@@ -67,7 +76,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
67 * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | 76 * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
68 * `-----------------------------------------------------------------------------------' 77 * `-----------------------------------------------------------------------------------'
69 */ 78 */
70[_CM] = { 79[_COLEMAK] = {
71 {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, 80 {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
72 {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL}, 81 {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL},
73 {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, 82 {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
@@ -88,7 +97,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
88 * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | 97 * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
89 * `-----------------------------------------------------------------------------------' 98 * `-----------------------------------------------------------------------------------'
90 */ 99 */
91[_DV] = { 100[_DVORAK] = {
92 {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, 101 {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
93 {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL}, 102 {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL},
94 {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH}, 103 {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH},
@@ -109,7 +118,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
109 * | | | | | | | | Next | Vol- | Vol+ | Play | 118 * | | | | | | | | Next | Vol- | Vol+ | Play |
110 * `-----------------------------------------------------------------------------------' 119 * `-----------------------------------------------------------------------------------'
111 */ 120 */
112[_LW] = { 121[_LOWER] = {
113 {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, 122 {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
114 {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL}, 123 {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL},
115 {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, 124 {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
@@ -130,7 +139,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
130 * | | | | | | | | Next | Vol- | Vol+ | Play | 139 * | | | | | | | | Next | Vol- | Vol+ | Play |
131 * `-----------------------------------------------------------------------------------' 140 * `-----------------------------------------------------------------------------------'
132 */ 141 */
133[_RS] = { 142[_RAISE] = {
134 {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, 143 {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
135 {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL}, 144 {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL},
136 {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, 145 {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
@@ -151,10 +160,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
151 * | | | | | | | | | | | | 160 * | | | | | | | | | | | |
152 * `-----------------------------------------------------------------------------------' 161 * `-----------------------------------------------------------------------------------'
153 */ 162 */
154[_AD] = { 163[_ADJUST] = {
155 {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12}, 164 {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12},
156 {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, 165 {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL},
157 {_______, _______, _______, AUD_ON, AUD_OFF, _______, _______, QWERTY, COLEMAK, DVORAK, _______, _______}, 166 {_______, _______, _______, AUD_ON, AUD_OFF, _______, _______, QWERTY, COLEMAK, DVORAK, _______, _______},
167 {_______, _______, _______, MUS_ON, MUS_OFF, _______, _______, _______, _______, _______, _______, _______},
168 {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
169},
170
171/* Music (reserved for process_action_user)
172 *
173 */
174[_MUSIC] = {
175 {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______},
176 {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______},
177 {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______},
158 {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, 178 {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______},
159 {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} 179 {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
160} 180}
@@ -166,24 +186,20 @@ const uint16_t PROGMEM fn_actions[] = {
166 186
167#ifdef AUDIO_ENABLE 187#ifdef AUDIO_ENABLE
168float start_up[][2] = { 188float start_up[][2] = {
169 {440.0*pow(2.0,(55)/12.0), 12}, 189 {440.0*pow(2.0,(50)/12.0), 20},
170 {0, 2}, 190 {440.0*pow(2.0,(62)/12.0), 8},
171 {440.0*pow(2.0,(67)/12.0), 8}, 191 {440.0*pow(2.0,(54)/12.0), 20},
172 {440.0*pow(2.0,(64)/12.0), 8}, 192 {440.0*pow(2.0,(62)/12.0), 8}
173 {440.0*pow(2.0,(55)/12.0), 8},
174 {440.0*pow(2.0,(67)/12.0), 12},
175 {0, 2},
176 {440.0*pow(2.0,(67)/12.0), 12}
177}; 193};
178 194
179float tone_qw[][2] = { 195float tone_qwerty[][2] = {
180 {440.0*pow(2.0,(59)/12.0), 8}, 196 {440.0*pow(2.0,(59)/12.0), 8},
181 {440.0*pow(2.0,(60)/12.0), 8}, 197 {440.0*pow(2.0,(60)/12.0), 8},
182 {0, 4}, 198 {0, 4},
183 {440.0*pow(2.0,(67)/12.0), 16} 199 {440.0*pow(2.0,(67)/12.0), 16}
184}; 200};
185 201
186float tone_cm[][2] = { 202float tone_colemak[][2] = {
187 {440.0*pow(2.0,(59)/12.0), 8}, 203 {440.0*pow(2.0,(59)/12.0), 8},
188 {440.0*pow(2.0,(60)/12.0), 8}, 204 {440.0*pow(2.0,(60)/12.0), 8},
189 {0, 4}, 205 {0, 4},
@@ -192,7 +208,7 @@ float tone_cm[][2] = {
192 {440.0*pow(2.0,(71)/12.0), 12} 208 {440.0*pow(2.0,(71)/12.0), 12}
193}; 209};
194 210
195float tone_dv[][2] = { 211float tone_dvorak[][2] = {
196 {440.0*pow(2.0,(59)/12.0), 8}, 212 {440.0*pow(2.0,(59)/12.0), 8},
197 {440.0*pow(2.0,(60)/12.0), 8}, 213 {440.0*pow(2.0,(60)/12.0), 8},
198 {0, 4}, 214 {0, 4},
@@ -202,53 +218,66 @@ float tone_dv[][2] = {
202 {0, 4}, 218 {0, 4},
203 {440.0*pow(2.0,(67)/12.0), 8} 219 {440.0*pow(2.0,(67)/12.0), 8}
204}; 220};
221
222float tone_music[][2] = {
223 {440.0*pow(2.0,(48)/12.0), 8},
224 {440.0*pow(2.0,(50)/12.0), 8},
225 {440.0*pow(2.0,(52)/12.0), 8},
226 {440.0*pow(2.0,(53)/12.0), 8},
227 {440.0*pow(2.0,(55)/12.0), 8},
228 {440.0*pow(2.0,(57)/12.0), 8},
229 {440.0*pow(2.0,(59)/12.0), 8},
230 {440.0*pow(2.0,(60)/12.0), 8}
231};
205#endif 232#endif
206 233
207 234
208const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) 235const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
209{ 236{
210 // MACRODOWN only works in this function
211 switch(id) { 237 switch(id) {
212 case _QW: 238 case _QWERTY:
213 if (record->event.pressed) { 239 if (record->event.pressed) {
214 #ifdef AUDIO_ENABLE 240 #ifdef AUDIO_ENABLE
215 play_notes(&tone_qw, 4, false); 241 play_notes(&tone_qwerty, 4, false);
216 #endif 242 #endif
217 default_layer_set(1UL<<_QW); 243 eeconfig_write_default_layer(1UL<<_QWERTY);
244 default_layer_set(1UL<<_QWERTY);
218 } 245 }
219 break; 246 break;
220 case _CM: 247 case _COLEMAK:
221 if (record->event.pressed) { 248 if (record->event.pressed) {
222 #ifdef AUDIO_ENABLE 249 #ifdef AUDIO_ENABLE
223 play_notes(&tone_cm, 6, false); 250 play_notes(&tone_colemak, 6, false);
224 #endif 251 #endif
225 default_layer_set(1UL<<_CM); 252 eeconfig_write_default_layer(1UL<<_COLEMAK);
253 default_layer_set(1UL<<_COLEMAK);
226 } 254 }
227 break; 255 break;
228 case _DV: 256 case _DVORAK:
229 if (record->event.pressed) { 257 if (record->event.pressed) {
230 #ifdef AUDIO_ENABLE 258 #ifdef AUDIO_ENABLE
231 play_notes(&tone_dv, 8, false); 259 play_notes(&tone_dvorak, 8, false);
232 #endif 260 #endif
233 default_layer_set(1UL<<_DV); 261 eeconfig_write_default_layer(1UL<<_DVORAK);
262 default_layer_set(1UL<<_DVORAK);
234 } 263 }
235 break; 264 break;
236 case _LW: 265 case _LOWER:
237 if (record->event.pressed) { 266 if (record->event.pressed) {
238 layer_on(_LW); 267 layer_on(_LOWER);
239 update_tri_layer(_LW, _RS, _AD); 268 update_tri_layer(_LOWER, _RAISE, _ADJUST);
240 } else { 269 } else {
241 layer_off(_LW); 270 layer_off(_LOWER);
242 update_tri_layer(_LW, _RS, _AD); 271 update_tri_layer(_LOWER, _RAISE, _ADJUST);
243 } 272 }
244 break; 273 break;
245 case _RS: 274 case _RAISE:
246 if (record->event.pressed) { 275 if (record->event.pressed) {
247 layer_on(_RS); 276 layer_on(_RAISE);
248 update_tri_layer(_LW, _RS, _AD); 277 update_tri_layer(_LOWER, _RAISE, _ADJUST);
249 } else { 278 } else {
250 layer_off(_RS); 279 layer_off(_RAISE);
251 update_tri_layer(_LW, _RS, _AD); 280 update_tri_layer(_LOWER, _RAISE, _ADJUST);
252 } 281 }
253 break; 282 break;
254 case M_BL: 283 case M_BL:
@@ -272,7 +301,23 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
272 if (record->event.pressed) { 301 if (record->event.pressed) {
273 #ifdef AUDIO_ENABLE 302 #ifdef AUDIO_ENABLE
274 audio_on(); 303 audio_on();
275 play_notes(&start_up, 7, false); 304 play_notes(&start_up, 4, false);
305 #endif
306 }
307 break;
308 case 8:
309 if (record->event.pressed) {
310 #ifdef AUDIO_ENABLE
311 layer_off(_MUSIC);
312 stop_all_notes();
313 #endif
314 }
315 break;
316 case 9:
317 if (record->event.pressed) {
318 #ifdef AUDIO_ENABLE
319 play_notes(&tone_music, 8, false);
320 layer_on(_MUSIC);
276 #endif 321 #endif
277 } 322 }
278 break; 323 break;
@@ -280,9 +325,24 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
280 return MACRO_NONE; 325 return MACRO_NONE;
281}; 326};
282 327
328uint8_t starting_note = 0x0C;
329int offset = 7;
330
331void process_action_user(keyrecord_t *record) {
332
333 if (IS_LAYER_ON(_MUSIC)) {
334 if (record->event.pressed) {
335 play_note(((double)261.626)*pow(2.0, -2.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF);
336 } else {
337 stop_note(((double)261.626)*pow(2.0, -2.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
338 }
339 }
340
341}
342
283void matrix_init_user(void) { 343void matrix_init_user(void) {
284 #ifdef AUDIO_ENABLE 344 #ifdef AUDIO_ENABLE
285 init_notes(); 345 init_notes();
286 play_notes(&start_up, 7, false); 346 play_notes(&start_up, 4, false);
287 #endif 347 #endif
288} 348}
diff --git a/quantum/audio.c b/quantum/audio.c
index 73985479c..5edcccdbe 100644
--- a/quantum/audio.c
+++ b/quantum/audio.c
@@ -32,6 +32,8 @@ int voice_place = 0;
32double frequency = 0; 32double frequency = 0;
33int volume = 0; 33int volume = 0;
34long position = 0; 34long position = 0;
35int duty_place = 1;
36int duty_counter = 0;
35 37
36double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0}; 38double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0};
37int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0}; 39int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0};
@@ -98,53 +100,55 @@ void stop_all_notes() {
98} 100}
99 101
100void stop_note(double freq) { 102void stop_note(double freq) {
101 #ifdef PWM_AUDIO 103 if (note) {
102 freq = freq / SAMPLE_RATE;
103 #endif
104 for (int i = 7; i >= 0; i--) {
105 if (frequencies[i] == freq) {
106 frequencies[i] = 0;
107 volumes[i] = 0;
108 for (int j = i; (j < 7); j++) {
109 frequencies[j] = frequencies[j+1];
110 frequencies[j+1] = 0;
111 volumes[j] = volumes[j+1];
112 volumes[j+1] = 0;
113 }
114 }
115 }
116 voices--;
117 if (voices < 0)
118 voices = 0;
119 if (voices == 0) {
120 #ifdef PWM_AUDIO 104 #ifdef PWM_AUDIO
121 TIMSK3 &= ~_BV(OCIE3A); 105 freq = freq / SAMPLE_RATE;
122 #else
123 TIMSK3 &= ~_BV(OCIE3A);
124 TCCR3A &= ~_BV(COM3A1);
125 #endif 106 #endif
126 frequency = 0; 107 for (int i = 7; i >= 0; i--) {
127 volume = 0; 108 if (frequencies[i] == freq) {
128 note = false; 109 frequencies[i] = 0;
129 } else { 110 volumes[i] = 0;
130 double freq = frequencies[voices - 1]; 111 for (int j = i; (j < 7); j++) {
131 int vol = volumes[voices - 1]; 112 frequencies[j] = frequencies[j+1];
132 double starting_f = frequency; 113 frequencies[j+1] = 0;
133 if (frequency < freq) { 114 volumes[j] = volumes[j+1];
134 sliding = true; 115 volumes[j+1] = 0;
135 for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) { 116 }
136 frequency = f;
137 } 117 }
138 sliding = false; 118 }
139 } else if (frequency > freq) { 119 voices--;
140 sliding = true; 120 if (voices < 0)
141 for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 2000.0)) { 121 voices = 0;
142 frequency = f; 122 if (voices == 0) {
123 #ifdef PWM_AUDIO
124 TIMSK3 &= ~_BV(OCIE3A);
125 #else
126 TIMSK3 &= ~_BV(OCIE3A);
127 TCCR3A &= ~_BV(COM3A1);
128 #endif
129 frequency = 0;
130 volume = 0;
131 note = false;
132 } else {
133 double freq = frequencies[voices - 1];
134 int vol = volumes[voices - 1];
135 double starting_f = frequency;
136 if (frequency < freq) {
137 sliding = true;
138 for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) {
139 frequency = f;
140 }
141 sliding = false;
142 } else if (frequency > freq) {
143 sliding = true;
144 for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 2000.0)) {
145 frequency = f;
146 }
147 sliding = false;
143 } 148 }
144 sliding = false; 149 frequency = freq;
150 volume = vol;
145 } 151 }
146 frequency = freq;
147 volume = vol;
148 } 152 }
149} 153}
150 154
@@ -239,13 +243,19 @@ ISR(TIMER3_COMPA_vect) {
239 if (frequency > 0) { 243 if (frequency > 0) {
240 // ICR3 = (int)(((double)F_CPU) / frequency); // Set max to the period 244 // ICR3 = (int)(((double)F_CPU) / frequency); // Set max to the period
241 // OCR3A = (int)(((double)F_CPU) / frequency) >> 1; // Set compare to half the period 245 // OCR3A = (int)(((double)F_CPU) / frequency) >> 1; // Set compare to half the period
242 if (place > 10) { 246 voice_place %= voices;
247 if (place > (frequencies[voice_place] / 500)) {
243 voice_place = (voice_place + 1) % voices; 248 voice_place = (voice_place + 1) % voices;
244 place = 0.0; 249 place = 0.0;
245 } 250 }
246 ICR3 = (int)(((double)F_CPU) / frequencies[voice_place]); // Set max to the period 251 ICR3 = (int)(((double)F_CPU) / frequencies[voice_place]); // Set max to the period
247 OCR3A = (int)(((double)F_CPU) / frequencies[voice_place]) >> 1; // Set compare to half the period 252 OCR3A = (int)(((double)F_CPU) / frequencies[voice_place]) >> 1 * duty_place; // Set compare to half the period
248 place++; 253 place++;
254 // if (duty_counter > (frequencies[voice_place] / 500)) {
255 // duty_place = (duty_place % 3) + 1;
256 // duty_counter = 0;
257 // }
258 // duty_counter++;
249 } 259 }
250 #endif 260 #endif
251 } 261 }
@@ -375,7 +385,7 @@ if (audio_config.enable) {
375 385
376void play_note(double freq, int vol) { 386void play_note(double freq, int vol) {
377 387
378if (audio_config.enable) { 388if (audio_config.enable && voices < 8) {
379 389
380 if (notes) 390 if (notes)
381 stop_all_notes(); 391 stop_all_notes();