int generator::getNoteFrequencyByIndex(const Chord& tonicChord, int index){ // 1-indexation here int octave = 0; while (index < 1){ octave--; index += 7; } while (index > 7){ octave++; index -= 7; } int baseFrequency = tonicChord.getNote().getFrequency() + octave * 12; // FixMe: do not use switches for this //later if (tonicChord.getMode() == MAJOR){ switch(index){ case 1: return baseFrequency + 0; case 2: return baseFrequency + 2; case 3: return baseFrequency + 4; case 4: return baseFrequency + 5; case 5: return baseFrequency + 7; case 6: return baseFrequency + 9; case 7: return baseFrequency + 11; default: return baseFrequency + 12; } } else { switch(index){ case 1: return baseFrequency + 0; case 2: return baseFrequency + 2; case 3: return baseFrequency + 3; case 4: return baseFrequency + 5; case 5: return baseFrequency + 7; case 6: return baseFrequency + 8; case 7: return baseFrequency + 10; default: return baseFrequency + 12; } } }
vector<pair<Chord, double> > Generator1::generateChords(const Chord& tonicChord) const{ /* Each element of vector<pair<Chord, double>> is a pair of a Chord and its appearance time */ vector<pair<Chord, double> > chords; int tonicFrequency = tonicChord.getNote().getFrequency(); srand(time(NULL)); int count = 1 << (rand() % 2 + 1); // FixMe: too complicated //ur mom is too complicated double chordLength = basicChordLength; vector<Chord> combo; combo.push_back(Chord(getNoteFrequencyByIndex(tonicChord, 1), MINOR)); combo.push_back(Chord(getNoteFrequencyByIndex(tonicChord, -1), MAJOR)); combo.push_back(Chord(getNoteFrequencyByIndex(tonicChord, 3), MAJOR)); combo.push_back(Chord(getNoteFrequencyByIndex(tonicChord, 7), MAJOR)); for (int i = 0; i < count; i++){ for (int j = 0; j < combo.size(); j++){ chords.push_back(make_pair(combo[j], (combo.size() * i + j) * chordLength)); } } return chords; }
vector<pair<Chord, double> > Generator2::generateChords(const Chord& tonicChord) const{ /* Each element of vector<pair<Chord, double>> is a pair of a Chord and its appearance time */ vector<pair<Chord, double> > chords; srand(time(NULL)); int tonicFrequency = tonicChord.getNote().getFrequency(); pair<Mode, int> currentChord(MINOR, 1); auto nextChord = [&](){ if (currentChord.first == MINOR){ switch ((currentChord.second + 7) % 7){ case 1: currentChord = randElement(vector<pair<Mode, int>>{make_pair(MAJOR, -1), make_pair(MAJOR, 3)}); break; case 2: currentChord = randElement(vector<pair<Mode, int>>{}); break; case 3: currentChord = randElement(vector<pair<Mode, int>>{}); break; case 4: currentChord = randElement(vector<pair<Mode, int>>{make_pair(MAJOR, 5)}); break; case 5: currentChord = randElement(vector<pair<Mode, int>>{make_pair(MINOR, 1)}); break; case 6: currentChord = randElement(vector<pair<Mode, int>>{}); break; default: currentChord = randElement(vector<pair<Mode, int>>{}); break; } } else { switch ((currentChord.second + 7) % 7){ case 1: currentChord = randElement(vector<pair<Mode, int>>{}); break; case 2: currentChord = randElement(vector<pair<Mode, int>>{}); break; case 3: currentChord = randElement(vector<pair<Mode, int>>{make_pair(MAJOR, 6), make_pair(MAJOR, 5)}); break; case 4: currentChord = randElement(vector<pair<Mode, int>>{}); break; case 5: currentChord = randElement(vector<pair<Mode, int>>{make_pair(MINOR, 1)}); break; case 6: currentChord = randElement(vector<pair<Mode, int>>{make_pair(MAJOR, 3), make_pair(MAJOR, 7)}); break; default: currentChord = randElement(vector<pair<Mode, int>>{make_pair(MAJOR, 3), make_pair(MAJOR, 6)}); break; } } }; int countOfChords = 1 << 3; for (int i = 0; i < countOfChords - 1; i++){ chords.push_back(make_pair(Chord(getNoteFrequencyByIndex(tonicChord, currentChord.second), currentChord.first), basicChordLength * i)); nextChord(); } chords.push_back(make_pair(tonicChord, basicChordLength * (countOfChords - 1))); return chords; }