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

From: Emmanuel Franquemagne via LilyPond <[email-masked]>
Date: Tue, 03 Feb 2026 09:48:39 +0000

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

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/eviter-la-repetition-inutile-de-larmure-metrique-a-la-transition-de-mouvement-dans-une-piece/6091/1).

Pour créer un nouveau sujet, écrivez à [[email-masked]](mailto:[email-masked]) ou visitez la [page d'accueil de lilypond.community](https://lilypond.community).

---

From: MartialR via LilyPond <[email-masked]>
Date: Tue, 03 Feb 2026 14:45:11 +0000

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'
}
```
autrement dit il faut comparer des strings et non des booléens

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/eviter-la-repetition-inutile-de-larmure-metrique-a-la-transition-de-mouvement-dans-une-piece/6091/2).

---

From: MartialR via LilyPond <[email-masked]>
Date: Tue, 03 Feb 2026 15:00:07 +0000

la solution
```
currentKey= "D"

{
    #(if (string=? "D-" currentKey )
     #{  \key d \minor #} 
     #{  \key d \major #}
     )
  
     c'
}
```

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/eviter-la-repetition-inutile-de-larmure-metrique-a-la-transition-de-mouvement-dans-une-piece/6091/3).

---

From: Jean Abou Samra via LilyPond <[email-masked]>
Date: Tue, 03 Feb 2026 15:03:39 +0000

[quote="franquemagnee, post:1, topic:6091"]
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.
[/quote]

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](https://extending-lilypond.gitlab.io/fr/scheme/quoting.html#identity-of-symbols) pour quelques explications), c'est `equal?` qu'il faut utiliser.

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/eviter-la-repetition-inutile-de-larmure-metrique-a-la-transition-de-mouvement-dans-une-piece/6091/4).

---

From: MartialR via LilyPond <[email-masked]>
Date: Tue, 03 Feb 2026 16:03:41 +0000

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

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/eviter-la-repetition-inutile-de-larmure-metrique-a-la-transition-de-mouvement-dans-une-piece/6091/5).

---

From: Emmanuel Franquemagne via LilyPond <[email-masked]>
Date: Thu, 05 Feb 2026 14:05:16 +0000

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!

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/eviter-la-repetition-inutile-de-larmure-metrique-a-la-transition-de-mouvement-dans-une-piece/6091/6).