X-Git-Url: https://git.cworth.org/git?p=scherzo;a=blobdiff_plain;f=score.c;h=690a9d27f3b30437a07efc76047a7c6d6e620582;hp=e93042a0b2dd435db07f3ba89acf69334552d695;hb=45d36bd8372f38186ceebf74b48f1a67bd67c573;hpb=b588ae80ff8009695f7ed299fd27e3f16de01e9e diff --git a/score.c b/score.c index e93042a..690a9d2 100644 --- 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;