Subject: Couper une portée de piano

From: Bernard Meylan <[email-masked]>
Date: Mon, 22 Mar 2021 07:58:39 -0700 (MST)

Bonjour à tout le monde!

Je cherche à interrompre une portée de piano au milieu d'une ligne afin d'y
insérer le texte «Da Capo e poi minore» pour ensuite la reprendre après le
texte.
Avec un code (ci-dessous) que j'avais récupéré je ne me rappelle plus où
(probablement ici-même…) je suis parvenu à mes fins mais avec deux points
que je trouve gênants et que je n'arrive pas à modifier:
1. le PianoStaff qui démarre après la «cassure» n'a plus d'accolade et
2. les clés de sol et de fa sont placées à l'extrême début des portées, sans
que les lignes ne dépassent à gauche…

Comment «récupérer» l'accolade (et la barre de mesure initiale) et faire en
sorte que les clefs aient le même aspect qu'au début d'une portée «normale»?

\version "2.22.0"

\new PianoStaff <<
  \relative c' {
    \new Staff {
      \repeat unfold 4 <e g c>1
      % Séparation
      \cadenzaOn \stopStaff 
      \once \override TextScript #'word-space = #1.5
      \once \override TextScript #'X-offset = #1
      \once \override TextScript #'Y-offset = #-3
      s2*0^
  
      \markup { \center-column {
        \override #'(font-name . "Garamond Premr Pro Smbd") {
          \fontsize #2 \line {Da Capo}
          \vspace #0.5
          \line {e poi Minore}
        }
      }}
  
      \repeat unfold 4 {
        s4 s4
        \bar ""
      }
      % Resume bar count and show staff lines again
      \startStaff \cadenzaOff 
      \time 2/4 
      \key c \minor
      \override Staff.TimeSignature #'stencil = ##f
      \once \override Staff.KeySignature #'break-visibility =
#end-of-line-invisible
      \once \override Staff.Clef #'break-visibility = #end-of-line-invisible
      % Suite
      \repeat unfold 4 <es g c>1
    }
  }
  \relative c {
    \new Staff  {
      \clef bass
      \repeat unfold 4 <e g c>1
      % Séparation
      \cadenzaOn \stopStaff 
      \once \override TextScript #'word-space = #1.5
      \once \override TextScript #'X-offset = #1
      \once \override TextScript #'Y-offset = #-15
      s2*0
  
      \repeat unfold 4 {
        s4 s4
        \bar ""
      }
      % Resume bar count and show staff lines again
      \startStaff \cadenzaOff 
      \time 2/4 
      \key c \minor
      \override Staff.TimeSignature #'stencil = ##f
      \once \override Staff.KeySignature #'break-visibility =
#end-of-line-invisible
      \once \override Staff.Clef #'break-visibility = #end-of-line-invisible
      % Suite
      \repeat unfold 4 <es g c>1
    }
  }

-----
Cordialement

Bernard
--
Sent from: http://lilypond-french-users.1298960.n2.nabble.com/

---

From: Jacques Menu <[email-masked]>
Date: Mon, 22 Mar 2021 17:10:41 +0100

Salut Bernard,

Est-ce que l’exemple joint peut t’aider?

JM

> Le 22 mars 2021 à 15:58, Bernard Meylan <[email-masked]> a écrit :
> 
> Bonjour à tout le monde!
>

---

From: Bernard Meylan <[email-masked]>
Date: Mon, 22 Mar 2021 10:19:58 -0700 (MST)

Bonjour Jacques!

et merci de te pencher sur mon problème. Mais si j'ai bien compris ton code,
il faut, après avoir effectué la «cassure», à chaque fin de ligne "\breaker"
celle-ci et au début de la suivante, refaire toute la construction de ce
début de ligne (accolade, barre initiale, clef et tutti quanti…)? C'est bien
ça?

-----
Cordialement

Bernard

---

From: Jean Abou Samra <[email-masked]>
Date: Mon, 22 Mar 2021 18:43:57 +0100

> début de ligne (accolade, barre initiale, clef et tutti quanti…)? C'est bien

Bonjour,

C'est ce que j'en comprends. Voici une version de mon cru, davantage
taillée sur mesure que le code généraliste de Harm, qui ne le
nécessite pas.

Cordialement,
Jean

\version "2.23.1"

#(define (get-having-interface grobs interface)
    (filter
      (lambda (g)
        (grob::has-interface g interface))
      grobs))

#(define (relative-translation grob other axis)
    (let ((refpoint (ly:grob-common-refpoint grob other axis)))
      (- (ly:grob-relative-coordinate grob refpoint axis)
         (ly:grob-relative-coordinate other refpoint axis))))

#(define (relative-stencil grob other)
    (ly:stencil-translate
      (ly:grob-property grob 'stencil)
      (cons
        (relative-translation grob other X)
        (relative-translation grob other Y))))

#(define (fake-system-start grob)
    (let* ((original-stencil (ly:span-bar::print grob))
           (sys (ly:grob-system grob))
           (elements-array (ly:grob-object sys 'elements))
           (elements (ly:grob-array->list elements-array))
           (system-starts (filter (lambda (g)
                                    (grob::has-interface g 
'system-start-delimiter-interface))
                                  elements)))
      (if (null? system-starts)
          original-stencil
          (let* ((one-system-star-bar
                   (or (find (lambda (g)
                               (eq? 'bar-line (ly:grob-property g 'style)))
                             system-starts)
                       (begin
                         (ly:warning "Cannot find system start bar to 
align to")
                         (first system-starts))))
                 (system-start-stencil
                   (apply ly:stencil-add
                          (map
                            (lambda (g)
                              (relative-stencil g one-system-star-bar))
                            system-starts))))
            (ly:stencil-add system-start-stencil original-stencil)))))

text =
\tweak word-space 1.5
\tweak font-name "Garamond Premr Pro Smbd"
\mark
\markup {
   \center-column {
       \fontsize #2 \line { Da Capo }
       \vspace #0.5
       \line { e poi Minore }
   }
}

filler = {
   \stopStaff
   \once \textLengthOn
   <>^\markup {
     " " % ?
     \with-dimensions #'(-10 . 10) #'(-1 . 1)
     " "
   }
   s1
   \text
   s1
   \once \omit Staff.TimeSignature
   \once \override Score.BreakAlignment.break-align-orders =
     #(make-vector 3 '(staff-bar
                       clef
                       key-signature))
   \once \override PianoStaff.SpanBar.stencil = #fake-system-start
   \once \override Staff.KeySignature.break-visibility = 
#end-of-line-invisible
   \once \override Staff.Clef.break-visibility = #end-of-line-invisible
   \startStaff
}

\new PianoStaff <<
   \relative c' {
     \new Staff {
       \filler
       \filler

---

From: Bernard Meylan <[email-masked]>
Date: Mon, 22 Mar 2021 13:27:51 -0700 (MST)

Magnifique, merci Jean! J'ai encore une question: est-il possible de déplacer
le bloc de texte au milieu des 2 portées de piano?

-----
Cordialement

Bernard

---

From: Jean Abou Samra <[email-masked]>
Date: Mon, 22 Mar 2021 21:39:12 +0100

> le bloc de texte au milieu des 2 portées de piano?

Oui, ajoutez \tweak X-offset #xxx ou \tweak Y-offset #yyy,
voire les deux, juste devant le \mark. Et pour ajuster
l'espace laissé au milieu, c'est le #'(-10 . 10) dans \filler.

Au fait, n'oubliez pas de corriger les numéros de mesure avec
un \set Score.currentBarNumber = #nnn, par exemple à la fin
de \filler.

Cordialement,
Jean