Empecé a escribir un programa en C ++ 11 que analizaría acordes, escalas y armonía. El mayor problema que tengo en mi fase de diseño es que la nota 'C' es una nota, un tipo de acorde (Cmaj, Cmin, C7, etc.) y un tipo de clave (la clave de Cmajor, Cminor). El mismo problema surge con los intervalos (3er menor, 3er mayor).
Estoy usando una clase base, Token, que es la clase base para todos los 'símbolos' en el programa. así por ejemplo:
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 puede ver, crear todas las clases derivadas (CMajorTriad, C, CMajorScale, CMajorKey, etc.) rápidamente se volvería ridículamente complejo, incluidas todas las otras notas, así como la enarmonía. la herencia múltiple no funcionaría, es decir:
class C : public Note, Triad, Key, Scale
clase C, no pueden ser todas estas cosas al mismo tiempo. Es contextual, también polimorfizar con esto no funcionará (¿cómo determinar qué súper métodos realizar? Llamar a todos los constructores de súper clases no debería suceder aquí)
¿Hay alguna idea de diseño o sugerencia que la gente tenga para ofrecer? No he podido encontrar nada en Google con respecto al modelado de la armonía tonal desde una perspectiva OO. Hay demasiadas relaciones entre todos los conceptos aquí.