Merge branch 'master' of git@github.com:andreferreira/Projeto-PCG
[Projeto-PCG.git] / nota.cpp
blob5105274652f096bdc61104e7489e537823b380a0
1 #include "nota.h"
3 void Nota::setNome(char t) {
4 if (t >= 'A' && t <= 'G')
5 nome = t;
8 void Nota::setSemitom(char st) {
9 switch(st) {
10 case ' ':
11 semitom = normal; break;
12 case 'b':
13 semitom = bemol; break;
14 case '#':
15 semitom = sustenido; break;
19 Nota::Nota(byte midi): diatonica("C D EF G A B") {
20 oitava = (midi / 12) - 1;
21 int tom = midi % 12;
22 if (diatonica[tom] != ' ') {
23 nome = diatonica[tom];
24 semitom = normal;
25 } else {
26 nome = diatonica[tom-1];
27 semitom = sustenido;
31 Nota::Nota(std::string nota): diatonica("C D EF G A B"), oitava(4) {
32 switch(nota.size()) {
33 case 1:
34 setSemitom(' '); break;
35 case 2:
36 setSemitom(nota[1]); break;
38 setNome(nota[0]);
41 int Nota::indiceDiatonica() {
42 int i = diatonica.find(nome);
43 byte B = 11;
44 byte C = 0;
46 switch(semitom) {
47 case bemol:
48 return (nome != 'C') ? i-1 : B; // Cb = B
49 case sustenido:
50 return (nome != 'B') ? i+1 : C; // B# = C
51 default:
52 return i;
56 int Nota::midiOitava() {
57 return 12*(oitava+1);
60 byte Nota::toMidi() {
61 return (byte)(midiOitava() + indiceDiatonica());
64 Nota* Nota::proximoTom(byte dif) {
65 int novoIndice = (indiceDiatonica()+dif) % 12;
66 return new Nota((byte)(midiOitava()+novoIndice));
69 bool Nota::operator==(const Nota& n) {
70 return toMidi() == ((Nota) n).toMidi();