[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 10:02:04 -0500 |
On Mon, Mar 13, 2017 at 9:58 AM, David Nalesnik
<address@hidden> wrote:
> 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
> #}))
Oh, there's some extra code. I decided to use a flag to avoid
redundant calculations, but didn't follow through. The music function
should read
spaceStemsEvenly =
#(define-music-function (mus) (ly:music?)
#{
\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
> }
> }
> }