Subject: [LilyPond] [Général] Création de glyphes

From: Rémy Claverie via LilyPond <[email-masked]>
Date: Sat, 13 Apr 2024 07:05:01 +0000

Bonjour à tous,

Je souhaite me lancer dans la transcription d'une pièce pour viole de gambe. L'objectif n'est pas que musical (car je ne suis pas violiste) mais aussi technique lilypondienne. Je voudrais m'améliorer en programmation de fonctions.
En effet, cette pièce contient de nombreux signes d'articulation/interprétation qui ne sont pas connus de lilypond.
J'ai essayé de trouver dans l'arborescence de LP un fichier où était codé un signe d'articulation (comme 'upprall') pour comprendre, mais je n'ai pas trouvé...
Aussi, l'un de vous aurait-il écrit une fonction (avec define-music-function, peut-être) avec comme propriété/variable, la possibilité de positionner un glyphe à l'endroit voulu et que ce glyphe soit codé dans cette fonction à priori. 
J'imagine qq chose du genre : \tremblement( #'( 0 . 2) ). Le tremblement possède la forme d'une virgule.

L'un de vous pourrait-il éclairer ma lanterne ?
Merci énormément de votre aide et bon WE !

Rémy
PS : On pourrait peut-être organiser un café Lily sur la programmation Scheme/LP en visio ?? Cela pourrait intéresser d'autres utilisateurs.

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/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: Sat, 13 Apr 2024 11:39:32 +0000

Bonjour, 
en 2 parties la fonction glyph et la position (je n'arrive pas à regrouper pour le moment
```
\version "2.24.34"

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#(define-markup-command (glph layout props glyph) (markup?)
  "Entrée de glyph"
  (interpret-markup layout props
   (markup #:musicglyph glyph )
   ))

glph= \tweak layer -1 -\markup\glph \etc 
posGlyh=  \tweak extra-offset \etc 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\fixed c' {
    \time 3/1
    c1 e g ^\glph  "noteheads.s2cross" 
    c1 b c \posGlyh #'(-2.5 . -3)^\glph "flags.mensuralu04"
}
```

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/2).

---

From: Rémy Claverie via LilyPond <[email-masked]>
Date: Sun, 14 Apr 2024 05:52:33 +0000

Merci Martial !
Question subsidiaire : comment faire pour intégrer mes propres glyphes dans ta fonction ?
Merci et bon dimanche
Rémy

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/3).

---

From: Jean Abou Samra via LilyPond <[email-masked]>
Date: Sun, 14 Apr 2024 11:39:41 +0000

[quote="Remy, post:1, topic:5683"]
J'ai essayé de trouver dans l'arborescence de LP un fichier où était codé un signe d'articulation (comme 'upprall') pour comprendre, mais je n'ai pas trouvé...
[/quote]

Ce sont des glyphes qui font partie de la police Emmentaler (les fichiers `emmentaler-<taille>.otf` qui se trouvent quelque part dans l'arborescence). Ils sont codés en METAFONT, un langage créé par Donald Knuth en même temps que TeX, qui lui a servi à créer sa police Computer Modern. Tout ça est dans le dossier [`mf/`](https://gitlab.com/lilypond/lilypond/-/tree/master/mf?ref_type=heads) du code source de LilyPond. Honnêtement, ce n'est pas spécialement lisible, et de tout façon, c'est compilé en amont pour créer ces fichiers de police OpenType (OTF), on ne peut pas s'en servir à l'intérieur de LilyPond.

[quote]
[/quote]

Je pense que le plus simple est de le faire avec [`\markup \path`](https://lilypond.org/doc/v2.24/Documentation/notation/graphic), en définissant `tremblement = \markup \path ...` et en utilisant ensuite `\tremblement` comme un markup normal (par exemple `{ c'^\tremblement }`).

Une autre option, c'est d'éditer le glyphe dans un logiciel comme Inkscape, puis de l'exporter en EPS et de l'inclure avec `\epsfile` (mais tu ne pourras plus compiler le fichier LilyPond en SVG).

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/4).

---

From: Rémy Claverie via LilyPond <[email-masked]>
Date: Mon, 15 Apr 2024 14:52:48 +0000

Encore merci pour vos réponses. J'avance. Tout doucement, mais j'avance.
J'avais une question avant de continuer : si je veux positionner une des marques (comme le tremblement) à gauche de la tête de note, est-ce que 'define-markup-command' est bien adapté ?
Merci !!
Rémy

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/5).

---

From: MartialR via LilyPond <[email-masked]>
Date: Mon, 15 Apr 2024 18:47:30 +0000

Il suffit de positionner où bon vous sembleavec \tweak extre-offset
 dans l'exemple ci-dessous "pos" est juste une astuce pour éviter d'écrire \tweak extra-offset 

```
\version "2.24.3"

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% on crée un markup  pour n'importe quel glyph 
#(define-markup-command (glph layout props glyph) (markup?)
  "Entrée de glyph"
  (interpret-markup layout props
   (markup 
    #:musicglyph glyph )
   ))

%on crée n glyph tramblement  
gTremble= \tweak layer -1 -\markup\glph "flags.mensuralu25" 
% on fait un raccourci de position 
pos=  \tweak extra-offset \etc 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\fixed c' {
    \time 4/4
    g c g \tweak extra-offset #'(-1 . 5)\gTremble^"gauche" c
    e  c \pos #'(-1 . 5) \gTremble^"gauche"
    e  c\pos #'(2 . 5) \gTremble ^"droite"
    e  c\pos #'(1 . 10) \gTremble \pos #'(0 . 16)_"dessus"
}
```
![image|690x183](upload://7GGHj2JxvxUtkRcHP9h62eVy99B.png)

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/6).

---

From: Rémy Claverie via LilyPond <[email-masked]>
Date: Tue, 16 Apr 2024 03:42:23 +0000

Bah non, ca marche pas : "gauche", "droite" et "dessus" ne sont pas à coté des têtes de notes.
Si je défini un nouveau markup avec "define-markup-command", comment puis-je faire dans la fonction suivante pour le posittioner où je veux ?
```
#(define-markup-command (draw-battement layout props points)(number-pair?)
   #:properties (
                  (thickness 0.2)
                  )
   "...Documentation of this beautiful function..."
   ;(let( x0 ( + 0.5 (car points )))) ; Ne fonctionne pas...
   ;(let ( y0 ( + 0.5 (cdr points )))) ; non plus.
   (define (x0) ( + 0.5 (car points)))
   (define (y0)( + 0.5 (cdr points)))
   (interpret-markup layout props
                     (markup 
                      #:path thickness (list 
                                        (list 'moveto (x0) (y0) )
                                        (list 'rcurveto 0 .4 .7 .85 1 1)
                                        (list 'rmoveto -1 0 )
                                        (list 'rcurveto 0 -.4 .7 -.85 1 -1)                                               
                                        ))))
```
Pour l'instant, je suis bloqué, je n'arrive qu'à déplacer ce nouveau markup au dessus de la portée.

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/7).

---

From: MartialR via LilyPond <[email-masked]>
Date: Tue, 16 Apr 2024 16:20:29 +0000

En 2 fois 
le markup avec le  path et  le placement avec extra-offset ; 
(j'ai repris le endBarCurlyPath  du LSR pour l'exemple, )

```
\version "2.24.3"

zig = \markup {
    \with-dimensions #'(0 . 0) #'(0 . 0)
    \override #'(filled . #t) 
    \path #0.09
    #'((moveto   -0.01   -1.95)
       (curveto   0.05   -1.10   0.02  -1.50   0.12   0.00)
       (curveto   0.18    0.80   0.25   1.63   0.38   1.63)
       (curveto   0.51    1.63   0.52   0.80   0.59   0.00)
       (curveto   0.66   -0.90   0.70  -1.54   0.91  -1.54)
       (curveto   1.04   -1.54   1.08  -1.10   1.23   0.00)
       (curveto   1.35    1.00   1.46   1.00   1.49   1.00)
       (curveto   1.57    1.00   1.59   0.69   1.63   0.00)
       (curveto   1.68   -0.70   1.75  -1.08   1.90  -1.08)
       (curveto   2.05   -1.08   2.05  -0.80   2.12  -0.30)
       (curveto   2.20    0.20   2.22   0.43   2.30   0.43)
       (curveto   2.36    0.43   2.37   0.20   2.43   0.00)
       (curveto   2.49   -0.20   2.51  -0.33   2.76  -0.34)
       (curveto   2.96   -0.34   3.20  -0.20   3.25  -0.07)
       (curveto   3.27   -0.01   3.24   0.00   3.23   0.00)
       (curveto   3.15    0.00   3.05  -0.30   2.80  -0.31)
       (curveto   2.67   -0.31   2.64  -0.27   2.55   0.05)
       (curveto   2.46    0.40   2.50   0.48   2.30   0.48)
       (curveto   2.15    0.48   2.10   0.00   2.07  -0.25)
       (curveto   2.00   -0.70   1.98  -1.02   1.92  -1.02)
       (curveto   1.82   -1.02   1.83  -0.60   1.80   0.05)
       (curveto   1.78    0.55   1.74   1.04   1.50   1.04)
       (curveto   1.30    1.04   1.25   0.65   1.16   0.00)
       (curveto   1.02   -1.20   0.96  -1.48   0.91  -1.48)
       (curveto   0.82   -1.48   0.82  -0.70   0.80  -0.25)
       (curveto   0.71    0.90   0.68   1.68   0.40   1.68)
       (curveto   0.15    1.68   0.12   1.00  -0.01  -0.40)
       (closepath))
    }

{ 
c'\tweak extra-offset #'(1.25 . 5) -\markup\zig
}

```

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/8).

---

From: MartialR via LilyPond <[email-masked]>
Date: Tue, 16 Apr 2024 18:39:05 +0000

Une autre solution serai de remplacer les altérations 
par le path de tremblement 

```
zigpath = \markup {

zig =
#(define-music-function (note)(ly:music?)
 #{ \once \override Voice.Accidental.stencil =
          #ly:text-interface::print
        \once \override Voice.Accidental.text =
         \markup\zigpath
        $note #})
        
zig =
#(define-music-function (note)(ly:music?)
 #{ \once \override Voice.Accidental.stencil =
          #ly:text-interface::print
        \once \override Voice.Accidental.text =
         \markup\zigpath
        $note #})
        
\relative c' {
       d \zig bes d \zig gis a b  cis \zig ces
}

```

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/9).

---

From: Rémy Claverie via LilyPond <[email-masked]>
Date: Wed, 17 Apr 2024 06:15:22 +0000

Merci Martial,
En fait, le but est d'appendre et de comprendre la programmation Scheme pour Lilypond, je ne cherche pas à trouver une solution à un pb technique. En l’occurrence, je ne trouve pas comment déplacer le markup en Scheme dans la commande que j'ai donné plus haut.
En tous cas, merci de te pencher sur cette question !

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/10).

---

From: Pierre Perol-Schneider via LilyPond <[email-masked]>
Date: Wed, 17 Apr 2024 06:45:52 +0000

Salut Remy, ça fait longtemps ;) 
Je pense qu'il y a juste un problème de parenthèses dans ton code :
```#(define-markup-command (draw-battement layout props points)
  (number-pair?)
  #:properties ((thickness 0.2))
  "...Documentation of this beautiful function..."
  
  (let ((x0 (+ 0.5 (car points)))
        (y0 (+ 0.5 (cdr points))))
    (interpret-markup layout props
      (markup
        #:path thickness
        (list
          (list 'moveto x0 y0)
          (list 'rcurveto 0 0.4 0.7 0.85 1 1)
          (list 'rmoveto -1 0)
          (list 'rcurveto 0 -0.4 0.7 -0.85 1 -1))))))
```
En revanche perso j'ajouterai une dimension nulle à ton glyphe pour plus de liberté.
Amitiés,
Pierre

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/11).

---

From: Rémy Claverie via LilyPond <[email-masked]>
Date: Wed, 17 Apr 2024 07:15:02 +0000

Merci Pierre !
Il faut que je m'habitue aux () en Scheme !
Pourrais-je abuser et demander de m'aiguiller sur la dimension nulle pour le glyph : à quoi ça sert et comment on la positionne ?
Merci de ton aide !
Amitiés,
Rémy

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/12).

---

From: Pierre Perol-Schneider via LilyPond <[email-masked]>
Date: Wed, 17 Apr 2024 07:32:19 +0000

La dimension nulle permet au glyphe d'éviter de buter sur les figures environnantes.
Son implémentation est limpide dans ton code (à toi de tester, c'est plus parlant) :
```
\version "2.25.14"

#(define-markup-command (draw-battement layout props points)
  (number-pair?)
  #:properties ((thickness 0.2))
  "...Documentation of this beautiful function..."
  
        ;#:with-dimensions-from #:null ; <= à tester

% Ex.
{
    g' -\markup\draw-battement #'(-.6 . 2.3)
}
```

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/13).

---

From: Rémy Claverie via LilyPond <[email-masked]>
Date: Wed, 17 Apr 2024 07:54:22 +0000

Génial ! C'est exactement ce que je cherchai.
Merci Pierre !!

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/14).

---

From: Jean Abou Samra via LilyPond <[email-masked]>
Date: Wed, 17 Apr 2024 08:27:46 +0000

Honnêtement, je ne recommenderais pas la macro Scheme `markup`, qui est une vieillerie avec son lot de bizarreries. Je ferais plutôt

```
\version "2.25.14"

  (let ((x0 (+ 0.5 (car points)))
        (y0 (+ 0.5 (cdr points))))
    (interpret-markup layout props
      #{
        \markup
        %\with-dimensions-from \null
        \path #thickness
          #(list (list 'moveto x0 y0)
                 (list 'rcurveto 0 0.4 0.7 0.85 1 1)
                 (list 'rmoveto -1 0)
                 (list 'rcurveto 0 -0.4 0.7 -0.85 1 -1))
      #})))

% Ex.
{

Ça permet d'utiliser la syntaxe `\markup` familière.

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/15).

---

From: Gilles via LilyPond <[email-masked]>
Date: Wed, 17 Apr 2024 08:37:03 +0000

Coucou Jean ! Tu parles de bizarreries, en référence à la syntaxe ou au comportement ?
Gilles

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/16).

---

From: Jean Abou Samra via LilyPond <[email-masked]>
Date: Wed, 17 Apr 2024 08:41:12 +0000

Exemple :

```
\version "2.24.2"

var = \markuplist { a b c }

%\markup $(markup #:column var) % ne marche pas
\markup \column #var % OK
```

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/17).

---

From: Gilles via LilyPond <[email-masked]>
Date: Wed, 17 Apr 2024 08:54:23 +0000

Effectivement ! Merci pour ce conseil Jean...

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/18).

---

From: MartialR via LilyPond <[email-masked]>
Date: Wed, 17 Apr 2024 10:49:51 +0000

C'est ça qui me manquait .. 
trop ésotérique pour moi un extra-ofsset m'allait bien mais impossible à faire fonctionner. 
```
  (let ((x0 (+ 0.5 (car points)))
        (y0 (+ 0.5 (cdr points))))
```

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/19).

---

From: MartialR via LilyPond <[email-masked]>
Date: Wed, 17 Apr 2024 12:23:52 +0000

Ha merci à tous 
enfin trouvé les bonnes syntaxes 
 
```
\version "2.25.14"

#(define-markup-command (zig layout props points )
  (number-pair?)
  #:properties ((thickness 0.05))
  "... dimension null indispensable pour translate..."
    (
      let ((x0 (+ 0.5 (car points)))
           (y0 (+ 0.5 (cdr points))))
           (interpret-markup layout props
      (markup 
       #:with-dimensions-from #:null 
       #:translate (cons x0 y0)
       #:override (cons 'filled #t)
       #:path thickness 
    (list 
       (list 'moveto   -0.01   -1.95)
       (list 'curveto   0.05   -1.10   0.02  -1.50   0.12   0.00)
       (list 'curveto   0.18    0.80   0.25   1.63   0.38   1.63)
       (list 'curveto   0.51    1.63   0.52   0.80   0.59   0.00)
       (list 'curveto   0.66   -0.90   0.70  -1.54   0.91  -1.54)
       (list 'curveto   1.04   -1.54   1.08  -1.10   1.23   0.00)
       (list 'curveto   1.35    1.00   1.46   1.00   1.49   1.00)
       (list 'curveto   1.57    1.00   1.59   0.69   1.63   0.00)
       (list 'curveto   1.68   -0.70   1.75  -1.08   1.90  -1.08)
       (list 'curveto   2.05   -1.08   2.05  -0.80   2.12  -0.30)
       (list 'curveto   2.20    0.20   2.22   0.43   2.30   0.43)
       (list 'curveto   2.36    0.43   2.37   0.20   2.43   0.00)
       (list 'curveto   2.49   -0.20   2.51  -0.33   2.76  -0.34)
       (list 'curveto   2.96   -0.34   3.20  -0.20   3.25  -0.07)
       (list 'curveto   3.27   -0.01   3.24   0.00   3.23   0.00)
       (list 'curveto   3.15    0.00   3.05  -0.30   2.80  -0.31)
       (list 'curveto   2.67   -0.31   2.64  -0.27   2.55   0.05)
       (list 'curveto   2.46    0.40   2.50   0.48   2.30   0.48)
       (list 'curveto   2.15    0.48   2.10   0.00   2.07  -0.25)
       (list 'curveto   2.00   -0.70   1.98  -1.02   1.92  -1.02)
       (list 'curveto   1.82   -1.02   1.83  -0.60   1.80   0.05)
       (list 'curveto   1.78    0.55   1.74   1.04   1.50   1.04)
       (list 'curveto   1.30    1.04   1.25   0.65   1.16   0.00)
       (list 'curveto   1.02   -1.20   0.96  -1.48   0.91  -1.48)
       (list 'curveto   0.82   -1.48   0.82  -0.70   0.80  -0.25)
       (list 'curveto   0.71    0.90   0.68   1.68   0.40   1.68)
       (list 'curveto   0.15    1.68   0.12   1.00  -0.01  -0.40)
       (list 'closepath)     
      )))))

zig = -\markup\zig \etc

% Ex.
{   
    g'\zig #'(-2 . -2)
    s4
    g' -\markup\zig #'(1.5 . 3) %
}
```

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/20).

---

From: Gilles via LilyPond <[email-masked]>
Date: Wed, 17 Apr 2024 22:55:18 +0000

Est-ce une vieillerie à éviter aussi ça ?
\markup #(make-column-markup  var)

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/21).

---

From: Jean Abou Samra via LilyPond <[email-masked]>
Date: Wed, 17 Apr 2024 23:02:43 +0000

Non. C'est juste moins pratique ici de mon point de vue (mais ça peut être assez utile ailleurs).

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/22).

---

From: Gilles via LilyPond <[email-masked]>
Date: Wed, 17 Apr 2024 23:05:10 +0000

Merci Jean !

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/23).

---

From: Rémy Claverie via LilyPond <[email-masked]>
Date: Thu, 18 Apr 2024 09:34:56 +0000

Bonjour à tous,
Merci pour vos contributions ; j'ai beaucoup appris sur Scheme grâce à vous mais aussi grâce à la documentation de Jean portant sur un [guide d'extension de Lilypond](https://extending-lilypond.gitlab.io/fr/index.html), qui est encore en cours de construction mais qui est déjà très complet.
Le résultat que j'obtiens, ne me convient pas trop. 
![image|690x244](upload://mYKM7xroq4UMdHCCHdLkK8Dy3k.png)
Vous verrez sur l'image que les deux marques codées (battement et tremblement que j'ai mis en rouge), recouvrent partiellement une barre de mesure et le point d'une note pointée, respectivement.
Idéalement, le comportement que je recherche est identique à celui des doigtées : par défaut la marque se positionnerait au dessus de la note (ou en dessous, dans le cas d'un contexte \voiceTwo) et lorsque le positionnement est forcé à gauche ou à droite, la marque est placée *à coté de la tête de note* et prend l'espace nécessaire pour qu'il n'y ait pas de superposition avec un autre élément de la musique.
Je me demande si *define-markup-command* est vraiment adapté...
Pour info, voici les morceaux de codes du tremblement et du battement:
```
#(define-markup-command (draw-tremblement layout props)()
   #:properties (
                  (thickness 0.2)
                  (color color_for_marks)
                  )
   "...Documentation of this beautiful function..."  
   (let ((thickness (* thickness 1.1)) )
     (interpret-markup layout props                    
                       #{
                         \markup
                         \with-dimensions-from \null
                         \with-color #color                         
                         \path #thickness
                         #(list                         
                           (list 'moveto 1.5 -0.1 )
                           (list 'rcurveto 0.2 0.2 0.6 -0.5 -0 -0.9 ) 
                           )
                       #}
                       )))
```
```
#(define-markup-command (draw-battement layout props points)(number-pair?)
   #:properties (
                  (thickness 0.2)
                  (color color_for_marks)
                  )
   "...Documentation of this beautiful function..."  
   (let (( x0 (+ 0.5 (car points)))
         ( y0 (+ 0.5 (cdr points))))
     (interpret-markup layout props
                       #{
                         \markup
                         \with-dimensions-from \null
                         \with-color #color
                         \path #thickness
                         #(list
                           (list 'moveto x0 y0)
                           (list 'rcurveto 0 0.4 0.7 0.85 1 1)
                           (list 'rmoveto -1 0)
                           (list 'rcurveto 0 -0.4 0.7 -0.85 1 -1))
                       #}
                       )))
```
Je vais continuer à creuser mais n'hésitez pas à m'alimenter de vos idées/réflexions/liens.
Merci et très bonne journée !
Rémy

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/24).

---

From: Jean Abou Samra via LilyPond <[email-masked]>
Date: Thu, 18 Apr 2024 11:51:58 +0000

Le problème n'est pas dans `define-markup-command` en soi. C'est plutôt que le `\with-dimensions-from \null` dit très précisément à LilyPond "construis ce markup comme un dessin qui ne prend aucune place, qui n'a aucun contour, qui est comme un dessin vide pour tout ce qui est du positionnement". Donc, LilyPond obéit et n'évite aucune collision avec ce dessin. Ceci *peut* être utile, quand c'est trop compliqué de faire éviter les collisions de manière automatique et plus facile de placer manuellement (un peu comme `extra-offset`). Après, si tu veux que le dessin se place comme un doigté, l'une des possibilités (faute de mieux) est de mettre un doigté (peu importe lequel) et de changer son dessin, quelque chose comme `< c' \tweak text \markup \battement -1 >`. À partir de là, tu peux utiliser les méthodes normales pour positionner les doigtés (chercher `fingeringOrientations` dans la doc).

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/25).

---

From: Pierre Perol-Schneider via LilyPond <[email-masked]>
Date: Thu, 18 Apr 2024 16:59:20 +0000

Bonne idée Jean. ;)
Par contre, ça peut entrer en conflit de positionnement avec d'autres doigtés et demande alors quelques ajustements.
Petit essai avec des event fonctions (évidemment le pb des conflits de positions reste le même) :
```
\version "2.25.14"

batt = #(define-event-function (points)(number-pair?)
               \finger
               \with-color #red
               \path #0.2
             #}))

tremb = #(define-event-function ()()
           #{
             \finger
             \markup
             \with-color #red
             \path #0.2
             #(list                        
               (list 'moveto 1.5 -0.1 )
               (list 'rcurveto 0.2 0.2 0.6 -0.5 -0 -0.9 ))
           #})

\fixed c'' {
  \time 2/2
  \voiceOne
  \set fingeringOrientations = #'(left)
  s1 <e-\batt #'(0 . -10)>4 f8.( e16) \grace { <e-1>16( f) } g8.( f16)
  <f-2>8.-\tweak extra-offset #'(2 . -4)-\tremb ( <e> 16)
}
```

Peut-être un peu HS : je me souviens d'un article de Nicolas Sceaux sur a créations des ornements de Bach. C'était assez bien pensé et complet. Il l'avait publié sur un blog qui a disparu ("Scores Of Beauty" si ma mémoire est bonne). J'ai checké son github en vitesse mais rien trouvé. Peut-être quelqu'un de la liste en a conservé une trace ?

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/26).

---

From: Bernard Meylan via LilyPond <[email-masked]>
Date: Fri, 19 Apr 2024 09:37:01 +0000

J'en ai conservé (et utilisé plus que de raison…) une partie, celle des pincés gauche et droite:

```
\version "2.18.2"

%%%
%%% Utilities for defining new grobs, grob properties and music event types
%%% (there should be built-in commands to do that in LilyPond)
%%%
#(define (define-grob-type grob-name grob-entry)
   "Define a new grob and add it to `all-grob-definitions', after
scm/define-grobs.scm fashion.
After grob definitions are added, use:

\\layout {
  \\context {
    \\Global
    \\grobdescriptions #all-grob-descriptions
  }
}

to register them."
   (let* ((meta-entry   (assoc-get 'meta grob-entry))
          (class        (assoc-get 'class meta-entry))
          (ifaces-entry (assoc-get 'interfaces meta-entry)))
     (set-object-property! grob-name 'translation-type? list?)
     (set-object-property! grob-name 'is-grob? #t)
     (set! ifaces-entry (append (case class
                                  ((Item) '(item-interface))
                                  ((Spanner) '(spanner-interface))
                                  ((Paper_column) '((item-interface
                                                     paper-column-interface)))
                                  ((System) '((system-interface
                                               spanner-interface)))
                                  (else '(unknown-interface)))
                                ifaces-entry))
     (set! ifaces-entry (uniq-list (sort ifaces-entry symbol<?)))
     (set! ifaces-entry (cons 'grob-interface ifaces-entry))
     (set! meta-entry (assoc-set! meta-entry 'name grob-name))
     (set! meta-entry (assoc-set! meta-entry 'interfaces
                                  ifaces-entry))
     (set! grob-entry (assoc-set! grob-entry 'meta meta-entry))
     (set! all-grob-descriptions
           (cons (cons grob-name grob-entry)
                 all-grob-descriptions))))

#(define-public (define-grob-property symbol type? description)
   "Define a new grob property.
`symbol': the property name
`type?': the type predicate for this property
`description': the type documentation"
  (set-object-property! symbol 'backend-type? type?)
  (set-object-property! symbol 'backend-doc description)
  symbol)

#(defmacro*-public define-music-type (type-name parents #:rest properties)
     "Add a new music type description to `music-descriptions'
and `music-name-to-property-table'.

`type-name': the music type name (a symbol)
`parents': the parent event classes (a list of symbols)
`properties': a (key . value) property set, which shall contain at least
   description and type properties.
"
   (let ((gproperties (gensym "properties")))
     `(let ((,gproperties (list-copy ',properties)))
        ,@(map (lambda (parent)
                `(define-event-class ',(ly:camel-case->lisp-identifier type-name)
                   ',parent))
               parents)
        (set-object-property! ',type-name
                              'music-description
                              (cdr (assq 'description ,gproperties)))
        (set! ,gproperties (assoc-set! ,gproperties 'name ',type-name))
        (set! ,gproperties (assq-remove! ,gproperties 'description))
        (hashq-set! music-name-to-property-table ',type-name ,gproperties)
        (set! music-descriptions
              (cons (cons ',type-name ,gproperties)
                    music-descriptions)))))

%%%
%%% Grob definition
%%%
#(define (head-ornamentation::print me)
   "Prints a HeadOrnamentation grob, on the left or right side of the
note head, depending on the grob direction."
   (let* ((notes (ly:grob-object me 'elements))
          (y-ref (ly:grob-common-refpoint-of-array me notes Y))
          (x-ref (ly:grob-common-refpoint-of-array me notes X))
          (x-ext (ly:relative-group-extent notes x-ref X))
          (y-ext (ly:relative-group-extent notes y-ref Y))
          (y-coord (interval-center y-ext))
          (text (ly:text-interface::print me))
          (width (/ (interval-length (ly:stencil-extent text X)) 2.0))
          (x-coord (if (= (ly:grob-property me 'direction) LEFT)
                       (- (car x-ext) width)
                       (+ (cdr x-ext) width))))
     (ly:stencil-translate
      text
      (cons
       (- x-coord (ly:grob-relative-coordinate me x-ref X))
       (- y-coord (ly:grob-relative-coordinate me y-ref Y))))))

#(define-grob-type 'HeadOrnamentation
  `((font-size . 0)
    (stencil . ,head-ornamentation::print)
    (meta . ((class . Item)
             (interfaces . (font-interface))))))

\layout {
  \context {
    \Global
    \grobdescriptions #all-grob-descriptions
  }
}

%%%
%%% Engraver
%%%
%% The head-ornamentation engraver, with its note-head acknowledger
%% (which add HeadOrnamentation grobs to note heads)
#(define head-ornamentation-engraver
   (make-engraver
    (acknowledgers
     ((note-head-interface engraver note-grob source)
      ;; helper function to create HeadOrnamentation grobs
      (define (make-ornament-grob text direction)
        (let ((ornament-grob (ly:engraver-make-grob engraver
                                                    'HeadOrnamentation
                                                    note-grob)))
          ;; use the ornament event text as the grob text property
          (set! (ly:grob-property ornament-grob 'text) text)
          ;; set the grob direction (either LEFT or RIGHT)
          (set! (ly:grob-property ornament-grob 'direction) direction)
          (ly:pointer-group-interface::add-grob ornament-grob
                                                'elements
                                                note-grob)
          ;; the ornamentation is vertically aligned with the note head
          (set! (ly:grob-parent ornament-grob Y) note-grob)
          ;; compute its font size
          (set! (ly:grob-property ornament-grob 'font-size)
                (+ (ly:grob-property ornament-grob 'font-size 0.0)
                   (ly:grob-property note-grob 'font-size 0.0)))
          ornament-grob))
      ;; When the note-head event attached to the note-head grob has
      ;; ornamentation events among its articulations, then create a
      ;; HeadOrnamentation grob
      (for-each
       (lambda (articulation)
         (if (memq 'head-ornamentation-event
                   (ly:event-property articulation 'class))
             ;; this articulation is an ornamentation => make the grob
             ;; (either on LEFT or RIGHT direction)
             (begin
               (if (markup? (ly:event-property articulation 'left-text))
                   (make-ornament-grob (ly:event-property articulation 'left-text)
                                       LEFT))
               (if (markup? (ly:event-property articulation 'right-text))
                   (make-ornament-grob (ly:event-property articulation 'right-text)
                                       RIGHT)))))
         (ly:event-property (ly:grob-property note-grob 'cause) 'articulations))))))

\layout {
  \context {
    \Voice
    \consists #head-ornamentation-engraver
  }
}

%%%
%%% Event type definition
%%%
#(define-music-type HeadOrnamentationEvent (music-event)
   (description . "Print an ornamentation at a note head side")
   (types . (general-music post-event event head-ornamentation-event)))

pincepointeLR =
#(make-music 'HeadOrnamentationEvent
             'left-text #{ \markup \concat {
    \fontsize #1 \rotate #190 
    \musicglyph #"scripts.rcomma"
    \hspace #1 } #}
             'right-text #{
  \markup \concat{ \rotate #10 
  \fontsize #1 \musicglyph #"scripts.rcomma" \hspace #1.5 } #})

pinceLR =
#(make-music 'HeadOrnamentationEvent
             'left-text #{ \markup \override #'(font-name . "1610_Cancellaresca_lim") \fontsize #10 \concat {
    \lower #3.2
    \rotate #190
    "'" \hspace #0.3 } #}
             'right-text #{ \markup \override #'(font-name . "1610_Cancellaresca_lim") \fontsize #10 \concat {
  
  \lower #3.3
  "'" \hspace #-3 } #})

pinceR =
#(make-music 'HeadOrnamentationEvent
             'right-text #{ \markup \override #'(font-name . "1610_Cancellaresca_lim") \fontsize #10
                            { \lower #3.2 \rotate #10
                              "'" \hspace #-3 } #})

pincepointeR =
#(make-music 'HeadOrnamentationEvent
             'right-text #{ \markup \override #'(font-name . "1610_Cancellaresca_lim") \fontsize #10
                            { %\null 
                              \lower #-0
                              "," \hspace #1.5 } #})

pinceL =
#(make-music 'HeadOrnamentationEvent
             'left-text #{ \markup \override #'(font-name . "Arial Black") \fontsize #-2
                            { \null \lower #0.5 "(" \hspace #-1 } #})

cadenceL =
#(make-music 'HeadOrnamentationEvent
             'left-text #{ \markup\concat {
    \fontsize #1 \musicglyph #"scripts.prall"
    \hspace #0.5 } #})
```

Cordialement.

Bernard

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/27).

---

From: xavier via LilyPond <[email-masked]>
Date: Fri, 19 Apr 2024 10:07:31 +0000

Bonjour,

L'article de Nicolas Sceaux en 2 parties via la Wayback Machine:
https://web.archive.org/web/20200221133054/http://lilypondblog.org/2013/08/adding-ornamentations-to-note-heads-part-1/
https://web.archive.org/web/20200220154858/http://lilypondblog.org/2013/09/adding-ornamentations-to-note-heads-part-2/

Cordialement,
Xavier

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/28).

---

From: Pierre Perol-Schneider via LilyPond <[email-masked]>
Date: Fri, 19 Apr 2024 12:05:55 +0000

Merci à vous deux ;)

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/29).

---

From: Rémy Claverie via LilyPond <[email-masked]>
Date: Fri, 19 Apr 2024 13:42:21 +0000

Les articles de N. Sceaux sont très très complets et complexes.
J'espère pouvoir tout comprendre, même si je ne me sens pas vraiment au niveau requis...
En tous cas merci de m'avoir aider et bon WE !
Rémy

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/creation-de-glyphes/5683/30).