Accords dans une variable : ça ne fonctionne pas ?

Bonjour,

Je voudrais mettre un enchaînement d'accords dans une variable afin de
pouvoir le replacer à plusieurs endroits d'une partition sans devoir le
dupliquer, mais j'obtiens systématiquement une erreur.

La partition de départ, composée d'une tablature pour guitare basse
surmontée des accords :

\score {
  <<
    \new ChordNames { \chordmode {
% enchaînement d'accords 1
      d1:m d:m g:m f
      a1 a g:m f2 a/cis
      \break
% enchaînement d'accords 2
      d1:m d:m g:m f2 gis:dim
      a1 a g:m f2 a/cis
    } }%\Accords }
    \new TabStaff \with { stringTunings = #bass-tuning \tabFullNotation } {
d,1 d, }
  >>
  \layout { indent = 0 }
}

Jusque là, tout va bien.

Mais si je mets les accords dans une variable, j'obtiens "Erreur : chaîne
non reconnue ; en dehors d'un script textuel ou de \lyricmode".

AccMotifA = {
  d1:m d:m g:m f
  a1 a g:m f2 a/cis
}
AccMotifB = {
  d1:m d:m g:m f2 gis:dim
  a1 a g:m f2 a/cis
}

\score {
  <<
    \new ChordNames { \chordmode {
      \AccMotifA
      \break
      \AccMotifB
    } }
    \new TabStaff \with { stringTunings = #bass-tuning \tabFullNotation } {
d,1 d, }
  >>
  \layout { indent = 0 }
}

Que faut-il faire (je n'ai rien trouvé dans la doc qui puisse me dépanner) ?

Merci.

···

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

Bonjour,
si j'ai bien compris il suffit de mettre \chordmode dans la variable

AccMotifA = \chordmode {
d1:m d:m g:m f
a1 a g:m f2 a/cis
}

···

Martial Rameaux

Merci.

Effectivement, en mettant \chordmode dans la variable ça fonctionne.

Mais ça ne paraît pas logique du tout, car ça fait des instructions
\chordmode imbriquées (voir ci-dessous) :

AccMotifA = \chordmode {
  d1:m d:m g:m f
  a1 a g:m f2 a/cis
}
AccMotifB = \chordmode {
  d1:m d:m g:m f2 gis:dim
  a1 a g:m f2 a/cis
}

\score {
  <<
    \new ChordNames \chordmode {
% ici on s'attend à ce que tout ce qui est entre les crochets {} soit
interprété comme des accords
      d:m d:m d:m d:m
      \AccMotifA
      \break
      \AccMotifB
    }
    \new TabStaff \with { stringTunings = #bass-tuning \tabFullNotation } {
d,1 d, }
  >>
  \layout { indent = 0 }
}

Ce qui paraît plus logique de prime abord, c'est
1. de mettre \chordmode une fois autour de l'expression contenant les noms
des accords ;
2. que l'expansion des variables soit fait avant l'analyse syntaxique (comme
une macro).

Mais bon, l'essentiel est d'obtenir le résultat souhaité :slight_smile:

···

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

Bonjour,

Ce qui paraît plus logique de prime abord, c'est
1. de mettre \chordmode une fois autour de l'expression contenant les noms
des accords ;
2. que l'expansion des variables soit fait avant l'analyse syntaxique (comme
une macro).

Je ne sais pas si c'est plus logique, mais de mon point de vue il est
beaucoup plus efficace de savoir dès le début si on est en \chordmode,
en \lyricmode ou en mode de saisie de notes, parce que ça permet de
détecter les erreurs le plus vite, et de les localiser au mieux.

Mais bon, l'essentiel est d'obtenir le résultat souhaité :slight_smile:

Oui, et de ne pas perdre trop de temps à débuguer à l'endroit où
on appelle ce qui serait une « macro » alors que le bug se trouve
plusieurs dizaines de lignes plus haut, lors de la définition de
la variable.

Cordialement,

···

Le 05/10/2019 14:49, Monteverdi via lilypond-user-fr a écrit :
--
Olivier Miakinen

Bonjour,

Ce qui paraît plus logique de prime abord, c'est
1. de mettre \chordmode une fois autour de l'expression contenant les noms
des accords ;
2. que l'expansion des variables soit fait avant l'analyse syntaxique (comme
une macro).

Notez que par exemple :
variable = \relative { … }
{ \relative { musique… \variable … } }
contient déjà des accolades imbriquées qui sous-entendent \notemode, et imbrique les \relative.

De plus, une expansion des variables réalisée avant l'analyse syntaxique signifierait une double évaluation de variables qui sont appelées plusieurs fois (possiblement dans différents contextes au sens large), ce qui n'est pas souhaitable. En fait, je crois que cette architecture provient même plus fondamentalement de l'absence de distinction apportée par Scheme aux objets de code et à leurs résultats. (Ainsi, LaTeX permet je crois par certains aspects de réaliser de pures « macros » comme vous l'entendez, même si je ne m'avancerais pas trop sur ce sujet.)

Mais bon, l'essentiel est d'obtenir le résultat souhaité :slight_smile:

Je suis bien d'accord !
Cordialement,
Jean Abou Samra