Inicio do mapa
[Projeto-PCG.git] / acorde.cpp
bloba18fa141867f0350071daec07bd74d653cee6cea
1 #include "acorde.h"
3 Acorde::Acorde(std::string c): cifra(c) {
4 if (!valida())
5 return;
7 regoff_t i = parser[1].rm_so;
8 regoff_t l = parser[1].rm_eo;
9 raiz = new Nota(cifra.substr(i, l));
11 switch(numNotas) {
12 case 3:
13 triade(); break;
14 case 4:
15 tetrade(); break;
19 void Acorde::tetrade() {
20 regoff_t i = parser[2].rm_so;
21 regoff_t l = parser[2].rm_eo;
22 std::string tom = cifra.substr(i, l);
24 if (tom.size() == 0)
25 return;
26 switch(tom[0]) {
27 case '/':
28 maior();
29 if (tom.size() == 1)
30 acorde.push_back(SETIMA);
31 else
32 acorde.push_back(SETIMA_MAIOR);
33 break;
34 case '-':
35 menor();
36 if (tom.size() == 2)
37 acorde.push_back(SETIMA);
38 else
39 acorde.push_back(SETIMA_MAIOR);
40 break;
41 case '+':
42 aumentada();
43 if (tom.size() == 2)
44 acorde.push_back(SETIMA);
45 else
46 acorde.push_back(SETIMA_MAIOR);
47 break;
48 case '_':
49 diminuta();
50 if (tom.size() == 2)
51 acorde.push_back(SETIMA);
52 else
53 acorde.push_back(SETIMA_DIMINUTA);
54 break;
55 case 'm':
56 acorde.push_back(TERCEIRA_MAIOR);
57 acorde.push_back(QUINTA_DIMINUTA);
58 acorde.push_back(SETIMA);
59 break;
63 void Acorde::triade() {
64 regoff_t i = parser[2].rm_so;
65 if (i == -1) {
66 maior();
67 } else {
68 char tom = cifra[i];
69 switch(tom) {
70 case '-':
71 menor(); break;
72 case '+':
73 aumentada(); break;
74 case '_':
75 diminuta(); break;
80 void Acorde::diminuta() {
81 acorde.push_back(TERCEIRA_MENOR);
82 acorde.push_back(QUINTA_DIMINUTA);
85 void Acorde::aumentada() {
86 acorde.push_back(TERCEIRA_MAIOR);
87 acorde.push_back(QUINTA_AUMENTADA);
90 void Acorde::menor() {
91 acorde.push_back(TERCEIRA_MENOR);
92 acorde.push_back(QUINTA);
95 void Acorde::maior() {
96 acorde.push_back(TERCEIRA_MAIOR);
97 acorde.push_back(QUINTA);
100 bool Acorde::valida() {
101 regex_t reg;
103 regcomp(&reg, "^([A-G][#b]?)([-+_])?$", REG_EXTENDED);
104 if (regexec(&reg, cifra.c_str(), 3, parser, 0) == 0) {
105 numNotas = 3;
106 return true;
108 regfree(&reg);
110 regcomp(&reg, "^([A-G][#b]?)([-+]?/M?|_/m?|m5/)?7$", REG_EXTENDED);
111 if (regexec(&reg, cifra.c_str(), 3, parser, 0) == 0) {
112 numNotas = 4;
113 return true;
116 return false;
119 Nota* Acorde::getNota(byte n) {
120 return (n == 0) ? raiz : raiz->proximoTom(acorde[n]);
123 Nota** Acorde::getNotas() {
124 Nota** notas = new Nota*[numNotas];
125 notas[0] = raiz;
126 for (int i = 1; i < numNotas; ++i)
127 notas[i] = raiz->proximoTom(acorde[i-1]);
128 return notas;