MCC
Loading...
Searching...
No Matches
IntervalQuality.h
1#ifndef MCC_INTERVAL_INTERVAL_QUALITY_H
2#define MCC_INTERVAL_INTERVAL_QUALITY_H
3
4#include <MCC_BuildSettings.h>
5
6#include <stdint.h>
7
8namespace MCC {
9
14enum class IntervalQualityKind : uint8_t {
15 Diminished = 0,
16 Minor = 1,
17 Perfect = 2,
18 Major = 3,
19 Augmented = 4
20};
21
30class IntervalQuality {
31public:
33 static constexpr uint8_t MaximumCount = 4;
34
35private:
36 static constexpr uint8_t InvalidValue = 0xFF;
37
38 // Kind in the high bits, repetition count (1 for P/M/m) in the low bits.
39 uint8_t _value;
40
41 constexpr IntervalQuality(IntervalQualityKind kind, int32_t count) noexcept
42 : _value((count >= 1 && count <= MaximumCount)
43 ? static_cast<uint8_t>(
44 (static_cast<uint8_t>(kind) << 3) | static_cast<uint8_t>(count))
45 : InvalidValue) {}
46
47public:
49 constexpr IntervalQuality() noexcept : _value(InvalidValue) {}
50
52 static constexpr IntervalQuality Invalid() noexcept { return IntervalQuality(); }
53
55 static constexpr IntervalQuality Perfect() noexcept {
56 return IntervalQuality(IntervalQualityKind::Perfect, 1);
57 }
58
60 static constexpr IntervalQuality Major() noexcept {
61 return IntervalQuality(IntervalQualityKind::Major, 1);
62 }
63
65 static constexpr IntervalQuality Minor() noexcept {
66 return IntervalQuality(IntervalQualityKind::Minor, 1);
67 }
68
73 static constexpr IntervalQuality Augmented(int32_t count = 1) noexcept {
74 return IntervalQuality(IntervalQualityKind::Augmented, count);
75 }
76
81 static constexpr IntervalQuality Diminished(int32_t count = 1) noexcept {
82 return IntervalQuality(IntervalQualityKind::Diminished, count);
83 }
84
86 constexpr bool IsValid() const noexcept { return _value != InvalidValue; }
87
92 constexpr IntervalQualityKind Kind() const noexcept {
93 return IsValid()
94 ? static_cast<IntervalQualityKind>(_value >> 3)
95 : IntervalQualityKind::Perfect;
96 }
97
102 constexpr uint8_t Count() const noexcept {
103 return IsValid() ? static_cast<uint8_t>(_value & 0x07) : 0;
104 }
105
110 MCC_CONSTEXPR14 IntervalQuality Inverted() const noexcept {
111 if (!IsValid()) {
112 return Invalid();
113 }
114 switch (Kind()) {
115 case IntervalQualityKind::Major:
116 return Minor();
117 case IntervalQualityKind::Minor:
118 return Major();
119 case IntervalQualityKind::Augmented:
120 return Diminished(Count());
121 case IntervalQualityKind::Diminished:
122 return Augmented(Count());
123 case IntervalQualityKind::Perfect:
124 break;
125 }
126 return Perfect();
127 }
128
130 friend constexpr bool operator==(IntervalQuality a, IntervalQuality b) noexcept {
131 return a._value == b._value;
132 }
133
134 friend constexpr bool operator!=(IntervalQuality a, IntervalQuality b) noexcept {
135 return !(a == b);
136 }
137};
138
139} // namespace MCC
140
141#endif // MCC_INTERVAL_INTERVAL_QUALITY_H
Interval quality: perfect, major, minor, or augmented/diminished repeated one to four times (SPEC-INT...
Definition IntervalQuality.h:30
static constexpr IntervalQuality Augmented(int32_t count=1) noexcept
Returns the quality augmented count times; a count outside [1, 4] is invalid (SPEC-INT-4).
Definition IntervalQuality.h:73
friend constexpr bool operator==(IntervalQuality a, IntervalQuality b) noexcept
Equality; all invalid qualities are equal (SPEC-ERR-6).
Definition IntervalQuality.h:130
static constexpr IntervalQuality Minor() noexcept
Returns the minor quality.
Definition IntervalQuality.h:65
constexpr bool IsValid() const noexcept
Returns true unless this is the invalid quality.
Definition IntervalQuality.h:86
constexpr uint8_t Count() const noexcept
Returns how many times the quality is augmented or diminished, 1 for perfect, major and minor,...
Definition IntervalQuality.h:102
static constexpr IntervalQuality Invalid() noexcept
Returns the invalid quality.
Definition IntervalQuality.h:52
static constexpr uint8_t MaximumCount
Largest augmented or diminished repetition count.
Definition IntervalQuality.h:33
static constexpr IntervalQuality Perfect() noexcept
Returns the perfect quality.
Definition IntervalQuality.h:55
constexpr IntervalQualityKind Kind() const noexcept
Returns the kind, or Perfect for the invalid quality (SPEC-ERR-7).
Definition IntervalQuality.h:92
constexpr IntervalQuality() noexcept
Creates the invalid quality (SPEC-ERR-2).
Definition IntervalQuality.h:49
static constexpr IntervalQuality Diminished(int32_t count=1) noexcept
Returns the quality diminished count times; a count outside [1, 4] is invalid (SPEC-INT-4).
Definition IntervalQuality.h:81
static constexpr IntervalQuality Major() noexcept
Returns the major quality.
Definition IntervalQuality.h:60
MCC_CONSTEXPR14 IntervalQuality Inverted() const noexcept
Returns the quality of the inverted interval: major and minor, and augmented and diminished,...
Definition IntervalQuality.h:110
IntervalQualityKind
Kind of an interval quality.
Definition IntervalQuality.h:14
Music Composition Core public namespace.
Definition Version.h:4