2 phrasing-slur-engraver.cc -- implement Phrasing_slur_engraver
4 (c) 1997--2002 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 TRANSLATOR_DECLARATIONS(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.grob_l_))
91 Grob *e =info.grob_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 ();
115 for (int i=0; i < requests_arr_.size (); i++)
117 requests_arr_[i]->origin ()->warning (_ ("unterminated phrasing slur"));
122 Phrasing_slur_engraver::create_grobs ()
124 Link_array<Grob> start_phrasing_slur_l_arr;
125 for (int i=0; i< new_phrasing_slur_req_l_arr_.size (); i++)
127 Span_req* phrasing_slur_req_l = new_phrasing_slur_req_l_arr_[i];
128 // end phrasing slur: move the phrasing slur to other array
129 if (phrasing_slur_req_l->get_span_dir () == STOP)
131 if (phrasing_slur_l_stack_.empty ())
132 phrasing_slur_req_l->origin ()->warning (_f ("can't find start of phrasing slur"));
135 Grob* phrasing_slur = phrasing_slur_l_stack_.pop ();
136 SCM s = get_property ("phrasingSlurEndAttachment");
139 index_set_cell (phrasing_slur->get_grob_property ("attachment"), STOP, s);
141 end_phrasing_slur_l_arr_.push (phrasing_slur);
142 requests_arr_.pop ();
145 else if (phrasing_slur_req_l->get_span_dir () == START)
147 // push a new phrasing_slur onto stack.
148 // (use temp. array to wait for all phrasing_slur STOPs)
149 Grob* phrasing_slur = new Spanner (get_property ("PhrasingSlur"));
150 Slur::set_interface (phrasing_slur); // can't remove.
151 SCM s = get_property ("phrasingSlurBeginAttachment");
154 index_set_cell (phrasing_slur->get_grob_property ("attachment"), START, s);
156 start_phrasing_slur_l_arr.push (phrasing_slur);
157 requests_arr_.push (phrasing_slur_req_l);
158 announce_grob(phrasing_slur, phrasing_slur_req_l->self_scm());
161 for (int i=0; i < start_phrasing_slur_l_arr.size (); i++)
162 phrasing_slur_l_stack_.push (start_phrasing_slur_l_arr[i]);
163 new_phrasing_slur_req_l_arr_.clear ();
167 Phrasing_slur_engraver::stop_translation_timestep ()
169 for (int i = 0; i < end_phrasing_slur_l_arr_.size (); i++)
171 typeset_grob (end_phrasing_slur_l_arr_[i]);
173 end_phrasing_slur_l_arr_.clear ();
177 Phrasing_slur_engraver::start_translation_timestep ()
179 new_phrasing_slur_req_l_arr_.clear ();
184 ENTER_DESCRIPTION(Phrasing_slur_engraver,
185 /* descr */ "Print phrasing slurs. Similar to Slur_engraver",
186 /* creats*/ "PhrasingSlur",
187 /* acks */ "note-column-interface",
188 /* reads */ "slurBeginAttachment slurEndAttachment slurMelismaBusy",