11#include <promeki/config.h>
12#if PROMEKI_ENABLE_MUSIC
19PROMEKI_NAMESPACE_BEGIN
49 using MembershipMask = Array<int, 12>;
59 MusicalScale(
int rootPitchClass, Mode mode);
68 static Result<MusicalScale> fromName(
const String &name);
71 int rootPitchClass()
const {
return _rootPitchClass; }
74 Mode mode()
const {
return _mode; }
77 int degreesPerOctave()
const {
return static_cast<int>(_intervals.size()); }
85 float midiNoteForDegree(
int degree,
int octave)
const;
92 bool containsNote(
int midiNote)
const;
100 float constrainNote(
float midiNote,
float strength = 1.0f)
const;
107 static int pitchClassFromName(
const String &name);
114 static const char *pitchClassName(
int pitchClass);
123 static Result<Mode> modeFromName(
const String &name);
130 static const char *modeName(Mode mode);
137 static List<int> intervalsForMode(Mode mode);
144 static const MembershipMask &membershipMaskForMode(Mode mode);
147 int _rootPitchClass = 0;
148 Mode _mode = Chromatic;
149 List<int> _intervals;