26template <
class Config>
31 static_assert(std::is_same_v<typename Config::cell_type, StepCell>,
32 "apply_step_edit is the reference reducer (StepCell only). A "
33 "custom cell type must supply its own reducer with the same "
34 "signature: (Snapshot&, const Command&, EngineSequence&) -> "
35 "optional<AppliedEdit>.");
39 constexpr std::uint8_t P =
static_cast<std::uint8_t
>(Config::patterns);
40 constexpr std::uint8_t L =
static_cast<std::uint8_t
>(Config::lanes);
41 constexpr std::uint8_t S =
static_cast<std::uint8_t
>(Config::steps);
52 if (e.pattern >= P || e.lane >= L || e.step >= S) {
57 snapshot.
patterns[e.pattern].lanes[e.lane][e.step] = e.cell;
68 if (e.pattern >= P || e.lane >= L || e.step >= S) {
84 if (e.pattern >= P || e.lane >= L) {
91 std::uint32_t s = e.seed ? e.seed : 1u;
92 auto next = [&s]() { s ^= s << 13; s ^= s >> 17; s ^= s << 5;
return s; };
96 const std::uint8_t span =
97 static_cast<std::uint8_t
>(1u + e.max_velocity - e.min_velocity);
98 for (std::uint8_t st = 0; st < S; ++st) {
100 const bool on = (next() % 128u) < e.density;
102 c.velocity =
static_cast<std::uint8_t
>(
103 e.min_velocity + (span ? next() % span : 0u));
104 snapshot.
patterns[e.pattern].lanes[e.lane][st] = c;
114 if (e.pattern >= P) {
123 const std::uint8_t len = (e.length == 0 || e.length > S) ? S : e.length;
124 snapshot.
patterns[e.pattern].length = len;
132 if (e.pattern >= P) {
154template <
class Config,
class Reducer>
160 auto echo = reduce(snapshot, *cmd, engine_seq);
166 snapshot.
epoch = ++epoch;
174template <
class Config>
Ownership: the engine (audio) thread is the single reader of the command queue and the single writer ...
Definition sequencer_state_channel.hpp:301
void audio_publish_snapshot(const Snapshot &snapshot) noexcept
Publish the full authoritative snapshot (initial load / preset / bulk / resync).
Definition sequencer_state_channel.hpp:390
std::optional< Command > audio_try_pop_command() noexcept
Pop the next pending edit command to apply. Lock-free, allocation-free.
Definition sequencer_state_channel.hpp:375
void audio_mark_resync_required(Epoch epoch) noexcept
Signal that incremental echoes were lost and the UI must resync to at least epoch.
Definition sequencer_state_channel.hpp:403
bool audio_try_publish_applied(const AppliedEdit &edit) noexcept
Publish an applied echo.
Definition sequencer_state_channel.hpp:384
SequencerStateChannel is the audio-safe transport for a plugin's structured NON-parameter state: the ...
Definition audio_device_manager.hpp:48
@ FullSnapshot
Definition sequencer_state_channel.hpp:149
@ Cell
Definition sequencer_state_channel.hpp:153
@ Lane
Definition sequencer_state_channel.hpp:151
@ Pattern
Definition sequencer_state_channel.hpp:150
AppliedEditT< ReferenceSequencerConfig > AppliedEdit
Definition sequencer_state_channel.hpp:438
@ CommandRejected
Definition sequencer_state_channel.hpp:265
@ PatternLengthChanged
Definition sequencer_state_channel.hpp:263
@ ActivePatternChanged
Definition sequencer_state_channel.hpp:264
@ StepRangeChanged
Definition sequencer_state_channel.hpp:262
void drain_and_apply(SequencerStateChannelT< Config > &channel, SnapshotT< Config > &snapshot, Epoch &epoch, EngineSequence &engine_seq, Reducer &&reduce)
Drain the command FIFO and apply each command with reduce, publishing the echoes.
Definition step_edit_reducer.hpp:155
StepRangeAppliedT< ReferenceSequencerConfig > StepRangeApplied
Definition sequencer_state_channel.hpp:439
std::uint64_t EngineSequence
Definition sequencer_state_channel.hpp:61
std::optional< AppliedEditT< Config > > apply_step_edit(SnapshotT< Config > &snapshot, const StepEditCommandT< Config > &cmd, EngineSequence &engine_seq)
Reference reducer for the StepCell grid. Returns nullopt only for a no-op.
Definition step_edit_reducer.hpp:27
@ SwitchPattern
Definition sequencer_state_channel.hpp:170
@ SetPatternLength
Definition sequencer_state_channel.hpp:169
@ RandomizeLane
Definition sequencer_state_channel.hpp:168
@ SetCell
Definition sequencer_state_channel.hpp:166
@ Clear
Definition sequencer_state_channel.hpp:167
std::uint64_t Epoch
Definition sequencer_state_channel.hpp:60
Definition sequencer_state_channel.hpp:269
union pulp::state::AppliedEditT::Payload payload
AppliedEditKind kind
Definition sequencer_state_channel.hpp:274
ClientSequence client_sequence
Definition sequencer_state_channel.hpp:272
EngineSequence engine_sequence
Definition sequencer_state_channel.hpp:270
EditTransactionId transaction_id
Definition sequencer_state_channel.hpp:273
DirtyRegion dirty
Definition sequencer_state_channel.hpp:275
Epoch snapshot_epoch
Definition sequencer_state_channel.hpp:271
The full non-param state, published for bulk replacement / resync only.
Definition sequencer_state_channel.hpp:237
Epoch epoch
Definition sequencer_state_channel.hpp:239
EngineSequence engine_sequence
Definition sequencer_state_channel.hpp:240
std::array< PatternStateT< Config >, Config::patterns > patterns
Definition sequencer_state_channel.hpp:244
std::uint8_t active_pattern
Definition sequencer_state_channel.hpp:241
One step in one lane.
Definition sequencer_state_channel.hpp:69
static constexpr std::uint8_t kEnabledBit
Definition sequencer_state_channel.hpp:78
Definition sequencer_state_channel.hpp:211
StepEditKind kind
Definition sequencer_state_channel.hpp:215
ClientSequence client_sequence
Definition sequencer_state_channel.hpp:212
EditTransactionId transaction_id
Definition sequencer_state_channel.hpp:213
union pulp::state::StepEditCommandT::Payload payload
The exact cells the engine wrote for a step-range edit.
Definition sequencer_state_channel.hpp:253
std::uint8_t step_count
Definition sequencer_state_channel.hpp:257
std::uint8_t lane
Definition sequencer_state_channel.hpp:255
std::uint8_t pattern
Definition sequencer_state_channel.hpp:254
std::array< typename Config::cell_type, Config::steps > cells
Definition sequencer_state_channel.hpp:258
std::uint8_t first_step
Definition sequencer_state_channel.hpp:256
SwitchPatternEdit active_pattern
Definition sequencer_state_channel.hpp:280
SetPatternLengthEdit pattern_length
Definition sequencer_state_channel.hpp:279
std::uint32_t reject_reason
Definition sequencer_state_channel.hpp:281
StepRangeAppliedT< Config > step_range
Definition sequencer_state_channel.hpp:278
ClearEdit clear
Definition sequencer_state_channel.hpp:219
SwitchPatternEdit switch_pattern
Definition sequencer_state_channel.hpp:222
RandomizeLaneEdit randomize_lane
Definition sequencer_state_channel.hpp:220
SetCellEditT< Config > set_cell
Definition sequencer_state_channel.hpp:218
SetPatternLengthEdit set_pattern_length
Definition sequencer_state_channel.hpp:221