]> git.notmuchmail.org Git - scherzo/blobdiff - scherzo.c
Don't put up "unknown chord" for a single note
[scherzo] / scherzo.c
index 7296280302ddbb53e3d4bff04d0a5176c6a92f1f..b6fda6f1d2288d6deb9c0546c3f08d1890ad7186 100644 (file)
--- 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" },
@@ -434,7 +453,7 @@ scherzo_analyze_chord (scherzo_t *scherzo)
        scherzo->chord = NULL;
     }
 
-    if (num_notes == 0)
+    if (num_notes <= 1)
        goto DONE;
 
     notes = talloc_array (local, analyzed_note_t, num_notes);
@@ -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;