BuGUI
BUtton Grid User Interface
Loading...
Searching...
No Matches
midi_message.hpp
1#pragma once
2#include "common.hpp"
3#include "recursive.hpp"
4
5#include <cstdint>
6
7namespace bugui
8{
9template <typename Tp>
10concept valid_midi = std::convertible_to
11 <std::remove_reference_t<Tp>, uint8_t>;
12
13template <typename Tp>
14concept sends_sysex = array_like<decltype(Tp::sysex_id())>
15 && valid_midi
16 <decltype(Tp::sysex_id()[0])>;
17
18EMPTY_ENUM_CHECK(sysex)
19EMPTY_ENUM_CHECK(cc)
20EMPTY_ENUM_CHECK(on_off)
21
22template <typename... Args>
23concept is_sysex = (((sysex_empty_enum<Args>
25 && (!cc_empty_enum<Args>
26 && !on_off_empty_enum<Args>))
27 || ...);
28
29template <typename... Args>
30concept is_cc = ((cc_empty_enum<Args>
32 && !on_off_empty_enum<Args>)
33 || ...);
34
35template <typename... Args>
36concept is_on_off = ((on_off_empty_enum<Args>
38 && !cc_empty_enum<Args>))
39 && ...);
40
41template <typename... Args>
42concept is_explicit_on_off = ((on_off_empty_enum<Args>
44 && !cc_empty_enum<Args>)
45 && ...);
46
47// ENUM_CHECK(in, sysex)
48ENUM_CHECK(in, cc)
49ENUM_CHECK(in, on_off)
50
51// template <typename... Args>
52// concept is_sysex_in = ((in_enum_sysex<Args>
53// && !in_enum_cc<Args>
54// && !in_enum_on_off<Args>
55// || is_sysex<Args>)
56// || ...);;
57
58template <typename... Args>
59concept is_cc_in = ((in_enum_cc<Args>
60 // && !in_enum_sysex<Args>
61 && !in_enum_on_off<Args>
62 || is_cc<Args>)
63 || ...);
64
65template <typename... Args>
66concept is_on_off_in = !is_cc_in<Args...>;
67
68template <typename... Args>
69concept is_explicit_on_off_in = ((in_enum_on_off<Args>
70 // && !in_enum_sysex<Args>
71 && !in_enum_cc<Args>
73 || ...);
74
75template <typename Tp>
78
79template <typename Tp>
82
83template <typename Tp>
85
86template <typename Tp>
88 || is_cc_in<Tp>);
89
90ENUM_CHECK(out, sysex)
91ENUM_CHECK(out, cc)
92ENUM_CHECK(out, on_off)
93
94template <typename... Args>
95concept is_sysex_out = ((out_enum_sysex<Args>
96 && !out_enum_on_off<Args>
97 && !out_enum_cc<Args>
99 || ...);
100
101template <typename... Args>
102concept is_cc_out = ((out_enum_cc<Args>
103 && !out_enum_sysex<Args>
104 && !out_enum_on_off<Args>
105 || is_cc<Args>)
106 || ...);
107
108template <typename... Args>
109concept is_on_off_out = !is_cc_out<Args...>
110 && !is_sysex_out<Args...>;
111
112template <typename... Args>
113concept is_explicit_on_off_out = ((out_enum_on_off<Args>
114 && !out_enum_sysex<Args>
115 && !out_enum_cc<Args>
117 || ...);
118
119template <typename Tp>
122
123template <typename Tp>
126
127template <typename Tp>
130
131template <typename Tp>
135
136template <typename Tp>
141
142template <typename Tp>
145 && RECURSIVE_CONCEPT(!is_cc_out, Tp)
146 && RECURSIVE_CONCEPT(!is_on_off_out, Tp));
147
148} // namespace bugui
Definition common.hpp:26
Definition midi_message.hpp:87
Definition midi_message.hpp:137
Definition midi_message.hpp:84
Definition midi_message.hpp:132
Definition midi_message.hpp:76
Definition midi_message.hpp:59
Definition midi_message.hpp:124
Definition midi_message.hpp:102
Definition midi_message.hpp:30
Definition midi_message.hpp:69
Definition midi_message.hpp:113
Definition midi_message.hpp:42
Definition midi_message.hpp:80
Definition midi_message.hpp:66
Definition midi_message.hpp:128
Definition midi_message.hpp:109
Definition midi_message.hpp:36
Definition midi_message.hpp:120
Definition midi_message.hpp:95
Definition midi_message.hpp:23
Definition midi_message.hpp:143
Definition midi_message.hpp:14
Definition midi_message.hpp:10