22 #ifndef ChordCorrelator_hxx
23 #define ChordCorrelator_hxx
46 static const char *
PitchNames[] = {
"G",
"G#",
"A",
"A#",
"B",
"C",
"C#",
"D",
"D#",
"E",
"F",
"F#"};
47 return PitchNames[index];
49 enum Pitch {
G,
Ab,
A,
Bb,
B,
C,
Db,
D,
Eb,
E,
F,
Gb};
51 typedef std::vector<double>
PCP;
65 {{1,1,1,1,1,1,1,1,1,1,1,1},
"None", 1},
66 {{1,0,0,0,1,0,0,1,0,0,0,0},
"Major", 12},
67 {{1,0,0,1,0,0,0,1,0,0,0,0},
"Minor", 12},
68 {{1,0,0,0,1,0,0,1,0,0,0,1},
"Major7", 12},
69 {{1,0,0,0,1,0,0,1,0,0,1,0},
"Dominant7", 12},
70 {{1,0,0,1,0,0,0,1,0,0,0,1},
"MinorMajor7",12},
71 {{1,0,0,1,0,0,0,1,0,0,1,0},
"Minor7", 12},
77 {{1,0,0,0,1,0,0,0,1,0,0,0},
"Augmented", 4},
78 {{1,0,0,1,0,0,1,0,0,0,0,0},
"Diminished", 12},
79 {{1,0,0,1,0,0,1,0,0,0,1,0},
"Diminished7",12},
81 {{0,0,0,0,0,0,0,0,0,0,0,0}, 0, 0}
98 _chordModeNames.push_back(modePatterns[
mode].name);
99 double * basePattern = modePatterns[
mode].pattern;
100 double normalizationFactor = 0.0;
101 for (
unsigned i = 0; i<12; i++)
102 normalizationFactor += basePattern[i];
110 for (
unsigned i=
root; i<12; i++)
112 for (
unsigned i=0; i<
root; i++)
113 pattern.
pattern[i] = basePattern[12+i-root];
114 _chordPatterns.push_back(pattern);
117 for (
unsigned i=0; i<_chordPatterns.size(); i++)
119 std::vector<double> singleRow;
120 for (
unsigned j=0; j<_chordPatterns.size(); j++)
122 double chordPatternCorrelation = 0;
123 for (
unsigned k=0; k<12; k++)
125 chordPatternCorrelation += (_chordPatterns[i].pattern[k] * _chordPatterns[j].pattern[k]);
127 chordPatternCorrelation /= (_chordPatterns[i].normalization + _chordPatterns[j].normalization) / 2.0;
128 singleRow.push_back(chordPatternCorrelation);
131 _chordPatternsSimilarity.push_back(singleRow);
133 _output.resize(_chordPatterns.size());
137 for (
unsigned pattern=0; pattern<_chordPatterns.size(); pattern++)
139 for (
unsigned i=0; i<12; i++)
140 os << _chordPatterns[pattern].pattern[i] <<
" ";
141 os << _chordPatterns[pattern].normalization <<
" ";
143 os << _chordModeNames[_chordPatterns[pattern].mode] <<
"\n";
146 std::string
root(
unsigned chordIndex)
const
150 std::string
mode(
unsigned chordIndex)
const
152 return _chordModeNames[_chordPatterns[chordIndex].mode];
156 std::ostringstream os;
158 os << _chordModeNames[_chordPatterns[chordIndex].mode];
163 return _chordPatternsSimilarity;
170 for (
unsigned int i=0; i<_chordPatterns.size(); i++)
173 double * chordPattern = _chordPatterns[i].pattern;
174 for (
unsigned pitch=0; pitch<12; pitch++)
176 _output[i]+= chordPattern[pitch] * pcp[pitch];
178 _output[i]/=_chordPatterns[i].normalization;
181 const std::vector<double> &
output()
const
186 std::vector<ChordPattern> _chordPatterns;
187 std::vector< std::vector<double> > _chordPatternsSimilarity;
188 std::vector<std::string> _chordModeNames;
194 #endif// ChordCorrelator_hxx