J'ai commencé à écrire un programme en C ++ 11 qui analyserait les accords, les gammes et l'harmonie. Le plus gros problème que j'ai dans ma phase de conception, c'est que la note 'C' est une note, un type d'accord (Cmaj, Cmin, C7, etc.) et un type de clé (la clé de Cmajor, Cminor). Le même problème se pose avec les intervalles (3e mineur, 3e majeur).
J'utilise une classe de base, Token, qui est la classe de base pour tous les «symboles» du programme. donc par exemple:
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;
Comme vous pouvez le voir, créer toutes les classes dérivées (CMajorTriad, C, CMajorScale, CMajorKey, etc.) deviendrait rapidement ridiculement complexe, y compris toutes les autres notes, ainsi que les harmoniques. l'héritage multiple ne fonctionnerait pas, c'est-à-dire:
class C : public Note, Triad, Key, Scale
classe C, ne peut pas être toutes ces choses en même temps. Il est contextuel, polymorphiser avec cela ne fonctionnera pas (comment déterminer les super méthodes à exécuter? Appeler tous les constructeurs de super classes ne devrait pas se produire ici)
Y a-t-il des idées ou des suggestions de design que les gens ont à offrir? Je n'ai rien trouvé sur google en ce qui concerne la modélisation de l'harmonie tonale du point de vue OO. Il y a juste trop de relations entre tous les concepts ici.