Comecei a escrever um programa em C ++ 11 que analisaria acordes, escalas e harmonia. O maior problema que estou tendo na minha fase de design é que a nota 'C' é uma nota, um tipo de acorde (Cmaj, Cmin, C7, etc) e um tipo de chave (a chave de Cmajor, Cminor). O mesmo problema surge com intervalos (terceiro menor, terceiro maior).
Estou usando uma classe base, Token, que é a classe base para todos os 'símbolos' no programa. por exemplo:
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;
Como você pode ver, criar todas as classes derivadas (CMajorTriad, C, CMajorScale, CMajorKey etc.) rapidamente se tornaria ridiculamente complexa, incluindo todas as outras notas, além de enarmônicos. herança múltipla não funcionaria, ou seja:
class C : public Note, Triad, Key, Scale
classe C, não pode ser todas essas coisas ao mesmo tempo. É contextual, também polimorfismo com isso não funcionará (como determinar quais super métodos a serem executados? Chamar todos os construtores de superclasses não deve acontecer aqui)
Existem idéias ou sugestões de design que as pessoas têm a oferecer? Não consegui encontrar nada no google com relação à modelagem da harmonia tonal de uma perspectiva OO. Existem relações demais entre todos os conceitos aqui.