beat and timers are structures that allow for the creation of reoccuring periodic, time-based events.

Beat

void beat_event(uint8_t beat_id, uint16_t beat_counter)

void init(const uint8_t beat_id)
void set_bpm(const float beats_per_minute)
void pause()
void start()
void resume()
bool is_running()
void reset()
void set_callback(const Callback_2_UI8_UI16& callback)
  • beat_event :: beat event callback invoked on every beat event.
  • set_callback :: set custom callback to a function with the signature void my_beat_callback_fucntion(const uint8_t beat_id, const uint16_t beat_counter).

Timer

void   timer_event(Timer* timer)

Timer* timer_create(uint8_t timer_id)
void   timer_delete(Timer* timer)
void   timer_resume(Timer* timer)
void   timer_pause(Timer* timer)
void   timer_set_overflow(Timer* timer, uint32_t duration_us)
  • timer_event :: beat event callback invoked on every beat event.
  • timer_create :: creates a timer. timer_id must align with available hardware timer.

Example BeatAndTimer

/**
 * this example demonstrates how to use beat and timer.
*/

#include "Arduino.h"
#include "System.h"
#include "Console.h"
#include "Beat.h"
#include "Timer.h"

uint8_t counter = 0;

Beat   beat_timer;
Timer* timer;

void setup() {
    system_init();

    timer = timer_create(13);
    timer_resume(timer);
    timer_set_overflow(timer, 1000000 / 10);

    beat_timer.init(7);
    beat_timer.set_bpm(60);
    beat_timer.start();
}

void loop() {
    counter++;
    if (counter == 16) {
        beat_timer.pause();
        console_println("pausing beat");
    }
    if (counter == 32) {
        beat_timer.resume();
        counter = 0;
        console_println("resuming beat");
    }

    console_println("%02i loop", counter);
    delay(500);
}

void beat_event(const uint8_t beat_id, const uint16_t beat_counter) {
    console_println("beat: ID %i, counter %03i", beat_id, beat_counter);
}

void timer_event(Timer* timer) {
    console_println("timer: ID %i", timer->timer_id);
}