X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=scherzo.c;h=d7f78fdf6f372ba4b94d5020deeaba4547bea5e7;hb=ce792186e7f6f467c7122a7ea423d2193a30569a;hp=0b0a97f77e9ed2049f82422d1069300525e0fa39;hpb=1cfc79bb867bfa72e9982b79a65bd353bd120ee9;p=scherzo diff --git a/scherzo.c b/scherzo.c index 0b0a97f..d7f78fd 100644 --- a/scherzo.c +++ b/scherzo.c @@ -428,25 +428,13 @@ _chord_signature_matches (analyzed_note_t *notes, 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; @@ -458,7 +446,7 @@ scherzo_analyze_chord (scherzo_t *scherzo) 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; @@ -496,14 +484,14 @@ scherzo_analyze_chord (scherzo_t *scherzo) struct { int pitches[4]; const char *name; } sevenths[] = { { {0, 4, 8, 11}, "Augmented/major 7" }, + { {0, 4, 8, 10}, "Augmented 7" }, { {0, 4, 7, 11}, "Major 7" }, { {0, 4, 7, 10}, "Dominant 7" }, { {0, 3, 7, 11}, "Minor/major 7" }, { {0, 3, 7, 10}, "Minor 7" }, - { {0, 3, 6, 10}, "Half-diminished 7" }, - { {0, 3, 6, 9}, "Diminished 7" }, - { {0, 4, 8, 10}, "Augmented 7" }, { {0, 3, 6, 11}, "Diminished/major 7" }, + { {0, 3, 6, 10}, "Half-diminished 7" }, + { {0, 3, 6, 9}, "Diminished 7" } }; if (scherzo->chord) { @@ -544,6 +532,30 @@ scherzo_analyze_chord (scherzo_t *scherzo) 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; @@ -585,6 +597,17 @@ note_group_init (void *ctx, note_group_t *group) static void note_group_add_note (note_group_t *group, score_note_t *note) { + int i; + + /* Do nothing if note is already in group. */ + for (i = 0; i < group->num_notes; i++) { + if (group->notes[i]->pitch == note->pitch && + group->notes[i]->octave == note->octave) + { + return; + } + } + group->num_notes++; if (group->num_notes > group->size) {