X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Frepeat-engraver.cc;h=72572c389133c552b97745f263ba1bb717edde79;hb=b542997680bb2d95c3a03a77468b67e04d30685f;hp=9dad869f63514e2ffe80c9bc1a11dcff7dee5cc0;hpb=eabde958a9a4559f474d2736e298bfda9920c4e0;p=lilypond.git diff --git a/lily/repeat-engraver.cc b/lily/repeat-engraver.cc index 9dad869f63..72572c3891 100644 --- a/lily/repeat-engraver.cc +++ b/lily/repeat-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--1999 Jan Nieuwenhuizen + (c) 1998--2000 Jan Nieuwenhuizen */ #include "repeat-engraver.hh" @@ -12,10 +12,10 @@ #include "musical-request.hh" #include "multi-measure-rest.hh" #include "command-request.hh" -#include "time-description.hh" +#include "timing-translator.hh" #include "engraver-group-engraver.hh" -#include "new-repeated-music.hh" -#include "time-description.hh" +#include "repeated-music.hh" +#include "timing-translator.hh" #include "volta-spanner.hh" #include "note-column.hh" #include "paper-def.hh" @@ -31,7 +31,7 @@ Repeat_engraver::do_try_music (Music* m) if (repeated_music_l_) return false; - if (r->semi_fold_b_) + if (r->volta_fold_b_) { repeated_music_l_ = r; } @@ -40,7 +40,8 @@ Repeat_engraver::do_try_music (Music* m) We acknowledge other types of unfolded music as well, to get auto context selection right. */ - return true; + if (r->type_ == "volta" || r->type_ == "unfolded") + return true; } return false; @@ -48,6 +49,11 @@ Repeat_engraver::do_try_music (Music* m) /** Walk through repeat music, and generate events for appropriate times. + + UGH. Should use Music_iteration for this. + + Should also queue some event to get timing information reset during + 2nd and following voltas. */ void Repeat_engraver::queue_events () @@ -55,7 +61,8 @@ Repeat_engraver::queue_events () Music_sequence* alt = repeated_music_l_->alternatives_p_; Moment walk_mom = now_mom () + repeated_music_l_->repeat_body_p_->length_mom (); - bool create_volta = ! get_property ("noVoltaBraces",0).to_bool (); + SCM novolta = get_property ("noVoltaBraces"); + bool create_volta = !to_boolean (novolta); Cons_list becel; becel.append (new Bar_create_event (now_mom (), "|:")); @@ -101,8 +108,18 @@ Repeat_engraver::queue_events () becel.append (c); last_number = volta_number; volta_number ++; + SCM l (get_property ("voltaSpannerDuration")); + if (SMOB_IS_TYPE_B (Moment, l)) + { + Moment vSD_mom = *SMOB_TO_TYPE (Moment,l); + if ( vSD_mom < i->car_->length_mom() ) // terminate volta early ? + { + vSD_mom += walk_mom; + c->last_b_ = true; + becel.append (new Bar_create_event (vSD_mom, "stop")); + } + } } - // should think about voltaSpannerDuration walk_mom += i->car_->length_mom(); if (i->next_) @@ -121,7 +138,7 @@ Repeat_engraver::queue_events () } void -Repeat_engraver::do_process_requests () +Repeat_engraver::do_process_music () { if (repeated_music_l_ && !done_this_one_b_) { @@ -163,10 +180,12 @@ Repeat_engraver::do_process_requests () else { assert (!volta_span_p_); - volta_span_p_ = new Volta_spanner; + volta_span_p_ = new Volta_spanner (get_property ("basicVoltaSpannerProperties")); announce_element (Score_element_info (volta_span_p_,0)); - volta_span_p_->number_str_ = t; - volta_span_p_->last_b_ = head->car_->last_b_; + volta_span_p_->set_elt_property ("text", + ly_str02scm (t.ch_C())); + volta_span_p_->set_elt_property ("last-volta", + gh_bool2scm (head->car_->last_b_)); // voltaSpannerDuration stuff here. // other property stuff here. } @@ -174,7 +193,7 @@ Repeat_engraver::do_process_requests () } else { - warning ("No bar engraver found. Ignoring repeats."); + warning (_ ("No bar engraver found. Ignoring repeats.")); } delete head->car_;