Création de glyphes

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.

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"
}

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

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/ 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.

Je pense que le plus simple est de le faire avec \markup \path, 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).

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

Il suffit de positionner où bon vous sembleavec \tweak extra-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"
}

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.

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
}

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

zigpath = \markup {
     \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))
    }

        
        
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 =
         \zigpath
        $note #})
        
\relative c' {
       d \zig bes d \zig gis a b  cis \zig ces
}

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 !

Salut Remy, ça fait longtemps :wink:
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és dans ses déplacements.
Amitiés,
Pierre

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

La dimension nulle permet au glyphe de lui é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..."
  
  (let ((x0 (+ 0.5 (car points)))
        (y0 (+ 0.5 (cdr points))))
    (interpret-markup layout props
      (markup
        ;#:with-dimensions-from #:null ; <= à tester
        #: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.
{
    g' -\markup\draw-battement #'(-.6 . 2.3)
}

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

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"

#(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
        %\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.
{
    g' -\markup\draw-battement #'(-.6 . 2.3)
}

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

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

Exemple :

\version "2.24.2"

var = \markuplist { a b c }

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

Effectivement ! Merci pour ce conseil Jean...

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))))

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) %
}