OLD | NEW |
1 /* | 1 /* |
2 This file is part of LilyPond, the GNU music typesetter. | 2 This file is part of LilyPond, the GNU music typesetter. |
3 | 3 |
4 Copyright (C) 1997--2012 Han-Wen Nienhuys <hanwen@xs4all.nl> | 4 Copyright (C) 1997--2012 Han-Wen Nienhuys <hanwen@xs4all.nl> |
5 | 5 |
6 LilyPond is free software: you can redistribute it and/or modify | 6 LilyPond is free software: you can redistribute it and/or modify |
7 it under the terms of the GNU General Public License as published by | 7 it under the terms of the GNU General Public License as published by |
8 the Free Software Foundation, either version 3 of the License, or | 8 the Free Software Foundation, either version 3 of the License, or |
9 (at your option) any later version. | 9 (at your option) any later version. |
10 | 10 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
45 least, it is for phrasing slurs: a note can be both beginning and | 45 least, it is for phrasing slurs: a note can be both beginning and |
46 ending of a phrase. | 46 ending of a phrase. |
47 */ | 47 */ |
48 class Phrasing_slur_engraver : public Engraver | 48 class Phrasing_slur_engraver : public Engraver |
49 { | 49 { |
50 vector<Stream_event *> start_events_; | 50 vector<Stream_event *> start_events_; |
51 vector<Stream_event *> stop_events_; | 51 vector<Stream_event *> stop_events_; |
52 vector<Grob *> slurs_; | 52 vector<Grob *> slurs_; |
53 vector<Grob *> end_slurs_; | 53 vector<Grob *> end_slurs_; |
54 vector<Grob_info> objects_to_acknowledge_; | 54 vector<Grob_info> objects_to_acknowledge_; |
| 55 Stream_event *break_slur_; |
55 | 56 |
56 protected: | 57 protected: |
57 DECLARE_TRANSLATOR_LISTENER (phrasing_slur); | 58 DECLARE_TRANSLATOR_LISTENER (phrasing_slur); |
| 59 DECLARE_TRANSLATOR_LISTENER (break_phrasing_slur); |
58 DECLARE_ACKNOWLEDGER (inline_accidental); | 60 DECLARE_ACKNOWLEDGER (inline_accidental); |
59 DECLARE_ACKNOWLEDGER (fingering); | 61 DECLARE_ACKNOWLEDGER (fingering); |
60 DECLARE_ACKNOWLEDGER (note_column); | 62 DECLARE_ACKNOWLEDGER (note_column); |
61 DECLARE_ACKNOWLEDGER (slur); | 63 DECLARE_ACKNOWLEDGER (slur); |
62 DECLARE_ACKNOWLEDGER (script); | 64 DECLARE_ACKNOWLEDGER (script); |
63 DECLARE_ACKNOWLEDGER (dots); | 65 DECLARE_ACKNOWLEDGER (dots); |
64 DECLARE_ACKNOWLEDGER (text_script); | 66 DECLARE_ACKNOWLEDGER (text_script); |
65 DECLARE_END_ACKNOWLEDGER (tie); | 67 DECLARE_END_ACKNOWLEDGER (tie); |
66 DECLARE_ACKNOWLEDGER (tuplet_number); | 68 DECLARE_ACKNOWLEDGER (tuplet_number); |
67 | 69 |
(...skipping 27 matching lines...) Expand all Loading... |
95 { | 97 { |
96 Direction d = to_dir (ev->get_property ("span-direction")); | 98 Direction d = to_dir (ev->get_property ("span-direction")); |
97 if (d == START) | 99 if (d == START) |
98 start_events_.push_back (ev); | 100 start_events_.push_back (ev); |
99 else if (d == STOP) | 101 else if (d == STOP) |
100 stop_events_.push_back (ev); | 102 stop_events_.push_back (ev); |
101 else ev->origin ()->warning (_f ("direction of %s invalid: %d", | 103 else ev->origin ()->warning (_f ("direction of %s invalid: %d", |
102 "phrasing-slur-event", int (d))); | 104 "phrasing-slur-event", int (d))); |
103 } | 105 } |
104 | 106 |
| 107 IMPLEMENT_TRANSLATOR_LISTENER (Phrasing_slur_engraver, break_phrasing_slur); |
| 108 void |
| 109 Phrasing_slur_engraver::listen_break_phrasing_slur (Stream_event *ev) |
| 110 { |
| 111 ASSIGN_EVENT_ONCE (break_slur_, ev); |
| 112 } |
| 113 |
105 void | 114 void |
106 Phrasing_slur_engraver::acknowledge_note_column (Grob_info info) | 115 Phrasing_slur_engraver::acknowledge_note_column (Grob_info info) |
107 { | 116 { |
108 Grob *e = info.grob (); | 117 Grob *e = info.grob (); |
109 for (vsize i = slurs_.size (); i--;) | 118 for (vsize i = slurs_.size (); i--;) |
110 Slur::add_column (slurs_[i], e); | 119 Slur::add_column (slurs_[i], e); |
111 for (vsize i = end_slurs_.size (); i--;) | 120 for (vsize i = end_slurs_.size (); i--;) |
112 Slur::add_column (end_slurs_[i], e); | 121 Slur::add_column (end_slurs_[i], e); |
113 } | 122 } |
114 | 123 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
174 { | 183 { |
175 slurs_[i]->warning (_ ("unterminated phrasing slur")); | 184 slurs_[i]->warning (_ ("unterminated phrasing slur")); |
176 slurs_[i]->suicide (); | 185 slurs_[i]->suicide (); |
177 } | 186 } |
178 slurs_.clear (); | 187 slurs_.clear (); |
179 } | 188 } |
180 | 189 |
181 void | 190 void |
182 Phrasing_slur_engraver::process_music () | 191 Phrasing_slur_engraver::process_music () |
183 { | 192 { |
| 193 if (break_slur_ |
| 194 && unsmob_grob (get_property ("currentCommandColumn"))) |
| 195 { |
| 196 for (vsize i = slurs_.size (); i--;) |
| 197 { |
| 198 Grob *ccc = unsmob_grob (get_property ("currentCommandColumn")); |
| 199 Spanner *s = dynamic_cast<Spanner *> (slurs_[i]); |
| 200 s->set_bound (RIGHT, ccc); |
| 201 announce_end_grob (s, SCM_EOL); |
| 202 slurs_.erase (slurs_.begin () + i); |
| 203 if (robust_scm2dir (break_slur_->get_property ("side-to-junk"), CENTER
) == LEFT) |
| 204 s->suicide (); |
| 205 |
| 206 if (robust_scm2dir (break_slur_->get_property ("side-to-junk"), CENTER
) != RIGHT) |
| 207 { |
| 208 SCM spanner_id = s->get_property ("spanner-id"); |
| 209 Spanner *slur = make_spanner ("Slur", s->self_scm ()); |
| 210 slur->set_property ("spanner-id", spanner_id); |
| 211 if (scm_is_number (s->get_property_data ("direction"))) |
| 212 set_grob_direction (slur, robust_scm2dir (s->get_property ("dire
ction"), UP)); |
| 213 slur->set_bound (LEFT, ccc); |
| 214 slurs_.push_back (slur); |
| 215 } |
| 216 } |
| 217 } |
| 218 else if (to_boolean (get_property ("breakSlurHere"))) |
| 219 warning ("no current command column to break slur"); |
| 220 |
184 for (vsize i = 0; i < stop_events_.size (); i++) | 221 for (vsize i = 0; i < stop_events_.size (); i++) |
185 { | 222 { |
186 Stream_event *ev = stop_events_[i]; | 223 Stream_event *ev = stop_events_[i]; |
187 string id = robust_scm2string (ev->get_property ("spanner-id"), ""); | 224 string id = robust_scm2string (ev->get_property ("spanner-id"), ""); |
188 | 225 |
189 // Find the slurs that are ended with this event (by checking the spanner-
id) | 226 // Find the slurs that are ended with this event (by checking the spanner-
id) |
190 bool ended = false; | 227 bool ended = false; |
191 for (vsize j = slurs_.size (); j--;) | 228 for (vsize j = slurs_.size (); j--;) |
192 { | 229 { |
193 if (id == robust_scm2string (slurs_[j]->get_property ("spanner-id"), "
")) | 230 if (id == robust_scm2string (slurs_[j]->get_property ("spanner-id"), "
")) |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
298 announce_end_grob (s, SCM_EOL); | 335 announce_end_grob (s, SCM_EOL); |
299 } | 336 } |
300 | 337 |
301 for (vsize i = 0; i < objects_to_acknowledge_.size (); i++) | 338 for (vsize i = 0; i < objects_to_acknowledge_.size (); i++) |
302 Slur::auxiliary_acknowledge_extra_object (objects_to_acknowledge_[i], slurs_
, end_slurs_); | 339 Slur::auxiliary_acknowledge_extra_object (objects_to_acknowledge_[i], slurs_
, end_slurs_); |
303 | 340 |
304 objects_to_acknowledge_.clear (); | 341 objects_to_acknowledge_.clear (); |
305 end_slurs_.clear (); | 342 end_slurs_.clear (); |
306 start_events_.clear (); | 343 start_events_.clear (); |
307 stop_events_.clear (); | 344 stop_events_.clear (); |
| 345 break_slur_ = 0; |
308 } | 346 } |
309 | 347 |
310 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, inline_accidental); | 348 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, inline_accidental); |
311 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, fingering) | 349 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, fingering) |
312 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, note_column); | 350 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, note_column); |
313 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, slur); | 351 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, slur); |
314 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, script); | 352 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, script); |
315 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, dots); | 353 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, dots); |
316 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, text_script); | 354 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, text_script); |
317 ADD_END_ACKNOWLEDGER (Phrasing_slur_engraver, tie); | 355 ADD_END_ACKNOWLEDGER (Phrasing_slur_engraver, tie); |
318 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, tuplet_number); | 356 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, tuplet_number); |
319 | 357 |
320 ADD_TRANSLATOR (Phrasing_slur_engraver, | 358 ADD_TRANSLATOR (Phrasing_slur_engraver, |
321 /* doc */ | 359 /* doc */ |
322 "Print phrasing slurs. Similar to @ref{Slur_engraver}.", | 360 "Print phrasing slurs. Similar to @ref{Slur_engraver}.", |
323 | 361 |
324 /* create */ | 362 /* create */ |
325 "PhrasingSlur ", | 363 "PhrasingSlur ", |
326 | 364 |
327 /* read */ | 365 /* read */ |
328 "", | 366 "", |
329 | 367 |
330 /* write */ | 368 /* write */ |
331 "" | 369 "" |
332 ); | 370 ); |
OLD | NEW |