breaking changes - restructuring audio.c a little

example_keyboards
Jack Humbert 9 years ago
parent a2ee277158
commit 462601f5e8

@ -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);
}

@ -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()

@ -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()
{
}
//------------------------------------------------------------------------------

@ -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), \

Loading…
Cancel
Save