]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/repeat-engraver.cc
patch::: 1.3.57.jcn2
[lilypond.git] / lily / repeat-engraver.cc
index 9ca3649fe3a9c8192367df058531512ff2d6ab52..72572c389133c552b97745f263ba1bb717edde79 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--1999 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1998--2000 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "repeat-engraver.hh"
 #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,22 +29,31 @@ 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;
-         return true;
        }
+
+      /*
+       We acknowledge other types of unfolded music as well, to
+       get auto context selection right.
+       */
+      if (r->type_ == "volta" || r->type_ == "unfolded")
+       return true;
+
     }
   return false;
 }
 
 /**
  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 ()
@@ -52,7 +61,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");
+  bool create_volta = !to_boolean (novolta);
+
   Cons_list<Bar_create_event> becel;
   becel.append (new Bar_create_event (now_mom (), "|:"));
 
@@ -86,17 +97,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"));
+              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_)
@@ -104,13 +127,18 @@ Repeat_engraver::queue_events ()
          else
            becel.append (new Bar_create_event (walk_mom, "stop"));
        }
-    } 
-  create_barmoments_queue_ = becel.head_ ;
+    }
+
+  Cons<Bar_create_event> *&tail = create_barmoments_queue_
+    ? last_cons (create_barmoments_queue_)->next_
+    : create_barmoments_queue_;
+
+  tail = becel.head_ ;
   becel.head_ = 0;
 }
 
 void
-Repeat_engraver::do_process_requests ()
+Repeat_engraver::do_process_music ()
 {
   if (repeated_music_l_ && !done_this_one_b_)
     { 
@@ -129,7 +157,6 @@ Repeat_engraver::do_process_requests ()
   /*
     Do all the events that need to be done now.
   */
-  bool stop = false;
   while (head && now_mom () == head->car_->when_)
     {
       create_barmoments_queue_ = create_barmoments_queue_->next_;
@@ -153,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.
            }
@@ -164,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_;