int *signature_pitches,
int num_signature_pitches)
{
- int n, s;
+ int i;
- for (n = 0, s = 0; s < num_signature_pitches; s++) {
- if (n >= num_notes)
- return 0;
- if (notes[n].relative_pitch != signature_pitches[s])
+ if (num_notes != num_signature_pitches)
return 0;
- n++;
- /* Skip repeated notes in chord being tested. */
- while (n < num_notes &&
- notes[n].relative_pitch == signature_pitches[s])
- {
- n++;
- }
- }
- /* If there are fewer notes in the signature than in the chord,
- * then there is no match. */
- if (n < num_notes)
+ for (i = 0; i < num_notes; i++)
+ if (notes[i].relative_pitch != signature_pitches[i])
return 0;
return 1;
void *local = talloc_new (NULL);
analyzed_note_t *notes;
note_group_t *note_group;
- unsigned i, num_notes;
+ unsigned i, j, num_notes;
int bass_pitch;
const char *chord_name = NULL;
qsort (notes, num_notes, sizeof (analyzed_note_t),
_compare_analyzed_note_by_relative_pitch);
+ /* Finally, eliminate all duplicate notes. */
+ for (i = 0; i < num_notes - 1; i++) {
+ if (notes[i+1].relative_pitch == notes[i].relative_pitch) {
+ j = i+1;
+ while (j < num_notes &&
+ notes[j].relative_pitch == notes[i].relative_pitch)
+ {
+ j++;
+ }
+ /* The loop incremented j one past the last
+ * duplicate. Decrement so that it points to the
+ * last duplicate (and is guaranteed to not exceed
+ * the array bounds).*/
+ j--;
+
+ if (j < num_notes - 1) {
+ memmove (¬es[i+1], ¬es[j+1],
+ (num_notes - j) * sizeof (analyzed_note_t));
+ }
+
+ num_notes -= (j - i);
+ }
+ }
+
for (i = 0; i < ARRAY_SIZE (octaves); i++) {
if (_chord_signature_matches (notes, num_notes, octaves[i].pitches, 1))
chord_name = octaves[i].name;