libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
musicalscale.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_MUSIC
13#include <promeki/string.h>
14#include <promeki/list.h>
15#include <promeki/array.h>
16#include <promeki/error.h>
17#include <promeki/result.h>
18
19PROMEKI_NAMESPACE_BEGIN
20
30class MusicalScale {
31 public:
33 enum Mode {
34 Chromatic,
35 Major,
36 NaturalMinor,
37 HarmonicMinor,
38 MelodicMinor,
39 Pentatonic,
40 Blues
41 };
42
49 using MembershipMask = Array<int, 12>;
50
52 MusicalScale();
53
59 MusicalScale(int rootPitchClass, Mode mode);
60
68 static Result<MusicalScale> fromName(const String &name);
69
71 int rootPitchClass() const { return _rootPitchClass; }
72
74 Mode mode() const { return _mode; }
75
77 int degreesPerOctave() const { return static_cast<int>(_intervals.size()); }
78
85 float midiNoteForDegree(int degree, int octave) const;
86
92 bool containsNote(int midiNote) const;
93
100 float constrainNote(float midiNote, float strength = 1.0f) const;
101
107 static int pitchClassFromName(const String &name);
108
114 static const char *pitchClassName(int pitchClass);
115
123 static Result<Mode> modeFromName(const String &name);
124
130 static const char *modeName(Mode mode);
131
137 static List<int> intervalsForMode(Mode mode);
138
144 static const MembershipMask &membershipMaskForMode(Mode mode);
145
146 private:
147 int _rootPitchClass = 0;
148 Mode _mode = Chromatic;
149 List<int> _intervals;
150};
151
152PROMEKI_NAMESPACE_END
153
154#endif // PROMEKI_ENABLE_MUSIC