lilypond-user-fr
[Top][All Lists]
Advanced

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

Syntaxe des voix multiples


From: Jean Abou Samra
Subject: Syntaxe des voix multiples
Date: Mon, 6 Jun 2022 16:24:32 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.9.1

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





reply via email to

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