Я почав писати програму на C ++ 11, яка б аналізувала акорди, масштаби та гармонію. Найбільшою проблемою, що виникає у мене на етапі проектування, є те, що нота "C" - це нота, тип акорду (Cmaj, Cmin, C7 тощо) та тип клавіші (ключ Cmajor, Cminor). Це ж питання виникає з інтервалами (другорядний 3-й, основний 3-й).
Я використовую базовий клас Token, який є базовим класом для всіх «символів» у програмі. так наприклад:
class Token {
public:
typedef shared_ptr<Token> pointer_type;
Token() {}
virtual ~Token() {}
};
class Command : public Token {
public:
Command() {}
pointer_type execute();
}
class Note : public Token;
class Triad : public Token; class MajorTriad : public Triad; // CMajorTriad, etc
class Key : public Token; class MinorKey : public Key; // Natural Minor, Harmonic minor,etc
class Scale : public Token;
Як бачимо, створення всіх похідних класів (CMajorTriad, C, CMajorScale, CMajorKey тощо) швидко стало б смішно складним, включаючи всі інші нотатки, а також енгармоніки. багаторазове успадкування не буде працювати, тобто:
class C : public Note, Triad, Key, Scale
клас C, не можуть бути всі ці речі одночасно. Це контекстуально, також поліморфінг з цим не спрацює (як визначити, які супер методи виконувати? Виклик усіх конструкторів суперкласу тут не повинен відбуватися)
Чи є якісь дизайнерські ідеї чи пропозиції, які люди можуть запропонувати? Мені не вдалося знайти нічого в Google щодо моделювання тональної гармонії з точки зору ОО. Тут існує дуже багато взаємозв'язків між усіма поняттями.