#include #include "classicactions.h" #include "classictimeline.h" #include "classicnote.h" ClassicTimeline::ClassicTimeline() { // BPM of METEOR is 170. // Length is 1:14 // I calculated that the time between beats is about 1412162 microseconds std::string song_filename = "/home/naiji/METEOR.flac"; _music.openFromFile(song_filename); _music.play(); _music.setVolume(30); _timeline.reserve(1000); microsec starting_beat_offset = 372162; int amount_of_beats = 209; microsec interval = 1412162; microsec note_input_offset = 412162; microsec bpm_iterator = starting_beat_offset; microsec bpm_end = starting_beat_offset + (interval * amount_of_beats); _visibility_offset = note_input_offset * 12; _timeline.emplace_back(new ClassicNote({note_input_offset}, bpm_iterator, Action::PRESS_DOWN)); bpm_iterator += interval; _timeline.emplace_back(new ClassicNote({note_input_offset}, bpm_iterator, Action::PRESS_LEFT)); bpm_iterator += interval; _timeline.emplace_back(new ClassicNote({note_input_offset}, bpm_iterator, Action::PRESS_LEFT)); bpm_iterator += interval; while (bpm_iterator < bpm_end) { _timeline.emplace_back(new ClassicNote({note_input_offset}, bpm_iterator, Action::PRESS_UP)); bpm_iterator += interval; } expire(_active_note); _top_note = _timeline.begin(); _last_visible_note = _top_note; } ClassicTimeline::~ClassicTimeline() { clear(); } void ClassicTimeline::clear() { for (auto note : _timeline) delete note; _timeline.clear(); expire(_top_note); expire(_last_visible_note); expire(_active_note); } void ClassicTimeline::update() { const auto& offset = currentMusicOffset(); std::cout << "Upadting at: " << offset << '\n'; checkCurrentActiveNote(offset); checkForNextActiveNote(offset); } void ClassicTimeline::checkCurrentActiveNote(const microsec &music_offset) { if (!isExpired(_active_note) && !(*_active_note)->isActive(music_offset)) { expire(_active_note); ++_top_note; } } void ClassicTimeline::checkForNextActiveNote(const microsec &music_offset) { if (isExpired(_active_note) && (*_top_note)->isActive(music_offset)) { std::cout << "New active note: " << music_offset << '\n'; _active_note = _top_note; } } ClassicTimeline::Iterator ClassicTimeline::getActiveNote() noexcept { update(); return _active_note; } bool ClassicTimeline::isExpired(const Iterator &iterator) { return iterator == _timeline.end(); } void ClassicTimeline::expire(Iterator &iterator) { iterator = _timeline.end(); } microsec ClassicTimeline::currentMusicOffset() const { return _music.getPlayingOffset().asMicroseconds(); } void ClassicTimeline::fetchVisibleNotes(const std::unique_ptr& view_manager) { Iterator note_iterator = _top_note; auto music_offset = currentMusicOffset(); while (((*note_iterator)->offset() - _visibility_offset) <= music_offset) { ++note_iterator; if (note_iterator > _last_visible_note) (void) view_manager;//_view_manager->initNoteGraphics((*note_iterator)); } _last_visible_note = note_iterator; }