Subject: Syntaxe des voix multiples

From: Jean Abou Samra <[email-masked]>
Date: Mon, 6 Jun 2022 16:24:32 +0200

Bonjour à tous, et spécialement à Christian,

Christian qui, à la fondue Lily, décrivait ses difficultés avec
la syntaxe pour créer des voix multiples. Moi-même, je n'étais
pas très à l'aise avec cela dans mes débuts avec LilyPond.
Hier même, sur la liste anglophone, un utilisateur a posé
une question car il ne comprenait pas pourquoi cette syntaxe
ne fonctionnait pas. Il avait fait \voiceOne { ... } au lieu
de { \voiceOne ... }. Bref, cela m'a fait réfléchir, et écrire
la fonction ci-dessous. Pour donner le contexte, la syntaxe
en question, légèrement tarabiscotée, est

<<
   \new Voice { \voiceOne ... }
   \new Voice { \voiceTwo ... }
   ...
   %% L'une des expressions peut ne pas porter \new Voice,
   %% c'est alors la voix déjà commencée qui continue.
   %% C'est nécessaire si une liaison par exemple provient
   %% d'avant et doit se terminer dans cette voix.
   { \voiceXXX ... }
\oneVoice

Il existe aussi la syntaxe raccourcie

<<
   { ... } %% \voiceOne ajouté automatiquement
   \\
   { ... } %% \voiceTwo
   \\
   ...

Cependant, cette syntaxe crée un nouveau contexte à chaque
fois, ce qui ne convient pas si une liaison doit se terminer
dans l'une des voix. En plus, l'ordre n'est pas forcément
intuitif à mon avis : la voix la plus aigüe, puis la plus grave,
puis la deuxième plus aigüe, puis la deuxième plus grave, ...
Il m'est arrivé aussi d'oublier les \\. Enfin, il y a la syntaxe
plus moderne :

\voices 1,3,voix,2 <<
   { ... }
   \\
   { ... }
   \\
   ...

Si la voix principale a été démarrée avec \new Voice = "voix",
cela permet de la continuer. Par contre, il faut quand même
se rappeler de l'ordre, mettre les \\, et éventuellement
\voiceXXX et \voiceOne sur la voix continuée.

D'où ma quatrième solution :

\version "2.22.2"

#(use-modules (ice-9 match))

polyphony =
#(define-music-function (music) (ly:music?)
    ;; Est-ce que l'argument est bien une construction << >> ?
    (if (music-is-of-type? music 'simultaneous-music)
        (let* ((elts (ly:music-property music 'elements)) ;; contenu de
<< >>
               (n (length elts))
               ;; Les voix font 0, 2, 4, 6, ..., 5, 3, 1. limit est
l'indice à
               ;; partir duquel la redescente s'amorce.
               (limit (quotient (1+ n)
                                2)))
          (let loop ((elts elts)
                     (i 0)
                     (acc '()))
            (match elts
              (()
               (ly:music-set-property! music 'elements (reverse! acc))
               ;; Ajoute \oneVoice à la fin.
               (make-sequential-music (list music
(make-voice-props-revert))))
              ((elt . rest)
               (loop rest
                     (1+ i)
                     (cons
                      (let* ((voice-num ;; calcul du numéro de voix
                              (if (< i limit)
                                  (* 2 i)
                                  (1- (* 2 (- n i)))))
                             ;; i = 0 -> \voiceOne, i = 1 -> \voiceTwo, ...
                             (prop-set (make-voice-props-set voice-num))
                             ;; Crée le { \voiceXXX ... }
                             (prop-set-and-elt (make-sequential-music
                                                (list prop-set elt))))
                        (if (ly:music-property elt 'continued #f) ;;
\continued utilisée ?
                            ;; Pas de nouveau contexte.
                            prop-set-and-elt
                            ;; Crée un contexte de plus bas niveau,
Bottom (Voice, TabVoice, ...).
                            (context-spec-music prop-set-and-elt 'Bottom
(number->string voice-num))))
                      acc))))))
        (begin
         (ly:music-warning music "\\polyphony argument should be << >>
construct")
         music)))

%% Marque la musique avec une propriété.
continued = \withMusicProperty #'continued ##t \etc

%%%% Exemple

%% Avec << >>
{
   e''4 e'~
   <<
     \new Voice { \voiceOne c'' }
     \new Voice { \voiceThree g' }
     { \voiceFour e'~ }
     \new Voice { \voiceTwo c' }
   >>
   \oneVoice
   e' e''
}

%% Avec \voices << \\ >>
\new Voice = voix {
   e''4 e'~
   \voices 1,3,voix,2 <<
     { c'' }
     \\
     { g' }
     \\
     { \voiceFour e'~ }
     \\
     { c' }
   >>
   \oneVoice
   e' e''
}

%% Avec \polyphony et \continued
{
   e''4 e'~
   \polyphony <<
     { c''~ }
     { g' }
     \continued { e'~ }
     { c' }
   >>
   e' e''
}

Qu'en pensez-vous ? Ça vous paraît utile ?

D'ailleurs, si quelqu'un a une meilleure idée pour le
nom de la fonction, je suis preneur. \polyphony n'est
pas très correct car la polyphonie peut tout aussi bien
désigner plusieurs instruments qui sont notés sur des
portées différentes...

Cordialement,
Jean

---

From: Christian LE BARS <[email-masked]>
Date: Mon, 6 Jun 2022 17:15:34 +0200

Bonjour a tous.
Merci jean pour les solutions multi voies du coup  je sauvegarde ces
propositions.

Pour pouvoir m'en servir lorsque l'occasion se présentera.

----------------------------

Aussi je profite pour poser d'autres questions:

     dans mon code j'ai écris:
      bes8^\markup{\with-color #(x11-color 'red) "1"}

pour pouvoir colorier le chiffre 1.

cependant tu ma signalé que lilypond avait une fonction toute faite pour
cela

    hélas je ne suis pas arrivé à l'insérer dans mon code est-ce cela:

   bes8^ {\override Fingering.color = #red "1"}

-----------------------------------

j'aimerai également, mettre ta fonction couleur dans un fichier externe

que j’inclurai dans mon code avec \include " couleur"

ou dois mettre ce fichier? au même endroits que lilyjazz.ily?

Merci

---

From: Jean Abou Samra <[email-masked]>
Date: Mon, 6 Jun 2022 17:21:47 +0200

Le 06/06/2022 à 17:15, Christian LE BARS a écrit :
> cependant tu ma signalé que lilypond avait une fonction toute faite
> pour cela
>

Plutôt :

\layout {
   \context {
     \Score
     % Une bonne fois pour toutes
     \override Fingering.color = red
   }
}

{
   bes'^1 bes'^2
}

Je te laisse chercher la documentation sur les doigtés
avec toutes les méthodes que tu connais maintenant :-)

N'importe où, en fait. Il suffit de l'inclure avec

   \include "/chemin/vers/le/fichier.ily"

Une autre méthode, avec Frescobaldi, est d'aller dans
Édition > Préférences > Préférences de LilyPond et
d'utiliser le bouton « Ajouter… » dans la section
« Emplacement d'inclusion de LilyPond ». Une fois que
tu as ajouté le dossier qui contient le fichier couleur.ily,
tu peux faire

   \include "couleur.ily"

et pas

   \include "/chemin/complet/vers/couleur.ily".

Cordialement,
Jean

---

From: Jean-Jacques Gerbaud <[email-masked]>
Date: Mon, 6 Jun 2022 18:03:40 +0200

> Le 06/06/2022 à 17:15, Christian LE BARS a écrit :
Bonjour à tous, Et je vois que le fonctionnement de la liste continue
après ce dernier café lily... :-)
>    \include "/chemin/vers/le/fichier.ily"
J'étais sur le point de lui répondre ça mais tu m'as devancé
>    \include "/chemin/complet/vers/couleur.ily".
Je ne connaissais pas cette possibilité de Frescobaldi. Est-ce qu'on
peut faire ça pour toutes les "variables" que l'on crée ?

--
JJG
Drôme provençale

---

From: Jean Abou Samra <[email-masked]>
Date: Tue, 7 Jun 2022 23:55:53 +0200

> peut faire ça pour toutes les "variables" que l'on crée ?

Que veux-tu dire ? Cela fonctionne pour ajouter n'importe quel
dossier aux chemins dans lesquels les \include sont recherchés .