~ruther/qmk_firmware

41cc35425ab32c9a9492006da8b667d01d32dfa6 — Jack Humbert 9 years ago 8f4ce50
rests between notes as an argument
M keyboard/planck/keymaps/default/keymap.c => keyboard/planck/keymaps/default/keymap.c +5 -5
@@ 194,7 194,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
        case _QW:
          if (record->event.pressed) {
            #ifdef AUDIO_ENABLE
              play_notes(&tone_qw, 4, false);
              play_notes(&tone_qw, 4, false, 0);
            #endif
            default_layer_set(1UL<<_QW);
          }


@@ 202,7 202,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
        case _CM:
          if (record->event.pressed) {
            #ifdef AUDIO_ENABLE
              play_notes(&tone_cm, 6, false);
              play_notes(&tone_cm, 6, false, 0);
            #endif
            default_layer_set(1UL<<_CM);
          }


@@ 210,7 210,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
        case _DV:
          if (record->event.pressed) {
            #ifdef AUDIO_ENABLE
              play_notes(&tone_dv, 8, false);
              play_notes(&tone_dv, 8, false, 0);
            #endif
            default_layer_set(1UL<<_DV);
          }


@@ 254,7 254,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
          if (record->event.pressed) {
            #ifdef AUDIO_ENABLE
              audio_on();
              play_notes(&start_up, 5, false);
              play_notes(&start_up, 5, false, 0);
            #endif
          }
        break;


@@ 265,6 265,6 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
void matrix_init_user(void) {
  #ifdef AUDIO_ENABLE
    init_notes();
    play_notes(&start_up, 5, false);
    play_notes(&start_up, 5, false, 0);
  #endif
}

M keyboard/preonic/keymaps/default/keymap.c => keyboard/preonic/keymaps/default/keymap.c +8 -8
@@ 242,7 242,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
        case _QWERTY:
          if (record->event.pressed) {
            #ifdef AUDIO_ENABLE
              play_notes(&tone_qwerty, 4, false);
              play_notes(&tone_qwerty, 4, false, 0);
            #endif
            persistant_default_layer_set(1UL<<_QWERTY);
          }


@@ 250,7 250,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
        case _COLEMAK:
          if (record->event.pressed) {
            #ifdef AUDIO_ENABLE
              play_notes(&tone_colemak, 6, false);
              play_notes(&tone_colemak, 6, false, 1);
            #endif
            persistant_default_layer_set(1UL<<_COLEMAK);
          }


@@ 258,7 258,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
        case _DVORAK:
          if (record->event.pressed) {
            #ifdef AUDIO_ENABLE
              play_notes(&tone_dvorak, 8, false);
              play_notes(&tone_dvorak, 8, false, 10);
            #endif
            persistant_default_layer_set(1UL<<_DVORAK);
          }


@@ 302,7 302,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
          if (record->event.pressed) {
            #ifdef AUDIO_ENABLE
              audio_on();
              play_notes(&start_up, 4, false);
              play_notes(&start_up, 4, false, 0);
            #endif
          }
        break;


@@ 317,7 317,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
        case 9:
          if (record->event.pressed) {
            #ifdef AUDIO_ENABLE
              play_notes(&tone_music, 8, false);
              play_notes(&tone_music, 8, false, 0);
              layer_on(_MUSIC);
            #endif
          }


@@ 333,9 333,9 @@ void process_action_user(keyrecord_t *record) {

  if (IS_LAYER_ON(_MUSIC)) {
    if (record->event.pressed) {
        play_note(((double)261.626)*pow(2.0, -3.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF);
        play_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF);
    } else {
        stop_note(((double)261.626)*pow(2.0, -3.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
        stop_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
    }
  }



@@ 344,6 344,6 @@ void process_action_user(keyrecord_t *record) {
void matrix_init_user(void) {
  #ifdef AUDIO_ENABLE
    init_notes();
    play_notes(&start_up, 4, false);
    play_notes(&start_up, 4, false, 0);
  #endif
}

M quantum/audio.c => quantum/audio.c +21 -8
@@ 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;



@@ 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 && ((int)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,7 344,7 @@ 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) {



@@ 343,6 355,7 @@ if (audio_config.enable) {
    notes_pointer = np;
    notes_length = n_length;
    notes_repeat = n_repeat;
    notes_rest = n_rest;

    place = 0;
    current_note = 0;

M quantum/audio.h => quantum/audio.h +2 -1
@@ 2,6 2,7 @@
#include <stdbool.h>
#include <avr/io.h>
#include <util/delay.h>
#include "musical_notes.h"

typedef union {
    uint8_t raw;


@@ 20,4 21,4 @@ void play_note(double freq, int vol);
void stop_note(double freq);
void stop_all_notes();
void init_notes();
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);

M quantum/keymap_common.c => quantum/keymap_common.c +1 -1
@@ 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);
                play_notes(&goodbye, 3, false, 0);
            #endif
            _delay_ms(250);
            #ifdef ATREUS_ASTAR