From 0e2eb38551790f6c5f920cf99da6b486e29dd0e8 Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Tue, 17 Sep 2013 16:02:21 -0700 Subject: [PATCH] Add recognition of intervals. This is quite easy with the same machinery as the chord recognition. --- scherzo.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/scherzo.c b/scherzo.c index 7296280..4914898 100644 --- a/scherzo.c +++ b/scherzo.c @@ -398,6 +398,11 @@ _chord_signature_matches (analyzed_note_t *notes, } } + /* If there are fewer notes in the signature than in the chord, + * then there is no match. */ + if (n < num_notes) + return 0; + return 1; } @@ -410,6 +415,20 @@ scherzo_analyze_chord (scherzo_t *scherzo) int bass_pitch; const char *chord_name = NULL; + struct { int pitches[2]; const char *name; } intervals[] = { + { {0, 1}, "Minor 2nd"}, + { {0, 2}, "Major 2nd"}, + { {0, 3}, "Minor 3rd"}, + { {0, 4}, "Major 3rd"}, + { {0, 5}, "Perfect 4th"}, + { {0, 6}, "Diminished 5th/Augmented 4th"}, + { {0, 7}, "Perfect 5th"}, + { {0, 8}, "Minor 6th"}, + { {0, 9}, "Major 6th"}, + { {0, 10}, "Minor 7th"}, + { {0, 11}, "Major 7th"} + }; + struct { int pitches[3]; const char *name; } triads[] = { { {0, 4, 8}, "Augmented triad" }, { {0, 4, 7}, "Major triad" }, @@ -458,6 +477,11 @@ scherzo_analyze_chord (scherzo_t *scherzo) notes[i].relative_pitch = notes[i].midi_pitch - bass_pitch; } + for (i = 0; i < ARRAY_SIZE (intervals); i++) { + if (_chord_signature_matches (notes, num_notes, intervals[i].pitches, 2)) + chord_name = intervals[i].name; + } + for (i = 0; i < ARRAY_SIZE (triads); i++) { if (_chord_signature_matches (notes, num_notes, triads[i].pitches, 3)) chord_name = triads[i].name; -- 2.43.0