2022-03-16 02:10:18 +01:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <compare>
|
|
|
|
#include <ostream>
|
|
|
|
#include <sstream>
|
|
|
|
#include <utility>
|
|
|
|
#include <variant>
|
|
|
|
|
2022-03-31 03:50:15 +02:00
|
|
|
#include <json.hpp>
|
|
|
|
|
2022-03-16 02:10:18 +01:00
|
|
|
#include "special_numeric_types.hpp"
|
|
|
|
#include "variant_visitor.hpp"
|
|
|
|
|
|
|
|
namespace better {
|
|
|
|
/*
|
|
|
|
A specific square on the controller. (0, 0) is the top-left button, x
|
|
|
|
goes right, y goes down.
|
|
|
|
x →
|
|
|
|
0 1 2 3
|
|
|
|
y 0 □ □ □ □
|
|
|
|
↓ 1 □ □ □ □
|
2022-03-17 02:50:30 +01:00
|
|
|
2 □ □ □ □
|
|
|
|
3 □ □ □ □
|
2022-03-16 02:10:18 +01:00
|
|
|
*/
|
|
|
|
class Position {
|
|
|
|
public:
|
2022-04-03 15:59:05 +02:00
|
|
|
explicit Position(std::uint64_t index);
|
|
|
|
Position(std::uint64_t x, std::uint64_t y);
|
2022-03-16 02:10:18 +01:00
|
|
|
|
2022-04-03 15:59:05 +02:00
|
|
|
std::uint64_t index() const;
|
|
|
|
std::uint64_t get_x() const;
|
|
|
|
std::uint64_t get_y() const;
|
2022-03-16 02:10:18 +01:00
|
|
|
|
|
|
|
auto operator<=>(const Position&) const = default;
|
|
|
|
|
|
|
|
private:
|
2022-04-03 15:59:05 +02:00
|
|
|
std::uint64_t x;
|
|
|
|
std::uint64_t y;
|
2022-03-16 02:10:18 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
std::ostream& operator<<(std::ostream& out, const Position& pos);
|
|
|
|
|
|
|
|
class TapNote {
|
|
|
|
public:
|
|
|
|
TapNote(Fraction time, Position position);
|
|
|
|
Fraction get_time() const;
|
|
|
|
Position get_position() const;
|
2022-03-23 02:20:07 +01:00
|
|
|
|
|
|
|
bool operator==(const TapNote&) const = default;
|
|
|
|
|
2022-04-02 04:10:09 +02:00
|
|
|
nlohmann::ordered_json dump_to_memon_1_0_0() const;
|
2022-03-16 02:10:18 +01:00
|
|
|
private:
|
|
|
|
Fraction time;
|
|
|
|
Position position;
|
|
|
|
};
|
|
|
|
|
|
|
|
class LongNote {
|
|
|
|
public:
|
|
|
|
LongNote(Fraction time, Position position, Fraction duration, Position tail_tip);
|
2022-03-17 02:50:30 +01:00
|
|
|
|
2022-03-16 02:10:18 +01:00
|
|
|
Fraction get_time() const;
|
|
|
|
Position get_position() const;
|
|
|
|
Fraction get_end() const;
|
|
|
|
Fraction get_duration() const;
|
|
|
|
Position get_tail_tip() const;
|
2022-04-03 15:59:05 +02:00
|
|
|
std::uint64_t get_tail_length() const;
|
|
|
|
std::uint64_t get_tail_angle() const;
|
2022-03-23 02:20:07 +01:00
|
|
|
|
|
|
|
bool operator==(const LongNote&) const = default;
|
2022-03-31 03:50:15 +02:00
|
|
|
|
2022-04-02 04:10:09 +02:00
|
|
|
nlohmann::ordered_json dump_to_memon_1_0_0() const;
|
2022-03-31 03:50:15 +02:00
|
|
|
int tail_as_6_notation() const;
|
2022-03-16 02:10:18 +01:00
|
|
|
private:
|
|
|
|
Fraction time;
|
|
|
|
Position position;
|
|
|
|
Fraction duration;
|
|
|
|
Position tail_tip;
|
|
|
|
};
|
|
|
|
|
2022-04-03 15:59:05 +02:00
|
|
|
Position convert_legacy_memon_tail_index_to_position(const Position& pos, std::uint64_t tail_index);
|
|
|
|
Position convert_6_notation_to_position(const Position& pos, std::uint64_t tail_index);
|
2022-04-02 04:10:09 +02:00
|
|
|
|
2022-03-16 02:10:18 +01:00
|
|
|
class Note {
|
|
|
|
public:
|
|
|
|
template<typename ...Ts>
|
|
|
|
Note(Ts&&... Args) : note(std::forward<Ts...>(Args...)) {};
|
2022-03-23 02:20:07 +01:00
|
|
|
Fraction get_time() const;
|
2022-03-16 02:10:18 +01:00
|
|
|
std::pair<Fraction, Fraction> get_time_bounds() const;
|
|
|
|
Position get_position() const;
|
|
|
|
Fraction get_end() const;
|
2022-03-23 02:20:07 +01:00
|
|
|
|
|
|
|
template<typename T>
|
2022-03-27 03:32:13 +02:00
|
|
|
auto visit(T& visitor) const {return std::visit(visitor, this->note);};
|
2022-03-23 02:20:07 +01:00
|
|
|
|
|
|
|
bool operator==(const Note&) const = default;
|
2022-03-31 03:50:15 +02:00
|
|
|
|
2022-04-02 04:10:09 +02:00
|
|
|
nlohmann::ordered_json dump_to_memon_1_0_0() const;
|
|
|
|
|
2022-04-03 15:59:05 +02:00
|
|
|
static Note load_from_memon_0_1_0(
|
|
|
|
const nlohmann::json& json,
|
|
|
|
std::uint64_t resolution
|
|
|
|
);
|
|
|
|
|
2022-04-02 04:10:09 +02:00
|
|
|
static Note load_from_memon_legacy(
|
|
|
|
const nlohmann::json& json,
|
2022-04-03 15:59:05 +02:00
|
|
|
std::uint64_t resolution
|
2022-04-02 04:10:09 +02:00
|
|
|
);
|
2022-03-16 02:10:18 +01:00
|
|
|
private:
|
|
|
|
std::variant<TapNote, LongNote> note;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|