Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(62)

Side by Side Diff: lily/phrasing-slur-engraver.cc

Issue 7424049: Allows slurs to break at barlines.
Patch Set: Breaks slurs at repeats by default. Created 12 years, 1 month ago
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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 );
OLDNEW

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld f62528b