You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
project-kyoku/src/tools/bpmcalculator.cpp

60 lines
1.4 KiB
C++

#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)
{
_deltas.clear();
_previous_click_offset = 0;
_music = music;
}
std::shared_ptr<Music> BPMCalculator::music() const
{
return _music;
}
void BPMCalculator::start()
{
_deltas.clear();
_previous_click_offset = 0;
}
void BPMCalculator::click()
{
const microsec click_offset = _music->fetchOffset();
std::cout << click_offset << "\n\n\n\n";
if (_previous_click_offset == 0)
{
_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);
std::cout << "S: " << sum << " _deltas.size(): " << _deltas.size();
std::cout << "\n " << (static_cast<float>(sum) / static_cast<float>(_deltas.size())) << '\n';
return (sum == 0 || _deltas.size() < 8)
? 0.
: static_cast<int>(static_cast<float>(MICROSECONDS_IN_MINUTE) / (static_cast<float>(sum) / static_cast<float>(_deltas.size())));
}