2 custos.cc -- implement Custos
4 source file of the GNU LilyPond music typesetter
6 (C) 2000, 2002 Juergen Reuter <reuter@ipd.uka.de>
11 - merge create_ledger_line () and Note_head::create_ledger_line ()
13 - rewrite create_ledger_line () to support short and thin ledger lines
15 - do not show if a clef change immediately follows in the next line
17 - decide: do or do not print custos if the next line starts with a rest
23 #include "direction.hh"
24 #include "staff-symbol-referencer.hh"
26 #include "molecule.hh"
28 #include "note-head.hh"
30 #include "font-interface.hh"
31 #include "math.h" // rint
33 MAKE_SCHEME_CALLBACK (Custos,brew_molecule,1);
35 Custos::brew_molecule (SCM smob)
37 Item *me = (Item *)unsmob_grob (smob);
38 SCM scm_style = me->get_grob_property ("style");
40 if (gh_symbol_p (scm_style))
42 String style = ly_scm2string (scm_symbol_to_string (scm_style));
45 * Shall we use a common custos font character regardless if on
46 * staffline or not, or shall we use individual font characters
50 to_boolean (me->get_grob_property ("adjust-if-on-staffline"));
52 String idx = "custodes-" + style + "-";
55 SCM ntr_pos = me->get_grob_property ("neutral-position");
56 if (gh_number_p (ntr_pos))
57 neutral_pos = gh_scm2int (ntr_pos);
61 Direction neutral_direction =
62 to_dir (me->get_grob_property ("neutral-direction"));
64 int pos = (int)rint (Staff_symbol_referencer::position_f (me));
65 int sz = Staff_symbol_referencer::line_count (me)-1;
67 if (pos < neutral_pos)
69 else if (pos > neutral_pos)
71 else if (neutral_direction == UP)
73 else if (neutral_direction == DOWN)
75 else // auto direction; not yet supported -> use "d"
80 idx += (((pos ^ sz) & 0x1) == 0) ? "1" : "0";
88 = Font_interface::get_default_font (me)->find_by_name (idx);
89 if (molecule.empty_b ())
91 String message = "no such custos: `" + idx + "'";
92 warning (_ (message.ch_C ()));
98 int pos = (int)rint (Staff_symbol_referencer::position_f (me));
99 int interspaces = Staff_symbol_referencer::line_count (me)-1;
100 if (abs (pos) - interspaces > 1)
102 Molecule ledger_lines =
103 Note_head::brew_ledger_lines (me, pos, interspaces,
104 molecule.extent (X_AXIS), true);
105 molecule.add_molecule (ledger_lines);
107 return molecule.smobbed_copy ();
115 ADD_INTERFACE (Custos, "custos-interface",
116 "A custos is a staff context symbol that appears at the end of a
117 staff line with monophonic musical contents (i.e. with a single
118 voice). It anticipates the pitch of the first note of the following
119 line and thus helps the player or singer to manage line breaks
120 during performance, thus enhancing readability of a score.
122 Custodes were frequently used in music notation until the 16th
123 century. There were different appearences for different notation
124 styles. Nowadays, they have survived only in special forms of
125 musical notation such as via the editio vaticana dating back to the
126 beginning of the 20th century.
128 [TODO: add to glossary]",
129 "style adjust-if-on-staffline neutral-position");