[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
}
}
}