Subject: doigté d'extension

From: David <[email-masked]>
Date: Sun, 14 Jun 2020 14:52:37 +0200

Bonjour,

Est-ce qu'il y a un moyen d'écrire (facilement ?) un doigté d'extension 
pour un instrument à corde ?
au hasard, pour un violoncelle :)

je m'explique :
sur la première note, un doigté ( par exemple : mi-1 )
sur la deuxième note, un doigté avec extesion ( par exemple : fa#-2 au 
lieu du 3ème doigt habituel)
entre les deux (pile au milieu ?) un "x" qui indique qu'il faut faire 
une extension, de la même taille et dans la même police que les doigtés

D'avance merci,
David

---

From: Valentin Villenave <[email-masked]>
Date: Sun, 14 Jun 2020 19:23:50 +0200

> au hasard, pour un violoncelle :)

C’est amusant, cette question a été posée à plusieurs reprises sur la
liste internationale (la dernière fois il y a quelques heures à
peine).  Voici une réponse parmi d’autres :
https://lists.gnu.org/archive/html/lilypond-user/2020-04/msg00061.html

V.

---

From: Valentin Villenave <[email-masked]>
Date: Sun, 14 Jun 2020 19:24:38 +0200

On 6/14/20, Valentin Villenave <[email-masked]> wrote:
> Voici une réponse parmi d’autres :

Et aussi : http://lsr.di.unimi.it/LSR/Item?id=999

V.

---

From: david <[email-masked]>
Date: Sun, 14 Jun 2020 20:50:42 +0200

Merci pour les pistes

Ce n'est pas exactement ce que je recherche (il me faut la lettre de 
l'alphabet "x" entre 2 notes consécutives) mais je vais regarder si je 
trouve un moyen d'adapter ce code à mon cas précis (je vais essayer de 
chercher tout seul)
Si je ne trouve pas comment faire, je re-poserai la question ici :)

---

From: Valentin Villenave <[email-masked]>
Date: Sun, 14 Jun 2020 22:47:52 +0200

> trouve un moyen d'adapter ce code à mon cas précis (je vais essayer de

Ah mais bien sûr, si vous n’avez pas besoin d’une ligne en pointillés
la question devient _nettement_ plus simple :

%%%%

extension =
#(define-music-function (m1 m2) (ly:music? ly:music?)
   (let ((p1 (ly:music-property m1 'pitch))
         (p2 (ly:music-property m2 'pitch))
         (m1-clone (ly:music-deep-copy m1)))
     (ly:music-set-property! m1-clone 'articulations '())
   #{
     \scaleDurations 1/2 {
       $m1
       \once \textLengthOn
       \once \hideNotes
       $m1-clone ^\markup \bold "×"
     }
     $m2
   #}))

{
  \clef bass
  \extension e'2-3 fis'4-4
}

%%%%

V.

---

From: david <[email-masked]>
Date: Mon, 15 Jun 2020 08:41:58 +0200

Bon bin j'avais pas trouvé ^^'

Merci beaucoup pour le coup de main, c'était en effet très simple...

---

From: Valentin Villenave <[email-masked]>
Date: Mon, 15 Jun 2020 09:48:45 +0200

> Merci beaucoup pour le coup de main, c'était en effet très simple...

Euh, ça oblige quand même à écrire une fonction en Scheme sur-mesure.
Est-il courant dans des partitions de violoncelle de mettre le × sans
ligne en pointillés ? Auquel cas je mettrai une copie de mon exemple
sur le LSR.

V.

---

From: Pierre Perol-Schneider <[email-masked]>
Date: Mon, 15 Jun 2020 09:59:35 +0200

Je pense que David fait de l'autodérision, elle est très chic cette
fonction, bravo Valentin !
Et elle mérite d'être sur la LSR ne serait-ce que comme exemple scheme. ;)
Amicalement,
Pierre

Le lun. 15 juin 2020 à 09:49, Valentin Villenave <[email-masked]> a

---

From: david <[email-masked]>
Date: Mon, 15 Jun 2020 11:55:43 +0200

> Je pense que David fait de l'autodérision, elle est très chic cette fonction, bravo Valentin ! 

@Pierre : Oui bien sûr c'est de l'autodérision 
Je suis surtout vexé de ne pas encore savoir programmer en scheme
Il me semble qu'il était prévu une initiation au prochain café-lily ?

> ligne en pointillés ? Auquel cas je mettrai une copie de mon exemple

@valentin :
J'ai toujours vu tous mes profs de violoncelle écrire les extensions
avec un "x" entre les 2 notes
visuellement, quand tu lis les doigtés, tu vois " 1   x   2 " tu sais
qu'il faut faire une extension
(dans les règles de l'art, c'est toujours entre le 1er doigt et le
deuxième, mais il paraît que navarra n'était pas d'accord)
Et dans mes souvenirs, il me semble que sur mes méthodes d'étude c'était
aussi une convention

En cherchant sur internet des exemples visuels pour poser ma question
sur la liste je n'ai rien trouvé.
Il paraîtrait que c'est une convention qui n'est pas admise par tout le
monde... mais tout le monde l'utilise dans mes connaissances ... 

Je ne vois pas de quoi tu parles quand tu dis des "× sans ligne en
pointillés " il y a des x avec lignes en pointillés ? 

David

---

From: Valentin Villenave <[email-masked]>
Date: Mon, 15 Jun 2020 13:31:57 +0200

> Il me semble qu'il était prévu une initiation au prochain café-lily ?

Oui, si l’un d’entre nous se dévoue pour l’organiser… (je ne me rends
pas compte de la quantité de travail que cela requiert).
Cette petite fonction serait d’ailleurs un bon exemple pour ce genre d’occasion.

> pointillés " il y a des x avec lignes en pointillés ?

Pas forcément en pointillés, mais des genres de glissandos ou de
liaisons entre les doigtés (cf les liens que j’ai postés précédemment)
:
https://lists.gnu.org/archive/html/lilypond-user/2020-06/jpg8W2H0P7ZUK.jpg

Bon en attendant j’ai mis sur le LSR une version un peu plus complète
de ma fonction :
http://lsr.di.unimi.it/LSR/Item?id=1115

V.

---

From: david <[email-masked]>
Date: Mon, 15 Jun 2020 21:28:29 +0200

Alors quand je teste ça marche à tous les coups, et quand je mets mets 
les notes dont j'ai besoin ça me fait un saut d'octave
(voir pdf joint)
est-ce que ça le fait aussi chez vous ?

---------------------------------------------------------

\version "2.20.0"
\language "français"

extension =

% il y a un saut d'octave non désiré :
\relative do { \clef bass
   \extension  sib'2-1 dod4-3( ré) |
   \bar "|." }

% sans l'extension tout est ok
\relative do { \clef bass
   %{ \extension %} sib'2-1 dod4-3( ré) |
   \bar "|." }

----------------------------------------------------------------

---

From: david <[email-masked]>
Date: Mon, 15 Jun 2020 22:14:15 +0200

ah, je crois que j'ai compris !
c'est le midi qui m'a mis la puce à l'oreille :

voilà comment je traduirais le programme :
on définit 2 notes m1 et m2
on clone m1
on attribue virtuellement une demi-durée à m1 et son clone
on écrit m1
on cache le clone et on écrit "x" en gras, au dessus
on écrit m2

(enfin je dis on, j'y suis pas pour grand chose...)

du coup, dans le midi, on entend m1 et son clone avec chacun une 
demi-durée de m1

mon problème viendrait donc du fait que j'ai écrit sib' donc le clone 
prend aussi une octave et donc le do arrive une octave trop haut ?

j'ai 2 cas comme ça dans la partition... je peux régler celui en début 
de partition en rajoutant une octave au \relative do

pour l'autre cas, en cours de morceau, il suffirait que j'arrête la 
notation \relative juste avant l'extension, que je repasse en notation 
absolue puis que je repasse en  \relative juste après ?

---

From: Valentin Villenave <[email-masked]>
Date: Mon, 15 Jun 2020 22:51:59 +0200

> on cache le clone et on écrit "x" en gras, au dessus

Exactement.

> du coup, dans le midi, on entend m1 et son clone avec chacun une

Ah oui, je n’ai pas pensé au midi.

> prend aussi une octave et donc le do arrive une octave trop haut ?

Bien vu ! Je n’avais pas du tout pensé au \relative.

Voici une version corrigée (mais qui ne marchera qu’à partir de la
version 2.20) : j’enlève tout bêtement le pitch du m-clone, puisque
depuis les versions récentes de LilyPond on peut simplement entrer une
duration sans pitch pour répéter la note précédente.

Au passage, j’avais laissé des déchets dans la version précédente (je
voulais utiliser la note 1 et la note 2 pour calculer une position
intermédiaire entre le pitch de l’une et de l’autre, mais finalement
j’ai renoncé parce que ça mettait le bazar dans les altérations
accidentelles).

%%%%%

extend =
#(define-music-function (m) (ly:music?)
   (let* ((m-clone (ly:music-deep-copy m))
          (x-markup (markup #:normal-text #:fontsize 5 #:bold "×"))
          (x-fingering (make-music 'FingeringEvent 'text x-markup))
          (change-fingering
           (lambda (m)
             (or (null? (ly:music-property m 'articulations))
                 (ly:music-set-property! m 'articulations
                                         (list x-fingering)))
             (or (null? (ly:music-property m 'pitch))
                 (ly:music-set-property! m 'pitch '()))))
          (m-elements (ly:music-property m-clone 'elements)))
     (if (null? m-elements)
         (change-fingering m-clone)
         (map change-fingering m-elements))
     (ly:music-compress
      #{
        $m \once \textLengthOn \once \hideNotes $m-clone
      #}
      (ly:make-moment 1 2))))

\language "français"

\relative do { \clef bass
  \extend  sib'2-1 dod4-3( ré) |
  \bar "|." }

%%%%

Et un autre petit détail qui me fait bêtement plaisir -- plus de
quatre ans après ceci :
https://git.savannah.gnu.org/cgit/lilypond.git/commit/?id=e45059ae37b240ce52639ad5c49110b510a89481
… c’est la _toute première fois_ à ma connaissance que quelqu’un poste
sur cette liste un exemple incluant la note "ré" avec un accent aigu
:-)

V.

---

From: david <[email-masked]>
Date: Mon, 15 Jun 2020 23:46:49 +0200

Super ! il n'y a plus de problème avec les octaves, merci !
(j'ai la v2.20 donc tout va bien)

un dernier petit détail :
si m1 est une croche, on voit qu'il y a une note virtuelle entre m1 et 
m2

par exemple :

%%%%%%%

\version "2.20.0"
\language "français"

extension =
\relative do'

{ \clef bass sib4.-2 \extension do8-4 ré2-1 }

%%%%%%%

j'aime bien écrire en français :)
J'utilisais italiano depuis mes débuts, par ignorance
mais j'étais gêné, dans une partition pédagogique d'écrire "re" dans la 
partition et "ré" dans les paroles

italiano c'était plus facile pour moi pour me chanter les notes dans la 
tête lors de la saisie/correction
c'est sur cette liste que quelqu'un a dit un jour que le français était 
disponible, donc j'ai essayé ... et adopté
il fallait que je fasse attention au début mais maintenant c'est bon 
(j'ai eu du mal avec le ré' j'avais l'impression de rajouter une 
deuxième octave)
sur la liste, comme j'ai vu que tout le monde écrivait avec des lettres, 
je fais un effort pour transformer mes exemples pour simplifier la tâche 
des contributeurs... et là je n'ai pas fait attention :)

David

---

From: Pierre Perol-Schneider <[email-masked]>
Date: Tue, 16 Jun 2020 08:42:59 +0200

Bonjour David,

Le lun. 15 juin 2020 à 23:47, david <[email-masked]> a écrit :
...

> si m1 est une croche, on voit qu'il y a une note virtuelle entre m1 et
...

Pourquoi pas simplement un \noBeam...
Ex. :

\version "2.20.0"
\language "français"

extension =
         $m \once \textLengthOn \once \hideNotes $m-clone \noBeam
       #}
       (ly:make-moment 1 2))))

\relative do' { \clef bass sib4.-2 \extension do8-4 ré2-1 }
%%%

(Quant au mode relatif... Hummmmm)

Cordialement
Pierre

---

From: david <[email-masked]>
Date: Tue, 16 Jun 2020 09:01:28 +0200

Bien vu ! merci ! 

Et je n'ai plus de question, tout est bon pour moi ! 

(et grâce au mode relatif, je sais enfin différencier une quarte d'une
quinte ... )

---

From: Jean Abou Samra <[email-masked]>
Date: Wed, 17 Jun 2020 15:17:50 +0200

Bonjour,

> Il me semble qu'il était prévu une initiation au prochain café-lily ?
En attendant le prochain Café Lily avec peut-être une présentation
de Scheme, la meilleure ressource à l'heure actuelle pour apprendre
ce langage dans le contexte de LilyPond est
https://scheme-book.ursliska.de/introduction/index.html
(en anglais).

Cordialement,
Jean Abou Samra

---

From: david <[email-masked]>
Date: Wed, 17 Jun 2020 15:22:19 +0200

Merci pour le lien ! 

Je me suis rendu compte qu'il y a 20 ans j'arrivais à me débrouiller
pour comprendre l'anglais informatique, autant maintenant c'est de plus
en plus compliqué... je ne m'attendais pas à cet effet de l'âge :( 

Cordialement,
Jean Abou Samra

---

From: david <[email-masked]>
Date: Wed, 17 Jun 2020 15:34:10 +0200

pour info : 

Je viens de me rendre compte qu'avec ce nouveau code, le problème d'une
croche suivie d'une noire est effectivement résolu, mais ça fait
apparaître un nouveau problème : quand il y a deux croches de suite,
elles perdent leur ligature traditionnelle 

donc j'ai adopté une solution mixte : 

j'utilise à la fois le \extend de valentin et l'\extension que tu
proposes.
en utilisant judicieusement les deux, ma partition est conforme à mes
exigences :) 

David

---

From: Valentin Villenave <[email-masked]>
Date: Wed, 17 Jun 2020 21:15:49 +0200

> elles perdent leur ligature traditionnelle

On peut y remédier… (Là ça commence à devenir du gros bidouillage, à
partir d’un certain stade il deviendra carrément plus propre de
reprendre le code de Harm et de faire un Scheme engraver.)

%%%%

extend =
#(define-music-function (parser location m) (ly:music?)
   (let* ((x-markup (markup #:normal-text #:fontsize 5 #:bold "�"))
          (x-fingering (make-music 'FingeringEvent 'text x-markup))
          (m-note (car (get-tweakable-music m)))
          (n (make-music 'NoteEvent
                         'duration (ly:music-property m-note 'duration)
                         'pitch (ly:music-property m-note 'pitch)
                         'articulations (list x-fingering)))
          (x-id (format "\"~a\"" (+ 100 (random 899)))))
     (or (eq? m m-note)
         (set! n (make-event-chord (list n))))
     #{
       \applyContext #(lambda (ctx)
                        (ly:context-set-property!
                         (ly:context-parent ctx) 'fingeringOrientations
                         (ly:context-property ctx 'fingeringOrientations)))
       \context Voice <<
         $m \new Voice = $x-id \scaleDurations 1/2 {
           \hideNotes \textLengthOn \omit Flag \omit Dots
           \applyContext #(lambda (ctx)
                            (ly:context-set-property!
                             ctx 'fingeringOrientations
                             (ly:context-property
                              (ly:context-parent ctx)
                              'fingeringOrientations)))
           s $n } >> #}))

%%%%

V.

---

From: Jean Abou Samra <[email-masked]>
Date: Wed, 17 Jun 2020 21:16:16 +0200

Bonjour,

Le 17/06/2020 à 15:34, david a écrit :
>
> pour info :
>
> Je viens de me rendre compte qu'avec ce nouveau code, le problème 
> d'une croche suivie d'une noire est effectivement résolu, mais ça fait 
Voilà qui est tout à fait normal puisque l'ajout proposé par Pierre 
consiste précisément à empêcher la note fantôme de recevoir une 
quelconque ligature, ce qui coupe pour ainsi dire la ligature entre la 
note affichée et la suivante.
> en utilisant judicieusement les deux, ma partition est conforme à mes 
Si je puis me permettre d'ajouter mon grain de sel dans cette affaire, 
pourquoi pas une nouvelle voix plutôt que d'insérer le X dans la voix 
d'origine ? Cela permet de conserver les ligatures automatiques, et 
évite que la duplication des hauteurs ne perturbe \relative. C'est le 
genre d'astuce que l'on finit par développer lorsqu'on est mauvais élève 
en Scheme…

\version "2.21.2"
\language français

x = \markup \normal-text \fontsize #2 \bold ×

extension =
#(define-music-function (note) (ly:music?)
   #{
     <<
       {
         $note
       }
       \new Voice \with {
         midiMinimumVolume = 0
         midiMaximumVolume = 0
       } {
         \voiceOne
         %% J'espère n'avoir rien oublié mais si un objet venait à se 
“tripliquer”,
         %% il faudrait simplement l'omettre en l'ajoutant à cette liste.
         \omit Stem
         \omit Beam
         \omit Flag
         \omit Accidental
         \omit Fingering
         % Pour le cas où la note porterait un TextScript, on le supprime.
         % Il faut ensuite rétablir le stencil du x.
         \omit TextScript
         \override NoteHead.stencil = #point-stencil
         \override NoteHead.no-ledgers = ##t
         \scaleDurations 1/2 {
           $note
           $note \tweak TextScript.stencil #ly:text-interface::print ^\x
         }
       }
     >>
   #})

\score {
   \relative do' { \clef bass sib4-2 \extension do8-4 ré8-1 }
   \layout { }
   \midi { }
}

Bien cordialement,
Jean Abou Samra

---

From: Valentin Villenave <[email-masked]>
Date: Thu, 18 Jun 2020 00:52:12 +0200

On 6/17/20, Jean Abou Samra <[email-masked]> wrote:
> d'origine ?

Oui, c’est ce que j’ai essayé de faire dans mon nouveau code.

> #(define-music-function (note) (ly:music?)

Attention, en partant avec << vous créez un nouveau contexte Voice --
du coup vous allez perdre tous les spanners en cours (Beam, Slur etc.)
et toutes les éventuelles modifications (\overrides,
context-properties telles que subdivideBeams, followVoice ou, dans le
cas qui nous occupe, fingeringOrientations.

>          midiMaximumVolume = 0

Bien vu ! Je n’y pense jamais. Il y aurait aussi \remove
Note_performer qui revient au même (à moins que?).

>          \voiceOne

Là aussi vous faites une supposition sur la position dans laquelle va
se trouver la $note.

>          %% il faudrait simplement l'omettre en l'ajoutant à cette liste.

Dots, par exemple. Maintenant, je ne suis pas sûr que virer autant de
trucs soit ce qu’on cherche puisque précisément le but est de
reproduire l’alignement du doigté précédent. Personnellement j’ai viré
ce qui prendrait trop de place _horizontale_ : Flag et Dots.

>          % Pour le cas où la note porterait un TextScript, on le supprime.

Tout ce qui est attaché aux notes se trimballe dans 'articulations.

>            $note \tweak TextScript.stencil #ly:text-interface::print ^\x

Pas mal mais du coup ça ne respectera pas fingeringOrientations…

Ce que j’ai fait, de mon côté, est assez moche mais ça fonctionne
presque : d’abord je m‘insère dans la voix existante (avec \context)
pour garder tout les spanners et \overrides en cours, ensuite je crée
une voix (en lui donnant un identifiant unique pour être sûr qu’il n’y
aura pas d’effet de bord) avec simplement \hideNotes. Là où ça devient
vraiment crapoteux, c’est que pour récupérer l’état de la
context-property 'fingeringOrientations, je commence par la passer au
contexte parent (Staff), même s’il n’est pas fait pour ça (a priori ça
ne devrait pas avoir d’effet sur la suite des voix mais il vaut mieux
ne pas trop se poser la question) ; puis je récupère sa valeur dans ma
nouvelle voix temporaire. Ce n’est pas un modèle ; la solution bien
propre serait de définir un Scheme engraver.

V.

---

From: Pierre Perol-Schneider <[email-masked]>
Date: Thu, 18 Jun 2020 09:19:33 +0200

Ou tout simplement:

\relative do' { \clef bass sib4.-2 \extension do8-4[ 8] ré2-1 }

Cordialement,
Pierre

Le jeu. 18 juin 2020 à 00:54, Valentin Villenave <[email-masked]> a

---

From: Jean Abou Samra <[email-masked]>
Date: Thu, 18 Jun 2020 19:35:21 +0200

Bonjour,

Le 18/06/2020 à 00:52, Valentin Villenave a écrit :
> On 6/17/20, Jean Abou Samra<[email-masked]>  wrote:
Absolument, mais comme nous avons envoyé nos messagesà une minute
d'intervalle, je n'avais pas reçu votre réponse en envoyant la mienne.
Bien sûr, ce que vous proposez est plus malin, donc je me contente
de poser mes questions.
> cas qui nous occupe, fingeringOrientations.

Je ne suis pas certain de comprendre. Dans le \new Voice, c'est sûr
que les propriétés changée au niveau de Voice seront perdues, mais
je ne vois pas le problème que cela poserait, donc vous devez parler
de la voix principale. Mais dans celle-ci, je ne comprends pas ce
qui se produit.

\relative do' {
   \override Voice.NoteHead.color = #red
   \clef bass
   sib4-2(\( \extension { do8-4) } ré8-1\)
}

Dans cet exemple, d'un côté la couleur de NoteHead est bien conservée pour
la note qui fait l'objet de \extension, d'un autre côté, la liaison 
marche mais
LilyPond se fend pourtant d'une plainte « impossible de terminer slur ».
Qu'est-ce qui se passe ?

> Pas mal mais du coup ça ne respectera pas fingeringOrientations…

En effet, j'ai succombé au péché originel de la programmation
qui consiste à ne pas tester tous les cas. Je pensais à tort que
la position du \markup allait s'ajuster correctement mais il aurait
fallu -\x au lieu de ^\x, évidemment. Quoi qu'il en soit, ce n'est
pas configurable.

> propre serait de définir un Scheme engraver.

Si d'aventure vous le faisiez, prévenez-moi : cela me fournira un exemple
pour comprendre enfin les graveurs Scheme !

Bien cordialement,
Jean Abou Samra

---

From: Valentin Villenave <[email-masked]>
Date: Thu, 18 Jun 2020 22:34:36 +0200

> de la voix principale. Mais dans celle-ci, je ne comprends pas ce

Ah non effectivement.  De ce point de vue votre code est équivalent au
mien (je n’avais pas besoin de mettre \context Voice).

> LilyPond se fend pourtant d'une plainte « impossible de terminer slur ».

En copiant $note, vous copiez également toutes les 'articulations
qu’elle se trimballe.  (En l’occurrence une fin de liaison). Ajoutez
#(display-scheme-music note) à peu près n’importe où dans votre
fonction et vous pourrez vous en rendre compte.

> qui consiste à ne pas tester tous les cas.

Bin dans le genre, moi j’ai posté une fonction toute bête en haut du
thread sans même penser que ça risquerait d’être utilisé dans un bloc
\relative…

> pour comprendre enfin les graveurs Scheme !

Moui, dans le cas présent je pense que ça mériterait d’être fait de
façon plus complexe en créant un grob etc. (voir le regtest
multi-measure-rest-reminder.ly). Mais si vous cherchez un exemple bête
et méchant de Scheme engraver, vous pouvez voir celui que j’ai posté
ici dernièrement :
https://lists.gnu.org/archive/html/lilypond-user/2020-05/msg00125.html

(D’ailleurs je me suis fait hier la réflexion que finalement n’importe
quelle fonction lambda dans \applyContext peut être \consist-ée comme
un Scheme translator au niveau du contexte. Mais les vrais engravers
vont un peu au-delà, avec différents hooks possibles correspondants au
différents moments successifs du traitement de la partition, comme
vous le verrez avec les trois regtests scheme-engraver.ly,
scheme-engraver-instance.ly et scheme-text-spanner.ly.)

V.