Subject: Altérations dièse ou bémol au lieu de bécarre avec easyHeadsOn

From: Ya Gloops <[email-masked]>
Date: Thu, 16 Mar 2023 07:12:55 +0000 (UTC)

Bonjour, j'utilise la fonction easyHeadsOn, mais je ne trouve pas très logique d'obtenir, dans l'exemple de sol majeur suivant,  un bécarre 7 au lieu d'un bémol 7, et dans la tonalité de f majeur, d'obtenir un bécarre 4 au lieu d'un dièse 4... Est-il possible d'écrire une fonction qui ajusterait pour chaque tonalité ?Merci pour votre aide! \version "2.24.1"
#(define Ez_numbers_engraver   (make-engraver    (acknowledgers     ((note-head-interface engraver grob source-engraver)      (let* ((context (ly:translator-context engraver))             (tonic-pitch (ly:context-property context 'tonic))             (tonic-name (ly:pitch-notename tonic-pitch))             (grob-pitch              (ly:event-property (event-cause grob) 'pitch))             (grob-name (ly:pitch-notename grob-pitch))             (delta (modulo (- grob-name tonic-name) 7))             (note-names              (make-vector 7 (number->string (1+ delta)))))        (ly:grob-set-property! grob 'note-names note-names))))))
#(set-global-staff-size 26)
\layout {  ragged-right = ##t  \context {    \Voice    \consists \Ez_numbers_engraver  }}
% Faire automatiquement un bémol au lieu d'un bécarre\relative c'' {\easyHeadsOn\key g \major g f}% Faire automatiquement un dièse au lieu d'un bécarre\relative c' {\easyHeadsOn\key f \majorf b}

---

From: Jean Abou Samra <[email-masked]>
Date: Thu, 16 Mar 2023 10:59:50 +0100

Le jeudi 16 mars 2023 à 07:12 +0000, Ya Gloops a écrit :
>  Bonjour, j'utilise la fonction easyHeadsOn, mais je ne trouve pas très logique d'obtenir, dans l'exemple de sol majeur suivant,   
>  un bécarre 7 au lieu d'un bémol 7, et dans la tonalité de f majeur, d'obtenir un bécarre 4 au lieu d'un dièse 4...  
>  Est-il possible d'écrire une fonction qui ajusterait pour chaque tonalité ?  
> Merci pour votre aide!  

Je ne comprends pas trop la demande.

Du point de vue de LilyPond, il n'y a qu'une note normale sur une portée normale, simplement son degré est indiqué à l'intérieur de la note. Dans quel contexte est-ce que tu souhaites modifier cette règle ? Quelle est la nouvelle règle exactement ?

Cordialement,

Jean

---

From: Ya Gloops <[email-masked]>
Date: Thu, 16 Mar 2023 10:16:45 +0000 (UTC)

Merci pour ton aide JeanEn tonalité de Do majeur, le comportement des altérations est parfaite puisqu'il n'y a aucune altération à la clé. Mais à partir du moment où nous sommes dans une autre tonalité, alors Lilypond indique un bécarre au lieu d'un dièse ou un bémol. Dans l'exemple de la note fa en sol majeur, il serait plus logique de lire ♭7 car ♮7 correspond à un fa♯.Et dans l'exemple de la note si en fa majeur, il serait plus logique de lire ♯4 car ♮4 correspond à un si♭.   Le jeudi 16 mars 2023 à 10:59:54 UTC+1, Jean Abou Samra <[email-masked]> a écrit :  

Cordialement,

Jean

---

From: Ya Gloops <[email-masked]>
Date: Thu, 16 Mar 2023 10:23:00 +0000 (UTC)

Si nous prenons ces deux notes en tonalité de do majeur, alors Lilypond affichera le si♭ par un ♭7 et le fa♯ par un ♯4...
    Le jeudi 16 mars 2023 à 11:16:45 UTC+1, Ya Gloops <[email-masked]> a écrit :  

Cordialement,

Jean

---

From: Ya Gloops <[email-masked]>
Date: Thu, 16 Mar 2023 10:50:52 +0000 (UTC)

Donc concrètement, voici ce qu'il faudrait, les altérations au-dessus de la portée sont les bonnes...

Le jeudi 16 mars 2023 à 11:23:00 UTC+1, Ya Gloops <[email-masked]> a écrit : 

Merci pour ton aide Jean
En tonalité de Do majeur, le comportement des altérations est parfaite puisqu'il n'y a aucune altération à la clé. Mais à partir du moment où nous sommes dans une autre tonalité, alors Lilypond indique un bécarre au lieu d'un dièse ou un bémol. Dans l'exemple de la note fa en sol majeur, il serait plus logique de lire ♭7 car ♮7 correspond à un fa♯.
Et dans l'exemple de la note si en fa majeur, il serait plus logique de lire ♯4 car ♮4 correspond à un si♭.

Le jeudi 16 mars 2023 à 10:59:54 UTC+1, Jean Abou Samra <[email-masked]> a écrit : 

Cordialement,

Jean

---

From: Ya Gloops <[email-masked]>
Date: Thu, 16 Mar 2023 10:51:20 +0000 (UTC)

\version "2.24.1"

#(define Ez_numbers_engraver
   (make-engraver
    (acknowledgers
     ((note-head-interface engraver grob source-engraver)
      (let* ((context (ly:translator-context engraver))
             (tonic-pitch (ly:context-property context 'tonic))
             (tonic-name (ly:pitch-notename tonic-pitch))
             (grob-pitch
              (ly:event-property (event-cause grob) 'pitch))
             (grob-name (ly:pitch-notename grob-pitch))
             (delta (modulo (- grob-name tonic-name) 7))
             (note-names
              (make-vector 7 (number->string (1+ delta)))))
        (ly:grob-set-property! grob 'note-names note-names))))))

\layout {
  ragged-right = ##t
  \context {
    \Voice
    \consists \Ez_numbers_engraver
  }
}

% Faire automatiquement un bémol au lieu d'un bécarre
\relative c'' {
\easyHeadsOn
\key g \major
 g f^"#" fis^"♮"
}
% Faire automatiquement un dièse au lieu d'un bécarre
\relative c' {
\easyHeadsOn
\key f \major
f b^"#" bes^"♮"
}

Le jeudi 16 mars 2023 à 11:50:52 UTC+1, Ya Gloops <[email-masked]> a écrit : 

Merci pour ton aide Jean

Cordialement,

Jean

---

From: Ya Gloops <[email-masked]>
Date: Thu, 16 Mar 2023 11:25:44 +0000 (UTC)

Pardon, j'ai fail une erreur dans le precedent, voici la bonne

\version "2.24.1"

\layout {
  ragged-right = ##t
  \context {
    \Voice

 g f^"♭" fis^"♮"

Le jeudi 16 mars 2023 à 11:51:20 UTC+1, Ya Gloops <[email-masked]> a écrit : 

\version "2.24.1"

\layout {
  ragged-right = ##t
  \context {
    \Voice

Merci pour ton aide Jean

Cordialement,

Jean

---

From: Jean-Paul Quelen <[email-masked]>
Date: Thu, 16 Mar 2023 16:29:31 +0100

Je suis comme Jean, je ne comprends pas trop la question. 
Personnellement je n'ai jamais eu de problèmes avec les altérations, de 
plus LilyPond distingue bien les # des b et c'est parfait.

Je dirai de façon globale que les notes sont codées de façon absolue 
quelque soit le contexte : fis pour fa#, ges pour solb et f! si on veut 
afficher, quelque soit le contexte, l'altération ou l'absence 
d'altération (le becarre).

Après c'est un problème de solfège. En sol majeur, sauf indication 
contraire, la fa est par défaut diésé (il y a un fa# à la clé).
Il est marqué fis dans le source mais marqué fa sans autre indication 
sur la partition. Si on désire faire un fa naturel alors il faut écrire 
f dans le source et le fa sera précédé d'un becarre dans la partition.

Par ailleurs en musique les # ne sont pas égaux à des b, ainsi la# et 
sib sont différents, mais là on part dans des considérations de 
tempérament qui dépassent le cadre de votre demande.
Cordialement
Jean-Paul

Le 16/03/2023 à 11:16, Ya Gloops a écrit :
> Merci pour ton aide Jean
> En tonalité de Do majeur, le comportement des altérations est parfaite 
> puisqu'il n'y a aucune altération à la clé. Mais à partir du moment où 
> nous sommes dans une autre tonalité, alors Lilypond indique un bécarre 
> au lieu d'un dièse ou un bémol. Dans l'exemple de la note fa en sol 
> majeur, il serait plus logique de lire ♭ 
> <https://fr.wiktionary.org/wiki/%E2%99%AD>7 car ♮7 correspond à un fa♯.
> Et dans l'exemple de la note si en fa majeur, il serait plus logique de 
> lire ♯4 car ♮4 correspond à un si♭ 
> <https://fr.wiktionary.org/wiki/%E2%99%AD>.
>>  Bonjour, j'utilise la fonction easyHeadsOn, mais je ne trouve pas 
>> très logique d'obtenir, dans l'exemple de sol majeur suivant,
>>  un bécarre 7 au lieu d'un bémol 7, et dans la tonalité de f majeur, 
>> d'obtenir un bécarre 4 au lieu d'un dièse 4...
> Du point de vue de LilyPond, il n'y a qu'une note normale sur une portée 
> normale, simplement son degré est indiqué à l'intérieur de la note. Dans 
> quel contexte est-ce que tu souhaites modifier cette règle ? Quelle est 
> la nouvelle règle exactement ?
> 
> Cordialement,
> 
> Jean
>

---

From: Ya Gloops <[email-masked]>
Date: Thu, 16 Mar 2023 15:50:46 +0000 (UTC)

Bonjour Jean-Paul,
J'espère qu'il est clair pour tout le monde que dans le cadre de la notation traditionnel, LilyPond fonctionne parfaitement avec les altérations. Et bien évidement je ne parle pas non plus de tempérament inégal !!!
En revanche, dans le cadre d'une notation chiffrée comme Ez_numbers_engraver, lorsque LilyPond indique la note bécarre 7, pour moi, il s'agit de la septième majeure de la tonalité, soit la note si en do majeur. Or en sol majeur, quand LilyPond affiche bécarre 7 il ne s'agit pas de la septième majeure de la tonalité de sol, mais la septième mineure fa…
Gilles

Le jeudi 16 mars 2023 à 16:32:16 UTC+1, Jean-Paul Quelen <[email-masked]> a écrit :

---

From: Martial R <[email-masked]>
Date: Fri, 17 Mar 2023 08:10:01 +0100

Bonjour,

Je comprends très bien la demande,
mais j'écrirai plutôt même si je ne serai pas y répondre,
SI  # +1/2 et  FA #-1/2 pour une meilleur compréhension des écarts dans la
gamme

Bonne journée

Le jeu. 16 mars 2023 à 16:51, Ya Gloops <[email-masked]> a écrit :

> Bonjour Jean-Paul,
> J'espère qu'il est clair pour tout le monde que dans le cadre de la
> notation traditionnel, LilyPond fonctionne parfaitement avec les
> altérations. Et bien évidement je ne parle pas non plus de tempérament
> inégal !!!
> En revanche, dans le cadre d'une notation chiffrée
> comme Ez_numbers_engraver, lorsque LilyPond indique la note bécarre 7, pour
> moi, il s'agit de la septième majeure de la tonalité, soit la note si en do
> majeur. Or en sol majeur, quand LilyPond affiche bécarre 7 il ne s'agit pas
> de la septième majeure de la tonalité de sol, mais la septième mineure fa…
> Gilles
>
>
>
>
>
>

-- 
Martial Rameaux

---

From: Ya Gloops <[email-masked]>
Date: Fri, 17 Mar 2023 08:04:22 +0000 (UTC)

Bonjour Martial !
Ta compréhension me fait plaisir, et cela, malgré une explication très confuse ! 
+1/2 et -1/2 fonctionne aussi, mais qui prend, je pense, plus de place qu'un dièse et un bémol…

Le vendredi 17 mars 2023 à 08:10:19 UTC+1, Martial R <[email-masked]> a écrit : 

Bonjour, 

Je comprends très bien la demande, 
mais j'écrirai plutôt même si je ne serai pas y répondre, 
SI  # +1/2 et  FA #-1/2 pour une meilleur compréhension des écarts dans la gamme

Bonne journée

-- 
Martial Rameaux

---

From: Martial R <[email-masked]>
Date: Fri, 17 Mar 2023 10:40:05 +0100

Le soucis c'est que les becarre servent aussi bien a monter qu'a descendre
une note...
On peut peut-être ne mettre que + ou - ou ine flèche qui monte ou descent.

---

From: Ya Gloops <[email-masked]>
Date: Fri, 17 Mar 2023 09:46:29 +0000 (UTC)

Effectivement c’est une possibilité j’aime bien l’idée de la flèche, après le bécarre offre l’avantage de ne pas avoir à remettre le dièse ou le bémol sur toutes les notes concernées par l’altération dans la mesure !

Le vendredi, mars 17, 2023, 10:40 AM, Martial R <[email-masked]> a écrit :

Le soucis c'est que les becarre servent aussi bien a monter qu'a descendre une note... On peut peut-être ne mettre que + ou - ou ine flèche qui monte ou descent. 
Le ven. 17 mars 2023 à 09:05, Ya Gloops <[email-masked]> a écrit :

Bonjour Martial !

Bonjour, 

Bonne journée

-- 
Martial Rameaux

---

From: Martial R <[email-masked]>
Date: Sat, 18 Mar 2023 21:02:01 +0100

Bonsoir
désolé de répondre si tardivement

la solution existe, voir les Glyphes d’altération alternatifs
https://lilypond.org/doc/v2.24/Documentation/notation/displaying-pitches#alternate-accidental-glyphs

voici une piste  :
%----------------------------
\version "2.24.1"

\score {
  { cis'  c'! }
  \layout {
    \context {
      \Staff
      alterationGlyphs =
      #'(
          ;(0 . "accidentals.natural.arrowup")
          (0 . "accidentals.natural.arrowdown")
          (1/2 . "accidentals.sharp")
          )
    }
  }
}

%//////

\score {
  { ces'  c'! }
  \layout {
    \context {
      \Staff
      alterationGlyphs =
      #'( (-1/2 . "accidentals.flat")
          (0 . "accidentals.natural.arrowup")
          ;   (0 . "accidentals.natural.arrowdown")
          )
    }
  }
}
%----------------------------

Le ven. 17 mars 2023 à 10:46, Ya Gloops <[email-masked]> a écrit :

> Effectivement c’est une possibilité j’aime bien l’idée de la flèche, après
> le bécarre offre l’avantage de ne pas avoir à remettre le dièse ou le bémol
> sur toutes les notes concernées par l’altération dans la mesure !
>
>
>

-- 
Martial Rameaux

---

From: Ya Gloops <[email-masked]>
Date: Sat, 18 Mar 2023 20:23:08 +0000 (UTC)

Malheureusement, ce système modifie toutes les altérations, alors qu'il ne faudrait modifier que celle qui sont à l'armure...
Les fa# en sol majeur, les sib en fa majeur, les fa# et do# en ré majeur etc etc...

Le samedi 18 mars 2023 à 21:02:20 UTC+1, Martial R <[email-masked]> a écrit : 

Bonsoir

la solution existe, voir les Glyphes d’altération alternatifshttps://lilypond.org/doc/v2.24/Documentation/notation/displaying-pitches#alternate-accidental-glyphs

voici une piste  :

\score {
  { cis'  c'! }
  \layout {
    \context {
      \Staff
      alterationGlyphs =
      #'(

%//////

\score {
  { ces'  c'! }
  \layout {
    \context {
      \Staff
      alterationGlyphs =

Le ven. 17 mars 2023 à 10:46, Ya Gloops <[email-masked]> a écrit :
>> Le soucis c'est que les becarre servent aussi bien a monter qu'a descendre une note... 

-- 
Martial Rameaux

---

From: Martial R <[email-masked]>
Date: Sun, 19 Mar 2023 10:03:51 +0100

Bonjour,

Et en faisant ainsi ?
certe ce n'est pas encore automatique mais on devrait y arriver
\version "2.24.1"

\layout {
  ragged-right = ##t
  \context {
    \Voice

%
bDwn = \override  Accidental.alteration-glyph-name-alist  = #'((0 .
"accidentals.natural.arrowdown"))
bUp = \override  Accidental.alteration-glyph-name-alist  = #'((0 .
"accidentals.natural.arrowup"))
\score {
  \relative c' {
    \easyHeadsOn
    \key g \major
    g' \bDwn f
  }

  \layout {  }
}

%//////

\score {
 \relative c' {
  \easyHeadsOn
  \key f \major
  f \bUp b
}
  \layout {  }
}

Le sam. 18 mars 2023 à 21:23, Ya Gloops <[email-masked]> a écrit :

> Malheureusement, ce système modifie toutes les altérations, alors qu'il ne
> faudrait modifier que celle qui sont à l'armure...

---

From: Martial R <[email-masked]>
Date: Sun, 19 Mar 2023 10:21:43 +0100

ha j'ai oublié  il faut mettre  \once devant

bDwn = \once \override  Accidental.alteration-glyph-name-alist  = #'((0 .
"accidentals.natural.arrowdown"))
bUp =  \once \override  Accidental.alteration-glyph-name-alist  = #'((0 .
"accidentals.natural.arrowup"))

Le dim. 19 mars 2023 à 10:03, Martial R <[email-masked]> a écrit :

>> Malheureusement, ce système modifie toutes les altérations, alors qu'il
>> ne faudrait modifier que celle qui sont à l'armure...

-- 
Martial Rameaux

---

From: Ya Gloops <[email-masked]>
Date: Sun, 19 Mar 2023 09:37:01 +0000 (UTC)

Bonjour Martial !
Un autre problème survient lorsque qu'il y a un f# ou un sib qui suit dans la même mesure. 

\layout {
  ragged-right = ##t
  \context {
    \Voice

%
bDwn = \once \override  Accidental.alteration-glyph-name-alist  = #'((0 . "accidentals.natural.arrowdown"))
bUp = \once \override  Accidental.alteration-glyph-name-alist  = #'((0 . "accidentals.natural.arrowup"))
\score {
  \relative c' {
    \easyHeadsOn
    \key g \major
    g' \bDwn f fis
  }

  \layout {  }
}

%//////

\score {
 \relative c' {
  \easyHeadsOn
  \key f \major
  f \bUp b bes
}
  \layout {  }
}

Le dimanche 19 mars 2023 à 10:22:02 UTC+1, Martial R <[email-masked]> a écrit : 

bDwn = \once \override  Accidental.alteration-glyph-name-alist  = #'((0 . "accidentals.natural.arrowdown"))
bUp =  \once \override  Accidental.alteration-glyph-name-alist  = #'((0 . "accidentals.natural.arrowup"))

Le dim. 19 mars 2023 à 10:03, Martial R <[email-masked]> a écrit :
> bDwn = \override  Accidental.alteration-glyph-name-alist  = #'((0 . "accidentals.natural.arrowdown"))
> bUp = \override  Accidental.alteration-glyph-name-alist  = #'((0 . "accidentals.natural.arrowup"))
> \score {
>   \relative c' {
>     \easyHeadsOn
>     \key g \major
>     g' \bDwn f 
>   }
> 
>   \layout {  }
> }
> 
> %//////
> 
> \score {
>  \relative c' {
>   \easyHeadsOn
>   \key f \major
>   f \bUp b 
> }
>   \layout {  }
> }

-- 
Martial Rameaux

---

From: Martial R <[email-masked]>
Date: Sun, 19 Mar 2023 10:46:09 +0100

il faut mettre \once

-- 
Martial Rameaux

---

From: Jean Abou Samra <[email-masked]>
Date: Sun, 19 Mar 2023 12:41:08 +0100

Le jeudi 16 mars 2023 à 10:16 +0000, Ya Gloops a écrit :

> Merci pour ton aide Jean  
> En tonalité de Do majeur, le comportement des altérations est parfaite puisqu'il n'y a aucune altération à la clé. Mais à partir du moment où nous sommes dans une autre tonalité, alors Lilypond indique un bécarre au lieu d'un dièse ou un bémol. Dans l'exemple de la note fa en sol majeur, il serait plus logique de lire [♭](https://fr.wiktionary.org/wiki/%E2%99%AD)7 car ♮7 correspond à un fa♯.  
> Et dans l'exemple de la note si en fa majeur, il serait plus logique de lire ♯4 car ♮4 correspond à un si[♭](https://fr.wiktionary.org/wiki/%E2%99%AD).

Je commence à me poser des questions existentielles et à remettre en question tout ce je sais sur la notation des accords (soit, je l'admets, pas grand-chose).
 
En notation chiffrée classique d'analyse harmonique, il me semble qu'une altération s'applique bien à la note comme elle est écrite. Exemple sur Wikipédia :

[https://fr.wikipedia.org/wiki/Accord_de_septi%C3%A8me_d'esp%C3%A8ce#Septi%C3%A8me_majeure](https://fr.wikipedia.org/wiki/Accord_de_septi%C3%A8me_d'esp%C3%A8ce#Septi%C3%A8me_majeure)

Sur la dernière mesure, on peut voir un ♯2 et un ♯6, qui correspondent respectivement à une seconde majeure et une sixte majeure, qui dans ta logique seraient plutôt des bécarres puisqu'en partant de la note de do, la seconde majeure est do-ré♮ et la sixte majeure est do-la♮.

D'un autre côté, LilyPond affiche 

```
\new ChordNames { <aes c' e' g'> }
```

comme « la♭ triangle ♯5 », où le ♯5 indique un sol♮. Et sur l'article Wikipédia anglophone sur les accords en jazz,

[https://en.wikipedia.org/wiki/Jazz_chord#Intervals](https://en.wikipedia.org/wiki/Jazz_chord#Intervals)

il est bien écrit que ♯2 est une seconde augmentée.

Y a-t-il un prof de musique dans la salle ? (Valentin, vous m'entendez ?)

---

From: Vincent Gay <[email-masked]>
Date: Sun, 19 Mar 2023 20:00:15 +0100 (GMT+01:00)

> Je commence à me poser des questions existentielles et à remettre en question tout ce je sais sur la notation des accords (soit, je l'admets, pas grand-chose).
Hello tous, hello Jean,

En notation d'accord il n'y a pas de soucis, le fa (bécarre) dans un accord de sol est bien compris comme une septième mineure (bemol 7) et le fa dièse comme une septième majeure. Pour ma part je fais partie de ceux qui ne comprennent pas le contexte. S'agit-il d'indiquer le nom des notes dans les têtes de note comme indiqué ici : https://lilypond.org/doc/v2.21/Documentation/notation/note-heads.html#easy-notation-note-heads ? J'imagine que non.

Une petite illustration serait la bienvenue.

---

From: Ya Gloops <[email-masked]>
Date: Sun, 19 Mar 2023 20:44:59 +0000 (UTC)

Bonjour Vincent et Jean!

C'est bien ça Vincent, mais avec des chiffres, c'est-à-dire de manière relative…

Ma problématique est d'être cohérent dans toutes les tonalités, je m'explique, enfin j'essaie.

1) Observons le comportement des notes si♭, si, fa et fa♯ dans la tonalité de do majeur.
2) Observons maintenant le comportement de ces notes, scrupuleusement transposer, en tonalité de sol majeur
3)  Et enfin les mêmes notes, toujours scrupuleusement transposer, en tonalité de fa majeur

Premièrement, pour moi nous devrions avoir un résultat identique, car il n'y a aucune raison que ce soit différent dans chaque tonalité.

En effet, en chiffrage classique, comme tu le mentionnes Jean, on applique les altérations accidentelles, et jamais celle de l'armure. Par exemple, on écrit "6" qu'elle soit mineur ou majeur, tant qu'elle n'est pas altérée par rapport à la tonalité dans laquelle on se trouve. En revanche, si cette sixte subit une altération, on la déduit de l'armure. C'est un chiffrage "absolue".

En jazz, nous sommes plutôt dans le chiffrage relatif, car on peut très souvent n'avoir qu'une grille d'accord sans partition ni indication de tonalité par exemple. Donc si une sixte est mineure, on va l'indiquer obligatoirement ♭6 ou ♭13

Donc dans le cas "Ez_numbers_engraver" ce sont les deux mondes qui se rencontrent, relatif et absolu !

En conséquence, oui pour l'indication absolue de la tonalité, en l'occurrence l'armure.
Mais pas d'indication absolue pour les notes chiffrées, si on indique la sixte mineure, ce sera toujours ♭6 et non ♮6 ou autre ♭♭6 pour les tonalités chargées en bémols.

\version "2.24.1"

\layout {
  ragged-right = ##t
  \context {
    \Voice

\score {
  \relative c' {
    \easyHeadsOn
    \key c \major
    fis f bes b
  }
  \layout {  }
}

\score {
  \relative c' {
    \easyHeadsOn
    \key g \major
    cis' c f^"♭" fis^"♮"
  }
  \layout {  }
}

\score {
  \relative c' {
    \easyHeadsOn
    \key f \major
    b'^"♯" bes^"♮" es e
  }
  \layout {  }
}

Le dimanche 19 mars 2023 à 20:01:01 UTC+1, Vincent Gay <[email-masked]> a écrit : 

19 mars 2023 12:41:40 Jean Abou Samra <[email-masked]>:

Hello tous, hello Jean,

---

From: Vincent Gay <[email-masked]>
Date: Mon, 20 Mar 2023 09:31:20 +0100

19 mars 2023 21:48:15 Ya Gloops <[email-masked]>:

Ok, je commence à comprendre. Ceci dit en jazz les septièmes sont mineures si non précisées et l'on précise #7 ou M7 pour les septièmes majeures. À l'inverse les tierces sont réputées majeures si non précisées et affublées d'un - ou d'un m si mineures. Il semble que tu veuilles ici utiliser une règle personnelle ?

Pour revenir à ta demande elle me paraît bien compliquée pour le lecteur puisque j'imagine que tu ne peux pas faire tenir le chiffre et l'altération dans la tête de note Donc tu sacrifies l'altération classique (absolue) pour une altération relative qui n'a de sens qu'en référence à une tonalité connue et basée sur la seule armure, c'est ça ? Comment fais-tu, par exemple, avec les modes mineurs pour déterminer si harmoniques ou mélodiques ?

Perso je ne ferais pas ça, j'indiquerai l'altération relative sous forme de markup, mais chacun fait comme il veut n'est-ce pas ?

Désolé de ne pas t'apporter de réponse technique, je suis une quiche en matière d'écriture de fonctions. Mais au moins j'ai compris de quoi on parle 😋

---

From: Ya Gloops <[email-masked]>
Date: Mon, 20 Mar 2023 08:58:08 +0000 (UTC)

Ceci dit en jazz les septièmes sont mineures si non précisées et l'on précise #7 ou M7 pour les septièmes majeures. À l'inverse les tierces sont réputées majeures si non précisées et affublées d'un - ou d'un m si mineures.

C'est pour ça que j'ai pris la sixte pour exemple ! 

Pour revenir à ta demande elle me paraît bien compliquée pour le lecteur puisque j'imagine que tu ne peux pas faire tenir le chiffre et l'altération dans la tête de note.

Effectivement, le chiffre plus l'altération ne tiennent pas dans une tête de note ! 

Donc tu sacrifies l'altération classique (absolue) pour une altération relative qui n'a de sens qu'en référence à une tonalité connue et basée sur la seule armure, c'est ça ? 

C'est vrai pour les pianistes par exemple, mais pas pour les guitaristes, car on peut appliquer le même doigté pour une gamme en do ou en ré♭, c'est là que ça prend tout son sens…

Comment fais-tu, par exemple, avec les modes mineurs pour déterminer si harmoniques ou mélodiques ?

Dans les faits, aucun système ne spécifie que nous sommes dans un mode harmonique ou mélodique... Que l'on soit en do majeur, en la mineur, en la mineur harmonique ou mélodique, nous avons bien la même armure. C'est le musicien qui l'interprète en fonction des notes dans la partition.

Je ne comprends pas ! Les altérations ne sont-elles pas déjà une forme de markup ou stencil ?

Le lundi 20 mars 2023 à 09:32:07 UTC+1, Vincent Gay <[email-masked]> a écrit :

---

From: Vincent Gay <[email-masked]>
Date: Mon, 20 Mar 2023 10:24:19 +0100 (GMT+01:00)

> Je ne comprends pas ! Les altérations ne sont-elles pas déjà une forme de markup ou stencil ?
Je veux dire au dessus de la porté, en plus de l'altération classique

---

From: Ya Gloops <[email-masked]>
Date: Mon, 20 Mar 2023 09:27:09 +0000 (UTC)

Je vois ! Il me semble que c'est une source d'ambiguïté et de ralentissement de lecture...

Le lundi 20 mars 2023 à 10:24:22 UTC+1, Vincent Gay <[email-masked]> a écrit :

---

From: Jean Abou Samra <[email-masked]>
Date: Mon, 20 Mar 2023 12:11:42 +0100

Pour le code, quelque chose comme ça devrait le faire :

```
\version "2.24.1"

#(define (Relative_alterations_engraver context)
   (let ((note-events '()))
     (make-engraver
      (listeners
       ((note-event engraver event)
        (set! note-events (cons event note-events))))
      ((pre-process-music engraver)
       (let ((tonic (ly:context-property context 'tonic)))
         (for-each
          (lambda (ev)
            (let* ((pitch (ly:event-property ev 'pitch))
                   (octave (ly:pitch-octave pitch))
                   (notename (ly:pitch-notename pitch))
                   (rel-pitch (ly:pitch-diff pitch tonic))
                   (rel-alt (ly:pitch-alteration rel-pitch)))
              (ly:event-set-property!
               ev 'pitch
               (ly:make-pitch octave notename rel-alt))))
          note-events)
         (set! note-events '()))))))

\layout {
  ragged-right = ##t
  \context {
    \Voice
    \consists \Ez_numbers_engraver
    \consists \Relative_alterations_engraver
  }
}

  g f
  f b
}
```

---

From: Ya Gloops <[email-masked]>
Date: Mon, 20 Mar 2023 14:13:58 +0000 (UTC)

C'est grandiose Jean !!!!
 
Pour que ce soit parfait, si je pouvais me permettre, ce serait d'enlever les bécarres "inutiles".
C'est-à-dire les ♮3 ♮6 et ♮7 de la première mesure.
Et, c'est là que ça va être compliqué, garder le bécarre légitime du ♮7 de la deuxième mesure…
Jean, tu as tout à fait le droit aussi de me dire, tu m'embêtes avec tes altérations ;-), car c'est déjà énorme !

\relative c'' {
  \easyHeadsOn
  \key a \major
  a b cis d e fis gis a  g gis a2
}

Le lundi 20 mars 2023 à 12:11:48 UTC+1, Jean Abou Samra <[email-masked]> a écrit : 

\layout {
  ragged-right = ##t
  \context {
    \Voice

---

From: Ya Gloops <[email-masked]>
Date: Mon, 20 Mar 2023 19:50:19 +0000 (UTC)

Mince ça ne fonctionne pas avec les doubles dièses et doubles bémols !
Voici une transposition en fa♯ et sol♭ pour illustrer...

 \relative c' {
  \easyHeadsOn
  \key c \major
 c d e f gis as b c  
}

\relative c' {
  \easyHeadsOn
  \key fis \major
 fis gis ais b cisis d eis fis  
}

\relative c' {
  \easyHeadsOn
  \key ges \major
 ges' as bes ces d eses f ges   
}

Le lundi 20 mars 2023 à 15:13:58 UTC+1, Ya Gloops <[email-masked]> a écrit : 

\relative c'' {
  \easyHeadsOn
  \key a \major

\layout {
  ragged-right = ##t
  \context {
    \Voice

---

From: Jean Abou Samra <[email-masked]>
Date: Mon, 20 Mar 2023 21:47:38 +0100

> Voici une transposition en fa♯ et sol♭ pour illustrer...

Ça fonctionne... dans une certaine logique : le do double dièse dans la tonalité de fa dièse majeur est un demi-ton au-dessus de la quinte de fa dièse (do dièse), donc reçoit, selon ton système, un dièse, or il y a déjà un dièse à la clé…

Si j'ai bien compris ce message et le précédent, tu veux en fait que l'armure n'ait absolument aucune influence sur les altérations qui sont imprimées au milieu de la portée. Dans ce cas, essaie ce code :

```
\version "2.24.1"

fakeKey =
#(define-music-function (pitch mode) (ly:pitch? number-pair-list?)
   #{
     \key #pitch #mode
     \context Staff \applyContext
       #(lambda (context)
          (ly:context-set-property! context 'keyAlterations '()))
   #})

\layout {
  ragged-right = ##t
  \context {
    \Voice

 \relative c' {
  \easyHeadsOn
  \fakeKey c \major
 c d e f gis as b c  
}

\relative c' {
  \easyHeadsOn
  \fakeKey fis \major

\relative c' {
  \easyHeadsOn
  \fakeKey ges \major

Cordialement,

Jean

---

From: Ya Gloops <[email-masked]>
Date: Mon, 20 Mar 2023 23:48:38 +0000 (UTC)

C'est exactement ça !, c'est génial… Bravo Jean
Pour une question pratique, y a-t-il un moyen, en gardant exactement ce résultat, d'éviter d'avoir à modifier \key ?

C'est-à-dire appliquer le context automatiquement ...
J'ai essayé ça mais ça plante 

key =

\relative c' {
  \easyHeadsOn
  \key fis \major
  fis gis ais b cisis d eis fis  e eis fis
}

Le lundi 20 mars 2023 à 21:47:44 UTC+1, Jean Abou Samra <[email-masked]> a écrit : 

fakeKey =

\layout {
  ragged-right = ##t
  \context {
    \Voice

\relative c' {
  \easyHeadsOn
  \fakeKey c \major
c d e f gis as b c  
}

\relative c' {
  \easyHeadsOn
  \fakeKey fis \major

\relative c' {
  \easyHeadsOn
  \fakeKey ges \major

Cordialement,

Jean

---

From: Jean Abou Samra <[email-masked]>
Date: Tue, 21 Mar 2023 09:10:57 +0100

>   fis gis ais b cisis d eis fis  e eis fis  

Normal : comme tu redéfinis la fonction `\key`, le `\key` qui se trouve à l'intérieur n'est pas un appel à la fonction `\key` de LilyPond mais à la nouvelle fonction. Donc cette fonction s'appelle elle-même, à l'infini, ou plus exactement jusqu'à ce que l'espace alloué à la « pile d'appels » (là où la liste des fonctions qui sont en train d'être exécutées est stockée, de manière simplifiée) soit épuisé et que crash s'ensuive. Si tu veux le faire de cette manière, il faut d'abord mettre la fonction `\key` de LilyPond dans une variable, avec `keyDefault = \key \etc` ou `keyDefault = #key`, puis utiliser `\defaultKey` dans la fonction. Cela dit, en fait on peut s'en passer :

```
\version "2.24.1"

#(define (No_key_alterations_engraver context)
   (make-engraver
    ((pre-process-music engraver)
     (ly:context-set-property! context 'keyAlterations '()))))

\layout {
  ragged-right = ##t
  \context {
    \Voice
    \consists \Ez_numbers_engraver
    \consists \Relative_alterations_engraver
  }
  \context {
    \Staff
    \consists \No_key_alterations_engraver
  }
}

 \relative c' {
  \easyHeadsOn
  \key c \major
 c d e f gis as b c  
}

\relative c' {
  \easyHeadsOn
  \key fis \major

\relative c' {
  \easyHeadsOn
  \key ges \major

Cordialement,

Jean

---

From: Ya Gloops <[email-masked]>
Date: Tue, 21 Mar 2023 08:46:25 +0000 (UTC)

Magnifique Jean !!!
Toute ma gratitude…
Gilles

Le mardi 21 mars 2023 à 09:11:04 UTC+1, Jean Abou Samra <[email-masked]> a écrit : 

>   fis gis ais b cisis d eis fis  e eis fis

Normal : comme tu redéfinis la fonction \key, le \key qui se trouve à l'intérieur n'est pas un appel à la fonction \key de LilyPond mais à la nouvelle fonction. Donc cette fonction s'appelle elle-même, à l'infini, ou plus exactement jusqu'à ce que l'espace alloué à la « pile d'appels » (là où la liste des fonctions qui sont en train d'être exécutées est stockée, de manière simplifiée) soit épuisé et que crash s'ensuive. Si tu veux le faire de cette manière, il faut d'abord mettre la fonction \key de LilyPond dans une variable, avec keyDefault = \key \etc ou keyDefault = #key, puis utiliser \defaultKey dans la fonction. Cela dit, en fait on peut s'en passer :
\version "2.24.1"

\layout {
  ragged-right = ##t
  \context {
    \Voice

\relative c' {
  \easyHeadsOn
  \key c \major
c d e f gis as b c  
}

\relative c' {
  \easyHeadsOn
  \key fis \major

\relative c' {
  \easyHeadsOn
  \key ges \major

Cordialement,

Jean

---

From: Ya Gloops <[email-masked]>
Date: Wed, 22 Mar 2023 08:14:23 +0000 (UTC)

Bonjour Jean!
Je ne sais pas si tu connais le sinppet color_interval_engraver? Je l'utilse régulièrement, malheureusement il n'est visiblement pas compatible avec Relative_alterations_engraver, ce qui, je suppose est normal. Sais-tu si il y a moyen d'adapter l'un ou l'autre ?

#(define intervaldefs
   '(("1++" . (0 . 1))
     ("1" . (0 . 0))
     ("2-" . (1 . 1))
     ("2--" . (1 . 0))
     ("2+" . (1 . 2))
     ("2++" . (1 . 3))
     ("3-" . (2 . 3))
     ("3--" . (2 . 2))
     ("3+" . (2 . 4))
     ("3++" . (2 . 5))
     ("4--" . (3 . 4))
     ("4++" . (3 . 6))
     ("4" . (3 . 5))
     ("5--" . (4 . 6))
     ("5++" . (4 . 8))
     ("5" . (4 . 7))
     ("6-" . (5 . 8))
     ("6--" . (5 . 7))
     ("6+" . (5 . 9))
     ("6++" . (5 . 10))
     ("7-" . (6 . 10))
     ("7--" . (6 . 9))
     ("7+" . (6 . 11))
     ("7++" . (6 . 12))
     ("8--" . (7 . 11))
     ("8++" . (7 . 13))
     ("8" . (7 . 12))
     ("9-" . (8 . 13))
     ("9--" . (8 . 12))
     ("9+" . (8 . 14))
     ("9++" . (8 . 15))
     ("10-" . (9 . 15))
     ("10--" . (9 . 14))
     ("10+" . (9 . 16))
     ("10++" . (9 . 17))
     ("11--" . (10 . 16))
     ("11++" . (10 . 18))
     ("11" . (10 . 17))
     ("12--" . (11 . 18))
     ("12" . (11 . 19))))

color_interval_engraver =
#(define-scheme-function (interval-defs debug? intervals-given)
   (list? (boolean?) list?) ;; debug? is optional, defaults to #f

   (let* ((msg-header "Color_interval_engraver:")
          ;; 2.18.2 does not accept an empty list as engraver, unlike 2.19.x
          (empty-engraver
           (make-engraver ((initialize translator) '())))
          (type-check-interval
           (lambda (interval)
             ;; basic check for amount of args
             (if (not (= 4 (length interval)))
                 (begin
                  (ly:warning
                   "~a Interval ~a must have 4 entries" msg-header interval)
                  #f)
                 ;; check every entry for type, additionally the first entry
                 ;; whether it's a key in intervaldefs
                 (let ((name (car interval))
                       (dir (second interval))
                       (enh? (third interval))
                       (color (fourth interval)))
                   (and
                    ;; check first entry for string? and
                    ;; whether it's in intervaldefs
                    (if (and (string? name) (assoc-get name intervaldefs))
                        #t
                        (begin
                         (ly:warning
                          "~a In interval ~a, ~a not found in interval definitions"
                          msg-header
                          interval
                          (car interval))
                         #f))
                    ;; check second entry for ly:dir?
                    ;; As opposed to the normal meaning of 0 (=CENTER),
                    ;; 0 means up >and< down here
                    (if (ly:dir? dir)
                        #t
                        (begin
                         (ly:warning
                          "~a In interval ~a, wrong type argument: ~a, needs to be a direction."
                          msg-header
                          interval
                          dir)
                         #f))
                    ;; check third entry for boolean?
                    (if (boolean? enh?)
                        #t
                        (begin
                         (ly:warning
                          "~a In interval ~a, wrong type argument: ~a, needs to be a boolean."
                          msg-header
                          interval
                          enh?)
                         #f))
                    ;; check fourth entry for color?
                    (if (color? color)
                        #t
                        (begin
                         (ly:warning
                          "~a In interval ~a, wrong type argument: ~a, needs to be a color."
                          msg-header
                          interval
                          color)
                         #f)))))))
          (cleaned-intervals-given
           (filter type-check-interval intervals-given))
          (search-intervals
           (map
            (lambda (interval)
              (let ((diatonic-semitonic-pair
                     (assoc-get (car interval) interval-defs)))
                (cons diatonic-semitonic-pair (cdr interval))))
            cleaned-intervals-given)))

     (if debug?
         (begin
          (ly:message "~a Preprocessed intervals:\n" msg-header)
          (for-each
           (lambda (search-interval)
             (format (current-error-port)
               "Distances (DT/ST):~a, direction:~a, enharmonic:~a, color:~a\n"
               (car search-interval)
               (second search-interval)
               (third search-interval)
               (fourth search-interval)))
           search-intervals)))

     (if (null? search-intervals)
         (begin
          (ly:warning
           "~a No valid interval found. Returning empty engraver" msg-header)
          empty-engraver)
         ;; Instantiate actual engraver
         (color-interval-engraver-core search-intervals debug?))))

#(define (color-interval-engraver-core search-intervals debug?)
   (lambda (context)
     ;; Context type: Staff, Voice, etc.
     ;; Context id: arbitrary string
     ;; \new <context-type> = <context-id> \music
     ;; \new Voice = "soprano" \music
     (let ((engraver-name "Color_interval_engraver")
           (context-type (ly:context-name context))
           (context-id (let ((id (ly:context-id context)))
                         (if (string-null? id)
                             "N/A"
                             id)))
           ;; Later we want to extract the current bar number from there
           (score-context (ly:context-find context 'Score))
           (noteheads-to-process '())
           (ready-to-process? #f)
           (last-noteheads-color #f)
           (last-interval #f))
       (make-engraver
        ((initialize translator)
         ;; Output a warning if the engraver has been added to a Staff context
         ;; If the Staff consists of more than one Voice, the engraver cannot
         ;; distinguish the different voices and will mix them up
         (if (eq? context-type 'Staff)
             (ly:warning
              (string-append
               "Adding color_interval_engraver to a Staff context may lead "
               "to unexpected results if the Staff contains more than one "
               "voice."))))
        ;; This engraver does not listen to events, thus it does not
        ;; define listeners. It does only acknowledge grobs,
        ;; specifically note heads created by other engravers.
        (acknowledgers
         ((note-head-interface engraver grob source-engraver)
          (if ready-to-process?
              ;; if we have two note heads already, push the old one out
              (set! noteheads-to-process (list grob (car noteheads-to-process)))
              ;; We need two note heads to compare the underlying pitches
              ;; -> store note heads until we have two
              (begin
               (set! noteheads-to-process (cons grob noteheads-to-process))
               (if (= (length noteheads-to-process) 2)
                   (set! ready-to-process? #t))))

          ;; Check for grobs in the queue, before continuing
          (if ready-to-process?
              ;; Note head grobs store a reference to the
              ;; event that caused their generation
              ;; Thus we can extract the pitch
              (let* ((current-bar-number
                      (ly:context-property score-context 'currentBarNumber))
                     (current-moment (ly:context-current-moment context))
                     (grob-causes (map (lambda (grob)
                                         (ly:grob-property grob 'cause))
                                    noteheads-to-process))
                     (pitches (map (lambda (cause)
                                     (ly:event-property cause 'pitch))
                                grob-causes))
                     ;; Calculate interval distances, diatonic and semitonic
                     (current-interval-dist-diatonic
                      (apply - (map ly:pitch-steps pitches)))
                     (current-interval-dist-semitonic
                      (apply - (map ly:pitch-semitones pitches)))
                     ;; Check if a given interval matches the current interval
                     (interval-match?
                      (lambda (search-interval)
                        (let* ((search-interval-dist (car search-interval))
                               (search-interval-dir (second search-interval))
                               (search-interval-enh? (third search-interval))
                               (search-interval-dist-diatonic
                                (car search-interval-dist))
                               (search-interval-dist-semitonic
                                (cdr search-interval-dist)))
                          ;; if search-interval-enh? was set to true for
                          ;; the current interval, compare only the semitonic
                          ;; distances, e.g. c#-f would also match a major 3rd,
                          ;; not only a diminished 4th
                          ;;
                          ;; search-interval-dir can only be -1, 0, 1
                          ;; other values are excluded by typechecking,
                          ;; thus 0 needs special casing,
                          ;; for other cases multiplying relevant value with
                          ;; search-interval-dir is enough
                          ;;   -- harm
                          (if (zero? search-interval-dir)
                              (and
                               ;; if direction does not matter, compare
                               ;; with absolute values
                               (= search-interval-dist-semitonic
                                  (abs current-interval-dist-semitonic))
                               (if (not search-interval-enh?)
                                   (= search-interval-dist-diatonic
                                      (abs current-interval-dist-diatonic))
                                   #t))
                              (and
                               (= search-interval-dist-semitonic
                                  (* search-interval-dir
                                    current-interval-dist-semitonic))
                               (if (not search-interval-enh?)
                                   (= search-interval-dist-diatonic
                                      (* search-interval-dir
                                        current-interval-dist-diatonic))
                                   #t))))))
                     ;; Get first occurrence of a matching interval
                     (matching-interval (find interval-match? search-intervals))
                     ;; Extract color from matching interval
                     (search-interval-color (if matching-interval
                                                (fourth matching-interval)
                                                #f)))

                (if debug?
                    (let* ((cep (current-error-port)))
                      (format cep
                        "\n*** This is ~a from ~a ~a ***\n"
                        engraver-name context-type context-id)
                      (format cep "\nBar number ~a, moment ~a\n"
                        current-bar-number current-moment)
                      (format cep "\nPitches (last/current): ~a/~a\n"
                        (second pitches)
                        (first pitches))
                      (format cep "\nDistance (diatonic/semitonic): ~a/~a\n"
                        current-interval-dist-diatonic
                        current-interval-dist-semitonic)
                      (if matching-interval
                          (begin
                           (format cep "\nMatch! Found interval ~a, coloring ~a\n"
                             matching-interval search-interval-color)
                           (if last-noteheads-color
                               (format cep
                                 "\nRecoloring - Last note heads color: ~a\n"
                                 last-noteheads-color))))
                      (display "\n---------------------\n" cep)))

                (if search-interval-color
                    (begin
                     ;; Check if the note heads directly preceding were
                     ;; colored, too. If true, the last note head belongs
                     ;; to two distinct intervals
                     ;;
                     ;; <noteheads-to-process>
                     ;; (grobB grobA)
                     ;; interval grobB<->grobA matches -> color!
                     ;; (grobB_colored grobA_colored)
                     ;; <next iteration>
                     ;; (grobC grobB_colored)
                     ;; interval grobC<->grobB matches -> color!
                     ;; (grobC_colored grobB_colored_colored (!))
                     ;; -> information about interval grobA<->grobB gets lost
                     ;; In this case, print a warning
                     (if last-noteheads-color
                         (ly:warning
                          (string-append
                           "~a: Recoloring note head in ~a ~a, bar number ~a\n"
                           "~a belongs to intervals ~a and ~a")
                          engraver-name
                          context-type
                          context-id
                          current-bar-number
                          (second pitches)
                          last-interval
                          matching-interval))
                     ;; Color current and last note head grob
                     (for-each
                      (lambda (grob)
                        (ly:grob-set-property!
                         grob
                         'color
                         search-interval-color))
                      noteheads-to-process)))
                ;; Preserve the current color (if any) for recoloring check
                ;; (see above)
                (set! last-noteheads-color search-interval-color)
                (set! last-interval matching-interval)))))))))

\score {
  \new Voice
  \relative c'' 
  {\key as \major
   c des es fes
  }
  \layout {
    \context {
      \Voice
   
      \consists \color_interval_engraver #intervaldefs
      #`(("2-" ,UP #f ,red)) 
      %\consists \Relative_alterations_engraver
    }
    \context {
      \Staff
      %\consists \No_key_alterations_engraver
    }
  }
}

Le mardi 21 mars 2023 à 09:46:25 UTC+1, Ya Gloops <[email-masked]> a écrit : 

Magnifique Jean !!!
Toute ma gratitude…
Gilles

\layout {
  ragged-right = ##t
  \context {
    \Voice

\relative c' {
  \easyHeadsOn
  \key c \major
c d e f gis as b c  
}

\relative c' {
  \easyHeadsOn
  \key fis \major

\relative c' {
  \easyHeadsOn
  \key ges \major

Cordialement,

Jean