]> git.donarmstrong.com Git - lilypond.git/blob - lily/instrument-name-engraver.cc
* lily/include/grob-info.hh (class Grob_info): make data member
[lilypond.git] / lily / instrument-name-engraver.cc
1 /*
2   instrument-name-engraver.cc -- implement Instrument_name_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2000--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8
9 #include "engraver.hh"
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"
15 #include "context.hh"
16 #include "text-item.hh"
17
18 class Instrument_name_engraver : public Engraver
19 {
20
21 public:
22   TRANSLATOR_DECLARATIONS (Instrument_name_engraver);
23
24 protected:
25   Grob *text_;
26
27   virtual void create_text ();
28   virtual void initialize ();
29   virtual void acknowledge_grob (Grob_info);
30   virtual void stop_translation_timestep ();
31   virtual void process_music ();
32 };
33
34 Instrument_name_engraver::Instrument_name_engraver ()
35 {
36   text_ = 0;
37 }
38
39 void
40 Instrument_name_engraver::initialize ()
41 {
42   context ()->set_property ("instrumentSupport", SCM_EOL);
43 }
44
45 void
46 Instrument_name_engraver::stop_translation_timestep ()
47 {
48   if (text_)
49     {
50       text_->set_property ("side-support-elements",
51                            get_property ("instrumentSupport"));
52       text_ = 0;
53     }
54 }
55
56 void
57 Instrument_name_engraver::create_text ()
58 {
59   if (text_)
60     return;
61
62   SCM txt = get_property ("instrument");
63
64   if (now_mom () > Moment (0))
65     txt = get_property ("instr");
66   /*
67     UGH.
68   */
69   if (txt == SCM_EOL)
70     return;
71
72   text_ = make_item ("InstrumentName", SCM_EOL);
73
74   if (text_->get_property ("text") != txt)
75     text_->set_property ("text", txt);
76 }
77
78 void
79 Instrument_name_engraver::acknowledge_grob (Grob_info i)
80 {
81   if (Bar_line::has_interface (i.grob ()))
82     {
83       create_text ();
84     }
85
86   /*
87     Ugh - typechecking for pedal and dynamic sucks.
88   */
89   if (dynamic_cast<Spanner *> (i.grob ())
90       && (i.grob ()->internal_has_interface (ly_symbol2scm ("dynamic-interface"))
91           || i.grob ()->internal_has_interface (ly_symbol2scm ("piano-pedal-interface"))))
92     return;
93
94   /*
95     Hang the instrument names on the staves, but not on the alignment
96     groups enclosing that staff. The alignment has no real location,
97     but is only a vehicle for the placement routine it contains, and
98     therefore the location of its refpoint won't be very useful.
99
100     We could also just use stavesFound, but lets keep this working
101     without staffs as well.
102   */
103   if (dynamic_cast<Spanner *> (i.grob ())
104       && ((Axis_group_interface::has_interface (i.grob ())
105            && Axis_group_interface::has_axis (i.grob (), Y_AXIS)))
106       && !Align_interface::has_interface (i.grob ()))
107     {
108       SCM nl = scm_cons (i.grob ()->self_scm (),
109                          get_property ("instrumentSupport"));
110
111       context ()->set_property ("instrumentSupport", nl);
112     }
113 }
114
115 void
116 Instrument_name_engraver::process_music ()
117 {
118   /*
119     Also create text if barlines in other groups. This allows
120     a name to be attached to lyrics or chords.
121   */
122   if (scm_is_string (get_property ("whichBar")))
123     create_text ();
124 }
125
126 ADD_TRANSLATOR (Instrument_name_engraver,
127                 /* descr */ " Prints the name of the instrument (specified by "
128                 " @code{Staff.instrument} and @code{Staff.instr}) "
129                 "at the left of the staff. ",
130                 /* creats*/ "InstrumentName",
131                 /* accepts */ "",
132                 /* acks  */ "bar-line-interface axis-group-interface",
133                 /* reads */ "instrument instr",
134                 /* write */ "");
135
136 /****************************************************************/
137
138 class Vocal_name_engraver : public Instrument_name_engraver
139 {
140 public:
141   TRANSLATOR_DECLARATIONS (Vocal_name_engraver);
142   virtual void create_text ();
143 };
144
145 Vocal_name_engraver::Vocal_name_engraver ()
146 {
147 }
148
149 void
150 Vocal_name_engraver::create_text ()
151 {
152   if (text_)
153     return;
154
155   SCM txt = get_property ("vocalName");
156
157   if (now_mom () > Moment (0))
158     txt = get_property ("vocNam");
159
160   /*
161     UGH.
162   */
163   if (txt == SCM_EOL)
164     return;
165
166   text_ = make_item ("VocalName", SCM_EOL);
167
168   if (text_->get_property ("text") != txt)
169     text_->set_property ("text", txt);
170 }
171
172 ADD_TRANSLATOR (Vocal_name_engraver,
173                 /* descr */ " Prints the name of the a lyric voice (specified by "
174                 " @code{Staff.vocalName} and @code{Staff.vocNam}) "
175                 "at the left of the staff. ",
176                 /* creats*/ "VocalName",
177                 /* accepts */ "",
178                 /* acks  */ "bar-line-interface axis-group-interface",
179                 /* reads */ "vocNam vocalName",
180                 /* write */ "");