17 template <
class... Data >
19 Data&&... data ) noexcept
21 return {
byte::sysex_start, manufacturer_id, std::byte( std::forward< Data >( data ) )...,
25 template <
class... Data >
27 Data&&... data ) noexcept
29 return system_exclusive( std::byte{manufacturer_id}, std::forward< Data >( data )... );
32 template <
class... Data >
34 Data&&... data ) noexcept
40 std::byte( std::forward< Data >( data ) )...,
44 template <
class... Data >
45 constexpr
message_t<
sizeof...( Data ) + 5u >
46 system_exclusive( std::array< std::uint8_t, 3 > manufacturer_id, Data&&... data ) noexcept
48 return system_exclusive( std::byte{manufacturer_id[ 0 ]}, std::byte{manufacturer_id[ 1 ]},
49 std::byte{manufacturer_id[ 2 ]}, std::forward< Data >( data )... );
56 template <
class... Data >
57 constexpr
message_t<
sizeof...( Data ) + 4u >
61 std::forward< Data >( data )... );
65 std::uint16_t value ) noexcept
69 hex_value.first, hex_value.second );
73 std::uint16_t value ) noexcept
79 std::uint16_t value ) noexcept
85 std::uint16_t value ) noexcept
91 std::uint16_t value ) noexcept
96 template < std::size_t... index >
97 constexpr
message_t< 4 +
sizeof...( index ) >
99 std::index_sequence< index... > )
104 template <
class Id,
class Value, std::size_t number_of_values,
105 std::size_t number_of_slots = 0 >
106 constexpr
message_t< 9 + (
sizeof( Id ) +
sizeof( Value ) ) * number_of_values +
107 2 * number_of_slots >
109 std::uint8_t manufacturer_id,
110 const std::array< std::pair< Id, Value >, number_of_values >& id_value_pairs,
111 const std::array< std::uint16_t, number_of_slots >& slots = {} ) noexcept
113 constexpr
auto pair_size =
sizeof( Id ) +
sizeof( Value );
114 constexpr
auto user_data_size = pair_size * number_of_values + 2 * number_of_slots;
117 data[ 1 ] = std::byte{0x05};
118 data[ 2 ] = std::byte{number_of_slots};
119 data[ 3 ] = std::byte{
sizeof( Id )};
120 data[ 4 ] = std::byte{
sizeof( Value )};
122 for (
auto i = std::size_t{0}; i < number_of_slots; ++i )
125 data[ 5 + 2 * i ] = std::byte{msb};
126 data[ 5 + 2 * i + 1 ] = std::byte{
lsb};
129 const auto offset = 5 + 2 * number_of_slots;
130 for (
auto i = std::size_t{0}; i < number_of_values; ++i )
132 if constexpr (
sizeof( Id ) == 1 &&
sizeof( Value ) == 1 )
134 data[ offset + pair_size * i ] = std::byte{id_value_pairs[ i ].first};
135 data[ offset + pair_size * i + 1 ] = std::byte{id_value_pairs[ i ].second};
138 if constexpr (
sizeof( Id ) == 2 &&
sizeof( Value ) == 1 )
141 data[ offset + pair_size * i ] = std::byte{id_msb};
142 data[ offset + pair_size * i + 1 ] = std::byte{id_lsb};
143 data[ offset + pair_size * i + 2 ] = std::byte{id_value_pairs[ i ].second};
146 if constexpr (
sizeof( Id ) == 1 &&
sizeof( Value ) == 2 )
148 const auto [ value_lsb, value_msb ] =
150 data[ offset + pair_size * i ] = std::byte{id_value_pairs[ i ].first};
151 data[ offset + pair_size * i + 1 ] = std::byte{value_lsb};
152 data[ offset + pair_size * i + 2 ] = std::byte{value_msb};
155 if constexpr (
sizeof( Id ) == 2 &&
sizeof( Value ) == 2 )
158 data[ offset + pair_size * i ] = std::byte{id_msb};
159 data[ offset + pair_size * i + 1 ] = std::byte{id_lsb};
160 const auto [ value_lsb, value_msb ] =
162 data[ offset + pair_size * i + 2 ] = std::byte{value_lsb};
163 data[ offset + pair_size * i + 3 ] = std::byte{value_msb};
168 std::make_index_sequence< 5 + user_data_size >() );
191 return static_cast< std::uint8_t
>( type );
194 template < std::
size_t number_of_entries >
196 std::uint8_t manufacturer_id, std::uint8_t channel, std::uint8_t key,
197 const std::array< std::pair< std::uint8_t, std::uint8_t >, number_of_entries >&
198 number_value_pairs ) noexcept
201 constexpr
auto fixed_entry_offset = 4u;
202 constexpr
auto data_size = fixed_entry_offset + 2 * number_of_entries;
204 data[ 0 ] = std::byte{0x0A};
205 data[ 1 ] = std::byte{0x01};
206 data[ 2 ] = std::byte{channel};
207 data[ 3 ] = std::byte{key};
208 for (
auto i = std::size_t{0}; i < number_of_entries; ++i )
210 const auto id = number_value_pairs[ i ].first;
211 const auto value = number_value_pairs[ i ].second;
212 data[ fixed_entry_offset + 2 * i ] = std::byte{
id};
247 data[ fixed_entry_offset + 2 * i + 1 ] = std::byte{value};
250 return make_sysex( manufacturer_id, data, std::make_index_sequence< data_size >() );
254 namespace non_realtime
256 static constexpr
auto id_byte = std::byte{0x7E};
257 static constexpr
auto gm_byte = std::byte{0x09};
258 static constexpr
auto dls_byte = std::byte{0x0A};
260 template <
class... Data >
261 constexpr
message_t<
sizeof...( Data ) + 4u >
265 std::forward< Data >( data )... );
269 std::uint8_t value ) noexcept
293 std::byte value ) noexcept
301 const std::uint8_t value = on ? 0x01 : 0x02;
308 const std::uint8_t value = on ? 0x04 : 0x03;
constexpr message_t< 4+sizeof...(index) > make_sysex(std::uint8_t manufacturer_id, const message_t< sizeof...(index) > &data, std::index_sequence< index... >)
Definition: system_exclusive.hpp:98
constexpr auto sysex_end
Definition: byte.hpp:24
constexpr message_t< 6 > general_midi_system_disable(std::uint8_t manufacturer_id) noexcept
Definition: system_exclusive.hpp:275
constexpr message_t< 8 > master_balance(std::uint8_t manufacturer_id, std::uint16_t value) noexcept
Definition: system_exclusive.hpp:78
constexpr message_t< 8 > master_volume(std::uint8_t manufacturer_id, std::uint16_t value) noexcept
Definition: system_exclusive.hpp:72
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 message_t< 6 > general_midi_1_system_enable(std::uint8_t manufacturer_id) noexcept
Definition: system_exclusive.hpp:281
constexpr auto sysex_start
Definition: byte.hpp:23
constexpr auto lsb(std::byte msb)
Definition: byte.hpp:37
constexpr message_t< 8 > master_fine_tuning(std::uint8_t manufacturer_id, std::uint16_t value) noexcept
Definition: system_exclusive.hpp:84
constexpr message_t< 1 > end_system_exclusive() noexcept
Definition: system_exclusive.hpp:12
constexpr auto id_byte
Definition: system_exclusive.hpp:54
key_based_instrument_control_type
Definition: system_exclusive.hpp:171
constexpr message_t< 8+2 *number_of_entries > key_based_instrument_control(std::uint8_t manufacturer_id, std::uint8_t channel, std::uint8_t key, const std::array< std::pair< std::uint8_t, std::uint8_t >, number_of_entries > &number_value_pairs) noexcept
Definition: system_exclusive.hpp:195
constexpr std::uint8_t to_uint8(key_based_instrument_control_type type) noexcept
Definition: system_exclusive.hpp:189
constexpr auto device_control
Definition: byte.hpp:102
constexpr message_t< sizeof...(Data)+3u > system_exclusive(std::byte manufacturer_id, Data &&... data) noexcept
Definition: system_exclusive.hpp:18
constexpr message_t< 9+(sizeof(Id)+sizeof(Value)) *number_of_values+2 *number_of_slots > global_parameter_control(std::uint8_t manufacturer_id, const std::array< std::pair< Id, Value >, number_of_values > &id_value_pairs, const std::array< std::uint16_t, number_of_slots > &slots={}) noexcept
Definition: system_exclusive.hpp:108
Definition: system_exclusive.hpp:10
constexpr message_t< 8 > device_control(std::uint8_t manufacturer_id, std::uint8_t key, std::uint16_t value) noexcept
Definition: system_exclusive.hpp:64
constexpr std::pair< std::byte, std::byte > uint16_to_lsb_msb(std::uint16_t value) noexcept
Definition: util.hpp:34
constexpr message_t< sizeof...(Data)+4u > system_exclusive(std::uint8_t manufacturer_id, Data &&... data) noexcept
Definition: system_exclusive.hpp:58
constexpr message_t< 8 > master_coarse_tuning(std::uint8_t manufacturer_id, std::uint16_t value) noexcept
Definition: system_exclusive.hpp:90
constexpr message_t< 6 > downloadable_sounds_voice_allocation(std::uint8_t manufacturer_id, bool on) noexcept
Definition: system_exclusive.hpp:305
constexpr message_t< 6 > general_midi_system(std::uint8_t manufacturer_id, std::uint8_t value) noexcept
Definition: system_exclusive.hpp:268
constexpr message_t< 6 > general_midi_2_system_enable(std::uint8_t manufacturer_id) noexcept
Definition: system_exclusive.hpp:287
constexpr message_t< 6 > downloadable_sounds(std::uint8_t manufacturer_id, bool on) noexcept
Definition: system_exclusive.hpp:298