]> git.cworth.org Git - scherzo/blobdiff - score.c
Move key-signature code to new scherzo-key.c and scherzo-key.h
[scherzo] / score.c
diff --git a/score.c b/score.c
index e93042a0b2dd435db07f3ba89acf69334552d695..690a9d27f3b30437a07efc76047a7c6d6e620582 100644 (file)
--- a/score.c
+++ b/score.c
@@ -64,16 +64,6 @@ typedef struct score_brace
     int num_staves;
 } score_brace_t;
 
-typedef struct score_key
-{
-    /* Pitch class (diatonic) */
-    pitch_t pitch;
-
-    /* Number of sharps/flats in key (if any) */
-    int num_sharps;
-    int num_flats;
-} score_key_t;
-
 struct score
 {
     /* Nominal height of a single staff (ledger lines may make it larger) */
@@ -89,7 +79,7 @@ struct score
     int width;
 
     /* Current (diatonic) key */
-    score_key_t key;
+    scherzo_key_t key;
 
     score_brace_t **braces;
     int num_braces;
@@ -150,114 +140,9 @@ score_set_width (score_t *score, int width)
 void
 score_set_key (score_t *score, pitch_t key)
 {
-    int i;
-
-    pitch_t sharp_keys[] = {
-       PITCH_CLASS_LITERAL (C, NATURAL),
-       PITCH_CLASS_LITERAL (G, NATURAL),
-       PITCH_CLASS_LITERAL (D, NATURAL),
-       PITCH_CLASS_LITERAL (A, NATURAL),
-       PITCH_CLASS_LITERAL (E, NATURAL),
-       PITCH_CLASS_LITERAL (B, NATURAL),
-       PITCH_CLASS_LITERAL (F, SHARP),
-       PITCH_CLASS_LITERAL (C, SHARP),
-    };
-
-    pitch_t flat_keys[] = {
-       PITCH_CLASS_LITERAL (C, NATURAL),
-       PITCH_CLASS_LITERAL (F, NATURAL),
-       PITCH_CLASS_LITERAL (B, FLAT),
-       PITCH_CLASS_LITERAL (E, FLAT),
-       PITCH_CLASS_LITERAL (A, FLAT),
-       PITCH_CLASS_LITERAL (D, FLAT),
-       PITCH_CLASS_LITERAL (G, FLAT),
-       PITCH_CLASS_LITERAL (C, FLAT)
-    };
-
-    score->key.pitch = PITCH_CLASS (PITCH_NAME (key), PITCH_ACCIDENTAL (key));
-
-    score->key.num_sharps = 0;
-    for (i = 0; i < ARRAY_SIZE (sharp_keys); i++)
-       if (sharp_keys[i] == score->key.pitch)
-           score->key.num_sharps = i;
-
-    score->key.num_flats = 0;
-    for (i = 0; i < ARRAY_SIZE (flat_keys); i++)
-       if (flat_keys[i] == score->key.pitch)
-           score->key.num_flats = i;
+    scherzo_key_init (&score->key, key);
 }
 
-static int
-score_key_contains_pitch (score_key_t *key, pitch_t pitch)
-{
-    pitch_accidental_t accidental = PITCH_ACCIDENTAL (pitch);
-    int i;
-
-    pitch_name_t sharps_order[] = {
-       PITCH_NAME_F,
-       PITCH_NAME_C,
-       PITCH_NAME_G,
-       PITCH_NAME_D,
-       PITCH_NAME_A,
-       PITCH_NAME_E,
-       PITCH_NAME_B
-    };
-
-    pitch_name_t flats_order[] = {
-       PITCH_NAME_B,
-       PITCH_NAME_E,
-       PITCH_NAME_A,
-       PITCH_NAME_D,
-       PITCH_NAME_G,
-       PITCH_NAME_C,
-       PITCH_NAME_F
-    };
-
-    if (accidental == PITCH_ACCIDENTAL_DOUBLE_SHARP ||
-       accidental == PITCH_ACCIDENTAL_DOUBLE_FLAT)
-    {
-       return 0;
-    }
-
-    if (key->num_sharps) {
-       if (accidental == PITCH_ACCIDENTAL_FLAT)
-           return 0;
-       for (i = 0; i < key->num_sharps; i++) {
-           if (sharps_order[i] == PITCH_NAME (pitch)) {
-               if (accidental == PITCH_ACCIDENTAL_SHARP)
-                   return 1;
-               else
-                   return 0;
-           }
-       }
-       if (accidental == PITCH_ACCIDENTAL_SHARP)
-           return 0;
-       else
-           return 1;
-    }
-
-    if (key->num_flats) {
-       if (accidental == PITCH_ACCIDENTAL_SHARP)
-           return 0;
-       for (i = 0; i < key->num_flats; i++) {
-           if (flats_order[i] == PITCH_NAME (pitch)) {
-               if (accidental == PITCH_ACCIDENTAL_FLAT)
-                   return 1;
-               else
-                   return 0;
-           }
-       }
-       if (accidental == PITCH_ACCIDENTAL_FLAT)
-           return 0;
-       else
-           return 1;
-    }
-
-    if (accidental == PITCH_ACCIDENTAL_NATURAL)
-       return 1;
-    else
-       return 0;
-}
 
 /* Returns in brace_width the width of the brace */
 static void
@@ -452,7 +337,7 @@ _draw_note (score_t *score, cairo_t *cr,
     }
 
     if (note->duration == 0 ||
-       ! score_key_contains_pitch (&score->key, note->pitch))
+       ! scherzo_key_contains_pitch (&score->key, note->pitch))
     {
            note_glyph[num_glyphs].x = 0;