#pragma once #include "tools/music.h" #include #include class BPMCalculator { public: explicit BPMCalculator(const std::shared_ptr& music); void setMusic(const std::shared_ptr& music); std::shared_ptr music() const; void start(); void stop(); void click(); float fetchCurrentBPMApproximation(); microsec getStartingOffset() const; void setStartingOffset(microsec offset); void moveStartingOffsetBy(microsec shift); microsec fetchTimeUntilNextBeat(); microsec fetchBeatInterval(); private: bool _need_recalculate; bool _calculating; std::shared_ptr _music; std::vector _deltas; microsec _previous_click_offset; microsec _first_click_offset; int _approximated_bpm; inline float calculateBPM(microsec all_microseconds, std::size_t beats_amount) const; inline void reset(); };