Я начал писать программу на C ++ 11, которая будет анализировать аккорды, гаммы и гармонию. Самая большая проблема, с которой я сталкиваюсь на этапе разработки, заключается в том, что нота «C» - это нота, тип аккорда (Cmaj, Cmin, C7 и т. Д.) И тип ключа (ключ Cmajor, Cminor). Та же проблема возникает с интервалами (второстепенный третий, крупный третий).
Я использую базовый класс 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
класс С, не может быть все эти вещи одновременно. Это контекстно, также полиморфирование с этим не будет работать (как определить, какие супер-методы нужно выполнить? Вызов всех конструкторов суперкласса не должен происходить здесь)
Есть ли какие-нибудь дизайнерские идеи или предложения, которые люди могут предложить? Я не смог найти что-либо на Google в отношении моделирования тональной гармонии с точки зрения ОО. Здесь слишком много связей между всеми понятиями.