Line data Source code
1 : #pragma once
2 :
3 : #include "Intervals.hpp"
4 : #include <Def/Def.hpp>
5 :
6 : BEGIN_CS_NAMESPACE
7 :
8 : class IChord {
9 : public:
10 7774 : virtual ~IChord() = default;
11 : virtual const int8_t *begin() const = 0;
12 : virtual const int8_t *end() const = 0;
13 : };
14 :
15 : template <uint8_t N>
16 : class Chord : public IChord {
17 : public:
18 7774 : Chord(const Array<int8_t, N> &offsets) : offsets(offsets) {}
19 0 : const int8_t *begin() const override { return offsets.begin(); }
20 0 : const int8_t *end() const override { return offsets.end(); }
21 :
22 : template <uint8_t M>
23 : Chord<N + M> operator+(const Chord<M> &rhs) const {
24 : return {cat(this->getOffsets(), rhs.getOffsets())};
25 : }
26 :
27 : Chord<N + 1> operator+(int8_t rhs) const {
28 : return *this + Chord<1> {{rhs}};
29 : }
30 :
31 : const Array<int8_t, N> getOffsets() const { return offsets; }
32 :
33 : private:
34 : Array<int8_t, N> offsets;
35 : };
36 :
37 : /// @addtogroup MIDIConstants
38 : /// @{
39 :
40 : /// Predefined Chord constants.
41 : namespace Chords {
42 :
43 : using namespace Intervals;
44 :
45 : const Chord<2> Major = {{M3, P5}};
46 : const Chord<2> MajorFirstInv = {{M3, P5 - P8}}; // First inversion
47 : const Chord<2> MajorSecondInv = {{M3 - P8, P5 - P8}}; // Second inversion
48 :
49 : const Chord<2> Minor = {{m3, P5}};
50 : const Chord<2> MinorFirstInv = {{m3, P5 - P8}};
51 : const Chord<2> MinorSecondInv = {{m3 - P8, P5 - P8}};
52 :
53 : const Chord<2> Diminished = {{m3, d5}};
54 : const Chord<2> Augmented = {{m3, m6}};
55 :
56 : const Chord<3> DominantSeventh = {{M3, P5, m7}};
57 : const Chord<3> MajorSeventh = {{M3, P5, M7}};
58 :
59 : } // namespace Chords
60 :
61 : /// Predefined Chord constants with bass notes.
62 : namespace Bass {
63 :
64 : using namespace Intervals;
65 :
66 : const Chord<1> Single = {{-P8}};
67 : const Chord<2> Double = {{-P8, -2 * P8}};
68 : const Chord<3> Triple = {{-P8, -2 * P8, -3 * P8}};
69 :
70 : } // namespace Bass
71 :
72 : /// @}
73 :
74 : END_CS_NAMESPACE
|