~ruther/qmk_firmware

462601f5e8de3476963c6fef44a88653e19fc3fd — Jack Humbert 9 years ago a2ee277
breaking changes - restructuring audio.c a little
M keyboard/planck/keymaps/default/keymap.c => keyboard/planck/keymaps/default/keymap.c +12 -12
@@ 145,7 145,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, LOWER,   XXXXXXX, XXXXXXX, RAISE,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}
},

/* Plover layer (http://openstenoproject.org)
/* Plover layer (http://opensteno.org)
 * ,-----------------------------------------------------------------------------------.
 * |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |
 * |------+------+------+------+------+-------------+------+------+------+------+------|


@@ 225,16 225,10 @@ float tone_dvorak[][2] = {
  {440.0*pow(2.0,(31)/12.0), 8}
};

float tone_music[][2] = {
  {440.0*pow(2.0,(12)/12.0), 8},
  {440.0*pow(2.0,(14)/12.0), 8},
  {440.0*pow(2.0,(16)/12.0), 8},
  {440.0*pow(2.0,(17)/12.0), 8},
  {440.0*pow(2.0,(19)/12.0), 8},
  {440.0*pow(2.0,(21)/12.0), 8},
  {440.0*pow(2.0,(23)/12.0), 8},
  {440.0*pow(2.0,(24)/12.0), 8}
};

float music_scale[][2] = SONG(MUSIC_SCALE_SOUND);
float goodbye[][2] = SONG(GOODBYE_SOUND);

#endif




@@ 324,7 318,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_NOTE_ARRAY(tone_music, false, 0);
              PLAY_NOTE_ARRAY(music_scale, false, 0);
              layer_on(_MUSIC);
            #endif
          }


@@ 374,3 368,9 @@ void matrix_init_user(void) {
    PLAY_NOTE_ARRAY(tone_startup, false, 0);
  #endif
}

void play_goodbye_tone()
{
  PLAY_NOTE_ARRAY(goodbye, false, 0);
  _delay_ms(150);
}

M keyboard/preonic/keymaps/default/keymap.c => keyboard/preonic/keymaps/default/keymap.c +19 -18
@@ 15,7 15,7 @@
#define _LOWER 3
#define _RAISE 4
#define _MUSIC 5
#define _ADJUST 6
#define _ADJUST 16

// Macro name shortcuts
#define QWERTY M(_QWERTY)


@@ 142,6 142,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
},

/* Music (reserved for process_action_user)
 *
 */
[_MUSIC] = {
  {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
  {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
  {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
  {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
  {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, LOWER,   XXXXXXX, XXXXXXX, RAISE,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}
},

/* Adjust (Lower + Raise)
 * ,-----------------------------------------------------------------------------------.
 * |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |


@@ 161,19 172,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  {_______, _______, _______, AUD_ON,  AUD_OFF, AG_NORM, AG_SWAP,  QWERTY, COLEMAK, DVORAK,  _______, _______},
  {_______, _______, _______, MUS_ON,  MUS_OFF, _______, _______, _______, _______, _______, _______, _______},
  {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
},

/* Music (reserved for process_action_user)
 *
 */
[_MUSIC] = {
  {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
  {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
  {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
  {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
  {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, LOWER,   XXXXXXX, XXXXXXX, RAISE,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}
}


};

const uint16_t PROGMEM fn_actions[] = {


@@ 315,7 316,6 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
        case 9:
          if (record->event.pressed) {
            #ifdef AUDIO_ENABLE
              init_notes();
              PLAY_NOTE_ARRAY(music_scale, false, 0);
              layer_on(_MUSIC);
            #endif


@@ 341,11 341,12 @@ void process_action_user(keyrecord_t *record) {
}

void matrix_init_user(void) {
  #ifdef AUDIO_ENABLE
    init_notes();
    _delay_ms(10);
    PLAY_NOTE_ARRAY(start_up, false, 0);
  #endif
  play_startup_tone();
}

void play_startup_tone()
{
  PLAY_NOTE_ARRAY(start_up, false, 0);
}

void play_goodbye_tone()

M quantum/audio.c => quantum/audio.c +63 -45
@@ 74,7 74,9 @@ float vibrato_counter = 0;
float vibrato_strength = .5;
float vibrato_rate = 0.125;

float polyphony_rate = .5;
float polyphony_rate = 0;

bool inited = false;

audio_config_t audio_config;



@@ 170,7 172,49 @@ void increase_tempo(uint8_t tempo_change) {
    }
}

void audio_init() {

    /* check signature */
    if (!eeconfig_is_enabled()) {
        eeconfig_init();
    }
    audio_config.raw = eeconfig_read_audio();

    #ifdef PWM_AUDIO
        PLLFRQ = _BV(PDIV2);
        PLLCSR = _BV(PLLE);
        while(!(PLLCSR & _BV(PLOCK)));
        PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */

        /* Init a fast PWM on Timer4 */
        TCCR4A = _BV(COM4A0) | _BV(PWM4A); /* Clear OC4A on Compare Match */
        TCCR4B = _BV(CS40); /* No prescaling => f = PCK/256 = 187500Hz */
        OCR4A = 0;

        /* Enable the OC4A output */
        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
    #else
        DDRC |= _BV(PORTC6);

        TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs

        TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
        TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30);
    #endif

    inited = true;
}

void stop_all_notes() {
    if (!inited) {
        audio_init();
    }
    voices = 0;
    #ifdef PWM_AUDIO
        TIMSK3 &= ~_BV(OCIE3A);


@@ 191,7 235,9 @@ void stop_all_notes() {

void stop_note(double freq) {
    if (note) {
        cli();
        if (!inited) {
            audio_init();
        }
        #ifdef PWM_AUDIO
            freq = freq / SAMPLE_RATE;
        #endif


@@ 225,47 271,9 @@ void stop_note(double freq) {
            volume = 0;
            note = false;
        }
        sei();
    }
}

void init_notes() {

    /* check signature */
    if (!eeconfig_is_enabled()) {
        eeconfig_init();
    }
    audio_config.raw = eeconfig_read_audio();

    #ifdef PWM_AUDIO
        PLLFRQ = _BV(PDIV2);
        PLLCSR = _BV(PLLE);
        while(!(PLLCSR & _BV(PLOCK)));
        PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */

        /* Init a fast PWM on Timer4 */
        TCCR4A = _BV(COM4A0) | _BV(PWM4A); /* Clear OC4A on Compare Match */
        TCCR4B = _BV(CS40); /* No prescaling => f = PCK/256 = 187500Hz */
        OCR4A = 0;

        /* Enable the OC4A output */
        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
    #else
        DDRC |= _BV(PORTC6);

        TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs

        TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
        TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30);
    #endif
}

float mod(float a, int b)
{
    float r = fmod(a, b);


@@ 456,7 464,10 @@ ISR(TIMER3_COMPA_vect) {
void play_notes(float (*np)[][2], uint8_t n_count, bool n_repeat, float n_rest) {

if (audio_config.enable) {
    cli();
    TIMSK3 &= ~_BV(OCIE3A);
    if (!inited) {
        audio_init();
    }
	// Cancel note if a note is playing
    if (note)
        stop_all_notes();


@@ 485,7 496,6 @@ if (audio_config.enable) {
        TIMSK3 |= _BV(OCIE3A);
        TCCR3A |= _BV(COM3A1);
    #endif
    sei();
}

}


@@ 493,7 503,10 @@ if (audio_config.enable) {
void play_sample(uint8_t * s, uint16_t l, bool r) {

if (audio_config.enable) {

    TIMSK3 &= ~_BV(OCIE3A);
    if (!inited) {
        audio_init();
    }
    stop_all_notes();
    place_int = 0;
    sample = s;


@@ 512,7 525,10 @@ if (audio_config.enable) {
void play_note(double freq, int vol) {

if (audio_config.enable && voices < 8) {
    cli();
    TIMSK3 &= ~_BV(OCIE3A);
    if (!inited) {
        audio_init();
    }
    // Cancel notes if notes are playing
    if (notes)
        stop_all_notes();


@@ 532,7 548,6 @@ if (audio_config.enable && voices < 8) {
        TIMSK3 |= _BV(OCIE3A);
        TCCR3A |= _BV(COM3A1);
    #endif
    sei();
}

}


@@ 545,8 560,11 @@ void play_startup_tone()
{
}



__attribute__ ((weak))
void play_goodbye_tone()
{

}
//------------------------------------------------------------------------------

M quantum/audio.h => quantum/audio.h +0 -1
@@ 55,7 55,6 @@ 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);
void init_notes(void);
void play_notes(float (*np)[][2], uint8_t n_count, bool n_repeat, float n_rest);

#define SCALE (int []){ 0 + (12*0), 2 + (12*0), 4 + (12*0), 5 + (12*0), 7 + (12*0), 9 + (12*0), 11 + (12*0), \