[Top][All Lists]

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

Re: Distance between staffs

From: Thomas Morley
Subject: Re: Distance between staffs
Date: Thu, 22 Jul 2021 22:58:53 +0200

Am Do., 22. Juli 2021 um 16:13 Uhr schrieb Silvain Dupertuis <>:


I made a chord version of the first Praeludium of the Wohltemperierte Klavier
(in which the chords were programmaticall reconstructed from the liste of notes)

As the chords extend on 2 and a half octaves,
I wanted to get them on a normal piano staff
and adjust the distance of staffs so that the would be like one staff with one space for an A3 note.

Then the chords can be placed on the upper staff with notes automatically appearing at they right place on the lower staff.

I found a nice way to do it, using Lilypond 20, by specifying staff-staff-spacing.padding with a negative value

    \new PianoStaff \with {
      % midiInstrument = "tenor sax"
      \override StaffGrouper.staff-staff-spacing = #'(
                            (basic-distance . 0)				
                            (padding . 0)) % s0 for first exemple ; second example : (padding . -3.09)

The result was this

with padding=0
with the negative adjustment (padding = -3.06)

Unfortunately, this adjustment no longer works in LilyPond 22
It looks like the property was broken, or no longer function this way?
Whatever the value, the distance is not affected.

You can see the complete LilyPond and PDF files in this NextCloud folder

Thank you in advance if you can sort this problem out.



Silvain Dupertuis
Route de Lausanne 335
1293 Bellevue (Switzerland)
tél. +41-(0)22-774.20.67
portable +41-(0)79-604.87.52


for the distance, I'd fo for alignment-distances of NonMusicalPaperColumn.line-break-system-details.
I added some *experimental* code for autosplitting chords.

#(define (make-autosplit-chord chord . ref-pitch)
  "Return a pair of lists, containing the pitches of @var{chord}, splitted at
a reference pitch.  The reference pitch is derived from @var{ref-pitch}.
If @var{ref-pitch} is empty, @code{c'} is regarded as reference.
  (define ref-pitch-steps
    (if (and (pair? ref-pitch) (car ref-pitch))
        (ly:pitch-steps (car ref-pitch))

    (lambda ()
        (lambda (note)
          (> (ly:pitch-steps (ly:music-property note 'pitch))
        (event-chord-notes chord)))
autoSplitChord =
#(define-music-function (stem-dir staff-names pitch chord)
  ((ly:dir? 0) (pair? '("up" . "down")) (ly:pitch?) ly:music?)
  (_i "Split @var{chord} at optional @var{pitch}.  The default of @var{pitch} is
@code{#f}, which is interpreted by the called procedure
@code{make-autosplit-chord} as @code{c'}.

The splitted chords are distributed to named staves, relying on optional

The optional @var{stem-dir}, determines the direction of the stems and whether
the chords may be connected by a cross-staff stem.
The default results in unconnected chords.
If the @code{Span_stem_engraver} is consisted, the chords may be connected by a
cross-staff stem.")
  (if (music-is-of-type? chord 'event-chord)
      (let* ((skip (make-duration-of-length (ly:music-length chord)))
             (devided-pitches (make-autosplit-chord chord pitch))
               (if (pair? (car devided-pitches))
                   (make-event-chord (car devided-pitches))
                   (make-skip-music skip)))
               (if (pair? (cdr devided-pitches))
                   (make-event-chord (cdr devided-pitches))
                   (make-skip-music skip))))
            \context Staff = #(car staff-names)
              \context Voice {
                $(if (negative? stem-dir)
                     \once \override Stem.cross-staff = #cross-staff-connect
                     \once \override = #'no-flag
                $(if (not (zero? stem-dir))
                  #{ \once \override Stem.direction = #stem-dir #})
            \context Staff = #(cdr staff-names)
              \context Voice {
                $(if (positive? stem-dir)
                     \once \override Stem.cross-staff = #cross-staff-connect
                     \once \override = #'no-flag
                $(if (not (zero? stem-dir))
                  #{ \once \override Stem.direction = #stem-dir #})
      #{ \context Staff $chord #}))

autoSplitChordsInMusic =
#(define-music-function (mus) (ly:music?)
    (lambda (m)
      (and (music-is-of-type? m 'event-chord)
           (autoSplitChord m)))

\score {
  \new PianoStaff
  \context Staff = "up"
   \autoSplitChordsInMusic \crossStaff {  
    <g c' e' g'>4 <c bes g' e''> <f, a f' c''> <g, g d' b'>
    <c g e' c''> \autoChange { a8 c' d' e' c'4 }
    \context Staff = "down" \crossStaff {
      \clef "bass"
      \once \stemUp s1 \once \stemUp s1
  \layout {
    \context {
      \consists "Span_stem_engraver"
  \context {
      \override NonMusicalPaperColumn.line-break-system-details =
        #'((alignment-distances . (6)))

Works with 2.20.0 (use \autochange) and 2.22.0 (use \autoChange)


reply via email to

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