예제 #1
0
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;
		}		
	}
}
예제 #2
0
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;
}
예제 #3
0
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;
}