]> git.donarmstrong.com Git - lilypond.git/commitdiff
Issue 4465: Auto_change_iterator: move staff creation to Scheme
authorDan Eble <nine.fierce.ballads@gmail.com>
Fri, 19 Jun 2015 16:11:31 +0000 (12:11 -0400)
committerDan Eble <nine.fierce.ballads@gmail.com>
Thu, 2 Jul 2015 12:17:06 +0000 (08:17 -0400)
lily/auto-change-iterator.cc
ly/engraver-init.ly
ly/music-functions-init.ly
scm/define-context-properties.scm
scm/define-music-display-methods.scm

index e72b53d9bed764c6338607dadb52382864ce1850..33ca53a8ccd39c603c0e54c1cf48bfad91ec331d 100644 (file)
@@ -32,21 +32,17 @@ public:
   Auto_change_iterator ();
 
 protected:
-  virtual void do_quit ();
   virtual void construct_children ();
   virtual void process (Moment);
-  vector<Pitch> pending_pitch (Moment) const;
 private:
   SCM split_list_;
   Direction where_dir_;
-
-  Context_handle up_;
-  Context_handle down_;
 };
 
 void
 Auto_change_iterator::process (Moment m)
 {
+  // TODO: It seems strange that this occurs before consulting the split list.
   Music_wrapper_iterator::process (m);
 
   Moment *splitm = 0;
@@ -62,6 +58,9 @@ Auto_change_iterator::process (Moment m)
 
       if (d && d != where_dir_)
         {
+          // TODO: The function of where_dir_ in choosing the direction should
+          // be built into split-list generation so that this iterator merely
+          // effects a sequence of context changes.
           where_dir_ = d;
           string to_id = (d >= 0) ? "up" : "down";
           // N.B. change_to() returns an error message. Silence is the legacy
@@ -84,28 +83,10 @@ Auto_change_iterator::construct_children ()
 {
   split_list_ = get_music ()->get_property ("split-list");
 
-  SCM props = get_outlet ()->get_property ("trebleStaffProperties");
-  Context *up = get_outlet ()->find_create_context (ly_symbol2scm ("Staff"),
-                                                    "up", props);
-
-  props = get_outlet ()->get_property ("bassStaffProperties");
-  Context *down = get_outlet ()->find_create_context (ly_symbol2scm ("Staff"),
-                                                      "down", props);
-
-  up_.set_context (up);
-  down_.set_context (down);
-
-  Context *voice = up->find_create_context (ly_symbol2scm ("Voice"),
-                                            "", SCM_EOL);
+  Context *voice = get_outlet()->find_create_context (ly_symbol2scm ("Voice"),
+                                                      "", SCM_EOL);
   set_context (voice);
   Music_wrapper_iterator::construct_children ();
 }
 
-void
-Auto_change_iterator::do_quit ()
-{
-  up_.set_context (0);
-  down_.set_context (0);
-}
-
 IMPLEMENT_CTOR_CALLBACK (Auto_change_iterator);
index fc40acb2327e0e4ebb8c9f332f11cc1307b5c980..2ea76ac646cc180d2fd09ecc43ff02bee06207d8 100644 (file)
@@ -695,10 +695,6 @@ automatically when an output definition (a @code{\\score} or
   chordNameExceptionsPartial = #partialJazzExceptions
   noChordSymbol = #(make-simple-markup "N.C.")
 
-  bassStaffProperties = #'((assign clefGlyph "clefs.F")
-  (assign clefPosition 2)
-  (assign middleCPosition 6)
-  (assign middleCClefPosition 6))
   %% tablature:
   stringOneTopmost = ##t
   highStringOne = ##t
index 475c2cec906692fd7f6f3d0c13118372400c598a..27070d3501a9e2355f309a709cfb28e206908b33 100644 (file)
@@ -177,9 +177,25 @@ assertBeamSlope =
 autochange =
 #(define-music-function (music) (ly:music?)
    (_i "Make voices that switch between staves automatically")
-   (make-autochange-music music))
-
-
+   (let ;; keep the contexts alive for the full duration
+       ((skip (make-skip-music (make-duration-of-length 
+                                (ly:music-length music)))))
+     #{
+       <<
+         \context Staff = "up" <<
+           #(make-autochange-music music)
+           \new Voice { #skip }
+         >>
+         \context Staff = "down" \with {
+           clefGlyph = "clefs.F"
+           clefPosition = 2
+           middleCPosition = 6
+           middleCClefPosition = 6
+         } {
+           \new Voice { #skip }
+         }
+       >>
+     #} ))
 
 balloonGrobText =
 #(define-music-function (grob-name offset text)
index b224b89dc00ed598b56c3a24f59c529f02550b63..3ad11f49133bd29eff0792065b92a6645fb7d7ed 100644 (file)
@@ -176,9 +176,6 @@ own as a subdivided section.")
 called to produce the formatting for a @code{BassFigure} grob.  It
 takes a list of @code{BassFigureEvent}s, a context, and the grob to
 format.")
-     (bassStaffProperties ,list? "An alist of property settings to
-apply for the down staff of @code{PianoStaff}.  Used by
-@code{\\autochange}.")
      (beamExceptions ,list? "An alist of exceptions to autobeam rules
 that normally end on beats.")
      (beamHalfMeasure ,boolean? "Whether to allow a beam to begin
@@ -630,9 +627,6 @@ position, bar number, etc.?  Switch off for cadenzas.")
      (topLevelAlignment ,boolean? "If true, the @var{Vertical_align_engraver}
 will create a @var{VerticalAlignment}; otherwise, it will create a
 @var{StaffGrouper}")
-     (trebleStaffProperties ,list? "An alist of property settings to
-apply for the up staff of @code{PianoStaff}.  Used by
-@code{\\autochange}.")
      (tupletFullLength ,boolean? "If set, the tuplet is printed up to
 the start of the next note.")
      (tupletFullLengthNote ,boolean? "If set, end at the next note,
index 718c501e77d69a43df3d94cf1a01282c79ce922b..04c9c8beb3b8f67a3f65b7b5ab7a66e447c5388c 100644 (file)
@@ -1123,6 +1123,20 @@ Otherwise, return #f."
                          (*omit-duration* #t))
                         (music->lily-string (ly:music-property expr 'element)))))
 
+;; \autochange
+(define-extra-display-method SimultaneousMusic (expr)
+  (with-music-match (expr (music 'SimultaneousMusic
+                                 elements ((music 'ContextSpeccedMusic
+                                                  context-id "up"
+                                                  context-type 'Staff
+                                                  element (music 'SimultaneousMusic elements (?ac-music)))
+                                           (music 'ContextSpeccedMusic
+                                                  context-id "down"
+                                                  context-type 'Staff))))
+                    (with-music-match (?ac-music (music 'AutoChangeMusic))
+                                      (format #f "~a"
+                                              (music->lily-string ?ac-music)))))
+
 ;; \addlyrics
 (define-extra-display-method SimultaneousMusic (expr)
   (with-music-match (expr (music 'SimultaneousMusic