MCC
Loading...
Searching...
No Matches
IntervalNumber.h
1#ifndef MCC_INTERVAL_INTERVAL_NUMBER_H
2#define MCC_INTERVAL_INTERVAL_NUMBER_H
3
4#include <MCC_BuildSettings.h>
5
6#include <stdint.h>
7
8namespace MCC {
9
20public:
22 static constexpr uint16_t Maximum = 1792;
23
28 static constexpr uint16_t InvalidValue = 0xFFFF;
29
30private:
31 uint16_t _value;
32
33public:
35 constexpr IntervalNumber() noexcept : _value(InvalidValue) {}
36
41 constexpr explicit IntervalNumber(int32_t value) noexcept
42 : _value((value >= 1 && value <= Maximum)
43 ? static_cast<uint16_t>(value)
44 : InvalidValue) {}
45
47 static constexpr IntervalNumber Invalid() noexcept { return IntervalNumber(); }
48
50 constexpr bool IsValid() const noexcept { return _value != InvalidValue; }
51
53 constexpr uint16_t Value() const noexcept { return _value; }
54
56 constexpr bool IsSimple() const noexcept { return IsValid() && _value <= 8; }
57
59 constexpr bool IsCompound() const noexcept { return IsValid() && _value > 8; }
60
66 MCC_CONSTEXPR14 IntervalNumber Simple() const noexcept {
67 if (!IsValid() || _value <= 8) {
68 return *this;
69 }
70 return IntervalNumber((_value - 2) % 7 + 2);
71 }
72
77 MCC_CONSTEXPR14 bool IsPerfectType() const noexcept {
78 const uint16_t simple = Simple().Value();
79 return simple == 1 || simple == 4 || simple == 5 || simple == 8;
80 }
81
86 MCC_CONSTEXPR14 IntervalNumber Inverted() const noexcept {
87 if (!IsValid()) {
88 return Invalid();
89 }
90 return IntervalNumber(9 - Simple().Value());
91 }
92
94 friend constexpr bool operator==(IntervalNumber a, IntervalNumber b) noexcept {
95 return a._value == b._value;
96 }
97
98 friend constexpr bool operator!=(IntervalNumber a, IntervalNumber b) noexcept {
99 return !(a == b);
100 }
101
103 friend constexpr bool operator<(IntervalNumber a, IntervalNumber b) noexcept {
104 return a._value < b._value;
105 }
106};
107
108} // namespace MCC
109
110#endif // MCC_INTERVAL_INTERVAL_NUMBER_H
1-based interval number: 1 unison, 3 third, 8 octave, 10 tenth (SPEC-INT-2, SPEC-INT-3).
Definition IntervalNumber.h:19
constexpr bool IsSimple() const noexcept
Returns true for numbers 1-8 (SPEC-INT-3).
Definition IntervalNumber.h:56
static constexpr uint16_t Maximum
Widest number: Cbbbb-128 to B####127 spans 1791 steps.
Definition IntervalNumber.h:22
constexpr bool IsCompound() const noexcept
Returns true for numbers above 8 (SPEC-INT-3).
Definition IntervalNumber.h:59
static constexpr IntervalNumber Invalid() noexcept
Returns the invalid number.
Definition IntervalNumber.h:47
constexpr IntervalNumber() noexcept
Creates the invalid number (SPEC-ERR-2).
Definition IntervalNumber.h:35
constexpr IntervalNumber(int32_t value) noexcept
Creates the number value; values outside [1, Maximum] produce the invalid number (SPEC-ERR-3).
Definition IntervalNumber.h:41
friend constexpr bool operator==(IntervalNumber a, IntervalNumber b) noexcept
Equality; all invalid numbers are equal (SPEC-ERR-6).
Definition IntervalNumber.h:94
MCC_CONSTEXPR14 bool IsPerfectType() const noexcept
Returns true when the simple number is a unison, fourth, fifth or octave, which take perfect qualitie...
Definition IntervalNumber.h:77
static constexpr uint16_t InvalidValue
Sentinel returned by Value() for the invalid number (SPEC-ERR-7). Do not rely on it; check IsValid().
Definition IntervalNumber.h:28
MCC_CONSTEXPR14 IntervalNumber Inverted() const noexcept
Returns the inverted simple number, 9 - Simple() (SPEC-INT-6).
Definition IntervalNumber.h:86
constexpr uint16_t Value() const noexcept
Returns the number, or InvalidValue (SPEC-ERR-7).
Definition IntervalNumber.h:53
constexpr bool IsValid() const noexcept
Returns true unless this is the invalid number.
Definition IntervalNumber.h:50
MCC_CONSTEXPR14 IntervalNumber Simple() const noexcept
Returns the simple number obtained by removing octaves (SPEC-INT-3): 9 -> 2, 10 -> 3,...
Definition IntervalNumber.h:66
friend constexpr bool operator<(IntervalNumber a, IntervalNumber b) noexcept
Orders by value; the invalid number sorts last.
Definition IntervalNumber.h:103
Music Composition Core public namespace.
Definition Version.h:4