lilypond-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Cross staff stem spacing with proportional notation


From: David Nalesnik
Subject: Re: Cross staff stem spacing with proportional notation
Date: Mon, 13 Mar 2017 09:58:22 -0500

Hi Andrew,

On Mon, Mar 13, 2017 at 3:11 AM, Andrew Bernard
<address@hidden> wrote:
> This issue has dogged me for a long time, and searching the archives does
> not produce a reliable answer as far as I can see.
>
> When using proportional notation with cross staff beamed groups, it looks
> vastly better if the stems are evenly spaced, but proportional notation
> messes this up, and only in the cross staff situation.
>
> I have tried using \newSpacing section in my scores and I am so deep in
> confusion perhaps that I cannot find a way to make this work, while
> preserving the proportional notation for the score overall.
>
> There is a thread concerning this matter here, with no resolution, but
> pertinent:
>
> https://lists.gnu.org/archive/html/lilypond-user/2014-07/msg00303.html
>
> It would be great if this could be made to work. What lilypond incantations
> do I need, or is it a current limitation? Could we have some sort of
> \spaceStemsEvenly command?
>
> Andrew
>
> == snip
>
> \version "2.19.56"
>
> tsd = { \change Staff = treble \stemDown }
> bsu = { \change Staff = bass \stemUp }
>
> treble = {
>   \clef treble
>   aes''32[ \bsu c' \tsd d''' \bsu d' \tsd d''' \bsu ees']
> }
>
> bass = {
>   \clef bass
>   s4
> }
>
> \score {
>
>   \new PianoStaff
>   <<
>     \new Staff = "treble" { \treble }
>     \new Staff = "bass" { \bass }
>   >>
>
>   \layout {
>   }
> }
>
> \score {
>
>   \new PianoStaff
>   <<
>     \new Staff = "treble" { \treble }
>     \new Staff = "bass" { \bass }
>   >>
>
>   \layout {
>     \context {
>       \Score
>       proportionalNotationDuration = #(ly:make-moment 1/32)
>       \override SpacingSpanner.uniform-stretching = ##t
>       \override Score.SpacingSpanner.strict-note-spacing = ##t
>     }
>   }
> }
>

How about this?

It's not a deep solution which adjusts spacing; rather, it adjusts the
X-offset of NoteColumns based on stem position.

The example shows a corrected group surrounded by default to
illustrate usage of the music function I've wrapped the correction
into.

Best,
David

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\version "2.19.56"

%% Grob should be a NoteColumn object
#(define (space-by-stems grob)
   (let* ((stem (ly:grob-object grob 'stem))
          (beam (ly:grob-object stem 'beam))
          (stems (ly:grob-array->list (ly:grob-object beam 'stems)))
          (note-columns (map (lambda (s) (ly:grob-parent s X)) stems))
          ;; which NoteColumn am I?
          (me-nc (memq grob note-columns))
          (nth (- (length note-columns) (length me-nc)))
          (orig-stem-pos (map (lambda (s nc)
(ly:grob-relative-coordinate s nc X))
                           stems note-columns)))
     (* -1 (list-ref orig-stem-pos nth))))

spaceStemsEvenly =
#(define-music-function (mus) (ly:music?)
   (let ((done #f))
     #{
       \override NoteColumn.X-offset = #space-by-stems
       #mus
       \revert NoteColumn.X-offset
     #}))

%%%%%%%%%%%%%%%%%% EXAMPLE %%%%%%%%%%%%%%%%%

tsd = { \change Staff = treble \stemDown }
bsu = { \change Staff = bass \stemUp }

treble = {
  \clef treble
  aes''32[ \bsu c' \tsd d''' \bsu d' \tsd d''' \bsu ees']
}

bass = {
  \clef bass
  s8.
}

\score {

  \new PianoStaff
  <<
    \new Staff = "treble" { \treble \spaceStemsEvenly \treble \treble }
    \new Staff = "bass" { \bass \bass \bass }
  >>

  \layout {
    \context {
      \Score
      proportionalNotationDuration = #(ly:make-moment 1/32)
      \override SpacingSpanner.uniform-stretching = ##t
      \override Score.SpacingSpanner.strict-note-spacing = ##t
    }
  }
}



reply via email to

[Prev in Thread] Current Thread [Next in Thread]