Éviter la répétition inutile de l'armure/métrique à la transition de mouvement dans une pièce

Bonjour,

J'ai une pièce dont le code est scindé en plusieurs parties (1 partie par mouvement). Chaque mouvement est censé être indépendant, donc aucun ne peut présumer de comment se termine le précédent.
En version "naïve" (sans code particulier), si un mouvement commence dans la même tonalité que le mouvement précédent (ou avec la même métrique), alors les éléments sont répétés explicitement, ce qui n'est pas souhaité, mais pas non plus illogique.

J'ai donc essayé de définir des variables qui contiennent la tonalité courante et la métrique courante, à charge pour chaque mouvement de positionner ces variables pour indiquer leur contexte de fin.

Pour commencer facile, j'ai défini les variables "au plus dur" comme suit:

currentKey = "D-"
currentTimeSignature = "4/4"

Dans la partie Structure du début d'un mouvement, j'ai le code suivant:

  #(if #(not eq? currentKey "D-")
       #{
        \key d \minor
       #})
  #(if #(not eq? currentTimeSignature "4/4")
       #{
        \time 4/4
        \set Timing.beamExceptions = #'()
        \set Timing.beatBase = #1/4
        \set Timing.beatStructure = 1,1,1,1
       #})

Le comportement que j'ai n'est pas celui attendu:

  • Si mon code comporte des #(if #(not eq? currentTimeSignature "4/4") #{\key \d \minor..., alors la métrique est systématiquement imprimée, quelle que soit la valeur de la variable.
  • Par contre si j'ai #(unless #(eq? currentTimeSignature "4/4") #{\key \d \minor... alors la métrique n'est jamais imprimée, quelle que soit la valeur à laquelle j'ai positionné currentTimeSignatiure

J'ai essayé de fixer les variables en #(define... au tout début de la pièce, ou par des #(set!... en cours de mouvement, mais le résultat ne change pas.
Si quelqu'un a une suggestion ou une idée pour combiner #if et non-répétition des armures et métriques, je suis preneur. Dans l'attente, je vais manuellement commenter le code Lilypond dans les nouveaux mouvements lorsque je sais (oui, syndrome du démiurge) que ces éléments ne changent pas d'un mouvement à l'autre.

Merci beaucoup, bonne journée à tous.
Emmanuel

Bonjour,

alors je n'ai qu'un début de solution
comme ceci ça fonctionne

currentKey= 1 %0


{
    #(if (not (eq? currentKey 1 ))
     #{  \key d \minor #} 
     #{  \key d \major #}
     )
  
     c'
}

la solution

currentKey= "D-"

{
    #(if (string=? "D-" currentKey )
     #{  \key d \minor #} 
     #{  \key d \major #}
     )
  
     c'
}
1 « J'aime »

Deux problèmes ici. D'abord, en LilyPond, # est la syntaxe pour passer en Scheme, mais quand on est déjà en Scheme, #(...) est la syntaxe pour les vecteurs, donc #(not eq? currentTimeSignature "4/4") est un vecteur de 4 éléments (trois symboles et une chaîne de caractères), donc toujours considéré comme vrai par if. Donc il faut enlever ce # en trop. Ensuite, eq? ne fonctionne pas pour comparer les valeurs de deux chaînes de caractères (voir ici pour quelques explications), c'est equal? qu'il faut utiliser.

1 « J'aime »

ha merci Jean pour equal? c'est plus propre que string=?

Bonjour à tous,

Merci pour vos réponses! Je vais tester tout ça dès que j'aurai réactivé la génération de mon conducteur (j'ai tout commenté pour me concentrer sur mes problèmes de création du 1er et 4ème de converture :wink:)

Je vous tiens au courant pour que le post soit complet et utile.

Bon après-midi à tous!