Subject: modifier les crochets systèmes au milieu d'un morceau

From: Clement Caillol <[email-masked]>
Date: Tue, 2 Mar 2021 20:23:24 +0100

Bonjour à tous,

j'aimerais savoir s'il est possible avec lilypond de modifier les 
crochets de système au milieu d'un morceau ?

J'ai essayé de faire comme ça :

\version "2.20.0"

\new StaffGroup <<
   \new Staff
   {
     \set StaffGroup.systemStartDelimiterHierarchy
     = #'(SystemStartBracket (SystemStartSquare a b) c)
     a1 \break
     \set StaffGroup.systemStartDelimiterHierarchy
     = #'(SystemStartBracket (SystemStartSquare a b c))
     b \break
     c'}
   \new Staff
   {d1 e f'}
   \new Staff
   {g1 a b}

Mais c'est toujours le premier \set qui s'applique à toute la partition.

Le but c'est de gérer les divisis des violons :

quand les v1 et les v2 n'ont chacun qu'une portée, avoir un "Square" sur 
v1 et v2, mais par exemple si les v1 sont divisés en deux portées, avoir 
un "Square" seulement pour les deux portées de v1.

Merci !

---

From: Jean Abou Samra <[email-masked]>
Date: Wed, 3 Mar 2021 19:55:52 +0100

Le 02/03/2021 à 20:23, Clement Caillol a écrit :

> quand les v1 et les v2 n'ont chacun qu'une portée, avoir un "Square" 
> sur v1 et v2, mais par exemple si les v1 sont divisés en deux portées, 
> avoir un "Square" seulement pour les deux portées de v1.
>
> Merci !

Bonjour,

Comme à l'accoutumée, la réponse est oui. Mais ce n'est
pas tout à fait intuitif.

Contrairement à ce que laissent croire les apparences,
il n'y a pas un nouvel objet SystemStartSquare (par
exemple) à chaque début de système. Car les débuts de
système n'apparaissent qu'avec le calcul des sauts de
ligne, donc après que tous les objets aient été créés.
En réalité, SystemStartSquare est un unique bandeau
(spanner) étendu sur toute la partition, qui se brise
automatiquement en plusieurs parties comme le ferait
un crescendo par exemple. Vous pouvez le constater sur
cette page :

http://lilypond.org/doc/v2.22/Documentation/internals/systemstartsquare

où il est mentionné que SystemStartSquare possède la
spanner-interface.

Pour le supprimer en certains endroits, il faut recourir
à la fonction \alterBroken, dont l'utilisation est
décrite dans :

http://lilypond.org/doc/v2.22/Documentation/notation/modifying-broken-spanners

Par exemple :

\version "2.23.1"

\new StaffGroup \with {
   systemStartDelimiterHierarchy
     = #'(SystemStartBracket (SystemStartSquare a b) c)
   \alterBroken transparent #'(#t #t #f) SystemStartSquare
} <<
   \new Staff {
     a1\< \break
     b \break
     c'\!
   }
   \new Staff {
     d1 e f'
   }
   \new Staff {
     g1 a b
   }

Pour obtenir ce que vous recherchez, je pense que
le plus simple est de mettre à la fois les carrés
communs et les individuels dans la hiérarchie, et
de supprimer à chaque système les carrés superflus.

Cordialement,
Jean

---

From: Xavier Scheuer <[email-masked]>
Date: Wed, 3 Mar 2021 20:20:06 +0100

On Tue, 2 Mar 2021 at 20:38, Clement Caillol <[email-masked]> wrote:
> [...]
v1 et v2, mais par exemple si les v1 sont divisés en deux portées, avoir un
"Square" seulement pour les deux portées de v1.

Bonjour,

Pour gérer les divisi sur plusieurs portées j'utilise la combinaison
de Keep_alive_together_engraver, keepAliveInterfaces
et VerticalAxisGroup.remove-layer telle que mentionnée dans la doc
NR 1.6.2 Modification de portées individuelles > Masquage de portées (à la
fin)
http://lilypond.org/doc/v2.23/Documentation/notation/modifying-single-staves#hiding-staves

Ainsi on peut avoir une portée individuelle ou plusieurs portées regroupées
dans un StaffGroup (ou GrandStaff ou ce qu'on veut, comme on veut) sur base
de simples indications de quand les portées doivent être séparées.

Cordialement,
Xavier

-- 
Xavier Scheuer <[email-masked]>

---

From: Clément CAILLOL <[email-masked]>
Date: Fri, 5 Mar 2021 06:43:13 +0000

Merci, je ne connaissais pas cette solution !
Est-ce que avec cette méthode, il est aussi possible de garder un seul nom d'instrument pour plusieurs portées quand il y a divisi ?

Merci !

Clément Caillol

________________________________
From: Xavier Scheuer <[email-masked]>
Sent: Wednesday, March 3, 2021 8:20:06 PM
To: Clement Caillol <[email-masked]>
Cc: Lilypond - Liste <[email-masked]>
Subject: Re: modifier les crochets systèmes au milieu d'un morceau

On Tue, 2 Mar 2021 at 20:38, Clement Caillol <[email-masked]<mailto:[email-masked]>> wrote:
> quand les v1 et les v2 n'ont chacun qu'une portée, avoir un "Square" sur v1 et v2, mais par exemple si les v1 sont divisés en deux portées, avoir un "Square" seulement pour les deux portées de v1.

Bonjour,

Pour gérer les divisi sur plusieurs portées j'utilise la combinaison de Keep_alive_together_engraver, keepAliveInterfaces et VerticalAxisGroup.remove-layer telle que mentionnée dans la doc
NR 1.6.2 Modification de portées individuelles > Masquage de portées (à la fin)
http://lilypond.org/doc/v2.23/Documentation/notation/modifying-single-staves#hiding-staves

Ainsi on peut avoir une portée individuelle ou plusieurs portées regroupées dans un StaffGroup (ou GrandStaff ou ce qu'on veut, comme on veut) sur base de simples indications de quand les portées doivent être séparées.

Cordialement,
Xavier

--
Xavier Scheuer <[email-masked]<mailto:[email-masked]>>

---

From: Clément CAILLOL <[email-masked]>
Date: Fri, 5 Mar 2021 06:40:28 +0000

Merci beaucoup ! Ça devrait bien m'aider !

Clément Caillol

________________________________
From: Jean Abou Samra <[email-masked]>
Sent: Wednesday, March 3, 2021 7:55:52 PM
To: Clement Caillol <[email-masked]>; [email-masked] <[email-masked]>
Subject: Re: modifier les crochets systèmes au milieu d'un morceau

Bonjour à tous,

j'aimerais savoir s'il est possible avec lilypond de modifier les crochets de système au milieu d'un morceau ?

\version "2.20.0"

\new StaffGroup <<
  \new Staff
  {

Merci !

Bonjour,

Par exemple :

\version "2.23.1"

\new StaffGroup \with {

Cordialement,
Jean

---

From: Jean Abou Samra <[email-masked]>
Date: Fri, 5 Mar 2021 19:17:01 +0100

Le 05/03/2021 à 07:43, Clément CAILLOL a écrit :
> Est-ce que avec cette méthode, il est aussi possible de garder un seul 
> nom d'instrument pour plusieurs portées quand il y a divisi ?
>
> Merci !
>
> Clément Caillol

Absolument, il suffit de faire la même chose avec InstrumentName :

\version "2.23.1"

\new StaffGroup \with {
   \consists Instrument_name_engraver
   instrumentName = "Violon"
   shortInstrumentName = "V."
   \alterBroken transparent #'(#f #f #t) InstrumentName
   systemStartDelimiterHierarchy
     = #'(SystemStartBracket (SystemStartSquare a b) c)
   \alterBroken transparent #'(#t #t #f) SystemStartSquare
} <<
   \new Staff {
     a1\< \break
     b \break
     c'\!
   }
   \new Staff {
     d1 e f'
   }
   \new Staff {
     g1 a b
   }

Cordialement,
Jean

---

From: Clement Caillol <[email-masked]>
Date: Tue, 16 Mar 2021 11:08:32 +0100

Bonjour,

Après plusieurs essais, je suis arrivé à quelque chose qui me convinent 
vraiment pour les divisis de violon. Je vous le partage, dites-moi ce 
que vous en pensez.

(attention, les varibles violI et violII correspondent aux divisis du 
haut et du bas. Dans cet exemple, les v1 et les v2 jouent la même musique.)

J'ai juste une question concernant \alterBroken, est-il possible 
d'utiliser une fonction scheme pour réduire la liste des valeurs 
booléennes ?

Par exemple #'(#f #f #f #t #f #f #t) devienne un truc du genre 3*#f #t 
2*#f #t (je sais que ça ne ressemblera pas à ça, mais c'est pour illustrer)

Merci beaucoup !

Voilà le code :

\version "2.22.0"

violI = {

   \repeat unfold 4 { d'4 }
   \break
   \repeat unfold 4 { d'4 }
   \break
   \once \unset Staff.keepAliveInterfaces
   <d' g''>2 d'4 d'4
   \break
   \repeat unfold 4 { d'4 }

   \bar "|."
}

violII = {
   \repeat unfold 4 { g4 }
   \repeat unfold 4 { g4 }

   <g d'>2 g4 g
   \repeat unfold 4 { g4 }

   \bar "|."
}
\score {
   \new StaffGroup \with {
   \alterBroken transparent #'(#f #f #t #f) SystemStartBrace
   \override SystemStartBrace.style = #'line-bracket

   \alterBroken X-offset #'(0) SystemStartSquare
   \alterBroken X-offset #'(0) SystemStartBrace
   }

   <<
     \set StaffGroup.systemStartDelimiter = #'SystemStartBrace

   <<
     \new StaffGroup \with { \consists "Keep_alive_together_engraver"
                             \consists "Instrument_name_engraver"
                             instrumentName = "Violons 1"
                             shortInstrumentName = "vl.1"

     } <<
       \set StaffGroup.systemStartDelimiter = #'SystemStartSquare
       \new Staff \with {

         keepAliveInterfaces = #'()
         \override VerticalAxisGroup.remove-layer = 2
       } <<  \violI \\ \violII  >>
       \new Staff \with {

         \RemoveAllEmptyStaves
         keepAliveInterfaces = #'()
         \override VerticalAxisGroup.remove-layer = 1
       } \violI
       \new Staff \with {

         \RemoveAllEmptyStaves
         keepAliveInterfaces = #'()
         \override VerticalAxisGroup.remove-layer = 1
       } \violII
     >>

     \new StaffGroup \with { \consists "Keep_alive_together_engraver"
                             \consists "Instrument_name_engraver"
                             instrumentName = "Violons 2"
                             shortInstrumentName = "vl.2"

     } <<
       \set StaffGroup.systemStartDelimiter = #'SystemStartSquare
       \new Staff \with {

         keepAliveInterfaces = #'()
         \override VerticalAxisGroup.remove-layer = 2
       } <<  \violI \\ \violII  >>
       \new Staff \with {

         \RemoveAllEmptyStaves
         keepAliveInterfaces = #'()
         \override VerticalAxisGroup.remove-layer = 1
       } \violI
       \new Staff \with {

         \RemoveAllEmptyStaves
         keepAliveInterfaces = #'()
         \override VerticalAxisGroup.remove-layer = 1
       } \violII
     >>
   >>
   >>
}

Clément Caillol

Le 05/03/2021 à 19:17, Jean Abou Samra a écrit :
>> Est-ce que avec cette méthode, il est aussi possible de garder un 
>> seul nom d'instrument pour plusieurs portées quand il y a divisi ?
>>
>> Merci !
>>
>> Clément Caillol
>
>

---

From: Clement Caillol <[email-masked]>
Date: Tue, 16 Mar 2021 11:53:32 +0100

Je me rends compte qu'il y a un problème, si j'utilise la fonction 
\RemoveEmptyStaves de façon globale dans mon score, ça détruit tout... 
Si vous avez une idée pour que je puisse également masquer les portées 
de violons quand ils n'ont effectivement rien à jouer, je suis preneur.

merci !

Le 16/03/2021 à 11:08, Clement Caillol a écrit :
>
> Bonjour,
>
> Après plusieurs essais, je suis arrivé à quelque chose qui me 
> convinent vraiment pour les divisis de violon. Je vous le partage, 
> dites-moi ce que vous en pensez.
>

---

From: Clement Caillol <[email-masked]>
Date: Tue, 16 Mar 2021 16:48:30 +0100

Finalement, j'ai opté pour une solution sans keepAliveInterfaces, 
compatible avec un \RemoveEmptyStaves global et plus utilisable avec 
arranger.ly, que j'utilise beaucoup. Je vous remet le code à la fin du 
mail pour ceux que ça intéresse.

Il ne me reste plus qu'à trouver une manière agréable de gérer la liste 
de booléens de " \alterBroken transparent #'(#f #f #t #f...etc...) 
SystemStartBrace". Pour une grande partitions, ça peut vite devenir 
laborieux à saisir.

Une solution pour simplifier les choses serait qu'il existe un réglage 
qui fasse l'inverse de  "\override SystemStartBrace #'collapse-height",

ce qui me permettrait de définir que mon crochet système des violons 
s'efface quand il est trop grand (donc en cas de divisi). Es-ce qu'à 
votre avis il est possible de fabriquer un tel réglage ?

Bien à vous,

Clément Caillol

Le code :

\version "2.22.0"

violI = {
   << {
     \repeat unfold 4 { d'4 }
     \break
     \repeat unfold 4 { d'4 }
     \break <d' g''>2 d'4 d'4
     \break
     \repeat unfold 4 { d'4 }
     \break
     R1
     \break
     d'1
     \bar "|."
      }
      \\
      {
        \repeat unfold 4 { g4 }
        \repeat unfold 4 { g4 }
        \change Staff = "2"
        \oneVoice
        <g d'>2 g4 g
        \change Staff = "1"
        \voiceTwo
        \repeat unfold 4 { g4 }
        \break
        R1
        \break
        g1
        \bar "|."
      }
   >>
}

\score {
   \new StaffGroup \with {
         \new Staff = "1"
         \violI
         \new Staff = "2"\with {
           \RemoveAllEmptyStaves
         }
         {s1*6}  %%%%%%%%%%%%%%%%%%%%%% ou \global si défini
         \new Staff = "3" \with {
           \RemoveAllEmptyStaves
         }
         {s1*6}  %%%%%%%%%%%%%%%%%%%%%% ou \global si défini
       >>

       \new StaffGroup \with {
         \consists "Instrument_name_engraver"
         instrumentName = "Violons 2"
         shortInstrumentName = "vl.2"
       } <<
         \set StaffGroup.systemStartDelimiter = #'SystemStartSquare
         \new Staff = "1" %\with {
         \violI
         \new Staff = "2" \with {
           \RemoveAllEmptyStaves
         }
         {s1*6} %%%%%%%%%%%%%%%%%%%%%% ou \global si défini
         \new Staff = "3" \with {
           \RemoveAllEmptyStaves
         }
         {s1*6}  %%%%%%%%%%%%%%%%%%%%%% ou \global si défini
       >>
     >>
   >>
   \layout {
     \context {
       \Score
       \RemoveEmptyStaves

     }
   }
}

Le 16/03/2021 à 11:53, Clement Caillol a écrit :
>> Par exemple #'(#f #f #f #t #f #f #t) devienne un truc du genre 3*#f 
>> #t 2*#f #t (je sais que ça ne ressemblera pas à ça, mais c'est pour 
>> illustrer)
>>
>> Merci beaucoup !
>>
>> Voilà le code :
>>
>> \version "2.22.0"
>>
>> violI = {
>>
>>   \repeat unfold 4 { d'4 }
>>   \break
>>   \repeat unfold 4 { d'4 }
>>   \break

---

From: Jean Abou Samra <[email-masked]>
Date: Tue, 16 Mar 2021 23:41:39 +0100

Le 16/03/2021 à 16:48, Clement Caillol a écrit :
> Il ne me reste plus qu'à trouver une manière agréable de gérer la 
> liste de booléens de " \alterBroken transparent #'(#f #f #t 
> #f...etc...) SystemStartBrace". Pour une grande partitions, ça peut 
> vite devenir laborieux à saisir.
>

Bonjour,

Pour définir la liste de booléens comme vous le décrivez, une méthode 
simple est :

#(append (make-list 3 #f)
          (make-list 1 #t)
          (make-list 2 #f)
          (make-list 1 #t))

Avec un peu d'enrobage syntaxique, cela peut donner :

#(use-modules (srfi srfi-26))
#(define-macro (expand-repetitions . args)
    `',(apply append
              (map (cute apply make-list <>)
                   args)))

#(expand-repetitions (3 #f)
                      (1 #t)
                      (2 #f)
                      (1 #t))

Enfin, pour inverser le sens de collapse-height, je propose :

\version "2.22.0"

#(define (kill-above-threshold grob)
    (let ((collapse-height (ly:grob-property grob 'collapse-height)))
      (ly:grob-set-property! grob 'collapse-height 0)
      (ly:grob-set-property! grob 'X-offset 0)
      (let ((stencil (ly:system-start-delimiter::print grob)))
        (if (> (interval-length (ly:stencil-extent stencil Y))
               collapse-height)
            (ly:grob-suicide! grob)
            stencil))))

\layout {
   \context {
     \StaffGroup
     systemStartDelimiter = #'SystemStartSquare
   }
}

violI = {
   << {
     \repeat unfold 4 { d'4 }
     \break
     \repeat unfold 4 { d'4 }
     \break <d' g''>2 d'4 d'4
     \break
     \repeat unfold 4 { d'4 }
     \break
     R1
     \break
     d'1
     \bar "|."
      }
      \\
      {
        \repeat unfold 4 { g4 }
        \repeat unfold 4 { g4 }
        \change Staff = "2"
        \oneVoice
        <g d'>2 g4 g
        \change Staff = "1"
        \voiceTwo
        \repeat unfold 4 { g4 }
        \break
        R1
        \break
        g1
        \bar "|."
      }
   >>
}

\new StaffGroup \with {
   \override SystemStartSquare.stencil = #kill-above-threshold
   \override SystemStartSquare.collapse-height = 20
} <<
   <<
     \new StaffGroup \with {
       instrumentName = "Violons 1"
       shortInstrumentName = "vl.1"
       \override SystemStartSquare.stencil = 
#ly:system-start-delimiter::print
       \override SystemStartSquare.collapse-height = 10
     } <<
       \new Staff = "1" \violI
       \new Staff = "2" \with {
         \RemoveAllEmptyStaves
       }
       { s1*6 }
       \new Staff = "3" \with {
         \RemoveAllEmptyStaves
       }
       { s1*6 }
     >>
     \new StaffGroup \with {
       instrumentName = "Violons 2"
       shortInstrumentName = "vl.2"
       \override SystemStartSquare.stencil = 
#ly:system-start-delimiter::print
       \override SystemStartSquare.collapse-height = 10
     } <<
       \new Staff = "1" \violI
       \new Staff = "2" \with {
         \RemoveAllEmptyStaves
       }
       { s1*6 }
       \new Staff = "3" \with {
         \RemoveAllEmptyStaves
       }
       { s1*6 }
     >>
   >>

Cordialement,
Jean

---

From: Clement Caillol <[email-masked]>
Date: Wed, 17 Mar 2021 10:41:45 +0100

Bonjour,

merci infiniment, c'est génial !

J'espère qu'un jour je serai capable de trouver ce genre de solutions 
moi-même... En attendant je vais essayer de bien comprendre comment 
marche celle-là, ce sera déjà pas mal.

Merci encore pour le temps passé sur mon problème,

Bien à vous,

Clément Caillol

Le 16/03/2021 à 23:41, Jean Abou Samra a écrit :
>> arranger.ly, que j'utilise beaucoup. Je vous remet le code à la fin 
>> du mail pour ceux que ça intéresse.
>>
>> Une solution pour simplifier les choses serait qu'il existe un 
>> réglage qui fasse l'inverse de "\override SystemStartBrace 
>> #'collapse-height",
>>