+@cindex liaison, modification
+@cindex Bézier, points de contrôle d'une courbe
+@cindex points de contrôle, courbe de Bézier
+
+Les liaisons, qu'elles soient de prolongation (@code{Tie}),
+d'articulation (@code{Slur}), de phrasé (@code{PhrasingSlur}), de
+laisser-vibrer (@code{LaissezVibrerTie} ou de reprise
+(@code{RepeatTie}), sont dessinées sous la forme de courbes de
+Bézier de degré trois. Lorsque l'aspect de la liaison
+automatiquement calculé n'est pas satisfaisant, il peut être
+modifié manuellement de deux manières différentes :
+
+@enumerate a
+@item
+en spécifiant l'ajustement qui doit être apporté aux points de
+contrôle de la courbe calculée automatiquement, ou
+@item
+en fournissant explicitement les quatre points de contrôle qui
+permettront de définir cette courbe.
+@end enumerate
+
+Ces deux méthodes sont expliquées ci-dessous. La première
+convient mieux dans le cas d'une légère adaptation de la courbe ;
+la seconde sera plus efficace lorsqu'il s'agira de créer une courbe
+sur une seule et unique note.
+
+@subsubsubheading Courbes de Bézier cubiques
+@c VO Cubic Bézier curves
+
+Quatre points définissent une courbe de Bézier cubique. Les premier et
+quatrième points sont les points de départ et d'arrivée de la
+courbe ; les deux autres points de contrôle -- P1 et P2 -- en
+détermineront l'allure. La courbe se trace en partant du point P0, en
+se dirigeant vers P1 et en arrivant au point P3 selon la direction
+@w{P2-P3}. La courbe est à l'intérieur de l'enveloppe convexe des
+points de contrôle. Tout déplacement (translation, rotation,
+échelonnement) des points de contrôle sera répercuté sur le dessin
+de la courbe.
+
+
+@subsubsubheading Spécification de l'ajustement des points de contrôle
+@c VO Specifying displacements from current control points
+
+Voici par exemple une liaison de prolongation dont l'allure n'est pas
+des plus heureuses, même en optant pour un @code{\tieDown}.
+
+@cindex galbe des liaisons
+@funindex \shape
+
+@lilypond[verbatim,quote,relative=1]
+<<
+ { e1~ e }
+\\
+ { r4 <g c,> <g c,> <g c,> }
+>>
+@end lilypond
+
+L'ajustement des points de contrôle de cette liaison de tenue à
+l'aide de @code{\shape} permet d'éviter les collisions.
+
+L'instruction @code{\shape} obéit à la syntaxe
+
+@example
+[-]@code{\shape} @var{déplacements} @var{élément}
+@end example
+
+Ceci aura pour effet de repositionner les points de contrôle de
+@var{élément} des différents montants fournis par
+@var{déplacements}. L'argument @var{déplacements} est constitué
+d'une liste de paires de nombres ou bien d'une liste de telles
+listes. Chacun des membres de l'une des paires indique
+l'ajustement de la coordonnée d'un point de contrôle. Lorsque
+@var{élément} est textuel, il en résulte une dérogation
+particulière appliquée au type d'objet considéré, alors que dans
+le cas d'une expression musicale sera appliqué un affinage
+approprié.
+
+En d'autres termes, la fonction @code{\shape} se comporte soit
+comme un @code{\once \override}, soit comme un @code{\tweak} selon
+que l'argument @var{élément} est un nom d'objet -- tel « Slur »
+-- ou une expression musicale tel un « ( ». L'argument
+@var{déplacements} spécifie les ajustements à apporter aux quatre
+points de contrôle, sous la forme d'une liste de paires
+@w{@code{(dx . dy)}} dont les valeurs sont exprimées en espace de
+portée ; on utilisera une liste de listes de paires dans le cas où
+la courbe comporte plusieurs segments.
+
+La fonction sera précédée d'un tiret si et seulement si elle doit
+s'appliquer sous forme de @code{\tweak}.
+
+Pour l'exemple qui nous occupe, l'adaptation sous forme
+dérogatoire -- recours à @code{\once\override} -- de la fonction
+@code{\shape}, nous pouvons remonter la liaison d'un demi espace
+de portée :
+
+@lilypond[verbatim,quote,relative=1]
+<<
+ {
+ \shape #'((0 . 0.5) (0 . 0.5) (0 . 0.5) (0 . 0.5)) Tie
+ e1~ e
+ }
+\\
+ { r4 <g c,> <g c,> <g c,> }
+>>
+@end lilypond
+
+La liaison est maintenant mieux positionnée ; mais sa partie
+centrale pourrait être un peu plus relevée, en procédant comme
+ci-dessous, cette fois en utilisant la formulation d'affinage
+-- la forme @code{\tweak} :
+
+@lilypond[verbatim,quote,relative=1]
+<<
+ {
+ e1-\shape #'((0 . 0.5) (0 . 1) (0 . 1) (0 . 0.5)) ~ e
+ }
+\\
+ { r4 <g c,> <g c,> <g c,> }
+>>
+@end lilypond
+
+L'adaptation du positionnement horizontal des points de contrôle
+se réalise de la même manière, ce qui permet de gérer le galbe de
+deux courbes débutant au même instant musical :
+
+@lilypond[verbatim,quote,ragged-right,relative=2]
+c8(\( a) a'4 e c\)
+\shape #'((0.7 . -0.4) (0.5 . -0.4) (0.3 . -0.3) (0 . -0.2)) Slur
+\shape #'((0 . 0) (0 . 0.5) (0 . 0.5) (0 . 0)) PhrasingSlur
+c8(\( a) a'4 e c\)
+@end lilypond
+
+La fonction @code{\shape} permet aussi d'adapter les points de
+contrôle d'une courbe qui se prolonge après un saut de ligne.
+Chaque portion de la courbe peut se voir appliquer sa propre liste
+d'ajustements. Lorsque l'un des segments ne nécessite pas de
+retouche, il suffit de lui fournir une liste vide. Dans l'exemple
+suivant, le saut de ligne laisse à croire qu'il y a non pas une
+seule mais deux liaisons :
+
+@lilypond[verbatim,quote,ragged-right,relative=1]
+c4( f g c
+\break
+d,4 c' f, c)
+@end lilypond
+
+Regalber les deux moitiés de la liaison rend plus évident le fait
+qu'elle d'étend par delà le saut de ligne :
+
+@lilypond[verbatim,quote,ragged-right,relative=1]
+% () may be used as a shorthand for ((0 . 0) (0 . 0) (0 . 0) (0 . 0))
+% if any of the segments does not need to be changed
+\shape #'(
+ (( 0 . 0) (0 . 0) (0 . 0) (0 . 1))
+ ((0.5 . 1.5) (1 . 0) (0 . 0) (0 . -1.5))
+ ) Slur
+c4( f g c
+\break
+d,4 c' f, c)
+@end lilypond
+
+La présence d'une courbe en S requiert obligatoirement d'ajuster
+manuellement les points de contrôle -- LilyPond n'optera jamais
+automatiquement pour un tel galbe.
+
+@lilypond[verbatim,quote,relative=2]
+c8( e b-> f d' a e-> g)
+\shape #'((0 . -1) (5.5 . -0.5) (-5.5 . -10.5) (0 . -5.5)) PhrasingSlur
+c8\( e b-> f d' a e-> g\)
+@end lilypond
+
+@subsubsubheading Déclaration explicite des points de contrôle
+@c VO Specifying control points explicitly
+
+Les coordonnées des points de contrôle sont données en unités d'espace
+de portée. L'abscisse est relative au point de référence de la note de
+départ de la liaison ; l'ordonnée est relative à la ligne médiane
+de la portée. Les différentes coordonnées sont entrées sous la forme
+d'une liste de quatre paires de nombres décimaux (ou nombres réels).
+L'une des manières de procéder consiste à tout d'abord estimer les
+coordonnées des deux extrémités puis, par tâtonnement, déterminer les
+deux points intermédiaires. Gardez à l'esprit que ces valeurs
+pourront devoir être revues si la musique ou sa mise en forme sont
+modifées.
+
+L'une des situation où spécifier explicitement les points de
+contrôle se révèle être tout à fait appropriée est lorsqu'ils se
+réfèrent à une seul et unique note. L'exemple suivant illustre
+l'un des moyens d'indiquer une liaison qui se prolonge sur les
+alternatives d'une répétition.
+
+@lilypond[verbatim,quote,relative=2]
+c1
+\repeat volta 3 { c4 d( e f }
+\alternative {
+ { g2) d }
+ {
+ g2
+ % create a slur and move it to a new position
+ % the <> is just an empty chord to carry the slur termination
+ -\tweak control-points #'((-2 . 3.8) (-1 . 3.9) (0 . 4) (1 . 3.4)) ( <> )
+ f,
+ }
+ {
+ e'2
+ % create a slur and move it to a new position
+ -\tweak control-points #'((-2 . 3) (-1 . 3.1) (0 . 3.2) (1 . 2.4)) ( <> )
+ f,
+ }
+}
+@end lilypond
+
+@knownissues
+Lorsque plusieurs liaisons, quelle qu'en soit la nature, commencent au
+même moment, jouer sur la propriété @code{control-points} est
+impossible, et la commande @code{\tweak} inefficace. Vous pouvez
+néanmoins influer sur la propriété @code{tie-configuration} de l'objet
+@code{TieColumn} pour déterminer la ligne de départ et l'orientation.
+
+@seealso
+Référence des propriétés internes :
+@rinternals{TieColumn}.
+
+
+@node Conteneurs requalifiants
+@subsection Conteneurs requalifiants
+@translationof Unpure-pure containers
+
+@cindex Scheme, pure containers
+@cindex Scheme, unpure containers
+@cindex pure containers, Scheme
+@cindex unpure containers, Scheme
+@cindex espacement horizontal, affinage
+
+Les conteneurs requalifiants permettent de faciliter le calcul des
+espacements en cas de modification du @emph{Y-axis} -- plus
+particulièrement les composantes @code{Y-offset} et @code{Y-extent} -- à
+l'aide d'une fonction scheme en lieu et place de valeurs.
+
+L'envergure verticale (@code{Y-extent}) de certains objets dépend de la
+propriété @code{stencil} ; jouer sur leur stencil requiert alors une
+intervention supplémentaire au niveau du @code{Y-extent} à l'aide d'un
+conteneur transitoire. Lorsqu'une fonction affecte un @code{Y-offset} ou
+un @code{Y-extent}, cela déclenche la détermination des sauts de ligne
+de manière anticipée dans la séquence des traitements. Il en résulte
+que cette opération n'est en fait pas exécutée ; elle renvoie
+habituellement @code{0} ou @code{'(0 . 0)}, ce qui peut engendrer des
+collisions. Une fonction @qq{pure} évitera d'avorter la construction
+des propriétés ou objets, qui de ce fait verront leurs arguments liés à
+la verticalité (@code{Y-axis}) correctement évalués.
+
+Il existe actuellement une trentaine de fonctions que l'on peut
+qualifier de @qq{pures}. Le recours à un conteneur transitoire permet
+de requalifier une fonction de telle sorte qu'elle soit reconnue comme
+@qq{pure} et soit donc évaluée @strong{avant} détermination des sauts de
+ligne -- l'espacement horizontal sera de fait ajusté en temps et en heure.
+La fonction @qq{impure} sera ensuite évaluée @strong{après} le
+positionnement des sauts de ligne.
+
+@warning{Il n'est pas toujours facile d'avoir l'assurance qu'une
+fonction soit qualifiée de @qq{pure} ; aussi nous vous recommandons
+d'éviter d'utiliser les objets @code{Beam} or @code{VerticalAlignment}
+lorsque vous désirez en créer une.}
+
+Un conteneur requalifiant se construit selon la syntaxe
+
+@code{(ly:make-unpure-pure-container f0 f1)}
+
+où @code{f0} est une fonction prenant @var{n} arguments (@var{n_>=_1}),
+le premier devant être l'objet en question ; il s'agit de la
+fonction dont le résultat sera réutilisé. @var{f1} est la fonction qui
+sera qualifiée de @qq{pure}. Elle prend @var{n_+_2} arguments, le
+premier devant être lui aussi l'objet en question, et les second et
+troisième étant respectivement les @qq{point de départ} (@var{start}) et
+@qq{point d'arrivée} (@var{end}).
+
+@var{start} et @var{end} sont dans tous les cas des valeurs fictives qui
+trouveront leur utilité dans le cas d'objets de type @code{Spanner},
+tels les soufflets (@code{Hairpin}) ou barres de ligature (@code{Beam}),
+en retournant les différentes estimations de hauteur basées sur leurs
+début et fin d'extension.
+
+Viennent ensuite les autres arguments de la fonction initiale @code{f0}
+-- autrement dit aucun si @var{n_=_1}.
+
+Les résultats de la deuxième fonction (@code{f1}) permettent une
+approximation des valeurs qui seront ensuite utilisées par la fonction
+initiale aux fins d'ajustement lors des phases ultérieures d'espacement.
+
+@lilypond[verbatim,quote,ragged-right]
+#(define (square-line-circle-space grob)
+(let* ((pitch (ly:event-property (ly:grob-property grob 'cause) 'pitch))
+ (notename (ly:pitch-notename pitch)))
+ (if (= 0 (modulo notename 2))
+ (make-circle-stencil 0.5 0.0 #t)
+ (make-filled-box-stencil '(0 . 1.0)
+ '(-0.5 . 0.5)))))
+
+squareLineCircleSpace = {
+ \override NoteHead.stencil = #square-line-circle-space
+}
+
+smartSquareLineCircleSpace = {
+ \squareLineCircleSpace
+ \override NoteHead.Y-extent =
+ #(ly:make-unpure-pure-container
+ ly:grob::stencil-height
+ (lambda (grob start end) (ly:grob::stencil-height grob)))
+}
+
+\new Voice \with { \remove "Stem_engraver" }
+\relative c'' {
+ \squareLineCircleSpace
+ cis4 ces disis d
+ \smartSquareLineCircleSpace
+ cis4 ces disis d
+}
+@end lilypond
+
+La première mesure de l'exemple ci-dessus ne fait pas appel à un
+conteneur requalifiant ; le moteur d'espacement n'a donc aucune
+connaissance de la largeur des têtes de note et ne peut empêcher
+qu'elles chevauchent les altérations. Dans la deuxième mesure, par
+contre, le recours à un conteneur requalifiant informe le moteur
+d'espacement de la largeur des têtes de note ; les collisions sont
+alors évitées du fait de l'espace réservé à chacune des têtes.
+
+Lorsqu'il s'agit de calculs simples, les fonctions, tant pour la partie
+@qq{pure} que pour la partie @qq{impure}, peuvent être identiques au
+détail près du nombre d'arguments utilisés ou du domaine d'intervention.
+
+@warning{Le fait de qualifier une fonction de @qq{pure} alors qu'elle ne
+l'est pas peut générer des résultats imprévisibles.}
+
+
+@node Utilisation de fonctions musicales
+@section Utilisation de fonctions musicales
+@translationof Using music functions
+
+@c TODO -- add @seealso, etc. to these subsections
+
+Une adaptation ou un affinage qui devient récurrent parce que doit
+s'appliquer à différentes expressions musicales peut faire l'objet d'une
+@emph{fonction musicale}. Nous ne traiterons ici que des fonctions de
+@emph{substitution}, dont le but est de substituer une variable en un
+bout de code LilyPond. D'autres fonctions, plus complexes, sont
+abordées au chapitre @rextend{Fonctions musicales}.
+
+@menu
+* Syntaxe d'une fonction de substitution::
+* Exemples de fonction de substitution::
+@end menu
+
+
+@node Syntaxe d'une fonction de substitution
+@subsection Syntaxe d'une fonction de substitution
+@translationof Substitution function syntax
+
+La rédaction d'une fonction chargée de substituer du code LilyPond à une
+variable est chose relativement aisée. Une telle fonction est de la
+forme
+
+@example
+fonction =
+#(define-music-function
+ (parser location @var{arg1} @var{arg2} @dots{})
+ (@var{type1?} @var{type2?} @dots{})
+ #@{
+ @var{@dots{}musique@dots{}}
+ #@})
+@end example
+
+@noindent
+où
+
+@multitable @columnfractions .33 .66
+@item @code{@var{argN}}
+@tab @var{n}ième argument.
+
+@item @code{@var{typeN?}}
+@tab un @emph{type de prédicat} Scheme pour lequel @code{@var{argN}}
+doit renvoyer @code{#t}.
+
+@item @code{@var{@dots{}musique@dots{}}}
+@tab du code LilyPond tout ce qu'il y a de plus ordinaire, avec des
+@code{$} (là où seule une construction LilyPond est autorisée) et des
+@code{#} (lorsqu'il s'agit d'une valeur en Scheme, d'un argument de
+fonction musicale ou de musique faisant partie d'une liste) pour
+référencer les arguments (par ex. @samp{#arg1}).
+@end multitable
+
+Les arguments @code{parser} et @code{location} sont obligatoires ;
+ils sont utilisés dans certaines situations évoluées, comme indiqué dans
+le manuel d'extension des fonctionnalités à au chapitre
+@rextend{Fonctions musicales}. Assurez-vous bien de ne pas les omettre
+dans vos fonctions de substitution.
+
+La liste des types de prédicat est elle aussi obligatoire. Voici
+quelques uns des types de prédicat les plus utilisés dans les fonctions
+musicales :
+
+@example
+boolean?
+cheap-list? @emph{(au lieu de }@qq{list?}@emph{, pour accélérer le traitement)}
+ly:duration?
+ly:music?
+ly:pitch?
+markup?
+number?
+pair?
+string?
+symbol?
+@end example
+
+@noindent
+Une liste plus fournie est disponible à l'annexe
+@ref{Types de prédicats prédéfinis}. Vous pouvez par ailleurs définir
+vos propres types de prédicat.
+
+@seealso
+Manuel de notation :
+@ref{Types de prédicats prédéfinis}.
+
+Manuel d'extension :
+@rextend{Fonctions musicales}.
+
+Fichiers d'initialisation :
+@file{lily/music-scheme.cc},
+@file{scm/c++.scm},
+@file{scm/lily.scm}.
+
+
+@node Exemples de fonction de substitution
+@subsection Exemples de fonction de substitution
+@translationof Substitution function examples
+
+La présente rubrique regroupe quelques exemples de fonction
+substitutive. Le propos est ici d'illustrer les possibilités qu'offrent
+les fonctions de substitution simple.
+
+Dans ce premier exemple, nous définissons une fonction dans le but de
+simplifier le réglage du décalage d'une annotation (un
+@code{TextScript}).
+
+@lilypond[quote,verbatim,ragged-right]
+padText =
+#(define-music-function
+ (parser location padding)
+ (number?)
+ #{
+ \once \override TextScript.padding = #padding
+ #})
+
+\relative c''' {
+ c4^"piu mosso" b a b
+ \padText #1.8
+ c4^"piu mosso" d e f
+ \padText #2.6
+ c4^"piu mosso" fis a g
+}
+@end lilypond
+
+Nous pouvons utiliser autre chose que des nombres au sein d'une
+fonction, y compris une expression musicale :
+
+@lilypond[quote,verbatim,ragged-right]
+custosNote =
+#(define-music-function
+ (parser location note)
+ (ly:music?)
+ #{
+ \tweak NoteHead.stencil #ly:text-interface::print
+ \tweak NoteHead.text
+ \markup \musicglyph #"custodes.mensural.u0"
+ \tweak Stem.stencil ##f
+ #note
+ #})
+
+\relative c' { c4 d e f \custosNote g }
+@end lilypond
+
+Une fonction de substitution peut traiter plusieurs arguments :
+
+@lilypond[quote,verbatim,ragged-right]
+tempoPadded =
+#(define-music-function
+ (parser location padding tempotext)
+ (number? markup?)
+ #{
+ \once \override Score.MetronomeMark.padding = #padding
+ \tempo \markup { \bold #tempotext }
+ #})
+
+\relative c'' {
+ \tempo \markup { "Low tempo" }
+ c4 d e f g1
+ \tempoPadded #4.0 "High tempo"
+ g4 f e d c1
+}
+@end lilypond
+
+@c TODO: add appropriate @@ref's here.