At 21:21 on 31 Jul 2016, David Kastrup wrote:
>Mark Knoop <m...@opus11.net> writes:
>> OK. Attached are two patches and a test case. The patches are two
>> alternate methods of approaching the problem.
>>
>> Keep a staff alive with multiple layers
>> ---------------------------------------
>>
>> This changes the remove-layer property to number-or-pair? such that a
>> list of values can be specified. The layer will remain alive with any
>> other layer whose remove-layer value is in the list.
>
>If one can specify more than one remove-layer, what layer does a staff
>belong to?  If there is no longer numerical order, how are cycles
>avoided?

If remove-layer is a list, the staff is dependent only, and does not
participate in the layering decisions (as an empty list does
currently). It is only controlled by other layers.

>All in all, I am more sympathetic to the list approach (which looks
>more generic), it is just that I see a lot of potential for paradoxes
>or even hangs.  I may be wrong.

Yes, I think the list approach is the better way to go. By making
list-set layers only dependent, I don't see that any cyclic problems
can occur.

remove-layer settings:

- '(): staff always alive (default)
- #f: staff alive or dead according to its own keepAliveInterfaces
- integer: staff alive only if all lower layer staves are dead
- list: staff alive with any stave with an included remove-layer value

James, could you test this patch for review please? I will work on
documentation.

--
Mark Knoop
\version "2.19.45"
boring = \set Staff.keepAliveInterfaces = #'()
tricky = \unset Staff.keepAliveInterfaces

staffC = {
  \boring \repeat unfold 72 c''4
  \tricky <c'' g''>1
  \boring \repeat unfold 44 c''4
  R1*10
}

staffD = {
  \boring \repeat unfold 80 c'4
  \tricky <c' g'>1
  \boring \repeat unfold 36 c'4
  R1*10
}

\score {
  <<
    \new Staff \with {
      instrumentName = "Continuous"
      shortInstrumentName = "c"
    } { \repeat unfold 200 g'4 }
    \new StaffGroup \with {
      \consists Keep_alive_together_engraver
    } <<
      \new Staff \with {
        keepAliveInterfaces = #'()
        instrumentName = "With group"
        shortInstrumentName = "w"
		    \override VerticalAxisGroup.remove-empty = ##t
		    \override VerticalAxisGroup.remove-first = ##t
        %%% uncomment for 0001-Keep-a-staff-alive-with-multiple-layers.patch
        %\override VerticalAxisGroup.remove-layer = #'(#f) % lives with A and/or B
        %\override VerticalAxisGroup.remove-layer = #'(1) % lives with C and/or D
        %\override VerticalAxisGroup.remove-layer = #'(2) % lives with C+D
        \override VerticalAxisGroup.remove-layer = #'(#f 1) % lives with A, B, C or D
        %\override VerticalAxisGroup.remove-layer = 1,2 % lives with C, D or C+D
      } { \repeat unfold 200 c''4 }
      \new Staff \with {
        instrumentName = "A"
        shortInstrumentName = "A"
		    \override VerticalAxisGroup.remove-empty = ##t
		    \override VerticalAxisGroup.remove-first = ##t
        \override VerticalAxisGroup.remove-layer = ##f
      } {
        \repeat unfold 20 c'4
        R1*20
        \repeat unfold 20 c'4
        R1*20
      }
      \new Staff \with {
        instrumentName = "B"
        shortInstrumentName = "B"
		    \override VerticalAxisGroup.remove-empty = ##t
		    \override VerticalAxisGroup.remove-first = ##t
        \override VerticalAxisGroup.remove-layer = ##f
      } {
        R1*10
        \repeat unfold 40 c'4
        \repeat unfold 40 c'4
        R1*20
      }
      \new Staff \with {
        instrumentName = "C"
        shortInstrumentName = "C"
		    \override VerticalAxisGroup.remove-empty = ##t
		    \override VerticalAxisGroup.remove-first = ##t
        \override VerticalAxisGroup.remove-layer = 1
      } { \staffC R1*5 \tricky \repeat unfold 10 g'2 }
      \new Staff \with {
        instrumentName = "D"
        shortInstrumentName = "D"
		    \override VerticalAxisGroup.remove-empty = ##t
		    \override VerticalAxisGroup.remove-first = ##t
        \override VerticalAxisGroup.remove-layer = 1
      } \staffD
      \new Staff \with {
        instrumentName = "C plus D"
        shortInstrumentName = "C+D"
        %%% TODO: how to remove this staff when both C and D are rests
		    %\override VerticalAxisGroup.remove-empty = ##t
		    %\override VerticalAxisGroup.remove-first = ##t
        \override VerticalAxisGroup.remove-layer = 2
      } << \staffC \\ \staffD >>
    >>
  >>
}
>From 4f8846436a395f6fe7d7fecf0c54c8f4aa9f4e1a Mon Sep 17 00:00:00 2001
From: Mark Knoop <m...@markknoop.com>
Date: Sun, 31 Jul 2016 15:41:37 +0100
Subject: [PATCH] Keep a staff alive with multiple layers

This allows the `VerticalAxisGroup.remove-layer' property to
accept a list of values. The layer will stay alive with any
other member of the Keep_alive_together_engrave group with a
remove-layer value in that list.
---
 lily/keep-alive-together-engraver.cc | 9 ++++++++-
 scm/define-grob-properties.scm       | 2 +-
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/lily/keep-alive-together-engraver.cc b/lily/keep-alive-together-engraver.cc
index 9b1cbe4..a1dcdea 100644
--- a/lily/keep-alive-together-engraver.cc
+++ b/lily/keep-alive-together-engraver.cc
@@ -65,11 +65,18 @@ Keep_alive_together_engraver::finalize ()
           if (i == j)
             continue;
           SCM that_layer = group_spanners_[j]->get_property ("remove-layer");
+          if (scm_is_pair (this_layer))
+            {
+              // layer is kept alive if its list contains the other
+              if (scm_is_true (scm_memv (that_layer, this_layer)))
+                live->add (group_spanners_[j]);
+              continue;
+            }
           if (scm_is_false (that_layer))
             continue;
           if (!scm_is_integer (this_layer))
             {
-              // Unspecified layers are kept alive by anything else
+              // unset layers are kept alive by all but ignored layers
               live->add (group_spanners_[j]);
               continue;
             }
diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm
index cb9103a..1b6a169 100644
--- a/scm/define-grob-properties.scm
+++ b/scm/define-grob-properties.scm
@@ -809,7 +809,7 @@ number, the quicker the slur attains its @code{height-limit}.")
 interesting items.")
      (remove-first ,boolean? "Remove the first staff of an orchestral
 score?")
-     (remove-layer ,integer? "The @code{Keep_alive_together_engraver}
+     (remove-layer ,number-or-pair? "The @code{Keep_alive_together_engraver}
 removes all @code{VerticalAxisGroup} grobs with a @code{remove-layer}
 larger than the smallest retained @code{remove-layer}.  Set to
 @code{#f} to make a layer invisible to the
-- 
2.7.4

_______________________________________________
lilypond-devel mailing list
lilypond-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-devel

Reply via email to