]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/repeat-engraver.cc
release: 1.3.17
[lilypond.git] / lily / repeat-engraver.cc
index 62f5f4a48c07bc1b55348450c70b51fb2e930c6f..cdea34d4b270029e74273e509b0813225f772674 100644 (file)
 #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"
@@ -29,12 +29,9 @@ Repeat_engraver::do_try_music (Music* m)
   if (Repeated_music* r = dynamic_cast<Repeated_music *> (m))
     {
       if (repeated_music_l_)
-       {
-         m->warning ("Already have repeated music.");
-         return false;
-       }
+       return false;
       
-      if (r->semi_fold_b_)
+      if (r->volta_fold_b_)
        {
          repeated_music_l_ = r;
        }
@@ -58,7 +55,9 @@ 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 ();
 
-      
+  SCM novolta = get_property ("noVoltaBraces",0);
+  bool create_volta = !to_boolean (novolta);
+
   Cons_list<Bar_create_event> becel;
   becel.append (new Bar_create_event (now_mom (), "|:"));
 
@@ -92,17 +91,29 @@ Repeat_engraver::queue_events ()
            }
 
          
-         Bar_create_event * c = new Bar_create_event (walk_mom, last_number+ 1,
-                                                      volta_number);
-
-         if (!i->next_)
-           c->last_b_ = true;
-         
-         becel.append (c);
-         last_number = volta_number;
-         volta_number ++;
-
-         // should think about voltaSpannerDuration
+         if (create_volta)
+           {
+             Bar_create_event * c = new Bar_create_event (walk_mom, last_number+ 1,
+                                                          volta_number);
+             
+             if (!i->next_)
+               c->last_b_ = true;
+             
+             becel.append (c);
+             last_number = volta_number;
+             volta_number ++;
+              SCM l (get_property ("voltaSpannerDuration", 0));
+              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"));
+                   }
+               }
+           }
          walk_mom += i->car_->length_mom();
 
          if (i->next_)
@@ -174,7 +185,7 @@ Repeat_engraver::do_process_requests ()
        }
       else
        {
-         warning ("No bar engraver found. Ignoring repeats.");
+         warning (_ ("No bar engraver found.  Ignoring repeats."));
        }
 
       delete head->car_;