MCC
Loading...
Searching...
No Matches
Accidental.h
1#ifndef MCC_PITCH_ACCIDENTAL_H
2#define MCC_PITCH_ACCIDENTAL_H
3
4#include <MCC_BuildSettings.h>
5
6#include <stdint.h>
7
8namespace MCC {
9
21public:
23 static constexpr int8_t Minimum = -4;
24
26 static constexpr int8_t Maximum = 4;
27
32 static constexpr int8_t InvalidValue = 127;
33
34private:
35 int8_t _semitones;
36
37public:
39 constexpr Accidental() noexcept : _semitones(InvalidValue) {}
40
45 constexpr explicit Accidental(int32_t semitones) noexcept
46 : _semitones(IsInRange(semitones)
47 ? static_cast<int8_t>(semitones)
48 : InvalidValue) {}
49
51 static constexpr Accidental Invalid() noexcept { return Accidental(); }
52
54 static constexpr Accidental QuadrupleFlat() noexcept { return Accidental(-4); }
55
57 static constexpr Accidental TripleFlat() noexcept { return Accidental(-3); }
58
60 static constexpr Accidental DoubleFlat() noexcept { return Accidental(-2); }
61
63 static constexpr Accidental Flat() noexcept { return Accidental(-1); }
64
66 static constexpr Accidental Natural() noexcept { return Accidental(0); }
67
69 static constexpr Accidental Sharp() noexcept { return Accidental(1); }
70
72 static constexpr Accidental DoubleSharp() noexcept { return Accidental(2); }
73
75 static constexpr Accidental TripleSharp() noexcept { return Accidental(3); }
76
78 static constexpr Accidental QuadrupleSharp() noexcept { return Accidental(4); }
79
81 constexpr bool IsValid() const noexcept {
82 return _semitones != InvalidValue;
83 }
84
89 constexpr int8_t Semitones() const noexcept { return _semitones; }
90
97 MCC_CONSTEXPR14 Accidental Altered(int32_t semitones) const noexcept {
98 if (!IsValid() ||
99 semitones < Minimum - Maximum ||
100 semitones > Maximum - Minimum) {
101 return Invalid();
102 }
103 return Accidental(_semitones + semitones);
104 }
105
107 friend constexpr bool operator==(Accidental a, Accidental b) noexcept {
108 return a._semitones == b._semitones;
109 }
110
111 friend constexpr bool operator!=(Accidental a, Accidental b) noexcept {
112 return !(a == b);
113 }
114
116 friend constexpr bool operator<(Accidental a, Accidental b) noexcept {
117 return a._semitones < b._semitones;
118 }
119
120 friend constexpr bool operator>(Accidental a, Accidental b) noexcept {
121 return b < a;
122 }
123
124 friend constexpr bool operator<=(Accidental a, Accidental b) noexcept {
125 return !(b < a);
126 }
127
128 friend constexpr bool operator>=(Accidental a, Accidental b) noexcept {
129 return !(a < b);
130 }
131
132private:
133 static constexpr bool IsInRange(int32_t semitones) noexcept {
134 return semitones >= Minimum && semitones <= Maximum;
135 }
136};
137
138} // namespace MCC
139
140#endif // MCC_PITCH_ACCIDENTAL_H
Chromatic alteration of a letter, from -4 (quadruple flat) to +4 (quadruple sharp).
Definition Accidental.h:20
static constexpr Accidental Natural() noexcept
Returns the natural (0).
Definition Accidental.h:66
static constexpr Accidental Invalid() noexcept
Returns the invalid accidental.
Definition Accidental.h:51
static constexpr Accidental QuadrupleSharp() noexcept
Returns the quadruple sharp (+4).
Definition Accidental.h:78
static constexpr Accidental TripleFlat() noexcept
Returns the triple flat (-3).
Definition Accidental.h:57
static constexpr Accidental Sharp() noexcept
Returns the sharp (+1).
Definition Accidental.h:69
constexpr int8_t Semitones() const noexcept
Returns the alteration in semitones, or InvalidValue for the invalid accidental (SPEC-ERR-7).
Definition Accidental.h:89
static constexpr int8_t Minimum
Lowest supported alteration (quadruple flat).
Definition Accidental.h:23
static constexpr int8_t InvalidValue
Sentinel returned by Semitones() for the invalid value (SPEC-ERR-7). Do not rely on it; check IsValid...
Definition Accidental.h:32
friend constexpr bool operator==(Accidental a, Accidental b) noexcept
Equality; all invalid accidentals are equal (SPEC-ERR-6).
Definition Accidental.h:107
static constexpr Accidental DoubleFlat() noexcept
Returns the double flat (-2).
Definition Accidental.h:60
static constexpr Accidental DoubleSharp() noexcept
Returns the double sharp (+2).
Definition Accidental.h:72
constexpr bool IsValid() const noexcept
Returns true unless this is the invalid accidental.
Definition Accidental.h:81
MCC_CONSTEXPR14 Accidental Altered(int32_t semitones) const noexcept
Returns this accidental altered by semitones.
Definition Accidental.h:97
friend constexpr bool operator<(Accidental a, Accidental b) noexcept
Orders by semitones; invalid sorts last.
Definition Accidental.h:116
static constexpr Accidental TripleSharp() noexcept
Returns the triple sharp (+3).
Definition Accidental.h:75
constexpr Accidental(int32_t semitones) noexcept
Creates the accidental semitones; values outside [Minimum, Maximum] produce the invalid value (SPEC-E...
Definition Accidental.h:45
constexpr Accidental() noexcept
Creates the invalid accidental (SPEC-ERR-2).
Definition Accidental.h:39
static constexpr Accidental Flat() noexcept
Returns the flat (-1).
Definition Accidental.h:63
static constexpr Accidental QuadrupleFlat() noexcept
Returns the quadruple flat (-4).
Definition Accidental.h:54
static constexpr int8_t Maximum
Highest supported alteration (quadruple sharp).
Definition Accidental.h:26
Music Composition Core public namespace.
Definition Version.h:4