X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fgregorian-ligature-engraver.cc;h=ad8b423eb58ec4d51d74b350369601067d35bf99;hb=77267b700c377fd170abcbf4863728937038eb5e;hp=26c6cac55896bd4f9dd94e152c7541d1eadda2fd;hpb=bdf4ab13203502e7ec7cf9cf5896527643a07c1f;p=lilypond.git diff --git a/lily/gregorian-ligature-engraver.cc b/lily/gregorian-ligature-engraver.cc index 26c6cac558..ad8b423eb5 100644 --- a/lily/gregorian-ligature-engraver.cc +++ b/lily/gregorian-ligature-engraver.cc @@ -1,18 +1,35 @@ /* - gregorian-ligature-engraver.cc -- implement Gregorian_ligature_engraver + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 2003--2015 Juergen Reuter - (c) 2003--2005 Juergen Reuter + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ #include "gregorian-ligature-engraver.hh" #include "gregorian-ligature.hh" -#include "warn.hh" -#include "staff-symbol-referencer.hh" -#include "spanner.hh" +#include "international.hh" #include "paper-column.hh" +#include "pitch.hh" +#include "spanner.hh" +#include "staff-symbol-referencer.hh" +#include "stream-event.hh" +#include "warn.hh" + +/* ASSIGN_EVENT_ONCE */ +#include "translator.icc" /* * This abstract class is the common superclass for all ligature @@ -25,26 +42,21 @@ * engravers for Gregorian chant will be added in the future, such as * Medicaea_ligature_engraver or Hufnagel_ligature_engraver. */ -Gregorian_ligature_engraver::Gregorian_ligature_engraver () +Gregorian_ligature_engraver::Gregorian_ligature_engraver (Context *c) + : Coherent_ligature_engraver (c) { pes_or_flexa_req_ = 0; } -bool -Gregorian_ligature_engraver::try_music (Music *m) +void +Gregorian_ligature_engraver::listen_pes_or_flexa (Stream_event *ev) { - if (m->is_mus_type ("pes-or-flexa-event")) - { - pes_or_flexa_req_ = m; - return true; - } - else - return Ligature_engraver::try_music (m); + ASSIGN_EVENT_ONCE (pes_or_flexa_req_, ev); } -void fix_prefix (char *name, int mask, - int *current_set, int min_set, int max_set, - Grob *primitive) +void fix_prefix (char const *name, int mask, + int *current_set, int min_set, int max_set, + Grob *primitive) { bool current = *current_set & mask; bool min = min_set & mask; @@ -82,110 +94,110 @@ void fix_prefix_set (int *current_set, int min_set, int max_set, Grob *primitive fix_prefix ("pes_or_flexa", LINEA, current_set, min_set, max_set, primitive); } -void check_and_fix_all_prefixes (Array primitives) +void check_and_fix_all_prefixes (vector const &primitives) { - /* Check for illegal head modifier combinations */ - for (int i = 0; i < primitives.size (); i++) + /* Check for invalid head modifier combinations */ + for (vsize i = 0; i < primitives.size (); i++) { - Grob *primitive = primitives[i].grob_; + Grob *primitive = primitives[i].grob (); /* compute head prefix set by inspecting primitive grob properties */ int prefix_set - = (VIRGA *to_boolean (primitive->get_property ("virga"))) - | (STROPHA *to_boolean (primitive->get_property ("stropha"))) - | (INCLINATUM *to_boolean (primitive->get_property ("inclinatum"))) - | (AUCTUM *to_boolean (primitive->get_property ("auctum"))) - | (DESCENDENS *to_boolean (primitive->get_property ("descendens"))) - | (ASCENDENS *to_boolean (primitive->get_property ("ascendens"))) - | (ORISCUS *to_boolean (primitive->get_property ("oriscus"))) - | (QUILISMA *to_boolean (primitive->get_property ("quilisma"))) - | (DEMINUTUM *to_boolean (primitive->get_property ("deminutum"))) - | (CAVUM *to_boolean (primitive->get_property ("cavum"))) - | (LINEA *to_boolean (primitive->get_property ("linea"))) - | (PES_OR_FLEXA *to_boolean (primitive->get_property ("pes-or-flexa"))); + = (VIRGA * to_boolean (primitive->get_property ("virga"))) + | (STROPHA * to_boolean (primitive->get_property ("stropha"))) + | (INCLINATUM * to_boolean (primitive->get_property ("inclinatum"))) + | (AUCTUM * to_boolean (primitive->get_property ("auctum"))) + | (DESCENDENS * to_boolean (primitive->get_property ("descendens"))) + | (ASCENDENS * to_boolean (primitive->get_property ("ascendens"))) + | (ORISCUS * to_boolean (primitive->get_property ("oriscus"))) + | (QUILISMA * to_boolean (primitive->get_property ("quilisma"))) + | (DEMINUTUM * to_boolean (primitive->get_property ("deminutum"))) + | (CAVUM * to_boolean (primitive->get_property ("cavum"))) + | (LINEA * to_boolean (primitive->get_property ("linea"))) + | (PES_OR_FLEXA * to_boolean (primitive->get_property ("pes-or-flexa"))); /* check: ascendens and descendens exclude each other; same with - auctum and deminutum */ + auctum and deminutum */ if (prefix_set & DESCENDENS) - { - fix_prefix_set (&prefix_set, - prefix_set & ~ASCENDENS, - prefix_set & ~ASCENDENS, - primitive); - } + { + fix_prefix_set (&prefix_set, + prefix_set & ~ASCENDENS, + prefix_set & ~ASCENDENS, + primitive); + } if (prefix_set & AUCTUM) - { - fix_prefix_set (&prefix_set, - prefix_set & ~DEMINUTUM, - prefix_set & ~DEMINUTUM, - primitive); - } + { + fix_prefix_set (&prefix_set, + prefix_set & ~DEMINUTUM, + prefix_set & ~DEMINUTUM, + primitive); + } - /* check: virga, quilisma and oriscus can not be combined with any - other prefix, but may be part of a pes or flexa */ + /* check: virga, quilisma and oriscus cannot be combined with any + other prefix, but may be part of a pes or flexa */ if (prefix_set & VIRGA) - { - fix_prefix_set (&prefix_set, - VIRGA, - VIRGA | PES_OR_FLEXA, - primitive); - } + { + fix_prefix_set (&prefix_set, + VIRGA, + VIRGA | PES_OR_FLEXA, + primitive); + } if (prefix_set & QUILISMA) - { - fix_prefix_set (&prefix_set, - QUILISMA, - QUILISMA | PES_OR_FLEXA, - primitive); - } + { + fix_prefix_set (&prefix_set, + QUILISMA, + QUILISMA | PES_OR_FLEXA, + primitive); + } if (prefix_set & ORISCUS) - { - fix_prefix_set (&prefix_set, - ORISCUS, - ORISCUS | PES_OR_FLEXA, - primitive); - } + { + fix_prefix_set (&prefix_set, + ORISCUS, + ORISCUS | PES_OR_FLEXA, + primitive); + } /* check: auctum is the only valid optional prefix for stropha */ if (prefix_set & STROPHA) - { - fix_prefix_set (&prefix_set, - STROPHA, - STROPHA | AUCTUM, - primitive); - } + { + fix_prefix_set (&prefix_set, + STROPHA, + STROPHA | AUCTUM, + primitive); + } /* check: inclinatum may be prefixed with auctum or deminutum only */ if (prefix_set & INCLINATUM) - { - fix_prefix_set (&prefix_set, - INCLINATUM, - INCLINATUM | AUCTUM | DEMINUTUM, - primitive); - } + { + fix_prefix_set (&prefix_set, + INCLINATUM, + INCLINATUM | AUCTUM | DEMINUTUM, + primitive); + } /* check: semivocalis (deminutum but not inclinatum) must occur in - combination with and only with pes or flexa */ + combination with and only with pes or flexa */ else if (prefix_set & DEMINUTUM) - { - fix_prefix_set (&prefix_set, - DEMINUTUM | PES_OR_FLEXA, - DEMINUTUM | PES_OR_FLEXA, - primitive); - } + { + fix_prefix_set (&prefix_set, + DEMINUTUM | PES_OR_FLEXA, + DEMINUTUM | PES_OR_FLEXA, + primitive); + } /* check: cavum and linea (either or both) may be applied only - upon core punctum */ + upon core punctum */ if (prefix_set & (CAVUM | LINEA)) - { - fix_prefix_set (&prefix_set, - 0, - CAVUM | LINEA, - primitive); - } + { + fix_prefix_set (&prefix_set, + 0, + CAVUM | LINEA, + primitive); + } /* all other combinations should be valid (unless I made a - mistake) */ + mistake) */ - primitive->set_property ("prefix-set", scm_int2num (prefix_set)); + primitive->set_property ("prefix-set", scm_from_int (prefix_set)); } } @@ -193,49 +205,43 @@ void check_and_fix_all_prefixes (Array primitives) * Marks those heads that participate in a pes or flexa. */ void -provide_context_info (Array primitives) +provide_context_info (vector const &primitives) { Grob *prev_primitive = 0; int prev_prefix_set = 0; int prev_context_info = 0; int prev_pitch = 0; - for (int i = 0; i < primitives.size (); i++) + for (vsize i = 0; i < primitives.size (); i++) { - Grob *primitive = primitives[i].grob_; - Music *music_cause = primitives[i].music_cause (); + Grob *primitive = primitives[i].grob (); + Stream_event *event_cause = primitives[i].event_cause (); int context_info = 0; - int pitch = unsmob_pitch (music_cause->get_property ("pitch"))->steps (); + int pitch = unsmob (event_cause->get_property ("pitch"))->steps (); int prefix_set = scm_to_int (primitive->get_property ("prefix-set")); if (prefix_set & PES_OR_FLEXA) - if (!i) // ligature may not start with 2nd head of pes or flexa - { - primitive->warning ("may not apply `\\~' on first head of " - "ligature; ignoring `\\~'"); - } - else if (pitch > prev_pitch) // pes - { - prev_context_info |= PES_LOWER; - context_info |= PES_UPPER; - } - else if (pitch < prev_pitch) // flexa - { - prev_context_info |= FLEXA_LEFT; - context_info |= FLEXA_RIGHT; - } - else // (pitch == prev_pitch) - { - primitive->warning ("may not apply `\\~' on heads with " - "identical pitch; ignoring `\\~'"); - } + { + if (!i) // ligature may not start with 2nd head of pes or flexa + primitive->warning (_ ("cannot apply `\\~' on first head of ligature")); + else if (pitch > prev_pitch) // pes + { + prev_context_info |= PES_LOWER; + context_info |= PES_UPPER; + } + else if (pitch < prev_pitch) // flexa + { + prev_context_info |= FLEXA_LEFT; + context_info |= FLEXA_RIGHT; + } + else // (pitch == prev_pitch) + primitive->warning (_ ("cannot apply `\\~' on heads with identical pitch")); + } if (prev_prefix_set & DEMINUTUM) - { - context_info |= AFTER_DEMINUTUM; - } + context_info |= AFTER_DEMINUTUM; if (prev_primitive) - prev_primitive->set_property ("context-info", - scm_int2num (prev_context_info)); + prev_primitive->set_property ("context-info", + scm_from_int (prev_context_info)); prev_primitive = primitive; prev_prefix_set = prefix_set; prev_context_info = context_info; @@ -243,20 +249,12 @@ provide_context_info (Array primitives) } if (prev_primitive) prev_primitive->set_property ("context-info", - scm_int2num (prev_context_info)); -} - -void -Gregorian_ligature_engraver::transform_heads (Spanner *, Array) -{ - programming_error ("Gregorian_ligature_engraver::transform_heads (): " - "this is an abstract method that should not be called, " - "but overridden by a subclass"); + scm_from_int (prev_context_info)); } void Gregorian_ligature_engraver::build_ligature (Spanner *ligature, - Array primitives) + vector const &primitives) { // apply style-independent checking and transformation check_and_fix_all_prefixes (primitives); @@ -274,10 +272,5 @@ Gregorian_ligature_engraver::stop_translation_timestep () pes_or_flexa_req_ = 0; } -ADD_TRANSLATOR (Gregorian_ligature_engraver, - /* descr */ "This is an abstract class. Subclasses such as Vaticana_ligature_engraver handle ligatures by glueing special ligature heads together.", - /* creats*/ "", - /* accepts */ "ligature-event", - /* acks */ "note-head-interface rest-interface", - /* reads */ "", - /* write */ ""); +// no ADD_ACKNOWLEDGER / ADD_ACKNOWLEDGER / ADD_TRANSLATOR macro calls +// since this class is abstract