Fixed how note arrays are used.
5 files changed, 39 insertions(+), 47 deletions(-) M keyboard/atomic/keymaps/pvc/keymap.c M quantum/audio.c M quantum/audio.h M quantum/keymap_common.c M quantum/musical_notes.h
M keyboard/atomic/keymaps/pvc/keymap.c => keyboard/atomic/keymaps/pvc/keymap.c +9 -35
@@ 75,8 75,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }, }; #define IS_LAYER_ON(layer) (layer_state & (1UL << (layer))) #define IS_LAYER_OFF(layer) (!IS_LAYER_ON(layer)) #ifdef AUDIO_ENABLE @@ 201,24 199,14 @@ Q_NOTE(_B8 ) , }; float tone_rs[][2] = { Q_NOTE(_F8 ) , Q_NOTE(_G8 ) , Q_NOTE(_GS8 ) , Q_NOTE(_A8 ) , Q_NOTE(_A4 ) , Q_NOTE(_A4 ) , Q_NOTE(_A4 ) , Q_NOTE(_A4 ) , Q_NOTE(_AS8 ) , Q_NOTE(_B8 ) , }; float tone_fn[][2] = { {440.0*pow(2.0,(59)/12.0), 8}, {440.0*pow(2.0,(60)/12.0), 8}, {0, 4}, {440.0*pow(2.0,(67)/12.0), 16}, {0, 4}, {440.0*pow(2.0,(69)/12.0), 16}, {0, 4}, {440.0*pow(2.0,(67)/12.0), 16} }; #endif @@ void update_quad_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3, uint8_t layer4, bool order) 253,18 241,18 @@ void update_quad_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3, uint8_t l const uint16_t PROGMEM fn_actions[] = { }; #define ARRAY_SIZE(x) ((sizeof x) / (sizeof *x)) //#define MUSIC_ARRAY_SIZE(x) (((int)(sizeof(x) / (sizeof(x[0][0])))) / 2) const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { // MACRODOWN only works in this function switch(id) { case M_LW: if (record->event.pressed) { #ifdef AUDIO_ENABLE println("PlayNotes LW"); print_val_hex32(ARRAY_SIZE(tone_lw)); play_notes(&tone_lw, 96, false); PLAY_NOTE_ARRAY(tone_lw, false, STACCATO); #endif layer_on(_LW); @@ update_tri_layer(_LW, _RS, _FN); 277,7 265,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) if (record->event.pressed) { #ifdef AUDIO_ENABLE println("PlayNotes RS"); play_notes(&tone_rs, 6, false); PLAY_NOTE_ARRAY(tone_rs, false, LEGATO); #endif layer_on(_RS); @@ update_tri_layer(_LW, _RS, _FN); 295,33 283,19 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) #ifdef AUDIO_ENABLE float start_up[][2] = { Q_NOTE(_E4 ) , {0,1} , Q_NOTE(_E4 ) , {0,1} , Q_NOTE(_F4 ) , {0,1} , Q_NOTE(_G4 ) , {0,1} , Q_NOTE(_G4 ) , {0,1} , Q_NOTE(_F4 ) , {0,1} , Q_NOTE(_E4 ) , {0,1} , Q_NOTE(_D4 ) , {0,1} , Q_NOTE(_C4 ) , {0,1} , Q_NOTE(_C4 ) , {0,1} , Q_NOTE(_D4 ) , {0,1} , Q_NOTE(_E4 ) , {0,1} , H_NOTE(_E4 ) , {0,1} , Q_NOTE(_D4 ) , {0,1} , H_NOTE(_D4 ) , }; @@ #endif 329,7 303,7 @@ H_NOTE(_D4 ) , void matrix_init_user(void) { #ifdef AUDIO_ENABLE init_notes(); play_notes(&start_up, 29, false); PLAY_NOTE_ARRAY(start_up, false, STACCATO); println("Matrix Init"); #endif }
M quantum/audio.c => quantum/audio.c +7 -7
@@ 181,7 181,7 @@ void init_notes() { DDRC |= _BV(PORTC6); TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs TCCR3A = 0x0; // Options not needed TCCR3B = _BV(CS31) | _BV(CS30) | _BV(WGM32); // 64th prescaling and CTC @@ OCR3A = SAMPLE_DIVIDER - 1; // Correct count/compare, related to sample playback 202,14 202,14 @@ ISR(TIMER3_COMPA_vect) { if (voices == 1) { // SINE OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 2; // SQUARE // if (((int)place) >= 1024){ // OCR4A = 0xFF >> 2; // } else { // OCR4A = 0x00; // } // SAWTOOTH // OCR4A = (int)place / 4; @@ 298,9 298,9 @@ ISR(TIMER3_COMPA_vect) { note_position++; bool end_of_note = false; if (ICR3 > 0) if (ICR3 > 0) end_of_note = (note_position >= (note_length / ICR3 * 0xFFFF)); else else end_of_note = (note_position >= (note_length * 0x7FF)); if (end_of_note) { @@ current_note++; 318,7 318,7 @@ ISR(TIMER3_COMPA_vect) { return; } } if (!note_resting && ((int)notes_rest != 0)) { if (!note_resting && (notes_rest > 0)) { note_resting = true; note_frequency = 0; @@ note_length = notes_rest; 412,7 412,7 @@ if (audio_config.enable && voices < 8) { if (frequency != 0) { double starting_f = frequency; if (frequency < freq) { for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) { for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) { frequency = f; } } else if (frequency > freq) {
M quantum/audio.h => quantum/audio.h +15 -2
@@ 4,6 4,9 @@ #include <util/delay.h> #include "musical_notes.h" #ifndef AUDIO_H #define AUDIO_H typedef union { uint8_t raw; @@ struct { 19,6 22,16 @@ void audio_off(void); void play_sample(uint8_t * s, uint16_t l, bool r); void play_note(double freq, int vol); void stop_note(double freq); void stop_all_notes(); void init_notes(); void stop_all_notes(void); void init_notes(void); void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat, float n_rest); // These macros are used to allow play_notes to play an array of indeterminate // length. This works around the limitation of C's sizeof operation on pointers. // The global float array for the song must be used here. #define NOTE_ARRAY_SIZE(x) ((int)(sizeof(x) / (sizeof(x[0])))) #define PLAY_NOTE_ARRAY(note_array, note_repeat, note_rest_style) play_notes(¬e_array, NOTE_ARRAY_SIZE((note_array)), (note_repeat), (note_rest_style)); #endif \ No newline at end of file
M quantum/keymap_common.c => quantum/keymap_common.c +2 -2
@@ 189,7 189,7 @@ static action_t keycode_to_action(uint16_t keycode) case RESET: ; // RESET is 0x5000, which is why this is here clear_keyboard(); #ifdef AUDIO_ENABLE play_notes(&goodbye, 3, false, 0); PLAY_NOTE_ARRAY(goodbye, false, 0); #endif _delay_ms(250); @@ #ifdef ATREUS_ASTAR 202,7 202,7 @@ static action_t keycode_to_action(uint16_t keycode) debug_enable = true; break; case 0x5002 ... 0x50FF: // MAGIC actions (BOOTMAGIC without the boot) // MAGIC actions (BOOTMAGIC without the boot) if (!eeconfig_is_enabled()) { eeconfig_init(); }
M quantum/musical_notes.h => quantum/musical_notes.h +6 -1
@@ 9,7 9,7 @@ #define WHOLE_NOTE(note) {(NOTE##note), 64} #define HALF_NOTE(note) {(NOTE##note), 32} #define QUARTER_NOTE(note) {(NOTE##note), 16} #define EIGTH_NOTE(note) {(NOTE##note), 8} #define EIGHTH_NOTE(note) {(NOTE##note), 8} #define SIXTEENTH_NOTE(note) {(NOTE##note), 4} @@ // Note Types Short 19,6 19,11 @@ #define E_NOTE(n) EIGTH_NOTE(n) #define S_NOTE(n) SIXTEENTH_NOTE(n) // Note Styles // Staccato makes sure there is a rest between each note. Think: TA TA TA // Legato makes notes flow together. Think: TAAA #define STACCATO 0.01 #define LEGATO 0 // Notes - # = Octave #define NOTE_REST 0.00