From a83aaeb059ad8cd747426dbf2d7eac845530ea12 Mon Sep 17 00:00:00 2001 From: Dan Eble Date: Fri, 19 Jun 2015 12:11:31 -0400 Subject: [PATCH] Issue 4465: Auto_change_iterator: move staff creation to Scheme --- lily/auto-change-iterator.cc | 31 ++++++---------------------- ly/engraver-init.ly | 4 ---- ly/music-functions-init.ly | 22 +++++++++++++++++--- scm/define-context-properties.scm | 6 ------ scm/define-music-display-methods.scm | 14 +++++++++++++ 5 files changed, 39 insertions(+), 38 deletions(-) diff --git a/lily/auto-change-iterator.cc b/lily/auto-change-iterator.cc index e72b53d9be..33ca53a8cc 100644 --- a/lily/auto-change-iterator.cc +++ b/lily/auto-change-iterator.cc @@ -32,21 +32,17 @@ public: Auto_change_iterator (); protected: - virtual void do_quit (); virtual void construct_children (); virtual void process (Moment); - vector 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); diff --git a/ly/engraver-init.ly b/ly/engraver-init.ly index fc40acb232..2ea76ac646 100644 --- a/ly/engraver-init.ly +++ b/ly/engraver-init.ly @@ -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 diff --git a/ly/music-functions-init.ly b/ly/music-functions-init.ly index 475c2cec90..27070d3501 100644 --- a/ly/music-functions-init.ly +++ b/ly/music-functions-init.ly @@ -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) diff --git a/scm/define-context-properties.scm b/scm/define-context-properties.scm index b224b89dc0..3ad11f4913 100644 --- a/scm/define-context-properties.scm +++ b/scm/define-context-properties.scm @@ -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, diff --git a/scm/define-music-display-methods.scm b/scm/define-music-display-methods.scm index 718c501e77..04c9c8beb3 100644 --- a/scm/define-music-display-methods.scm +++ b/scm/define-music-display-methods.scm @@ -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 -- 2.39.2