-static void
-scherzo_adjust_pitch_to_match_modified_degree (pitch_t *pitch,
- pitch_t root,
- modified_degree_t *degree)
-{
- pitch_name_t name = PITCH_NAME (*pitch);
- pitch_accidental_t accidental = PITCH_ACCIDENTAL (*pitch);
- int octave = PITCH_OCTAVE (*pitch);
- int degree_zero_based = (degree->degree - 1) % 7;
- int degree_delta;
-
- int note_degree_zero_based = name - PITCH_NAME (root);
- if (note_degree_zero_based < 0)
- note_degree_zero_based += 7;
-
- if (note_degree_zero_based == degree_zero_based)
- return;
-
- degree_delta = note_degree_zero_based - degree_zero_based;
- if (degree_delta > 3)
- degree_delta = - (7 - degree_delta);
- if (degree_delta < -3)
- degree_delta = - (-7 - degree_delta);
-
- if (abs (degree_delta) != 1) {
- fprintf (stderr, "Internal error: Cannot adjust a note more than one degree (%d vs. %d).\n", note_degree_zero_based + 1, degree->degree);
- exit (1);
- }
-
- if (degree_delta == -1) {
- if (name == PITCH_NAME_B) {
- name = PITCH_NAME_C;
- octave++;
- } else {
- name++;
- }
- switch (name) {
- case PITCH_NAME_D:
- case PITCH_NAME_E:
- case PITCH_NAME_G:
- case PITCH_NAME_A:
- case PITCH_NAME_B:
- accidental -= 2;
- break;
- case PITCH_NAME_C:
- case PITCH_NAME_F:
- accidental -= 1;
- break;
- }
- }
-
- if (degree_delta == +1) {
- if (name == PITCH_NAME_C) {
- name = PITCH_NAME_B;
- octave--;
- } else {
- name--;
- }
- switch (name) {
- case PITCH_NAME_C:
- case PITCH_NAME_D:
- case PITCH_NAME_F:
- case PITCH_NAME_G:
- case PITCH_NAME_A:
- accidental += 2;
- break;
- case PITCH_NAME_E:
- case PITCH_NAME_B:
- accidental += 1;
- }
- }
-
- if (accidental < 0 || accidental > PITCH_ACCIDENTAL_DOUBLE_SHARP) {
- fprintf (stderr, "Internal error: Trying to adjust an accidental out of range (degree_delta == %d (%d - %d), new accidental == %d).\n", degree_delta, note_degree_zero_based, degree_zero_based, accidental);
- exit (1);
- }
-
- *pitch = PITCH (name, accidental, octave);
-}
-