2 phrasing-slur-engraver.cc -- implement Phrasing_slur_engraver
4 (c) 1997--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 #include "musical-request.hh"
10 #include "note-column.hh"
11 #include "translator-group.hh"
12 #include "engraver.hh"
15 class Phrasing_slur_engraver : public Engraver
17 Link_array<Span_req> requests_arr_;
18 Link_array<Span_req> new_phrasing_slur_req_l_arr_;
19 Link_array<Grob> phrasing_slur_l_stack_;
20 Link_array<Grob> end_phrasing_slur_l_arr_;
24 virtual bool try_music (Music*);
25 virtual void acknowledge_grob (Grob_info);
26 virtual void stop_translation_timestep ();
27 virtual void start_translation_timestep ();
28 virtual void finalize ();
29 virtual void create_grobs ();
32 VIRTUAL_COPY_CONS (Translator);
33 Phrasing_slur_engraver ();
36 Phrasing_slur_engraver::Phrasing_slur_engraver ()
38 last_start_ = Moment (-1);
42 Phrasing_slur_engraver::try_music (Music *req_l)
44 if (Span_req *sl = dynamic_cast <Span_req *> (req_l))
46 String t = ly_scm2string (sl->get_mus_property ("span-type"));
49 for (int i = 0; i < phrasing_slur_l_stack_.size (); i++)
51 phrasing_slur_l_stack_[i]->suicide ();
53 phrasing_slur_l_stack_.clear ();
54 for (int i = 0; i < end_phrasing_slur_l_arr_.size (); i++)
56 end_phrasing_slur_l_arr_[i]->suicide ();
58 end_phrasing_slur_l_arr_.clear ();
59 requests_arr_.clear ();
60 new_phrasing_slur_req_l_arr_.clear ();
62 else if (t == "phrasing-slur")
65 Let's not start more than one phrasing slur per moment.
67 if (sl->get_span_dir () == START)
69 if (now_mom () > last_start_)
71 new_phrasing_slur_req_l_arr_.push (sl);
72 last_start_ = now_mom ();
78 new_phrasing_slur_req_l_arr_.push (sl);
87 Phrasing_slur_engraver::acknowledge_grob (Grob_info info)
89 if (Note_column::has_interface (info.elem_l_))
91 Grob *e =info.elem_l_;
92 for (int i = 0; i < phrasing_slur_l_stack_.size (); i++)
93 Slur::add_column (phrasing_slur_l_stack_[i], e);
94 for (int i = 0; i < end_phrasing_slur_l_arr_.size (); i++)
95 Slur::add_column (end_phrasing_slur_l_arr_[i], e);
100 Phrasing_slur_engraver::finalize ()
102 for (int i = 0; i < phrasing_slur_l_stack_.size (); i++)
105 typeset_grob (phrasing_slur_l_stack_[i]);
108 Let's not typeset unterminated stuff
110 phrasing_slur_l_stack_[i]->suicide ();
113 phrasing_slur_l_stack_.clear ();
114 SCM wg = get_property ("weAreGraceContext");
115 bool wgb = to_boolean (wg);
117 for (int i=0; i < requests_arr_.size (); i++)
119 requests_arr_[i]->origin ()->warning (_ ("unterminated phrasing slur"));
124 Phrasing_slur_engraver::create_grobs ()
126 Link_array<Grob> start_phrasing_slur_l_arr;
127 for (int i=0; i< new_phrasing_slur_req_l_arr_.size (); i++)
129 Span_req* phrasing_slur_req_l = new_phrasing_slur_req_l_arr_[i];
130 // end phrasing slur: move the phrasing slur to other array
131 if (phrasing_slur_req_l->get_span_dir () == STOP)
133 if (phrasing_slur_l_stack_.empty ())
134 phrasing_slur_req_l->origin ()->warning (_f ("can't find start of phrasing slur"));
137 Grob* phrasing_slur = phrasing_slur_l_stack_.pop ();
138 SCM s = get_property ("phrasingSlurEndAttachment");
141 index_set_cell (phrasing_slur->get_grob_property ("attachment"), STOP, s);
143 end_phrasing_slur_l_arr_.push (phrasing_slur);
144 requests_arr_.pop ();
147 else if (phrasing_slur_req_l->get_span_dir () == START)
149 // push a new phrasing_slur onto stack.
150 // (use temp. array to wait for all phrasing_slur STOPs)
151 Grob* phrasing_slur = new Spanner (get_property ("PhrasingSlur"));
152 Slur::set_interface (phrasing_slur);
153 SCM s = get_property ("phrasingSlurBeginAttachment");
156 index_set_cell (phrasing_slur->get_grob_property ("attachment"), START, s);
158 start_phrasing_slur_l_arr.push (phrasing_slur);
159 requests_arr_.push (phrasing_slur_req_l);
160 announce_grob (phrasing_slur, phrasing_slur_req_l);
163 for (int i=0; i < start_phrasing_slur_l_arr.size (); i++)
164 phrasing_slur_l_stack_.push (start_phrasing_slur_l_arr[i]);
165 new_phrasing_slur_req_l_arr_.clear ();
169 Phrasing_slur_engraver::stop_translation_timestep ()
171 for (int i = 0; i < end_phrasing_slur_l_arr_.size (); i++)
173 typeset_grob (end_phrasing_slur_l_arr_[i]);
175 end_phrasing_slur_l_arr_.clear ();
179 Phrasing_slur_engraver::start_translation_timestep ()
181 new_phrasing_slur_req_l_arr_.clear ();
185 ADD_THIS_TRANSLATOR (Phrasing_slur_engraver);