2 instrument-name-engraver.cc -- implement Instrument_name_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 2000--2005 Han-Wen Nienhuys <hanwen@cs.uu.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 class Instrument_name_engraver : public Engraver
23 TRANSLATOR_DECLARATIONS (Instrument_name_engraver);
28 virtual void create_text ();
29 virtual void initialize ();
30 virtual void acknowledge_grob (Grob_info);
31 PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
32 PRECOMPUTED_VIRTUAL void process_music ();
36 Instrument_name_engraver::Instrument_name_engraver ()
43 Instrument_name_engraver::initialize ()
45 context ()->set_property ("instrumentSupport", SCM_EOL);
49 Instrument_name_engraver::stop_translation_timestep ()
53 text_->set_object ("side-support-elements",
54 grob_list_to_grob_array (get_property ("instrumentSupport")));
62 Instrument_name_engraver::create_text ()
67 SCM txt = get_property ("instrument");
69 if (now_mom () > Moment (0))
70 txt = get_property ("instr");
77 text_ = make_item ("InstrumentName", SCM_EOL);
79 if (text_->get_property ("text") != txt)
80 text_->set_property ("text", txt);
84 Instrument_name_engraver::acknowledge_grob (Grob_info i)
86 if (Bar_line::has_interface (i.grob ()))
92 Ugh - typechecking for pedal and dynamic sucks.
94 if (dynamic_cast<Spanner *> (i.grob ())
95 && (i.grob ()->internal_has_interface (ly_symbol2scm ("dynamic-interface"))
96 || i.grob ()->internal_has_interface (ly_symbol2scm ("piano-pedal-interface"))))
100 Hang the instrument names on the staves, but not on the alignment
101 groups enclosing that staff. The alignment has no real location,
102 but is only a vehicle for the placement routine it contains, and
103 therefore the location of its refpoint won't be very useful.
105 We could also just use stavesFound, but lets keep this working
106 without staffs as well.
108 if (dynamic_cast<Spanner *> (i.grob ())
109 && ((Axis_group_interface::has_interface (i.grob ())
110 && Axis_group_interface::has_axis (i.grob (), Y_AXIS)))
111 && !Align_interface::has_interface (i.grob ()))
113 SCM nl = scm_cons (i.grob ()->self_scm (),
114 get_property ("instrumentSupport"));
116 context ()->set_property ("instrumentSupport", nl);
121 Instrument_name_engraver::process_music ()
124 Also create text if barlines in other groups. This allows
125 a name to be attached to lyrics or chords.
127 if (scm_is_string (get_property ("whichBar"))
132 #include "translator.icc"
134 ADD_TRANSLATOR (Instrument_name_engraver,
135 /* descr */ " Prints the name of the instrument (specified by "
136 " @code{Staff.instrument} and @code{Staff.instr}) "
137 "at the left of the staff. ",
138 /* creats*/ "InstrumentName",
140 /* acks */ "bar-line-interface axis-group-interface",
141 /* reads */ "instrument instr",
144 /****************************************************************/
146 class Vocal_name_engraver : public Instrument_name_engraver
149 TRANSLATOR_DECLARATIONS (Vocal_name_engraver);
150 virtual void create_text ();
153 Vocal_name_engraver::Vocal_name_engraver ()
158 Vocal_name_engraver::create_text ()
163 SCM txt = get_property ("vocalName");
165 if (now_mom () > Moment (0))
166 txt = get_property ("vocNam");
174 text_ = make_item ("VocalName", SCM_EOL);
176 if (text_->get_property ("text") != txt)
177 text_->set_property ("text", txt);
180 #include "translator.icc"
182 ADD_TRANSLATOR (Vocal_name_engraver,
183 /* descr */ " Prints the name of the a lyric voice (specified by "
184 " @code{Staff.vocalName} and @code{Staff.vocNam}) "
185 "at the left of the staff. ",
186 /* creats*/ "VocalName",
188 /* acks */ "bar-line-interface axis-group-interface",
189 /* reads */ "vocNam vocalName",