2
instrument-name-engraver.cc -- implement Instrument_name_engraver
2
instrument-name-engraver.cc -- implement Instrument_name_engraver
4
4
source file of the GNU LilyPond music typesetter
6
(c) 2000--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
6
(c) 2000--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
10
9
#include "engraver.hh"
12
#include "bar-line.hh"
13
#include "system-start-delimiter.hh"
11
#include "pointer-group-interface.hh"
14
12
#include "side-position-interface.hh"
13
#include "axis-group-interface.hh"
15
14
#include "align-interface.hh"
16
#include "axis-group-interface.hh"
18
#include "text-item.hh"
15
#include "text-interface.hh"
18
#include "translator.icc"
20
20
class Instrument_name_engraver : public Engraver
24
23
TRANSLATOR_DECLARATIONS (Instrument_name_engraver);
26
Spanner *text_spanner_;
29
virtual void create_text ();
30
virtual void initialize ();
31
virtual void acknowledge_grob (Grob_info);
32
virtual void stop_translation_timestep ();
33
virtual void process_music ();
28
virtual void finalize ();
29
DECLARE_ACKNOWLEDGER (axis_group);
30
void process_music ();
36
33
Instrument_name_engraver::Instrument_name_engraver ()
43
Instrument_name_engraver::initialize ()
45
daddy_context_->set_property ("instrumentSupport", SCM_EOL);
49
Instrument_name_engraver::stop_translation_timestep ()
53
text_->set_property ("side-support-elements",
54
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");
78
text_ = make_item ("InstrumentName");
80
if (text_->get_property ("text") != txt)
81
text_->set_property ("text", txt);
82
announce_grob (text_, SCM_EOL);
86
Instrument_name_engraver::acknowledge_grob (Grob_info i)
88
if (Bar_line::has_interface (i.grob_))
93
if (dynamic_cast<Spanner*> (i.grob_)
94
&& i.grob_->internal_has_interface (ly_symbol2scm ("dynamic-interface")))
98
Hang the instrument names on the staves, but not on the alignment
99
groups enclosing that staff. The alignment has no real location,
100
but is only a vehicle for the placement routine it contains, and
101
therefore the location of its refpoint won't be very useful.
103
We could also just use stavesFound, but lets keep this working
104
without staffs as well.
106
if (dynamic_cast<Spanner*> (i.grob_)
107
&& ((Axis_group_interface::has_interface (i.grob_)
108
&& Axis_group_interface::has_axis (i.grob_, Y_AXIS)))
109
&& !Align_interface::has_interface (i.grob_))
111
SCM nl = gh_cons (i.grob_->self_scm (),
112
get_property ("instrumentSupport"));
114
daddy_context_->set_property ("instrumentSupport", nl);
119
39
Instrument_name_engraver::process_music ()
122
Also create text if barlines in other groups. This allows
123
a name to be attached to lyrics or chords.
125
if (gh_string_p (get_property ("whichBar")))
129
ENTER_DESCRIPTION (Instrument_name_engraver,
130
/* descr */ " Prints the name of the instrument (specified by "
131
" @code{Staff.instrument} and @code{Staff.instr}) "
132
"at the left of the staff. ",
133
/* creats*/ "InstrumentName",
135
/* acks */ "bar-line-interface axis-group-interface",
136
/* reads */ "instrument instr",
139
/****************************************************************/
142
class Vocal_name_engraver : public Instrument_name_engraver
145
TRANSLATOR_DECLARATIONS (Vocal_name_engraver);
146
virtual void create_text ();
150
Vocal_name_engraver::Vocal_name_engraver ()
156
Vocal_name_engraver::create_text ()
161
SCM txt = get_property ("vocalName");
163
if (now_mom () > Moment (0))
164
txt = get_property ("vocNam");
172
text_ = make_item ("VocalName");
174
if (text_->get_property ("text") != txt)
175
text_->set_property ("text", txt);
176
announce_grob (text_, SCM_EOL);
181
ENTER_DESCRIPTION (Vocal_name_engraver,
182
/* descr */ " Prints the name of the a lyric voice (specified by "
183
" @code{Staff.vocalName} and @code{Staff.vocNam}) "
184
"at the left of the staff. ",
185
/* creats*/ "VocalName",
187
/* acks */ "bar-line-interface axis-group-interface",
188
/* reads */ "vocNam vocalName",
43
SCM long_text = get_property ("instrument");
44
SCM short_text = get_property ("instr");
46
if (!(Text_interface::is_markup (long_text)
47
|| Text_interface::is_markup (short_text)))
49
long_text = get_property ("vocalName");
50
short_text = get_property ("vocNam");
53
if (Text_interface::is_markup (long_text)
54
|| Text_interface::is_markup (short_text))
56
text_spanner_ = make_spanner ("InstrumentName", SCM_EOL);
58
Grob *col = unsmob_grob (get_property ("currentCommandColumn"));
59
text_spanner_->set_bound (LEFT, col);
60
text_spanner_->set_property ("text", short_text);
61
text_spanner_->set_property ("long-text", long_text);
67
Instrument_name_engraver::acknowledge_axis_group (Grob_info info)
70
&& dynamic_cast<Spanner *> (info.grob ())
71
&& Axis_group_interface::has_axis (info.grob (), Y_AXIS)
72
&& (!Align_interface::has_interface (info.grob ())))
74
Grob *staff = info.grob();
75
Pointer_group_interface::add_grob (text_spanner_, ly_symbol2scm ("elements"), staff);
76
Side_position_interface::add_support (text_spanner_, staff);
81
Instrument_name_engraver::finalize ()
85
text_spanner_->set_bound (RIGHT,
86
unsmob_grob (get_property ("currentCommandColumn")));
88
Pointer_group_interface::set_ordered (text_spanner_, ly_symbol2scm ("elements"), false);
90
System *system = get_root_system (text_spanner_);
93
UGH, should handle this in Score_engraver.
96
Axis_group_interface::add_element (system, text_spanner_);
98
text_spanner_->programming_error ("can't find root system");
102
#include "translator.icc"
104
ADD_ACKNOWLEDGER (Instrument_name_engraver, axis_group);
106
ADD_TRANSLATOR (Instrument_name_engraver,
109
"Creates a system start text for instrument or vocal names.",
118
"vocNam vocalName instrument instr "
119
"currentCommandColumn",