2 instrument-name-engraver.cc -- implement Instrument_name_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 2000--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
10 #include "bar-line.hh"
11 #include "system-start-delimiter.hh"
12 #include "side-position-interface.hh"
13 #include "align-interface.hh"
14 #include "axis-group-interface.hh"
16 #include "text-interface.hh"
17 #include "grob-array.hh"
19 #include "translator.icc"
21 class Instrument_name_engraver : public Engraver
25 TRANSLATOR_DECLARATIONS (Instrument_name_engraver);
30 virtual void create_text ();
31 virtual void initialize ();
33 DECLARE_ACKNOWLEDGER (bar_line);
34 DECLARE_ACKNOWLEDGER (axis_group);
36 void stop_translation_timestep ();
37 void process_music ();
40 Instrument_name_engraver::Instrument_name_engraver ()
47 Instrument_name_engraver::initialize ()
49 context ()->set_property ("instrumentSupport", SCM_EOL);
53 Instrument_name_engraver::stop_translation_timestep ()
57 SCM support = get_property ("instrumentSupport");
58 text_->set_object ("side-support-elements",
59 grob_list_to_grob_array (support));
62 Hack to get texts on piano staves to disappear.
64 if (!text_->get_parent (Y_AXIS)
65 && scm_is_pair (support))
67 Axis_group_interface::add_element (unsmob_grob (scm_car (support)),
77 Instrument_name_engraver::create_text ()
82 SCM txt = get_property ("instrument");
84 if (now_mom () > Moment (0))
85 txt = get_property ("instr");
92 text_ = make_item ("InstrumentName", SCM_EOL);
94 if (text_->get_property ("text") != txt)
95 text_->set_property ("text", txt);
99 Instrument_name_engraver::acknowledge_bar_line (Grob_info info)
106 Instrument_name_engraver::acknowledge_axis_group (Grob_info info)
109 Ugh - typechecking for pedal and dynamic sucks.
111 if (dynamic_cast<Spanner *> (info.grob ())
112 && (info.grob ()->internal_has_interface (ly_symbol2scm ("dynamic-interface"))
113 || info.grob ()->internal_has_interface (ly_symbol2scm ("piano-pedal-interface"))))
117 Hang the instrument names on the staves, but not on the alignment
118 groups enclosing that staff. The alignment has no real location,
119 but is only a vehicle for the placement routine it contains, and
120 therefore the location of its refpoint won't be very useful.
122 We could also just use stavesFound, but lets keep this working
123 without staffs as well.
125 if (dynamic_cast<Spanner *> (info.grob ())
126 && ((Axis_group_interface::has_interface (info.grob ())
127 && Axis_group_interface::has_axis (info.grob (), Y_AXIS))))
129 if (!Align_interface::has_interface (info.grob ()))
131 SCM nl = scm_cons (info.grob ()->self_scm (),
132 get_property ("instrumentSupport"));
134 context ()->set_property ("instrumentSupport", nl);
140 Instrument_name_engraver::process_music ()
143 Also create text if barlines in other groups. This allows
144 a name to be attached to lyrics or chords.
146 if (scm_is_string (get_property ("whichBar"))
151 #include "translator.icc"
153 ADD_ACKNOWLEDGER (Instrument_name_engraver, bar_line);
154 ADD_ACKNOWLEDGER (Instrument_name_engraver, axis_group);
156 ADD_TRANSLATOR (Instrument_name_engraver,
157 /* doc */ " Prints the name of the instrument (specified by "
158 " @code{Staff.instrument} and @code{Staff.instr}) "
159 "at the left of the staff. ",
160 /* create */ "InstrumentName",
162 /* read */ "instrument instr",
165 /****************************************************************/
167 class Vocal_name_engraver : public Instrument_name_engraver
170 TRANSLATOR_DECLARATIONS (Vocal_name_engraver);
171 virtual void create_text ();
174 Vocal_name_engraver::Vocal_name_engraver ()
179 Vocal_name_engraver::create_text ()
184 SCM txt = get_property ("vocalName");
186 if (now_mom () > Moment (0))
187 txt = get_property ("vocNam");
195 text_ = make_item ("VocalName", SCM_EOL);
197 if (text_->get_property ("text") != txt)
198 text_->set_property ("text", txt);
201 ADD_ACKNOWLEDGER (Vocal_name_engraver, bar_line);
202 ADD_ACKNOWLEDGER (Vocal_name_engraver, axis_group);
203 ADD_TRANSLATOR (Vocal_name_engraver,
204 /* doc */ " Prints the name of the a lyric voice (specified by "
205 " @code{Staff.vocalName} and @code{Staff.vocNam}) "
206 "at the left of the staff. ",
207 /* create */ "VocalName",
209 /* read */ "vocNam vocalName",