]> 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 bcbc34f8cb3b9d3800436d495ac33c8ce65cc6e9..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
 {
@@ -128,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_)
                 {
@@ -136,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);
+                        }
                     }
                 }
             }
@@ -147,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"));