Alignement d'un textMark avec nom d'accord

Bonjour,

J'essaie en vain d'aligner des annotations faites avec textMark avec les noms des accords produits sur une grille harmonique. Existe t'il une façon de faire.

Merci pour votre aide.

Mon code :

\version "2.24.4"

\paper {
#(set-paper-size "letter landscape")
indent = 0
ragged-right = ##f
}

chExceptionMusic = {
1-\markup { \super "dim" } % c:dim
-\markup { \super "dim7"} %c:dim7
<c e g bes aes' >-\markup { \super "7(b13)" } % c:3.5.7.13-
-\markup { \super "7(#5)"} % c:7.5+
-\markup { \super "Maj7"} % c:7+
}
chExceptions = #(append (sequential-music-to-chord-exceptions chExceptionMusic #t) ignatzekExceptions)

\markup vF = \markup \italic \fontsize #-2 \with-color #blue \etc % formatage des doigtés d'accords

mesAccords = \chordmode { \set chordNameExceptions = #chExceptions
\textMark \markup \vF "(5 x 5 6 6 x)" a:3.5.7.13-
\textMark \markup \vF "(x 5 4 5 3 x)" d:7
\textMark \markup \vF "(4 x 3 4 4 x)" aes2.:m6 \textMark \markup \vF "(x x 3 4 4 3)" g4:7.5+
\textMark \markup \vF "(x x 5 5 5 7)" c1:7+
\textMark \markup \vF "(x x 4 5 4 5)" fis2:dim7 \textMark \markup \vF "(x x 7 8 7 8)" a:dim7
}

%+++++++++++++++++ Grille harmonique ++++++++++++++++++
\score {
\new ChordGrid \mesAccords
}

Key Points

  • Il semble probable que pour aligner les annotations (doigtés) avec les noms des accords dans une grille harmonique LilyPond, il faut inclure les doigtés directement dans le nom de l'accord en utilisant \override GridChordName.text.

  • La méthode actuelle avec \textMark peut ne pas fonctionner correctement dans le contexte ChordGrid, car elle est conçue pour des contextes musicaux réguliers comme Staff.

  • Les recherches suggèrent que personnaliser le texte de chaque GridChordName avec le symbole de l'accord et le doigté (par exemple, "a:3.5.7.13- (5 x 5 6 6 x)") est une solution viable, bien que cela puisse nécessiter des ajustements pour chaque accord.

Comprendre le Problème

Votre objectif est d'aligner les annotations, comme les doigtés (par exemple, "(5 x 5 6 6 x)"), avec les noms des accords dans une grille harmonique créée avec LilyPond. Votre code utilise actuellement \textMark pour ajouter ces annotations avant chaque accord dans chordmode, mais cela peut ne pas fonctionner comme prévu dans le contexte ChordGrid. Ce contexte génère automatiquement les noms des accords à partir de l'entrée chordmode, et il n'y a pas de support natif pour ajouter du texte supplémentaire comme des doigtés via \textMark.

Solution Proposée

Une approche consiste à inclure les doigtés directement dans le nom de l'accord en utilisant \override GridChordName.text pour chaque accord. Cela permet d'afficher à la fois le symbole de l'accord standard et le doigté dans la même marque, alignés dans la grille. Par exemple, pour l'accord a:3.5.7.13-, vous pouvez définir :

lilypond

\override GridChordName.text = \markup { "a:3.5.7.13- \teeny \vF "(5 x 5 6 6 x)" " }
a:3.5.7.13-

Répétez cette opération pour chaque accord, en ajustant le texte pour inclure le symbole de l'accord et le doigté correspondant. Cela devrait aligner les annotations avec les noms des accords dans la grille.

Détail Inattendu

Une découverte inattendue est que ChordGrid ne prend pas en charge nativement l'ajout de texte supplémentaire comme les doigtés, ce qui nécessite une personnalisation avancée du texte de GridChordName, ce qui peut être moins intuitif que prévu pour les utilisateurs habitués à d'autres contextes LilyPond.


Rapport Détailé

Ce rapport explore en détail la question de l'alignement des annotations (doigtés) avec les noms des accords dans une grille harmonique LilyPond, en s'appuyant sur une analyse approfondie du code fourni et de la documentation pertinente. Il vise à fournir une solution complète et à expliquer les raisons sous-jacentes, en imitant le style d'un article professionnel.

Contexte et Analyse du Code

L'utilisateur utilise LilyPond pour créer une grille harmonique avec le contexte ChordGrid, où chaque accord est représenté par un nom dans un carré, souvent utilisé en jazz pour noter visuellement les accords. Le code fourni inclut des définitions comme :

lilypond

mesAccords = \chordmode { \set chordNameExceptions = #chExceptions
\textMark \markup \vF "(5 x 5 6 6 x)" a:3.5.7.13-
...
}

Ici, \textMark est utilisé pour ajouter des annotations (doigtés) avant chaque accord, mais cette méthode semble poser problème, car \textMark est principalement conçu pour des contextes comme Staff, où il ajoute des marques de texte entre les notes, souvent alignées sur une barre de mesure. Dans ChordGrid, cette commande peut être ignorée ou mal placée, car le contexte est spécialisé pour afficher des grilles d'accords, et non pour gérer des marques de texte supplémentaires.

Exploration des Options

Pour résoudre ce problème, plusieurs approches ont été envisagées :

  1. Utilisation de \textMark dans ChordGrid : La documentation, comme celle de Chord grids (LilyPond Notation Reference), ne mentionne pas explicitement \textMark pour ajouter du texte dans ChordGrid. Les recherches montrent que \textMark est mieux adapté aux contextes musicaux réguliers, ce qui explique pourquoi il ne s'aligne pas correctement avec les noms des accords dans la grille.

  2. Personnalisation des Noms d'Accords avec chordNameExceptions : L'utilisateur a déjà défini chordNameExceptions pour personnaliser les noms d'accords, comme pour <c e g bes aes' >-\markup { \super "7(b13)" }. Cependant, cette méthode est basée sur des hauteurs spécifiques (pitches), et non sur des symboles d'accords comme a:3.5.7.13-. Par exemple, chordNameExceptions est une liste de paires (accord . markup), où l'accord est une liste de hauteurs, ce qui rend difficile l'inclusion directe des doigtés pour des symboles d'accords personnalisés.

  3. Utilisation de GridChordName et \override : Une analyse des internes de LilyPond, notamment via LilyPond Internals Reference: Grid_chord_name_engraver, révèle que GridChordName est l'objet de disposition créé pour afficher les noms des accords dans ChordGrid. Cet objet lit la propriété currentChordText pour générer les noms. Une solution consiste à utiliser \override GridChordName.text pour définir un markup personnalisé pour chaque accord, incluant à la fois le symbole de l'accord et le doigté. Par exemple :

lilypond

\override GridChordName.text = \markup { "a:3.5.7.13- \teeny \vF "(5 x 5 6 6 x)" " }
a:3.5.7.13-

Cela permet d'afficher le doigté dans un texte plus petit (\teeny) avec le formatage défini par \vF, aligné avec le nom de l'accord dans la grille.

  1. Approches Alternatives : D'autres options, comme ajouter les doigtés dans une ligne séparée au-dessus de la grille ou utiliser FretBoards pour des diagrammes de manche de guitare, ont été envisagées. Cependant, FretBoards est plus adapté aux diagrammes de frettes et moins à l'alignement avec une grille harmonique. Ajouter une ligne de texte séparée pourrait poser des problèmes d'alignement, car ChordGrid a une disposition spécifique.

Solution Recommandée

La solution recommandée est d'utiliser \override GridChordName.text pour chaque accord dans chordmode, en définissant un markup qui combine le symbole de l'accord et le doigté. Voici un exemple complet pour votre code :

lilypond

mesAccords = \chordmode {
  \override GridChordName.text = \markup { "a:3.5.7.13- \teeny \vF "(5 x 5 6 6 x)" " }
  a:3.5.7.13-
  \override GridChordName.text = \markup { "d:7 \teeny \vF "(x 5 4 5 3 x)" " }
  d:7
  \override GridChordName.text = \markup { "aes2.:m6 \teeny \vF "(4 x 3 4 4 x)" " }
  aes2.:m6
  \override GridChordName.text = \markup { "g4:7.5+ \teeny \vF "(x x 3 4 4 3)" " }
  g4:7.5+
  \override GridChordName.text = \markup { "c1:7+ \teeny \vF "(x x 5 5 5 7)" " }
  c1:7+
  \override GridChordName.text = \markup { "fis2:dim7 \teeny \vF "(x x 4 5 4 5)" " }
  fis2:dim7
  \override GridChordName.text = \markup { "a:dim7 \teeny \vF "(x x 7 8 7 8)" " }
  a:dim7
}

Ensuite, utilisez-le dans votre score comme suit :

lilypond

\score {
  \new ChordGrid \mesAccords
}

Cette méthode garantit que chaque nom d'accord dans la grille inclut le doigté, aligné correctement dans le carré correspondant. Le \teeny rend le doigté plus petit pour ne pas surcharger le symbole de l'accord, et \vF applique le formatage défini (italique, bleu, taille réduite).

Détails Techniques et Considérations

  • Propriétés de GridChordName : Bien que la documentation ne liste pas explicitement toutes les propriétés de GridChordName, il est raisonnable de supposer, en se basant sur ChordName, qu'il a une propriété text modifiable via \override. Cela est soutenu par les internes, où Grid_chord_name_engraver crée GridChordName en lisant currentChordText.

  • Limitations Potentielles : Si \override GridChordName.text ne fonctionne pas, cela pourrait indiquer que cette propriété n'est pas directement accessible dans ChordGrid. Dans ce cas, une personnalisation plus avancée, comme redéfinir chordNameFunction, serait nécessaire, mais cela dépasse le cadre de cette réponse.

  • Alignement et Esthétique : L'inclusion du doigté dans le nom de l'accord peut affecter l'esthétique, surtout si les doigtés sont longs. Utiliser \teeny aide à minimiser cet impact, mais des ajustements supplémentaires (comme modifier la taille de la police ou l'espacement) peuvent être nécessaires.

Tableaux pour Résumer

Voici un tableau récapitulatif des commandes et propriétés utilisées :

Commande/Propriété Description Utilisation dans la Solution
\override GridChordName.text Définit le texte affiché pour chaque nom d'accord Inclut symbole et doigté
\teeny Réduit la taille du texte Pour les doigtés, pour lisibilité
\vF Formatage personnalisé (italique, bleu, taille) Appliqué aux doigtés
ChordGrid Contexte pour grilles harmoniques Utilisé pour afficher la grille

Conclusion

En résumé, pour aligner les annotations (doigtés) avec les noms des accords dans une grille harmonique LilyPond, il est recommandé d'utiliser \override GridChordName.text pour inclure à la fois le symbole de l'accord et le doigté dans un markup personnalisé. Cette méthode est pratique et alignée avec les capacités de LilyPond, bien que cela puisse nécessiter un ajustement pour chaque accord. Si des problèmes persistent, des recherches supplémentaires dans la documentation ou les forums LilyPond pourraient être nécessaires.

Citations Clés

Bonjour Michel,

Merci énormément le résultat est nickel. J'ai seulement fait une petite correction d'un guillemet mal placé et ça fonctionne très bien. Voici le résultat ainsi que le code.

\version "2.24.4"

\paper {
#(set-paper-size "letter landscape")
indent = 0
ragged-right = ##f
}

\markup vF = \markup \italic \teeny \with-color #blue \etc % formatage des doigtés d'accords
mesAccords = \chordmode {

\override GridChordName.text = \markup { "A" \super "b"m \super "6" \vF "IV" } aes4:m6
\override GridChordName.text = \markup { "G" \super "7(#5)" \vF "x x 3 4 4 3" } g2.:7.5+

\override GridChordName.text = \markup { "A" \super "b"m \super "6" \vF "IV" } aes2.:m6
\override GridChordName.text = \markup { "G" \super "7(#5)" \vF "x x 3 4 4 3" } g4:7.5+

\override GridChordName.text = \markup { "A" \super "b"m \super "6" \vF "IV" } aes2:m6
\override GridChordName.text = \markup { "G" \super "7(#5)" \vF "x x 3 4 4 3" } g4:7.5+
\override GridChordName.text = \markup { "A" \super "b"m \super "6" \vF "IV" } aes4:m6

\override GridChordName.text = \markup { "A" \super "b"m \super "6" \vF "IV" } aes4:m6
\override GridChordName.text = \markup { "G" \super "7(#5)" \vF "x x 3 4 4 3" } g4:7.5+
\override GridChordName.text = \markup { "A" \super "b"m \super "6" \vF "IV" } aes2:m6
}
\score {
\new ChordGrid \mesAccords
}

J'ai maintenant une question si je puis abuser...

Est-ce qu'il y aurait une façon de placer la commande \override... dans une variable ainsi que le nom descriptif de l'accord ?

Quelque chose du genre :

\cmdOverride = \override GridChordName.text = \markup
\AbmVI = "A" \super "b"m \super "6" \vF "IV"

\cmdOverride { \AbmVI } aes4:m6

Ne serait-ce pas plus pratique sans avoir à répéter le texte de l'accord lui-même ? Comme ça par exemple :

\version "2.24.4"

\paper {
  indent = 0
  ragged-right = ##f
  #(set-paper-size "letter landscape")
}

t =
#(define-music-function (chord text) (ly:music? markup?)
   #{
     \once \override GridChordName.stencil =
       #(lambda (grob)
          (grob-interpret-markup
           grob
           #{
             \markup {
               #(ly:grob-property grob 'text)
               \with-outline "" \italic \teeny \with-color #blue #text
             }
           #}))
     #chord
   #})

mesAccords = \chordmode {
  \t aes4:m6 "IV"
  \t g2.:7.5+ "x x 3 4 4 3"
  \t aes2.:m6 "IV"
  \t g4:7.5+ "x x 3 4 4 3"
  \t aes2:m6 "IV"
  \t g4:7.5+ "x x 3 4 4 3"
  \t aes4:m6 "IV"
  \t aes4:m6 "IV"
  \t g4:7.5+ "x x 3 4 4 3"
  \t aes2:m6 "IV"
}
\score {
\new ChordGrid \mesAccords
}
1 « J'aime »

Au passage, ça fait plaisir de voir des gens utiliser ces grilles harmoniques ! Ça me rappelle plein de souvenirs de la période où je les ai implémentées avec beaucoup d'aide de @vincent (il y a deux ans déjà, le temps passe vite…).

Je suis nouveau dans le monde à Lily et j'ai justement lu votre fil d'il y a 2 ans au grand complet. J'ai également découvert les grilles harmoniques grâce à Lily et c'est franchement génial, j’adore ça.

Je vais essayer votre suggestion plus tard ce soir mais je suis certain que ça va être top. Merci.

J'ai trouvé un peu de temps pour essayer votre code, j'avais trop hâte donc..

Ça fonctionne parfaitement sauf un petit décalage des noms d'accord qui fait que l'annotation se place à cheval sur la mesure suivante.

Voici une capture d'écran comparant les deux méthodes.

J'aimerais bien être en mesure de corriger le problème mais je ne connais pas du tout le Scheme. Un coup les bases de Lily apprivoisées, je vais certainement m'y mettre.

Merci votre aide est très appréciée.

Supprimez le \with-outline "" si vous voulez que le nom d'accord se déplace vers la gauche pour faire de la place aux annotations bleues.

Merci Jean cela fonctionne parfaitement pour les grilles harmoniques. Par-contre si je veux utiliser les mêmes accords pour une partition normale le texte ne "respecte" pas l'espace de l'accord suivant.

En premier lieu j'ai changé \once \override GridChordName.stencil... pour \once \override ChordName.stencil... afin de voir le texte dans la partition normale. Jusque là c'est ok. Pour éviter les colisions j'ai essayé la commande \textLengthOn mais ça ne fonctionne pas. J'ai aussi essayé de modifier la largeur des mesures concernées ponctuellement. Cela fonctionne mais pas toujours. Voici une image et le code.

\version "2.24.4"

\paper {
#(set-paper-size "letter landscape")
indent = 0
ragged-right = ##f
}

melodie = \relative c' {
  \clef treble 
  \key g \major
  \time 3/4

    c'4 d c
    b2.~
    b2 b8 c
    d4 cis e
    d2 d8 d
    e4 dis fis
    e2 e8 e
    fis4. e8 d4
    c' b a
    g2.~
    g2 fis8 g
    a4. a8 a4
    a g fis
}

 t = #(define-music-function (chord text) (ly:music? markup?)
           #{
             %\once \override GridChordName.stencil =			% POUR GRILLE HARMONIQUE
             \once \override ChordName.stencil =				% POUR LES AUTRE
               #(lambda (grob)
                  (grob-interpret-markup
                   grob
                   #{
                       \markup { \hspace #-3
                       #(ly:grob-property grob 'text)
                       %\with-outline "" \italic \fontsize #-4 \with-color #blue #text
                       \italic \vcenter \center-align \fontsize #-4 \with-color #blue #text
                     }
                   #}))
             #chord
           #})

mesAccords = \chordmode { 
         \t a 2:m7 "II-5" \t c4:7.5- "(2 x 2 3 1 x)"
         \t g2. "III" 
         g2.
         \t g4:7+ "III"   \t g2:dim7 "(3 x 2 3 2 x)" 
         \t g2 "III" \t g4:7 "III"
         \t c4 "III-5" \t c2:dim "III-5"
         \t c2:7+ "III-5" \t a4:7 "V"
         \break
         \t d2.:7 "V-5"
         \t a4:m11 "(5 5 5 5 5 8)" \t d:3.13.9-.5- "(4 6 x 5 7 7)" \t fis:dim7 "IV-4" 
         \t g2. "III"
        g2.
         \t d2.:7~"V-5"
        d4:7  \t a:m7 "V" \t d/a~ "V"
}

\book { \markup { \vspace #2 }
    \paper { system-system-spacing.basic-distance = #20 } % espacement entre les portées        
            
    \score {
        <<  
            \new ChordNames  \mesAccords
            \new Staff 
            \new Voice \melodie 
        >>
        
        \layout {
          \override ChordName.font-size = #4
          \override ChordName.X-offset = #3
       }
   }
 }

Je ne comprends pas bien pourquoi vous avez mis \hspace #-3 dans le \markup (c'est cet espacement négatif qui permet les collisions) et dans le même temps \override ChordName.X-offset = #3. Sans ces deux commandes, j'obtiens

Bon ça fonctionne très bien sans ces deux commandes. En fait j'essayais d'amener le texte plus prêt du nom de lAccord. Mais c'est un détail dont je peux me passer. Merci énormément pour votre aide.

Dans ce cas, il faut mettre le \hspace entre #(ly:grob-property grob 'text) et \italic \vcenter ... #text, non pas avant #(ly:grob-property grob 'text).

Et j'anticipe la question suivante que je pressens : est-il possible de faire varier le \hspace automatiquement pour que le texte en bleu se rapproche le plus possible vers la gauche sans rentrer en collision avec le texte, mais éventuellement en se glissant sous les exposants comme 7 et Δ ? La réponse est oui, mais ça m'a pris un peu plus de travail à faire et je n'ai pas le souvenir qu'il y ait plus simple (après, ça a pu changer dans le temps qui s'est écoulé depuis que j'ai arrêté le développement) :

\version "2.24.4"

\paper {
#(set-paper-size "letter landscape")
indent = 0
ragged-right = ##f
}

melodie = \relative c' {
  \clef treble 
  \key g \major
  \time 3/4

    c'4 d c
    b2.~
    b2 b8 c
    d4 cis e
    d2 d8 d
    e4 dis fis
    e2 e8 e
    fis4. e8 d4
    c' b a
    g2.~
    g2 fis8 g
    a4. a8 a4
    a g fis
}

#(define-markup-command (concat-skylines layout props pad horiz-pad m1 m2) (number? number? markup? markup?)
   (let* ((stil1 (interpret-markup layout props m1))
          (sky1 (cdr (ly:skylines-for-stencil stil1 Y)))
          (stil2 (interpret-markup layout props m2))
          (sky2 (car (ly:skylines-for-stencil stil2 Y)))
          (dist (ly:skyline-distance sky1 sky2 horiz-pad)))
     (ly:stencil-add stil1 (ly:stencil-translate-axis stil2 (+ dist pad) X))))

 t = #(define-music-function (chord text) (ly:music? markup?)
           #{
             %\once \override GridChordName.stencil =			% POUR GRILLE HARMONIQUE
             \once \override ChordName.stencil =				% POUR LES AUTRE
               #(lambda (grob)
                  (grob-interpret-markup
                   grob
                   #{
                       \markup \concat-skylines #0.4 #0.05
                       #(ly:grob-property grob 'text)
                       %\with-outline "" \italic \fontsize #-4 \with-color #blue #text
                       \italic \vcenter \fontsize #-4 \with-color #blue #text
                   #}))
             #chord
           #})

mesAccords = \chordmode { 
         \t a 2:m7 "II-5" \t c4:7.5- "(2 x 2 3 1 x)"
         \t g2. "III" 
         g2.
         \t g4:7+ "III"   \t g2:dim7 "(3 x 2 3 2 x)" 
         \t g2 "III" \t g4:7 "III"
         \t c4 "III-5" \t c2:dim "III-5"
         \t c2:7+ "III-5" \t a4:7 "V"
         \break
         \t d2.:7 "V-5"
         \t a4:m11 "(5 5 5 5 5 8)" \t d:3.13.9-.5- "(4 6 x 5 7 7)" \t fis:dim7 "IV-4" 
         \t g2. "III"
        g2.
         \t d2.:7~"V-5"
        d4:7  \t a:m7 "V" \t d/a~ "V"
}

\book { \markup { \vspace #2 }
    \paper { system-system-spacing.basic-distance = #20 } % espacement entre les portées        
            
    \score {
        <<  
            \new ChordNames  \mesAccords
            \new Staff 
            \new Voice \melodie 
        >>
        
        \layout {
          \override ChordName.font-size = #4
       }
   }
 }

Le premier argument de \concat-skylines (là où j'ai mis #0.4) est la distance horizontale que le texte bleu doit respecter avec le nom d'accord à gauche, le second (#0.05) est en gros la distance verticale avec les parties éventuelles du nom d'accord qui le surplombent.

(Et là aussi, je suis bien content d'avoir ajouté ces fonctions Scheme en ly:skyline-..., et j'ai du mal à réaliser que ça fait déjà des années…)

1 « J'aime »

C'est la perfection ! Je suis fin prêt pour retranscrire toutes mes partitions que j'ai avec MuseScore. Merci infiniment pour votre aide.

1 « J'aime »