]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/volta-repeat-iterator.cc
lilypond-manuals.css: edit color scheme and some spacing
[lilypond.git] / lily / volta-repeat-iterator.cc
index 09c2495f05dae8febe0184981b174d2f1d3cedf1..8f9dca3b0b9451043c893f7e9203ce4d8bf442b7 100644 (file)
@@ -20,6 +20,7 @@
 #include "music.hh"
 #include "sequential-iterator.hh"
 #include "context.hh"
+#include "lily-imports.hh"
 
 class Volta_repeat_iterator : public Sequential_iterator
 {
@@ -85,8 +86,7 @@ Volta_repeat_iterator::add_repeat_command (SCM what)
   SCM current_reps = SCM_EOL;
   Context *where = get_outlet ()->where_defined (reps, &current_reps);
 
-  if (where
-      && (current_reps == SCM_EOL || scm_is_pair (current_reps)))
+  if (where && ly_cheap_is_list (current_reps))
     {
       current_reps = scm_cons (what, current_reps);
       where->set_property (reps, current_reps);
@@ -129,7 +129,7 @@ Volta_repeat_iterator::next_element (bool side_effect)
           else
             {
 
-              add_repeat_command (scm_list_n (ly_symbol2scm ("volta"), SCM_BOOL_F, SCM_UNDEFINED));
+              add_repeat_command (scm_list_2 (ly_symbol2scm ("volta"), SCM_BOOL_F));
 
               if (done_count_ - 1 < alt_count_)
                 {
@@ -137,9 +137,27 @@ Volta_repeat_iterator::next_element (bool side_effect)
 
                   if (to_boolean (get_outlet ()->get_property ("timing")))
                     {
+                      SCM mps = ly_symbol2scm ("measurePosition");
                       for (SCM p = alt_restores_; scm_is_pair (p); p = scm_cdr (p))
-                        scm_apply_0 (ly_lily_module_constant ("ly:context-set-property!"),
-                                     scm_car (p));
+                        {
+                          SCM ls = scm_car (p);
+                          if (scm_is_eq (scm_cadr (ls), mps))
+                            // Repeats may have different grace timing, so
+                            // we need to adjust the measurePosition grace
+                            // timing to that of the current alternative
+                            // rather than that of the first.  The
+                            // Timing_translator does this already but is
+                            // too late to avoid bad side-effects
+                            {
+                              Moment mp (unsmob<Moment> (scm_caddr (ls))->main_part_,
+                                         get_outlet ()->now_mom ().grace_part_);
+                              Lily::ly_context_set_property_x (scm_car (ls),
+                                                               mps,
+                                                               mp.smobbed_copy ());
+                            }
+                          else
+                            scm_apply_0 (Lily::ly_context_set_property_x, ls);
+                        }
                     }
                 }
             }
@@ -148,8 +166,8 @@ Volta_repeat_iterator::next_element (bool side_effect)
             repstr = "1.--" + ::to_string (rep_count_ - alt_count_ + done_count_) + ".";
 
           if (done_count_ <= alt_count_)
-            add_repeat_command (scm_list_n (ly_symbol2scm ("volta"),
-                                            ly_string2scm (repstr), SCM_UNDEFINED));
+            add_repeat_command (scm_list_2 (ly_symbol2scm ("volta"),
+                                            ly_string2scm (repstr)));
         }
       else
         add_repeat_command (ly_symbol2scm ("end-repeat"));