[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Cross-staffs where a note is already displaced
From: |
Thomas Morley |
Subject: |
Re: Cross-staffs where a note is already displaced |
Date: |
Mon, 12 Jun 2017 09:17:31 +0200 |
2017-06-12 6:43 GMT+02:00 David Wright <address@hidden>:
> I can't figure out how to make crossStaff work when one component
> has been displaced by the interval of a second. I came up with a
> hack (a hidden note) in example 3, but it has the side effect of
> leaving the accidental (when there is one) rather far over.
> Is there a better way?
See:
http://lists.gnu.org/archive/html/lilypond-user/2016-11/msg00230.html
For your example:
\version "2.19.59"
\header { tagline = ##f }
pushNC =
\once \override NoteColumn.X-offset =
#(lambda (grob)
(let* ((p-c (ly:grob-parent grob X))
(p-c-elts (ly:grob-object p-c 'elements))
(stems
(if (ly:grob-array? p-c-elts)
(filter
(lambda (elt)(grob::has-interface elt 'stem-interface))
(ly:grob-array->list p-c-elts))
#f))
(stems-x-exts
(if stems
(map
(lambda (stem)
(ly:grob-extent
stem
(ly:grob-common-refpoint grob stem X)
X))
stems)
'()))
(sane-ext
(filter interval-sane? stems-x-exts))
(cars (map car sane-ext)))
(if (pair? cars)
(abs (- (apply max cars) (apply min cars)))
0)))
\layout {
\context {
\PianoStaff
\consists #Span_stem_engraver
\omit TimeSignature
}
}
middle = { \time 3/4 \voiceTwo \autoBeamOff \crossStaff { f'4 e'8 d' e'4 } }
\new PianoStaff <<
\new Staff <<
\new Voice { \voiceOne <d'' g'>4 g'8 f' g'4 }
\new Voice { \middle }
>>
\new Staff <<
\new Voice {
\clef bass
\voiceTwo
%% the value 1.3 is not close/exact enough
%% 1.304212 would have worked
%\once \override NoteColumn.X-offset = #1.3
%% better do:
\pushNC
cis'4 cis'8 cis' cis'4
}
>>
>>
HTH,
Harm