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> requestses_;
18 Link_array<Span_req> new_phrasing_slur_reqs_;
19 Link_array<Grob> phrasing_slur_l_stack_;
20 Link_array<Grob> end_phrasing_slurs_;
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 process_acknowledged_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)
44 if (Span_req *sl = dynamic_cast <Span_req *> (req))
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_slurs_.size (); i++)
56 end_phrasing_slurs_[i]->suicide ();
58 end_phrasing_slurs_.clear ();
60 new_phrasing_slur_reqs_.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_reqs_.push (sl);
72 last_start_ = now_mom ();
78 new_phrasing_slur_reqs_.push (sl);
87 Phrasing_slur_engraver::acknowledge_grob (Grob_info info)
89 if (Note_column::has_interface (info.grob_))
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_slurs_.size (); i++)
95 Slur::add_column (end_phrasing_slurs_[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 < requestses_.size (); i++)
117 requestses_[i]->origin ()->warning (_ ("unterminated phrasing slur"));
122 Phrasing_slur_engraver::process_acknowledged_grobs ()
124 Link_array<Grob> start_phrasing_slurs;
125 for (int i=0; i< new_phrasing_slur_reqs_.size (); i++)
127 Span_req* phrasing_slur_req = new_phrasing_slur_reqs_[i];
128 // end phrasing slur: move the phrasing slur to other array
129 if (phrasing_slur_req->get_span_dir () == STOP)
131 if (phrasing_slur_l_stack_.empty ())
132 phrasing_slur_req->origin ()->warning (_f ("can't find start of phrasing slur"));
135 Grob* phrasing_slur = phrasing_slur_l_stack_.pop ();
136 end_phrasing_slurs_.push (phrasing_slur);
140 else if (phrasing_slur_req->get_span_dir () == START)
142 // push a new phrasing_slur onto stack.
143 // (use temp. array to wait for all phrasing_slur STOPs)
144 Grob* phrasing_slur = new Spanner (get_property ("PhrasingSlur"));
145 Slur::set_interface (phrasing_slur); // can't remove.
146 start_phrasing_slurs.push (phrasing_slur);
147 requestses_.push (phrasing_slur_req);
148 announce_grob(phrasing_slur, phrasing_slur_req->self_scm());
151 for (int i=0; i < start_phrasing_slurs.size (); i++)
152 phrasing_slur_l_stack_.push (start_phrasing_slurs[i]);
153 new_phrasing_slur_reqs_.clear ();
157 Phrasing_slur_engraver::stop_translation_timestep ()
159 for (int i = 0; i < end_phrasing_slurs_.size (); i++)
161 typeset_grob (end_phrasing_slurs_[i]);
163 end_phrasing_slurs_.clear ();
167 Phrasing_slur_engraver::start_translation_timestep ()
169 new_phrasing_slur_reqs_.clear ();
174 ENTER_DESCRIPTION(Phrasing_slur_engraver,
175 /* descr */ "Print phrasing slurs. Similar to Slur_engraver",
176 /* creats*/ "PhrasingSlur",
177 /* accepts */ "general-music",
178 /* acks */ "note-column-interface",
179 /* reads */ "slurMelismaBusy",