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 #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 ();
41 Instrument_name_engraver::Instrument_name_engraver ()
48 Instrument_name_engraver::initialize ()
50 context ()->set_property ("instrumentSupport", SCM_EOL);
54 Instrument_name_engraver::stop_translation_timestep ()
58 text_->set_object ("side-support-elements",
59 grob_list_to_grob_array (get_property ("instrumentSupport")));
67 Instrument_name_engraver::create_text ()
72 SCM txt = get_property ("instrument");
74 if (now_mom () > Moment (0))
75 txt = get_property ("instr");
82 text_ = make_item ("InstrumentName", SCM_EOL);
84 if (text_->get_property ("text") != txt)
85 text_->set_property ("text", txt);
89 Instrument_name_engraver::acknowledge_bar_line (Grob_info i)
97 Instrument_name_engraver::acknowledge_axis_group (Grob_info i)
100 Ugh - typechecking for pedal and dynamic sucks.
102 if (dynamic_cast<Spanner *> (i.grob ())
103 && (i.grob ()->internal_has_interface (ly_symbol2scm ("dynamic-interface"))
104 || i.grob ()->internal_has_interface (ly_symbol2scm ("piano-pedal-interface"))))
108 Hang the instrument names on the staves, but not on the alignment
109 groups enclosing that staff. The alignment has no real location,
110 but is only a vehicle for the placement routine it contains, and
111 therefore the location of its refpoint won't be very useful.
113 We could also just use stavesFound, but lets keep this working
114 without staffs as well.
116 if (dynamic_cast<Spanner *> (i.grob ())
117 && ((Axis_group_interface::has_interface (i.grob ())
118 && Axis_group_interface::has_axis (i.grob (), Y_AXIS)))
119 && !Align_interface::has_interface (i.grob ()))
121 SCM nl = scm_cons (i.grob ()->self_scm (),
122 get_property ("instrumentSupport"));
124 context ()->set_property ("instrumentSupport", nl);
129 Instrument_name_engraver::process_music ()
132 Also create text if barlines in other groups. This allows
133 a name to be attached to lyrics or chords.
135 if (scm_is_string (get_property ("whichBar"))
140 #include "translator.icc"
143 ADD_ACKNOWLEDGER(Instrument_name_engraver, bar_line);
144 ADD_ACKNOWLEDGER(Instrument_name_engraver, axis_group);
145 ADD_TRANSLATOR (Instrument_name_engraver,
146 /* descr */ " Prints the name of the instrument (specified by "
147 " @code{Staff.instrument} and @code{Staff.instr}) "
148 "at the left of the staff. ",
149 /* creats*/ "InstrumentName",
151 /* reads */ "instrument instr",
154 /****************************************************************/
156 class Vocal_name_engraver : public Instrument_name_engraver
159 TRANSLATOR_DECLARATIONS (Vocal_name_engraver);
160 virtual void create_text ();
163 Vocal_name_engraver::Vocal_name_engraver ()
168 Vocal_name_engraver::create_text ()
173 SCM txt = get_property ("vocalName");
175 if (now_mom () > Moment (0))
176 txt = get_property ("vocNam");
184 text_ = make_item ("VocalName", SCM_EOL);
186 if (text_->get_property ("text") != txt)
187 text_->set_property ("text", txt);
190 ADD_ACKNOWLEDGER(Vocal_name_engraver, bar_line);
191 ADD_ACKNOWLEDGER(Vocal_name_engraver, axis_group);
192 ADD_TRANSLATOR (Vocal_name_engraver,
193 /* descr */ " Prints the name of the a lyric voice (specified by "
194 " @code{Staff.vocalName} and @code{Staff.vocNam}) "
195 "at the left of the staff. ",
196 /* creats*/ "VocalName",
198 /* reads */ "vocNam vocalName",