20 template <
class Track >
22 Track& to ) noexcept( std::is_nothrow_copy_assignable< Track >::value )
24 const auto size = std::min( from.size(), to.size() );
25 for (
auto step = std::size_t{0}; step < size; ++step )
27 to[ step ] = from[ step ];
43 constexpr
void set_steps( std::size_t new_steps ) noexcept
52 steps_per_beat_ = steps;
57 return steps_per_beat_;
68 midi_beat_counter_ = 0;
73 midi_beat_counter_ = counter;
78 return midi_beat_counter_;
83 return std::size_t( pulses_per_quarter_note_ / speed_ + 0.1 );
93 if ( process_control_message( message ) || !started_ )
105 midi_beat_counter_ = 0;
107 if ( ++loop_length_midi_beat_counter_ == loop_length_ *
pulses_per_step() )
127 loop_length_ = length;
153 void reset_counters()
const 155 midi_beat_counter_ = 0;
156 loop_length_midi_beat_counter_ = 0;
159 mutable std::size_t midi_beat_counter_{0};
160 mutable std::size_t loop_length_midi_beat_counter_{0};
161 std::size_t steps_per_beat_{4};
164 std::size_t steps_{16};
165 std::size_t loop_length_{16};
166 mutable bool started_{
false};
169 template <
class Step,
class Parameter >
178 : track_{size, std::min( size, initial_size )}
186 copy( other, *
this );
191 if (
this != &other )
194 copy( other, *
this );
201 return track_.size();
204 void set_steps( std::size_t new_steps, std::size_t copy_offset = 0 )
209 if ( new_steps > steps() )
211 for (
size_type new_step = track_.size(); new_step < new_steps; ++new_step )
213 new_track[ new_step ] = ( copy_offset > 0 && new_step >= copy_offset )
214 ? new_track[ new_step - copy_offset ]
219 track_ = std::move( new_track );
234 for (
auto& step : track_ )
246 constexpr std::uint8_t
channel() const noexcept
251 template <
class Sender >
254 for (
auto& entry : current_notes_ )
256 if ( --entry.second == 0 )
262 current_notes_.erase(
263 std::remove_if( begin( current_notes_ ), end( current_notes_ ),
264 [](
const auto& entry ) {
return entry.second == 0; } ),
265 end( current_notes_ ) );
268 template <
class Sender >
271 const auto& step = track_[ idx ];
272 const auto is_active = step.is_active();
273 const auto trig_active = step.evaluate_trig_condition();
274 if ( is_active && trig_active )
276 const auto note = get_note( step );
278 get_velocity( step ) ) );
279 current_notes_.emplace_back( note, get_length( step ) );
285 template <
class Sender >
289 current_notes_.clear();
307 template <
class Sender >
333 note_t get_note(
const Step& step )
const noexcept
335 return step.note() ? step.note()->load() : base_note() + parameter().note_offset();
338 std::uint8_t get_velocity(
const Step& step )
const noexcept
340 return step.velocity() ? step.velocity()->load() : parameter().velocity();
343 std::size_t get_length(
const Step& step )
const noexcept
345 return ( step.length() ? step.length()->load() : parameter().note_length() )
347 pulses_per_quarter_note_;
352 to.parameter_ = from.parameter_;
355 to.pulses_per_quarter_note_ = from.pulses_per_quarter_note_;
360 Parameter parameter_{};
361 std::uint8_t channel_{0};
363 std::size_t pulses_per_quarter_note_{24};
364 mutable std::vector< std::pair<
note_t, std::size_t > > current_notes_;
367 template <
class Step,
class Parameter >
375 : impl_{size, std::min( size, initial_size )}, clock_to_step_{size}
377 impl_.set_pulses_per_quarter_note( clock_to_step_.pulses_per_quarter_note() );
380 template <
class Sender >
388 return impl_.send_note_on_messages( idx, sender );
391 template <
class Sender >
394 const auto step = clock_to_step_.process_message( message );
395 auto note_on_send =
false;
396 if ( !impl_.process_control_message( message, sender ) && clock_to_step_.started() )
398 impl_.send_note_off_messages( sender );
401 note_on_send = send_messages( step, sender );
405 if ( parameter().lfo_enabled() )
407 const auto msg = lfo_( clock_to_step_.pulses_per_quarter_note(),
416 template <
class Sender >
419 impl_.send_all_notes_off_message( sender );
424 return impl_.steps();
427 void set_steps( std::size_t new_steps, std::size_t copy_offset = 0 )
429 clock_to_step_.set_steps( new_steps );
430 impl_.set_steps( new_steps, copy_offset );
445 clock_to_step_.set_steps_per_beat( steps );
456 clock_to_step_.reset_beat_counter();
461 return clock_to_step_.midi_beat_counter();
476 void set_lfo( std::uint8_t min, std::uint8_t max,
F f )
478 set_lfo( parameter().lfo_func( min, max, f ) );
483 return impl_.parameter();
488 return impl_.parameter();
493 impl_.set_channel( channel );
496 constexpr std::uint8_t
channel() const noexcept
498 return impl_.channel();
501 void mute(
bool do_mute =
true ) noexcept
513 return impl_.base_note();
518 clock_to_step_.set_speed_multiplier( speed );
523 clock_to_step_.set_loop_length( loop_length );
529 std::function< std::optional< message_t< 3 > >( std::size_t, bool, bool ) > lfo_;
533 template <
class Tracks,
class Sender >
536 for (
auto& track : tracks )
538 track.send_all_notes_off_message( sender );
void set_lfo(std::uint8_t min, std::uint8_t max, F f)
Definition: track.hpp:476
void send_all_notes_off_message(const Sender &sender) const
Definition: track.hpp:286
constexpr message_t< 1 > realtime_start() noexcept
Definition: realtime.hpp:13
constexpr void set_speed_multiplier(double speed) noexcept
Definition: track.hpp:516
constexpr void set_steps_per_beat(std::size_t steps) noexcept
Definition: track.hpp:50
bool is_muted() const noexcept
Definition: track.hpp:506
note_t
Definition: note.hpp:11
constexpr bool started() const noexcept
Definition: track.hpp:115
void set_steps(std::size_t new_steps, std::size_t copy_offset=0)
Definition: track.hpp:204
Definition: track.hpp:170
constexpr std::size_t steps_per_beat() noexcept
Definition: track.hpp:55
size_type size() const noexcept
Definition: vector.hpp:35
value_type & operator[](size_type i) noexcept
Definition: track.hpp:222
void send_messages(message_t< 1 > message, const Sender &sender) const
Definition: track.hpp:392
typename track_impl_t< Step, Parameter >::value_type value_type
Definition: track.hpp:372
const auto F
Definition: note.hpp:40
track_impl_t & operator=(const track_impl_t &other)
Definition: track.hpp:189
constexpr note_t base_note() const noexcept
Definition: track.hpp:511
Parameter & parameter() noexcept
Definition: track.hpp:481
value_type & operator[](size_type i) noexcept
Definition: track.hpp:433
const value_type & operator[](size_type i) const noexcept
Definition: track.hpp:227
static constexpr int do_not_send
Definition: track.hpp:34
int process_message(message_t< 1 > message) const
Definition: track.hpp:91
void clear() noexcept
Definition: track.hpp:232
void send_note_off_messages(const Sender &sender) const
Definition: track.hpp:252
std::conditional_t< greater_than< number_of_bytes, 0 >::value, std::array< std::byte, number_of_bytes >, std::vector< std::byte > > message_t
Definition: message_type.hpp:18
#define SEQUENCER_ASSERT(cond)
Definition: assert.hpp:8
constexpr void set_channel(std::uint8_t channel) noexcept
Definition: track.hpp:491
constexpr note_t base_note() const noexcept
Definition: track.hpp:292
constexpr message_t< 3 > note_on(std::uint8_t channel, std::uint8_t note, std::uint8_t velocity) noexcept
Definition: channel_voice.hpp:13
constexpr void set_pulses_per_quarter_note(std::size_t pulses_per_quarter_note) noexcept
Definition: track.hpp:60
constexpr void set_pulses_per_quarter_note(std::size_t pulses_per_quarter_note) noexcept
Definition: track.hpp:327
constexpr message_t< 3 > all_notes_off(std::uint8_t channel) noexcept
Definition: channel_voice.hpp:267
constexpr std::uint8_t to_uint8_t(note_t note) noexcept
Definition: note.hpp:21
constexpr void set_loop_length(std::size_t length) noexcept
Definition: track.hpp:125
constexpr message_t< 3 > note_off(std::uint8_t channel, std::uint8_t note, std::uint8_t velocity) noexcept
Definition: channel_voice.hpp:23
track_t(size_type size=64, size_type initial_size=16)
Definition: track.hpp:374
constexpr std::uint8_t channel() const noexcept
Definition: track.hpp:246
constexpr void reset_beat_counter() noexcept
Definition: track.hpp:454
constexpr void set_pulses_per_quarter_note(std::size_t pulses_per_quarter_note) noexcept
Definition: track.hpp:448
const value_type & operator[](size_type i) const noexcept
Definition: track.hpp:438
clock_to_step_t(std::size_t steps) noexcept
Definition: track.hpp:38
typename track_base_t::size_type size_type
Definition: track.hpp:175
void mute(bool do_mute=true) noexcept
Definition: track.hpp:501
constexpr message_t< 1 > realtime_continue() noexcept
Definition: realtime.hpp:18
constexpr void set_channel(std::uint8_t channel) noexcept
Definition: track.hpp:240
typename vec_t::value_type value_type
Definition: vector.hpp:13
constexpr message_t< 1 > realtime_stop() noexcept
Definition: realtime.hpp:23
constexpr std::size_t pulses_per_step() const noexcept
Definition: track.hpp:86
void clear() noexcept
Definition: track.hpp:464
Parameter & parameter() noexcept
Definition: track.hpp:297
const Parameter & parameter() const noexcept
Definition: track.hpp:486
constexpr void set_loop_length(std::size_t loop_length) noexcept
Definition: track.hpp:521
void copy_track(const Track &from, Track &to) noexcept(std::is_nothrow_copy_assignable< Track >::value)
Definition: track.hpp:21
std::size_t steps() const noexcept
Definition: track.hpp:422
track_impl_t(size_type size=64, size_type initial_size=16)
Definition: track.hpp:177
void send_all_notes_off_message(Tracks &tracks, const Sender &sender)
Definition: track.hpp:534
typename vec_t::size_type size_type
Definition: vector.hpp:12
void set_midi_beat_counter(std::size_t counter) noexcept
Definition: track.hpp:71
void reset_beat_counter() noexcept
Definition: track.hpp:66
constexpr std::uint8_t channel() const noexcept
Definition: track.hpp:496
std::size_t steps() const noexcept
Definition: track.hpp:199
constexpr void set_steps_per_beat(std::size_t steps) noexcept
Definition: track.hpp:443
typename track_base_t::value_type value_type
Definition: track.hpp:174
constexpr std::size_t midi_beat_counter() const noexcept
Definition: track.hpp:76
const Parameter & parameter() const noexcept
Definition: track.hpp:302
track_impl_t(const track_impl_t &other)
Definition: track.hpp:184
bool send_note_on_messages(int idx, const Sender &sender) const
Definition: track.hpp:269
auto midi_beat_counter() const noexcept
Definition: track.hpp:459
void send_all_notes_off_message(const Sender &sender) const
Definition: track.hpp:417
void set_lfo(F f)
Definition: track.hpp:470
Definition: track.hpp:368
bool send_messages(std::size_t idx, const Sender &sender) const
Definition: track.hpp:381
constexpr void set_steps(std::size_t new_steps) noexcept
Definition: track.hpp:43
clock_to_step_t()=default
constexpr auto max_number_of_midi_channels
Definition: constants.hpp:9
typename track_impl_t< Step, Parameter >::size_type size_type
Definition: track.hpp:371
constexpr auto default_pulses_per_quarter_note
Definition: constants.hpp:10
void set_steps(std::size_t new_steps, std::size_t copy_offset=0)
Definition: track.hpp:427
bool process_control_message(message_t< 1 > message, const Sender &sender) const
Definition: track.hpp:308
constexpr void set_speed_multiplier(double speed) noexcept
Definition: track.hpp:120
constexpr std::size_t pulses_per_quarter_note() const noexcept
Definition: track.hpp:81