62 constexpr explicit operator bool() const noexcept {
75template <std::
size_t MaxTracks = 16, std::
size_t MaxSteps = 64>
class TriggerGrid {
76 static_assert(MaxTracks > 0);
77 static_assert(MaxSteps > 0);
78 static_assert(MaxSteps <= static_cast<std::size_t>(std::numeric_limits<std::int64_t>::max()));
79 static_assert(MaxTracks <= std::numeric_limits<std::size_t>::max() / MaxSteps);
97 const auto maximum_tick = std::numeric_limits<std::int64_t>::max();
99 static_cast<std::int64_t
>(last_step))
105 for (
auto&
cell : cells_)
117 return track_count_ * step_count_;
120 return step_duration_;
124 return {-step_duration_.value / 2};
127 return {(step_duration_.value - 1) / 2};
132 if (!contains(track, step))
134 if (
cell.velocity == 0 ||
cell.velocity > 127)
136 if (
cell.probability.denominator == 0 ||
137 cell.probability.numerator >
cell.probability.denominator)
141 cells_[index_of(track, step)] =
cell;
145 constexpr const TriggerCell*
cell(std::size_t track, std::size_t step)
const noexcept {
146 return contains(track, step) ? &cells_[index_of(track, step)] :
nullptr;
150 for (
auto&
cell : cells_)
161 std::span<const std::uint64_t> probability_draws,
162 std::span<TriggerEvent> output)
const noexcept {
163 if (track_count_ == 0)
165 if (window_end < window_begin)
170 std::size_t event_count = 0;
171 for (std::size_t step = 0; step < step_count_; ++step) {
172 for (std::size_t track = 0; track < track_count_; ++track) {
173 const auto coordinate = step * track_count_ + track;
174 const auto& authored = cells_[index_of(track, step)];
175 const auto position = position_at(cycle_start, step, authored.microtiming);
176 if (authored.enabled &&
177 selects(authored.probability, probability_draws[coordinate]) &&
178 position >= window_begin && position < window_end)
182 if (event_count > output.size())
185 std::size_t output_index = 0;
186 for (std::size_t step = 0; step < step_count_; ++step) {
187 for (std::size_t track = 0; track < track_count_; ++track) {
188 const auto coordinate = step * track_count_ + track;
189 const auto& authored = cells_[index_of(track, step)];
190 const auto position = position_at(cycle_start, step, authored.microtiming);
191 if (authored.enabled &&
192 selects(authored.probability, probability_draws[coordinate]) &&
193 position >= window_begin && position < window_end) {
194 output[output_index++] = {position, track, step, authored.velocity};
202 constexpr bool contains(std::size_t track, std::size_t step)
const noexcept {
203 return track < track_count_ && step < step_count_;
206 static constexpr bool selects(TriggerProbability probability, std::uint64_t draw)
noexcept {
207 if (probability.numerator == 0)
209 if (probability.numerator == probability.denominator)
214 constexpr std::size_t index_of(std::size_t track, std::size_t step)
const noexcept {
215 return track * MaxSteps + step;
218 constexpr TickPosition position_at(TickPosition cycle_start, std::size_t step,
219 TickDuration microtiming)
const noexcept {
223 static_cast<std::int64_t
>(step) * step_duration_.value + microtiming.value;
227 std::array<TriggerCell, maximum_events> cells_{};
228 std::size_t track_count_ = 0;
229 std::size_t step_count_ = 0;
230 TickDuration step_duration_{};
Fixed-capacity authored trigger data with allocation-free tick projection.
Definition trigger_grid.hpp:75
constexpr TickDuration maximum_microtiming() const noexcept
Definition trigger_grid.hpp:126
static constexpr std::size_t maximum_tracks
Definition trigger_grid.hpp:82
constexpr std::size_t track_count() const noexcept
Definition trigger_grid.hpp:110
constexpr TickDuration minimum_microtiming() const noexcept
Definition trigger_grid.hpp:123
constexpr std::size_t step_count() const noexcept
Definition trigger_grid.hpp:113
constexpr std::size_t coordinate_count() const noexcept
Definition trigger_grid.hpp:116
constexpr const TriggerCell * cell(std::size_t track, std::size_t step) const noexcept
Definition trigger_grid.hpp:145
constexpr TriggerGridError configure(std::size_t track_count, std::size_t step_count, TickDuration step_duration) noexcept
Definition trigger_grid.hpp:86
constexpr void clear() noexcept
Definition trigger_grid.hpp:149
static constexpr std::size_t maximum_events
Definition trigger_grid.hpp:84
constexpr TickDuration step_duration() const noexcept
Definition trigger_grid.hpp:119
constexpr TriggerProjectionResult project_window(TickPosition cycle_start, TickPosition window_begin, TickPosition window_end, std::span< const std::uint64_t > probability_draws, std::span< TriggerEvent > output) const noexcept
Projects this cycle into [window_begin, window_end) without allocation.
Definition trigger_grid.hpp:160
constexpr TriggerGridError set_cell(std::size_t track, std::size_t step, TriggerCell cell) noexcept
Definition trigger_grid.hpp:130
static constexpr std::size_t maximum_steps
Definition trigger_grid.hpp:83
constexpr std::int64_t saturating_add(std::int64_t lhs, std::int64_t rhs) noexcept
Definition tick.hpp:11
constexpr std::uint64_t multiply_high(std::uint64_t lhs, std::uint64_t rhs) noexcept
Definition coordinate_random.hpp:31
Definition beat_division.hpp:11
TriggerGridError
Definition trigger_grid.hpp:42
@ PatternSpanOutOfRange
Definition trigger_grid.hpp:48
@ DrawCountMismatch
Definition trigger_grid.hpp:54
@ InvalidMicrotiming
Definition trigger_grid.hpp:52
@ InvalidDimensions
Definition trigger_grid.hpp:45
@ NotConfigured
Definition trigger_grid.hpp:44
@ IndexOutOfRange
Definition trigger_grid.hpp:49
@ None
Definition trigger_grid.hpp:43
@ InvalidWindow
Definition trigger_grid.hpp:53
@ InvalidProbability
Definition trigger_grid.hpp:51
@ InvalidStepDuration
Definition trigger_grid.hpp:47
@ InvalidVelocity
Definition trigger_grid.hpp:50
@ OutputTooSmall
Definition trigger_grid.hpp:55
@ CapacityExceeded
Definition trigger_grid.hpp:46
@ InvalidWindow
Definition ratchet.hpp:19
@ CapacityExceeded
Definition ratchet.hpp:17
@ None
Definition grid_projection.hpp:97
@ OutputTooSmall
Definition grid_projection.hpp:104
The authored data at one track and step coordinate.
Definition trigger_grid.hpp:26
bool enabled
Definition trigger_grid.hpp:27
std::uint8_t velocity
Definition trigger_grid.hpp:28
TriggerProbability probability
Definition trigger_grid.hpp:29
constexpr auto operator<=>(const TriggerCell &) const =default
TickDuration microtiming
Definition trigger_grid.hpp:30
Definition trigger_grid.hpp:34
std::size_t step
Definition trigger_grid.hpp:37
TickPosition position
Definition trigger_grid.hpp:35
std::size_t track
Definition trigger_grid.hpp:36
constexpr auto operator<=>(const TriggerEvent &) const =default
std::uint8_t velocity
Definition trigger_grid.hpp:38
An exact probability ratio for an authored trigger.
Definition trigger_grid.hpp:19
std::uint64_t denominator
Definition trigger_grid.hpp:21
std::uint64_t numerator
Definition trigger_grid.hpp:20
constexpr auto operator<=>(const TriggerProbability &) const =default
Definition trigger_grid.hpp:58
std::size_t event_count
Definition trigger_grid.hpp:60
TriggerGridError error
Definition trigger_grid.hpp:59