source file of the GNU LilyPond music typesetter
- (c) 2003 Juergen Reuter <reuter@ipd.uka.de>
+ (c) 2003 Juergen Reuter <reuter@ipd.uka.de>
*/
#include "gregorian-ligature-engraver.hh"
+
#include "gregorian-ligature.hh"
-#include "item.hh"
#include "warn.hh"
#include "staff-symbol-referencer.hh"
#include "spanner.hh"
void check_and_fix_all_prefixes (Array<Grob_info> primitives)
{
/* Check for illegal head modifier combinations */
- for (int i = 0; i < primitives.size(); i++)
+ for (int i = 0; i < primitives.size (); i++)
{
Grob *primitive = primitives[i].grob_;
/* compute head prefix set by inspecting primitive grob properties */
int prefix_set =
- (VIRGA * to_boolean (primitive->get_grob_property ("virga"))) |
- (STROPHA * to_boolean (primitive->get_grob_property ("stropha"))) |
- (INCLINATUM * to_boolean (primitive->get_grob_property ("inclinatum"))) |
- (AUCTUM * to_boolean (primitive->get_grob_property ("auctum"))) |
- (DESCENDENS * to_boolean (primitive->get_grob_property ("descendens"))) |
- (ASCENDENS * to_boolean (primitive->get_grob_property ("ascendens"))) |
- (ORISCUS * to_boolean (primitive->get_grob_property ("oriscus"))) |
- (QUILISMA * to_boolean (primitive->get_grob_property ("quilisma"))) |
- (DEMINUTUM * to_boolean (primitive->get_grob_property ("deminutum"))) |
- (CAVUM * to_boolean (primitive->get_grob_property ("cavum"))) |
- (LINEA * to_boolean (primitive->get_grob_property ("linea"))) |
- (PES_OR_FLEXA * to_boolean (primitive->get_grob_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 */
/* all other combinations should be valid (unless I made a
mistake) */
- primitive->set_grob_property ("prefix-set", gh_int2scm (prefix_set));
+ primitive->set_property ("prefix-set", scm_int2num (prefix_set));
}
}
int prev_prefix_set = 0;
int prev_context_info = 0;
int prev_pitch = 0;
- for (int i = 0; i < primitives.size(); i++) {
+ for (int i = 0; i < primitives.size (); i++) {
Grob *primitive = primitives[i].grob_;
Music *music_cause = primitives[i].music_cause ();
int context_info = 0;
- int pitch = unsmob_pitch (music_cause->get_mus_property ("pitch"))->steps ();
- int prefix_set = gh_scm2int (primitive->get_grob_property ("prefix-set"));
+ int pitch = unsmob_pitch (music_cause->get_property ("pitch"))->steps ();
+ int prefix_set = scm_to_int (primitive->get_property ("prefix-set"));
if (prefix_set & PES_OR_FLEXA)
- if (pitch > prev_pitch) // pes
+ 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;
primitive->warning ("may not apply `\\~' on heads with "
"identical pitch; ignoring `\\~'");
}
- if (prev_prefix_set & VIRGA)
- {
- context_info |= AFTER_VIRGA;
- }
if (prev_prefix_set & DEMINUTUM)
{
context_info |= AFTER_DEMINUTUM;
}
if (prev_primitive)
- prev_primitive->set_grob_property ("context-info",
- gh_int2scm (prev_context_info));
+ prev_primitive->set_property ("context-info",
+ scm_int2num (prev_context_info));
prev_primitive = primitive;
prev_prefix_set = prefix_set;
prev_context_info = context_info;
prev_pitch = pitch;
}
if (prev_primitive)
- prev_primitive->set_grob_property ("context-info",
- gh_int2scm (prev_context_info));
+ prev_primitive->set_property ("context-info",
+ scm_int2num (prev_context_info));
}
void
}
void
-Gregorian_ligature_engraver::start_translation_timestep ()
+Gregorian_ligature_engraver::stop_translation_timestep ()
{
- Ligature_engraver::start_translation_timestep ();
+ Ligature_engraver::stop_translation_timestep ();
pes_or_flexa_req_ = 0;
}
ENTER_DESCRIPTION (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 abort-event",
+/* accepts */ "ligature-event",
/* acks */ "note-head-interface rest-interface",
/* reads */ "",
/* write */ "");