22 using size_type = std::array< double, 128 >::size_type;
26 const auto add_values = [&](
auto delta ) {
27 for ( size_type i = start; i < end; ++i )
29 length_map[ i ] = value / 4;
43 length_map[ 127 ] = std::numeric_limits< double >::max();
75 static constexpr
auto note_offset_idx = 0u;
76 static constexpr
auto velocity_idx = 1u;
77 static constexpr
auto length_idx = 2u;
107 return values[
idx::trig ][ note_offset_idx ].load();
112 return values[
idx::trig ][ velocity_idx ].load();
117 values[
idx::trig ][ velocity_idx ] = velocity;
132 return values[
idx::lfo ][ lfo_idx::destination ];
137 return values[
idx::lfo ][ lfo_idx::speed ] * values[
idx::lfo ][ lfo_idx::multiplier ];
142 return lfo_destination() > 0 && lfo_speed() != 0;
146 auto lfo_func( std::uint8_t min, std::uint8_t max,
F f )
const noexcept
156 explicit lfo_t( std::uint8_t min, std::uint8_t max,
F f,
158 : min_{min}, max_{max}, f_{f}, parameters_{parameters}
162 std::optional< midi::message_t< 3 > >
operator()( std::size_t pulses_per_quarter_note,
163 bool restart,
bool note_send )
const 166 if ( restart || ( lfo_trig_mode() && note_send ) )
175 if ( lfo_hold_mode() && !note_send )
181 const auto period_length = 4 * pulses_per_quarter_note * 128 / lfo_speed();
182 if ( ( lfo_one_mode() && pulse_count_ > period_length ) ||
183 ( lfo_half_mode() && pulse_count_ > period_length / 2 ) )
187 if ( ( lfo_one_mode() && pulse_count_ == period_length ) ||
188 ( lfo_half_mode() && pulse_count_ == period_length / 2 ) )
191 return f_( ( min_ + max_ ) / 2 + ( min_ + max_ ) % 2 );
194 const auto lfo_value = midi::lfo< std::uint8_t >(
195 pulse_count_++, pulses_per_quarter_note, lfo_speed(), lfo_phase(), min_, max_,
197 parameters_[ track_parameter_t::lfo_idx::wave_form ].load() ) );
198 return f_( lfo_value );
202 bool lfo_trig_mode()
const noexcept
204 return parameters_[ track_parameter_t::lfo_idx::mod ] == 1;
207 bool lfo_hold_mode()
const noexcept
209 return parameters_[ track_parameter_t::lfo_idx::mod ] == 2;
212 bool lfo_one_mode()
const noexcept
214 return parameters_[ track_parameter_t::lfo_idx::mod ] == 3;
217 bool lfo_half_mode()
const noexcept
219 return parameters_[ track_parameter_t::lfo_idx::mod ] == 4;
222 auto lfo_phase()
const noexcept
224 return parameters_[ track_parameter_t::lfo_idx::phase ];
227 auto lfo_speed()
const noexcept
229 return parameters_[ track_parameter_t::lfo_idx::speed ] *
230 parameters_[ track_parameter_t::lfo_idx::multiplier ];
237 mutable std::size_t pulse_count_{0};
240 #define READ_SECTION( section_name ) \ 241 if ( section.name == #section_name ) \ 243 device_spec.control_parameter[ track_parameter_t::idx::section_name ].resize( \ 244 section.entries.size() ); \ 246 begin( section.entries ), end( section.entries ), \ 247 begin( device_spec.control_parameter[ track_parameter_t::idx::section_name ] ) ); \ 257 for (
const auto& section : sections )
Definition: digitakt_parameter.hpp:96
Definition: digitakt_parameter.hpp:86
Definition: digitakt_parameter.hpp:67
#define READ_SECTION(section_name)
Definition: digitakt_parameter.hpp:240
Definition: digitakt_parameter.hpp:95
std::optional< midi::message_t< 3 > > operator()(std::size_t pulses_per_quarter_note, bool restart, bool note_send) const noexcept
Definition: digitakt_parameter.hpp:162
const auto F
Definition: note.hpp:40
Definition: digitakt_parameter.hpp:70
Definition: digitakt_parameter.hpp:69
auto lfo_destination() const noexcept
Definition: digitakt_parameter.hpp:130
const std::array< double, 128 > & length_map()
Definition: digitakt_parameter.hpp:47
auto lfo_func(std::uint8_t min, std::uint8_t max, F f) const noexcept
Definition: digitakt_parameter.hpp:146
lfo_t(std::uint8_t min, std::uint8_t max, F f, const midi::track_parameter_t::parameters_type ¶meters) noexcept
Definition: digitakt_parameter.hpp:156
std::vector< section_t > read_file(std::istream &file)
Definition: device_spec_reader.hpp:96
Definition: digitakt_parameter.hpp:81
auto note_offset() const noexcept
Definition: digitakt_parameter.hpp:105
Definition: digitakt_parameter.hpp:61
Definition: digitakt_parameter.hpp:84
auto velocity() const noexcept
Definition: digitakt_parameter.hpp:110
Definition: beat_duration.hpp:13
std::vector< std::vector< midi::device_entry_t > > control_parameter
Definition: digitakt_parameter.hpp:55
Definition: digitakt_parameter.hpp:97
void set_note_length_idx(std::uint16_t idx) noexcept
Definition: digitakt_parameter.hpp:125
device_spec_cc_t read_device_spec_cc(std::istream &stream)
Definition: digitakt_parameter.hpp:251
idx
Definition: digitakt_parameter.hpp:63
Definition: digitakt_parameter.hpp:93
bool lfo_enabled() const noexcept
Definition: digitakt_parameter.hpp:140
std::vector< copyable_atomic< std::int16_t > > parameters_type
Definition: track_parameter.hpp:12
lfo_idx
Definition: digitakt_parameter.hpp:78
Definition: digitakt_parameter.hpp:82
auto lfo_speed() const noexcept
Definition: digitakt_parameter.hpp:135
Definition: digitakt_parameter.hpp:66
track_parameter_t()
Definition: digitakt_parameter.hpp:101
Definition: digitakt_parameter.hpp:68
Definition: digitakt_parameter.hpp:83
Definition: digitakt_parameter.hpp:85
Definition: digitakt_parameter.hpp:59
Definition: track_parameter.hpp:10
void set_velocity(std::uint16_t velocity) noexcept
Definition: digitakt_parameter.hpp:115
wave_from_idx
Definition: digitakt_parameter.hpp:90
Definition: digitakt_parameter.hpp:94
lfo_mode
Definition: lfo.hpp:11
Definition: digitakt.hpp:18
Definition: digitakt_parameter.hpp:71
beat_duration note_length() const noexcept
Definition: digitakt_parameter.hpp:120
std::array< double, 128 > create_length_map()
Definition: digitakt_parameter.hpp:19
Definition: digitakt_parameter.hpp:53