14 return sample_rate > 0.0 && std::isfinite(sample_rate);
18 return tempo_bpm > 0.0 && std::isfinite(tempo_bpm);
22 return grid_beats > 0.0 && std::isfinite(grid_beats);
26 if (numerator <= 0 || denominator <= 0)
28 return static_cast<double>(numerator) * (4.0 /
static_cast<double>(denominator));
31inline double frames_to_beats(
double frames,
double sample_rate,
double tempo_bpm)
noexcept {
32 return (frames / sample_rate) * (tempo_bpm / 60.0);
35inline double beats_to_frames(
double beats,
double sample_rate,
double tempo_bpm)
noexcept {
36 return (beats * 60.0 / tempo_bpm) * sample_rate;
41 return index * grid_beats;
81 ratio.numerator > 0 && ratio.numerator < ratio.denominator;
86constexpr std::int64_t
floor_div(std::int64_t numerator, std::int64_t denominator)
noexcept {
87 const auto quotient = numerator / denominator;
88 const auto remainder = numerator % denominator;
89 return (remainder != 0 && ((numerator < 0) != (denominator < 0))) ? quotient - 1 : quotient;
95constexpr std::int64_t
rounded_scale(std::int64_t value, std::int64_t multiplier,
96 std::int64_t divisor)
noexcept {
97 return (value * multiplier + divisor / 2) / divisor;
105 const auto pivot =
rounded_scale(pair, ratio.numerator, ratio.denominator);
106 return std::clamp<std::int64_t>(pivot, 1, pair - 1);
118 const auto pair = grid.value * 2;
120 auto local = position.value % pair;
127 return {warped - local};
154 const auto pair = grid.value * 2;
156 auto local = position.value % pair;
159 const auto straightened =
constexpr std::int64_t saturating_add(std::int64_t lhs, std::int64_t rhs) noexcept
Definition tick.hpp:11
constexpr std::int64_t floor_div(std::int64_t numerator, std::int64_t denominator) noexcept
Definition quantize.hpp:86
constexpr std::int64_t swing_pivot(std::int64_t pair, SwingRatio ratio) noexcept
Definition quantize.hpp:104
constexpr std::int64_t rounded_scale(std::int64_t value, std::int64_t multiplier, std::int64_t divisor) noexcept
Definition quantize.hpp:95
Definition beat_division.hpp:11
bool valid_grid(double grid_beats) noexcept
Definition quantize.hpp:21
constexpr bool valid_swing_ratio(SwingRatio ratio) noexcept
Definition quantize.hpp:79
constexpr bool valid_swing_grid(TickDuration grid) noexcept
Definition quantize.hpp:72
TickDuration swing_displacement(TickPosition position, TickDuration grid, SwingRatio ratio) noexcept
Definition quantize.hpp:114
bool valid_tempo(double tempo_bpm) noexcept
Definition quantize.hpp:17
TickPosition swing_position(TickPosition position, TickDuration grid, SwingRatio ratio) noexcept
Definition quantize.hpp:140
constexpr double kBoundaryEpsilonBeats
Definition quantize.hpp:11
constexpr SwingRatio kTripletSwing
Definition quantize.hpp:65
constexpr std::int64_t kMaxSwingDenominator
Definition quantize.hpp:70
double beats_per_bar(int numerator, int denominator) noexcept
Definition quantize.hpp:25
double next_grid_boundary(double position_beats, double grid_beats) noexcept
Definition quantize.hpp:39
double beats_to_frames(double beats, double sample_rate, double tempo_bpm) noexcept
Definition quantize.hpp:35
TickPosition unswing_position(TickPosition position, TickDuration grid, SwingRatio ratio) noexcept
Definition quantize.hpp:150
constexpr std::int64_t kMaxSwingGridTicks
Definition quantize.hpp:69
bool valid_sample_rate(double sample_rate) noexcept
Definition quantize.hpp:13
double frames_to_beats(double frames, double sample_rate, double tempo_bpm) noexcept
Definition quantize.hpp:31
constexpr SwingRatio kStraightSwing
Definition quantize.hpp:61
Definition quantize.hpp:53
std::int64_t numerator
Definition quantize.hpp:54
std::int64_t denominator
Definition quantize.hpp:55
constexpr auto operator<=>(const SwingRatio &) const =default