Subject: Centrer une note entre deux portées

From: Bigane <[email-masked]>
Date: Wed, 14 Jan 2009 20:34:27 +0100

[Windows XP, LilyPond 2.12.1]
 
Bien le bonjour à tous,

La liste compte me compte depuis peu comme nouveau membre, aussi je me 
présente un peu avant de poursuivre ma question.

Contrairement à beaucoup d'entre vous je débute totalement en musique ! 
Mais, lorsque j'ai lu les scripts de certaine d'entre vous dans les 
archives ...  Waouh ça donne envie d'en connaître un peu plus !

Je commence donc par le commencement en apprenant les notes, tout 
simplement. J'ai trouvé une bonne méthode théorique et j'ai décidé de 
suivre ce cour (Manuel de Lecture de de Rythme à l'usage des pianistes 
et harpistes débutants). J'arrive à mon problème : un peu beaucoup 
passionné d'informatique, je ne peux m'empêcher de reproduire les 
partitions que je lis, pour multiplier les exercices (et aussi comme 
excuse pour revenir sur mon clavier d'ordi).

Deux jours de lecture de la liste de diffusion depuis le début des 
archives, quelques fouilles dans les sources avec installation de la doc 
complète... j'arrive à une partition me permettant d'apprendre des notes 
avec certaines en couleur.
Cependant comment faire pour centrer le do rouge entre les deux portées 
(clé de sol, clé de fa) ?
Car dans l'édition originale ce centrage est un plus pour l'apprentissage.

Voici le script que j'arrive à produire et qui illustre mon problème :

%%%%%%%%%%%%%%%%%%%%%%
\version "2.12.1"
\include "italiano.ly"
#(ly:set-option 'point-and-click #f) % supprime le clic http sur les notes

\paper{
  %paper-width = 2\cm
  top-margin = 3\cm
  bottom-margin = 3\cm
  ragged-last-bottom = ##t
  indent = #0 % évite le retrait de la première portée
  between-system-padding = #2.0 % espace entre les portées

}

#(define (colorier grob)
  "Colorie la note do en rouge... ne fonctionne que partiellement."
  (let ((mod-position (modulo (ly:grob-property grob 'staff-position) 7)))
    (case mod-position
      ;; Retourne une couleur selon la position
      ((1) (x11-color 'red ))   ; do
      ((2) (x11-color 'black )) ; re
      ((3) (x11-color 'black )) ; mi
      ((4) (x11-color 'black )) ; fa
      ((5) (x11-color 'black )) ; sol
      ((6) (x11-color 'red   )) ; la  ou do sur clef de Fa
      ((0) (x11-color 'black )) ; si
    )
  )
) 

nobar = {
    \override Staff.NoteHead #'color = #colorier
    \override Staff.TimeSignature #'stencil = ##f
    \override Staff.Stem #'transparent = ##t
}

\header {

  % au centre
  %dedication = ""
  title = \markup { \italic Entrainement }
  subtitle = ""
  %instrument = ""
  %year = ""

  % invisible
  %enteredby = "Moi"
 
  % a gauche
  %piece = "nom"

  % a droite
  %composer = ""
 
  % en bas de page
  %copyright = "public domain"
 
  % tag de lilypond :
  tagline = ""
}

un = {
  do' si  si  do' do' re' re' do' do' si  do' si  \break
  do' re' re' do' re' do' si  re' si  re' do' re' \bar "|."
}

deux = {
  do' re' do' si  si  do' re' do' do' re' do' re' \break
  do' re' do' si  re' si  re' re' do' si  do' si  \bar "|."
}

\layout {
  ragged-right = ##f

  \context { \Score
    \remove Bar_number_engraver % suppression des numéro de Bar
  } 

  \context { \Staff
    % modifier l'espace libre entre Staff, le défaut est #'(-4 . 4)
    % ainsi, le Staff s'étend entre -4 et +4 de chaque côté de son axe
    % \override VerticalAxisGroup #'minimum-Y-extent = #'(-6 . 6)
  }
 
}

\score {
  \new PianoStaff <<
    \set PianoStaff.instrumentName = \markup { \bold \huge "1 " }   
    \set Score.defaultBarType = #""
    \new Staff = "up"   {
      \clef treble
      \nobar
      \autochange { \un }
    }

    \new Staff = "down" {
      \clef bass
      \nobar
    }

}

\score {
  \new PianoStaff <<
    \set PianoStaff.instrumentName = \markup { \bold \huge "2 " }   
    \set Score.defaultBarType = #""
    \new Staff = "up"   {
      \clef treble
      \nobar
      \autochange { \deux }
    }

    \new Staff = "down" {
      \clef bass
      \nobar
    }

}

%%%%%%%%%%%%%%%%

Merci encore pour le travail déjà effectué
Yves Maingoy

---

From: "Gilles THIBAULT" <[email-masked]>
Date: Wed, 14 Jan 2009 22:52:39 +0100

> Bien le bonjour à tous,
>
> La liste compte me compte depuis peu comme nouveau membre

Bienvenu ici.

> (clé de sol, clé de fa) ?

 Eh bien, c'est possible, mais c'est pas sûr que se soit souhaitable car
c'est pas très joli.(voir image ci-jointe)...
Je ne vois en effet pas d'autre solutions, pour arriver à  ce résultat, que
de rapprocher les 2 portées, ce qui peut se faire en reduisant la valeur de
\Staff.VerticalAxisGroup #'minimum-Y-extent
( (-4 . 4)  par défaut) .
Pour faire l'image jointe, j'ai simplement ajouté au début de chaque \Staff
la ligne suivante :

\override Staff.VerticalAxisGroup #'minimum-Y-extent = #'(-1 . 1).

Gilles

---

From: Bigane <[email-masked]>
Date: Wed, 14 Jan 2009 23:58:52 +0100

> \override Staff.VerticalAxisGroup #'minimum-Y-extent = #'(-1 . 1).

Bonsoir Gilles
et merci pour cette réponse rapide.

Tu as bien compris le problème posé mais effectivement, la solution de 
rapprocher les mesures n'est pas lisible et contre productive par 
rapport à l'enseignement des notes.

En fait, le but est de déplacer le do' (clé de sol) vers le bas afin 
qu'il soit bien au centre (je ne sais pas nommer autrement cette note).
Si le do' vient de la clé de fa, il faut alors le remonter.
Je suis sur la piste et deux heures de plus m'ont fait bien avancer... 
mais je débute autant en scheme et LilyPond qu'en musique.

Voici mes idées :
- créer une fonction du même genre que celle des couleurs qui sera 
appelée à chaque dessin de la note
- la fonction teste la position de la note sur la portée (le mieux c'est 
un test sur la note elle même, mais je n'ai pas d'exemple pour apprendre 
à le faire).
- la fonction retourne un déplacement vertical de la note (-y, +y ou 0) 
suivant qu'on est sur un do de telle ou telle portée ou sur une autre note.
- le résultat de la fonction est évalué pour chaque note

Une note étant un objet graphique sur la portée, on peut utiliser la 
propriété suivante pour la déplacer (merci la doc) :
   extra-offset (pair of numbers)
C'est un décalage (en position sur staff) pour déplacer l'objet. Ce 
décallage n'intervient pas dans les calculs de positonnement.
Ainsi, on devrait avoir quelque chose du genre :
 \override Staff.NoteHead #'extra-offset = #deplacer
Avec la fonction deplacer qui fourni un décalage positif, négatif ou null.

Voici donc un premier jet très proche de ce que je veux obtenir.
Mais il reste encore les petits traits noir à colorier et déplacer... et 
là je ne connais pas leur nom dans LiliPond.
De plus l'utilisation du modulo pour trouver les notes à déplacer n'est 
pas bon.
Un adressage absolu serait plus simple (soit quelle est la 
'staff-position du do' de la clé de sol et celle du do' de la clé de fa).

Yves

%%%%%%%%%%%%%%%%

\version "2.12.1"
\include "italiano.ly"

\paper{
  %paper-width = 2\cm
  top-margin = 3\cm
  bottom-margin = 3\cm
  ragged-last-bottom = ##t
  indent = #0 % évite le retrait de la première portée
  %between-system-padding = #2.0 % espace entre les portées

}

#(define (deplacer grob)
  "Deplace la note si c'est un do"
  (let ((st-position (modulo (ly:grob-property grob 'staff-position) 7) ))
    (cond
      ((= st-position 1) '(0 . -1.25))
      ((= st-position 6) '(0 . +1.25))
      (else              '(0 .  0))
    )
  )
)

#(define (colorier grob)
  (let ((mod-position (modulo (ly:grob-property grob 'staff-position) 7) ))

nobar = {
    \override Staff.NoteHead #'color = #colorier
    \override Staff.NoteHead #'extra-offset = #deplacer
    \override Staff.TimeSignature #'stencil = ##f
    \override Staff.Stem #'transparent = ##t
}

\header {

  % au centre
  %dedication = ""

  % invisible
  %enteredby = "Moi"
 
  % a gauche
  %piece = "nom"

  % a droite
  %composer = ""
 
  % en bas de page
 
  % tag de lilypond :
  tagline = ""
}

un = {

deux = {

\layout {
  ragged-right = ##f

  \context { \Score

  \context { \Staff
 
}

\score {
  \new PianoStaff <<

    \new Staff = "down" {
      \clef bass
      \nobar
    }

}

\score {
  \new PianoStaff <<

    \new Staff = "down" {
      \clef bass
      \nobar
    }

}

%%%%%%%%%%%%%%%%

---

From: "Gilles THIBAULT" <[email-masked]>
Date: Thu, 15 Jan 2009 09:15:31 +0100

> Si le do' vient de la clé de fa, il faut alors le remonter.

Dans la convention musicale, les lignes supplémentaires (pour les notes au 
dessus ou au dessous de la portée), doivent être espacée de la même 
distance, que celle séparant  2 lignes à l'intérieur de la portée.
Une ligne supplémentaire c'est en faite une ligne normale de portée, 
simplement raccourcie.
Si on descend un do grave en clef de sol plus bas que sa position 
traditionnelle, on confondra  cette note  avec un la ou un fa au dessous du 
do, auquel il manque des lignes supplémentaires.

Gilles

---

From: Bigane <[email-masked]>
Date: Fri, 16 Jan 2009 01:19:50 +0100

Gilles THIBAULT a écrit :
> Dans la convention musicale, les lignes supplémentaires (pour les 
> notes au dessus ou au dessous de la portée), doivent être espacée de 
> la même distance, que celle séparant  2 lignes à l'intérieur de la 
> portée.
> traditionnelle, on confondra  cette note  avec un la ou un fa au 
> dessous du do, auquel il manque des lignes supplémentaires.
>
> Gilles
>
Bonsoir Gilles,

Merci pour cette précision et pense qu'elle est justifiée lorsqu'on crée 
une partition qui se doit de respecter les normes visuelles habituelles.
C'est même, je pense, un des détails qui font que des musiciens avertis 
jugent de la qualité d'une méthode par rapport à une autre.

Cependant, je n'en démord pas. Ce n'est pas moi (humble débutant) qui ai 
créé cette partition peu conventionnelle ( 
http://www.musicroom.fr/fr-FR/imagezoom.aspx?product_id=379784 ).
Moi, je ne m'intéresse qu'au défi que représente LilyPond (ma passion 
c'est l'informatique), et la seule partition que je suis actuellement 
capable de déchiffrer se situe dans cette méthode.

En fait je me suis dit : si un éditeur peut créer une partition de ce 
genre, alors LilyPond devrait pouvoir faire aussi bien, sinon mieux, car 
c'est son but.
Donc, j'ai relevé le défi. Ce qui me permet de lire et de relire des 
partitions et ... également de découvrir des petites merveilles sur vos 
sites respectifs.

Après avoir lu la doc en Français, j'ai parcouru celle en anglais puis 
je me suis attaqué à scheme et aux codes sources de LilyPond.
J'ai ainsi trouvé un livre en anglais assez bien fait sur ce langage, en 
anglais et de 670 pages.  Il est totalement consultable en ligne :
http://books.google.fr/books?id=yYyVRueWlZ8C&pg=PA1#PPR1,M1

Finalement, dès que j'aurais repéré la méthode qui dessine ces lignes 
supplémentaires pour les notes au dessus ou au dessous de la portée tout 
sera plus simple et j'en aurais plus pour très longtemps.

Merci,
Bonnes productions et à bientôt
Yves

---

From: "Gilles THIBAULT" <[email-masked]>
Date: Fri, 16 Jan 2009 13:14:15 +0100

> http://www.musicroom.fr/fr-FR/imagezoom.aspx?product_id=379784 ).

Ben là,on ne voit que la couverture du livre ... Dommage.

> sera plus simple et j'en aurais plus pour très longtemps.
Il sagit de l'objet LedgerLineSpanner
(c'est pas du tout facile à trouver, d'autant que même la traduction de 
Ledger (= moise) necessite un dictionnaire français (pour moi en tout cas 
qui ne suis pas charpentier...)).

> c'est l'informatique),

Fait nous quand même part de ta solution finale, car elle peut être 
instructive pour nous.

Bon courage.

Gilles

---

From: Bigane <[email-masked]>
Date: Fri, 16 Jan 2009 23:46:12 +0100

> Ben là,on ne voit que la couverture du livre ... Dommage.
J'ai cherché une page du livre mais sans succès.
> (c'est pas du tout facile à trouver, d'autant que même la traduction 
> de Ledger (= moise) necessite un dictionnaire français (pour moi en 
> tout cas qui ne suis pas charpentier...)).
>
Merci du renseignement, j'avais beau cherché je n'arrivait pas à trouver 
le nom de cet objet.
La suite semble encore plus complexe que je ne le pensais : l'objet n'a 
pas de référence claire avec la note (les notes) pour laquelle il a été 
créé.
L'évaluation des Ledgers commence au début de l'écriture d'une portée 
(qui peut être multiple). Au bout de la ligne c'est au tour des notes. 
Puis on recommence pour la portée suivante.
Aucune des propriétés de l'objet ne fait référence à une note précise 
(ce qui est normal en fait, puis qu'il peut être généré pour plusieurs 
notes). Sa position est connue mais impossible de savoir si elle se 
situe sous une portée ou au dessus, donc c'est encore négatif de ce 
côté. Reste une piste : l'objet LedgerLineSpanner supporte l'interface 
ledger-line-spanner-interface qui possède comme propriété interne une 
liste de notes (note-heads).
On pourrait donc prendre la première note de cette liste et utiliser sa 
position ou son nom pour déplacer le LedgerLineSpanner.
Seulement, mes connaissances en LilyPond  sont bien trop faibles pour 
envisager une telle manipulation.

Autre solution, on peut forcer le do' à toujours provenir  de la  clé de 
Sol. Ainsi chaque LedgerLineSpanner  est connu d'avance et peut être 
décalé vers le bas.
Là je me heurte à la commande \autochange qui distribue la position du 
do' en fonction de la note précédente...grr ... le seul moyen serait 
donc de me passer de cette commande bien sympathique.

Pour ce soir je joue la facilité : je rend invisible le trait alors que 
je pouvais le déplacer et le colorier.  On verra bien pour la solution 
finale.

> Fait nous quand même part de ta solution finale, car elle peut être 

Voici donc une solution intermédiaire sans LedgerLineSpanner en 
attendant le remplacement de \autochange.

à bientôt,
Yves

%%%%%%%%%%%%%%

\version "2.12.1"
\include "italiano.ly"

\paper{
  %paper-width = 2\cm
  top-margin = 3\cm
  bottom-margin = 3\cm
  ragged-last-bottom = ##t

#(define (deplacer grob)
  "Calcule un déplacement de la note si c'est un do"
  (let* ((p (modulo (ly:grob-property grob 'staff-position) 7) ))
    (cond
      ((= p 1) '(0 . -1.25))
      ((= p 6) '(0 .  1.25))
      (else    '(0 . 0))
    )
  )
)

#(define (colorier grob)

presentation = {

\header {

  % au centre
  %dedication = ""

  % invisible
  %enteredby = "Moi"
 
  % a gauche
  %piece = "nom"

  % a droite
  %composer = ""
 
  % en bas de page
 
  % tag de lilypond :
  tagline = ""
}

un = {
  do' si  si  do' do' re' re' do' do' si  do' do'  \break
  do' re' re' do' re' do' si  re' si  re' do' re' \bar "|."
}

deux = {

\layout {
  ragged-right = ##f

  \context { \Score

  \context { \Staff
    % tentative de déplacement de LedgerLineSpanner
    %\override LedgerLineSpanner #'color = #red
    %\override LedgerLineSpanner #'extra-offset = #'(0 . -1.25)

    \override LedgerLineSpanner #'stencil = ##f
    \override TimeSignature #'stencil = ##f
    \override Stem #'transparent = ##t
  }
 
}

\score {
  \new PianoStaff <<
      \presentation
      \autochange { \un }
    }

    \new Staff = "down" {
      \clef bass
      \presentation
    }

}

\score {
  \new PianoStaff <<
      \presentation
      \autochange { \deux }
    }

    \new Staff = "down" {
      \clef bass
      \presentation
    }

}

---

From: Bigane <[email-masked]>
Date: Thu, 22 Jan 2009 00:03:55 +0100

Bonsoir,

Voici donc le résultat avant une mise en page. C'est conforme à ce que 
je voulais obtenir.
Il me reste à espacer les partitions du bloc de texte afin d'en avoir 
six lignes au total dans une page.
J'ai aussi comme soucis les "bar"s invisibles qui espacent un peu trop 
les notes. Ce n'est pas très beau.

Sinon, je comme je le pensais, Lilypond peut faire pratiquement tout.

A+
Yves

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\version "2.12.1"

\header {
  copyrightYear = "2009"
  %title = \markup \column { \fill-line { "Entrainement" } }
  tagline = ""
}

\include "italiano.ly"
#(set-global-staff-size 16)
#(ly:set-option 'point-and-click #f) % supprime le clic http sur les notes

\layout {
  \context { \Score
    \override VerticalAlignment #'max-stretch = ##f
    \remove Bar_number_engraver % suppression des numéros de Bar
    \override LedgerLineSpanner #'color = #red
    \override LedgerLineSpanner #'extra-offset = #'(0 . -1.25)
    \override TimeSignature #'stencil = ##f
    \override Stem #'transparent = ##t
  }
}

\paper {
  #(define page-breaking ly:minimal-breaking)
  ragged-last-bottom = ##t
  indent = 10\mm % retrait de la première portée
  between-system-padding = #3.0 % espace entre les portées
}

%%%% Macros %%%%

#(define (deplacer grob)
  "Calcule un déplacement de la note si c'est un do' "
  (cond ((= -6 (ly:grob-property grob 'staff-position)) '(0 . -1.25))
        (else '(0 . 0))
  )
)
 
#(define (colorier grob)
  "Colorie certaines notes en rouge selon leur postions"
  (let ((position (ly:grob-property grob 'staff-position) ))
    (case position
      ;; Retourne une couleur selon la position de la note
      ((-6)   (x11-color 'red ))   ; do'
      (else   (x11-color 'black )) ; autres notes
    )
  )
) 

presentation = {

dropLyrics = {
  \override LyricText #'extra-offset = #'(0 . -5)
  \override LyricHyphen #'extra-offset = #'(0 . -5)
  \override LyricExtender #'extra-offset = #'(0 . -5)
}
raiseLyrics = {
  \revert LyricText #'extra-offset
  \revert LyricHyphen #'extra-offset
  \revert LyricExtender #'extra-offset
}

%%%% bookpart %%%%%

\bookpart {
  \markuplines {
   
    %%%% Texte Haut + petite partition
    \fill-line { % une ligne centrée
      \null
      \left-align \line {
        \override #'(line-width . 40) \vcenter \justify {
          Lire lentement, avec la plus grande
          régulatité, afin de bien mémoriser les
          notes repères imprimées en rouge (on
          peut utiliser le métronome, environ 60
          à la note).
        }
       
        \hspace #90
        \vcenter  \right-align \score {
          \new PianoStaff <<
            \set Score.defaultBarType = #""
            \new Staff = "upper" {
              \clef treble
              \presentation
              { s2 do'4 s4    re'4 s4 s2    do'4 s4 s2   s1 }
              \bar "|"
            }
            \addlyrics { 
                \markup { \bold \with-color #red "DO" }
                \markup { \bold "ré" }
                \markup { \bold \with-color #red "DO" }
            }
            \new Staff = "lower" {
              \clef bass
              \presentation
              { s1            s1            s1           si4  s4  s2 }
              \bar "|"
            }
            \addlyrics { 
                \markup { "si" }
            }
          \layout {
            ragged-right = ##t
           
          }
        }
      }
    }

    %%%% Partition 1a
    \fill-line {
    \score {
      \new PianoStaff <<
        \set PianoStaff.instrumentName = \markup { \bold \huge " 1" }   
        \set Score.defaultBarType = #""
        \new Staff { \clef treble \presentation
          { do'4  re' re' do' do' s4  s4  do' re' re' do' s4  \break }
        }
        \new Staff { \clef bass \presentation
          { s4    s4  s4  s4  s4  si  si  s4  s4  s4  s4  si  \break }
        }
      \layout {
        ragged-right = ##f
      }
    }
    }

    %%%% Partition 1b
    \score {
      \new PianoStaff <<
        \set PianoStaff.instrumentName = \markup { \bold \huge "  " }   
        \set Score.defaultBarType = #""
        \new Staff { \clef treble \presentation
          { do'4  s4  s4  do' s4  do' re' s4  do' s4  re' do' \bar "|." }
        }
        \new Staff { \clef bass \presentation
          { s4    si  si  s4  si  s4  s4  si  s4  si  s4  s4  \bar "|." }
        }
      \layout {
        ragged-right = ##f
      }
    }

  }
}

%%%% FIN %%%%

---

From: "Gilles THIBAULT" <[email-masked]>
Date: Thu, 22 Jan 2009 15:23:42 +0100

> Voici donc le résultat avant une mise en page. C'est conforme à ce que
Bravo !
J'avais cherché une solution à l'histoire des lignes supplémentaires qui 
aurait un extra-offset variable (+ ou - 1.25) ,
mais la solution pragmatique que tu donnes va très bien.

Gilles