From: Carl Worth Date: Tue, 24 Sep 2013 04:31:24 +0000 (-0700) Subject: Detect the root pitch of chord and display it X-Git-Url: https://git.cworth.org/git?p=scherzo;a=commitdiff_plain;h=eb54fc28865867d55c7b8057e6db617ae5d8fc46 Detect the root pitch of chord and display it One ugly thing here is that any accidental in the chord name is in a different font than the accidental on the stave. --- diff --git a/scherzo.c b/scherzo.c index 8c6d394..a7bd785 100644 --- a/scherzo.c +++ b/scherzo.c @@ -489,12 +489,13 @@ _chord_signature_matches (analyzed_note_t *notes, int num_notes, modified_degree_t *degrees, int num_degrees, - int *inversion_ret) + int *inversion_ret, + score_pitch_t *root) { #define MAX_DEGREES 4 int relative_pitches[MAX_DEGREES]; int inversion, max_inversions; - int i; + int i, root_index; assert (num_degrees <= MAX_DEGREES); @@ -525,6 +526,9 @@ _chord_signature_matches (analyzed_note_t *notes, if (notes[i].relative_pitch != relative_pitches[i]) goto NEXT_INVERSION; + root_index = (num_notes - inversion) % num_notes; + *root = notes[root_index].note->pitch; + *inversion_ret = inversion; return 1; @@ -536,6 +540,86 @@ _chord_signature_matches (analyzed_note_t *notes, return 0; } +static const char * +_pitch_str (score_pitch_t pitch) +{ + switch (pitch) { + case SCORE_PITCH_Cff: + return "C𝄫"; + case SCORE_PITCH_Cf: + return "C♭"; + case SCORE_PITCH_C: + return "C"; + case SCORE_PITCH_Cs: + return "C♯"; + case SCORE_PITCH_Css: + return "C𝄪"; + case SCORE_PITCH_Dff: + return "D𝄫"; + case SCORE_PITCH_Df: + return "D♭"; + case SCORE_PITCH_D: + return "D"; + case SCORE_PITCH_Ds: + return "D♯"; + case SCORE_PITCH_Dss: + return "D𝄪"; + case SCORE_PITCH_Eff: + return "E𝄫"; + case SCORE_PITCH_Ef: + return "E♭"; + case SCORE_PITCH_E: + return "E"; + case SCORE_PITCH_Es: + return "E♯"; + case SCORE_PITCH_Ess: + return "E𝄪"; + case SCORE_PITCH_Fff: + return "F𝄫"; + case SCORE_PITCH_Ff: + return "F♭"; + case SCORE_PITCH_F: + return "F"; + case SCORE_PITCH_Fs: + return "F♯"; + case SCORE_PITCH_Fss: + return "F𝄪"; + case SCORE_PITCH_Gff: + return "G𝄫"; + case SCORE_PITCH_Gf: + return "G♭"; + case SCORE_PITCH_G: + return "G"; + case SCORE_PITCH_Gs: + return "G♯"; + case SCORE_PITCH_Gss: + return "G𝄪"; + case SCORE_PITCH_Aff: + return "A𝄫"; + case SCORE_PITCH_Af: + return "A♭"; + case SCORE_PITCH_A: + return "A"; + case SCORE_PITCH_As: + return "A♯"; + case SCORE_PITCH_Ass: + return "A𝄪"; + case SCORE_PITCH_Bff: + return "B𝄫"; + case SCORE_PITCH_Bf: + return "B♭"; + case SCORE_PITCH_B: + return "B"; + case SCORE_PITCH_Bs: + return "B♯"; + case SCORE_PITCH_Bss: + return "B𝄪"; + } + + fprintf (stderr, "Internal error: Unknown pitch %d\n", pitch); + exit (1); +} + static void scherzo_analyze_chord (scherzo_t *scherzo) { @@ -544,6 +628,7 @@ scherzo_analyze_chord (scherzo_t *scherzo) note_group_t *note_group; unsigned i, j, num_notes; int bass_pitch, inversion; + score_pitch_t root; const char *chord_name = NULL; if (scherzo->pedal_pressed) @@ -656,7 +741,8 @@ scherzo_analyze_chord (scherzo_t *scherzo) case 1: for (i = 0; i < ARRAY_SIZE (octaves); i++) { if (_chord_signature_matches (notes, num_notes, - octaves[i].degrees, 1, &inversion)) + octaves[i].degrees, 1, + &inversion, &root)) { chord_name = octaves[i].name; break; @@ -666,7 +752,8 @@ scherzo_analyze_chord (scherzo_t *scherzo) case 2: for (i = 0; i < ARRAY_SIZE (intervals); i++) { if (_chord_signature_matches (notes, num_notes, - intervals[i].degrees, 2, &inversion)) + intervals[i].degrees, 2, + &inversion, &root)) { chord_name = intervals[i].name; break; @@ -676,7 +763,8 @@ scherzo_analyze_chord (scherzo_t *scherzo) case 3: for (i = 0; i < ARRAY_SIZE (triads); i++) { if (_chord_signature_matches (notes, num_notes, - triads[i].degrees, 3, &inversion)) + triads[i].degrees, 3, + &inversion, &root)) { chord_name = triads[i].name; break; @@ -686,7 +774,8 @@ scherzo_analyze_chord (scherzo_t *scherzo) case 4: for (i = 0; i < ARRAY_SIZE(sevenths); i++) { if (_chord_signature_matches (notes, num_notes, - sevenths[i].degrees, 4, &inversion)) + sevenths[i].degrees, 4, + &inversion, &root)) { chord_name = sevenths[i].name; break; @@ -713,10 +802,13 @@ scherzo_analyze_chord (scherzo_t *scherzo) inversion); exit(1); } - chord_name = talloc_asprintf (local, "%s %s", + chord_name = talloc_asprintf (local, "%s %s %s", + _pitch_str (root), chord_name, inversion_str); } else { - chord_name = talloc_strdup (local, chord_name); + chord_name = talloc_asprintf (local, "%s %s", + _pitch_str (root), + chord_name); } } else { chord_name = talloc_strdup (local, "Unknown chord");