2021-08-11 15:00:28 -04:00
|
|
|
#include "tools/bpmcalculator.h"
|
|
|
|
#include <cmath>
|
|
|
|
#include <numeric>
|
|
|
|
#include <iostream>
|
|
|
|
|
|
|
|
constexpr microsec MICROSECONDS_IN_MINUTE = 60000000;
|
|
|
|
|
|
|
|
BPMCalculator::BPMCalculator(const std::shared_ptr<Music>& music) :
|
|
|
|
_music(music),
|
|
|
|
_previous_click_offset(0)
|
|
|
|
{}
|
|
|
|
|
|
|
|
void BPMCalculator::setMusic(const std::shared_ptr<Music>& music)
|
|
|
|
{
|
2021-08-12 15:10:52 -04:00
|
|
|
_deltas.clear();
|
|
|
|
_previous_click_offset = 0;
|
2021-08-11 15:00:28 -04:00
|
|
|
_music = music;
|
|
|
|
}
|
|
|
|
|
2021-08-27 13:40:48 -04:00
|
|
|
void BPMCalculator::start()
|
2021-08-11 15:00:28 -04:00
|
|
|
{
|
|
|
|
_deltas.clear();
|
2021-08-27 13:40:48 -04:00
|
|
|
_previous_click_offset = _music->fetchOffset();
|
2021-08-11 15:00:28 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void BPMCalculator::click()
|
|
|
|
{
|
|
|
|
const microsec click_offset = _music->fetchOffset();
|
|
|
|
|
2021-08-12 15:10:52 -04:00
|
|
|
std::cout << click_offset << "\n\n\n\n";
|
|
|
|
|
2021-08-27 13:40:48 -04:00
|
|
|
if (_deltas.empty())
|
2021-08-11 15:00:28 -04:00
|
|
|
{
|
|
|
|
_previous_click_offset = click_offset;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const microsec delta = click_offset - _previous_click_offset;
|
|
|
|
_deltas.emplace_back(delta);
|
|
|
|
|
|
|
|
_previous_click_offset = click_offset;
|
|
|
|
}
|
|
|
|
|
|
|
|
int BPMCalculator::getCurrentApproximation() const
|
|
|
|
{
|
|
|
|
const microsec sum = std::accumulate(_deltas.begin(), _deltas.end(), 0);
|
|
|
|
|
2021-08-12 15:10:52 -04:00
|
|
|
std::cout << "S: " << sum << " _deltas.size(): " << _deltas.size();
|
|
|
|
std::cout << "\n " << (static_cast<float>(sum) / static_cast<float>(_deltas.size())) << '\n';
|
|
|
|
|
2021-08-11 15:00:28 -04:00
|
|
|
return (sum == 0)
|
|
|
|
? 0.
|
|
|
|
: static_cast<int>(static_cast<float>(MICROSECONDS_IN_MINUTE) / (static_cast<float>(sum) / static_cast<float>(_deltas.size())));
|
|
|
|
}
|