Line data Source code
1 : /* ✔ */
2 :
3 : #pragma once
4 :
5 : #include <AH/Arduino-Wrapper.h> // Print
6 : #include <Settings/NamespaceSettings.hpp>
7 :
8 : BEGIN_CS_NAMESPACE
9 :
10 : /**
11 : * A type-safe class for MIDI channels.
12 : */
13 : class Channel {
14 : public:
15 : /**
16 : * @brief Create a MIDI Channel object.
17 : *
18 : * @param zeroBasedChannel
19 : * The zero-based channel (0 is the first channel).
20 : */
21 459 : explicit constexpr Channel(uint8_t zeroBasedChannel)
22 459 : : zeroBasedChannel(zeroBasedChannel) {}
23 :
24 : /**
25 : * @brief Get the channel as an integer.
26 : *
27 : * @return The zero-based channel (0 is the first channel).
28 : */
29 666 : constexpr uint8_t getRaw() const { return zeroBasedChannel; }
30 :
31 : /**
32 : * @brief Get the channel as an integer.
33 : *
34 : * @return The one-based channel (1 is the first channel).
35 : */
36 10 : constexpr uint8_t getOneBased() const { return zeroBasedChannel + 1; }
37 :
38 : /**
39 : * @brief Create a channel.
40 : *
41 : * @param oneBasedChannel
42 : * The channel number (1 is the first channel).
43 : */
44 : static constexpr Channel createChannel(uint8_t oneBasedChannel) {
45 : return Channel {uint8_t(oneBasedChannel - 1)};
46 : }
47 :
48 : /**
49 : * @brief Check if two channels are the same.
50 : *
51 : * @param rhs
52 : * The other channel to compare this channel to.
53 : */
54 47 : constexpr bool operator==(const Channel &rhs) const {
55 47 : return this->zeroBasedChannel == rhs.zeroBasedChannel;
56 : }
57 :
58 : /**
59 : * @brief Check if two channels are the different.
60 : *
61 : * @param rhs
62 : * The other channel to compare this channel to.
63 : */
64 : constexpr bool operator!=(const Channel &rhs) const {
65 : return this->zeroBasedChannel != rhs.zeroBasedChannel;
66 : }
67 :
68 : /**
69 : * @brief Add an offset.
70 : *
71 : * @param rhs
72 : * The offset to add to this channel.
73 : */
74 13 : Channel &operator+=(uint8_t rhs) {
75 13 : this->zeroBasedChannel += rhs;
76 13 : return *this;
77 : }
78 :
79 : /**
80 : * @brief Add an offset to a channel.
81 : *
82 : * @param rhs
83 : * The offset to add to the channel.
84 : */
85 13 : Channel operator+(uint8_t rhs) const {
86 13 : Channel copy = *this;
87 13 : copy += rhs;
88 13 : return copy;
89 : }
90 :
91 : /**
92 : * @brief Subtract an offset.
93 : *
94 : * @param rhs
95 : * The offset to subtract from this channel.
96 : */
97 4 : Channel &operator-=(uint8_t rhs) {
98 4 : this->zeroBasedChannel -= rhs;
99 4 : return *this;
100 : }
101 :
102 : /**
103 : * @brief Subtract an offset from a channel.
104 : *
105 : * @param rhs
106 : * The offset to subtract from the channel.
107 : */
108 4 : Channel operator-(uint8_t rhs) const {
109 4 : Channel copy = *this;
110 4 : copy -= rhs;
111 4 : return copy;
112 : }
113 :
114 : private:
115 : uint8_t zeroBasedChannel : 4;
116 : };
117 :
118 : constexpr Channel Channel_1 = Channel::createChannel(1);
119 : constexpr Channel Channel_2 = Channel::createChannel(2);
120 : constexpr Channel Channel_3 = Channel::createChannel(3);
121 : constexpr Channel Channel_4 = Channel::createChannel(4);
122 : constexpr Channel Channel_5 = Channel::createChannel(5);
123 : constexpr Channel Channel_6 = Channel::createChannel(6);
124 : constexpr Channel Channel_7 = Channel::createChannel(7);
125 : constexpr Channel Channel_8 = Channel::createChannel(8);
126 : constexpr Channel Channel_9 = Channel::createChannel(9);
127 : constexpr Channel Channel_10 = Channel::createChannel(10);
128 : constexpr Channel Channel_11 = Channel::createChannel(11);
129 : constexpr Channel Channel_12 = Channel::createChannel(12);
130 : constexpr Channel Channel_13 = Channel::createChannel(13);
131 : constexpr Channel Channel_14 = Channel::createChannel(14);
132 : constexpr Channel Channel_15 = Channel::createChannel(15);
133 : constexpr Channel Channel_16 = Channel::createChannel(16);
134 :
135 : #ifndef CHANNEL_1 // ArduinoCore-renesas defines this
136 : constexpr Channel CHANNEL_1 CS_DEPREC("Use Channel_1 instead") = Channel_1;
137 : constexpr Channel CHANNEL_2 CS_DEPREC("Use Channel_2 instead") = Channel_2;
138 : constexpr Channel CHANNEL_3 CS_DEPREC("Use Channel_3 instead") = Channel_3;
139 : constexpr Channel CHANNEL_4 CS_DEPREC("Use Channel_4 instead") = Channel_4;
140 : constexpr Channel CHANNEL_5 CS_DEPREC("Use Channel_5 instead") = Channel_5;
141 : constexpr Channel CHANNEL_6 CS_DEPREC("Use Channel_6 instead") = Channel_6;
142 : constexpr Channel CHANNEL_7 CS_DEPREC("Use Channel_7 instead") = Channel_7;
143 : constexpr Channel CHANNEL_8 CS_DEPREC("Use Channel_8 instead") = Channel_8;
144 : constexpr Channel CHANNEL_9 CS_DEPREC("Use Channel_9 instead") = Channel_9;
145 : constexpr Channel CHANNEL_10 CS_DEPREC("Use Channel_10 instead") = Channel_10;
146 : constexpr Channel CHANNEL_11 CS_DEPREC("Use Channel_11 instead") = Channel_11;
147 : constexpr Channel CHANNEL_12 CS_DEPREC("Use Channel_12 instead") = Channel_12;
148 : constexpr Channel CHANNEL_13 CS_DEPREC("Use Channel_13 instead") = Channel_13;
149 : constexpr Channel CHANNEL_14 CS_DEPREC("Use Channel_14 instead") = Channel_14;
150 : constexpr Channel CHANNEL_15 CS_DEPREC("Use Channel_15 instead") = Channel_15;
151 : constexpr Channel CHANNEL_16 CS_DEPREC("Use Channel_16 instead") = Channel_16;
152 : #endif
153 :
154 : Print &operator<<(Print &, Channel);
155 :
156 : END_CS_NAMESPACE
|