]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
Merge remote-tracking branch 'remotes/jackhumbert/master' into personal_atomic_planck
authorIBNobody <ibnobody@gmail.com>
Sun, 17 Apr 2016 17:55:19 +0000 (12:55 -0500)
committerIBNobody <ibnobody@gmail.com>
Sun, 17 Apr 2016 17:55:19 +0000 (12:55 -0500)
1  2 
quantum/audio.c
quantum/audio.h
quantum/keymap_common.c

diff --combined quantum/audio.c
index 58b9ab76bf25d58e6a4a706c8e4efc6ec310b2ef,6bd6532a3abcec328a5bd0dda520642d6ec957b6..3ccd5ab9bc9e4a840db134d66ccd77c54b8af313
@@@ -4,7 -4,7 +4,7 @@@
  #include <avr/pgmspace.h>
  #include <avr/interrupt.h>
  #include <avr/io.h>
 -
 +#include "print.h"
  #include "audio.h"
  #include "keymap_common.h"
  
@@@ -57,11 -57,9 +57,11 @@@ bool notes = false
  bool note = false;
  float note_frequency = 0;
  float note_length = 0;
 +float note_tempo = TEMPO_DEFAULT;
 +float note_timbre = TIMBRE_DEFAULT;
  uint16_t note_position = 0;
  float (* notes_pointer)[][2];
 -uint8_t notes_length;
 +uint8_t notes_count;
  bool notes_repeat;
  float notes_rest;
  bool note_resting = false;
@@@ -257,8 -255,7 +257,8 @@@ ISR(TIMER3_COMPA_vect) 
                      place = 0.0;
                  }
                  ICR3 = (int)(((double)F_CPU) / (frequencies[voice_place] * CPU_PRESCALER)); // Set max to the period
 -                OCR3A = (int)(((double)F_CPU) / (frequencies[voice_place] * CPU_PRESCALER)) >> 1 * duty_place; // Set compare to half the period
 +                OCR3A = (int)((((double)F_CPU) /(frequencies[voice_place] * CPU_PRESCALER)) * note_timbre); // Set compare to half the period
 +                //OCR3A = (int)(((double)F_CPU) / (frequencies[voice_place] * CPU_PRESCALER)) >> 1 * duty_place; // Set compare to half the period
                  place++;
                  // if (duty_counter > (frequencies[voice_place] / 500)) {
                  //     duty_place = (duty_place % 3) + 1;
          #else
              if (note_frequency > 0) {
                  ICR3 = (int)(((double)F_CPU) / (note_frequency * CPU_PRESCALER)); // Set max to the period
 -                OCR3A = (int)(((double)F_CPU) / (note_frequency * CPU_PRESCALER)) >> 1; // Set compare to half the period
 +                OCR3A = (int)((((double)F_CPU) / (note_frequency * CPU_PRESCALER)) * note_timbre); // Set compare to half the period
              } else {
                  ICR3 = 0;
                  OCR3A = 0;
              end_of_note = (note_position >= (note_length * 0x7FF));
          if (end_of_note) {
              current_note++;
 -            if (current_note >= notes_length) {
 +            if (current_note >= notes_count) {
                  if (notes_repeat) {
                      current_note = 0;
                  } else {
                  note_resting = false;
                  #ifdef PWM_AUDIO
                      note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
 -                    note_length = (*notes_pointer)[current_note][1];
 +                    note_length = (*notes_pointer)[current_note][1] * (note_tempo / 100);
                  #else
                      note_frequency = (*notes_pointer)[current_note][0];
 -                    note_length = (*notes_pointer)[current_note][1] / 4;
 +                    note_length = ((*notes_pointer)[current_note][1] / 4) * (note_tempo / 100);
                  #endif
              }
              note_position = 0;
      }
  }
  
 -void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat, float n_rest) {
 +void play_notes(float (*np)[][2], uint8_t n_count, 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_count = n_count;
      notes_repeat = n_repeat;
      notes_rest = n_rest;
  
      current_note = 0;
      #ifdef PWM_AUDIO
          note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
 -        note_length = (*notes_pointer)[current_note][1];
 +        note_length = (*notes_pointer)[current_note][1] * (note_tempo / 100);
      #else
          note_frequency = (*notes_pointer)[current_note][0];
 -        note_length = (*notes_pointer)[current_note][1] / 4;
 +        note_length = ((*notes_pointer)[current_note][1] / 4) * (note_tempo / 100);
      #endif
      note_position = 0;
  
          TIMSK3 |= _BV(OCIE3A);
          TCCR3A |= _BV(COM3A1);
      #endif
+     notes = true;
  }
  
  }
@@@ -407,7 -405,6 +408,6 @@@ if (audio_config.enable && voices < 8) 
  
      if (notes)
          stop_all_notes();
-     note = true;
      #ifdef PWM_AUDIO
          freq = freq / SAMPLE_RATE;
      #endif
          TCCR3A |= _BV(COM3A1);
      #endif
  
+     note = true;
  }
  
 -}
 +}
 +
 +void set_timbre(float timbre)
 +{
 +      note_timbre = timbre;
 +}
 +
 +void set_tempo(float tempo)
 +{
 +      note_tempo = tempo;
 +}
 +
 +void decrease_tempo(uint8_t tempo_change)
 +{
 +      note_tempo += (float) tempo_change;
 +}
 +
 +void increase_tempo(uint8_t tempo_change)
 +{
 +      if (note_tempo - (float) tempo_change < 10)
 +              {
 +                      note_tempo = 10;
 +              }
 +      else
 +              {
 +              note_tempo -= (float) tempo_change;
 +              }
 +}
 +
diff --combined quantum/audio.h
index 8012aa6bf19694f76bea225ade645257da0fe0e2,e1bc23ffed35fc25fe3b70e8615783aa37848b88..3aba8370ac7f85792b755ca58a45109437d54dbd
@@@ -24,13 -24,15 +24,19 @@@ void play_note(double freq, int vol)
  void stop_note(double freq);
  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);
 +void play_notes(float (*np)[][2], uint8_t n_count, bool n_repeat, float n_rest);
  
 +void set_timbre(float timbre);
 +void set_tempo(float tempo);
 +void increase_tempo(uint8_t tempo_change);
 +void decrease_tempo(uint8_t tempo_change);
  
+ #define SCALE (int []){ 0 + (12*0), 2 + (12*0), 4 + (12*0), 5 + (12*0), 7 + (12*0), 9 + (12*0), 11 + (12*0), \
+                                               0 + (12*1), 2 + (12*1), 4 + (12*1), 5 + (12*1), 7 + (12*1), 9 + (12*1), 11 + (12*1), \
+                                               0 + (12*2), 2 + (12*2), 4 + (12*2), 5 + (12*2), 7 + (12*2), 9 + (12*2), 11 + (12*2), \
+                                               0 + (12*3), 2 + (12*3), 4 + (12*3), 5 + (12*3), 7 + (12*3), 9 + (12*3), 11 + (12*3), \
+                                               0 + (12*4), 2 + (12*4), 4 + (12*4), 5 + (12*4), 7 + (12*4), 9 + (12*4), 11 + (12*4), }
  // 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.
diff --combined quantum/keymap_common.c
index ce1d007f3a5f411ec890ffd90f29dab6eaf4b1fa,d38e6fdb20210c064e0aba2b33580d3ca89b7cd5..c705b7a730c87aae70a01b9331c7ea28947eac68
@@@ -26,7 -26,6 +26,7 @@@ along with this program.  If not, see <
  #include "backlight.h"
  #include "keymap_midi.h"
  #include "bootloader.h"
 +#include "eeconfig.h"
  
  extern keymap_config_t keymap_config;
  
  #include <inttypes.h>
  #ifdef AUDIO_ENABLE
      #include "audio.h"
-     float goodbye[][2] = {
-         {440.0*pow(2.0,(31)/12.0), 8},
-         {440.0*pow(2.0,(24)/12.0), 8},
-         {440.0*pow(2.0,(19)/12.0), 12},
-     };
+     #ifndef TONE_GOODBYE
+     #define TONE_GOODBYE { \
+         {440.0*pow(2.0,(31)/12.0), 8}, \
+         {440.0*pow(2.0,(24)/12.0), 8}, \
+         {440.0*pow(2.0,(19)/12.0), 12}, \
+     } 
+     #endif
+     float tone_goodbye[][2] = TONE_GOODBYE;
  #endif
  
  static action_t keycode_to_action(uint16_t keycode);
@@@ -190,7 -191,7 +192,7 @@@ static action_t keycode_to_action(uint1
          case RESET: ; // RESET is 0x5000, which is why this is here
              clear_keyboard();
              #ifdef AUDIO_ENABLE
-                 PLAY_NOTE_ARRAY(goodbye, false, 0);
+                 PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
              #endif
              _delay_ms(250);
              #ifdef ATREUS_ASTAR