Tweaks and overrides
Changing defaults
Tweaking output
Ajout d’une indication d’octave pour une seule voix
Lorsque plusieurs voix cohabitent sur une même portée, déterminer
l’octaviation d’une voix affectera la position des notes de toutes les
voix, jusqu’à la fin du crochet d’octaviation. Si l’octaviation ne doit
s’appliquer qu’à une seule voix, les positionnements du do central
(propriété middleCPosition) et du crochet d’octaviation peuvent
s’indiquer explicitement. Dans l’exemple suivant, le
middleCPosition qui a normalement une valeur de 6 en clef de fa
– soit six crans au-dessus de la ligne médiane – est déterminé à
7 crans au-dessus (une octave) pour la durée de l’ottava.
| | {
\clef bass
<< { <g d'>1~ q2 <c' e'> }
\\
{
r2.
\set Staff.ottavation = #"8vb"
\once \override Staff.OttavaBracket.direction = #DOWN
\set Voice.middleCPosition = #(+ 6 7)
<b,,, b,,>4 ~ |
q2
\unset Staff.ottavation
\unset Voice.middleCPosition
<c e>2
}
>>
}
|
Ajout de liens à des objets
La fonction add-link, telle que définie ci-dessous, permet
d’ajouter un lien au stencil d’un objet graphique. Elle s’emploie
au sein d’un \override ou d’un \tweak. À noter
que le fonctionnemment du point-and-click est perturbé sur
les objets ainsi liés.
Cette fonction n’est opérationnelle que pour une sortie PDF.
La coloration des objets liés s’obtient par une commande séparée.
| | #(define (add-link url-strg)
(lambda (grob)
(let* ((stil (ly:grob-property grob 'stencil)))
(if (ly:stencil? stil)
(begin
(let* (
(x-ext (ly:stencil-extent stil X))
(y-ext (ly:stencil-extent stil Y))
(url-expr `(url-link url-strg ,x-ext ,y-ext))
(new-stil (ly:stencil-add
(ly:make-stencil url-expr x-ext y-ext) stil)))
(ly:grob-set-property! grob 'stencil new-stil)))
#f))))
%%%% test
urlI =
"https://lilypond.org/doc/v2.14/Documentation/notation/writing-pitches"
urlII =
"https://lilypond.org/doc/v2.14/Documentation/notation/rhythms"
urlIII =
"https://lilypond.org/doc/v2.14/Documentation/notation/note-heads"
urlIV =
"https://lilypond.org/doc/v2.14/Documentation/notation/beams"
urlV =
"https://lilypond.org/doc/v2.14/Documentation/notation/note-head-styles"
\relative c' {
\key cis \minor
\once \override Staff.Clef.color = #green
\once \override Staff.Clef.after-line-breaking =
#(add-link urlI)
\once \override Staff.TimeSignature.color = #green
\once \override Staff.TimeSignature.after-line-breaking =
#(add-link urlII)
\once \override NoteHead.color = #green
\once \override NoteHead.after-line-breaking =
#(add-link urlIII)
cis'1
\once \override Beam.color = #green
\once \override Beam.after-line-breaking =
#(add-link urlIV)
cis8 dis e fis gis2
<gis,
% With 2.17.9 you could use the command below to address the Accidental.
% \tweak Accidental.before-line-breaking #(add-link url)
\tweak color #green
\tweak after-line-breaking #(add-link urlV)
\tweak style #'harmonic
bis
dis
fis
>1
<cis, cis' e>
}
|
Adding markups in a tablature
By default markups does not show in a tablature. To make them appear,
simply use the command \revert TabStaff.TextScript.stencil
| | %% http://lsr.di.unimi.it/LSR/Item?id=919
% by P.P.Schneider on June 2014
high = { r4 r8 <g c'> q r8 r4 }
low = { c4 r4 c8 r8 g,8 b, }
pulse = { s8^"1" s^"&" s^"2" s^"&" s^"3" s^"&" s^"4" s^"&" }
\score {
\new TabStaff {
\repeat unfold 2 << \high \\ \low \\ \pulse >>
}
\layout {
\context {
\TabStaff
\clef moderntab
\revert TextScript.stencil
\override TextScript.font-series = #'bold
\override TextScript.font-size = #-2
\override TextScript.color = #red
}
\context {
\Score
proportionalNotationDuration = #(ly:make-moment 1/8)
}
}
}
|
Ajout de marques temporelles à un long glissando
Lorsqu’un glissando s’étend dans la durée, on trouve parfois des
indications temporelles, matérialisées par des hampes sans tête de note.
De telles hampes permettent aussi d’indiquer des éléments
intermédiaires.
L’alignement des hampes avec la ligne de glissando peut requérir
quelques aménagements.
| | glissandoSkipOn = {
\override NoteColumn.glissando-skip = ##t
\hide NoteHead
\override NoteHead.no-ledgers = ##t
}
glissandoSkipOff = {
\revert NoteColumn.glissando-skip
\undo \hide NoteHead
\revert NoteHead.no-ledgers
}
\relative c'' {
r8 f8\glissando
\glissandoSkipOn
f4 g a a8\noBeam
\glissandoSkipOff
a8
r8 f8\glissando
\glissandoSkipOn
g4 a8
\glissandoSkipOff
a8 |
r4 f\glissando \<
\glissandoSkipOn
a4\f \>
\glissandoSkipOff
b8\! r |
}
|
Ajustement de l’espacement des notes d’ornement
La propriété spacing-increment de Score.GraceSpacing
permet d’ajuster l’espacement d’un groupe de notes d’ornement.
| | graceNotes = {
\grace { c4 c8 c16 c32 }
c8
}
\relative c'' {
c8
\graceNotes
\override Score.GraceSpacing.spacing-increment = #2.0
\graceNotes
\revert Score.GraceSpacing.spacing-increment
\graceNotes
}
|
Ajustement de l’espacement vertical des paroles
Cet extrait illustre la manière de réduire l’espace entre la ligne de
paroles et la portée.
| | % Default layout:
<<
\new Staff \new Voice = melody \relative c' {
c4 d e f
g4 f e d
c1
}
\new Lyrics \lyricsto melody { aa aa aa aa aa aa aa aa aa }
\new Staff {
\new Voice = melody \relative c' {
c4 d e f
g4 f e d
c1
}
}
% Reducing the minimum space below the staff and above the lyrics:
\new Lyrics \with {
\override VerticalAxisGroup.nonstaff-relatedstaff-spacing =
#'((basic-distance . 1))
}
\lyricsto melody { aa aa aa aa aa aa aa aa aa }
>>
|
Modification de la hauteur de hampes ligaturées
La hauteur de hampe des notes ligaturées est gérée par la sous-propriété
beamed-lengths des details de l’objet Stem.
Lorsqu’elle ne comporte qu’une seule valeur, cette hauteur s’appliquera
à toutes les hampes. En présence de plusieurs arguments, le premier
affectera les croches, le second les doubles croches, et ainsi de suite.
Le dernier argument s’appliquera aussi aux notes de plus courte durée.
Les arguments peuvent être des valeurs décimales.
| | \relative c'' {
\override Stem.details.beamed-lengths = #'(2)
a8[ a] a16[ a] a32[ a]
\override Stem.details.beamed-lengths = #'(8 10 12)
a8[ a] a16[ a] a32[ a] r8
\override Stem.details.beamed-lengths = #'(8)
a8[ a]
\override Stem.details.beamed-lengths = #'(8.5)
a8[ a]
\revert Stem.details
a8[ a] a16[ a] a32[ a] r16
}
|
Numérotation des mesures et alternatives
Deux méthodes alternatives vous permettent de gérer la numérotation des
mesures en cas de reprises.
| | \relative c'{
\set Score.alternativeNumberingStyle = #'numbers
\repeat volta 3 { c4 d e f | }
\alternative {
{ c4 d e f | c2 d \break }
{ f4 g a b | f4 g a b | f2 a | \break }
{ c4 d e f | c2 d }
}
c1 \break
\set Score.alternativeNumberingStyle = #'numbers-with-letters
\repeat volta 3 { c,4 d e f | }
\alternative {
{ c4 d e f | c2 d \break }
{ f4 g a b | f4 g a b | f2 a | \break }
{ c4 d e f | c2 d }
}
c1
}
|
Crochets d’analyse au-dessus de la portée
Les crochets d’analyse viennent par défaut se positionner au-dessous de
la portée. L’exemple suivant vous indique comment les faire apparaître
en surplomb de la portée.
| | \layout {
\context {
\Voice
\consists "Horizontal_bracket_engraver"
}
}
\relative c'' {
\once \override HorizontalBracket.direction = #UP
c2\startGroup
d2\stopGroup
}
|
Crochet d’analyse avec texte
Du texte peut venir s’ajouter aux crochets d’analyse grâce à la
propriété texte de l’objet graphique
HorizontalBracketText. Plusieurs crochets présents en un même
moment requièrent d’utiliser la commande \tweak. Le texte
ajouté sera répété, entre parenthèse, après un saut de ligne.
| | \layout {
\context {
\Voice
\consists "Horizontal_bracket_engraver"
\override HorizontalBracket.direction = #UP
}
}
{
\once\override HorizontalBracketText.text = "a"
c''\startGroup d''\stopGroup
\once\override HorizontalBracketText.text = "a'"
e''\startGroup d''\stopGroup
c''
-\tweak HorizontalBracketText.text \markup \bold \huge "b" \startGroup
-\tweak HorizontalBracketText.text "a" \startGroup
d''\stopGroup
e''-\tweak HorizontalBracketText.text "a'" \startGroup
d''\stopGroup\stopGroup
c''-\tweak HorizontalBracketText.text foo \startGroup d'' e'' f''
\break
g'' a'' b'' c'''\stopGroup
}
|
Liaison asymétrique
Une liaison peut adopter une courbe asymétrique afin de s’adapter au
mieux à la ligne mélodique.
| | slurNotes = { d,8( a' d f a f' d, a) }
\relative c' {
\stemDown
\slurUp
\slurNotes
\once \override Slur.eccentricity = #3.0
\slurNotes
}
|
Césure en forme de « voie de chemin de fer » avec point d’orgue
Une césure peut parfois s’indiquer par une double respiration surmontée
d’un point d’orgue. Le code ci-dessous permet d’obtenir la combinaison
répondant à cette esthétique.
| | \relative c'' {
c2.
% construct the symbol
\override BreathingSign.text = \markup {
\override #'(direction . 1)
\override #'(baseline-skip . 1.8)
\dir-column {
\translate #'(0.155 . 0)
\center-align \musicglyph "scripts.caesura.curved"
\center-align \musicglyph "scripts.ufermata"
}
}
\breathe c4
% set the breathe mark back to normal
\revert BreathingSign.text
c2. \breathe c4
\bar "|."
}
|
Modification de la taille d’une note particulière d’un accord
La commande \tweak permet de modifier la propriété
font-size d’une note particulière d’un accord.
Il s’agit de placer, à l’intérieur même de l’accord (dans la
construction < >) et avant la note considérée, l’instruction
\tweak suivie de font-size et de définir la taille voulue
– comme #-2 pour une petite tête.
| | \relative c' {
<\tweak font-size #+2 c e g c
\tweak font-size #-2 e>1
^\markup { A tiny e }_\markup { A big c }
}
|
Changing beam thickness and spacing
To make beams thicker or thinner alter the Beam.beam-thickness
property. To adjust the spacing between beams alter the
Beam.length-fraction property.
| | \relative f' {
\time 1/8
\override Beam.beam-thickness = #0.4
\override Beam.length-fraction = #0.8
c32 c c c
\revert Beam.beam-thickness % 0.48 is default thickness
\revert Beam.length-fraction % 1.0 is default spacing
c32 c c c
\override Beam.beam-thickness = #0.6
\override Beam.length-fraction = #1.3
c32 c c c
}
|
Modifier l’apparence d’un silence multimesure
Dans le cas où ce silence dure moins de dix mesures, LilyPond imprime sur
la portée des « silences d’église » – Kirchenpause en
allemand – et qui sont une simple suite de rectangles. La propriété
expand-limit permet d’obtenir un silence unique :
| | \relative c'' {
\compressMMRests {
R1*2 | R1*5 | R1*9
\override MultiMeasureRest.expand-limit = #3
R1*2 | R1*5 | R1*9
}
}
|
Modification des propriétés d’objets particuliers
La commande \applyOutput permet de personnaliser n’importe quel
objet de rendu. Elle requiert une fonction Scheme à trois arguments.
| | #(define (mc-squared grob grob-origin context)
(let ((sp (ly:grob-property grob 'staff-position)))
(ly:grob-set-property!
grob 'stencil
(grob-interpret-markup grob
#{ \markup \lower #0.5
#(case sp
((-5) "m")
((-3) "c ")
((-2) #{ \markup \teeny \bold 2 #})
(else "bla")) #}))))
\relative c' {
<d f g b>2
\applyOutput Voice.NoteHead #mc-squared
<d f g b>2
}
|
Modifidation du texte et de l’extension de nuances textuelles
Le texte par défaut des crescendos et decrescendos se change en
modifiant les propriétés de contexte crescendoText et
decrescendoText. L’aspect de la ligne d’extension est fonction
de la propriété style du DynamicTextSpanner. Sa valeur
par défaut est 'hairpin, mais d’autres valeurs sont disponibles,
comme 'line, 'dashed-line et 'dotted-line.
| | \relative c'' {
\set crescendoText = \markup { \italic { cresc. poco } }
\set crescendoSpanner = #'text
\override DynamicTextSpanner.style = #'dotted-line
a2\< a
a2 a
a2 a
a2 a\mf
}
|
Changement des fontes textuelles par défaut
Les familles de fontes par défaut pour le texte peuvent être changées à
l’aide de la fonction make-pango-font-tree.
| | \paper {
% change for other default global staff size.
myStaffSize = #20
%{
run
lilypond -dshow-available-fonts
to show all fonts available in the process log.
%}
#(define fonts
(make-pango-font-tree "Times New Roman"
"Nimbus Sans,Nimbus Sans L"
"Luxi Mono"
;; "Helvetica"
;; "Courier"
(/ myStaffSize 20)))
}
\relative c'' {
c4^\markup {
roman: foo \bold bla \italic bar \italic \bold baz
}
c'4_\markup {
\override #'(font-family . sans)
{
sans: foo \bold bla \italic bar \italic \bold baz
}
}
c'2^\markup {
\override #'(font-family . typewriter)
{
mono: foo \bold bla \italic bar \italic \bold baz
}
}
}
|
Modification de la taille d’une portée
Bien que le meilleur moyen de définir la taille des portées consiste à
utiliser #(set-global-staff-size xx), une portée en particulier
peut se redimensionner en affectant d’un coefficient ses propriétés
staff-space et fontSize.
| | <<
\new Staff {
\relative c'' {
\dynamicDown
c8\ff c c c c c c c
}
}
\new Staff \with {
fontSize = #-3
\override StaffSymbol.staff-space = #(magstep -3)
} {
\clef bass
c8 c c c c\f c c c
}
>>
|
Changement de tempo sans indication sur la partition
Vous pouvez indiquer un changement de tempo pour le fichier MIDI sans
pour autant l’imprimer. Il suffit alors de le rendre invisible aux
musiciens.
| | \score {
\new Staff \relative c' {
\tempo 4 = 160
c4 e g b
c4 b d c
\set Score.tempoHideNote = ##t
\tempo 4 = 96
d,4 fis a cis
d4 cis e d
}
\layout { }
\midi { }
}
|
Modification du texte des indications de pédale
Staff.pedalSustainStrings permet de définir le texte affiché pour
les instructions de pédale. Les seuls caractères autorisés sont les
glyphes particuliers de pédale, comme vous pouvez le constater ici.
| | sustainNotes = { c4\sustainOn d e\sustainOff\sustainOn f\sustainOff }
\relative c' {
\sustainNotes
\set Staff.pedalSustainStrings = #'("P" "P-" "-")
\sustainNotes
\set Staff.pedalSustainStrings = #'("d" "de" "e")
\sustainNotes
\set Staff.pedalSustainStrings = #'("M" "M-" "-")
\sustainNotes
\set Staff.pedalSustainStrings = #'("Ped" "*Ped" "*")
\sustainNotes
}
|
Contrôle de la visibilité des extensions d’objet après saut de ligne
La visibilité des extensions qui se terminent sur la première note après
un saut de ligne est contrôlée par un appel de after-line-breaking
à la fonction ly:spanner::kill-zero-spanned-time.
Pour des objets tels qu’un glissando ou un soufflet, le comportement
par défaut est de ne pas être reportés après un saut de ligne.
L’extension sera donc reprise dès lors que l’appel aura été désactivé.
Il en va inversement pour les extensions qui, par défaut pour les textes
notamment, sont reportées après un saut de ligne ; il faudra alors
activer l’appel pour empêcher leur report.
| | \paper { ragged-right = ##t }
\relative c'' {
\override Hairpin.to-barline = ##f
\override Glissando.breakable = ##t
% show hairpin
\override Hairpin.after-line-breaking = ##t
% hide text span
\override TextSpanner.after-line-breaking =
#ly:spanner::kill-zero-spanned-time
e2\<\startTextSpan
% show glissando
\override Glissando.after-line-breaking = ##t
f2\glissando
\break
f,1\!\stopTextSpan
}
|
Contrôle de l’ordre vertical des articulations et ornements
Les symboles s’ordonnent verticalement suivant la propriété
script-priority. Plus sa valeur numérique est faible, plus le
symbole sera proche de la note. Dans l’exemple suivant, l’objet
TextScript – le dièse – a d’abord la propriété la plus basse et
se voit donc placé au plus près de la note ; ensuite, c’est l’objet
Script – le mordant – qui a la propriété la plus basse, et se
place alors sous le dièse. Lorsque deux objets ont la même priorité,
c’est l’ordre dans lequel ils sont indiqués qui détermine lequel sera
placé en premier.
| | \relative c''' {
\once \override TextScript.script-priority = #-100
a2^\prall^\markup { \sharp }
\once \override Script.script-priority = #-100
a2^\prall^\markup { \sharp }
}
|
Contrôle de l’impression des crochets de n-olet
Selon la tradition, les crochets indicateurs de n-olet sont toujours
imprimés, sauf dans le cas où ils seraient de la même longueur qu’une
ligature. LilyPond permet, au travers de la propriété
bracket-visibility, de contôler précisément leur affichage :
déterminée à #t, ils seront toujours imprimés ; #f permet
de ne jamais les imprimer – donc omettre l’objet TupletBracket
–, et #'if-no-beam les imprimera en l’absence de ligature
(comportement par défaut).
| | music = \relative c'' {
\tuplet 3/2 { c16[ d e } f8]
\tuplet 3/2 { c8 d e }
\tuplet 3/2 { c4 d e }
}
\new Voice {
\relative c' {
<< \music s4^"default" >>
\override TupletBracket.bracket-visibility = #'if-no-beam
<< \music s4^"'if-no-beam" >>
\override TupletBracket.bracket-visibility = ##t
<< \music s4^"#t" >>
\override TupletBracket.bracket-visibility = ##f
<< \music s4^"#f" >>
\omit TupletBracket
<< \music s4^"omit" >>
}
}
|
Création d’un grupetto retardé
Obtenir un grupetto retardé et dans lequel la note la plus basse
est altérée requiert quelques surcharges. La propriété
outside-staff-priority doit être désactivée (#f) pour
éviter qu’elle prenne le pas sur la propriété avoid-slur.
L’ajustement du positionnement horizontal s’effectue en jouant sur les
fractions 2/3 et 1/3.
| | \relative c'' {
c2*2/3 ( s2*1/3\turn d4) r
<<
{ c4.( d8) }
{ s4 s\turn }
>>
\transpose c d \relative c'' <<
{ c4.( d8) }
{
s4
\once \set suggestAccidentals = ##t
\once \override AccidentalSuggestion.outside-staff-priority = ##f
\once \override AccidentalSuggestion.avoid-slur = #'inside
\once \override AccidentalSuggestion.font-size = -3
\once \override AccidentalSuggestion.script-priority = -1
\single \hideNotes
b8-\turn \noBeam
s8
}
>>
}
|
Création d’armures personnalisées
LilyPond accepte les armures personnalisées. Dans cet exemple, il
s’agit d’une tonalité de ré mineur à laquelle on rajoute des bémols.
| | \new Staff \with {
\override StaffSymbol.line-count = #8
\override KeySignature.flat-positions = #'((-7 . 6))
\override KeyCancellation.flat-positions = #'((-7 . 6))
% presumably sharps are also printed in both octaves
\override KeySignature.sharp-positions = #'((-6 . 7))
\override KeyCancellation.sharp-positions = #'((-6 . 7))
\override Clef.stencil = #
(lambda (grob)(grob-interpret-markup grob
#{ \markup\combine
\musicglyph "clefs.C"
\translate #'(-3 . -2)
\musicglyph "clefs.F"
#}))
clefPosition = #3
middleCPosition = #3
middleCClefPosition = #3
}
{
\key d\minor
f bes, f bes,
}
|
Création de doigtés sur deux caractères
Il est tout à fait possible de noter un doigté supérieur à 5.
| | \relative c' {
c1-10
c1-50
c1-36
c1-29
}
|
Création de repères simultanés
Les indications de repère, à la différence des scripts textuels, ne
peuvent s’empiler en un même endroit de la partition : il n’est
possible de créer qu’un seul objet RehearsalMark à la fois. Le
recours à une mesure invisible et à une barre de mesure permet cependant
d’ajouter une autre indication de repère, donnant ainsi l’impression
d’un double repère sur la même colonne. Cette méthode permet aussi
de positionner un repère en fin de ligne et un autre au début de la
ligne suivante.
| | {
\key a \major
\set Score.markFormatter = #format-mark-box-letters
\once \override Score.RehearsalMark.outside-staff-priority = #5000
\once \override Score.RehearsalMark.self-alignment-X = #LEFT
\once \override Score.RehearsalMark.break-align-symbols = #'(key-signature)
\mark \markup { \bold { Senza denti } }
% the hidden measure and bar line
% \cadenzaOn turns off automatic calculation of bar numbers
\cadenzaOn
\once \override Score.TimeSignature.stencil = ##f
\time 1/16
s16 \bar ""
\cadenzaOff
\time 4/4
\once \override Score.RehearsalMark.self-alignment-X = #LEFT
\mark \markup { \box \bold Intro }
d'1
\mark \default
d'1
}
|
Création d’extensions de texte
Les commandes \startTextSpan et \stopTextSpan permettent
d’ajouter une ligne de prolongation aux indications textuelles, à
l’instar des indications de pédale ou d’octaviation. Jouer sur les
propriétés de l’objet TextSpanner permet d’en modifier le rendu.
| | \paper { ragged-right = ##f }
\relative c'' {
\override TextSpanner.bound-details.left.text = #"bla"
\override TextSpanner.bound-details.right.text = #"blu"
a4 \startTextSpan
b4 c
a4 \stopTextSpan
\override TextSpanner.style = #'line
\once \override TextSpanner.bound-details.left.stencil-align-dir-y = #CENTER
a4 \startTextSpan
b4 c
a4 \stopTextSpan
\override TextSpanner.style = #'dashed-line
\override TextSpanner.bound-details.left.text =
\markup { \draw-line #'(0 . 1) }
\override TextSpanner.bound-details.right.text =
\markup { \draw-line #'(0 . -2) }
\once \override TextSpanner.bound-details.right.padding = #-2
a4 \startTextSpan
b4 c
a4 \stopTextSpan
\set Staff.middleCPosition = #-13
\override TextSpanner.dash-period = #10
\override TextSpanner.dash-fraction = #0.5
\override TextSpanner.thickness = #10
a4 \startTextSpan
b4 c
a4 \stopTextSpan
}
|
Accord distribué et problème de hampe - solution
Il est parfois préférable d’utiliser les hampes de la portée supérieure
pour créer des accords distribués, afin d’éviter tout risque de
collision au niveau des ligatures automatiques. Dans l’exemple suivant,
le fait de partir des hampes de la portée inférieure aurait rendu
nécessaire l’adaptation du détecteur de collision des ligatures, par une
clause \override Staff.Beam.collision-voice-only = ##t, afin
qu’il ne tienne pas compte des collisions entre portées.
| | \new PianoStaff <<
\new Staff = up
\relative c' {
<<
{ r4
\override Stem.cross-staff = ##t
\override Stem.length = #19 % this is in half-spaces,
% so it makes stems 9.5 staffspaces long
\override Stem.Y-offset = #-6 % stems are normally lengthened
% upwards, so here we must lower the stem by the amount
% equal to the lengthening - in this case (19 - 7) / 2
% (7 is default stem length)
e e e }
{ s4
\change Staff = "bottom"
\override NoteColumn.ignore-collision = ##t
c, c c
}
>>
}
\new Staff = bottom
\relative c' {
\clef bass
\voiceOne
g8 a g a g a g a
}
>>
|
Hampes interportées
L’exemple ci-dessous illustre l’utilisation du Span_stem_engraver
et de la commande \crossStaff afin de connecter des hampes entre
les portées.
Nul n’est besoin de spécifier la taille des hampes ; le graveur calcule
automatiquement la distance relative des têtes de note avec les portées.
| | \layout {
\context {
\PianoStaff
\consists #Span_stem_engraver
}
}
{
\new PianoStaff <<
\new Staff {
<b d'>4 r d'16\> e'8. g8 r\!
e'8 f' g'4 e'2
}
\new Staff {
\clef bass
\voiceOne
\autoBeamOff
\crossStaff { <e g>4 e, g16 a8. c8} d
\autoBeamOn
g8 f g4 c2
}
>>
}
|
Guidons
Les guidons peuvent adopter différents styles.
| | \layout { ragged-right = ##t }
\new Staff \with { \consists "Custos_engraver" } \relative c' {
\override Staff.Custos.neutral-position = #4
\override Staff.Custos.style = #'hufnagel
c1^"hufnagel" \break
<d a' f'>1
\override Staff.Custos.style = #'medicaea
c1^"medicaea" \break
<d a' f'>1
\override Staff.Custos.style = #'vaticana
c1^"vaticana" \break
<d a' f'>1
\override Staff.Custos.style = #'mensural
c1^"mensural" \break
<d a' f'>1
}
|
Personnalisation de diagrammes de fret
Les propriétés d’un diagramme de fret sont définies par les
fret-diagram-details. En matière de diagramme de fret, les
adaptations s’appliquent à l’objet FretBoards.FretBoard. Un
FretBoards est comparable à un Voice : il s’agit
d’un contexte du plus bas niveau, et il n’est donc pas primordial de
l’instancier de manière explicite pour adapter ses propriétés.
| | \include "predefined-guitar-fretboards.ly"
\storePredefinedDiagram #default-fret-table \chordmode { c' }
#guitar-tuning
#"x;1-1-(;3-2;3-3;3-4;1-1-);"
<<
\new ChordNames {
\chordmode { c1 | c | c | d }
}
\new FretBoards {
% Set global properties of fret diagram
\override FretBoards.FretBoard.size = #'1.2
\override FretBoard.fret-diagram-details.finger-code = #'in-dot
\override FretBoard.fret-diagram-details.dot-color = #'white
\chordmode {
c
\once \override FretBoard.size = #'1.0
\once \override FretBoard.fret-diagram-details.barre-type = #'straight
\once \override FretBoard.fret-diagram-details.dot-color = #'black
\once \override FretBoard.fret-diagram-details.finger-code = #'below-string
c'
\once \override FretBoard.fret-diagram-details.barre-type = #'none
\once \override FretBoard.fret-diagram-details.number-type = #'arabic
\once \override FretBoard.fret-diagram-details.orientation = #'landscape
\once \override FretBoard.fret-diagram-details.mute-string = #"M"
\once \override FretBoard.fret-diagram-details.label-dir = #LEFT
\once \override FretBoard.fret-diagram-details.dot-color = #'black
c'
\once \override FretBoard.fret-diagram-details.finger-code = #'below-string
\once \override FretBoard.fret-diagram-details.dot-radius = #0.35
\once \override FretBoard.fret-diagram-details.dot-position = #0.5
\once \override FretBoard.fret-diagram-details.fret-count = #3
d
}
}
\new Voice {
c'1 | c' | c' | d'
}
>>
|
Personnalisation des diagrammes de fret
Les propriétés d’un diagramme de fret sont modifiables grâce au
fret-diagram-details. Lorsqu’ils sont générés sous forme
de \markup, rien n’empêche de modifier les diagrammes en jouant
sur les réglages de l’objet Voice.TextScript ou bien directement
sur le markup.
| | <<
\chords { c1 | c | c | d }
\new Voice = "mel" {
\textLengthOn
% Set global properties of fret diagram
\override TextScript.size = #'1.2
\override TextScript.fret-diagram-details.finger-code = #'in-dot
\override TextScript.fret-diagram-details.dot-color = #'white
%% C major for guitar, no barre, using defaults
% terse style
c'1^\markup { \fret-diagram-terse "x;3-3;2-2;o;1-1;o;" }
%% C major for guitar, barred on third fret
% verbose style
% size 1.0
% roman fret label, finger labels below string, straight barre
c'1^\markup {
% standard size
\override #'(size . 1.0) {
\override #'(fret-diagram-details . (
(number-type . roman-lower)
(finger-code . in-dot)
(barre-type . straight))) {
\fret-diagram-verbose #'((mute 6)
(place-fret 5 3 1)
(place-fret 4 5 2)
(place-fret 3 5 3)
(place-fret 2 5 4)
(place-fret 1 3 1)
(barre 5 1 3))
}
}
}
%% C major for guitar, barred on third fret
% verbose style
% landscape orientation, arabic numbers, M for mute string
% no barre, fret label down or left, small mute label font
c'1^\markup {
\override #'(fret-diagram-details . (
(finger-code . below-string)
(number-type . arabic)
(label-dir . -1)
(mute-string . "M")
(orientation . landscape)
(barre-type . none)
(xo-font-magnification . 0.4)
(xo-padding . 0.3))) {
\fret-diagram-verbose #'((mute 6)
(place-fret 5 3 1)
(place-fret 4 5 2)
(place-fret 3 5 3)
(place-fret 2 5 4)
(place-fret 1 3 1)
(barre 5 1 3))
}
}
%% simple D chord
% terse style
% larger dots, centered dots, fewer frets
% label below string
d'1^\markup {
\override #'(fret-diagram-details . (
(finger-code . below-string)
(dot-radius . 0.35)
(dot-position . 0.5)
(fret-count . 3))) {
\fret-diagram-terse "x;x;o;2-1;3-2;2-3;"
}
}
}
>>
|
Indicateur de regroupement et portée unique
Lorsque, dans des regroupements de type ChoirStaff ou
StaffGroup, une seule portée est active, aucune indication n’est
donnée en début de ligne. Affecter à la propriété
collapse-height un nombre de lignes inférieur à celui de la
portée permet de modifier ce comportement par défaut.
Notez bien que dans le cas des PianoStaff et GrandStaff,
pour lesquels le délimiteur de système est une accolade et non un
crochet, il ne s’agit pas de la même propriété – voir le deuxième
système de l’exemple.
| | \score {
\new StaffGroup <<
% Must be lower than the actual number of staff lines
\override StaffGroup.SystemStartBracket.collapse-height = #4
\override Score.SystemStartBar.collapse-height = #4
\new Staff {
c'1
}
>>
}
\score {
\new PianoStaff <<
\override PianoStaff.SystemStartBrace.collapse-height = #4
\override Score.SystemStartBar.collapse-height = #4
\new Staff {
c'1
}
>>
}
|
Affichage de la généalogie d’un objet
Lorsque l’on manipule des rappels d’objet (grob callbacks), il
peut être intéressant d’en maîtriser les ascendants. La plupart des
objets graphiques ont des parents, lesquels auront une influence sur le
positionnement de l’objet en question. Ainsi, les parents des côtés X
et Y influenceront respectivement les positions horizontale et verticale
de l’objet. De plus, chacun des parents peut avoir ses propres parents.
Certains aspects de la lignée d’un objet peuvent toutefois porter à
confusion :
– Les types de parents d’un grob peuvent dépendre du contexte.
– Dans le cas de certains grobs, les parents X et Y peuvent être
le même.
– Un « ascendant » particulier peut dépendre d’un grob de
différentes manières.
– Le concept de « générations » est trompeur.
Par exemple, l’objet System peut, vis à vis d’un objet
VerticalAlignment, être à la fois parent (par son côté Y) et
grand parent (par deux fois du côté X).
La macro ci-dessous affiche à l’écran une représentation textuelle de
l’ascendance d’un grob.
Elle se lance ainsi :
{ \once \override NoteHead.before-line-breaking =
#display-ancestry c }
et génère la sortie suivante :
NoteHead X,Y: NoteColumn
X: PaperColumn
X,Y: System
Y: VerticalAxisGroup
X: NonMusicalPaperColumn
X,Y: System
Y: VerticalAlignment
X: NonMusicalPaperColumn
X,Y: System
Y: System
| | %% http://lsr.di.unimi.it/LSR/Item?id=622
%% see also http://www.lilypond.org/doc/v2.18/Documentation/snippets/tweaks-and-overrides#tweaks-and-overrides-displaying-grob-ancestry
%% Remark:
%% grob::name is in the source since 2.19.x could be deleted during next LSR-upgrade
#(define (grob::name grob)
(assq-ref (ly:grob-property grob 'meta) 'name))
#(define (get-ancestry grob)
(if (not (null? (ly:grob-parent grob X)))
(list (grob::name grob)
(get-ancestry (ly:grob-parent grob X))
(get-ancestry (ly:grob-parent grob Y)))
(grob::name grob)))
#(define (format-ancestry lst padding)
(string-append
(symbol->string (car lst))
"\n"
(let ((X-ancestry
(if (list? (cadr lst))
(format-ancestry (cadr lst) (+ padding 3))
(symbol->string (cadr lst))))
(Y-ancestry
(if (list? (caddr lst))
(format-ancestry (caddr lst) (+ padding 3))
(symbol->string (caddr lst)))))
(if (equal? X-ancestry Y-ancestry)
(string-append
(format #f "~&")
(make-string padding #\space)
"X,Y: "
(if (list? (cadr lst))
(format-ancestry (cadr lst) (+ padding 5))
(symbol->string (cadr lst))))
(string-append
(format #f "~&")
(make-string padding #\space)
"X: " X-ancestry
"\n"
(make-string padding #\space)
"Y: " Y-ancestry
(format #f "~&"))))
(format #f "~&")))
#(define (display-ancestry grob)
(format (current-error-port)
"~3&~a~2%~a~&"
(make-string 36 #\-)
(if (ly:grob? grob)
(format-ancestry (get-ancestry grob) 0)
(format #f "~a is not a grob" grob))))
\relative c' {
\once \override NoteHead.before-line-breaking = #display-ancestry
f4
\once \override Accidental.before-line-breaking = #display-ancestry
\once \override Arpeggio.before-line-breaking = #display-ancestry
<f as c>4\arpeggio
}
|
Harmoniques pointées
Les notes harmoniques artificielles, obtenues grâce à \harmonic,
ne sont pas pointées. Ce comportement peut être modifié en activant la
propriété de contexte harmonicDots.
| | \relative c''' {
\time 3/4
\key f \major
\set harmonicDots = ##t
<bes f'\harmonic>2. ~
<bes f'\harmonic>4. <a e'\harmonic>8( <gis dis'\harmonic> <g d'\harmonic>)
<fis cis'\harmonic>2.
<bes f'\harmonic>2.
}
|
Encadrement d’objets
La fonction print peut se modifier pour obtenir l’encadrement de
n’importe quel objet.
| | \relative c'' {
\override TextScript.stencil =
#(make-stencil-boxer 0.1 0.3 ly:text-interface::print)
c'4^"foo"
\override Stem.stencil =
#(make-stencil-boxer 0.05 0.25 ly:stem::print)
\override Score.RehearsalMark.stencil =
#(make-stencil-boxer 0.15 0.3 ly:text-interface::print)
b8
\revert Stem.stencil
\revert Flag.stencil
c4. c4
\mark "F"
c1
}
|
Encercler divers objets
La commande de markup \circle permet de dessiner un
cercle autour de différents objets comme des indications de doigté.
D’autres objets nécessitent de faire appel à des techniques spécifiques.
Cet exemple illustre deux manières de procéder : pour les repères, et
pour les numéros de mesure.
| | \relative c' {
c1
\set Score.markFormatter =
#(lambda (mark context)
(make-circle-markup (format-mark-numbers mark context)))
\mark \default
c2 d^\markup {
\override #'(thickness . 3) {
\circle \finger 2
}
}
\override Score.BarNumber.break-visibility = #all-visible
\override Score.BarNumber.stencil =
#(make-stencil-circler 0.1 0.25 ly:text-interface::print)
}
|
Personnalisation des extenseurs de nuance postfix
Il s’agit de fonctions postfix pour personnaliser l’extension des
crescendos textuels. L’extension devrait débuter sur la première note
de la mesure. Il faut utiliser -\mycresc – comme une
articulation – sous peine que le départ de l’extension n’apparaisse
qu’à la note suivante.
| | % Two functions for (de)crescendo spanners where you can explicitly give the
% spanner text.
mycresc =
#(define-music-function (mymarkup) (markup?)
(make-music 'CrescendoEvent
'span-direction START
'span-type 'text
'span-text mymarkup))
mydecresc =
#(define-music-function (mymarkup) (markup?)
(make-music 'DecrescendoEvent
'span-direction START
'span-type 'text
'span-text mymarkup))
\relative c' {
c4-\mycresc "custom cresc" c4 c4 c4 |
c4 c4 c4 c4 |
c4-\mydecresc "custom decresc" c4 c4 c4 |
c4 c4\! c4 c4
}
|
Extensions de nuance postfix
Les lignes d’extension des commandes \cresc, \dim et
\decresc peuvent désormais être personnalisées facilement sous
forme d’opérateurs postfix. Soufflets et (de)crescendos peuvent
cohabiter. \< et \> produiront par défaut des
soufflets, alors que \cresc, etc. produiront une indication
textuelle avec extension.
| | % Some sample text dynamic spanners, to be used as postfix operators
crpoco =
#(make-music 'CrescendoEvent
'span-direction START
'span-type 'text
'span-text "cresc. poco a poco")
\relative c' {
c4\cresc d4 e4 f4 |
g4 a4\! b4\crpoco c4 |
c4 d4 e4 f4 |
g4 a4\! b4\< c4 |
g4\dim a4 b4\decresc c4\!
}
|
Extending a TrillSpanner
For TrillSpanner, the minimum-length property becomes
effective only if the set-spacing-rods procedure is called
explicitly. To do this, the springs-and-rods property should be
set to ly:spanner::set-spacing-rods.
| | \relative c' {
\key c\minor
\time 2/4
c16( as') c,-. des-.
\once\override TrillSpanner.minimum-length = #15
\once\override TrillSpanner.springs-and-rods = #ly:spanner::set-spacing-rods
\afterGrace es4
\startTrillSpan { d16[( \stopTrillSpan es)] }
c( c' g es c g' es d
\hideNotes
c8)
}
|
Rappel du glissando à l’occasion d’une alternative
Un glissando qui se prolonge sur plusieurs sections \alternative
peut se rappeler à l’aide d’une note d’ornement supplémentaire et
masquée, à laquelle sera attaché le départ du glissando, ce dans chaque
bloc \alternative. Cette note d’ornement devrait avoir la même
hauteur que la note où commençait le glissando originel. Ceci est géré
par une fonction musicale qui prendra en argument la hauteur de la note
d’ornement.
Dans le cadre d’un musique polyphonique, il ne faudra pas oublier
d’ajouter une note d’ornement dans toutes les autres voix afin de
préserver la synchronisation.
| | repeatGliss = #(define-music-function (grace)
(ly:pitch?)
#{
% the next two lines ensure the glissando is long enough
% to be visible
\once \override Glissando.springs-and-rods
= #ly:spanner::set-spacing-rods
\once \override Glissando.minimum-length = #3.5
\once \hideNotes
\grace $grace \glissando
#})
\score {
\relative c'' {
\repeat volta 3 { c4 d e f\glissando }
\alternative {
{ g2 d }
{ \repeatGliss f g2 e }
{ \repeatGliss f e2 d }
}
}
}
music = \relative c' {
\voiceOne
\repeat volta 2 {
g a b c\glissando
}
\alternative {
{ d1 }
{ \repeatGliss c \once \omit StringNumber e1\2 }
}
}
\score {
\new StaffGroup <<
\new Staff <<
\context Voice { \clef "G_8" \music }
>>
\new TabStaff <<
\context TabVoice { \clef "moderntab" \music }
>>
>>
}
|
Affinage des indications de pédale
Les crochets d’indication de pédale peuvent se modifier de différentes
manières.
| | \paper { ragged-right = ##f }
\relative c'' {
c2\sostenutoOn c
c2\sostenutoOff c
\once \override Staff.PianoPedalBracket.shorten-pair = #'(-7 . -2)
c2\sostenutoOn c
c2\sostenutoOff c
\once \override Staff.PianoPedalBracket.edge-height = #'(0 . 3)
c2\sostenutoOn c
c2\sostenutoOff c
}
|
Flat Ties
The function takes the default Tie.stencil as an argument,
calculating the result relying on the extents of this default. Further
tweaking is possible by overriding Tie.details.height-limit or
with \shape. It’s also possible to change the custom-definition
on the fly.
| | %% http://lsr.di.unimi.it/LSR/Item?id=1031
#(define ((flared-tie coords) grob)
(define (pair-to-list pair)
(list (car pair) (cdr pair)))
(define (normalize-coords goods x y dir)
(map
(lambda (coord)
;(coord-scale coord (cons x (* y dir)))
(cons (* x (car coord)) (* y dir (cdr coord))))
goods))
(define (my-c-p-s points thick)
(make-connected-path-stencil
points
thick
1.0
1.0
#f
#f))
;; outer let to trigger suicide
(let ((sten (ly:tie::print grob)))
(if (grob::is-live? grob)
(let* ((layout (ly:grob-layout grob))
(line-thickness (ly:output-def-lookup layout 'line-thickness))
(thickness (ly:grob-property grob 'thickness 0.1))
(used-thick (* line-thickness thickness))
(dir (ly:grob-property grob 'direction))
(xex (ly:stencil-extent sten X))
(yex (ly:stencil-extent sten Y))
(lenx (interval-length xex))
(leny (interval-length yex))
(xtrans (car xex))
(ytrans (if (> dir 0)(car yex) (cdr yex)))
(uplist
(map pair-to-list
(normalize-coords coords lenx (* leny 2) dir))))
(ly:stencil-translate
(my-c-p-s uplist used-thick)
(cons xtrans ytrans)))
'())))
#(define flare-tie
(flared-tie '((0 . 0)(0.1 . 0.2) (0.9 . 0.2) (1.0 . 0.0))))
\layout {
\context {
\Voice
\override Tie.stencil = #flare-tie
}
}
\paper { ragged-right = ##f }
\relative c' {
a4~a
\override Tie.height-limit = 4
a'4~a
a'4~a
<a,, c e a c e a c e>~ q
\break
a'4~a
\once \override Tie.details.height-limit = 14
a4~a
\break
a4~a
\once \override Tie.details.height-limit = 0.5
a4~a
\break
a4~a
\shape #'((0 . 0) (0 . 0.4) (0 . 0.4) (0 . 0)) Tie
a4~a
\break
a4~a
\once \override Tie.stencil =
#(flared-tie '((0 . 0)(0.1 . 0.4) (0.9 . 0.4) (1.0 . 0.0)))
a4~a
a4~a
\once \override Tie.stencil =
#(flared-tie '((0 . 0)(0.06 . 0.1) (0.94 . 0.1) (1.0 . 0.0)))
a4~a
}
|
Force a cancellation natural before accidentals
The following example shows how to force a natural sign before an
accidental.
| | \relative c' {
\key es \major
bes c des
\tweak Accidental.restore-first ##t
eis
}
|
Décalage horizontal forcé
Quand LilyPond est dépassé, la propriété force-hshift de l’objet
NoteColumn et des silences à hauteur déterminée peuvent
s’avérer utiles pour dicter au programme les choix de placement. On
travaille ici en espace de portée.
| | \relative c' <<
{
<d g>2 <d g>
}
\\
{
<b f'>2
\once \override NoteColumn.force-hshift = #1.7
<b f'>2
}
>>
|
Construction et développement de diagrammes de fret
Voici différentes manières d’obtenir et de personnaliser des diagrammes
de fret :
| | <<
\chords {
a2 a
\repeat unfold 3 {
c c c d d
}
}
\new Voice = "mel" {
\textLengthOn
% Set global properties of fret diagram
\override TextScript.size = #1.2
\override TextScript.fret-diagram-details.finger-code = #'below-string
\override TextScript.fret-diagram-details.dot-color = #'black
%% A chord for ukulele
a'2^\markup {
\override #'(fret-diagram-details . (
(string-count . 4)
(dot-color . white)
(finger-code . in-dot))) {
\fret-diagram "4-2-2;3-1-1;2-o;1-o;"
}
}
%% A chord for ukulele, with formatting defined in definition string
% 1.2 * size, 4 strings, 4 frets, fingerings below string
% dot radius .35 of fret spacing, dot position 0.55 of fret spacing
a'2^\markup {
\override #'(fret-diagram-details . (
(dot-color . white)
(open-string . "o"))) {
\fret-diagram "s:1.2;w:4;h:3;f:2;d:0.35;p:0.55;4-2-2;3-1-1;2-o;1-o;"
}
}
%% These chords will be in normal orientation
%% C major for guitar, barred on third fret
% verbose style
% roman fret label, finger labels below string, straight barre
c'2^\markup {
% 110% of default size
\override #'(size . 1.1) {
\override #'(fret-diagram-details . (
(number-type . roman-lower)
(finger-code . below-string)
(barre-type . straight))) {
\fret-diagram-verbose #'((mute 6)
(place-fret 5 3 1)
(place-fret 4 5 2)
(place-fret 3 5 3)
(place-fret 2 5 4)
(place-fret 1 3 1)
(barre 5 1 3))
}
}
}
%% C major for guitar, barred on third fret
%% Double barre used to test barre function
% verbose style
c'2^\markup {
% 110% of default size
\override #'(size . 1.1) {
\override #'(fret-diagram-details . (
(number-type . arabic)
(dot-label-font-mag . 0.9)
(finger-code . in-dot)
(fret-label-font-mag . 0.6)
(fret-label-vertical-offset . 0)
(label-dir . -1)
(mute-string . "M")
(xo-font-magnification . 0.4)
(xo-padding . 0.3))) {
\fret-diagram-verbose #'((mute 6)
(place-fret 5 3 1)
(place-fret 4 5 2)
(place-fret 3 5 3)
(place-fret 2 5 4)
(place-fret 1 3 1)
(barre 4 2 5)
(barre 5 1 3))
}
}
}
%% C major for guitar, with capo on third fret
% verbose style
c'2^\markup {
% 110% of default size
\override #'(size . 1.1) {
\override #'(fret-diagram-details . (
(number-type . roman-upper)
(dot-label-font-mag . 0.9)
(finger-code . none)
(fret-label-vertical-offset . 0.5)
(xo-font-magnification . 0.4)
(xo-padding . 0.3))) {
\fret-diagram-verbose #'((mute 6)
(capo 3)
(open 5)
(place-fret 4 5 1)
(place-fret 3 5 2)
(place-fret 2 5 3)
(open 1))
}
}
}
%% simple D chord
d'2^\markup {
\override #'(fret-diagram-details . (
(finger-code . below-string)
(dot-radius . 0.35)
(string-thickness-factor . 0.3)
(dot-position . 0.5)
(fret-count . 3))) {
\fret-diagram-terse "x;x;o;2-1;3-2;2-3;"
}
}
%% simple D chord, large top fret thickness
d'2^\markup {
\override #'(fret-diagram-details . (
(finger-code . below-string)
(dot-radius . 0.35)
(dot-position . 0.5)
(top-fret-thickness . 7)
(fret-count . 3))) {
\fret-diagram-terse "x;x;o;2-1;3-2;2-3;"
}
}
% These chords will be in landscape orientation
\override TextScript.fret-diagram-details.orientation = #'landscape
%% C major for guitar, barred on third fret
% verbose style
% roman fret label, finger labels below string, straight barre
c'2^\markup {
% 110% of default size
\override #'(size . 1.1) {
\override #'(fret-diagram-details . (
(number-type . roman-lower)
(finger-code . below-string)
(barre-type . straight))) {
\fret-diagram-verbose #'((mute 6)
(place-fret 5 3 1)
(place-fret 4 5 2)
(place-fret 3 5 3)
(place-fret 2 5 4)
(place-fret 1 3 1)
(barre 5 1 3))
}
}
}
%% C major for guitar, barred on third fret
%% Double barre used to test barre function
% verbose style
c'2^\markup {
% 110% of default size
\override #'(size . 1.1) {
\override #'(fret-diagram-details . (
(number-type . arabic)
(dot-label-font-mag . 0.9)
(finger-code . in-dot)
(fret-label-font-mag . 0.6)
(fret-label-vertical-offset . 0)
(label-dir . -1)
(mute-string . "M")
(xo-font-magnification . 0.4)
(xo-padding . 0.3))) {
\fret-diagram-verbose #'((mute 6)
(place-fret 5 3 1)
(place-fret 4 5 2)
(place-fret 3 5 3)
(place-fret 2 5 4)
(place-fret 1 3 1)
(barre 4 2 5)
(barre 5 1 3))
}
}
}
%% C major for guitar, with capo on third fret
% verbose style
c'2^\markup {
% 110% of default size
\override #'(size . 1.1) {
\override #'(fret-diagram-details . (
(number-type . roman-upper)
(dot-label-font-mag . 0.9)
(finger-code . none)
(fret-label-vertical-offset . 0.5)
(xo-font-magnification . 0.4)
(xo-padding . 0.3))) {
\fret-diagram-verbose #'((mute 6)
(capo 3)
(open 5)
(place-fret 4 5 1)
(place-fret 3 5 2)
(place-fret 2 5 3)
(open 1))
}
}
}
%% simple D chord
d'2^\markup {
\override #'(fret-diagram-details . (
(finger-code . below-string)
(dot-radius . 0.35)
(dot-position . 0.5)
(fret-count . 3))) {
\fret-diagram-terse "x;x;o;2-1;3-2;2-3;"
}
}
%% simple D chord, large top fret thickness
d'2^\markup {
\override #'(fret-diagram-details . (
(finger-code . below-string)
(dot-radius . 0.35)
(dot-position . 0.5)
(top-fret-thickness . 7)
(fret-count . 3))) {
\fret-diagram-terse "x;x;o;2-1;3-2;2-3;"
}
}
% These chords will be in opposing-landscape orientation
\override TextScript.fret-diagram-details.orientation = #'opposing-landscape
%% C major for guitar, barred on third fret
% verbose style
% roman fret label, finger labels below string, straight barre
c'2^\markup {
% 110% of default size
\override #'(size . 1.1) {
\override #'(fret-diagram-details . (
(number-type . roman-lower)
(finger-code . below-string)
(barre-type . straight))) {
\fret-diagram-verbose #'((mute 6)
(place-fret 5 3 1)
(place-fret 4 5 2)
(place-fret 3 5 3)
(place-fret 2 5 4)
(place-fret 1 3 1)
(barre 5 1 3))
}
}
}
%% C major for guitar, barred on third fret
%% Double barre used to test barre function
% verbose style
c'2^\markup {
% 110% of default size
\override #'(size . 1.1) {
\override #'(fret-diagram-details . (
(number-type . arabic)
(dot-label-font-mag . 0.9)
(finger-code . in-dot)
(fret-label-font-mag . 0.6)
(fret-label-vertical-offset . 0)
(label-dir . -1)
(mute-string . "M")
(xo-font-magnification . 0.4)
(xo-padding . 0.3))) {
\fret-diagram-verbose #'((mute 6)
(place-fret 5 3 1)
(place-fret 4 5 2)
(place-fret 3 5 3)
(place-fret 2 5 4)
(place-fret 1 3 1)
(barre 4 2 5)
(barre 5 1 3))
}
}
}
%% C major for guitar, with capo on third fret
% verbose style
c'2^\markup {
% 110% of default size
\override #'(size . 1.1) {
\override #'(fret-diagram-details . (
(number-type . roman-upper)
(dot-label-font-mag . 0.9)
(finger-code . none)
(fret-label-vertical-offset . 0.5)
(xo-font-magnification . 0.4)
(xo-padding . 0.3))) {
\fret-diagram-verbose #'((mute 6)
(capo 3)
(open 5)
(place-fret 4 5 1)
(place-fret 3 5 2)
(place-fret 2 5 3)
(open 1))
}
}
}
%% simple D chord
d'2^\markup {
\override #'(fret-diagram-details . (
(finger-code . below-string)
(dot-radius . 0.35)
(dot-position . 0.5)
(fret-count . 3))) {
\fret-diagram-terse "x;x;o;2-1;3-2;2-3;"
}
}
%% simple D chord, large top fret thickness
d'2^\markup {
\override #'(fret-diagram-details . (
(finger-code . below-string)
(dot-radius . 0.35)
(dot-position . 0.5)
(top-fret-thickness . 7)
(fret-count . 3))) {
\fret-diagram-terse "x;x;o;2-1;3-2;2-3;"
}
}
}
>>
|
Génération de crochets personnalisés
Une fonction Scheme personnalisée permet de redéfinir la propriété
stencil de l’objet Flag, de sorte à modifier le glyphe
utilisé pour les crochets de croche.
| | #(define-public (weight-flag grob)
(let* ((stem-grob (ly:grob-parent grob X))
(log (- (ly:grob-property stem-grob 'duration-log) 2))
(is-up? (eqv? (ly:grob-property stem-grob 'direction) UP))
(yext (if is-up? (cons (* log -0.8) 0) (cons 0 (* log 0.8))))
(flag-stencil (make-filled-box-stencil '(-0.4 . 0.4) yext))
(stroke-style (ly:grob-property grob 'stroke-style))
(stroke-stencil (if (equal? stroke-style "grace")
(make-line-stencil 0.2 -0.9 -0.4 0.9 -0.4)
empty-stencil)))
(ly:stencil-add flag-stencil stroke-stencil)))
% Create a flag stencil by looking up the glyph from the font
#(define (inverted-flag grob)
(let* ((stem-grob (ly:grob-parent grob X))
(dir (if (eqv? (ly:grob-property stem-grob 'direction) UP) "d" "u"))
(flag (retrieve-glyph-flag "" dir "" grob))
(line-thickness (ly:staff-symbol-line-thickness grob))
(stem-thickness (ly:grob-property stem-grob 'thickness))
(stem-width (* line-thickness stem-thickness))
(stroke-style (ly:grob-property grob 'stroke-style))
(stencil (if (null? stroke-style)
flag
(add-stroke-glyph flag stem-grob dir stroke-style "")))
(rotated-flag (ly:stencil-rotate-absolute stencil 180 0 0)))
(ly:stencil-translate rotated-flag (cons (- (/ stem-width 2)) 0))))
snippetexamplenotes =
{
\autoBeamOff c'8 d'16 c'32 d'64 \acciaccatura {c'8} d'64
}
{
\override Score.RehearsalMark.self-alignment-X = #LEFT
\time 1/4
\mark "Normal flags"
\snippetexamplenotes
\mark "Custom flag: inverted"
\override Flag.stencil = #inverted-flag
\snippetexamplenotes
\mark "Custom flag: weight"
\override Flag.stencil = #weight-flag
\snippetexamplenotes
\mark "Revert to normal"
\revert Flag.stencil
\snippetexamplenotes
}
|
Glissando par dessus un objet graphique
Un glissando peut sauter un objet NoteColumn.
| | \relative c' {
a2 \glissando
\once \override NoteColumn.glissando-skip = ##t
f''4 d,
}
|
Stylisation des lignes de soufflet
Les lignes d’un soufflet peuvent adopter tous les styles permis par la
line-interface : discontinu, pointillé, continu, ondulé ou en
zigzag.
| | \relative c' {
c2\< c\!
\override Hairpin.style = #'dashed-line
c2\< c\!
\override Hairpin.style = #'dotted-line
c2\< c\!
\override Hairpin.style = #'line
c2\< c\!
\override Hairpin.style = #'trill
c2\< c\!
\override Hairpin.style = #'zigzag
c2\< c\!
\revert Hairpin.style
c2\< c\!
}
|
Alignement de nuances personnalisées comme "sempre pp" "più f" "subito p"
Certaines indications de nuance requièrent un complément textuel, comme
« sempre pp ». Dans la mesure où les nuances sont habituellement
centrées sous la note, le pp se trouvera repoussé loin après la
note à laquelle il s’applique.
Différentes approches permettent de correctement aligner horizontalement
ce « sempre pp » :
– Un simple \once \override DynamicText.X-offset = #-9.2
avant la note considérée de telle sorte que la nuance soit décalée
manuellement à la bonne place. Inconvénient : il faut le faire
manuellement à chaque fois qu’intervient ce markup.
– L’intégration d’un rembourrage (#:hspace 7.1) à la définition
de cette nuance personnalisée afin qu’une fois centrée par LilyPond
elle soit correctement alignée. Inconvénient : le rembourrage
occupera exactement cet espace et ne permettra à aucun autre
markup ou nuance d’apparaître à cet endroit.
– L’application d’un décalage au script de nuance
\once \override … X-offset = ….
Inconvénient : là aussi il faut le faire à chaque fois.
– L’attribution arbitraire d’une dimension à 0 du texte additionnel à
l’aide d’un #:with-dimensions '(0 . 0) '(0 . 0).
Inconvénient : LilyPond considère que « sempre » n’occupe pas
d’espace, et donc pourra mettre à cet endroit d’autres éléments, ce
qui pourrait générer des collisions qui ne seront pas détectées par
les routines ad hoc. D’autre part, il semble persister un
espacement, ce qui laisse l’impression d’un alignement différent en
l’absence de texte additionnel.
– L’ajout, explicite, du décalage directement dans la fonction Scheme
du script de nuance.
– La définition d’un alignement explicite au sein du script de nuance.
Ceci ne sera suivi d’effet, par défaut, qu’en jouant sur
X-offset. Inconvénient : il faut définir
DynamicText.X-offset, ce qui s’appliquera à toutes les
nuances textuelles. Par ailleurs, l’alignement sera réalisé sur le
bord droit du texte additionnel, non sur le milieu de pp.
| | \paper {
ragged-right = ##f
indent = 2.5\cm
}
% Solution 1: Using a simple markup with a particular halign value
% Drawback: It's a markup, not a dynamic command, so \dynamicDown
% etc. will have no effect
semppMarkup = \markup { \halign #1.4 \italic "sempre" \dynamic "pp" }
% Solution 2: Using a dynamic script & shifting with
% \once \override ...X-offset = ..
% Drawback: \once \override needed for every invocation
semppK =
#(make-dynamic-script
(markup #:line
(#:normal-text
#:italic "sempre"
#:dynamic "pp")))
% Solution 3: Padding the dynamic script so the center-alignment
% puts it at the correct position
% Drawback: the padding really reserves the space, nothing else can be there
semppT =
#(make-dynamic-script
(markup #:line
(#:normal-text
#:italic "sempre"
#:dynamic "pp"
#:hspace 7.1)))
% Solution 4: Dynamic, setting the dimensions of the additional text to 0
% Drawback: To lilypond "sempre" has no extent, so it might put
% other stuff there => collisions
% Drawback: Also, there seems to be some spacing, so it's not exactly the
% same alignment as without the additional text
semppM =
#(make-dynamic-script
(markup #:line
(#:with-dimensions '(0 . 0) '(0 . 0)
#:right-align
#:normal-text
#:italic "sempre"
#:dynamic "pp")))
% Solution 5: Dynamic with explicit shifting inside the scheme function
semppG =
#(make-dynamic-script
(markup #:hspace 0
#:translate '(-18.85 . 0)
#:line (#:normal-text
#:italic "sempre"
#:dynamic "pp")))
% Solution 6: Dynamic with explicit alignment. This has only effect
% if one sets X-offset!
% Drawback: One needs to set DynamicText.X-offset!
% Drawback: Aligned at the right edge of the additional text,
% not at the center of pp
semppMII =
#(make-dynamic-script
(markup #:line (#:right-align
#:normal-text
#:italic "sempre"
#:dynamic "pp")))
\new StaffGroup <<
\new Staff = "s" \with { instrumentName = \markup \column { Normal } }
<<
\relative c'' {
\key es \major
c4\pp c\p c c | c\ff c c\pp c
}
>>
\new Staff = "sMarkup" \with {
instrumentName = \markup \column { Normal markup }
}
<<
\relative c'' {
\key es \major
c4-\semppMarkup c\p c c | c\ff c c-\semppMarkup c
}
>>
\new Staff = "sK" \with {
instrumentName = \markup \column { Explicit shifting }
}
<<
\relative c'' {
\key es \major
\once \override DynamicText.X-offset = #-9.2
c4\semppK c\p c c
c4\ff c
\once \override DynamicText.X-offset = #-9.2
c4\semppK c
}
>>
\new Staff = "sT" \with {
instrumentName = \markup \column { Right padding }
}
<<
\relative c'' {
\key es \major
c4\semppT c\p c c | c\ff c c\semppT c
}
>>
\new Staff = "sM" \with {
instrumentName = \markup \column { Set dimension "to zero" }
}
<<
\relative c'' {
\key es \major
c4\semppM c\p c c | c\ff c c\semppM c
}
>>
\new Staff = "sG" \with {
instrumentName = \markup \column { Shift inside dynamics}
}
<<
\relative c'' {
\key es \major
c4\semppG c\p c c | c\ff c c\semppG c
}
>>
\new Staff = "sMII" \with {
instrumentName = \markup \column { Alignment inside dynamics }
}
<<
\relative c'' {
\key es \major
% Setting to ##f (false) gives the same result
\override DynamicText.X-offset = #0
c4\semppMII c\p c c | c\ff c c\semppMII c
}
>>
>>
\layout { \override Staff.InstrumentName.self-alignment-X = #LEFT }
|
Repositionnement d’un diagramme de fret
Différents moyens permettent de repositionner un diagramme de fret pour
éviter des collisions ou le placer entre deux notes :
– La modification des valeurs de padding ou de
extra-offset comme pour le second diagramme ;
– L’adjonction d’une voix invisible dans laquelle les diagrammes sont
attachés à des notes invisibles comme pour le troisième diagramme.
Lorsque le diagramme doit correspondre à une position rythmique dans la
mesure, comme au troisième temps de la deuxième mesure, la seconde
méthode est plus appropriée, puisque le diagramme sera aligné sur le
temps.
| | harmonies = \chordmode
{
a8:13
% THE FOLLOWING IS THE COMMAND TO MOVE THE CHORD NAME
\once \override ChordNames.ChordName.extra-offset = #'(10 . 0)
b8:13 s2.
% THIS LINE IS THE SECOND METHOD
s4 s4 b4:13
}
\score
{
<<
\new ChordNames \harmonies
\new Staff
{a8^\markup { \fret-diagram "6-x;5-0;4-2;3-0;2-0;1-2;" }
% THE FOLLOWING IS THE COMMAND TO MOVE THE FRET DIAGRAM
\once \override TextScript.extra-offset = #'(10 . 0)
b4.~^\markup { \fret-diagram "6-x;5-2;4-4;3-2;2-2;1-4;" } b4. a8\break
% HERE IS THE SECOND METHOD
<<
{ a8 b4.~ b4. a8}
{ s4 s4 s4^\markup { \fret-diagram "6-x;5-2;4-4;3-2;2-2;1-4;" }
}
>>
}
>>
}
|
Impression d’un double repère sur une même barre (méthode 1)
Cette méthode permet d’imprimer deux marques-repères l’une au-dessus de
l’autre. Le repère inférieur est décalé sous la portée, puis s’insère
au-dessus de lui un espace pour positionner le repère supérieur
en surplomb de la portée.
L’ajustement des valeurs de extra-offset et baseline-skip
permet d’accroître ou réduire globalement l’espace entre le repère et la
portée.
La capacité de pratiquement tout type de glyphe ou chaîne de caractères
à faire l’objet d’un repère les rend capables de venir se centrer
au-dessus ou en dessous d’une barre de mesure.
L’adjonction de la propriété break-visibility, comme dans le
troisième cas, permet de placer un double repère en fin de ligne.
Cette première méthode, bien que moins compliquée que la seconde, ne
permet pas d’ajuster le positionnement d’un repère indépendamment de
l’autre. Elle peut aussi générer quelques problèmes quant à
l’espacement vertical, puisque le recours à extra-offset ne
modifie en rien la valeur originelle de la boîte englobant le repère.
| | \relative c'{
c d e f |
\once \override Score.RehearsalMark.extra-offset = #'(0 . -8.5)
\once \override Score.RehearsalMark.baseline-skip = #9
\mark \markup \center-column { \circle 1 \box A }
g f e d |
\once \override Score.RehearsalMark.extra-offset = #'(0 . -8.5)
\once \override Score.RehearsalMark.baseline-skip = #9
\mark \markup \center-column { \flat { \bold \small \italic Fine. } }
g f e d |
\once \override Score.RehearsalMark.extra-offset = #'(0 . -8.5)
\once \override Score.RehearsalMark.baseline-skip = #9
\override Score.RehearsalMark.break-visibility = #begin-of-line-invisible
\mark \markup \center-column { \fermata \box z }
}
|
Impression d’un double repère sur une même barre (méthode 2)
Cette méthode permet d’imprimer deux marques-repères – l’une
au-dessus de la portée et l’autre en dessous – à l’aide de deux
voix séparées. Le graveur de repères est ensuite déplacé dans
chacune des voix, sans quoi aucun repère ne sera imprimé. Enfin,
chaque voix se voit attribuer un positionnement pour les repères.
Cette méthode, bien que plus complexe que la première, apporte plus de
flexibilité dans l’ajustement individuel des deux composants du repère.
| | \score {
\relative c'
<<
\new Staff {
<<
\new Voice \with {
\consists Mark_engraver
\consists "Staff_collecting_engraver"
}
{ c4 d e f
\mark \markup { \box A }
c4 d e f
}
\new Voice \with {
\consists Mark_engraver
\consists "Staff_collecting_engraver"
\override RehearsalMark.direction = #DOWN
}
{ s4 s s s
\mark \markup { \circle 1 }
s4 s s s
}
>>
}
>>
\layout {
\context {
\Score
\remove "Mark_engraver"
\remove "Staff_collecting_engraver"
}
}
}
|
Insertion d’une césure
Une surcharge de la propriété text de l’objet
BreathingSign permet de créer une marque de césure. LilyPond
dispose également d’une variante courbée.
| | \relative c'' {
\override BreathingSign.text = \markup {
\musicglyph "scripts.caesura.straight"
}
c8 e4. \breathe g8. e16 c4
\override BreathingSign.text = \markup {
\musicglyph "scripts.caesura.curved"
}
g8 e'4. \breathe g8. e16 c4
}
|
Keep change clefs full sized
When a clef is changed, the clef sign displayed is smaller than the
initial clef. This can be overridden with full-size-change.
| | \relative c' {
\clef "treble"
c1
\clef "bass"
c1
\clef "treble"
c1
\override Staff.Clef.full-size-change = ##t
\clef "bass"
c1
\clef "treble"
c1
\revert Staff.Clef.full-size-change
\clef "bass"
c1
\clef "treble"
c1
}
|
Terminaison de ligne en flèche
Les extensions de texte, tout comme les indications sous forme de ligne
tel un glissando, peuvent se voir pourvues d’une extrémité en flèche.
| | \relative c'' {
\override TextSpanner.bound-padding = #1.0
\override TextSpanner.style = #'line
\override TextSpanner.bound-details.right.arrow = ##t
\override TextSpanner.bound-details.left.text = #"fof"
\override TextSpanner.bound-details.right.text = #"gag"
\override TextSpanner.bound-details.right.padding = #0.6
\override TextSpanner.bound-details.right.stencil-align-dir-y = #CENTER
\override TextSpanner.bound-details.left.stencil-align-dir-y = #CENTER
\override Glissando.bound-details.right.arrow = ##t
\override Glissando.arrow-length = #0.5
\override Glissando.arrow-width = #0.25
a8\startTextSpan gis a4 b\glissando b,
g'4 c\stopTextSpan c2
}
|
Recours à la propriété ’transparent pour rendre des objets invisibles
Une modification de la propriété transparent permet d’imprimer un
objet « à l’encre sympathique » : l’objet n’est pas affiché bien que tous
ses attributs soient préservés. L’objet en question occupe donc sa
place, est pris en compte lors de collisions, et peut se voir attaché
liaisons ou ligatures.
Cet exemple illustre la manière de connecter deux voix par une liaison
de prolongation. Les liaisons de prolongation ne peuvent normalement
intervenir que dans la même voix. Dès lors que la liaison est entamée
dans une autre voix et que la première hampe ascendante est rendue
transparente dans cette même voix, la liaison semble passer d’une voix à
l’autre.
| | \relative {
\time 2/4
<<
{
\once \hide Stem
\once \override Stem.length = #8
b'8 ~ 8\noBeam
\once \hide Stem
\once \override Stem.length = #8
g8 ~ 8\noBeam
}
\\
{
b8 g g e
}
>>
}
|
Saut de ligne et glissando
L’affectation de la valeur #t à la propriété breakable,
combinée à after-line-breaking, permet la rupture d’une
indication de glissando lors d’un saut de ligne.
| | glissandoSkipOn = {
\override NoteColumn.glissando-skip = ##t
\hide NoteHead
\override NoteHead.no-ledgers = ##t
}
\relative c'' {
\override Glissando.breakable = ##t
\override Glissando.after-line-breaking = ##t
f1\glissando |
\break
a4 r2. |
f1\glissando
\once \glissandoSkipOn
\break
a2 a4 r4 |
}
|
Contrôle manuel du positionnement des ligatures
Le positionnement et la pente des ligatures peuvent être contrôlés
manuellement à l’aide d’une adaptation de la propriété positions
de l’objet Beam.
| | \relative c' {
\time 2/4
% from upper staff-line (position 2) to center (position 0)
\override Beam.positions = #'(2 . 0)
c8 c
% from center to one above center (position 1)
\override Beam.positions = #'(0 . 1)
c8 c
}
|
Présentation à l’ancienne (barres de mesure entre les portées)
En musique mensurale, les barres de mesure ne traversent pas les
portées. Pour obtenir ce résultat avec un StaffGroup plutôt
qu’en utilisant un ChoirStaff, il faudra masquer les portions de
barre qui recouvrent les portées à l’aide d’un \hide.
| | global = {
\hide Staff.BarLine
s1 s
% the final bar line is not interrupted
\undo \hide Staff.BarLine
\bar "|."
}
\new StaffGroup \relative c'' {
<<
\new Staff { << \global { c1 c } >> }
\new Staff { << \global { c c } >> }
>>
}
|
Modifying the Ottava spanner slope
It is possible to change the slope of the Ottava spanner.
| | \relative c'' {
\override Staff.OttavaBracket.stencil = #ly:line-spanner::print
\override Staff.OttavaBracket.bound-details =
#`((left . ((Y . 0) ; Change the integer here
(attach-dir . ,LEFT)
(padding . 0)
(stencil-align-dir-y . ,CENTER)))
(right . ((Y . 5) ; Change the integer here
(padding . 0)
(attach-dir . ,RIGHT)
(text . ,(make-draw-dashed-line-markup (cons 0 -1.2))))))
\override Staff.OttavaBracket.left-bound-info =
#ly:line-spanner::calc-left-bound-info-and-text
\override Staff.OttavaBracket.right-bound-info =
#ly:line-spanner::calc-right-bound-info
\ottava #1
c1
c'''1
}
|
Déplacement des notes pointées dans une polyphonie
Une note pointée appartenant à la voix supérieure d’une portée
polyphonique sera par défaut décalée vers la droite afin d’éviter les
collisions avec les autres voix. Ce comportement peut être outrepassé à
l’aide de la propriété prefer-dotted-right de
NoteCollision.
| | \new Staff \relative c' <<
{
f2. f4
\override Staff.NoteCollision.prefer-dotted-right = ##f
f2. f4
\override Staff.NoteCollision.prefer-dotted-right = ##t
f2. f4
}
\\
{ e4 e e e e e e e e e e e }
>>
|
Déplacement vertical des liaisons d’articulation
Le positionnement vertical d’une liaison se contrôle par la propriété
positions de l’objet Slur. Cette propriété dispose de
deux paramètres : le premier affecte l’extrémité gauche de la
liaison, le second son extrémité droite. La valeur des paramètres
n’aura aucune influence sur le galbe de la liaison. LilyPond ne
s’en servira que pour adapter le positionnement de la courbe. Des
valeurs positives décalent la liaison vers le haut et s’utilisent
pour des hampes descendantes. Des valeurs négatives entraînent un
décalage vers le bas.
| | \relative c' {
\stemDown
e4( a)
\override Slur.positions = #'(1 . 1)
e4( a)
\override Slur.positions = #'(2 . 2)
e4( a)
\override Slur.positions = #'(3 . 3)
e4( a)
\override Slur.positions = #'(4 . 4)
e4( a)
\override Slur.positions = #'(5 . 5)
e4( a)
\override Slur.positions = #'(0 . 5)
e4( a)
\override Slur.positions = #'(5 . 0)
e4( a)
\stemUp
\override Slur.positions = #'(-5 . -5)
e4( a)
\stemDown
\revert Slur.positions
e4( a)
}
|
Imbrications de regroupements de portées
La propriété systemStartDelimiterHierarchy permet de créer des
regroupements imbriqués complexes. La commande
\set StaffGroup.systemStartDelimiterHierarchy prend en
argument la liste alphabétique des sous-groupes à hiérarchiser. Chaque
sous-groupe peut être affublé d’un délimiteur particulier. Chacun des
regroupements intermédiaires doit être borné par des parenthèses. Bien
que des éléments de la liste puissent être omis, le premier délimiteur
embrassera toujours l’intégralité des portées. Vous disposez des quatre
délimiteurs SystemStartBar, SystemStartBracket,
SystemStartBrace et SystemStartSquare.
| | \new StaffGroup
\relative c'' <<
\override StaffGroup.SystemStartSquare.collapse-height = #4
\set StaffGroup.systemStartDelimiterHierarchy
= #'(SystemStartSquare (SystemStartBrace (SystemStartBracket a
(SystemStartSquare b) ) c ) d)
\new Staff { c1 }
\new Staff { c1 }
\new Staff { c1 }
\new Staff { c1 }
\new Staff { c1 }
>>
|
Overriding articulations of destinct type
Sometimes you may want to affect a single articulation-type. Although
it is always possible to use \tweak, it might become tedious to
do so for every single sign of a whole score. The following shows how
to tweak articulations with a list of custom-settings. One use-case
might be to create a style-sheet.
With 2.16.2 it is possible to put the proposed function,
\customScripts, into a \layout-block.
| | % Code by David Nalesnik and Thomas Morley
#(define (custom-script-tweaks ls)
(lambda (grob)
(let* ((type (ly:prob-property
(ly:grob-property grob 'cause)
'articulation-type))
(tweaks (assoc-ref ls type)))
(if tweaks
(for-each
(lambda (x) (ly:grob-set-property! grob (car x) (cdr x)))
tweaks)))))
customScripts =
#(define-music-function (settings)(list?)
#{
\override Script.before-line-breaking =
#(custom-script-tweaks settings)
#})
revertCustomScripts = { \revert Script.before-line-breaking }
%%%%%%%%%%%%%
% Example:
%%%%%%%%%%%%%
% Predefine a list of desired tweaks.
#(define my-settings-1
'(
("staccato" . ((color . (1 0 0))(padding . 0.5)))
("accent" . ((font-size . 0)(color . (1 0 0))))
("tenuto" . ((rotation . (45 0 0)) (padding . 2)(font-size . 10)))
("staccatissimo" . ((padding . 1) (color . (1 0 0))))
("segno" . ((font-size . 0)(color . (1 0 0))))
))
#(define my-settings-2
'(
("staccato" . ((color . (0 1 0))))
("accent" . ((font-size . 4)(color . (0 1 0))(padding . 1.5)))
("tenuto" . ((font-size . 10)))
("staccatissimo" . ((padding . 2) (color . (0 1 0))))
("coda" . ((color . (0 1 0)) (padding . 1)))
))
one =
\relative c'' {
f1--
\customScripts #my-settings-1
f-. f-! f-> f-- f-!\segno
\revertCustomScripts
f-> f-.
}
two =
\relative c' {
f1--
\customScripts #my-settings-2
f-. f-! f-> f---> f-!
f-> f-.\coda
}
\new Staff <<
\new Voice { \voiceOne \one }
\new Voice { \voiceTwo \two }
>>
|
Affichage du numéro de répétition en pourcent
Le numéro de mesure répétée sera imprimé à intervalle régulier si vous
déterminez la propriété de contexte repeatCountVisibility.
| | \relative c'' {
\set countPercentRepeats = ##t
\set repeatCountVisibility = #(every-nth-repeat-count-visible 5)
\repeat percent 10 { c1 } \break
\set repeatCountVisibility = #(every-nth-repeat-count-visible 2)
\repeat percent 6 { c1 d1 }
}
|
Positionnement des arpeggios
L’ajustement de la taille d’une indication d’arpeggio s’effectue au
travers du positionnement de ses extrémités haute ou basse.
| | \relative c' {
<c e g b>1\arpeggio
\once \override Arpeggio.positions = #'(-5 . 0)
<c e g b>1\arpeggio
\once \override Arpeggio.positions = #'(0 . 5)
<c e g b>1\arpeggio
\once \override Arpeggio.positions = #'(-5 . 5)
<c e g b>1\arpeggio
}
|
Positionnement des silences multimesures
Si l’on peut positionner verticalement un silence simple en le
rattachant à une note, il n’en va pas de même pour un silence
multimesure. Néanmoins, et uniquement dans le cadre de musique
polyphonique, les silences multimesures sont positionnés différemment
selon qu’ils appartiennent à une voix au numéro pair ou impair. Le
positionnement des silences multimesures peut se contrôler ainsi :
| | \relative c'' {
% Multi-measure rests by default are set under the fourth line
R1
% They can be moved using an override
\override MultiMeasureRest.staff-position = #-2
R1
\override MultiMeasureRest.staff-position = #0
R1
\override MultiMeasureRest.staff-position = #2
R1
\override MultiMeasureRest.staff-position = #3
R1
\override MultiMeasureRest.staff-position = #6
R1
\revert MultiMeasureRest.staff-position
\break
% In two Voices, odd-numbered voices are under the top line
<< { R1 } \\ { a1 } >>
% Even-numbered voices are under the bottom line
<< { a1 } \\ { R1 } >>
% Multi-measure rests in both voices remain separate
<< { R1 } \\ { R1 } >>
% Separating multi-measure rests in more than two voices
% requires an override
<< { R1 } \\ { R1 } \\
\once \override MultiMeasureRest.staff-position = #0
{ R1 }
>>
% Using compressed bars in multiple voices requires another override
% in all voices to avoid multiple instances being printed
\compressMMRests
<<
\revert MultiMeasureRest.direction
{ R1*3 }
\\
\revert MultiMeasureRest.direction
{ R1*3 }
>>
}
|
Positionnement d’une annotation à l’intérieur d’une liaison
Lorsqu’une annotation doit s’incrire à l’intérieur d’une liaison, la
propriété outside-staff-priority doit être désactivée.
| | \relative c'' {
\override TextScript.avoid-slur = #'inside
\override TextScript.outside-staff-priority = ##f
c2(^\markup { \halign #-10 \natural } d4.) c8
}
|
Inscrire le numéro de mesure dans un cadre ou un cercle
Les numéros de mesure peuvent être encadrés ou entourés d’un cercle.
| | \relative c' {
% Prevent bar numbers at the end of a line and permit them elsewhere
\override Score.BarNumber.break-visibility = #end-of-line-invisible
\set Score.barNumberVisibility = #(every-nth-bar-number-visible 4)
% Increase the size of the bar number by 2
\override Score.BarNumber.font-size = #2
% Draw a box round the following bar number(s)
\override Score.BarNumber.stencil
= #(make-stencil-boxer 0.1 0.25 ly:text-interface::print)
\repeat unfold 5 { c1 }
% Draw a circle round the following bar number(s)
\override Score.BarNumber.stencil
= #(make-stencil-circler 0.1 0.25 ly:text-interface::print)
\repeat unfold 4 { c1 } \bar "|."
}
|
Impression du métronome et des repères sous la portée
Les indications de tempo et les marques de repère s’impriment par défaut
au-dessus de la portée. Le fait de régler en conséquence la propriété
direction des objets MetronomeMark ou RehearsalMark
les placera au-dessous de la portée.
| | \layout {
indent = 0
ragged-right = ##f
}
{
% Metronome marks below the staff
\override Score.MetronomeMark.direction = #DOWN
\tempo 8. = 120
c''1
% Rehearsal marks below the staff
\override Score.RehearsalMark.direction = #DOWN
\mark \default
c''1
}
|
Impression des noms de notes avec ou sans indication d’octave
Le contexte NoteNames permet d’imprimer le nom des notes. La
propriété printOctaveNames, une fois activée, leur adjoindra une
indication d’octave.
| | scale = \relative c' {
a4 b c d
e4 f g a
}
\new Staff {
<<
\scale
\context NoteNames {
\set printOctaveNames = ##f
\scale
}
>>
R1
<<
\scale
\context NoteNames {
\set printOctaveNames = ##t
\scale
}
>>
}
|
Espacement strictement proportionnel des notes
Lorsque la propriété strict-note-spacing est activée,
l’espacement des notes dans un système ne tient compte ni des barres de
mesure ni des clefs, qui se retrouvent placées juste avant la note qui
tombe au même moment. Ceci peut entraîner certaines collisions.
| | \relative c'' <<
\override Score.SpacingSpanner.strict-note-spacing = ##t
\set Score.proportionalNotationDuration = #(ly:make-moment 1/16)
\new Staff {
c8[ c \clef alto c c \grace { d16 } c8 c] c4
c2 \grace { c16[ c16] } c2
}
\new Staff {
c2 \tuplet 3/2 { c8 \clef bass cis,, c } c4
c1
}
>>
|
Removing brace on first line of piano score
This snippet removes the first brace from a PianoStaff or a
GrandStaff. It may be useful when cutting and pasting the
engraved image into existing music.
It uses \alterBroken.
| | someMusic = {
\once \override Staff.Clef.stencil = ##f
\once \override Staff.TimeSignature.stencil = ##f
\repeat unfold 3 c1 \break
\repeat unfold 5 c1 \break
\repeat unfold 5 c1
}
\score {
\new PianoStaff
<<
\new Staff = "right" \relative c'' \someMusic
\new Staff = "left" \relative c' { \clef F \someMusic }
>>
\layout {
indent=75
\context {
\PianoStaff
\alterBroken transparent #'(#t) SystemStartBrace
}
}
}
|
Suppression de la partie interportée des barres de mesure d’un regroupement autre que ChoirStaff
Les barres de mesure des regroupements StaffGroup,
PianoStaff et GrandStaff sont par défaut d’un seul tenant.
La portion entre les portées peut néanmoins être supprimée, portée par
portée.
| | \relative c' {
\new StaffGroup <<
\new Staff {
e1 | e
\once \override Staff.BarLine.allow-span-bar = ##f
e1 | e | e
}
\new Staff {
c1 | c | c
\once \override Staff.BarLine.allow-span-bar = ##f
c1 | c
}
\new Staff {
a1 | a | a | a | a
}
>>
}
|
Masquage de la première ligne si elle est vide
Par défaut, le premier système comportera absolument toutes les portées.
Si vous préférez masquer les portées vides y compris pour le premier
système, vous devrez activer la propriété remove-first du
VerticalAxisGroup. Mentionnée dans un bloc \layout,
cette commande agira de manière globale. Pour qu’elle ne soit effective
que pour une portée particulière, vous devrez également spécifier le
contexte (Staff pour qu’il ne concerne que la portée en cours) en
préfixe de la propriété.
La première ligne inférieure du deuxième StaffGroup est bien
présente, pour la simple raison que le réglage en question ne s’applique
qu’à la portée dans laquelle il a été inscrit.
| | \layout {
\context {
\Staff \RemoveEmptyStaves
% To use the setting globally, uncomment the following line:
% \override VerticalAxisGroup.remove-first = ##t
}
}
\new StaffGroup <<
\new Staff \relative c' {
e4 f g a \break
c1
}
\new Staff {
% To use the setting globally, comment this line,
% uncomment the line in the \layout block above
\override Staff.VerticalAxisGroup.remove-first = ##t
R1 \break
R
}
>>
\new StaffGroup <<
\new Staff \relative c' {
e4 f g a \break
c1
}
\new Staff {
R1 \break
R
}
>>
|
Styles de silences
Les silences peuvent être gravés selon différents styles.
| | \new Staff \relative c {
\omit Score.TimeSignature
\cadenzaOn
\override Staff.Rest.style = #'mensural
r\maxima^\markup \typewriter { mensural }
r\longa r\breve r1 r2 r4 r8 r16 s32 s64 s128 s128
\bar ""
\break
\override Staff.Rest.style = #'neomensural
r\maxima^\markup \typewriter { neomensural }
r\longa r\breve r1 r2 r4 r8 r16 s32 s64 s128 s128
\bar ""
\break
\override Staff.Rest.style = #'classical
r\maxima^\markup \typewriter { classical }
r\longa r\breve r1 r2 r4 r8 r16 r32 r64 r128 s128
\bar ""
\break
\override Staff.Rest.style = #'z
r\maxima^\markup \typewriter { z-style }
r\longa r\breve r1 r2 r4 r8 r16 r32 r64 r128 s128
\bar ""
\break
\override Staff.Rest.style = #'default
r\maxima^\markup \typewriter { default }
r\longa r\breve r1 r2 r4 r8 r16 r32 r64 r128 s128
}
|
Barres rythmiques
Il arrive, dans une feuille de chant « simple », que les notes soient
remplacées par une « pulsation » et que la structure de la chanson soit
indiquée par les accords au-dessus des mesures. Ceci peut être utile
lorsque l’on crée ou retranscrit la structure d’une chanson, ainsi que
pour donner au guitariste et musiciens de jazz une pseudo partition. Le
fonctionnement standard d’un \repeat percent n’est pas ici
applicable puisque le premier temps doit être une note ou un silence.
Le code ci-dessous propose deux alternatives à ce problème en
redéfinissant l’aspect d’un silence. Si la durée d’un temps ne
correspond pas à la noire, le r4 inclus dans la définition devra
être remplacé par un silence de durée appropriée.
| | % Macro to print single slash
rs = {
\once \override Rest.stencil = #ly:percent-repeat-item-interface::beat-slash
\once \override Rest.thickness = #0.48
\once \override Rest.slope = #1.7
r4
}
% Function to print a specified number of slashes
comp = #(define-music-function (count) (integer?)
#{
\override Rest.stencil = #ly:percent-repeat-item-interface::beat-slash
\override Rest.thickness = #0.48
\override Rest.slope = #1.7
\repeat unfold $count { r4 }
\revert Rest.stencil
#}
)
\score {
\relative c' {
c4 d e f |
\rs \rs \rs \rs |
\comp #4 |
}
}
|
Séparation entre altérations annulées et nouvelle armure
Les altérations supprimées lors d’un changement de tonalité sont par
défaut accolées à la nouvelle armure. Ce comportement peut s’adapter
grâce à la propriété break-align-orders de l’objet
BreakAlignment.
La valeur de break-align-orders est constituée d’un vecteur à
trois composantes listant l’ordre des éléments à l’occasion d’une
rupture. Seule la deuxième liste est ici modifiée,
key-cancellation étant déplacé avant staff-bar.
En ne modifiant que la deuxième liste, cette modification dans l’ordre
d’apparition des éléments sera effective seulement en cours de système,
et non en début ou fin de ligne.
| | \new Staff {
\override Score.BreakAlignment.break-align-orders =
##((left-edge ambitus breathing-sign clef staff-bar
key-cancellation key-signature time-signature custos)
(left-edge ambitus breathing-sign clef key-cancellation
staff-bar key-signature time-signature custos)
(left-edge ambitus breathing-sign clef key-cancellation
key-signature staff-bar time-signature custos))
\key des \major
c'1
\bar "||"
\key bes \major
c'1
}
|
Soufflets et barres de mesure
En principe, un soufflet – (de)crescendo imprimé sous forme graphique –
commence au bord gauche de la note de départ, et se termine au
bord droit de la note d’arrivée. Cependant, si la note d’arrivée
est sur un premier temps, le soufflet s’arrêtera au niveau de la
barre de mesure qui la précède. Ce comportement peut être annulé
en assignant faux (#f) à la propriété to-barline.
| | \relative c'' {
e4\< e2.
e1\!
\override Hairpin.to-barline = ##f
e4\< e2.
e1\!
}
|
Séparation visuelle entre les systèmes
La séparation entre deux systèmes consécutifs peut être mise en
évidence par n’importe quel markup. LilyPond dispose à cet effet
d’une double oblique inversée : \slashSeparator.
| | \paper {
system-separator-markup = \slashSeparator
line-width = 120
}
notes = \relative c' {
c1 | c \break
c1 | c \break
c1 | c
}
\book {
\score {
\new GrandStaff <<
\new Staff \notes
\new Staff \notes
>>
}
}
|
Impression d’une même articulation des deux côtés d’une note ou d’un accord
LilyPond ne permet pas, par défaut, qu’une même articulation (accent,
flageolet, point d’orgue, etc.) se retrouve à la fois au-dessus et
au-dessous d’une note. Par exemple, c4_\fermata^\fermata ne
donnera qu’un seul point d’orgue en dessous du do ; celui du dessus sera
tout bonnement ignoré. On peut néanmoins accoler des scripts, tels des
doigtés, à l’intérieur d’un accord ; il peut donc y avoir autant
d’articulations que de besoin, ce qui, par voie de conséquence, permet
de s’affranchir de la présence des hampes et de positionner
l’articulation relativement à la tête de note comme dans le cas du
flageolet ci-dessous. L’imitation du traitement d’un script
externe à un accord requérant un add-stem-support demande
de libeller la note comme étant un accord et d’ajouter les
articulations au sein de la construction <…>. Un simple
amendement permettra de rectifier le positionnement habituel en
surplomb : <c-\tweak direction #DOWN-\fermata^\fermata>
| | % The same as \flageolet, just a little smaller
smallFlageolet = \tweak font-size #-2 \flageolet
\relative c' {
s4^"Wrong:"
c4_\fermata^\fermata % The second fermata is ignored!
<e d'>4^\smallFlageolet_\smallFlageolet
s4^"Works if written inside a chord:"
<e_\smallFlageolet d'^\smallFlageolet>4
<e_\flageolet d'^\flageolet>4
<e_\smallFlageolet^\smallFlageolet>4
<e_\fermata^\fermata>4
}
|
Ligne de prolongation pour numéro de corde
Voici comment ajouter une ligne de prolongation à une indication de
numéro de corde, afin de stipuler que les notes qui suivent doivent être
jouées sur la corde en question.
| | stringNumberSpanner =
#(define-music-function (StringNumber) (string?)
#{
\override TextSpanner.style = #'solid
\override TextSpanner.font-size = #-5
\override TextSpanner.bound-details.left.stencil-align-dir-y = #CENTER
\override TextSpanner.bound-details.left.text =
\markup { \circle \number $StringNumber }
#})
\relative c {
\clef "treble_8"
\stringNumberSpanner "5"
\textSpannerDown
a8\startTextSpan
b c d e f\stopTextSpan
\stringNumberSpanner "4"
g\startTextSpan a
bes4 a g2\stopTextSpan
}
|
Suppression des avertissements de chevauchement
If notes from two voices with stems in the same direction are placed at
the same position, and both voices have no shift or the same shift
specified, the error message ‘warning: ignoring too many clashing
note columns’ will appear when compiling the LilyPond file. This
message can be suppressed by setting the 'ignore-collision
property of the NoteColumn object to #t. Please note that
this does not just suppress warnings but stops LilyPond trying to
resolve collisions at all and so may have unintended results unless
used with care.
| | ignore = \override NoteColumn.ignore-collision = ##t
\relative c' {
\new Staff <<
\new Voice { \ignore \stemDown f2 g }
\new Voice { c2 \stemDown c, }
>>
}
|
Métrique entre parenthèses - méthode 3
Autre manière de mettre la métrique entre parenthèses.
| | \relative c'' {
\override Staff.TimeSignature.stencil = #(lambda (grob)
(parenthesize-stencil (ly:time-signature::print grob) 0.1 0.4 0.4 0.1 ))
\time 2/4
a4 b8 c
}
|
Métrique entre parenthèses
Une métrique peut être mise entre parenthèses.
| | \relative c'' {
\override Staff.TimeSignature.stencil = #(lambda (grob)
(bracketify-stencil (ly:time-signature::print grob) Y 0.1 0.2 0.1))
\time 2/4
a4 b8 c
}
|
Affichage seulement du numérateur d’une métrique (au lieu d’une fraction)
La métrique est parfois indiquée non pas par une fraction (par ex. 7/4)
mais simplement par son numérateur (7 dans ce cas). L’instruction
\override Staff.TimeSignature.style = #'single-digit permet de
déroger au style par défaut de manière permanente – un \revert
Staff.TimeSignature.style annulera ces modifications. Lorsque cette
métrique sous la forme d’un seul chiffre ne se présente qu’une seule
fois, il suffit de faire précéder l’instruction \override d’un
simple \once.
| | \relative c'' {
\time 3/4
c4 c c
% Change the style permanently
\override Staff.TimeSignature.style = #'single-digit
\time 2/4
c4 c
\time 3/4
c4 c c
% Revert to default style:
\revert Staff.TimeSignature.style
\time 2/4
c4 c
% single-digit style only for the next time signature
\once \override Staff.TimeSignature.style = #'single-digit
\time 5/4
c4 c c c c
\time 2/4
c4 c
}
|
Tuplet bracket and change staff
This snippet shows how to set a tuplet starting in a lower staff and
finishing in the upper one.
| | aigues = \relative c' {
\time 6/8
s4.
\stemDown
c16[ bes' e]
\stemUp
g c e
\stemDown
g8
}
basses = \relative c {
\time 3/4
\clef F
\tweak positions #'(4.5 . 9.5)
\tweak edge-height #'(1 . -1)
\tuplet 7/6 {
c16[ bes' e]
\change Staff = md
\stemUp
g[ c e g]
}
s4.s8
}
\new PianoStaff
\with { \omit TimeSignature }
<<
\new Staff = md \aigues
\new Staff = mg \basses
>>
|
Affinage des propriétés d’une clef
Modifier le glyphe, la position de la clef ou son octaviation ne
changeront pas la position des notes ; il faut pour y parvenir modifier
aussi la position du do médium. La redéfinition préalable de
middleCClefPosition permet de placer l’armure sur les bonnes
lignes. Le positionnement est relatif à la ligne médiane, un nombre
positif faisant monter, un nombre négatif abaissant.
Par exemple, la commande \clef "treble_8" équivaut à définir
clefGlyph, clefPosition – qui contrôle la position
verticale de la clef – middleCPosition et clefOctavation.
Une nouvelle clef apparaîtra dès lors que l’une de ces propriétés, à
l’exception de middleCPosition, aura été modifiée.
Les exemples qui suivent illustrent les différentes possibilités de
définir ces propriétés manuellement. Sur la première ligne, la
position relative des notes par rapport aux clefs est préservée, ce
qui n’est pas le cas pour la deuxième ligne.
| | {
% The default treble clef
\key f \major
c'1
% The standard bass clef
\set Staff.clefGlyph = #"clefs.F"
\set Staff.clefPosition = #2
\set Staff.middleCPosition = #6
\set Staff.middleCClefPosition = #6
\key g \major
c'1
% The baritone clef
\set Staff.clefGlyph = #"clefs.C"
\set Staff.clefPosition = #4
\set Staff.middleCPosition = #4
\set Staff.middleCClefPosition = #4
\key f \major
c'1
% The standard choral tenor clef
\set Staff.clefGlyph = #"clefs.G"
\set Staff.clefPosition = #-2
\set Staff.clefTransposition = #-7
\set Staff.middleCPosition = #1
\set Staff.middleCClefPosition = #1
\key f \major
c'1
% A non-standard clef
\set Staff.clefPosition = #0
\set Staff.clefTransposition = #0
\set Staff.middleCPosition = #-4
\set Staff.middleCClefPosition = #-4
\key g \major
c'1 \break
% The following clef changes do not preserve
% the normal relationship between notes, key signatures
% and clefs:
\set Staff.clefGlyph = #"clefs.F"
\set Staff.clefPosition = #2
c'1
\set Staff.clefGlyph = #"clefs.G"
c'1
\set Staff.clefGlyph = #"clefs.C"
c'1
\set Staff.clefTransposition = #7
c'1
\set Staff.clefTransposition = #0
\set Staff.clefPosition = #0
c'1
% Return to the normal clef:
\set Staff.middleCPosition = #0
c'1
}
|
Mise en forme des notes d’ornement
Il est possible de changer globalement la mise en forme des notes
d’ornement dans un morceau, au moyen des fonctions
add-grace-property et remove-grace-property. Ici,
par exemple, on ôte la définition de l’orientation des objets
Stem pour toutes les petites notes, afin que les hampes ne
soient pas toujours orientées vers le haut, et on leur préfère des
têtes en forme de croix.
| | \relative c'' {
\new Staff {
$(remove-grace-property 'Voice 'Stem 'direction)
$(add-grace-property 'Voice 'NoteHead 'style 'cross)
\new Voice {
\acciaccatura { f16 } g4
\grace { d16 e } f4
\appoggiatura { f,32 g a } e2
}
}
}
|
Crochets de style alternatif
Une dérogation à la propriété stencil de l’objet Flag
permet aux croches et notes de durée inférieure d’adopter une autre
forme de crochet. Sont disponibles les variantes
modern-straight-flag, old-straight-flag et
flat-flag.
| | testnotes = {
\autoBeamOff
c8 d16 c32 d64 \acciaccatura { c8 } d64 r4
}
\score {
\relative c' {
\time 2/4
\testnotes
\override Flag.stencil = #modern-straight-flag
\testnotes
\override Flag.stencil = #old-straight-flag
\testnotes
\override Flag.stencil = #flat-flag
\testnotes
\revert Flag.stencil
\testnotes
}
\layout {
indent = 0
\context {
\Score
\override NonMusicalPaperColumn.line-break-permission = ##f
}
}
}
|
Utilisation de ly:grob-object pour accéder aux grobs avec \tweak
Certains objets graphiques ne sont accessibles que par le biais d’un
callback à partir d’un autre grob. Ils sont normalement
listés dans les « layout objects » au sein de la section
« Propriétés internes » d’une grob-interface. La fonction
ly:grob-object permet d’accéder à ces objets.
Voici plusieurs moyens d’accéder aux objets par un callback sur
NoteHead. D’autres biais sont naturellement possibles ;
NoteHead a cependant l’avantage incontestable d’être utilisé
implicitement par la commande \tweak.
La fonction display-grobs définie ci-dessous n’est probablement
pas très utile. Elle indique toutefois qu’il est tout à fait possible
d’accéder aux objets.
Voici par exemple ce qui sera émis dans la console :
--------------------
#<Grob Accidental >
#<Grob Arpeggio >
#<Grob Stem >
| | #(define (notehead-get-accidental notehead)
;; notehead is grob
(ly:grob-object notehead 'accidental-grob))
#(define (notehead-get-arpeggio notehead)
;; notehead is grob
(let ((notecolumn (notehead-get-notecolumn notehead)))
(ly:grob-object notecolumn 'arpeggio)))
#(define (notehead-get-notecolumn notehead)
;; notehead is grob
(ly:grob-parent notehead X))
#(define (notehead-get-stem notehead)
;; notehead is grob
(let ((notecolumn (notehead-get-notecolumn notehead)))
(ly:grob-object notecolumn 'stem)))
#(define (display-grobs notehead)
;; notehead is grob
(let ((accidental (notehead-get-accidental notehead))
(arpeggio (notehead-get-arpeggio notehead))
(stem (notehead-get-stem notehead)))
(format (current-error-port) "~2&~a\n" (make-string 20 #\-))
(for-each
(lambda (x) (format (current-error-port) "~a\n" x))
(list accidental arpeggio stem))))
\relative c' {
%% display grobs for each note head:
%\override NoteHead.before-line-breaking = #display-grobs
<c
%% or just for one:
\tweak before-line-breaking #display-grobs
es
g>1\arpeggio
}
|
Utilisation de PostScript pour générer des têtes de note à l’allure particulière
Lorsqu’il est impossible d’obtenir facilement une allure particulière
pour les têtes de note en recourant à la technique du \markup,
un code PostScript peut vous tirer d’embarras. Voici comment générer
des têtes ressemblant à des parallélogrammes.
| | parallelogram =
#(ly:make-stencil (list 'embedded-ps
"gsave
currentpoint translate
newpath
0 0.25 moveto
1.3125 0.75 lineto
1.3125 -0.25 lineto
0 -0.75 lineto
closepath
fill
grestore" )
(cons 0 1.3125)
(cons -.75 .75))
myNoteHeads = \override NoteHead.stencil = \parallelogram
normalNoteHeads = \revert NoteHead.stencil
\relative c'' {
\myNoteHeads
g4 d'
\normalNoteHeads
<f, \tweak stencil \parallelogram b e>4 d
}
|
Utilisation de \tweak pour retoucher des objets particuliers
La commande \tweak permet de retoucher directement n’importe
quel objet graphique. En voici quelques exemples :
| | \relative c' {
\time 2/4
\set fingeringOrientations = #'(right)
<
\tweak font-size #3 c
\tweak color #red d-\tweak font-size #8 -4
\tweak style #'cross g
\tweak duration-log #2 a
>2
}
|
Alignement vertical des nuances indications textuelles
Tous les objets DynamicLineSpanner (soufflets ou nuances
textuelles) viennent s’aligner sur une ligne de référence placée, par
rapport à la portée, à au moins la valeur de 'staff-padding sauf
lorsque d’autres éléments de notation les en éloignent plus. Les nuances
seront centrés sur une même ligne dès lors que 'staff-padding
aura été défini à une valeur suffisante.
C’est le même principe – en combinaison avec \textLengthOn –
qui sert à aligner les indications textuelles sur une ligne de
référence.
| | music = \relative c' {
a'2\p b\f
e4\p f\f\> g, b\p
c2^\markup { \huge gorgeous } c^\markup { \huge fantastic }
}
{
\music
\break
\override DynamicLineSpanner.staff-padding = #3
\textLengthOn
\override TextScript.staff-padding = #1
\music
}
|
Positionnement d’une ossia et des paroles
Cet exemple illustre la manière de positionner une portée d’ossia et
des paroles à l’aide des propriétés de contexte alignBelowContext
et alignAboveContext.
| | \paper {
ragged-right = ##t
}
\relative c' <<
\new Staff = "1" { c4 c s2 }
\new Staff = "2" { c4 c s2 }
\new Staff = "3" { c4 c s2 }
{ \skip 2
<<
\lyrics {
\set alignBelowContext = #"1"
lyrics4 below
}
\new Staff \with {
alignAboveContext = #"3"
fontSize = #-2
\override StaffSymbol.staff-space = #(magstep -2)
\remove "Time_signature_engraver"
} {
\tuplet 6/4 {
\override TextScript.padding = #3
c8[^"ossia above" d e d e f]
}
}
>>
}
>>
|
Prolongateur commun de basse figurée
L’activation de la propriété useBassFigureExtenders permet
d’afficher des lignes de prolongation pour les chiffres qui se répètent.
Deux chiffres prolongés sur la même durée se verront affublés d’un
unique prolongateur, verticalement centré entre eux, dès lors que la
propriété figuredBassCenterContinuations aura elle aussi été
activée.
| | <<
\relative c' {
c8 c b b a a c16 c b b
c8 c b b a a c16 c b b
c8 c b b a a c c b b
}
\figures {
\set useBassFigureExtenders = ##t
<6+ 4 3>4 <6 4 3>8 r
<6+ 4 3>4 <6 4 3>8 <4 3+>16 r
\set figuredBassCenterContinuations = ##t
<6+ 4 3>4 <6 4 3>8 r
<6+ 4 3>4 <6 4 3>8 <4 3+>16 r
\set figuredBassCenterContinuations = ##f
<6+ 4 3>4 <6 4 3>8 r
<6+ 4 3>4 <6 4 3>8 <4 3+>8
}
>>
|