#ifndef BUZZER_H_ #define BUZZER_H_ #include "util.h" #include typedef uint8_t note_t; enum note_t_fields { NOTE_ID_MASK = 0x0F, NOTE_ID_SHIFT = 0, NOTE_VAL_MASK = 0x70, NOTE_VAL_SHIFT = 4, }; enum note_ids { NOTEID_PAUSE = 0, NOTEID_C4, NOTEID_D4, NOTEID_E4, NOTEID_F4, NOTEID_G4, NOTEID_A4, NOTEID_B4, NOTEID_C5, NOTEID_D5, NOTEID_E5, NOTEID_F5, NOTEID_G5, NOTEID_A5, NOTEID_B5, NOTEID_FLAGS, }; enum note_values { NOTEVAL_1_1 = 0, /* 1/1 */ NOTEVAL_1_2, /* 1/2 */ NOTEVAL_1_4, /* 1/4 */ NOTEVAL_1_8, /* 1/8 */ NOTEVAL_1_16, /* 1/16 */ NOTEVAL_1_32, /* 1/32 */ NOTEVAL_1_64, /* 1/64 */ NOTEVAL_UNUSED0, }; #define RESTRIKE_MS 5 enum note_flags_values { NOTEVAL_SHARP = 0, NOTEVAL_DOT, NOTEVAL_TIE, NOTEVAL_OCTAVE_SH_UP, NOTEVAL_OCTAVE_SH_DOWN, NOTEVAL_UNUSED1, NOTEVAL_UNUSED2, NOTEVAL_UNUSED3, }; #define note(id, val) ( \ ((NOTEID_##id << NOTE_ID_SHIFT) & NOTE_ID_MASK) | \ ((NOTEVAL_##val << NOTE_VAL_SHIFT) & NOTE_VAL_MASK) ) #define note_sharp(id, val) note(FLAGS, SHARP), note(id, val) #define n_dot note(FLAGS, DOT) #define n_octave_up note(FLAGS, OCTAVE_SH_UP) #define n_octave_down note(FLAGS, OCTAVE_SH_DOWN) #define n_tie note(FLAGS, TIE) #define n_pause(val) note(PAUSE, val) #define invalid_note 0xFF #define note_array_end invalid_note void buzzer_play(const note_t __flash *notes, uint16_t basespeed_ms, bool loop); void buzzer_stop(void); bool buzzer_is_playing(void); enum buzzer_volume_limits { BUZZER_VOLUME_MIN = 5, BUZZER_VOLUME_DEFAULT = 9, BUZZER_VOLUME_MAX = 15, }; void buzzer_volume_set(int8_t volume); int8_t buzzer_volume_get(void); void buzzer_100hz_tick(void); void buzzer_init(void); #endif /* BUZZER_H_ */