Utiliser Lilypond pour écrire des partitions de castagnettes de concert

Bonjour,
Je joue des castagnettes de concert. Je débute sur Lilypond et je voudrais bien réussir à créer de belles partitions de castagnettes. Mais j'ai plein de problèmes !
Je voulais créer un set de percussions personnalisées mais je n'y suis pas arrivée. Du coup, j'ai utilisé une portée mélodique. Ca fonctionne, mais:

  1. je ne comprends pas vraiment bien la structure: tout ce que j'ai mis dans \layout ne sert strictement à rien
  2. Je n'arrive pas à bien gérer le positionnement horizontal ni le positionnement vertical des objets (en particulier les points de prolongation de durée)
  3. j'ai beaucoup de mal à gérer correctement les ligatures: parfois j'en veux et n'arrive pas à en mettre et parfois ... c'est le contraire !
    Bref, je suis preneuse de tous conseils pour avancer mieux dans mon projet.
    Je vous joins un fichier de ce que j'arrive déjà à faire.
    Pour info: la ligne du bas correspond à la castagnette main gauche (grave) et celle du haut à la castagnette main droite (aiguë). Ce qui apparaît entre les deux lignes correspond à des chocs entre les deux (il y a plusieurs façons de choquer les castagnettes)
    Merci à vous de m'accueillir dans ce groupe, :grinning_face:
    Fab
    Essai.pdf (74,9 Ko)

Bonjour @FabFlam

Peux tu nous joindre ton fichier Lilypond STP ? Cela permettra de mieux comprendre tes erreurs et te faire des propositions adaptées à ton besoin

Belle journée et bienvenue parmi nous :wink:

\version "2.24.4"
\language "english"

%% http://lsr.di.unimi.it/LSR/Item?id=700

%LSR This snippet was contributed by Neil Puttock

#(define-public ((color-staff-lines . rest) grob)
   
   (define (index-cell cell dir)
     (if (equal? dir RIGHT)
         (cdr cell)
         (car cell)))
   
   (define (index-set-cell! x dir val)
     (case dir
       ((-1) (set-car! x val))
       ((1) (set-cdr! x val))))
   
   (let* ((common (ly:grob-system grob))
          (span-points '(0 . 0))
          (thickness (* (ly:grob-property grob 'thickness 1.0)
                        (ly:output-def-lookup (ly:grob-layout grob) 'line-thickness)))
          (width (ly:grob-property grob 'width))
          (line-positions (ly:grob-property grob 'line-positions))
          (staff-space (ly:grob-property grob 'staff-space 1))
          (line-stencil #f)
          (total-lines empty-stencil)
          ;; use a local copy of colors list, since
          ;; stencil creation mutates list
          (colors rest))
     
     (for-each
      (lambda (dir)
        (if (and (= dir RIGHT)
                 (number? width))
            (set-cdr! span-points width)
            (let* ((bound (ly:spanner-bound grob dir))
                   (bound-ext (ly:grob-extent bound bound X)))
              
              (index-set-cell! span-points dir
                               (ly:grob-relative-coordinate bound common X))
              (if (and (not (ly:item-break-dir bound))
                       (not (interval-empty? bound-ext)))
                  (index-set-cell! span-points dir 
                                   (+ (index-cell span-points dir)
                                      (index-cell bound-ext dir))))))
        (index-set-cell! span-points dir (- (index-cell span-points dir)
                                            (* dir thickness 0.5))))
      (list LEFT RIGHT))
     
     (set! span-points
           (coord-translate span-points
                            (- (ly:grob-relative-coordinate grob common X))))
     (set! line-stencil
           (make-line-stencil thickness (car span-points) 0 (cdr span-points) 0))
     
     (if (pair? line-positions)
         (for-each (lambda (position)
                     (let ((color (if (pair? colors)
                                      (car colors)
                                      #f)))
                       (set! total-lines
                             (ly:stencil-add
                              total-lines
                              (ly:stencil-translate-axis
                               (if (color? color)
                                   (ly:stencil-in-color line-stencil
                                                        (first color)
                                                        (second color)
                                                        (third color))
                                   line-stencil)
                               (* position staff-space 0.5) Y)))
                       (and (pair? colors)
                            (set! colors (cdr colors)))))
                   line-positions)       
         (let* ((line-count (ly:grob-property grob 'line-count 5))
                (height (* (1- line-count) (/ staff-space 2))))
           (do ((i 0 (1+ i)))                      
             ((= i line-count))
             (let ((color (if (and (pair? colors)
                                   (> (length colors) i))
                              (list-ref colors i)
                              #f)))
               (set! total-lines (ly:stencil-add
                                  total-lines
                                  (ly:stencil-translate-axis
                                   (if (color? color)
                                       (ly:stencil-in-color line-stencil
                                                            (first color)
                                                            (second color)
                                                            (third color))
                                       line-stencil)
                                   (- height (* i staff-space)) Y)))))))
     total-lines))


% Définition des toque castagnettes
% \NoBeam: supprime la ligature il suffit de l'enlever pour retrouver une ligature
TA = {e'8}
TAnb = {e'8\noBeam}
PI = {f''8}
PInb = {f''8\noBeam}
TAN = {<<f''8 \\ e' >>}
TANnb = {<<f''8\noBeam \\ e'\noBeam >>}
TIN = {<<\override Stem.direction =#down b'8 \\\once \override NoteColumn.force-hshift = 0.9 \override Stem.direction =#up b' >>}
TINnb = {<< \once \override NoteColumn.force-hshift = 0.9 b'8\noBeam \\ b'8\noBeam >>}
PIM = {<< c''8\\ a' >>}
PIMnb = {<< c''8\noBeam \\ a'\noBeam >>}
trioPIM={<< \tuplet 3/2 {c''8\noBeam c''\noBeam c''} \\ \once \override TupletNumber.transparent = ##t \once \override TupletBracket.transparent = ##t\tuplet 3/2 {a'\noBeam a'\noBeam a'} >>}

RA = {[e'8 e' e' e']}
RI = {[f''8 f'' f'' f'']}
RIA = {\tuplet 5/4 {[f''16( f'' f'' f''] e')}}
TATINPInb ={\voiceOne {\override Stem.direction =#down {e'8}}{<< \once \override NoteColumn.force-hshift = 0.9 b'8 \\ b' >>} {\voiceTwo\override Stem.direction =#up f''8}}
\score {
% >Définition de la portée castagnettes
 \new Staff { 
%   \set Staff.autobeaming = ##t
%   \override Beam #'transparent = ##t
%   \revert Beam #'transparent
      % masquer les lignes centrales
    \override Staff.StaffSymbol.stencil = #(color-staff-lines black white white white black)
    % masquer la clé
    \override Staff.Clef.transparent = ##t
% Réglage de l'espacement minimal entre les objets sur la portée
%    \override SpacingSpanner.base-shortest-duration = \musicLength 16.
% Votre partition commence ici
    \numericTimeSignature \time 4/4
    
%    \set Timing.beamExceptions = #'()
     \tempo "Tempo"

{r1*20}
{\override Stem.direction =#up \TA} |
{\override Stem.direction =#up \PI} |
{\TANnb}
{\TIN}
{\PIM}
r8 r4
{\RA}
{\RI}
{\RIA}
r4
\trioPIM
r4
{{<<f''4 \\ e' >>} {e'16} \RIA \TIN \TA}
{\tweak Dots.Y-offset 1 c''8.\noBeam }

{<< \once \override Dots.transparent = ##t c''8.\noBeam \\ a'8.\noBeam >>} {<< c''16 \\ a' >>}
{<< \once \override Dots.transparent = ##t c''8.\noBeam \\ a'8.\noBeam >>} {<< c''16 \\ a' >>}
{<< \once \override Dots.transparent = ##t c''8.\noBeam \\ a'8.\noBeam >>} {<< c''16 \\ a' >>}
{<< \once \override Dots.transparent = ##t c''8.\noBeam \\ a'8.\noBeam >>} {<< c''16 \\ a' >>}
\TATINPInb
          }
 \header {
  dedication = "Dédicace"
  title = "Titre"
  subtitle = "sous-titre"
  subsubtitle = "Sous-sous-titre"
  instrument = "Instrument"
  composer = "Compositeur"
  arranger = "Arrangeur"
  copyright = "©2026 AtikaFlamenco. All rights reserved"
  tagline = ""
}
% Votre partition termine là
\layout {
  
}
}

Bonjour Sébastien,
Merci du message. J'ai mis le code mais je ne comprends pas pourquoi il est formaté bizarrement.
Je l'ai peut-être un peu modifié depuis hier mais surtout je pense que je n'irais pas beaucoup plus loin avec cette façon de faire.
Fab

Jai aussi essayé en définissant un style de percussion personnalisé:

\version "2.24.4"
\language "english"

%% http://lsr.di.unimi.it/LSR/Item?id=700

%LSR This snippet was contributed by Neil Puttock

#(define-public ((color-staff-lines . rest) grob)
   
   (define (index-cell cell dir)
     (if (equal? dir RIGHT)
         (cdr cell)
         (car cell)))
   
   (define (index-set-cell! x dir val)
     (case dir
       ((-1) (set-car! x val))
       ((1) (set-cdr! x val))))
   
   (let* ((common (ly:grob-system grob))
          (span-points '(0 . 0))
          (thickness (* (ly:grob-property grob 'thickness 1.0)
                        (ly:output-def-lookup (ly:grob-layout grob) 'line-thickness)))
          (width (ly:grob-property grob 'width))
          (line-positions (ly:grob-property grob 'line-positions))
          (staff-space (ly:grob-property grob 'staff-space 1))
          (line-stencil #f)
          (total-lines empty-stencil)
          ;; use a local copy of colors list, since
          ;; stencil creation mutates list
          (colors rest))
     
     (for-each
      (lambda (dir)
        (if (and (= dir RIGHT)
                 (number? width))
            (set-cdr! span-points width)
            (let* ((bound (ly:spanner-bound grob dir))
                   (bound-ext (ly:grob-extent bound bound X)))
              
              (index-set-cell! span-points dir
                               (ly:grob-relative-coordinate bound common X))
              (if (and (not (ly:item-break-dir bound))
                       (not (interval-empty? bound-ext)))
                  (index-set-cell! span-points dir 
                                   (+ (index-cell span-points dir)
                                      (index-cell bound-ext dir))))))
        (index-set-cell! span-points dir (- (index-cell span-points dir)
                                            (* dir thickness 0.5))))
      (list LEFT RIGHT))
     
     (set! span-points
           (coord-translate span-points
                            (- (ly:grob-relative-coordinate grob common X))))
     (set! line-stencil
           (make-line-stencil thickness (car span-points) 0 (cdr span-points) 0))
     
     (if (pair? line-positions)
         (for-each (lambda (position)
                     (let ((color (if (pair? colors)
                                      (car colors)
                                      #f)))
                       (set! total-lines
                             (ly:stencil-add
                              total-lines
                              (ly:stencil-translate-axis
                               (if (color? color)
                                   (ly:stencil-in-color line-stencil
                                                        (first color)
                                                        (second color)
                                                        (third color))
                                   line-stencil)
                               (* position staff-space 0.5) Y)))
                       (and (pair? colors)
                            (set! colors (cdr colors)))))
                   line-positions)       
         (let* ((line-count (ly:grob-property grob 'line-count 5))
                (height (* (1- line-count) (/ staff-space 2))))
           (do ((i 0 (1+ i)))                      
             ((= i line-count))
             (let ((color (if (and (pair? colors)
                                   (> (length colors) i))
                              (list-ref colors i)
                              #f)))
               (set! total-lines (ly:stencil-add
                                  total-lines
                                  (ly:stencil-translate-axis
                                   (if (color? color)
                                       (ly:stencil-in-color line-stencil
                                                            (first color)
                                                            (second color)
                                                            (third color))
                                       line-stencil)
                                   (- height (* i staff-space)) Y)))))))
     total-lines))


% Définition des toque castagnettes
%PI =
%TA=
%TIN=
\version "2.24.4"

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Déclaration des percussions
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

drumPitchNames = #`(
  (pi  . sn)
  (ta  . bd)
  (tin . hh)
)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% STYLE DE LA PORTÉE (2 LIGNES)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

#(define castanet-style
  (alist->hash-table
   '(
     (pi  default #f  10)   
     (ta  default #f  5)  
     (tin default #f  0) 
   )))
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Partition
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  \score {
% >Définition de la portée castagnettes
 \new DrumStaff { 
%   \set Staff.autobeaming = ##t
%   \override Beam #'transparent = ##t
%   \revert Beam #'transparent
% Nom de l'instrument

      % masquer les lignes centrales
    \override Staff.StaffSymbol.stencil = #(color-staff-lines black white white white black)
    % masquer la clé
    \override Staff.Clef.transparent = ##t
% Réglage de l'espacement minimal entre les objets sur la portée
%    \override SpacingSpanner.base-shortest-duration = \musicLength 16.
% Votre partition commence ici
    \numericTimeSignature \time 4/4
    \drummode {
%    \set Timing.beamExceptions = #'()
 {pi8 ta tin}
 }
 }
 }

C'est compilé sans erreur mais ça ne donne pas le résultat escompté:
Essai2.pdf (26,9 Ko)

Voilà je poursuis un pau chaque méthode en testant de nouvelles idées, alors si vous en avez, n'hésitez pas à me les proposer.
Merci à tous et très bonne fin de journée,
Fab

Bonjour,
Alors je ne suis pas du tout à l'aise avec la percussion DrumStaff
voici avec l'exemple précédent

\version "2.24.0"

%%%%%%Nouveau nom 
drumPitchNames = #`(
  (pi  . snare)
  (ta  . dbass )
  (tin . hihat)
)

  drumPitchNames.pi  = #'snare
  drumPitchNames.ta  = #'dbass
  drumPitchNames.tin = #'hihat

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% STYLE DE LA PORTÉE (2 LIGNES)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#(define castanet-style
   '(
     (snare default #f  -2)   
     (dbass  default #f  0)  
     (hihat default #f   2)
     ))
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% midi Pitches
  midiDrumPitches.snare  = g
  midiDrumPitches.dbass  = g,
  midiDrumPitches.hihat  = e
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\score {
\new DrumStaff 
\with { 
   \numericTimeSignature 
   \omit Clef
    \override StaffSymbol.line-count = #2 %2 lignes
    %espacement des lignes
    \override StaffSymbol.line-positions =   #'(-2  2) 
    instrumentName = "Castagnett' "
    %appel des nouvelles définition PitchName et midi 
    drumStyleTable = #(alist->hash-table castanet-style)
    drumPitchTable = #(alist->hash-table midiDrumPitches)
  } 
 
  
\drummode { 
  \time 4/4
  \stemDown pi8 ta \stemUp tin 
}


 \layout {  }
 \midi {  }
}

image

Bonsoir Martial,
Merci du message et de la proposition.
Cette proposition est intéressante mais ne correspond pas à ce que je dois avoir car il y a un petit morceau de ligne au niveau de la note centrale qui n'existe pas dans les partitions de castagnettes.
Est-ce que tu sais pourquoi je n'arrive pas à bien positionner mes notes sur les lignes de la portée de percussion ?
Fab

Par ailleurs, j'ai besoin des 5 lignes de la portée car il y aura d'autres sons.

peux-tu mettre un extrait image de ta partition.

la hauteur des notes est située sur les 5 lignes et interlignes.

0 la ligne du milieu
4 dernière ligne du haut
-4 dernière ligne du bas

 4--------------------
 3
 2 -------------------
 1 
 0 -------------------
-1
-2--------------------
-3
-4---------------------

donc ceci ne marche pas avec l'intervalle standard des portées

#(define castanet-style
  (alist->hash-table
   '(
     (pi  default #f  10)   
     (ta  default #f  5)  
     (tin default #f  0) 
   )))

il faut faire

#(define castanet-style
  (alist->hash-table
   '(
     (pi  default #f   -2)   
     (ta  default #f   0)  
     (tin default #f   2) 
   )))

Voici un essai
avec 2 lignes 3 lignes et 5 lignes
instruments de percussion arbitraire

\version "2.24"

%transparence du point de prolongement
ndot= { \override Dots.transparent = ##t }
rdot= { \revert Dots.transparent }

% placement sur la portée des instruments Drums
#(define mydrums '(
                    (claves default #f  4)
                    (snare default #f  2)
                    (hiwoodblock default #f  0)
                    (handclap default #f -2)
                    (lowoodblock default #f -4)))

%renommage des Drums (to et clap arbitraire)
drumPitchNames = #`(
                     (pi  . hiwoodblock )
                     (ta  . lowoodblock )
                     (tin . claves)
                     (to . snare)
                     (clap . handclap)
                     )


catagnetstaffTwolignes = {
  \override Staff.LedgerLineSpanner.stencil = ##f
  \override Staff.StaffSymbol.line-positions = #'(-4  4)
}

catagnetstaffTroislignes = {
 \override Staff.LedgerLineSpanner.stencil = ##f
  \override DrumStaff.StaffSymbol.line-positions = #'(-4 0 4)
}

\score {
  \new DrumStaff 
 \with {
    \numericTimeSignature
    \omit Clef
  }
 {
    % with this you load your new drum style table
    \set DrumStaff.drumStyleTable = #(alist->hash-table mydrums)
    \drummode {
      \catagnetstaffTwolignes
      \time 2/4
      tin8 16 16 8-> 8
      \tuplet 5/2 {  tin16[ 16 16 16 16] }
      pi8 16 16-> ~ 16 ta16
      \stopStaff \startStaff
      \catagnetstaffTroislignes
      pi8 pi tin8 ta
      pi8 pi tin8 ta
      \stopStaff \startStaff
      \revert Staff.StaffSymbol.line-positions
      \ndot to8. pi16  to8. ta16  \tuplet 5/2 { clap16 16 16 16 16 }
      \rdot ta4.
    }
  }
  \layout { }
  \midi {  }
}

Ah bien merci infiniment.
Je testerai demain et te dirai le résultat.
En tout cas, c'est vraiment super sympa de me proposer tout ça.
Fab

@MartialR Super ! c'est exactement ce qu'il me faut. Je vais pouvoir continuer à avancer dans cette direction.
Merci encore.

Bonjour,
Alors, grâce à @MartialR j'ai bien avancé dans mon projet. Mais il y a encore des points que je n'arrive pas à résoudre.
Pour introduire les différents "toque" propres aux castagnettes je définis des fonctions musicales. Mais il y en a que je n'arrive pas à faire:

  1. j'aimerais une fonction musicale qui permette d'écrire RAIAI= << {s32 [pi16 pi pi pi]} \ {[ta16 ta ta ta] s32} >> mais en passant les durées en arguments.
    J'ai écrit:
    RAIAI = #(define-music-function (dur1 dur2) (ly:duration? ly:duration?)
    #{
    <<
    \new DrumVoice {
    \voiceOne
    \drummode {s $dur1 [pi $dur2 pi pi pi]}
    }

          \new DrumVoice {
            \voiceTwo
            \drummode { [ta $dur2 ta ta ta] s $dur1 }
          }
        >>
      #})
    

Je n'ai pas d'erreur en compilation mais je ne sais pas comment passer les durées en arguments au moment de l'appel à la fonction.
Pour info, une fonction comme:
RA = #(define-music-function (dur) (ly:duration?)
#{
\drummode {\stemDown { [ta $dur ta ta ta] }}
#})
fonctionne parfaitement lorsqu'on l'appelle avec \RA16

Je ne sais pas si je m'y prend bien, une idée ?
Fab

voir dans ce message une piste :

Peut-on avoir un scan de la partition s'il existe ?

Je vais regarder ce message. MAis sinon pas de partition puisque je n'arrive pas à faire appel à cette fonction.
Pr contre lorsque j'écris dans la partition:
<< {s32 [pi16 pi pi pi]} \ {[ta16 ta ta ta] s32} >>
ça donne bien ce qu'il faut, à savoir:

Ah encore merci @MartialR en regardant le fil que tu m'as indiqué j'ai en effet trouvé comment faire appel à ma fonction.
Mais je me demande: y aurait-il moyen de n'avoir que la durée des notes en argument ? Puisque les silences durent 2 fois moins longtemps, faire un calcul au sein de la fonction qui permette d'avoir durs = dur*2 ?