project-kyoku/timeline.cpp

68 lines
1.5 KiB
C++

#include "timeline.h"
#include "note.h"
Timeline::Timeline()
{
// BPM of METEOR is 170.
// Length is 1:14
// I calculated that the time between beats is about 1412162 microseconds
microsec starting_beat_offset = 372162;
int amount_of_beats = 209;
microsec time_between_beats = 1412162;
microsec note_input_offset = 412162;
microsec interval = starting_beat_offset + (time_between_beats * amount_of_beats);
Note::resetPrecisionQualifier(note_input_offset / 2);
while (interval > 0)
{
_timeline.emplace_back(new Note(interval, note_input_offset));
interval -= time_between_beats;
}
_active_note = nullptr;
_top_note = _timeline.begin();
}
Timeline::~Timeline()
{
for (auto note : _timeline)
delete note;
_timeline.clear();
_top_note = _timeline.end();
_active_note = nullptr;
Note::resetPrecisionQualifier();
}
void Timeline::update(const microsec &microseconds)
{
checkCurrentActiveNote(microseconds);
checkForNextActiveNote(microseconds);
}
void Timeline::checkCurrentActiveNote(const microsec &microseconds)
{
if (_active_note && !_active_note->isActive(microseconds))
{
_active_note = nullptr;
++_top_note;
}
}
void Timeline::checkForNextActiveNote(const microsec &microseconds)
{
if (!_active_note && (*_top_note)->isActive(microseconds))
{
_active_note = *_top_note;
}
}
const Note* Timeline::fetchActiveNote(const microsec &microseconds) noexcept
{
update(microseconds);
return _active_note;
}