X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmensural-ligature-engraver.cc;h=906ace106ca689f8f93082dae7b5418a541efc26;hb=3bafaae8bf353619d2f97036e874f1c9cb787adf;hp=f40ce004b056b6bbc2df480a3b5bf20d5f9f213d;hpb=abbdb46061be5c0a0682059d1f86bf3e44ca5cf3;p=lilypond.git diff --git a/lily/mensural-ligature-engraver.cc b/lily/mensural-ligature-engraver.cc index f40ce004b0..906ace106c 100644 --- a/lily/mensural-ligature-engraver.cc +++ b/lily/mensural-ligature-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Juergen Reuter , + (c) 2002--2008 Juergen Reuter , Pal Benko */ @@ -31,14 +31,11 @@ * TODO: prohibit ligatures having notes differing only in accidentals * (like \[ a\breve g as \]) * - * TODO: dotted heads: avoid next note colliding with the dot, e.g. by - * putting it *above* (rather than after) the affected ligature head. - * * TODO: do something with multiple voices within a ligature. See * for example: * Ockeghem: Missa Ecce ancilla domini, bassus part, end of Christe. * - * TODO: enhance robustness: in case of an illegal ligature (e.g. the + * TODO: enhance robustness: in case of an invalid ligature (e.g. the * input specifies a ligature that contains a minima), automatically * break the ligature into smaller, valid pieces. Such a piece may be * a single note. @@ -85,7 +82,7 @@ Mensural_ligature_engraver::transform_heads (vector primitives) { if (primitives.size () < 2) { - warning (_f ("ligature with less than 2 heads -> skipping")); + warning (_ ("ligature with less than 2 heads -> skipping")); return; } int prev_pitch = 0; @@ -102,7 +99,7 @@ Mensural_ligature_engraver::transform_heads (vector primitives) { Grob_info info = primitives[i]; Item *primitive = dynamic_cast (info.grob ()); - int duration_log = Note_head::get_balltype (primitive); + int duration_log = Rhythmic_head::duration_log (primitive); Stream_event *nr = info.event_cause (); @@ -112,7 +109,7 @@ Mensural_ligature_engraver::transform_heads (vector primitives) if (!nr->in_event_class ("note-event")) { nr->origin ()->warning - (_f ("cannot determine pitch of ligature primitive -> skipping")); + (_ ("cannot determine pitch of ligature primitive -> skipping")); at_beginning = true; continue; } @@ -126,7 +123,7 @@ Mensural_ligature_engraver::transform_heads (vector primitives) { // we can get here after invalid input nr->origin ()->warning - (_f ("single note ligature - skipping")); + (_ ("single note ligature - skipping")); break; } prev_semibrevis = prev_brevis_shape = false; @@ -138,7 +135,7 @@ Mensural_ligature_engraver::transform_heads (vector primitives) if (delta_pitch == 0) { nr->origin ()->warning - (_f ("prime interval within ligature -> skipping")); + (_ ("prime interval within ligature -> skipping")); at_beginning = true; primitive->set_property ("primitive", scm_from_int (MLP_NONE)); @@ -150,7 +147,7 @@ Mensural_ligature_engraver::transform_heads (vector primitives) || duration_log > 0) { nr->origin ()->warning - (_f ("mensural ligature: duration none of Mx, L, B, S -> skipping")); + (_ ("mensural ligature: duration none of Mx, L, B, S -> skipping")); primitive->set_property ("primitive", scm_from_int (MLP_NONE)); at_beginning = true; @@ -198,7 +195,7 @@ Mensural_ligature_engraver::transform_heads (vector primitives) else { nr->origin ()->warning - (_f ("semibrevis must be followed by another one -> skipping")); + (_ ("semibrevis must be followed by another one -> skipping")); primitive->set_property ("primitive", scm_from_int (MLP_NONE)); at_beginning = true; @@ -209,8 +206,8 @@ Mensural_ligature_engraver::transform_heads (vector primitives) else if (duration_log == 0) { nr->origin ()->warning - (_f ("semibreves can only appear at the beginning of a ligature,\n" - "and there may be only zero or two of them")); + (_ ("semibreves can only appear at the beginning of a ligature,\n" + "and there may be only zero or two of them")); primitive->set_property ("primitive", scm_from_int (MLP_NONE)); at_beginning = true; @@ -236,10 +233,10 @@ Mensural_ligature_engraver::transform_heads (vector primitives) else { nr->origin ()->warning - (_f ("invalid ligatura ending:\n" - "when the last note is a descending brevis,\n" - "the penultimate note must be another one,\n" - "or the ligatura must be LB or SSB")); + (_ ("invalid ligatura ending:\n" + "when the last note is a descending brevis,\n" + "the penultimate note must be another one,\n" + "or the ligatura must be LB or SSB")); primitive->set_property ("primitive", scm_from_int (MLP_NONE)); break; } @@ -278,7 +275,7 @@ Mensural_ligature_engraver::transform_heads (vector primitives) // instead of number 6 // the legth of the longa stem should be queried something like // Font_interface::get_default_font (ligature)->find_by_name - // ("noteheads.s-2mensural").extent (Y_AXIS).length () + // ("noteheads.sM2mensural").extent (Y_AXIS).length () } prev_primitive->set_property ("join-right-amount", scm_from_int (delta_pitch)); @@ -316,12 +313,12 @@ Mensural_ligature_engraver::propagate_properties (Spanner *ligature, Real head_width = Font_interface::get_default_font (ligature)-> - find_by_name ("noteheads.s-1mensural").extent (X_AXIS).length (); + find_by_name ("noteheads.sM1mensural").extent (X_AXIS).length (); Real flexa_width = robust_scm2double (ligature->get_property ("flexa-width"), 2); Real maxima_head_width = Font_interface::get_default_font (ligature)-> - find_by_name ("noteheads.s-1neomensural").extent (X_AXIS).length (); + find_by_name ("noteheads.sM1neomensural").extent (X_AXIS).length (); flexa_width *= Staff_symbol_referencer::staff_space (ligature); @@ -356,7 +353,7 @@ Mensural_ligature_engraver::propagate_properties (Spanner *ligature, scm_from_double (flexa_width)); break; default: - programming_error (_f ("unexpected case fall-through")); + programming_error (_ ("unexpected case fall-through")); break; } } @@ -366,21 +363,45 @@ void Mensural_ligature_engraver::fold_up_primitives (vector primitives) { Item *first = 0; - Real distance = 0; + Real distance = 0.0; + Real dot_shift = 0.0; for (vsize i = 0; i < primitives.size (); i++) { Item *current = dynamic_cast (primitives[i].grob ()); if (i == 0) - first = current; - - get_set_column (current, first->get_column ()); + { + first = current; + dot_shift = 1.5 * Staff_symbol_referencer::staff_space (first); + } - if (i > 0) - current->translate_axis (distance, X_AXIS); + move_related_items_to_column (current, first->get_column (), + distance); distance += scm_to_double (current->get_property ("head-width")) - scm_to_double (current->get_property ("thickness")); + + if (Rhythmic_head::dot_count (current) > 0) + // Move dots above/behind the ligature. + { + if (i + 1 < primitives.size ()) + // dot in the midst => move above head + { + // FIXME: Amount of vertical dot-shift should depend on + // pitch. + // + // FIXME: dot placement is horizontally slightly off. + Rhythmic_head::get_dots (current)->translate_axis (dot_shift, Y_AXIS); + } + else + // trailing dot => move behind head + { + double head_width = + scm_to_double (current->get_property ("head-width")); + Rhythmic_head::get_dots (current)-> + translate_axis (head_width, X_AXIS); + } + } } } @@ -395,9 +416,18 @@ Mensural_ligature_engraver::build_ligature (Spanner *ligature, ADD_ACKNOWLEDGER (Mensural_ligature_engraver, rest); ADD_ACKNOWLEDGER (Mensural_ligature_engraver, note_head); + ADD_TRANSLATOR (Mensural_ligature_engraver, - /* doc */ "Handles Mensural_ligature_events by glueing special ligature heads together.", - /* create */ "MensuralLigature", - /* accept */ "ligature-event", - /* read */ "", - /* write */ ""); + /* doc */ + "Handle @code{Mensural_ligature_events} by glueing special" + " ligature heads together.", + + /* create */ + "MensuralLigature ", + + /* read */ + "", + + /* write */ + "" + );