]> git.donarmstrong.com Git - qmk_firmware.git/blobdiff - quantum/audio.c
Merge https://github.com/jackhumbert/qmk_firmware
[qmk_firmware.git] / quantum / audio.c
index 470dc8e0c77bae9646311f0e68e0f7f003f144ca..6bd6532a3abcec328a5bd0dda520642d6ec957b6 100644 (file)
@@ -61,7 +61,11 @@ uint16_t note_position = 0;
 float (* notes_pointer)[][2];
 uint8_t notes_length;
 bool notes_repeat;
+float notes_rest;
+bool note_resting = false;
+
 uint8_t current_note = 0;
+uint8_t rest_counter = 0;
 
 audio_config_t audio_config;
 
@@ -177,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
@@ -198,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;
 
@@ -294,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++;
@@ -314,13 +318,21 @@ ISR(TIMER3_COMPA_vect) {
                     return;
                 }
             }
-            #ifdef PWM_AUDIO
-                note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
-                note_length = (*notes_pointer)[current_note][1];
-            #else
-                note_frequency = (*notes_pointer)[current_note][0];
-                note_length = (*notes_pointer)[current_note][1] / 4;
-            #endif
+            if (!note_resting && (notes_rest > 0)) {
+                note_resting = true;
+                note_frequency = 0;
+                note_length = notes_rest;
+                current_note--;
+            } else {
+                note_resting = false;
+                #ifdef PWM_AUDIO
+                    note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
+                    note_length = (*notes_pointer)[current_note][1];
+                #else
+                    note_frequency = (*notes_pointer)[current_note][0];
+                    note_length = (*notes_pointer)[current_note][1] / 4;
+                #endif
+            }
             note_position = 0;
         }
 
@@ -332,17 +344,17 @@ ISR(TIMER3_COMPA_vect) {
     }
 }
 
-void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat) {
+void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat, float n_rest) {
 
 if (audio_config.enable) {
 
     if (note)
         stop_all_notes();
-    notes = true;
 
     notes_pointer = np;
     notes_length = n_length;
     notes_repeat = n_repeat;
+    notes_rest = n_rest;
 
     place = 0;
     current_note = 0;
@@ -362,6 +374,8 @@ if (audio_config.enable) {
         TIMSK3 |= _BV(OCIE3A);
         TCCR3A |= _BV(COM3A1);
     #endif
+
+    notes = true;
 }
 
 }
@@ -391,7 +405,6 @@ if (audio_config.enable && voices < 8) {
 
     if (notes)
         stop_all_notes();
-    note = true;
     #ifdef PWM_AUDIO
         freq = freq / SAMPLE_RATE;
     #endif
@@ -399,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) {
@@ -423,6 +436,7 @@ if (audio_config.enable && voices < 8) {
         TCCR3A |= _BV(COM3A1);
     #endif
 
+    note = true;
 }
 
 }
\ No newline at end of file